Como apagar o último elemento de uma lista no Prolog?
Eu estou na seguinte situação: Eu tenho uma lista e gostaria de excluir apenas o último elemento.
Eu implementei a seguinte regra (que não funciona bem):
deleteLastElement([Only],WithoutLast) :-
!,
delete([Only],Only,WithoutLast).
deleteLastElement([_|Tail],WithoutLast) :-
!,
deleteLastElement(Tail,WithoutLast).
O problema é que quando eu chamo, todo o elemento da lista é deletado, na verdade, se eu executar a seguinte declaração eu obtenho:
[debug] ?- deleteLastElement([a,b,c], List).
List = [].
Olhando para o traço, acho que está claro a causa deste problema:
[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 = [].
Quando o caso base é alcançado, oSem passado lista é unificada com olista vazia [] e quando o retrocesso é realizadoSem passado ainda permanece a lista vazia.
Isto não é bom.
Eu estava pensando em implementá-lo fazendo a seguinte operação:
Conte o número de elemento na lista antes de chamar o predicado que exclua o último elemento.Iterar por recursão e decrementar o valor do número de elemento de cada vezSe é verdade que o número do elemento é 0 significa que este é o último elemento, então eu apago-o da lista originalMas isso não me parece claro nem tão bom, gostaria de saber se existe uma boa solução declarativa para esse problema.