繁体   English   中英

Prolog超出本地堆栈错误

[英]Prolog Out of local stack error

我尝试了一本书中的一些基本示例,它使“ 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,然后输入“;” 它导致了错误。 这是什么问题

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

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

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

?- closure0(edge, a, b).

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM