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 :

Un solveur de logigram en Prolog


Sujet :

Prolog

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Octobre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 54
    Par défaut Un solveur de logigram en Prolog
    bonjour à tous, alors mon projet est décrit dans le titre. Bon c'est très interessant et ça commence même à marcher mais j'ai un petit problème : en fait pour l'instant je travail sur un logigram facile avec comme conditions
    Fernand est plus âgé que Luc.
    Celui qui joue au jeu C a juste 7 ans.
    Paul qui n'est pas le plus jeune joue au jeu A.

    simple 3 personnes, 3 jeux et 3 âges.
    mon problème vient de la première condition que je n'arrive pas à représenter, du coup prolog me renvoit 2 solutions alors qu'il n'y en a qu'une ...

    voilà mon code :
    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
    app(X, [X | _]).
    app(X, [_ | L]) :- app(X, L).
     
    ret(X, [X|L], L).
    ret(X, [Y|L], [Y| R]) :- ret(X, L, R).
     
    assoc(U, V, U, V). % en fait la seconde clause est inutile
    assoc(X, Y, U, V) :- X \== U, Y \== V.
     
    sup(X, Y) :- X > Y.
     
    superieur(X,Y,[ass(I, A, J) | LR]) :- X == fernand, I == luc, Y > A.
    superieur(X,Y,[ass(I, A, J) | LR]) :- X == luc, I == fernand, Y < A.
    superieur(X,Y,[ass(I, A, J) | LR]) :- superieur(X,Y,LR).
     
    imp(U, V, U, V) :- !, fail.
    imp(_, _, _, _).
    %Autre solution assoc(X, Y, A, B) :- (X == A, Y == B); (X \== A, Y \== B).
    %imp(X, Y, A, B) :- X \== A ; Y \== B.
     
     
    donnees([ass(luc, _, _),ass(paul, _, jeuA),  ass(fernand, _, _)]).
    jeu(D) :- donnees(D), assigner(D, [5, 7, 9], [jeuA, jeuB, jeuC]).
    assigner([], _, _).
    assigner([ass(I, A, J) | LR], LA, LJ) :- app(A, LA), 
                                                       app(J, LJ),
                                                       assoc(J, A, jeuC, 7),	
                                                       imp(I, A, paul, 5),
                                                       imp(I, A, luc, 9),
                                                       ret(A, LA, LAR),
                                                       ret(J, LJ, LJR), 
                                                       assigner(LR, LAR, LJR).

    j'ai crée le prédicat supérieur mais il ne marche pas

    Merki d'avance pour toute aide

  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
    "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 confirmé
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Octobre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 54
    Par défaut
    Oui j'avais déjà vu, mais en fait ce que je remarque c'est qu'il est difficile de créer un algo générique, mon problème vient juste de la notion d'ordre, je ne vois pas le moyen de représenter le fait que fernand est plus age que luc, dans la page que tu m'a envoye on a une notion de voisinage facilement traduite, mais c'est peut etre la facon dont j'ai represente mes donnees qui n'est pas bonne, je vais continuer à reflechir en esperant que quelqu'un ait une bonne idee

  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
    Par défaut
    Tu as tout à fait raison, c'est une question de formalisation :
    J'ai formalisé en définissant une base de données pour les ages
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    age(5).
    age(7).
    age(9).
    Je définis une triplé personne(Nom, Age, Jeu) et j'ai comme obligation lorsque j'utilise le triplé personne d'avoir age(Age).
    Par exemple lorsque tu dis que "Fernand est plus âgé que Luc." tu peux traduire celà par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    % j'utilise le triplé fernand (on n'a pas besoin de la variable JeuF
    personne(fernand, AgeF, _JeuF),
    % idem pour le triplé luc
    personne(luc, AgeL, _JeuL),
    % les ages sont des éléments de la base de données "age"
    age(AgeF),
    age(AgeL),
    % L'age de luc est inférieur à l'âge de fernand
    AgeL < AgeF.
    "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 confirmé
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Octobre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 54
    Par défaut
    Ben merki de ton aide je vais essayer cela et je te dis si ca marche

  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
    Par défaut
    Ça doit marcher puisque j'ai réussi à résoudre ton problème comme ça
    "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
    Nouveau membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Décembre 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2021
    Messages : 5
    Par défaut Solution simple
    Citation Envoyé par Samildanach Voir le message
    bonjour à tous, alors mon projet est décrit dans le titre. Bon c'est très interessant et ça commence même à marcher mais j'ai un petit problème : en fait pour l'instant je travail sur un logigram facile avec comme conditions
    Fernand est plus âgé que Luc.
    Celui qui joue au jeu C a juste 7 ans.
    Paul qui n'est pas le plus jeune joue au jeu A.

    simple 3 personnes, 3 jeux et 3 âges.
    Voici une solution, qui me semble plus claire et plus simple.
    J'ai souhaité la réaliser sans utiliser de listes, ni de prédicats Prolog prédéfinis.
    Ce ne fut pas si simple à coder, la règle Celui qui joue au jeu C a juste 7 ans m'a posé quelques problèmes et j'ai dû revoir la règle resoudre/3 et ajouter le prédicat joue/3.

    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
     
    %! Domaine des âges
    age(5).
    age(7).
    age(9).
     
    %! Domaine des jeux
    jeu(jeuA).
    jeu(jeuB).
    jeu(jeuC).
     
    % Celui qui joue au jeu C a juste 7 ans.
    joue((jeuC, 7), _, _).
    joue(_, (jeuC, 7), _).
    joue(_, _, (jeuC, 7)).
     
    % le prédicat different est vrai seulement si ses 3 paramètres sont différents :
    different(X,Y,Z) :- X \== Y, X \== Z, Y \== Z.
     
    resoudre((fernand, AF, JF), (luc, AL, JL), (paul, AP, JP)) :-
      age(AF), age(AL), age(AP),
      %! Paul qui n'est pas le plus jeune joue au jeu A.
      AP > 5, jeuA = JP,
      %! Fernand est plus âgé que Luc
      AF > AL,
      %! Tous les âges sont différents
      different(AF, AL, AP),
      jeu(JF), jeu(JL),
      %! Tous les jeux sont différents
      different(JF, JL, JP),
      %! L'une des paires (jeu, âge) est (jeuC, 7).
      joue((JF,AF), (JL,AL), (JP,AP)).
     
    %! Et la recherche de solutions
    ?- resoudre(A,B,C).
    A =  (fernand, 7, jeuC),
    B =  (luc, 5, jeuB),
    C =  (paul, 9, jeuA) ;
    false.
     
    %! La solution est unique.

  8. #8
    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
    Par défaut
    Le P.O. attendait ta solution avec impatience !
    "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

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Décembre 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2021
    Messages : 5
    Par défaut
    "Vieux motard, que j'aimais !"

    Je le vois bien avec une grande toile d'araignée sur son clavier.

    En plus j'ai pourri le TP du prof de Prolog, mais il est peut-être en retraite, dans ce cas le nouveau devra faire preuve d'imagination ;-)

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Décembre 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2021
    Messages : 5
    Par défaut
    J'en mets une dernière en Prolog moderne pour ceux qui comme moi tomberons par hasard sur cette discussion.

    Les personnes et les jeux sont représentés par des entiers distincts.
    Les indices sur les âges servent à classer les personnes du plus jeune au plus vieux.
    Il n'y a plus qu'une seule clause, que l'on résout avec le système de résolution de contraintes CLPFD.

    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
     
    :- use_module(library(clpfd)).
     
    solution(Pairs, Jeux, Vs) :-
        Table = [Personnes, Jeux],
        Personnes = [Fernand, Luc, Paul],
        Noms = [fernand, luc, paul],
        Jeux = [JeuA, _, JeuC],
        pairs_keys_values(Pairs, Personnes, Noms),
        maplist(all_distinct, Table),
        append(Table, Vs),
        Vs ins 1..3,
        Fernand #> Luc,          % Indice 1
        JeuC #= 2,               % Indice 2
        Paul #> 1, Paul #= JeuA. % Indice 3
     
    /**
    ?- solution(Pairs, [JeuA, JeuB, JeuC], _Vs).
    JeuA = 3,
    JeuB = 1,
    JeuC = 2,
    Pairs = [2-fernand, 1-luc, 3-paul]
     
    Ce qui signifie :
    #1 : Luc a 5 ans et joue au jeuB .
    #2 : Fernand a 7 ans joue au jeuC.
    #3 : Paul a 9 ans et joue au jeauA.
    */

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

Discussions similaires

  1. Solveur d'equations
    Par Jbx 2.0b dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 13/05/2005, 12h21
  2. Où trouver un environnement pour faire du PROLOG ?
    Par cladsam dans le forum Prolog
    Réponses: 4
    Dernier message: 04/05/2005, 17h12
  3. [Castor] Content is not allowed in prolog.
    Par marsupilamuf dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 01/09/2004, 07h59
  4. prolog et scheme
    Par bourvil dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 30/09/2003, 12h09

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