Clojure.logic を使用してThe Reasoned Schemer (TRS)に取り組み、ここに記載されている相違点に注意を払いました。チャプター 3 のフレーム 24 に到達しました。TRS は次のことを報告しています。
(run 5 [x]
(lolo '((a b) (c d) . x)))
生成する必要があります
'(()
(())
(() ())
(() () ())
(() () () ())
今、私は `lolo as を実装しました
(defn lolo
"Succeeds if l is a list-of-lists."
[l]
(conde
((emptyo l) s#)
((fresh [a]
(firsto l a)
(listo a)) (fresh [d]
(resto l d)
(lolo d)))
(s# u#)))
次の奇妙な結果が生成されます。
'(()
(())
((_0))
(() ())
((_0 _1)))
これは基本的に、私のloloが新しい変数を漏らしているソリューションを生成していることを意味します. パターンを見ようとして続けていれば、
'(()
(())
((_0))
(() ())
((_0 _1))
(() (_0)
((_0) ())
(() () ())
((_0 _1 _2)))
しかし、霧の中で十分にはっきりと見ることができません。これに光を当てていただければ幸いです。それは私のloloのバグですか?clojure.logic のバグですか? TRS のソルバーと clojure.logic のソルバーの違いは合理的ですか? 結果をどのように解釈または使用できますか? どうすれば clojure.logic の結果を頭の中で予測できますか?