我在下面的情况:我有一个名单,我就从它只有最后一个元素删除。如何从序言中删除列表中的最后一个元素?
我有实现以下规则(不很好地工作):
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