了解 Prolog 列表和递归

Understanding Prolog lists and recursion

reverse([], X, X).
reverse([H|Original], Result, Reverse) :- 
   reverse(Original, Result, [H|Reverse]).

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

以上是一个相当简单的 Prolog 程序,用于反转列表。我只是在找人向我解释反向规则中的 Reverse 变量如何以结果结束。根据我的想法,我将原始列表的头部添加到新列表的头部 Reverse 从而反转列表。我没有在任何地方与变量 Result 进行交互,那么为什么它根本没有任何内容?

几天来我一直被这个问题困扰着,如果有人能解决这个问题,我将不胜感激!

PS。我也在为为什么需要 reverse([], X, X). 才能工作而苦苦挣扎。

如果您激活追踪……

trace(reverse).

...然后你可以看到会发生什么:

?- reverse([1,2,3],X,[]).
 T Call: (7) reverse([1, 2, 3], _G1003, [])
 T Call: (8) reverse([2, 3], _G1003, [1])
 T Call: (9) reverse([3], _G1003, [2, 1])
 T Call: (10) reverse([], _G1003, [3, 2, 1])
 T Exit: (10) reverse([], [3, 2, 1], [3, 2, 1])
 T Exit: (9) reverse([3], [3, 2, 1], [2, 1])
 T Exit: (8) reverse([2, 3], [3, 2, 1], [1])
 T Exit: (7) reverse([1, 2, 3], [3, 2, 1], [])
X = [3, 2, 1].

在您的示例中,第二条规则构建反向列表,第一条规则 "copies" 将 Reverse 列表构建到 Result 变量。