Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > Prolog
Prolog Forum d'entraide sur la programmation en langage Prolog. Avant de poster : Cours Prolog
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 15/09/2012, 09h18   #1
eternal_winds
Invité de passage
 
Inscription : janvier 2011
Messages : 25
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 25
Points : 2
Points : 2
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.
eternal_winds est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2012, 10h45   #2
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 443
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 443
Points : 5 310
Points : 5 310
Dans le test du findall, on peut ajouter la condition d'une liste on vide :
Code :
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
Citation:
?- 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 :
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 : Intérieur avec jeune femme de Vilhelm Hammershoi
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2012, 23h19   #3
eternal_winds
Invité de passage
 
Inscription : janvier 2011
Messages : 25
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 25
Points : 2
Points : 2
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 :
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.
eternal_winds est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2012, 23h36   #4
Trap D
Rédacteur/Modérateur
 
Avatar de Trap D
 
Inscription : septembre 2003
Messages : 4 443
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 4 443
Points : 5 310
Points : 5 310
Code :
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 :
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 : Intérieur avec jeune femme de Vilhelm Hammershoi
Trap D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2012, 00h46   #5
eternal_winds
Invité de passage
 
Inscription : janvier 2011
Messages : 25
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 25
Points : 2
Points : 2
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.
eternal_winds est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h28.


 
 
 
 
Partenaires

Hébergement Web