kb84tkhrのブログ

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

Reasoned Schemer (43) 9章 enumerate+o

(defrel (enumerate+o r n)
  (fresh (i j k)
    (bumpo n i) (bumpo n j)
    (+o i j k)
    (gen&test+o i j k)
    (== `(,i ,j ,k) r)))

bumpogen&test+oenumerate+oのヘルパー関数だったみたい
(run* s (enumerate+o s '(1 1)))とやると0から3までの数をふたつと
それらを足した結果がすべて列挙される
列挙される順番はデタラメにしか見えないけどどうなってるんだろう

(bumpo n i) (bumpo n j)は0以上n以下のijのすべての組み合わせ
(== ``(,i ,j ,k) r)は単純に結果をrにまとめてるだけと読めばいいだろう

(+o i j k) (gen&test+o i j k)とはなんなのか
(+o i j k)(gen&test+o)の中でやってるでしょ

なんか既視感あるなこれ
あれか(== 'spaghetti x)とか(== #f r)とかとカブってるのか
もしかしてこう書くのが推奨なのか
先に関連付けてからcondaconduを使えと
そういうことなのか

このあたり、なんか背景になってる話があるのかなあ
それ知ってるとそうそうそうなんだよねあれね、みたいな感じになるような

でそのあと、
ほんとに全部の組み合わせが出力されてるの、っていう問いからの
ひとつでも抜けてたら、抜けた結果が出力されるんじゃなくて
no valueになるはず、何か出力されたってことは全部出力されたってこと、
という話
たぶん
ちょっと自信ない

最後に+oを引数にして*oexpoでも列挙できるように
高階関数みたいなものか
そういえばここまで出てこなかった?
出てこなかった気がするね
結果の列挙を与えるとマッチする関数を返す、なんてのはさすがにないよな
あるわけいないか

9章おわり

あれ?
condaとかconduを使うと÷oとかlogoがもっとシンプルに書けるよ、
みたいな流れを想像してたんだけど
外したか

9章で、関係プログラミングはおしまい
10章は処理系を書く話っぽいので

うーん
まだ関係プログラミングでどんなプログラムが書けるのかよくわかってないんですけど
数独とか解けるようになってるの?