5

我在 core.logic 中试过这个

(需要 [clojure.core.logic :as l])

(升/运行* [q]
  (升/新鲜 [abc]
    (l/membero a [1])
    (l/成员 b [4 5])
    (l/membero c [1 2])
    (l/== q [ab])))

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

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

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

(需要 [clojure.core.logic :as l])

(升/运行* [q]
  (升/新鲜 [abc]
    (l/membero a [1])
    (l/成员 b [4 5])
    (l/memberoc [1 1 1 1 1 1 1 1])
    (l/== q [ab])))
 ;; => ([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

1 回答 1

4

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

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

于 2012-10-05T05:11:33.120 回答