2010-03-28 30 views
4

可以說我想通過逐個添加另一個列表(L)的元素來構造一個列表(L2)。結果應該與輸入完全相同。 這個任務很愚蠢,但它會幫助我理解如何通過列表進行遞歸併移除某些元素。通過在序言中使用遞歸

create([1,2,3,4], L2) 

回報

L2 = [1|create([2,3,4], **)\. 

這不是一個理想的結果

create(L, L2) :- (\+ (L == []) -> L=[H|T], append([H], create(T, L2), L2);[]). 

稱之爲:

我已經把下面的代碼。

回答

3

你說你想知道prolog是如何工作的,所以我不會給你一個完整的解決方案,而是一個提示。

prolog中的函數不返回值,它們只是創建綁定。

當你說

append([H], create(T, L2), L2);[]). 

你試圖使用一個返回值。

嘗試追加在遞歸調用中使用的創建綁定。

+0

謝謝你的迴應。我拿出這一行: remove1(L,L2): - 顯示(L2),(\ +(L == []) - > L = [H | T],追加(L2,H,L2) ,remove1(T,L2); [])。 但是,我得到錯誤:_G256 錯誤:超出全局堆棧 這是爲什麼? – screenshot345 2010-03-30 20:33:04

+0

我必須承認,我更熟悉更傳統的prolog語法,其中每個謂詞爲每個參數結構聲明一次。我可以這樣說,當你遇到堆棧錯誤時,這意味着你的遞歸沒有終止。這是因爲你的終止標準是錯誤的,或者你的程序的其餘部分沒有按照你認爲應該的方式來減少參數。在這種情況下,我懷疑後者,並建議你仔細觀察後綴,因爲在我看來,你可能不希望雙方都有L2。 – charlieb 2010-03-31 12:31:50