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 :

suprimmer les liste vides d'une liste de liste


Sujet :

Prolog

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Points : 14
    Points
    14
    Par défaut suprimmer les liste vides d'une liste de liste
    bonjour,
    comme le précise l'intitulé j'ai soucis avec des listes de listes car elle peuvent contenir de elements vides, ce qui n'est pas acceptable.
    ma liste est remplie par des findall donc je suis pas maitre de son remplissage.

    aussi je souhaiterais savoir si quelqu'un a une idée, ou un code deja fait ce serais le mieux, pour effectuer cette tache.

    Accesoirement je souhaiterais aussi savoir s'il existe un moyen de faire un prédicat qui me permettrais de prendre un élément de cette liste, genre queue à priorité, qui analyserais un sous-élément des éléments (des listes) de ma liste "purifiée".

    Merci d'avance.

  2. #2
    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
    Dans le test du findall, on peut ajouter la condition d'une liste on vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    test :-
    	L= [a, [], [b, c], [d, f], g, []],
    	writeln(L),
     
    	findall(SL, (member(SL, L), SL \= []), T),
    	writeln(T).
    Avec pour sortie
    ?- test.
    [a,[],[b,c],[d,f],g,[]]
    [a,[b,c],[d,f],g]
    Sinon, SWI-Prolog ayant des prédicats prédéfinis de gestion de liste, on peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    t1 :-
    	L= [a, [], [b, c], [d, f], g, []],
    	writeln(L),
    	exclude(=([]), L, L1),
    	writeln(L1).
    avec les mêmes sorties.

    Pour le reste, un exemple avec ce qui est désiré serait utilie pour répondre, on peut toujours tout faire.
    "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

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    Tas solution du exlude correspond mieux a ce dont j'ai besoin, et fonctionne parfaitement.

    pour la suppression des doublons, ma structure de donnée est celle ci :
    [Nom,Xi,Xf,V,L]
    chaque element est de cette forme, or il peut y en avoir plusieurs qui partage le Xf (la destination de la ction, car c'est un plan).
    j'ai donc une liste d'elements comme ceux-ci mais ma fonction de suppression des doublon bloque complètement le déroulement de ma "fonction" principale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    retirer_doublon(L1,L3):- retirer_doublon(L1,[],L2),rev(L2,L3).
    retirer_doublon([],S,S).
    retirer_doublon([[_,_,C,_,_]|U],S,R):- member([_,_,C,_,_],U),
    rev inverse la liste.

    c'est comme si cela retournait un false et arretais le déroulement, car le prédicat serait devenu faux.

    une variante qui m'aiderais serait de supprimer tous les elements qui partage le meme Xf avec des elements d'une autre liste.
    on teste l'OpenList pour qu'elle ne contienne pas de doublon, ni en son sein ni avec la CloseList.

    Cordialement.

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retirer_doublon([[_,_,C,_,_]|U],S,R):- member([_,_,C,_,_],U),
    est incomplet, je ne peux pas repondre, mais je peux supposer que tu veux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    retirer_doublon([[_,_,C,_,_]|U],S,R):- 
          member([_,_,C,_,_],U),
          !,
          retirer_doublons(U, S, R).
     
    retirer_doublon([H | T],S,R):- 
          retirer_doublons(T, [H | S], R).
    "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 à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    je viens de tester ton code.
    il fonctionne bien. il retire en effet les doublons en suivant ma structure de données.
    Le problème est que si il vient à retirer un doublon, il termine ses boucles par un false, alors que si il n'en retire pas il termine simplement par la variable de retour, sans false.
    dans le cas ou il ne retire rien ça ne pose pas de problème dans l’exécution du prédicat père, mais si il y en retire un et , bien qu'il retourne une liste nettoyé, qu'il y a un false, tout s'arrête; et la c'est très problématique.

    peut on éviter cela?

    EDIT : cela fonctionne, j'avais juste pas changé le code, erreur de manipulation.
    merci bien.

Discussions similaires

  1. Eliminer les lignes vides d'une liste
    Par jncoffy dans le forum Excel
    Réponses: 5
    Dernier message: 29/11/2011, 22h57
  2. Réponses: 4
    Dernier message: 19/06/2011, 00h31
  3. Réponses: 9
    Dernier message: 04/04/2007, 13h01
  4. zone vide dans une zone de liste
    Par julio02200 dans le forum Access
    Réponses: 9
    Dernier message: 30/05/2006, 09h57
  5. Réponses: 5
    Dernier message: 19/05/2006, 17h11

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