-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的發現了一個事實,這統一N1
與0
和N
是爲了1添加到該值。
我不明白的是之後的內容。爲什麼Prolog會回到Exit:my_length([3], 1)
。具體來說,[3]
從哪裏來?我試圖把它描繪成像調用堆棧一樣,但對於如何傳遞這些變量沒有任何意義。
這些變量*已*在堆棧中。 Prolog不會在* exit *上展開堆棧。它在*重做*或*失敗*。 – CapelliC