我想用JIProlog进行图搜索。下面的示例在没有memberchk
的情况下正常工作,但是它返回带有循环的路径,这是我不想要的。然而,当我确实包含它时,Prolog会冻结,可能是因为无限搜索。
connected(ac,a,b). connected(ac,a,c). connected(ac,b,c).
connected(ac,b,a). connected(ac,c,a). connected(ac,c,b).
path(A,B,[AB]) :- connected(AB,A,B).
path(A,C,[H|T]) :- connected(H,A,B), path(B,C,T), \+ memberchk(H,T).
在this answer中,我找到了原因(边缘列表尚未实例化)和解决方案的提示(使用freeze/2
)。但是,freeze/2
在JIProlog中不起作用,这正是我正在使用的。任何人都可以帮助我寻找替代解决方案吗?
编辑:我知道对于图表而言,它将是一种跟踪节点的解决方案,例如在this示例中,但对于我的特定应用程序,“节点”可以也是 on 一个边缘,这就是为什么我要检查被访问的边缘而不是被访问的节点。
答案 0 :(得分:0)
我不确定你理解你的要求。我会尝试调整建议的答案。
% get a path from start to end
path(Start, End, Path) :-
path(Start, End, [], Path).
path(A, B, Visited, [AB|Visited]) :- connected(AB, A, B).
path(A, C, Visited, Path) :-
connected(AB, A, B),
\+ memberchk(AB, Visited),
path(B, C, [AB|Visited], Path).
要注意:未经测试的代码......