kb84tkhrのブログ

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

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.

condaaは a single line の a

The Second Commandment (Initial)
If prior to determining the question of a conda 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)))

これはxpastaでなければ成功する、という意図でしょ
で、ふたつの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使えばいい気もするんだけどそういうこと?