Prolog返回重复列表

时间:2011-10-19 02:12:08

标签: list prolog

当我尝试在图表中找到所有/ 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会返回一个明显的结果吗?

2 个答案:

答案 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

在图表中,两个特定节点AB之间的路径长度为6。但是,还有一条从AB的路径,通过一些长度为13的Cfindall找到这两条路线,等等。