前言
最近在逻辑式编程,因为自己很小白,喜欢用sql语言解决问题。开始听说函数式挺像的,就去学了一段时间函数,在看java8的新特性中,作者提到过关于逻辑式语言的特性,因为开始关注datalog,而后看到自己刚学的python里面有个对应的模块有实现。而在遇到一个例子时,实在看不懂,想了我一个星期了(网上实在找不到资料,只有短短几篇翻译,好吧,我承认我太笨了罒ω罒),于是记录一下。
正文
示例链接:https://github.com/pcarbonn/pyDatalog/blob/master/pyDatalog/examples/graph.py
代码:
from pyDatalog import pyDatalog as dt
dt.create_terms('X,Y,Z,P,P2,link,all_path,test')
# there is a link between node 1 and node 2
+link(1,2)
+link(2,3)
+link(2,4)
+link(2,5)
+link(5,6)
+link(6,7)
+link(7,2)
# 无向图,边双向连接
#link(X,Y) <= link(X,Y)
#这里推导公式中存在一个规则和推导后的规则相同。你可以尝试更改左边的all_path,循环就不存在了。
all_path(X,Y,P) <= all_path(X,Z,P2) & link(Z,Y) & (X!=Y) & (X._not_in(P2)) & (Y._not_in(P2)) & (P==P2+[Z])
all_path(X,Y,P) <= link(X,Y) & (P==[])
print (all_path(X,Y,P))
执行结果:
X | Y | P
--|---|----------
1 | 2 | ()
2 | 3 | ()
2 | 4 | ()
2 | 5 | ()
5 | 6 | ()
6 | 7 | ()
7 | 2 | ()
7 | 4 | (2,)
7 | 5 | (2,)
1 | 3 | (2,)
1 | 5 | (2<