为什么会返回这个相互矛盾的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})))