kb84tkhrのブログ

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

Reasoned Schemer (41) 9章 condu

(run* q (conda ((alwayso) #s) (#s #u)))はno value
condaはquestionが成功なら次の行以降は実行しないんだけど
これだと(alwayso)が成功し続けてその行の実行が終わらないので

そこでconduの登場
こっちはcondaよりもさらに早く打ち切る
questionが1回成功したところで終わり

The Law of condu
condu behaves like conda, except that a successful question succeeds only once.

なおuはuni-のu

ので
(run* q (condu ((alwayso) #s) (#s #u)))(_0)になる

condu corresponds to Mercury’s committed choice (so-called once).

onceっていうのは聞いたことないかな

avoiding the cut of Prolog

cutってよくないものなんだ
ピュアじゃないっていうような話はあったかもしれない
9章でやっとcondaconduが出てきたのもそういうことかもしれない

でも
(run* q (condu (#s (alwayso)) (#s #u)))はno value
ややこしいぞ

question(#s)が1回成功したら(alwayso)を実行するんだけど
そっちには1回だけ成功したら、っていうのはないってことかな
やっぱりquestionが特別扱いなのか

(run 1 q (conda ((alwayso) #s) (#s #u)) #u)はno valueだけど
(run 1 q (condu ((alwayso) #s) (#s #u)) #u)()だとか微妙な差
run 1だったらひとつ値が出たところで終わらないんだっけ?
あ、#uがあるから一度も成功しなくてずっと試し続けるのか

conduでもやっぱりquestionで変数が束縛されてはいけない

The Second Commandment (Final)
If prior to determining the question of a conda or condu line a variable is fresh, it must remain fresh in that line’s question.

まだ意味はわかっていない