我已经设法拼凑了一个脚本,该脚本遍历所有链接并将它们显示给我但是我似乎无法解决为什么使用其中一个链接将整个脚本循环到无穷大。如果您删除下面的链接,该程序将起作用;
link(f,c).
以下是完整脚本的代码;
link(a,b).
link(a,b).
link(b,c).
link(c,d).
link(f,c).
link(b,e).
link(d,e).
link(e,f).
path(X,Y,[X,Y]):-link(X,Y).
path(X,Y,[X|R]):-link(X,Z),path(Z,Y,R).
route(X,Y,T):-find_route(X,Y,[],T).
find_route(X,Y,D,[Z|T]):-path(X,Y,Z),not(member(Z,D)),
find_route(X,Y,[Z|D],T).
find_route(_,_,_,[]).
它似乎当前匹配数组中的值与链接值然后比较从a到f的路径,之后它检查已经通过的值并在控制台上显示它们(这是没有链接(f,c) )。)如果有人知道我经历过的地方,请告诉我。
由于
答案 0 :(得分:0)
链接(f,c)有效地关闭有向环c-> d-> e-> f-> c。因此,path(X,Y,Z)
与属于此循环的X
和Y
的任何回溯都会产生更长和更长的路径。因此,您应该在path
规则中添加一项检查,以避免已访问过的节点。