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

时间:2012-10-05 04:39:09

标签: clojure clojure-core.logic minikanren

我在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]

发生了什么事?这个重复的东西应该是一个特征还是一个bug?

1 个答案:

答案 0 :(得分:4)

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

在高级别,该过程就像在树中搜索解决方案一样,在这种情况下,向量中memberoc的每个元素都会导致搜索树中的某个节点导致重复结果,因为c引入的每个节点可能的值导致正确的结果,因为统一c

中未使用(l/== q [a b])