一些core.logic构造(matchamatchematchudefnefne)使用模式匹配表达式作为主体,并且可以使用,例如:

(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中的[_ _])之外,还有其他破坏性的构造吗?
  • ojit_code是否仅匹配具有两个元素的序列?
  • 是否可以破坏 map ?
  • 最佳答案

    我会尽力在这里回答。来自Ambrose Bonnaire-Sergeant的notes的Intel,这是我唯一发现的关于此主题的任何真实文档的地方。我怀疑,可以在core.logic所基于的研究论文中找到很多语法,但是由于它们是270页的论文,所以我认为它们不会提供很好的引用。

    带前缀的匹配变量之间有什么区别?没有它?

    以?开头的变量是implicitly declared,而不是需要声明为fresh的参数。在所有其他方面,它们的行为相同。

    除了带有的列表以外,是否还有其他破坏性构造。 (类似于&in clojure)?

    不,没有其他缺失的不可思议的语法可用于解构。

    将[_ _]仅匹配具有两个元素的序列吗?

    是的。

    是否可以破坏 map ?

    并不真地。对于您可以阅读here的主题,有一篇很好的长篇文章,但是从本质上讲, map 和类似 map 的结构在历史上一直不是为core.logic及其同类提供理论基础的求解器关注的主题。如果您对 map 上的逻辑求解感兴趣,那么可能拥有的最好的工具就是featurec。引用文档:

    10-06 13:31
    查看更多