Reasoned Schemer (63) conda, condu
conda
(define-syntax conda
(syntax-rules ()
((conda (g0 g ...)) (conj g0 g ...))
((conda (g0 g ...) ln ...)
(ifte g0 (conj g ...) (conda ln ...)))))
conde
と違ってifte
の入れ子にしないといけないから再帰な形になるってことか
やってみる
(conda (#s #u) (#s #s))
= (ifte #s (conj #u) (conda (#s #s)))
= (ifte #s (conj #u) (conj #s #s))
ちょっとこれはイメージしづらいな
もう少し中身のあるやつで
(conda ((== 'virgin x) #u) ((== 'olive x) #s) (#s (== 'oil x)))
= (ifte (== 'virgin x) (conj #u) (conda ((== 'olive x) #s) (#s (== 'oil x))))
= (ifte (== 'virgin x) #u (ifte (== 'olive x) (conj #s) (conda (#s (== 'oil x)))))
= (ifte (== 'virgin x) #u (ifte (== 'olive x) #s (conj #s (== 'oil x))))
だいたいわかった
(define-syntax condu
(syntax-rules ()
((condu (g0 g ...) ...)
(conda ((once g0) g ...) ...))))
condu
をconda
に変えて節の最初の項をonce
でくるむだけ
g0
が何度も成功する可能性があってもonce
だから一度しか成功しない
マクロ定義おしまい
これでminikanren全部
Welcome to the Club
参考文献
ゲーデルの不完全性定理に関する本が多いけどそういう内容だったっけ?
Scheme手習いの参考文献に近い感じ
Scheme修業はまた違う
Afterword
はじめに一度読んだけど
Afterwordを書いたRobert A. Kowalskiさんはこんなひと(Wikipedia英語版より)
Robert Anthony Kowalski (born 15 May 1941) is a logician and computer scientist, whose research is concerned with developing both human-oriented models of computing and computational models of human thinking.
教育関連のことを書きたくなりそうな雰囲気はある
Reasoned Schemerは関数型プログラミングと関係型プログラミングがいかに深く関係しあっているかを示すことによってこの状況に貢献する
関係があるのはわかる、でもRobertさんが言っている深い関係までわかった気はあんまりしない
ということで2周目に入るよ!