2012-10-05 50 views
5

我core.logic为什么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]))) 

试过这种预期的结果是[1 4] [1 5]

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

然后我就开始摆弄它,发现这个:

 
(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]) 

哪里有是[1 5]穿插[1 4]

发生了什么事?这是重复的东西应该是一个功能或错误?

回答

4

这是因为逻辑变量c的使用不需要,因为它不与q统一。如果你删除c那么你会得到期望的结果。基本上你需要了解core.logic中的替换是如何工作的,才能理解你为什么得到这些重复的结果,因为c

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

+0

此答案是正确的。 c提供了更多的可能性,但是我们没有把它的价值表达出来,所以它看起来好像我们得到了重复的结果。 – dnolen

相关问题