Reasoned Schemer (101) logo
1周目ではほとんどあきらめていたlogo
とりあえずlogo
以下コードを入力して動かしながらやっていこう
入力するだけでもなかなか大変 目がちかちかする
↓くらいで書けたら関係プログラミングすげー、っていうところなんだけどなあ
(defrel (logo n b q r)
(fresh (bq)
(+o bq r n)
(repeated-mulo b q bq)))
そういうq
のうち最大のもの、っていうのもなかなか書きづらい気がする
(run 9 (b q r) (logo '(0 0 1 0 0 0 1) b q r) (>1o q))
とか
(run* t (expo '(1 1) '(1 0 1) t))
とかやたら時間かかった
複雑になってるからそういうものかもしれないけど?
どんだけ計算してるん
(repeated-mulo n q nq)
はn^q = nq
で
(exp2o n b q)
は1周目でこんなこと思ってましたがどうかな
2^q = n
という関係じゃなくて
2^q <= n
(ただしq
は最大)という関係、って感じ?
まずはb
=()
ってことでやってみる
> (run* n (exp2o n '() '()))
'((1))
> (run* n (exp2o n '() '(1)))
'((0 1) (1 1))
> (run* n (exp2o n '() '(0 1)))
'((0 0 1) (1 0 1) (_0 1 1))
> (run* n (exp2o n '() '(1 1)))
'((0 0 0 1)
(1 0 0 1)
(0 1 0 1)
(1 1 0 1)
(0 _0 1 1)
(1 _0 1 1))
2^q <= n < 2^(q + 1)
ってなるn
が出てくるわけだな
逆向きもやってみよう
> (run* q (exp2o '(1) '() q))
'(())
> (run* q (exp2o '(0 1) '() q))
'((1))
> (run* q (exp2o '(1 1) '() q))
'((1))
> (run* q (exp2o '(0 0 1) '() q))
'((0 1))
> (run* q (exp2o '(1 0 1) '() q))
'((0 1))
> (run* q (exp2o '(0 1 1) '() q))
'((0 1))
> (run* q (exp2o '(1 1 1) '() q))
'((0 1))
> (run* q (exp2o '(0 0 0 1) '() q))
'((1 1))