kb84tkhrのブログ

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

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

conducondaに変えて節の最初の項を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周目に入るよ!