我在core.logic中尝试过这个
(需要 [clojure.core.logic :as l])(升/运行* [Q] (L/新鲜 [阿 B C] (L/成员A [1]) (L/成员B [4 5]) (L/会员C [1 2]) (l/== q [a b])))
期望结果[1 4] [1 5]
但这[1 4] [1 4] [1 5] [1 5]
然后我开始玩它并发现这个:
(需要 [clojure.core.logic :as l])(升/运行* [Q] (L/新鲜 [阿 B C] (L/成员A [1]) (L/成员B [4 5]) (L/Membero C [1 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 4]
的[1 5]
这是怎么回事?这个重复的东西应该是一个功能还是一个错误?
这是因为逻辑变量的使用c
不需要的,因为它没有与q
统一。如果您删除c
那么您将获得所需的结果。基本上,您需要了解替换在core.logic中的工作原理,以了解为什么由于c
而获得这些重复的结果。
高级别上,该过程就像在树中搜索解决方案一样,在这种情况下,向量中的每个元素都与c
membero
导致搜索树中的一个节点,这会导致重复的结果,因为对于每个节点引入c
可能的值会导致正确的结果,因为c
未在统一(l/== q [a b])