我一直在使用 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 的结果?