What syntax core.logic matche, defne pattern matching constructs use?
一些core.logic构造(
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的笔记,这是我能找到的唯一关于此主题的真实文档的地方。我的怀疑是,许多语法都可以在
带前缀的匹配变量有什么区别?没有它?
以?开头的变量隐式声明,而不需要声明为
除了带有的列表以外,是否还有其他破坏性的构造。 (类似于&in clojure)?
不,没有其他不可思议的语法可用于分解。
[_ _]仅匹配具有两个元素的序列吗?
是。
有可能破坏地图吗?
并不是的。有一篇很好的关于该主题的长篇文章,您可以在这里阅读,但是从本质上讲,地图和类似地图的结构在历史上一直不是为
(featurec x fs) Ensure that a map contains at least the key-value
pairs in the mapfs .fs must be partially instantiated - that is, it
may contain values which are logic variables to support feature
extraction.