0

我想用 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).

这个答案中,我找到了原因(边缘列表尚未实例化)和解决方案的提示(使用freeze/2)。但是,freeze/2在我正在使用的 JIProlog 中不起作用。谁能帮我找到替代解决方案?

编辑:我知道一般来说,对于图表来说,这将是一个跟踪节点的解决方案,例如在这个例子中,但是对于我的特定应用程序,“节点”也可以边缘,这就是我想要检查的原因被访问的边而不是被访问的节点。

4

1 回答 1

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).

当心:未经测试的代码....

于 2012-10-05T23:08:58.127 回答