2016-03-03 117 views
1

我對這個Prolog的合作,以刪除元素的所有出現在列表中,嵌套列表包括在內。然而,不是刪除元素,而是用空的列表替換它。嵌套列表項刪除在序言

這裏是我的代碼:

del(Item, [Head|Tail], [HeadResult|TailResult]) :- 
    del(Item, Head, HeadResult), 
    del(Item,Tail,TailResult), 
    !. 
del(Item,[], []). 
del(Item, Item, []). 
del(Item, Head, Head). 

我相信行del(Item,[], []).是罪魁禍首。但是我不確定如何更改,以便它不會出現在我的新列表中。想要輸出的

例子:

remberD(a, [a,b,c,[a,b]], New). 

New = [b,c,[b]]. 
+0

這個問題也問[這裏](http://stackoverflow.com/questions/35757202/deleting-all-occurrences-of-element-in-a-nested-list-in-prolog)。您可能想閱讀一些評論。 – lurker

+0

嘗試邏輯思考。如果'德爾(X,Y,Z)'是其中元件'X'從列表'Y'得到結果'Z',那麼顯然'德爾(項目,項,[])的列表中去除一個謂詞。'沒有按沒有意義,因爲第二個參數不應與被刪除的項目相同。也許你的意思是,'德爾(項目[項目],[])。'和'德爾(項目負責人,負責人)'說如果我從任何列表中刪除'Item',我得到了相同的列表回來。這似乎也不合邏輯。 – lurker

回答

1

您正在嘗試與

如果結構遞歸
del(Item, [Head|Tail], [HeadResult|TailResult]) :- % wrong 
    del(Item, Head, HeadResult), 
    del(Item, Tail, TailResult). 

似乎不錯,只是,?結果應該只是TailResult在這種情況下,不應該有任何HeadResult存在一樣:

del(Item, [Item|Tail], TailResult):- 
    del(Item, Tail, TailResult). 

現在,如果它不是一個Item在輸入列表中的頭呢?兩起案件 - 無論它是一個單,我們需要去裏面,或者它不是一個名單,我們只是保持它,因爲它是:

del(Item, [Head|Tail], [HeadResult|TailResult]) :- 
    Head \= Item, Head = [_|_], 
    del(Item, Head, HeadResult), 
    del(Item, Tail, TailResult). 

del(Item, [Head|Tail], [Head|TailResult]) :- 
    Head \= Item, Head \= [_|_], 
    del(Item, Tail, TailResult). 

唯一的另一種情況是試圖從一個空的列表中刪除的內容:

del(_, [], []). 

這是假設你總是調用這個謂詞完全實例化條款。

+0

謝謝你,你真的幫我抓住了我的錯誤! – BigPapa