kb84tkhrのブログ

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

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を列挙して、
ixjykzが一致するものを探し、
ひとつ見つかったら成功(して打ち切り)

っていうと結果的には(defrel (gen&test+o i j k) (+o i j k))
いっしょだよね
いや、まったく同じというわけではないか
i + j = kじゃない場合、元の定義だとno valueだけど
こっちだと失敗して戻ってくる

generateしてtestするっていう名前の通りではあるから
実用じゃなくて何かを教えてくれるためにちょっとひねくれたものを
作りました、ってことかな
neveroみたいに
何を教えてくれようとしているのか