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

kol*_*len 11 clojure logic-programming clojure-core.logic

一些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")
Run Code Online (Sandbox Code Playgroud)

(来自Logic-Starter wiki的示例)

但是我在core.logic文档中找不到模式匹配的语法规范.这是什么语法?也许我可以在一些minikanren文档或书籍中找到它?

  • 前缀?和不带前缀的匹配变量有什么区别?
  • 除了列表之外是否还有其他破坏性构造.(类似于&clojure)?
  • [_ _]匹配有两个元素只有序列?
  • 是否有可能破坏地图?

Ven*_*ius 2

我会尽力在这里回答。英特尔来自 Ambrose Bonnaire-Sergeant 的笔记,这是我能找到的唯一有关于该主题的真实文档的地方。我怀疑很多语法都隐藏在其所core.logic依据的研究论文中,但由于这些论文长达 270 页,我认为它们不会提供很好的参考。

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

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

除了带有 . 的列表之外,还有其他破坏性构造吗?(类似于 clojure 中的 &)?

不,解构过程中没有其他缺失的神奇语法。

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

是的。

可以破坏地图吗?

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

(featurec x fs)

确保映射至少包含映射中的键值对fsfs必须部分实例化 - 也就是说,它可能包含支持特征提取的逻辑变量值。