2015-05-08 102 views
-1

我有以下代碼:基本Prolog的遞歸跟蹤

my_length([],0). 
my_length([_|L],N) :- my_length(L,N1), N is N1 + 1. 

其中應主要統計列表中元素的個數。 這裏的痕跡:

Call:my_length([1, 2, 3], _G4652) 
Call:my_length([2, 3], _G4746) 
Call:my_length([3], _G4746) 
Call:my_length([], _G4746) 
Exit:my_length([], 0) 
Call:_G4748 is 0+1 
Exit:1 is 0+1 
Exit:my_length([3], 1) 
Call:_G4751 is 1+1 
Exit:2 is 1+1 
Exit:my_length([2, 3], 2) 
Call:_G4652 is 2+1 
Exit:3 is 2+1 
Exit:my_length([1, 2, 3], 3) 
Length = 3 

直到這裏Exit:my_length([], 0)Call:_G4748 is 0+1據我所知,Prolog的發現了一個事實,這統一N10N是爲了1添加到該值。

我不明白的是之後的內容。爲什麼Prolog會回到Exit:my_length([3], 1)。具體來說,[3]從哪裏來?我試圖把它描繪成像調用堆棧一樣,但對於如何傳遞這些變量沒有任何意義。

+0

這些變量*已*在堆棧中。 Prolog不會在* exit *上展開堆棧。它在*重做*或*失敗*。 – CapelliC

回答

2

您應該通過將呼叫或重做與退出或失敗配對來讀取跟蹤。在這種情況下

Exit:my_length([3], 1) 

配對與前

Call:my_length([3], _G4746) 

因此,這意味着my_length([3], _G4746)執行綁定變量_G4746爲1

通話中堆棧的新紀錄和失敗彈出。