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

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    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 régulier
    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
    Points : 89
    Points
    89
    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
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    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
    Points : 6 498
    Points
    6 498
    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 régulier
    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
    Points : 89
    Points
    89
    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
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

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

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    Je débute en Prolog et j'ai bien compris le système de l'accumulateur mais je ne comprend pas pourquoi ces lignes ne fonctionne pas (cad même code que plus haut mais sans l'accu) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    inverse([],[]).
    inverse([X|Rest],L):-inverse(Rest,[X|L]).
    Merci à qui veux bien éclairer ma lanterne.

  8. #8
    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
    Points : 6 498
    Points
    6 498
    Par défaut
    Si tu travailles avec SWI-Prolog, tu peux utiliser le mode trace :
    1 ?- trace.

    2 ?- inverse([1,2,3,4], L).
    A noter que la méthode avec accumulateur est beaucoup plus efficace que la méthode sans accumulateur car append est très coûteux.
    "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

+ 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