某些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中的&
)之外,还有其他任何破坏性构造吗?[_ _]
只会匹配包含两个元素的序列吗?答案 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
必须部分实例化 - 即它 可能包含值是支持功能的逻辑变量 提取