不再需要回答了。完成。谢谢 !
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].
上面的代码引起了本地堆栈问题,有人可以告诉我如何修复?感谢。
答案 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关于此主题的一些高级别想法