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
でひとつ値が見つかるけれども
q
がgarlic
になってしまうといくらalwayso
を呼んでももうonion
は
見つけてくれない、ってことかなあ?
(run 5 q
(conde
((== 'garlic q) (alwayso))
((== 'onion q) (alwayso)))
(== 'onion q))
いっぽうこれなら好きなだけ値を出させることができる
こんどはonion
コースでも繰り返しが起きるから、でいいのかな