Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure core.logic统一匹配映射中的值,但不匹配键_Clojure_Clojure Core.logic - Fatal编程技术网

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。它可能没有很好的文档记录,但这就是功能设计的方式。