2013-11-04 49 views
2

名單在PyDatalog我已經定義了以下斷言: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.的不同評價的結果我想也知道路線,例如:ABCD

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 ...

在此先感謝。

回答

2

您需要一個包含兩個端點之間節點的變量的謂詞。您可以使用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以來,支持列表。

+0

非常感謝,它的工作!現在我應該處理循環,因爲在某些路由中它循環。 – Ignasi

+0

爲了照顧循環,我現在在路由的定義中增加了以下子句:&〜(P1中的Z) – user474491

+0

再次感謝您!它現在適用於較長的路線 – Ignasi