一些core.logic构造(matcha
,matche
,matchu
,defne
,fne
)使用模式匹配表达式作为主体,并且可以使用,例如:
(run* [q]
(fresh [a o]
(== a [1 2 3 4 5])
(matche [a]
([ [1 2 . [3 4 5] ]]
(== q "first"))
([ [1 2 3 . [4 5] ]]
(== q "second"))
([ [1 . _] ]
(== q "third")))))
;=> ("first"
; "second"
; "third")
(示例来自Logic-Starter wiki)
但是我在core.logic文档中找不到用于模式匹配的语法规范。这是什么语法?也许我可以在一些minikanren文档或书籍中找到它?
?
为前缀的匹配变量和没有.
的匹配变量之间有什么区别? &
的列表(类似于clojure中的[_ _]
)之外,还有其他破坏性的构造吗? 最佳答案
我会尽力在这里回答。来自Ambrose Bonnaire-Sergeant的notes的Intel,这是我唯一发现的关于此主题的任何真实文档的地方。我怀疑,可以在core.logic
所基于的研究论文中找到很多语法,但是由于它们是270页的论文,所以我认为它们不会提供很好的引用。
带前缀的匹配变量之间有什么区别?没有它?
以?开头的变量是implicitly declared,而不是需要声明为fresh
的参数。在所有其他方面,它们的行为相同。
除了带有的列表以外,是否还有其他破坏性构造。 (类似于&in clojure)?
不,没有其他缺失的不可思议的语法可用于解构。
将[_ _]仅匹配具有两个元素的序列吗?
是的。
是否可以破坏 map ?
并不真地。对于您可以阅读here的主题,有一篇很好的长篇文章,但是从本质上讲, map 和类似 map 的结构在历史上一直不是为core.logic
及其同类提供理论基础的求解器关注的主题。如果您对 map 上的逻辑求解感兴趣,那么可能拥有的最好的工具就是featurec。引用文档: