Reasoned Schemer (40) 8章 未体験ゾーン3
戻って本体 (logo n b q r)
これはconde
なので1行ずつ見ていく
再帰はしてないな
((== '() q) (≦o n b) (+o r '(1) n))
n <= b
ならq
が0でr
はn - 1
、と読むとわかりやすい気はするんだけど
ほんとはq == 0
でn <= b
でr + 1 == n
ならば成功、って読むべきなんだろうな
だいたいわかる
しかし
n == b
ならq
が1でr
が0になるべきだと思うんだけど
なんでn <= b
になってるの
n < b
のほうがいいんじゃないの
たとえばn
が5、q
が0、r
が4でも成功しそうだけど
その場合はq
が1でr
が0になるべきでは
成功しないの?
((== '(1) q) (>1o b) (=lo n b) (+o r b n)))
(=lo n b)
をどう読むか
n
とb
がたがいに2倍未満、みたいな感じ?
b
が1より大きい、つまり2以上で
q
が1
だからいろいろ総合すると
b
が1より大きくて、n
がb
の2倍未満ならq
は1でr
はn - b
って読んだらいいかな
((== '(1) b) (poso q) (+o r '(1) n))
b
が1ならq
は正ならなんでもよくてr
はn - 1
そうですね
((== '() b) (poso q) (== r n))
b
が0ならq
は正ならなんでもよくてr
はn
なんかちゃんと条件網羅できてるのか心配になってきたぞ
((== '(0 1) b)
(fresh (a ad dd)
(poso dd) (== `(,a ,ad . ,dd) n) (exp2o n '() q)
(fresh (s)
(splito n dd r s))))
底が2のとき
あとn
が4以上だな
q
はexp2o
で求める
(poso dd) (== ``(,a ,ad . ,dd) n)
はn
が4以上であることを
確認しつつn
の3ビットめからをdd
に取り出す
(splito n dd r s)
でn
を上位2ビットと下位ビットに分ける
下位ビットがr
になってるわけか
なるほどねえ
((≦o '(1 1) b) (<lo b n) (base-three-or-moreo n b q r))
底が3以上でb ≦ n
ならbase-three-or-moreo
おしまい
網羅は・・・してるのか
してるみたいだな
してる気がする