我是以下情况:我有一个列表,想要从中仅删除最后一个元素。
我已经实现了以下规则(但并不起作用):
问题在于当我调用它时,列表中的所有元素都被删除了。实际上,如果我执行以下语句,我会得到:
当到达基本情况时,WithoutLast 列表与 空列表 [] 统一在一起,当进行回溯时,WithoutLast 仍然保持为空列表。
这不太好。
我想实现以下操作:
1. 在调用删除最后一个元素的谓词之前计算列表中元素的数量。 2. 通过递归迭代并每次减少元素数量的值。 3. 如果元素数量为0,则意味着这是最后一个元素,因此将其从原始列表中删除。
但是这对我来说似乎不清晰,也不太好。我想知道是否有一个声明性良好的解决方案来解决这个问题。
我已经实现了以下规则(但并不起作用):
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 仍然保持为空列表。
这不太好。
我想实现以下操作:
1. 在调用删除最后一个元素的谓词之前计算列表中元素的数量。 2. 通过递归迭代并每次减少元素数量的值。 3. 如果元素数量为0,则意味着这是最后一个元素,因此将其从原始列表中删除。
但是这对我来说似乎不清晰,也不太好。我想知道是否有一个声明性良好的解决方案来解决这个问题。