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 :

Inversion listes et sous-listes


Sujet :

Prolog

  1. #1
    Membre régulier Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut Inversion listes et sous-listes
    Bonjour,
    j'ai vraiment du mal à écrire un prédicat.

    miroir(L,R) réussit si la liste R est l'image inversée à tous les niveaux de la liste L
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ?-miroir([1,4,a,[a,b,[c,d]],z],L) retourne L=[z,[[d,c],b,a],a,4,1]
    j'ai fait un prédicat pour inverser une liste, mais je n'arrive pas à "parcourir en profondeur" pour inverser les sous-listes...

    j'arrive donc à retourner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    L=[z,[a,b,[c,d]],a,4,1]
    Il faudrait pouvoir réappliquer le prédicat inverser à chaque fois qu'on trouve une sous liste....Mais comment faire?

    Merci d'avance

  2. #2
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut
    Il suffit que ton prédicat teste si l'élément courant est une liste ou pas.
    Comment tu fais ton inversion ?
    Wer nicht probiert, verliert !!

  3. #3
    Membre régulier Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par je®ome Voir le message
    Comment tu fais ton inversion ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    reverse(L1,L2):-reverse(L1,[],L2).
    reverse([T1|R1],L,L2):-reverse(R1,[T1|L],L2).
    reverse([],L,L).
    mon problème c'est que je ne sais pas appliquer l'inversion en profondeur, à toutes les sous-listes

  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
    Comme l'a dit je®ome teste le premier élément de la liste avec is_list/1 et si c'est une liste applique lui le prédicat.
    "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 Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Comme l'a dit je®ome teste le premier élément de la liste avec is_list/1 et si c'est une liste applique lui le prédicat.

    Je suis désolé mais j'ai vraiment du mal à écrire ce prédicat..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    miroir([],[]).
    miroir([T|R],[L2|R2]):-is_list(T),!,reverse(T,L2),miroir(R,R2).
    miroir([T|R],L):-miroir(R,L).
    ce miroir inverse seulement les listes de profondeur1...
    Je n'arrive pas à faire une bonne récurrence pour inverser la liste courante puis vérifier qu'elle ne contient pas de sous- listes à inverser...etc

  6. #6
    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
    Tu as pratiquement tout écrit ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    reverse(L1,L2):- reverse(L1,[],L2).
    reverse([T1|R1],L,L2):-
      reverse(R1,[T1|L],L2).
    reverse([],L,L).
    Il ne te manque qu'à inverser l'élément X si c'est une liste.
    Celà commence effectivement pas le test is_list.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    reverse([T1|R1],L,L2):-
      is_list(T1), !,
    Maintenant que dois tu faire ?
    D'abord inverser cet élément, pus l'insérer dans la liste résultat comme si c'était un élement quelconque, c'est tout.
    "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

  7. #7
    Membre régulier Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut
    ok merci bcp..C'est dingue ce que j'ai lutté pour écrire ce prédicat.
    C'est vrai qu'avec le recul ça n'était pas si sorcier...des fois je me complique vraiment la vie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    reverse(L1,L2):-reverse(L1,[],L2).
    reverse([T1|R1],L,L2):-is_list(T1), !,reverse(T1,L3),reverse(R1,[L3|L],L2).
    reverse([T1|R1],L,L2):-reverse(R1,[T1|L],L2).
    reverse([],L,L).
    Merci encore ^^

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

Discussions similaires

  1. Liste et sous Liste
    Par edycyr dans le forum JSF
    Réponses: 0
    Dernier message: 05/07/2010, 15h51
  2. Couleur listes et sous-listes
    Par Perceuse-Killer dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 27/05/2010, 13h59
  3. séparer liste java en une liste des sous liste
    Par maili20 dans le forum Langage
    Réponses: 2
    Dernier message: 21/12/2009, 14h31
  4. Creation d'une liste de sous liste
    Par alcibiade dans le forum Général Python
    Réponses: 16
    Dernier message: 19/12/2009, 12h15
  5. Réponses: 2
    Dernier message: 16/11/2007, 11h44

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