我在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?
答案 0 :(得分:4)
这是因为逻辑变量c
的使用不是必需的,因为它没有与q
统一。如果您删除c
,那么您将获得所需的结果。基本上,您需要了解core.logic中的替换如何工作,以了解为什么由于c
而获得这些重复结果的原因。
在高级别,该过程就像在树中搜索解决方案一样,在这种情况下,向量中membero
与c
的每个元素都会导致搜索树中的某个节点导致重复结果,因为c
引入的每个节点可能的值导致正确的结果,因为统一c
(l/== q [a b])