Reasoned Schemer (41) 9章 conda
9. Thin Ice
もう章題を解釈するのはあきらめている
この終盤で新しい構文登場
conda
conde
が全部のゴールを試してみるのに対し、
conde
はひとつゴールが成功したらそれ以後のゴールは試さない
やっぱりelseみたいなのほしくなるんじゃないですかーもーやだー
conda is like the so-called soft-cut (also known as if-then-else)
cutっていうのはPrologの話で出てくるのを見たことがある
何をするのかは知らない
同じものだろうか
softとは?
we refer to the first goal of a conda line as its question and the rest of the goals as its answer
conda
の各行の最初のゴールをquestionと呼ぶ
以後のゴールはanswerと呼ぶ
最初のゴールだけ特別扱いされるのかな
それとも、順番に見ていくからたまたま特別に見えるというだけ?
The Law of
conda
The first conda line whose question succeeds is the only line that can contribute values.
conda
のa
は a single line の a
The Second Commandment (Initial)
If prior to determining the question of aconda
line a variable is fresh, it must remain fresh in that line’s question.
conda
行のquestionを決定する以前にfreshだった変数は、question後もfreshでなければならない
ちょっとピンとこない
ちゃんと訳せてないのか?
例としてこういうのがあがっている
まずnot-pastao
(defrel (not-pastao x) (conda ((== 'pasta x) #u) (#s #s)))
これはx
がpasta
でなければ成功する、という意図でしょ
で、ふたつのrun*
の値を見る
(run* x (conda ((not-pastao x) #u) (== 'spaghetti x) #s)) # -- (a)
の値は(spaghetti)
これは意図通りだよね
ところが
(run* x (== 'spaghetti x) (conda ((not-pastao x) #u) (== 'spaghetti x) #s)) # -- (b)
とあらかじめx
を(spaghetti)
にしていると値が()
になってしまう
(spaghetti)
にならない
なぜなら(not-pastao x)
が成功するから
だからThe Second Commandmentを守らないといけない、ってことでしょ
でもそれx
がfreshかどうかって関係なくない
conda
でquestionが成功したらそこでおしまいなんだから
x
がfreshであろうがなかろうが値は()
なんじゃないの
ん、それとも(a)が意図通りに動いてしまうのがよくないと言っている?
freshだった変数がquestionの後freshじゃなくなるのは(a)の方だもんな
いやでも(b)の方がうまくいってるとは言い難いし・・・
わからん
スルーする
Commandmentを守るとどういう書き方になるかとは書いてない
(b)がその書き方だとは思えないけどほかに書きようあるかなあ
変数が束縛されちゃったらダメってけっこう厳しい気がするんだけど
この例ならconde
使えばいい気もするんだけどそういうこと?