Reasoned Schemer (008) member?とmembero
member?
を翻訳して簡略化して試します
再帰をひとつずつたどっていったり
値を持たなかったり
member?
はプロパーなリストでないとエラーになりますが
membero
は最後の要素が無視されるだけ
Schemeの関数から翻訳していますがSchemeの関数と同じ結果を出すわけではないんですね
というわけで?
プロパーなリストからだけ見つけてくれるproper-membero
を定義します
(defrel (proper-membero x l)
(conde
((caro l x)
(fresh (d)
(cdro l d)
(listo d)))
((fresh (d)
(cdro l d)
(proper-membero x d)))))
見つかったらそのcdrがプロパーなリストかどうかを見てるだけ
難しくはないですね
ただめんどくさくなってる
(run 12 l (proper-membero'tofu l))
の値の順番がなぜこうなるのか謎
めずらしく、defrel
の定義を示したあとで
それに対応するSchemeの関数の定義を示してます
どっち向きも翻訳できるよ、といいたいのかなんなのか