制作一个反向清单

S. *_*. N 2 prolog

我有以下代码.试图制作一个反向清单.但它不起作用.

reverse([],[H|T]).
reverse([H|T],Z) :- reverse(T,[H|Z]).
Run Code Online (Sandbox Code Playgroud)

我在prolog中运行它,我得到了这个:

1 ?- trace, reverse([1,2,3],X).
   Call: (7) reverse([1, 2, 3], _G396) ? creep
   Call: (8) reverse([2, 3], [1|_G396]) ? creep
   Call: (9) reverse([3], [2, 1|_G396]) ? creep
   Call: (10) reverse([], [3, 2, 1|_G396]) ? creep
   Exit: (10) reverse([], [3, 2, 1|_G396]) ? creep
   Exit: (9) reverse([3], [2, 1|_G396]) ? creep
   Exit: (8) reverse([2, 3], [1|_G396]) ? creep
   Exit: (7) reverse([1, 2, 3], _G396) ? creep
true.
Run Code Online (Sandbox Code Playgroud)

这应该给我[3,2,1],而不是[1,2,3].这里出了什么问题?

joe*_*l76 6

当列表为空时,其反向为空.所以

reverse([], []).
Run Code Online (Sandbox Code Playgroud)

在另一种情况下,您将在列表的其余部分的最后添加列表的第一个元素.所以:

reverse([H|T],Z) :-
    reverse(T,Z1),
    append(Z1, [H], Z).
Run Code Online (Sandbox Code Playgroud)