Prolog超出本地堆栈错误

时间:2014-12-30 18:04:01

标签: prolog transitive-closure

我尝试了一本书中的一些基本示例,它使“超出本地堆栈”错误(我会在代码后告诉更多)。 这是代码:

edge(a,b).
edge(a,e).
edge(b,d).
edge(b,c).
edge(c,a).
edge(e,b).
tedge(Node1,Node2) :-
    edge(Node1,SomeNode),
    edge(SomeNode,Node2).
edge(X,Y) :- tedge(X,Y).

我试图编写查询边缘(a,b)并返回true,然后输入';'它犯了错误。 这有什么问题?

1 个答案:

答案 0 :(得分:2)

问题在于您已经以循环方式定义了边缘。寻找从ab的第二条路径Prolog正在循环遍历tedge(a,VAR)edge(a,VAR)tedge(a,VAR)等。

请注意,即使您没有将边缘定义为对称,Prolog也会循环,即由于循环a -> b -> c -> a

解决方案是跟踪之前访问过的顶点和/或边缘。使用closure0/3(我从SO用户false中学到的谓词)可以直接实现检查非重复顶点。如果您使用该谓词,则只需要edge/2个事实和以下查询:

?- closure0(edge, a, b).