Reasoned Schemer (105) logo 続き4
base-three-or-moreo
には恐れをなして先にlogo
本体
(defrel (logo n b q r)
(conde
((== '() q) (<=o n b) (+o r '(1) n))
n = b^q + r
の関係であること、とは(という読み方をしてみる)
q
が0でn
がb
以下でr+1
がn
に等しい、または
((== '(1) q) (>1o b) (=lo n b) (+o r b n))
q
が1でb
が1より大きくてn
とb
が同じ長さでr+b
がn
に等しい・・・
えーと、合ってはいるな
b
が1でも成り立ちそうではあるけど、下の行とカブるから避けてるのか
(=lo n b)
はループしないためのガードかなあ
でもq
が1なのは確定だからn = b + r
でだけでよさそうなもの
base-three-or-moreo
で(<lo b n)
の場合をカバーするからこれもoverlapを避けてるのか
じゃok
または
((== '(1) b) (poso q) (+o r '(1) n))
b
が1でq
が正でr + 1
がn
に等しい、または
((== '() b) (poso q) (== r n))
b
が0でq
が正でr
がn
に等しい・・・
このconde
節の並びにも意味があるのかなあ
これなんか最初の方に置きたい気がしないでもない
再帰するところもないし
または
((== '(0 1) b)
(fresh (a ad dd)
(poso dd)
(== `(,a ,ad . ,dd) n)
(exp2o n '() q)
(fresh (s) (splito n dd r s))))
b
が2で、n
が4以上で、2^q <= n < 2^(q + 1)
で・・・
(どう書けばいいかな)
r
がn
の最上位ビットを取ったものに等しい
(でいいかな)
または
((<=o '(1 1) b) (<lo b n) (base-three-or-moreo n b q r))))
b
が3以上で、b
がn
よりも短くて(base-three-or-moreo n b q r)
であること
こんなとこか
書き方替えてみたけどちょっとピンとこないな
なお1周目
n == b
ならq
が1でr
が0になるべきだと思うんだけど
なんでn <= b
になってるの
n < b
のほうがいいんじゃないの
> (run* (q r) (logo '(1 1) '(1 1) q r))
'(((1) ()) (() (0 1)))
ふたつこたえが出てますけど狙い通りなの
両方出てきた方が便利という可能性も否めない