Reasoned Schemer (26) わり算 続き
三つ目の
conde
行は十分一般的に見えますが、なぜはじめの二つのconde
行が必要なんですか?
これでいいんじゃないの、って話
(defrel (/o n m q r)
(fresh (mq)
(<o r m)
(<=lo mq n)
(*o m q mq)
(+o mq r n))
Reasoned Schemer (23) 数の比較
=lo
とほぼ同じ形で<lo
を定義
=lo
と<lo
を使って<=lo
を定義
run 8 (n m) (<=lo n m))
とrun 9 (n m) (<=lo n m))
の値を比較して
前者は後者に含まれてますね、ってやってるけどここでは何がいいたいのか
Reasoned Schemer (21) かけ算続き
bound-*o
が仕事をしないとたとえば(run 1 (n m) (>1o n) (>1o m) (*o n m '(1 1)))
が値を返さない
それはそうですね
それはそういうものかと思ってた
終われるようにするんだ
bound-*o
が何をすれば終わる?失敗しても次のn、mで試すだけなのでは?
Reasoned Schemer (20) 足し算、引き算、整数
(defrel (+o n m k) (addero 0 n m k))
これは当然
(defrel (-o n m k) (+o m k n))
なるほどね
関係プログラミングっぽい!
(defrel (lengtho l n)
(conde
((nullo l) (== '() n))
((fresh (d res)
(cdro l d)
(+o '(1) res n))
(lengtho d res))))
からの
> (run 3 q (lengtho q q))
(() (1) (0 1))
> (run 4 q (lengtho q q))
一瞬対角線論法みたいでおもしろいと思ったけど、そんなに深い意味はないかな?どうかな?
続きを読む