当我尝试在图表中找到所有/ 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 | 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 :(得分: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).
答案 1 :(得分:0)
findall(Len, pan(A,B,[A],Len), Z)
将生成包含所有 Z
的列表Len
,以便pan(A,B,[A],Len)
成功。因此,pan(A,B,[A],Len)
被撤销,所有解决方案Len
都会被放入列表Z
。
在图表中,两个特定节点A
和B
之间的路径长度为6。但是,还有一条从A
到B
的路径,通过一些长度为13的C
。findall
找到这两条路线,等等。