我尝试了一本书中的一些基本示例,它使“超出本地堆栈”错误(我会在代码后告诉更多)。 这是代码:
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,然后输入';'它犯了错误。 这有什么问题?
答案 0 :(得分:2)
问题在于您已经以循环方式定义了边缘。寻找从a
到b
的第二条路径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).