了解Prolog列表和递归

时间:2015-11-01 20:55:11

标签: list recursion prolog reverse tail-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).

1 个答案:

答案 0 :(得分:2)

如果您激活跟踪......

div.clearfix

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

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]. 变量的Reverse列表。