我写了以下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
的正确实现,但我想知道导致此错误的原因。
答案 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).