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



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

最新更新