List Prolog返回重复列表
当我试图在图中查找L/3可能路径时,我得到了重复列表?知道代码有什么问题吗?复制模式为S:6与S:13复制,S:7与S:14复制,S:8与S:15复制,以此类推List Prolog返回重复列表,list,prolog,List,Prolog,当我试图在图中查找L/3可能路径时,我得到了重复列表?知道代码有什么问题吗?复制模式为S:6与S:13复制,S:7与S:14复制,S:8与S:15复制,以此类推 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
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会返回一个不同的结果吗?我猜
printT/2
打印S:(路径长度)
。为什么从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).
将使用所有Len
生成列表Z
,从而平移(A,B,[A],Len)
成功。因此,pan(A,B,[A],Len)
被回溯,所有解决方案Len
都被放入列表Z
在图形中,两个特定节点a
和B
之间有一条长度为6的路由。但是也有一条从a
到B
的路径,通过一些长度为13的C
findall
查找这两条路由,以此类推
findall(Len, pan(A,B,[A],Len), Z)