kb84tkhrのブログ

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

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 を探してるだけですね
なるほどそれっぽい