gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:53:53 25 4
gpt4 key购买 nike

一些 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 中的 &)?
  • 威尔 [_ _]只匹配具有两个元素的序列?
  • 可以破坏 map 吗?

最佳答案

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

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

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

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

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

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

是的。

可以破坏 map 吗?

不是真的。关于这个主题有一篇很好的长篇文章,您可以阅读 here ,但从本质上讲, map 和类似 map 的结构在历史上并不是为 core.logic 及其同类提供理论基础的求解器关注的主题。如果您对 map 上的逻辑求解感兴趣,那么您可以使用的最佳工具可能是 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.

关于clojure - core.logic matche、defne 模式匹配构造使用什么语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26548626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com