kb84tkhrのブログ

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

Reasoned Schemer (013) alwayso

6. The Fun Never Ends...

何がNever Endsなのかというと

(defrel (alwayso)
  (conde
    (#s)
    ((alwayso))))

これが終わらないってことか?

Schemeに戻せば (define (always) (cond (#t) (else (always))))
ただ#tを返すだけのコードだけれどもalwaysoはどう動くんだ?

  • (run 1 q (alwayso))(_0)を返す
  • #sは一度しか成功しないが(alwayso)は何度でも成功する
  • (run* q (alwayso))は値を返さない

run*は違った見つけ方が考えられる限りずっと探すってことのようだ
再帰の回数が違うだけでも違ってることになるらしい

  • (run 5 q (alwayso))(_0 _0 _0 _0 _0)を返す

q=_0を返す場合でも
いきなり#sのときと、1回再帰してから#sの場合は別として考える

  • (run 1 q (alwayso) #u)は値を返さない

(run* q (alwayso))は無限に値が見つかって値を返さない
こっちはひとつも見つからないけど探し続けて値を返さない

(run 1 q
  (== 'garlic q)
  (alwayso)
  (== 'onion q))

これは終わらないらしい
無理だってわかってもよさそうなものだけど
どうなったら探すのをやめるんだ?

(run 2 q
  (conde
    ((== 'garlic q) (alwayso))
    ((== 'onion q)))
  (== 'onion q))

これは値を返さない
とりあえずonionでひとつ値が見つかるけれども
qgarlicになってしまうといくらalwaysoを呼んでももうonion
見つけてくれない、ってことかなあ?

(run 5 q
  (conde
    ((== 'garlic q) (alwayso))
    ((== 'onion q) (alwayso)))
  (== 'onion q))

いっぽうこれなら好きなだけ値を出させることができる
こんどはonionコースでも繰り返しが起きるから、でいいのかな