关于clojure:core.logic matche,defne模式匹配构造使用什么语法?

What syntax core.logic matche, defne pattern matching constructs use?

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

1
2
3
4
5
6
7
8
9
10
11
12
13
(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的笔记,这是我能找到的唯一关于此主题的真实文档的地方。我的怀疑是,许多语法都可以在core.logic所基于的研究论文中找到,但是由于它们是270页的论文,所以我认为它们不会提供很好的参考。

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

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

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

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

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

是。

有可能破坏地图吗?

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

(featurec x fs)

Ensure that a map contains at least the key-value
pairs in the map fs. fs must be partially instantiated - that is, it
may contain values which are logic variables to support feature
extraction.