2

...我该如何避免呢?

(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 1OR :a 2,因为我指定的约束是一个连词。我原以为结果应该是()因为约束是矛盾的;没有任何价值q可以满足这些约束。

我一定是读错了结果。

4

1 回答 1

1

是的,这是矛盾的。但事实就是如此:没有任何地图可以同时{:a 1}统一{:a 2}

run*, all,fresh都在其约束之间引入了一个合取 (AND)。如果你想要一个析取(OR),你可以引入一个conde.

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

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

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

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

于 2015-08-21T15:57:33.407 回答