Clojure core.logic统一匹配映射中的值,但不匹配键
我不明白为什么从以下两个示例中,第一个返回正确的值Clojure core.logic统一匹配映射中的值,但不匹配键,clojure,clojure-core.logic,Clojure,Clojure Core.logic,我不明白为什么从以下两个示例中,第一个返回正确的值(1),而第二个返回()。我希望结果(:key),或者出现异常,无法找到解决方案,但不是空列表 (l/run* [q] (l/== {:key 1} {:key q})) ;; BUT IT DOESNT WORK (l/run* [q] (l/== {:key 1} {q 1})) 我还没有发现它是否被记录为预期行为,但从我(有限的)理解来看,看起来地图的统一只发生在值上,而不是键上 正如在unify with map*中实现的那
(1)
,而第二个返回()
。我希望结果(:key)
,或者出现异常,无法找到解决方案,但不是空列表
(l/run* [q]
(l/== {:key 1} {:key q}))
;; BUT IT DOESNT WORK
(l/run* [q]
(l/== {:key 1} {q 1}))
我还没有发现它是否被记录为预期行为,但从我(有限的)理解来看,看起来地图的统一只发生在值上,而不是键上
正如在
unify with map*
中实现的那样,当core.logic
在第一个映射中找到键:key
时,它在第二个映射中查找它的值,没有找到它,因此放弃了统一。因为没有解决方案,就像@Arthur Ulfeldt所说的那样,你最终会得到()
run*返回一个解决方案列表,所以()表示没有解决方案同意,但据我所知,有一个解决方案。如果您使用q=:key
,这不符合等式吗?我认为我们必须将答案解读为:找不到解决方案
而不是我可以保证不存在任何解决方案
。在这种情况下,核心逻辑的限制
?但这是一个值得注意的好问题;)我的感觉是,如果您扩展搜索空间以包含键,您可能需要做更多的工作,因此可能需要在性能方面进行权衡。令我惊讶的是,core.logic中的“no solutions”(无解决方案)可能仅仅意味着它无法解决它,尽管存在解决方案。所以“没有解决方案”不是保证。但它仍然非常强大,它可以统一价值观,这可能是你大多数时候都会用到的。是的,这是正确的。映射键不能是lvar。它可能没有很好的文档记录,但这就是功能设计的方式。