为什么会返回这个相互矛盾的clojure.core.logic/featurec结果?

为什么会返回这个相互矛盾的clojure.core.logic/featurec结果?,clojure,logic-programming,clojure-core.logic,minikanren,Clojure,Logic Programming,Clojure Core.logic,Minikanren,…我怎样才能避免呢 (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}))) 我理解这意味着\u 0映射必须至少包含:1键值对和:2键值对。这似乎是矛盾的,因为:除非我们使用多重映射,否则a不能同时映射到1和2。我无法将其理解为:a1或:a

…我怎样才能避免呢

(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})))
我理解这意味着
\u 0
映射必须至少包含
:1
键值对和
:2
键值对。这似乎是矛盾的,因为
:除非我们使用多重映射,否则a
不能同时映射到
1
2
。我无法将其理解为
:a1
:a2
,因为我指定的约束是连词。我会想象结果应该是
()
,因为约束是矛盾的;
q
的值不能满足这些约束


我一定是看错了结果。

是的,这是矛盾的。但事实就是这样:没有地图可以同时与
{:a1}
{:a2}
统一

run*
all
fresh
都在约束中引入了一个连词(AND)。如果需要析取(或),可以引入
conde

也许您的问题是:为什么core.logic不能“看到”矛盾并返回空结果集?我不太清楚。但这可能与这样一个事实有关,即即使我们移除其中一个约束,我们也不会得到“固定”的结果:


只要它是一个包含
[:a1]
条目的地图,它的内容就是:任何东西。我认为这是正确的结果。

是的,我的问题正是你所说的:“为什么core.logic不能“看到”矛盾并返回一个空的结果集?”移除其中一个约束
{:a 2}
得到的结果对我来说非常有意义;正如你所说,这是正确的结果。任何包含条目
{:a2}
的映射都是有效的解决方案。然而,这并不能解释为什么在前面的示例中返回矛盾。
(run* [q]
   (featurec q {:a 1}))

;=> ((_0 :- (clojure.core.logic/featurec _0 {:a 1})))