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 :

Problème d'interfaçage Prolog XPCE


Sujet :

Prolog

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut Problème d'interfaçage Prolog XPCE
    Bonjour, avant tout bonne nouvelle année à tout le monde.
    Je suis confronté à mon premier problème de programmation pour cette année 2012.

    Je réalise en Prolog un jeu du style "qui suis-je" avec la méthode CUT qui fonctionne correctement et répond à mes attentes. Une fois le jeu lancé des questions sont posés successivement à l'utilisateur jusqu'a trouver la bonne réponse.

    A présent, j'essaye de mettre en place une interface graphique pour ce jeu avec la bibliothéque XPCE de Prolog.

    Mon interface comprend:
    -un label (je voudrais mettre les questions ici, nom : Question)
    -2 boutons (oui et non pour répondre aux questions, nom: oui & non)
    -un second label (affichant la réponse finale, nom : Reponse)
    -un label et 3 images inutiles

    Je travaille sur deux fichiers, le premier contenant le code de l'interface ainsi que mon code du jeu, et un second fichier permettant juste de lancer mon application (ci dessous).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     :- make_dialog(D, 'Antony_transport'),
           send(D,open).
    Je charge donc mes deux fichier sous la console prolog, mon interface s'ouvre correctement mais avec des labels vides. Pourriez vous m'aider...

    Merci d'avance

    voici le code de l'interface
    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
    58
    59
    60
    61
    62
    63
    64
    65
     
    dialog('Antony_transport',
           [ object        :=
    	   Antony_transport,
    	 parts         :=
    	   [ Antony_transport :=
    	       dialog('Antony transport'),
    	     Titre            :=
    	       label(titre, 'Quel moyen de transport suis-je ?'),
    	     Photo            :=
    	       label(photo,
    		     image('happy.bm')),
    	     Photo_           :=
    	       label(photo2,
    		     image('happy.bm')),
    	     Question         :=
    	       label(question, 'No attributes in "action" mode'),
    	     Oui              :=
    	       button(oui),
    	     Non              :=
    	       button(non),
    	     Reponse          :=
    	       label(reponse, '')
    	   ],
    	 modifications :=
    	   [ Oui := [ reference := point(0, 21)
    		    ],
    	     Non := [ reference := point(0, 21)
    		    ]
    	   ],
    	 layout        :=
    	   [ area(Titre,
    		  area(97, 30, 205, 18)),
    	     area(Photo,
    		  area(14, 2, 66, 66)),
    	     area(Photo_,
    		  area(319, 3, 66, 66)),
    	     area(Question,
    		  area(110, 80, 184, 18)),
    	     area(Oui,
    		  area(60, 134, 78, 33)),
    	     area(Non,
    		  area(254, 133, 82, 32)),
    	     area(Reponse,
    		  area(155, 174, 184, 18))
    	   ],
    	 behaviour     :=
    	   [ Oui := [ message := message(@prolog,
    					 lance_question,
    					 Question,
    					 Reponse)
    		    ],
    	     Non := [ message := message(@prolog,
    					 lance_question,
    					 Question,
    					 Reponse)
    		    ]
     
    	   ],
    	    initialise    :=
    	   [
    	     send(Question, colour, red),
    	     send(Question, font, font(times, bold, 18))
    	   ]
           ]).
    Concernant mon code de jeu, cela s'execute après lancement de la commande jouer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    jouer :- supposition(Animal),
          write('J\'ai enfin trouvé la réponse est: '),
          write(Animal),
    	  nl,
    	  write('************************************ '),
          nl, %retour de ligne
    	  nl,
          undo.
    supposition traite les différentes caractéristiques...

    Dernière partie de code pour comprendre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /* Question de recherche */
    demande(Question) :-
        write('Le moyen de locomotion : '),
        write(Question),
        write('? '),
        read(Reponse),
        nl,
        ( (Reponse ==oui; Reponse==o; Reponse == yes ; Reponse == y) -> assert(yes(Question)) ;
          (Reponse == non; Reponse ==n; Reponse ==no) -> assert(no(Question)), fail).
    Veuillez m'excuser si mon problème est incompris, c'est pas évident à exprimer.

  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
    Pour envoyer du texte à un label, on peut faire send(Label, selection , toto).
    "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 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut
    merci de ta réponse, cela fonctionne correctement.

    Cependant je ne parviens pas à mettre en place mes questions dans le label de question et intéragir avec les boutons.

    Voici mon code complet de mon jeu
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    /********************************************************************
    *********************JEU INTELIGENT**********************************
    * *******************************************************************
    *             -Que suis-je ?										*
    *             -Moyen de locomotion :								*
    *                train, vélo, voiture, camion, moto(&scooter&mob..),*
    *                bateau, avion, pied, roller, skate, trotinette     *
    *																	*
    *      -Commencer la partie avec la commande ?- jouer.              *
    * *******************************************************************
    * **********GUILLET ANTONY MISH1***********Projet Repr Co************
    ********************************************************************/
     
     
     
    	/*  Initialement lancement avec la console prolog sans interface
    	jouer :- supposition(Animal),
          write('J\'ai enfin trouvé la réponse est: '),
          write(Animal),
    	  nl,
    	  write('************************************ '),
          nl, %retour de ligne
    	  nl,
          undo. 
    	  */
     
    /* Tests des suppositions avec la méthode CUT pour enlever les choix d'attente lorsque validé */
     
    supposition(voiture)   :- voiture, !.
    supposition(camion)   :- camion, !.
    supposition(moto)      :- moto, !.
    supposition(avion)     :- avion, !.
    supposition(bateau)    :- bateau, !.
    supposition(velo)      :- velo, !.
    supposition(train)     :- train, !.
    supposition(metro)     :- metro, !.
    supposition(pied)      :- pied, !.
    supposition(roller)    :- roller, !.
    supposition(skate)     :- skate, !.
    supposition(inconnu).
     
     
    /* caractéristiques des moyens de locomotion */
     
    voiture :- write('\n ************************************ \n * Quel_moyen_de_locomotion_suis_je *  \n ************************************\n'),
    		   moteur,
               route,
    		   quatre_roues,
    		   protection,
    		   diriger,
    		   taille.
    camion  :- moteur,
               route,
    		   pleins_roues,
    		   protection,
    		   diriger,
               verification(transporte_t_il_des_marchandises).
    moto    :- moteur,
               route,
    		   deux_roues,
    		   diriger.
    avion :- moteur,
    		 air,
    		 roues,
    		 protection,
    		 diriger.
    bateau :- moteur,
    		  eau.
    velo :- route,
    		deux_roues,
    		diriger.
    train :- moteur,
    		 rail,
    		 protection,
    		 verification(necessite_il_de_conduire).
    pied :- route,
    	    physique,
            verification(est_il_le_moyen_deplacement_le_plus_simple).
    roller :- route,
              physique,
    		  quatre_roues,
              verification(laisse_t_il_une_liberte_des_pieds).
    skate :- route,
    	     physique,
    		 quatre_roues,
             verification(enferme_t_il_les_pieds).
     
     
    /* caracteristiques de genre */
    moteur      :-  verification(est_il_motorise), !.
    route       :-  verification(est_il_utilise_sur_route), !.
    air         :-  verification(est_il_utilise_dans_air), !.
    eau         :-  verification(est_il_utilise_sur_eau),  !.
    rail        :-  verification(est_il_utilise_sur_rail), !.
    roues       :-  verification(possede_t_il_des_roues), !.
    deux_roues  :-  roues,
    		        verification(possede_t_il_deux_roues).
    quatre_roues:-  roues,
    		        verification(possede_t_il_quatre_roues).
    pleins_roues:-  roues,
    		        verification(possede_t_il_plus_de_quatre_roues).
    protection  :-  verification(est_il_protege_de_l_environnement_exterieur), !.
    diriger     :-  verification(possede_t_il_un_volant), !.
    diriger     :-  verification(possede_t_il_un_guidon), !.
    diriger     :-  verification(possede_t_il_un_manche).
    taille      :-  verification(fait_t_il_moins_de_4_m).
    physique    :- verification(est_il_une_epreuve_physique), !.
     
     
    /* Question de recherche */
    demande(Question) :-
        write('Le moyen de locomotion : '),
        write(Question),
        write('? '),
        read(Reponse),
        nl,
        ( (Reponse ==oui; Reponse==o; Reponse == yes ; Reponse == y) -> assert(yes(Question)) ;
          (Reponse == non; Reponse ==n; Reponse ==no) -> assert(no(Question)), fail).
     
    /*permet de stocker information sans re-compiler */
    :- dynamic yes/1, no/1.
     
     
    /*Fonction de verification des questions */
    verification(X) :-  (yes(X) ->  true ;
                        (no(X)  ->  fail ;
                        demande(X))).
     
    /* Permet de mettre à jour la base de donnée avec oui et non*/
    undo :- retract(yes(_)),fail.
    undo :- retract(no(_)),fail.
    undo.
     
     
    /* C'est ici qu'on gere l'interface graphique */
     
    lance_question(Question_label, Reponse_label) :-
      % test qui fonctionne	send(Reponse_label, selection, 'ok'),
    	supposition(Animal),
          write('J\'ai enfin trouvé la réponse est: '),
          write(Animal),
    	  nl,
    	  write('************************************ '),
          nl, %retour de ligne
    	  nl,
          undo. 
     
     
     
    /* Interface graphique XPCE*/
    dialog(projet_antony,
           [ object        :=
    	   Projet_antony,
    	 parts         :=
    	   [ Projet_antony  :=
    	       dialog('Projet antony'),
    	     Titre          :=
    	       label(titre, 'Quel moyen de transport suis-je ?'),
    	     Oui_bouton     :=
    	       button(oui_bouton),
    	     Non_bouton     :=
    	       button(non_bouton),
    	     Question_label :=
    	       label(question_label, 'Répondre par oui ou non'),
    	     Reponse_label  :=
    	       label(reponse_label, '')
    	   ],
    	 modifications :=
    	   [ Oui_bouton     :=
    	       [ label := 'Oui'
    	       ],
    	     Non_bouton     :=
    	       [ label := 'Non'
    	       ]
     
    	   ],
    	 layout        :=
    	   [ area(Titre,
    		  area(110, 22, 205, 18)),
    	     area(Oui_bouton,
    		  area(36, 147, 80, 24)),
    	     area(Non_bouton,
    		  area(280, 143, 80, 24)),
    	     area(Question_label,
    		  area(14, 59, 365, 24)),
    	     area(Reponse_label,
    		  area(106, 108, 184, 18))
    	   ],
    	 behaviour     :=
    	   [ Oui_bouton := [ message := message(@prolog,
    						lance_question,
    						Question_label?selection,
    						Reponse_label)
    			   ],
    	     Non_bouton := [ message := message(@prolog,
    						lance_question,
    						Question_label?selection,
    						Reponse_label)
    			   ]
    	   ],
    	 initialise    :=
    	   [
    	    send(Question_label, colour, red),
    	    send(Question_label, font, font(times, bold, 18)),
    	   ]
           ]).
    Pourrait-on m'expliquer comment faire j'avais pensé à utiliser
    send(Reponse_label, selection, supposition(Animal)),
    Mais cela ne fonctionne malheureusement pas (débutant en Prolog)

    merci d'avance

  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
    send(Reponse_label, selection, supposition(Animal))
    Cela ne peut pas fonctionner (tu penses en fonctionnel).
    Tu peux créer par contre un prédicat supposition(Reponse_label, Animal) et dans ce prédicat, quand tu auras une réponse à afficher, faire à ce moment un
    send(Reponse_label, selection, bla-bla-bla)
    "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 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut
    Mais le problème c'est que je veux pas faire un send(Reponse_label, selection, bla-bla-bla) systématique alors que mes phrases sont déjà toutes prette dans supposition(animal)...
    Ou alors je comprend pas ton raisonnement avec supposition(Reponse_label, Animal)

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut
    Et concernant le traitement pour l'interface graphique, je le continue bien dans lance_question(Question_label, Reponse_label) :- ???

    De plus un singleton m'est affiché comme erreur

  7. #7
    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
    Si un singleton est affiché, c'est que c'est unje variable dont la valeur n'est jamais utilisée, elle signale en général un problème de programmation.
    Pour les éviter et si la variable est vraiment inutile dans le contexte, fais précéder le nom de la variable par un underscore : _NomVar au lieu de NomVar.

    Pour le reste, je ne comprends pas ce que tu veux dire.
    "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

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut
    Merci pour l'explication d'erreur, ça fonctionne effectivement. Pour le reste, en gros je ne comprend juste pas (du tout) comment implémenter mon programme avec l'interface...
    J'ai lu plusieurs articles sur le net, les write doivent être remplacé par des send(Question_label, selection, "texte auparavant dans write") mais cela ne fonctionne tout de même pas (plus d'affichage en console du coup, et les clics sur mes boutons oui ou non ne me produisent aucun changement pour mes labels)

  9. #9
    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
    Si on fait un interface graphique, en principe on n'utilise plus la console, et de toute façon, rien n'interdit de faire les deux.
    Il faut bien entendu programmer les boutons pour lancer des messages vers @prolog qui lanceront les prédicats précédemment utilisées par l'interface console.
    "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

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut
    Existe t-il des tutos expliquant l'utilisation des boutons, label avec des exemples concret d'adaptation de programme console en interface ? Autre que le tuto du site pour la calculette qui n'explique pas grand chose au final à part la création d'une console...
    Car c'est mon premier programme en Prolog (en mode console cela ne m'a pas posé trop de problème mais en voulant y ajouter une interface je fais un peu du sur place depuis déjà 2 semaines).

    Merci d'avance pour ton aide

  11. #11
    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
    Citation Envoyé par Jérém08 Voir le message
    Existe t-il des tutos expliquant l'utilisation des boutons, label avec des exemples concret d'adaptation de programme console en interface ? Autre que le tuto du site pour la calculette qui n'explique pas grand chose au final à part la création d'une console...
    Merci
    En première approche, tu peux considérer que l'appui sur un bouton correspond à la touche Entrée dans un programme console, tu saisis quelque chose dans un textfield et tu valides ton entrée en appuyant sur le bouton.
    Tu peux aussi envisager un bouton comme le numéro à taper lorsqu'un menu s'affiche sur ta console, au lieu de taper 3 + Entrée tu apuies sur un bouton.
    Un bouton correspond à l'envoi d'une commande à un programme.
    Attention, le passage de la console à l'interface graphique correspond souvent à un bouleversement de l'architecture du programme, le déroulement n'est pas linéaire, c'est une programmation évènementielle guidée justement par l'appui sur les boutons.
    "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

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut
    En effet je réalise que tout mon programme va devoir être modifié ce qui me complique la compréhension.
    Je ne peux donc pas utiliser l'interface que j'ai développé (code source COMPLET plus haut) avec 2 boutons oui et non ? car l'utilisation de champ texte va me compliquer la situation et ne correspond pas à mes attentes, je désire juste une interface simple c'est à dire :

    un label posant la question (Question_label)
    un bouton oui et un bouton non pour répondre
    un label donnant la réponse finale (donc caché jusque la fin Reponse_label)

    Aprés chaque clique sur l'un des deux boutons (seul le texte du label Question_label change) la réponse est analysé et la question suivante apparait.


  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut
    Bonjour,

    Je suis toujours en train d'essayer de créer une interface, mais je n'y parviens pas...
    Je voudrais à partir d'un exemple simple comprendre le fonctionnement et donc simplement afficher ma question dans un label suite à un clique comme ceci
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    /* Tests des suppositions avec la méthode CUT pour enlever les choix d'attente lorsque validé */
     
    supposition(voiture)     :- voiture, !.
    supposition(camping_car) :- camping_car, !.
    supposition(camion)      :- camion, !.
    supposition(bus)         :- bus, !.
    supposition(moto)        :- moto, !.
    supposition(scooter)     :- scooter, !.
    supposition(mobylette)   :- mobylette, !.
    supposition(avion)       :- avion, !.
    supposition(bateau)      :- bateau, !.
    supposition(velo)        :- velo, !.
    supposition(metro)       :- metro, !.
    supposition(tramway)     :- tramway, !.
    supposition(train)       :- train, !.
    supposition(pied)        :- pied, !.
    supposition(roller)      :- roller, !.
    supposition(skate)       :- skate, !.
    supposition(animal)      :- animal, !.
    supposition(inconnu).
     
     
    /* caractéristiques des moyens de locomotion */
     
    voiture     :- moteur,
    			   route,
    			   quatre_roues,
    			   protection,
    			   diriger,
    			   poids.
    camping_car :- moteur,
    			   route,
    			   quatre_roues,
    			   protection,
    			   diriger,
    			   verification(sert_il_pour_voyager_en_tourisme).
    camion      :- moteur,
                   route,
    		       pleins_roues,
    		       protection,
    		       diriger,
                   verification(transporte_t_il_des_marchandises).
    bus         :- moteur,
                   route,
    		       pleins_roues,
    		       protection,
    		       diriger,
                   verification(est_t_il_un_transport_en_commun).
    moto        :- moteur,
                   route,
    		       deux_roues,
    		       diriger,
    		       verification(mon_cylindré_fait_il_plus_de_50_cc).
    scooter     :- moteur,
                   route,
    		       deux_roues,
    		       diriger, 
    			   verification(mon_moteur_est_il_a_l_avant).
    mobylette   :- moteur,
                   route,
    		       deux_roues,
    		       diriger, 
    			   verification(mon_moteur_est_il_a_l_arrière).		  
    avion       :- moteur,
    		       air,
    		       roues,
    		       protection,
    		       diriger.
    bateau      :- moteur,
    		       eau.
    velo        :- route,
    		       deux_roues,
    		       diriger.
    metro       :- moteur,
    		       rail,
    		       protection,
    		       verification(est_il__utilisé_qu_en_ville),
    		       verification(est_il_parfois_souterrain).
    tramway     :- moteur,
    		       rail,
    		       protection,
    		       verification(est_il__utilisé_qu_en_ville).
    train       :- moteur,
    		       rail,
    		       protection,
    		       verification(permet_il_de_faire_des_grandes_distances).
    pied        :- route,
    	           physique,
                   verification(est_il_le_moyen_deplacement_le_plus_simple).
    roller      :- route,
                   physique,
    		       quatre_roues,
                   verification(laisse_t_il_une_liberte_des_pieds).
    skate       :- route,
    	           physique,
    		       quatre_roues,
                   verification(enferme_t_il_les_pieds).
    animal      :- route,
                   physique,
    		       verification(suis-je_monté).
     
     
     
    /* caracteristiques de genre */
     
    moteur      :-  verification(est_il_motorise), !.
    route       :-  verification(est_il_utilise_sur_route), !.
    air         :-  verification(est_il_utilise_dans_air), !.
    eau         :-  verification(est_il_utilise_sur_eau),  !.
    rail        :-  verification(est_il_utilise_sur_rail), !.
    roues       :-  verification(possede_t_il_des_roues), !.
    deux_roues  :-  roues,
    		        verification(possede_t_il_deux_roues).
    quatre_roues:-  roues,
    		        verification(possede_t_il_quatre_roues).
    pleins_roues:-  roues,
    		        verification(possede_t_il_plus_de_quatre_roues).
    protection  :-  verification(est_il_protege_de_l_environnement_exterieur), !.
    diriger     :-  verification(possede_t_il_un_volant), !.
    diriger     :-  verification(possede_t_il_un_guidon), !.
    diriger     :-  verification(possede_t_il_un_manche).
    poids       :-  verification(fait_il_moins_de_trois_tonnes_cinq).
    physique    :- verification(est_il_une_epreuve_physique), !.
     
     
    diag :-
    	new(D, dialog('Essai')),
    	send(D, append,
    	     new(ExprItem, text_item(supposition(Locomotion))),
    	send(D, append, new(Resultat, label(''))),
    	send(D, append,
    	     button(calcul, message(@prolog, traitement, ExprItem?selection, Resultat))),
    	send(D, open).
     
     
    traitement(ExprItem, Resultat) :-
    	send(Resultat, selection, ExprItem).
    J'ai simplement remplacé 'taper texte' par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         new(ExprItem, text_item(supposition(Locomotion))),
    Merci d'avance pour votre aide

  14. #14
    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
    Je vois !
    Je te conseille d'étudier ce qui est expliqué dans ce TP, ça pourrait te donner des idées pour organiser ta base de données.
    Telle qu'elle est actuellement, elle est inutilisable en mode graphique.
    Il te faut des faits que tu pourras mémoriser avec assert et ensuite enchainer ton raisonnement sans reposer plusieurs fois les mêmes questions.
    Je te donnes un début d'interface pour voir comment ça fonctionne.
    Attention, c'est une simple ébauche, il y a beaucoup de choses à faire pour en faire quelque chose de correct.
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    % la base de données revisitée
    suppositions([[voiture,
    	     [moteur, route, quatre_roues, protection, diriger, poids]],
    	    [camping_car,
    	     [moteur, route, quatre_roues, protection, diriger, sert_il_pour_voyager_en_tourisme]],
    	    [camion,
    	     [moteur, route, pleins_roues, protection, diriger,transporte_t_il_des_marchandises]]]).
     
    diag :-
    	retractall(supposition(_)),
    	retractall(question(_)),
    	retractall(vrai(_)),
    	retractall(faux(_)),
    	new(D, dialog('Essai')),
    	% on prend la première supposition
    	suppositions([Question | Suppositions]),
    	assert(supposition(Suppositions)),
     
    	Question = [Fait, [Indice|Reste_Indice]],
    	assert(question([Fait,  [Indice|Reste_Indice]])),
    	send(D, append,
    	     new(ExprItem, label(''))),
    	send(ExprItem, selection, Indice),
     
    	send(D, append,
    	     button(oui, message(@prolog, ok, ExprItem))),
    	send(D, append,
    	     button(non, message(@prolog, ko, ExprItem))),
    	send(D, open).
     
     
    ok(Label) :-
    	retract(question([Fait,  [Indice|Reste_Indice]])),
    	assert(vrai(Indice)),
    	assert(question([Fait, Reste_Indice])),
    	(   select_prochain_indice(New_Indice) ->
    	    send(Label, selection, New_Indice)
    	;   % ici on a trouve car select_prochain_indice echoue !!!
    	    retract(question([Fait,  []])),
    	    send(Label, selection, Fait)).
     
     
    ko(Label) :-
    	gtrace,
    	retract(question([_Fait,  [Indice|_Reste_Indice]])),
    	assert(faux(Indice)),
    	retract(supposition([Question | Suppositions])),
    	assert(supposition(Suppositions)),
    	assert(question(Question)),
    	select_prochain_indice(New_Indice),
    	send(Label, selection, New_Indice).
     
    select_prochain_indice(New_Indice) :-
    	% si le retract echoue c'est que la liste
    	% des indices est vide, ils ont tous ete validés
    	% on a donc trouve
    	retract(question([Fait, [Indice|Reste_Indice]])),
    	% on s'assure que le fait n'est pas déjà connu
    	(   vrai(Indice) -> % on le saute
    	    assert(question([Fait, Reste_Indice])),
    	    select_prochain_indice(New_Indice)
    	;   % on s'assure qu'il n'est pas faux
    	    \+faux(Indice) ->
    	    % on a trouve une nouvelle question
    	    New_Indice = Indice,
    	    assert(question([Fait, [Indice|Reste_Indice]]))
    	;   % ici un fait est faux, on passe aux
    	    % suppositions suivantes
    	    retract(supposition([Question | Suppositions])),
    	    assert(supposition(Suppositions)),
    	    assert(question(Question)),
    	    select_prochain_indice(New_Indice)).
    "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

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut
    Merci pour cette aide et ce tp bien expliqué, cependant en utilisant la méthode exposé avec les listes, cela m'oblige à définir les questions directement dans la liste ? Et retirer les classifications par genre que j'utilisais auparavant (pour moteur, roues....).

    Serait-ce pour cela du coup que le programme se stoppe à moteur ?

  16. #16
    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
    Ton code ne fonctionnait pas chez moi, il manquait le prédicat verification.
    L'interface graphique oblige à repenser l'architecture d'un prog, c'est obligé
    "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

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut
    Donc voici mon code initial sans interface

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    /********************************************************************
    *********************JEU INTELIGENT**********************************
    * *******************************************************************
    *             -Que suis-je ?										*
    *             -Moyen de locomotion :								*
    *                train, vélo, voiture, bus, camion, moto,           *
    *          bateau, avion, pied, rollers, skate, trotinette,         *
    *			scooter, mobylette, tramway,animal, camping car  		*
    *      -Commencer la partie avec la commande ?- jouer.              *
    * ******************************************************************
    * **********GUILLET ANTONY MISH1***********Projet Repr Co************
    ********************************************************************/
     
     
    /* lancement de la partie */	   
    	jouer :- supposition(Locomotion),
          write('J\'ai enfin trouvé la réponse est: '),
          write(Locomotion),
    	  nl,
    	  write('************************************ '),
          nl, %retour de ligne
    	  nl,
          undo.
    	%20q.org  
     
    /* Tests des suppositions avec la méthode CUT pour enlever les choix d'attente lorsque validé */
     
    supposition(voiture)     :- voiture, !.
    supposition(camping_car) :- camping_car, !.
    supposition(camion)      :- camion, !.
    supposition(bus)         :- bus, !.
    supposition(moto)        :- moto, !.
    supposition(scooter)     :- scooter, !.
    supposition(mobylette)   :- mobylette, !.
    supposition(avion)       :- avion, !.
    supposition(bateau)      :- bateau, !.
    supposition(velo)        :- velo, !.
    supposition(metro)       :- metro, !.
    supposition(tramway)     :- tramway, !.
    supposition(train)       :- train, !.
    supposition(pied)        :- pied, !.
    supposition(roller)      :- roller, !.
    supposition(skate)       :- skate, !.
    supposition(animal)      :- animal, !.
    supposition(inconnu).
     
     
    /* caractéristiques des moyens de locomotion */
     
    voiture     :- write('\n ************************************ \n * Quel_moyen_de_locomotion_suis_je *  \n ************************************\n'),
    			   moteur,
    			   route,
    			   quatre_roues,
    			   protection,
    			   diriger,
    			   poids.
    camping_car :- moteur,
    			   route,
    			   quatre_roues,
    			   protection,
    			   diriger,
    			   verification(sert_il_pour_voyager_en_tourisme).
    camion      :- moteur,
                   route,
    		       pleins_roues,
    		       protection,
    		       diriger,
                   verification(transporte_t_il_des_marchandises).
    bus         :- moteur,
                   route,
    		       pleins_roues,
    		       protection,
    		       diriger,
                   verification(est_t_il_un_transport_en_commun).
    moto        :- moteur,
                   route,
    		       deux_roues,
    		       diriger,
    		       verification(mon_cylindré_fait_il_plus_de_50_cc).
    scooter     :- moteur,
                   route,
    		       deux_roues,
    		       diriger, 
    			   verification(mon_moteur_est_il_a_l_avant).
    mobylette   :- moteur,
                   route,
    		       deux_roues,
    		       diriger, 
    			   verification(mon_moteur_est_il_a_l_arrière).		  
    avion       :- moteur,
    		       air,
    		       roues,
    		       protection,
    		       diriger.
    bateau      :- moteur,
    		       eau.
    velo        :- route,
    		       deux_roues,
    		       diriger.
    metro       :- moteur,
    		       rail,
    		       protection,
    		       verification(est_il__utilisé_qu_en_ville),
    		       verification(est_il_parfois_souterrain).
    tramway     :- moteur,
    		       rail,
    		       protection,
    		       verification(est_il__utilisé_qu_en_ville).
    train       :- moteur,
    		       rail,
    		       protection,
    		       verification(permet_il_de_faire_des_grandes_distances).
    pied        :- route,
    	           physique,
                   verification(est_il_le_moyen_deplacement_le_plus_simple).
    roller      :- route,
                   physique,
    		       quatre_roues,
                   verification(laisse_t_il_une_liberte_des_pieds).
    skate       :- route,
    	           physique,
    		       quatre_roues,
                   verification(enferme_t_il_les_pieds).
    animal      :- route,
                   physique,
    		       verification(suis-je_monté).
     
     
     
    /* caracteristiques de genre */
     
    moteur      :-  verification(est_il_motorise), !.
    route       :-  verification(est_il_utilise_sur_route), !.
    air         :-  verification(est_il_utilise_dans_air), !.
    eau         :-  verification(est_il_utilise_sur_eau),  !.
    rail        :-  verification(est_il_utilise_sur_rail), !.
    roues       :-  verification(possede_t_il_des_roues), !.
    deux_roues  :-  roues,
    		        verification(possede_t_il_deux_roues).
    quatre_roues:-  roues,
    		        verification(possede_t_il_quatre_roues).
    pleins_roues:-  roues,
    		        verification(possede_t_il_plus_de_quatre_roues).
    protection  :-  verification(est_il_protege_de_l_environnement_exterieur), !.
    diriger     :-  verification(possede_t_il_un_volant), !.
    diriger     :-  verification(possede_t_il_un_guidon), !.
    diriger     :-  verification(possede_t_il_un_manche).
    poids       :-  verification(fait_il_moins_de_trois_tonnes_cinq).
    physique    :- verification(est_il_une_epreuve_physique), !.
     
     
    /* Question de recherche */
     
    demande(Question) :-
        write('Le moyen de locomotion : '),
        write(Question),
        write('? '),
        read(Reponse),
        nl,
        ( (Reponse ==oui; Reponse==o; Reponse == yes ; Reponse == y) -> assert(yes(Question)) ;
          (Reponse == non; Reponse ==n; Reponse ==no) -> assert(no(Question)), fail).
     
     
    /*permet de stocker information sans re-compiler */
     
    :- dynamic yes/1, no/1.
     
     
    /* Fonction de verification des questions */
     
    verification(X) :-  (yes(X) ->  true ;
    				    (no(X)  ->  fail ;
                        demande(X))).
     
     
    /* Permet de mettre à jour la base de donnée avec oui et non*/
     
    undo :- retract(yes(_)),fail.
    undo :- retract(no(_)),fail.
    undo.
    et voici le code de l'interface généré avev la librairie XPCE

    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
    58
    59
     
    /* Interface graphique XPCE*/
    dialog(projet_antony,
           [ object        :=
    	   Projet_antony,
    	 parts         :=
    	   [ Projet_antony  :=
    	       dialog('Projet antony'),
    	     Titre          :=
    	       label(titre, 'Quel moyen de transport suis-je ?'),
    	     Oui_bouton     :=
    	       button(oui_bouton),
    	     Non_bouton     :=
    	       button(non_bouton),
    	     Question_label :=
    	       label(question_label, 'Répondre par oui ou non'),
    	     Reponse_label  :=
    	       label(reponse_label, '')
    	   ],
    	 modifications :=
    	   [ Oui_bouton     :=
    	       [ label := 'Oui'
    	       ],
    	     Non_bouton     :=
    	       [ label := 'Non'
    	       ]
     
    	   ],
    	 layout        :=
    	   [ area(Titre,
    		  area(110, 22, 205, 18)),
    	     area(Oui_bouton,
    		  area(36, 147, 80, 24)),
    	     area(Non_bouton,
    		  area(280, 143, 80, 24)),
    	     area(Question_label,
    		  area(14, 59, 365, 24)),
    	     area(Reponse_label,
    		  area(106, 108, 184, 18))
    	   ],
    	 behaviour     :=
    	   [ Oui_bouton := [ message := message(@prolog,
    						lance_question,
    						Question_label?selection,
    						Reponse_label)
    			   ],
    	     Non_bouton := [ message := message(@prolog,
    						lance_question,
    						Question_label?selection,
    						Reponse_label)
    			   ]
    	   ],
    	 initialise    :=
    	   [
    	    send(Question_label, colour, red),
    	    send(Question_label, font, font(times, bold, 18)),
    		send(Question_label, selection, 'ok')
    	   ]
           ]).

  18. #18
    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
    Oui, et quelles sont les questions ?
    "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

Discussions similaires

  1. [Python 2.X] Problème avec interfaçage DJANGO et SWI-PROLOG
    Par Triton972 dans le forum Django
    Réponses: 10
    Dernier message: 23/01/2015, 10h11
  2. Base de données déductive : Prolog (XPCE) + Oracle
    Par t_aicha dans le forum Prolog
    Réponses: 21
    Dernier message: 05/10/2009, 07h32
  3. [SWI-Prolog] Interfaçage avec XPCE
    Par baouk2000 dans le forum Prolog
    Réponses: 11
    Dernier message: 29/01/2009, 23h43
  4. [Swi-Prolog][Xpce] Alignement négatif
    Par je®ome dans le forum Prolog
    Réponses: 4
    Dernier message: 12/03/2007, 13h37
  5. problème d'interfaçage d'une base Mysql
    Par zidenne dans le forum Installation
    Réponses: 4
    Dernier message: 19/04/2006, 18h49

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