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)))
bumpo
、gen&test+o
はenumerate+o
のヘルパー関数だったみたい
(run* s (enumerate+o s '(1 1)))
とやると0から3までの数をふたつと
それらを足した結果がすべて列挙される
列挙される順番はデタラメにしか見えないけどどうなってるんだろう
(bumpo n i) (bumpo n j)
は0以上n
以下のi
とj
のすべての組み合わせ
(== ``(,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)
とかとカブってるのか
もしかしてこう書くのが推奨なのか
先に関連付けてからconda
、condu
を使えと
そういうことなのか
このあたり、なんか背景になってる話があるのかなあ
それ知ってるとそうそうそうなんだよねあれね、みたいな感じになるような
でそのあと、
ほんとに全部の組み合わせが出力されてるの、っていう問いからの
ひとつでも抜けてたら、抜けた結果が出力されるんじゃなくて
no valueになるはず、何か出力されたってことは全部出力されたってこと、
という話
たぶん
ちょっと自信ない
最後に+o
を引数にして*o
やexpo
でも列挙できるように
高階関数みたいなものか
そういえばここまで出てこなかった?
出てこなかった気がするね
結果の列挙を与えるとマッチする関数を返す、なんてのはさすがにないよな
あるわけいないか
9章おわり
あれ?
conda
とかcondu
を使うと÷o
とかlogo
がもっとシンプルに書けるよ、
みたいな流れを想像してたんだけど
外したか
9章で、関係プログラミングはおしまい
10章は処理系を書く話っぽいので
うーん
まだ関係プログラミングでどんなプログラムが書けるのかよくわかってないんですけど
数独とか解けるようになってるの?