Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Prolog返回重复列表_List_Prolog - Fatal编程技术网

List Prolog返回重复列表

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

当我试图在图中查找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 | 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)