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ébut - Utilisation des listes


Sujet :

Prolog

  1. #1
    Membre éprouvé

    Inscrit en
    Décembre 2009
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 146
    Points : 900
    Points
    900
    Par défaut Début - Utilisation des listes
    Bonjour,

    Je viens de découvrir que le prolog pourrait sans doute m'aider à régler un problème d'ordonnancement que je dois résoudre mais je n'arrive vraiment pas à démarrer.

    J'ai des groupes composés de 1 à 4 personnes.
    Je dois les regrouper en plus gros groupes entre 14 et 16 personnes.

    J'aimerai donc avoir les résultats possibles auxquels je pourrais appliquer d'autres critères par la suite mais si j'arrivais déjà à ce point ce serait pas mal .

    J'ai testé les listes mais je ne vois pas comment additionner le contenu. Avec le module clpfd, mais pas moyen non plus.

    J'avoue que je suis quand même dérouté par la syntaxe et l'approche. Quelqu'un aurait-il un bout de code qui pourrait me mettre sur la voie ?

    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
    Que veux-tu dire par additionner le contenu ?
    append permet de concaténer des listes mais ça tu dois déjà le savoir.
    Sinon, pour additionner le contenu de deux listes de nombres de même longueur, on peut faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     ?- use_module(library(lambda)).
    true.
     
     ?- X = [1,2,3], Y = [4,5,6], maplist(\U^V^T^(T is U+V), X, Y, Z).
    X = [1, 2, 3],
    Y = [4, 5, 6],
    Z = [5, 7, 9].
    Ceci fonctionne avec SWI-Prolog et le module lambda
    Il faudrait plus de détail sur ce que tu veux faire pour qu'on puisse t'aider.
    "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 éprouvé

    Inscrit en
    Décembre 2009
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 146
    Points : 900
    Points
    900
    Par défaut
    Par exemple j'ai des groupes de personnes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    petit_groupes = [5, 2, 3, 3, 4, 2, 2, 3, 4, .............]
    (avec un total de 120 personnes)
    Ou j'ai aussi essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    petit_groupe(1, 5).
    petit_groupe(2, 2).
    Pour retrouver les identifiants des groupes après.

    Je veux faire 8 gros_groupes de 15 personnes à plus ou moins 1 personne.

    Je vais étudier le module lambda merci pour cette piste.

  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
    Le module lambda permet de simuler la programmation fonctionnelle en Prolog, donc ça n'a pas grand chose a voir avec ton problème je pense.
    Si j'ai bien compris ton problème tu veux equilibrer des groupes autour d'une valeur moyenne, donc regrouper les nombres de la liste pour obtenir une liste de listes yant à peu près la même somme.
    As-tu expliquer ton problème dans le forum algo ? Je crois que c'est un problème "connu" !
    "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 éprouvé

    Inscrit en
    Décembre 2009
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 146
    Points : 900
    Points
    900
    Par défaut
    Je vois a peu près comment faire dans un autre langage pour cette partie, mais il y a d'autres contraintes qui vont d'additionner par la suite.

  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
    Salut

    Voilà un petit programme, non optimisé qui crée des groupes de 15 personnes à plus ou moins 1, en partant d'une population de 120 personnes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    :- use_module(library(lambda)).
     
    petit_groupe(1, 5).
    petit_groupe(2, 2).
    petit_groupe(3, 3).
    petit_groupe(4, 4).
    petit_groupe(5, 5).
    petit_groupe(6, 8).
    petit_groupe(7, 2).
    petit_groupe(8, 6).
    petit_groupe(9, 5).
    petit_groupe(10, 6).
    petit_groupe(11, 4).
    petit_groupe(12, 3).
    petit_groupe(13, 5).
    petit_groupe(14, 7).
    petit_groupe(15, 5).
    petit_groupe(16, 4).
    petit_groupe(17, 3).
    petit_groupe(18, 7).
    petit_groupe(19, 3).
    petit_groupe(20, 4).
    petit_groupe(21, 7).
    petit_groupe(22, 5).
    petit_groupe(23, 4).
    petit_groupe(24, 3).
    petit_groupe(25, 7).
    petit_groupe(26, 3).
     
    sylvaner :-
    	numlist(1, 26, NL),
    	cree_sous_liste(15, 8, NL, [], Lst),
    	maplist(affiche_sous_liste, Lst).
     
     
    affiche_sous_liste(L) :-
    	forall(member(X, L), format('~w ', [X])),
    	foldl(\X^Y^Z^(petit_groupe(X, V),
    		      Z is Y+V),
    	      L, 0, TT),
    	format(': ~w ~n', [TT]).
     
    cree_sous_liste(_, 0, [], SL, SL).
    cree_sous_liste(Mid, N, NL, CSL, SL) :-
    	cree_une_liste(Mid, NL, NL1, 0, [], Lst),
    	N1 is N - 1,
    	cree_sous_liste(Mid, N1, NL1, [Lst | CSL], SL).
     
    cree_une_liste(Mid, NL, NL1, CTT, CLst, Lst) :-
    	select(V, NL, NL2),
    	petit_groupe(V, Nb),
    	TT is Nb + CTT,
    	(   (TT >= Mid - 1, TT =< Mid + 1)
    	->  NL1 = NL2,
    	    Lst = [V | CLst]
    	;   TT =< Mid - 1,
    	    cree_une_liste(Mid, NL2, NL1, TT, [V | CLst], Lst)).
    Résultat
    [ ?- sylvaner.
    26 25 23 : 14
    22 21 20 : 16
    24 19 18 17 : 16
    16 15 14 : 16
    13 12 10 : 14
    11 9 8 : 15
    7 6 5 : 15
    4 3 2 1 : 14
    true .
    "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 éprouvé

    Inscrit en
    Décembre 2009
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 146
    Points : 900
    Points
    900
    Par défaut
    Super merci, maintenant j'ai plus qu'à étudier tout ça

Discussions similaires

  1. [Débutant] Utiliser des listes en argument d'une fonction
    Par erkenbrand dans le forum Windows Forms
    Réponses: 10
    Dernier message: 29/05/2008, 12h56
  2. Utilisation des listes
    Par Pithonnette dans le forum Tkinter
    Réponses: 3
    Dernier message: 26/02/2008, 19h01
  3. [X] Utilisation des listes de parametres dans les commandes
    Par axel-erator dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 29/06/2007, 12h00
  4. Utilisation des liste liées (ajax) avec du perl
    Par Jim_Nastiq dans le forum Web
    Réponses: 1
    Dernier message: 12/07/2006, 12h07
  5. Utilisation des liste à choix multiples
    Par mic79 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 04/07/2005, 11h40

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