pydatalog里面规则递归

前言

最近在逻辑式编程,因为自己很小白,喜欢用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<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值