了解 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
变量。
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
变量。