Comment faire pour supprimer le dernier élément d'une liste dans le Prologue?

Je suis dans la situation suivante: j'ai une liste et je voudrais en supprimer uniquement le dernier élément.

J'ai appliquer la règle suivante (qui ne fonctionnent pas bien):

deleteLastElement([Only],WithoutLast) :-
    !,
    delete([Only],Only,WithoutLast).
deleteLastElement([_|Tail],WithoutLast) :-
    !,
    deleteLastElement(Tail,WithoutLast).

Le problème est que lorsque je l'appelle, tous les éléments de la liste sont supprimés, en fait, si j'ai exécutez l'instruction suivante-je obtenir:

[debug]  ?- deleteLastElement([a,b,c], List).
List = [].

À la recherche à la trace je pense que c'est clairement la cause de ce problème:

[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 = [].

Lorsque le cas de base est atteint, le WithoutLast liste est unifié avec le liste vide [] et lors de la mandature est effectuée la WithoutLast toujours de la liste vide.

Ce n'est pas bon.

Je pensais à le mettre en œuvre en faisant l'opération suivante:

  1. De compter le nombre d'élément dans la liste avant d'appeler la fonction qui supprime le dernier élément.
  2. Itérer par récurrence et de décrémenter la valeur du nombre d'élément à chaque fois
  3. S'il est vrai que le nombre d'élément est 0, cela signifie que c'est le dernier élément, donc je l'ai supprimer de la liste originale

Mais cela ne me paraît pas clair, et ne pas bon, je voudrais savoir si il existe un déclarative bonne solution pour ce problème.

InformationsquelleAutor AndreaNobili | 2013-04-23