Clojure 为什么core.logic的输出会重复给出相同的值?
我试过核心逻辑 (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]))) 其中有一个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,则会得到所需
[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])