2011-10-19 9 views
1

グラフ内で3つの可能なパスを見つけようとすると、重複したリストを取得していますか?コードに何が間違っているのでしょうか? 6はSで重複した:13、S:Sとの7:14、S:S 8:重複のパターンがSであった プロローグが重複リストを返す

co(X,Y) :- hen(X,Y) ; hen(Y,X). 

pan(A, B, _, [A,B]) :- co(A, B). 
pan(A, B, Vix, [A | Len]) :- 
    co(A, C), 
    C \== B, 
    \+ member(C, Vix), 
    pan(C, B, [C | Vix], Len). 

long_p(A, B):- 
    findall(Len, pan(A,B,[A],Len), Z), 
    printT(Z,0). 

printT([],_). 
printT([H|T],V) :- 
    V1 is V + 1, 
    write('S: '), write(V1), nl, 
    write(H), nl, 
    nl, 
    printT(T,V1). 

..ように15およびプロローグのfindAll/3リターン別個ウィル結果?

答えて

0

私は推測するつもりです。

printT/2は、S:(length-of-path)を印刷します。同じ長さのAからBまでの複数のパスが存在しないのはなぜですか?

あなたの問題は、long_p/2が同じパスで2回成功したと思います。私はpan/4にはこれに理由がありません。私が間違っていない限り、理由はco/2および/またはhen/2です。たとえば、データベースにhen(a,b)hen(b,a)がある場合、co(a,b)は2回成功します。 pan(A,B,[A],Len)が成功するよう、すべてLen年代にリストZを生成しますこれは

co(X,Y) :- hen(X,Y). 
co(X,Y) :- hen(Y,X), \+ hen(X,Y). 
0
findall(Len, pan(A,B,[A],Len), Z) 

で固定することができます。したがって、pan(A,B,[A],Len)はバックトラックされ、すべてのソリューションLenがリストZに入れられます。

グラフには、2つの特定のノードABの間に長さ6のルートがあります。しかし、AからBまでの道もあり、長さはC、長さはfindallなどです。

関連する問題