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

Posted

技术标签:

【中文标题】为啥会返回这个矛盾的 clojure.core.logic/featurec 结果?【英文标题】:Why is this contradictory clojure.core.logic/featurec result being returned?为什么会返回这个矛盾的 clojure.core.logic/featurec 结果? 【发布时间】:2015-11-15 13:24:26 【问题描述】:

...我该如何避免呢?

(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】:

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

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

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

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

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

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

【讨论】:

是的,我的问题正如你所说:“为什么 core.logic 不能“看到”矛盾并返回一个空的结果集?” 删除其中一个约束:a 2 得到的结果实际上对我来说非常有意义;正如你所说,这是正确的结果。任何包含条目:a 2 的地图都是有效的解决方案。但是,这并不能解释为什么在前面的示例中会返回矛盾。

以上是关于为啥会返回这个矛盾的 clojure.core.logic/featurec 结果?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 python profiler 给出了矛盾的结果?

为啥这个函数会返回这个值? [复制]

为啥 onclick 函数会返回这个?

为啥这个计算(除法)会返回错误的结果?

为啥这个 bash 命令返回值会改变?

为啥我的交叉验证错误分类错误率与测试数据集成功率相矛盾