Reasoned Schemer (24) わり算
わり算
いきなり(run 4 (n m q r) (/o n m q r))
の値はこれこれです、と見せておいて
定義は次のページなのはニクい演出?たまたま?
ついクセで引き算を再帰的に繰り返すようなのを想像してページをめくりました
(defrel (/o n m q r)
n ÷ m = q あまり r
(conde
((== '() q) (== n r) (<o n m))
n < m ならば q = 0、r = n
((<o n m) (== '() q) (== n r))
って書いてくれればそのまま読めるのに、なんでこういう書き方なんだろう?
英語な人だと q = 0, r = 0 if n < m、ってなって全然不自然じゃないとか?
日本語でも全然不自然じゃないけどね
cond
だってif
だって条件を先に書くじゃないですか
軽い処理を左に書いたほうが処理が速くなるとかあるのかな?
再帰呼出しは最後に書く、みたいなのはあったけど・・・?
次
((== '(1) q) (== '() r) (== n m) (<o r m))
n = m なら q = 1、r = 0
で、(<o r m)
はなんの役に立ってるの?
((<o m n) (<o r m)
(fresh (mq)
(<=lo mq n)
(*o m q mq)
(+o mq r n)))))
n > mならば、ときてここで再帰、とばかり思い込んでたので???となりましたが
mq + r = n (r < n) となる q、r を探してるだけですね
なるほどそれっぽい