Reasoned Schemer (42) 9章 once, bumpo, gen&test+o
(defrel (onceo g) (condu (g #s) (#s #u)))
これはただg
を実行だけだけど成功するのは1回だけね、ってことだな
(#s #u)
は書かないといけないんだろうか
こういう関数があって
(defrel (teacupo t) (conde ((== 'tea t)) ((== 'cup t))))
(run* x (onceo (teacupo r)))
の値は(tea cup)
になる、でも
これはCommandmentに反してる、とか
(run* r (conda ((teacupo r) #s) (#s (== #f r))))
の値は(tea cup)
になる、
でもこれはCommandmentに反してる、とか書いてあって解釈に困っている
- 値は意図通り、でもこう書いてはいけない
- 値は意図通り、Commandmentには反するけどこう書かなきゃいけないときもある
- 意図通りの値が出ていない(ってことはないと思うんだけど)
だからどうしろというところがわからない
続いて(== #f r)
してからconda
とかcondu
してる例が出てくる
変数がfreshなまま呼んでるのがよくなくて先に変数と値を結び付けてから呼べ、と
言ってるの?
そうじゃない気がする
わからん
(defrel (bumpo n x)
(conde
((== n x))
((fresh (m) (-o n '(1) m) (bumpo m x)))))
あたえられた数字から1を引きつつx
と結びつける
マイナスの数の表現はないので0でおしまい
(defrel (gen&test+o i j k)
(onceo (fresh (x y z) (+o x y z) (== i x) (== j y) (== k z))))
これは何がしたいのか
そのまま読むと
x + y = z
となるx
, y
, z
を列挙して、
i
とx
、j
とy
、k
とz
が一致するものを探し、
ひとつ見つかったら成功(して打ち切り)
っていうと結果的には(defrel (gen&test+o i j k) (+o i j k))
と
いっしょだよね
いや、まったく同じというわけではないか
i + j = k
じゃない場合、元の定義だとno valueだけど
こっちだと失敗して戻ってくる
generateしてtestするっていう名前の通りではあるから
実用じゃなくて何かを教えてくれるためにちょっとひねくれたものを
作りました、ってことかな
nevero
みたいに
何を教えてくれようとしているのか