pbm pour inverser une liste en prolog - Divers - Programmation
Marsh Posté le 20-08-2006 à 00:47:18
weblook$$ a écrit : Bonjour , |
Voilà une méthode possible sans accumulateur :
Code :
|
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.
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..?
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
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