2011-11-16 66 views
2

我在Prolog中有此程序,它從列表中刪除每個第n個元素的元素,如: removenth([1,2,3,4,5,6],2,R)。 它應該返回:R = [1,3,5]。Prolog不返回問值

我有這樣的:

removeallNth(F, N, R):- removeallNth(F, N, 1, R). 
removeallNth([], _, _, R). 
removeallNth([H|T], N, C, R):- N \== C, Nc is C + 1, concat(R,H,S), 
removeallNth(T, N, Nc, S). 
removeallNth([_|T], N, C, R):- N == C, removeallNth(T, N, 1, R). 

的問題是,它返回真代替 R = [1,3,5]。我檢查了SWI-Prolog調試器,它到達了正確的結果,但它保持檢查的東西。我知道這與統一有關,但我不知道如何應用它。

回答

4

考慮這個修改程序:

removeallNth(F, N, R):- removeallNth(F, N, 1, R). 

removeallNth([], _, _, []). 
removeallNth([H|T], N, C, [H|R]):- 
    N \== C, Nc is C + 1, 
    removeallNth(T, N, Nc, R). 
removeallNth([_|T], N, C, R):- 
    N == C, 
    removeallNth(T, N, 1, R). 

在removeallNth/4的第一句話,你必須返回一個空列表。

在removeallNth/4的第二個子句中,您不需要執行concat,只需要返回在該子句頭部的第4個參數中返回的列表中添加該項目。

+0

這是工作,謝謝!我需要充分理解Prolog中的遞歸。它如何從調用堆棧的結尾到開始構造所需的結果。我試圖通過concat在每次迭代中創建結果列表。 – Pravel