【发布时间】:2013-07-07 01:47:56
【问题描述】:
我一直在使用 Clojure.logic 处理 The Reasoned Schemer (TRS) 并关注 differences documented here。我到达了第 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 的结果?
【问题讨论】:
标签: clojure logic-programming clojure-core.logic minikanren reasoned-schemer