"Out of local stack"反转列表



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

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

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

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

代替:

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

尝试:

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

最新更新