kb84tkhrのブログ

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

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でnb以下でr+1nに等しい、または

    ((== '(1) q) (>1o b) (=lo n b) (+o r b n))

qが1でbが1より大きくてnbが同じ長さでr+bnに等しい・・・

えーと、合ってはいるな
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 + 1nに等しい、または

    ((== '() b) (poso q) (== r n))

bが0でqが正でrnに等しい・・・

この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)で・・・
(どう書けばいいかな)
rnの最上位ビットを取ったものに等しい
(でいいかな)

または

    ((<=o '(1 1) b) (<lo b n) (base-three-or-moreo n b q r))))

bが3以上で、bnよりも短くて(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)))

ふたつこたえが出てますけど狙い通りなの
両方出てきた方が便利という可能性も否めない