IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Prolog Discussion :

[Débutant] Inverser une liste


Sujet :

Prolog

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut [Débutant] Inverser une liste
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    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ée.

    Par contre, quand j'éxécute le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    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.

    Need help , merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Nom
    Inscrit en
    Juin 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Nom

    Informations forums :
    Inscription : Juin 2006
    Messages : 90
    Par défaut
    En Prolog, tu as besoin d'une variable qui contiendra le résultat. L'accumulateur n'est en fait qu'une variable intermédiaire qui aide à inverser la liste.
    Pour inverser une liste, voilà comment il faut procéder:

    L'accumulateur en fin de traitement SERA le résultat recherché.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    rev(L1, L2):-
    	rev(L1, [], L2).
     
    rev([], Acc,Acc).
    rev([X|Rest], Acc,Result):-
    	rev(Rest, [X|Acc], Result).

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    fichtre je me demande bien comment ce langage de satan fonctionne, l'acc avant de faire la recopie dans Result, contient bien la liste inversée pourtant...

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    On peut travailler sans accumulateur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    % l'inverse d'une liste vide est une liste vide
    my_rev([],[]). 
     
    % pour inverser une liste, je mets le premier élémement de la liste
    % à la fin du reste de la liste inversé
    my_rev([X|Xs],Acc) :- 
        my_rev(Xs,Acc1), 
        append(Acc1, [X], Acc).
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Membre confirmé
    Homme Profil pro
    Nom
    Inscrit en
    Juin 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Nom

    Informations forums :
    Inscription : Juin 2006
    Messages : 90
    Par défaut
    Oui Guillaume07, Acc contient bien le résulat pendant la construction.
    Cette construction est construite par empilement. mais après il y a dépilement de la variable Acc. C'est pourquoi qu'uen fois que l'on a le résultat, on l'unifie avec une variable juste avant le dépilement.

    Je ne sais pas si c'est clair, mais si tu comprends çà, tu comprendras TOUT en prolog.

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    Si c'est très clair, merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Inverser une liste chaînée
    Par fearyourself dans le forum Télécharger
    Réponses: 0
    Dernier message: 30/11/2010, 16h41
  2. Inverser une liste
    Par m@tix dans le forum Ada
    Réponses: 6
    Dernier message: 02/06/2009, 19h43
  3. Inverser une liste
    Par Pika-73 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 20/05/2008, 21h05
  4. Inverser une liste
    Par ulysse031 dans le forum Langage
    Réponses: 6
    Dernier message: 16/04/2007, 00h36
  5. inverser une liste chainee
    Par aimad41 dans le forum C
    Réponses: 5
    Dernier message: 08/01/2007, 23h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo