我在下面的情況:我有一個名單,我就從它只有最後一個元素刪除。如何從序言中刪除列表中的最後一個元素?
我有實現以下規則(不很好地工作):
deleteLastElement([Only],WithoutLast) :-
!,
delete([Only],Only,WithoutLast).
deleteLastElement([_|Tail],WithoutLast) :-
!,
deleteLastElement(Tail,WithoutLast).
的問題是,當我把它稱爲,列表中的所有元素都將被刪除,其實如果我執行下面的語句我獲得:
[debug] ?- deleteLastElement([a,b,c], List).
List = [].
在跟蹤尋找我認爲這是明確這個問題的原因:
[trace] ?- deleteLastElement([a,b], List).
Call: (7) deleteLastElement([a, b], _G396) ? creep
Call: (8) deleteLastElement([b], _G396) ? creep
Call: (9) lists:delete([b], b, _G396) ? creep
Exit: (9) lists:delete([b], b, []) ? creep
Exit: (8) deleteLastElement([b], []) ? creep
Exit: (7) deleteLastElement([a, b], []) ? creep
List = [].
當達到基本情況時,WithoutLast列表與空列表 []統一,並且在執行回溯時,WithoutLast仍保留爲空列表。
這是不好的。
我想實現它執行以下操作:
- 計算列表元素的數量調用刪除最後一個元素的謂詞之前。
- 迭代通過遞歸每一次
- 如果這是真的,元素的數量爲0則表示,這是最後一個元素,所以我從原來的名單
但這似乎對我不太清楚,並沒有那麼好,我想知道是否有此問題的聲明很好的解決方案。
+1 for'append(WithoutLast,[_],List)'trick。 – 2013-04-23 17:07:23