在JIProlog中使用freeze

时间:2012-10-04 18:41:51

标签: graph prolog cycle freeze edge

我想用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 一个边缘,这就是为什么我要检查被访问的边缘而不是被访问的节点。

1 个答案:

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

要注意:未经测试的代码......