0

我从一本书中尝试了一些基本示例,它产生了“Out of local stack”错误(我会在代码之后告诉更多)。这是代码:

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

例如,我尝试编写查询 edge(a,b),它返回 true,然后我输入 ';' 它犯了错误。这里有什么问题?

4

1 回答 1

2

问题是您已经以循环方式定义了边缘。在寻找从abProlog 的第二条路径时,正在循环通过tedge(a,VAR), edge(a,VAR),tedge(a,VAR)等。

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

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

?- closure0(edge, a, b).
于 2014-12-30T18:27:43.787 回答