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

时间:2015-08-21 14:33:55

标签: 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})))

我理解为_0地图必须至少包含:a 1键值对和:a 2键值对。这似乎是矛盾的,因为:a无法映射到12,除非我们使用MultiMaps。我无法将其读作:a 1:a 2,因为我指定的约束是一个连词。我原以为结果应该是()因为约束是矛盾的; q没有值可以满足这些约束条件。

我必须错误地阅读结果。

1 个答案:

答案 0 :(得分:1)

是的,它是矛盾的。但它的含义是:没有地图可以同时与{:a 1}{:a 2}统一。

run*allfresh都在其约束中引入了一个连词(AND)。如果你想要一个析取(OR),你可以引入一个conde

也许你的问题是:为什么core.logic不能"看到"矛盾并返回一个空结果集?我不确切地知道。但也许这与这样一个事实有关,即即使我们删除了其中一个限制因素,我们也不会得到一个“基础”和#34;结果:

(run* [q]
   (featurec q {:a 1}))

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

它读作:任何东西,只要它是包含[:a 1]条目的地图。而且我认为这是正确的结果。