为啥 core.logic 的输出重复给出相同的值?

Posted

技术标签:

【中文标题】为啥 core.logic 的输出重复给出相同的值?【英文标题】:why does the output of core.logic give the same value repeated?为什么 core.logic 的输出重复给出相同的值? 【发布时间】:2012-09-26 05:10:10 【问题描述】:

我在 core.logic 中试过这个

(需要 [clojure.core.logic :as l]) (升/运行* [q] (升/新鲜 [a b c] (l/membero a [1]) (l/成员 b [4 5]) (l/membero c [1 2]) (l/== q [a b])))

期望结果是[1 4] [1 5]

但它是[1 4] [1 4] [1 5] [1 5]

然后我开始玩它并发现了这个:

(需要 [clojure.core.logic :as l]) (升/运行* [q] (升/新鲜 [a b c] (l/membero a [1]) (l/成员 b [4 5]) (l/memberoc [1 1 1 1 1 1 1 1]) (l/== q [a b])))
 ;; => ([1 4] [1 4] [1 4] [1 5] [1 4] [1 4] [1 5] [1 4] [1 5] [1 4] [1 5] [1 5] [1 5] [1 5])

其中有一个[1 5] 穿插[1 4]

发生了什么?这种重复的东西应该是一个特性还是一个错误?

【问题讨论】:

【参考方案1】:

这是因为逻辑变量c的使用不是必需的,因为它没有与q统一。如果您删除c,那么您将获得所需的结果。基本上,您需要了解替换在 core.logic 中的工作原理,以了解为什么由于c 而得到这些重复结果。

在较高级别上,该过程就像在树中搜索解决方案,在这种情况下,向量中的每个元素 memberoc 都会导致搜索树中的一个节点,这会导致重复的结果,因为对于每个c 可能值引入的节点导致正确的结果,因为 c 未在统一 (l/== q [a b]) 中使用

【讨论】:

这个答案是正确的。 c 贡献了更多的可能性,但我们并没有具体化它的价值,所以它只是看起来好像我们得到了重复的结果。

以上是关于为啥 core.logic 的输出重复给出相同的值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Integer.MIN_VALUE 的负数给出相同的值? [复制]

使用 core.logic 列出唯一的 DAG 父级

为啥 Arduino IDE 中的相同代码在不同的笔记本电脑上给出不同的输出?

为啥 nameof() 在 Linq 表达式中给出一个模棱两可的调用警告,但当我使用与字符串相同的值时却没有?

为啥“继续”和“中断”会给出相同的结果? [关闭]

为啥 Mallet 文本分类为所有测试文件输出相同的值 1.0?