本地堆栈中的prolog

时间:2015-12-02 04:27:40

标签: prolog stack-overflow stack-trace

不再需要回答了。完成。谢谢 !

a(S,E,[S|R]) :- S\=E,(c(S, N);c(N,S)),a(N,E,R),\+member(S,R).
a(X,X,P):- P=[X].

上面的代码引起了本地堆栈问题,有人可以告诉我如何修复?感谢。

1 个答案:

答案 0 :(得分:1)

要完成对带有循环的图表的访问(在c(S, N);c(N,S)的DAG中引入),我们必须检查到目前为止所见的路径(只是说),但是你试图在构建之后检查。这个“逻辑循环”反映了代码的非终止。更简单的解决方案是添加一个包含目前所见路径的参数:

a(S,E,P) :- visit(S,E,[S],P).

visit(X,X,P,R) :- reverse(P,R).
visit(S,E,P,R) :- (c(S,N);c(N,S)), \+memberchk(N,P), visit(N,E,[N|P],R).

产量

?- a(1,4,L).
L = [1, 2, 4] ;
L = [1, 3, 4] ;
false.

请参阅this thread关于此主题的一些高级别想法