pbm pour inverser une liste en prolog

pbm pour inverser une liste en prolog - Divers - Programmation

Marsh Posté le 18-08-2006 à 18:20:21    

Bonjour ,
 
my_rev([],_).
my_rev([X|Xs],Acc) :- my_rev(Xs,[X|Acc]).
 
Quand j'éxécute ce programme , j'obtiens yes mais je ne peux pas consulter le contenu de Acc, qui théoriquement contient la liste X inversé.
 
Par contre quand j'éxécute le code suivant :
 
my_reverse(L1,L2) :- my_rev(L1,L2,[]).
my_rev([],L2,L2):-!.
my_rev([X|Xs],L2,Acc) :- my_rev(Xs,L2,[X|Acc]).
 
je peux consulter L2 mais , la réponse à ce programme est No.
 
 
je suis perdu, besoin d'aide, merci

Reply

Marsh Posté le 18-08-2006 à 18:20:21   

Reply

Marsh Posté le 20-08-2006 à 00:47:18    

weblook$$ a écrit :

Bonjour ,
 
my_rev([],_).
my_rev([X|Xs],Acc) :- my_rev(Xs,[X|Acc]).
 
Quand j'éxécute ce programme , j'obtiens yes mais je ne peux pas consulter le contenu de Acc, qui théoriquement contient la liste X inversé.
 
Par contre quand j'éxécute le code suivant :
 
my_reverse(L1,L2) :- my_rev(L1,L2,[]).
my_rev([],L2,L2):-!.
my_rev([X|Xs],L2,Acc) :- my_rev(Xs,L2,[X|Acc]).
 
je peux consulter L2 mais , la réponse à ce programme est No.
 
 
je suis perdu, besoin d'aide, merci


Voilà une méthode possible sans accumulateur :

Code :
  1. % l'inverse d'une liste vide est une liste vide
  2. my_rev([],[]).
  3. % pour inverser une liste, je mets le premier élémement de la liste
  4. % à la fin du reste de la liste inversée
  5. my_rev([X|Xs],Acc) :-
  6.     my_rev(Xs,Acc1),
  7.     append(Acc1, [X], Acc).


Si tu es sous SWI-Prolog, je te conseille de tracer ton premier programme ((tu tapes trace. sous le prompt) et de regarder ce qui se passe lorsque tu tapes my_rev([1,2,3], X)., tu comprendras ton erreur.
Tes clauses ne sont pas constructives.
 

Reply

Marsh Posté le 20-08-2006 à 16:07:48    

très sympa comme outil ce trace, mais quel est la signification de ces codes eg: _G495, _L191 etc..?

Reply

Marsh Posté le 20-08-2006 à 16:58:57    

_G495 signifie qu'une variable (X par exemple) n'a pas encore été unifiée et donc qu'elle est repérée pour l'instant que par cette référence.
_G pour varaible Globale, _L pour varaible locale au traitement, (tout au moins c'est que j'en déduis de cet exemple :
[trace] 1 ?- my_rev([1,2,3], X).
   Call: (7) my_rev([1, 2, 3], _G487) ? creep
   Call: (8) my_rev([2, 3], _L171) ? creep
   Call: (9) my_rev([3], _L191) ? creep
   Call: (10) my_rev([], _L211) ? creep
   Exit: (10) my_rev([], []) ? creep
   Call: (10) append([], [3], _L191) ? creep
   Exit: (10) append([], [3], [3]) ? creep
   Exit: (9) my_rev([3], [3]) ? creep
   Call: (9) append([3], [2], _L171) ? creep
   Exit: (9) append([3], [2], [3, 2]) ? creep
   Exit: (8) my_rev([2, 3], [3, 2]) ? creep
   Call: (8) append([3, 2], [1], _G487) ? creep
   Exit: (8) append([3, 2], [1], [3, 2, 1]) ? creep
   Exit: (7) my_rev([1, 2, 3], [3, 2, 1]) ? creep
 
X = [3, 2, 1]  
 
Yes

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed