从本地堆栈开始
prolog out of local stack
不再需要回答。完成。谢谢 !
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].
上面的代码导致了本地堆栈问题,有人能告诉我如何解决吗?谢谢
要完成对带有循环的图的访问(在您的 DAG 中从 c(S, N);c(N,S)
引入),我们必须检查 到目前为止 所见的路径(只是说说) ,但您尝试在 构建完成后检查它。这 'logical loop' 反映在您的代码未终止。更简单的解决方案是添加一个参数来保存到目前为止看到的路径:
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 关于此主题的一些高级想法
不再需要回答。完成。谢谢 !
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].
上面的代码导致了本地堆栈问题,有人能告诉我如何解决吗?谢谢
要完成对带有循环的图的访问(在您的 DAG 中从 c(S, N);c(N,S)
引入),我们必须检查 到目前为止 所见的路径(只是说说) ,但您尝试在 构建完成后检查它。这 'logical loop' 反映在您的代码未终止。更简单的解决方案是添加一个参数来保存到目前为止看到的路径:
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 关于此主题的一些高级想法