11

一些 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)的列表之外,还有其他破坏性构造吗?
  • [_ _]仅匹配具有两个元素的序列吗?
  • 可以破坏地图吗?
4

1 回答 1

2

我会尽力在这里回答。Intel from Ambrose Bonnaire-Sergeant's notes,这是我能找到的唯一一个有关于这个主题的真实文档的地方。我怀疑很多语法都隐藏在所core.logic依据的研究论文中,但由于这些是 270 页的论文,我认为它们不会提供很好的参考。

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

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

除了带有 . (类似于 clojure 中的 & )?

不,没有其他缺失的用于解构的神奇语法。

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

是的。

可以破坏地图吗?

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

(featurec x fs)

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

于 2018-04-26T12:09:08.513 回答