......我该如何避免呢?
(run* [q]
(featurec q {:a 1})
(featurec q {:a 2})))
返回
((_0
:-
(clojure.core.logic/featurec _0 {:a 2})
(clojure.core.logic/featurec _0 {:a 1})))
我理解为_0
地图必须至少包含:a 1
键值对和:a 2
键值对。这似乎是矛盾的,因为:a
无法映射到1
和2
,除非我们使用MultiMaps。我无法将其读作:a 1
或:a 2
,因为我指定的约束是一个连词。我原以为结果应该是()
因为约束是矛盾的; q
没有值可以满足这些约束条件。
我必须错误地阅读结果。
答案 0 :(得分:1)
是的,它是矛盾的。但它的含义是:没有地图可以同时与{:a 1}
和{:a 2}
统一。
run*
,all
,fresh
都在其约束中引入了一个连词(AND)。如果你想要一个析取(OR),你可以引入一个conde
。
也许你的问题是:为什么core.logic不能"看到"矛盾并返回一个空结果集?我不确切地知道。但也许这与这样一个事实有关,即即使我们删除了其中一个限制因素,我们也不会得到一个“基础”和#34;结果:
(run* [q]
(featurec q {:a 1}))
;=> ((_0 :- (clojure.core.logic/featurec _0 {:a 1})))
它读作:任何东西,只要它是包含[:a 1]
条目的地图。而且我认为这是正确的结果。