Prolog &引用;“本地堆栈外”;颠倒清单

Prolog &引用;“本地堆栈外”;颠倒清单,prolog,Prolog,我编写了以下Prolog代码: concatenate([X|L1], L2, [X|L3]) :- concatenate(L1, L2, L3). concatenate([], L, L). rev([X|L], Y) :- concatenate(Z, [X], Y), rev(L, Z). rev([], []). 如果我执行以下查询: ?- rev([1,2,3], [3,2,1]). -> true ?- rev([1,2,3], [ X, Y, Z]). ->

我编写了以下Prolog代码:

concatenate([X|L1], L2, [X|L3]) :- concatenate(L1, L2, L3).
concatenate([], L, L).

rev([X|L], Y) :- concatenate(Z, [X], Y), rev(L, Z).
rev([], []).
如果我执行以下查询:

?- rev([1,2,3], [3,2,1]).  ->  true
?- rev([1,2,3], [ X, Y, Z]).  -> X=3, Y=2, Z=1
没关系,但如果我这样做了:

?- rev([1, 2, 3], X).
我得到:

ERROR: Out of local stack
我确信我能在网上找到一个正确的
反向功能的实现,但我想知道是什么导致了这个错误

连接(L1、L2、L3)。
在L1和L3都未实例化的情况下被调用,然后永远循环。您可以使用调试器看到这种行为:just

?- gtrace,rev([1,2,3],X).
然后在连接中请求一个步骤(点击空格键)。在左上角的框架(绑定)中,您可以看到实例化的变量:只需L2获取一个值。

而不是:

rev([X|L], Y) :- concatenate(Z, [X], Y), rev(L, Z).
尝试:


不是解决方案,但您可以尝试在每个步骤打印值以调试问题。
rev([X|L], Y) :- rev(L, Z), concatenate(Z, [X], Y).