3

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 の使い方がよくわかりません...

前もって感謝します。

4

1 に答える 1

4

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 以降でサポートされています。

于 2013-11-04T18:29:12.320 に答える