2012-08-28 67 views
2

我寫了下面的Prolog代碼:「走出本地堆棧的」扭轉名單

concatenate([X|L1], L2, [X|L3]) :- concatenate(L1, L2, L3). 
concatenate([], L, L). 

rev([X|L], Y) :- concatenate(Z, [X], Y), rev(L, Z). 
rev([], []). 

如果我做了一些疑問,如:

?- rev([1,2,3], [3,2,1]). -> true 
?- rev([1,2,3], [ X, Y, Z]). -> X=3, Y=2, Z=1 

這是確定的,但如果我這樣做:

?- rev([1, 2, 3], X). 

我得到:

ERROR: Out of local stack 

我確定我可以在網上找到reverse function的正確實現,但是我想知道是什麼導致了這個錯誤。

+1

不是一個解決辦法,但你可以嘗試在每個步驟中的印刷值調試問題。 – nhahtdh

回答

4

concatenate(L1, L2, L3).打電話 L1和L3沒有實例化,然後永遠循環。您可以使用調試器看到這種現象:剛

?- gtrace,rev([1,2,3],X). 

然後請求內連接一個步驟(按空格鍵)。在左上角的框架(綁定)中,您會看到實例化的變量:只有L2獲得一個值。

1

相反的:

rev([X|L], Y) :- concatenate(Z, [X], Y), rev(L, Z). 

嘗試:

rev([X|L], Y) :- rev(L, Z), concatenate(Z, [X], Y).