gpt4 book ai didi

Clojure.logic 与 The Reasoned Schemer 的区别

转载 作者:行者123 更新时间:2023-12-05 00:29:18 24 4
gpt4 key购买 nike

我一直在工作 The Reasoned Schemer (TRS)使用 Clojure.logic 并注意 differences documented here .我到达了第 3 章的第 24 帧,TRS 报告说

(run 5 [x]
(lolo '((a b) (c d) . x)))

应该产生
'(()
(())
(() ())
(() () ())
(() () () ())

现在,我将 `lolo 实现为
(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 有bug?它是 clojure.logic 中的错误吗? TRS 中的求解器和 clojure.logic 中的求解器之间的差异是否合理?我如何解释或使用结果?如何在心理上预测 clojure.logic 的结果?

最佳答案

正如您链接到的 core.logic wiki 页面所述,core.logic 的 conde是 TRS 的 condi .不同的是TRS的conde按顺序尝试子句,而 condi交错结果流。因此,core.logic 版本将生成 TRS 中显示的所有结果,但在它们之间,它将返回 miniKanren 从未涉及的其他结果。

较长答案中的一个相关模式是,如果您从 (()) 开始获取每一秒的结果,结果 seq 的子序列看起来像带有 () 的整个结果 seq预先添加到每个单独的结果。这是由于交错——在这个子序列中,()被选为结果的第一个元素,然后 lolo递归产生其余的。

关于Clojure.logic 与 The Reasoned Schemer 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17548484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com