0

我在 PyDatalog 的循环中跟踪递归深度时遇到了麻烦。我有一个带有连接它们的节点和边的图。例如,我的 PyDatalog 程序中有 3 个节点的图:

pyDatalog.load("""+ connected("A", "B")
+ connected("B", "C")
+ connected("C","A")""")

我基本上想用相应的递归深度计算从该图的每个节点到另一个节点(传递闭包)的每个连接。我的 Datalog 程序可以在不计算递归深度的情况下正常工作(路径的长度实际上应该是递归深度):

pyDatalog.create_terms('connected,X,Y,Z,D')
pyDatalog.load("""connected(X,Y) <= connected(X,Z) & connected(Z,Y)""")

这给了我以下结果:

X | Y
--|--
A | A
A | C
A | B
B | B
B | A
B | C
C | C
C | B
C | A

这正是我想要的结果。我已经尝试计算递归深度并且它没有循环就可以正常工作(例如,如果我忽略了 connected("C", "A") 事实):

pyDatalog.load("""+ connected("A", "B")
+ connected("B", "C")
connected(X,Y,1) <= connected(X,Y)
connected(X,Y,D) <= connected(X,Z,D1) & connected(Z,Y,D1) & (D==D1+1)""")

它给了我以下结果:

X | Y | D
--|---|--
A | B | 1
B | C | 1
A | C | 2

一旦我添加了一个圆圈,它就不再工作了......我已经尝试应用一些圆圈检查或跟踪从一个节点到另一个节点的路径并将长度用作递归深度(类似于这篇文章:PyDatalog:值列表在回答)但我无法让它工作......

我想要的输出是:

X | Y | D
--|-- |--
A | A | 3
A | C | 2
A | B | 1
B | B | 3
B | A | 2
B | C | 1
C | C | 3
C | B | 2
C | A | 1

如果有人可以帮助我,我会很高兴:D

谢谢

4

0 回答 0