kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

Reasoned Schemer (96) *o 続き

本物のbound-*o
(*o n m p)n>pだったりm>pだったりしたら失敗するようにする
んだけどそのかわりにnmをリストとみてnmpより長かったら失敗するようにするらしい

(defrel (bound-*o q p n m)
  (conde
    ((=='() q) (poso p))
    ((fresh (a0 a1 a2 a3 x y z)
       (== `(,a0 . ,x) q)
       (== `(,a1 . ,y) p)
       (conde
         ((== '() n)
          (== `(,a2 . ,z) m)
          (bound-*o x y z '()))
         ((== `(,a3 . ,z) n)
          (bound-*o x y z m)))))))

訂正
bound-*o自体はpが0でない限り失敗しない
qがfreshだから((=='() q) (poso p))pが0じゃない限りbound-*oは成功する
失敗するのはbound-*oとその続きのgoalとの連係プレーだな
しかしqってなんなんだいまひとつイメージがつかめん

適当に動かしてみるか
nmが1より大きい奇数のときに通るんだからたとえばこう

> (run* q (bound-*o q '(1 0 0 1) '(1 1) '(1 1)))
'(() (_0) (_0 _1) (_0 _1 _2))

bound-*oが呼ばれるたびにq()になってそこにa0がくっついていくから
ひとつずつ長くなっていくリストができるのか

qを中心としてみると
qpn+mの短いほうよりも短いリストすべて、を表現してるってわけか
その範囲で(*o x m q)になるようにxmを探してみるけど
なかったらodd-*oが失敗すると
了解です

了解なんだけどこんなことまで気にしながらプログラミングするのって大変じゃないですか
うっかり考え忘れると突然無限ループして帰ってこないとかこわい

そういえばなんかゲーデル不完全性定理の証明でいちいち上限つけてたのに似てるな
いや似てるというより同じなのか?