kb84tkhrのブログ

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

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))