Clojure 为什么core.logic的输出会重复给出相同的值?

Clojure 为什么core.logic的输出会重复给出相同的值?,clojure,clojure-core.logic,minikanren,Clojure,Clojure Core.logic,Minikanren,我试过核心逻辑 (require [clojure.core.logic :as l]) (l/run* [q] (l/fresh [a b c] (l/membero a [1]) (l/membero b [4 5]) (l/membero c [1 2]) (l/== q [a b]))) 其中有一个[15]与[14] 发生了什么事?这种重复现象应该是一种特性还是一种缺陷?这是因为逻辑变量c的使用不是必需的,因为它没有与q统一。如果删除c,则会得到所需

我试过核心逻辑

(require [clojure.core.logic :as l]) (l/run* [q] (l/fresh [a b c] (l/membero a [1]) (l/membero b [4 5]) (l/membero c [1 2]) (l/== q [a b]))) 其中有一个
[15]
[14]


发生了什么事?这种重复现象应该是一种特性还是一种缺陷?

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


在高层次上,这个过程就像在一棵树上寻找解决方案,在这种情况下,向量中
membero
c
的每个元素都会导致搜索树中的一个节点,并导致重复的结果,因为对于
c
引入的每个节点,可能的值会导致正确的结果,因为
c
没有在统一
中使用(l/==q[ab])

这个答案是正确的。c提供了更多的可能性,但我们并没有具体化它的价值,所以它只是看起来好像我们得到了重复的结果。 (require [clojure.core.logic :as l]) (l/run* [q] (l/fresh [a b c] (l/membero a [1]) (l/membero b [4 5]) (l/membero c [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])