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

时间:2014-10-24 13:14:09

标签: clojure logic-programming clojure-core.logic

某些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中的&)之外,还有其他任何破坏性构造吗?
  • [_ _]只会匹配包含两个元素的序列吗?
  • 是否可以破坏地图?

1 个答案:

答案 0 :(得分:1)

我会尽力回答这里。英特尔来自Ambrose Bonnaire-Sergeant的notes,这是我能找到的唯一有关于这个主题的真实文档的地方。我的怀疑是,core.logic所基于的研究论文中可以找到许多语法,但由于这些是270页的论文,我认为它们不是很好的参考。

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

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

除了列表之外还有其他任何破坏性构造吗? (类似于& in clojure)?

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

[_ _]只匹配包含两个元素的序列吗?

是否可以破坏地图?

不是真的。有一篇关于这个主题的长篇文章,你可以阅读here,但实际上地图和类似地图的结构在历史上并不是为core.logic(featurec x fs)提供理论基础的求解者关注的主题。它的同类。如果您对地图上的逻辑解决感兴趣,那么您可以使用的最佳工具featurec。引用文档:

  

fs

     

确保地图至少包含键值   地图fs中的对。 # Finds number of pages resulting from search term provided def find_pages(self): pages = [] html_page = urllib.request.urlopen(self.url) source = BeautifulSoup(html_page, "html5lib") base_url = 'https://ie.indeed.com' for a in source.find_all('div', class_= 'pagination'): for link in a.find_all('a', href=True): pages.append(base_url + link['href']) pages.insert(0, base_url + '/jobs?q=test&l=Dublin&sort=date&limit=50&radius=25&start=0') pages.pop() return pages 必须部分实例化 - 即它   可能包含值是支持功能的逻辑变量   提取