2016-11-21 5 views
0

プロローグ内に2つのステーション間で可能なすべてのルートを与えるプログラムを作成しました。各ルートでは、各駅は一度しか訪れるべきではありません。私のコードは、これまでのところです:プロローグ内のサイクルルートプログラム

% facts 

connection(s1,s2). 
connection(s1,s4). 
connection(s2,s3). 
connection(s2,s5). 
connection(s3,s4). 
connection(s4,s5). 
connection(s5,s6). 
connection(s6,s1). 

% predicates 

direction1(X,Y) :- connection(X,Y). 
direction2(X,Y) :- connection(Y,X). 

route1(X,Y,R):- route1(X,Y,[],R). 
route1(X,Y,_,[X,Y]) :- direction1(X,Y). 
route1(X,Y,L,R) :- \+direction1(X,Y), direction1(X,Z), \+member(Z,L), route1(Z,Y,[Z|L],RZ), R=[X|RZ]. 

route2(X,Y,R):- route2(X,Y,[],R). 
route2(X,Y,_,[X,Y]) :- direction2(X,Y). 
route2(X,Y,L,R) :- \+direction2(X,Y), direction2(X,Z), \+member(Z,L), route2(Z,Y,[Z|L],RZ), R=[X|RZ]. 

route(X,Y,R) :- route1(X,Y,R); route2(X,Y,R). 

問題は、私はルートを求めるときプロローグは私のexampelためのすべてのルートを、与えていないということである[S1、S4、R]は、プロローグは、[私のルートを与えるものではありませんs1、s2、s3、s4]である。私はそれが "+ direction1(X、Y)"と "+ direction2(X、Y)"によって引き起こされたと思います。しかし、私は、プロローグがあるルートで複数回駅に来るのを防ぐためにこれが必要です。任意のアイデアをどのようにこれを修正するには?

enter image description here enter image description here ありがとうございます!

答えて

1

この侵害の原因として正しく識別された\+direction1(X,Y)を削除し、route1/4の定義に別の\+ member(X, L)ガードを追加することです。

編集:上記は十分ではありません。

route1(X,Y,R):- route1(X,Y,[X],R). % note that X is visited immediately 
route1(X,Y,_,[X,Y]) :- direction1(X,Y). 
route1(X, Y, Visited, Route) :- 
    direction1(X, Z), 
    Z \= Y, 
    \+ member(Z, Visited), 
    route1(Z, Y, [Z|Visited], Route1), 
    Route = [X|Route1]. 

あなたは、おそらくルート述語の二つの変種を統一する必要があります:ここでは、より読みやすい書式や変数名と全部のクリーナー書き換えは、あるそのうちの一つは、のみのみ「の方向に沿っているのルートを検索します1 "エッジに沿ったものと、"方向2 "エッジに沿ったもののみを含む。一般的には、任意の方向に任意のエッジをトラバースできるようにする必要があります。

+0

それでは、私にすべてのルートを教えてくれません... – zer0kai

+0

すべてのルート、最初の段落で説明した変更、2番目の段落で説明した変更はありません。どのルートがあなたに与えられないのですか? –

+0

例えば、私が "route(s2、s5、R)"を求めるとき、それは "R = [s2、s5]"を与えるだけですが、[s2、s3、s4、s5]のようなルートも存在します。 – zer0kai