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 :

Permutation d'une liste


Sujet :

Prolog

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 128
    Points : 101
    Points
    101
    Par défaut Permutation d'une liste
    Bonjour,

    Je veux développer en Prolog un prédicat qui me permet d'obtenir toutes les permutations d'une liste. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ?- permut([a,b,c],X).
    X=[a,b,c]
    X=[a,c,b]
    X=[b,a,c]
    X=[b,c,a]
    X=[c,b,a]
    X=[c,a,b]
    Ce prédicat ne doit pas être difficile à écrire mais je ne vois pas trop comment faire (je débute en prolog). J'ai pensé dans un premier temps à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /* Le prédicat enlever permet d'enlever un élément d'une liste */
    enlever(x,[x|Q],Q).
    enlever(x,[y|Q],[y|Q1]):-enlever(x,Q,Q1).
    /* Le prédicat permut permet de faire l'opération de permutation */
    permut([],[]).
    permut(L,[x|Q1]):-enlever(x,L,Q),permut(Q,Q1).
    Mais ca n'a vraiment pas l'air de marcher même le prédicat enlever seul ne marche pas! Au fait, j'utilise SWI Prolog.

    Si quelqu'un pouvait me donner un petit coup de pouce, ca serait gentil.

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Tu es vraiment très bien parti !

    Si ton prédicat enlever/3 ne marche pas, c'est parce que tu as écrit x et y en minuscules (dans ce cas il s'agit d'atomes). Il faut les écrire en majuscules (dans ce cas il s'agit de variables).

    Pour info, les prédicats que tu essayes d'écrire existent en SWI et s'appellent select/3 et permutation/2.
    J'imagine que ton but est de réécrire ces prédicats à titre d'exercice, ce qui est une très bonne chose quand on débute. Plus tard, tu utiliseras les prédicats déjà implémentés dans SWI.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 128
    Points : 101
    Points
    101
    Par défaut
    Merci beaucoup pour ta réponse

    C'est très encourageant. En effet, je dois récrire ces prédicats à titre d'exercice. Je me trouve un peu bete par rapport à l'erreur que j'ai faite pour le prédicat enlever

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 128
    Points : 101
    Points
    101
    Par défaut
    Voila, c'est bon tout fonctionne maintenant. J'ajoute la correction au cas où cela serve à quelqu'un un jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    enlever(X,[X|Q],Q).
    enlever(X,[Y|Q],[Y|Q1]):-enlever(X,Q,Q1).
     
    permut([],[]).
    permut(L,[X|Q1]):-enlever(X,L,Q),permut(Q,Q1).
    Une version équivalent aurait été de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    inserer(X,L,L2):-enlever(X,L2,L).
     
    permut([],[]).
    permut([X|L],P):-permut(L,L1), inserer(X,L1,P).

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Je me permets de relever ce topic vieux d'un an mais qui m'a bien servi
    et avec mes méninges, nous sommes arrivés à ça.
    J'avais besoin d'une amélioration au prédicat de permutation "classique": il fallait en plus que je puisse choisir le nombre d'éléments de la permutation.
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    | ?- permutations(2,[A,B,C],L).
     
    L = [A,B] ? ;
     
    L = [A,C] ? ;
     
    L = [B,C] ? ;
    Pour ceux que ça intéresse, je mets le code correspondant que j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    permutations(0,_,[]).
    permutations(N,[X|T],[X|Comb]):-
    N>0,
    N1 is N-1,
    permutations(N1,T,Comb).
    permutations(N,[_|T],Comb):-
    N>0,
    permutations(N,T,Comb).

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

Discussions similaires

  1. [AC-2010] Fonctionnalité pour permuter d'une zone de liste à l'autre
    Par patgag78 dans le forum Access
    Réponses: 2
    Dernier message: 22/10/2013, 17h39
  2. Procéder toutes les permutations possibles d'une liste
    Par supergrey dans le forum Mathématiques
    Réponses: 3
    Dernier message: 21/10/2011, 15h08
  3. Réponses: 4
    Dernier message: 24/04/2003, 22h28
  4. Générer une liste
    Par pfredin dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/04/2003, 15h30
  5. tri d'une liste
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 09/01/2003, 18h08

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