2011-10-19 75 views
1

当我试图在图中找到/ 3可能路径时,我得到重复列表?任何想法有什么问题的代码?重复的图案是S:6重复与S:13,S:7 S:14,S:8 S:15等..Prolog返回重复列表

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

请问的Prolog的findall/3返回一个独特的结果?

回答

0

我会猜测。

printT/2打印S:(length-of-path)。为什么不应该有从A到B有相同长度的多条路径?

我想你的问题是,long_p/2成功两次相同的路径。我在pan/4中看不到任何理由。除非我错了,原因是co/2和/或hen/2。例如,如果数据库中有hen(a,b)hen(b,a),则co(a,b)将成功两次。这可能是固定

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

会产生列表Z所有Len的,这样pan(A,B,[A],Len)成功。因此,pan(A,B,[A],Len)被回溯并且所有解决方案Len被放入列表Z

在图形中,在两个特定节点AB之间有一条长度为6的路由。但也有从AB通过一些C长度为13的路径。findall找到这两条路线等