2015-11-01 81 views
2
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).是需要這個工作。

回答

2

如果您激活跟蹤...

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列表到Result變量。

+1

謝謝!我猜我遇到的問題是理解兩個規則之間的關係 –