PyDatalog:答案中的值列表

时间:2013-11-04 17:13:14

标签: logic-programming

在PyDatalog中,我定义了以下断言:

#stations
assert_fact('station', 'A' ,'yellow') 
assert_fact('station', 'B' ,'yellow')
assert_fact('station', 'C' ,'yellow')
assert_fact('station', 'D' ,'yellow')
#sections
assert_fact('stretch', 'A' ,'B')
assert_fact('stretch', 'B' ,'C')
assert_fact('stretch', 'C', 'D')

我想询问数据库是否有办法从A到达D. 以下代码应该有效,因为如果有方法它会回答set([()]),如果没有,则回答None。但它并没有给我Z的不同评价的结果。我也想知道这条路线,例如:A B C D

load("""
route(X,Y) <= stretch(X,Y)
route(X,Y) <= stretch(X,Z) & route(Z,Y)
""")

我尝试过未绑定的值,但它只给出了第一次迭代的结果:

load("""
route(X,Y,P) <= stretch(X,Y) & (P==Y)
route(X,Y,P) <= stretch(X,P) & route(P,Y,Z)  
""")

我认为问题在于它只需要在第一次迭代中使用P.或者我应该使用聚合函数?我不太了解如何使用concat ......

提前致谢。

1 个答案:

答案 0 :(得分:4)

您需要一个带有变量的谓词,该变量包含两个端点之间的节点。您可以使用route()的以下定义:

load("""
route(X,P, Y) <= stretch(X,Y) & (P==[])
route(X,P, Y) <= stretch(X,Z) & route(Z,P1,Y) & ~(Z in P1) & (P==[Z]+P1)
""")

print(pyDatalog.ask("route('A', P, 'D')"))
# prints set([(('B', 'C'),)])

自pyDatalog 0.13起支持列表。