“超出本地堆栈”倒转列表

时间:2012-08-28 10:33:03

标签: 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]).  -> X=3, Y=2, Z=1

没关系,但是如果我这样做的话:

?- rev([1, 2, 3], X).

我明白了:

ERROR: Out of local stack

我确信我可以在网上找到reverse function的正确实现,但我想知道导致此错误的原因。

2 个答案:

答案 0 :(得分:4)

concatenate(L1, L2, L3).调用 L1和L3未实例化,然后永远循环。您可以使用调试器看到此行为:只需

?- gtrace,rev([1,2,3],X).

然后请求内部连接步骤(点击空格键)。在左上角的框架(绑定)中,您可以看到实例化的变量:只需L2获取一个值。

答案 1 :(得分:1)

而不是:

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

尝试:

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