1

我编写了以下 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在网上找到正确的实现,但我想知道是什么导致了这个错误。

4

2 回答 2

3

concatenate(L1, L2, L3).没有实例化 L1 和 L3 的情况下被调用,然后永远循环。您可以使用调试器查看此行为:只需

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

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

于 2012-08-28T10:40:44.340 回答
1

代替:

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

尝试:

rev([X|L], Y) :- rev(L, Z), concatenate(Z, [X], Y).
于 2012-08-28T13:15:01.243 回答