2016-11-21 11 views
1

私はプロローグでプログラムを作成しました。これは、サイクル内の2つのステーション間のルートを私に与えるはずです。例えば私がs3とs4の間のルートを尋ねると、2つの正しいルート[s3、s4]と[s3、s2、s1、s6、s5、s4]が与えられますが、欲しい。それは[s3、s4、s5、s6、s1、s2、s3、s4]です。 1つのルートで1つの駅を何度も訪問することはできません。私はメンバーコマンドでこれを防止しようとしましたが、それは常に動作しないようです。これをどうすれば解決できますか?ここでプロローグ内の有向グラフのサイクル

は、コードは次のとおりです。事前に

% facts 

connection(s1,s2). 
connection(s2,s3). 
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,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,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). 

enter image description here

ありがとう!

答えて

1

これはPrologの古典的なエラーです。 route1(またはroute2)の3番目のルールが、2番目のルールと一致するもののスーパーセットと一致するため、この追加の回答が得られます。これは必要ではありません。例えば

我々が唯一見れば、:

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

その後、我々はXYは最初のルールに一致する場合、彼らはまた、あなたの問題につながる、二番目のルールに一致することがわかります。実際には、最初のルールが失敗した場合(つまり、XYの間のパスがなく、Zから始まる他のポイントを通過する必要がある場合)にのみ、2番目のルールを適用します。

そこで我々は(memberへの呼び出しを削除した後)、それらの簡単な変更でこの問題を解決することができます:太字の2行の

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), 
    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), 
    route2(Z,Y,[Z|L],RZ), 
    R=[X|RZ].

、我々はすでに存在しない場合はこれらのルールにのみ適用されることを言います直接経路はXYの間です。

関連する問題