<div class="notebook"> <div class="nb-cell markdown" name="md1"> # "Pile ou Face menteur" pour mentaliste Ce mini-projet ProLog a pour cadre le jeu "pile ou face menteur" à deux joueurs où l'un des joueurs (le menteur) lance un pièce de monnaie sur une table, la regarde rapidement sans la montrer à l'autre joueur (le mentaliste), la cache avec sa main et annonce "c'est pile" ou "c'est face". Important, le joueur-menteur peut mentir dans son annonce. C'est un jeu de psychologie. L'autre joueur, le mentaliste, gagne ou perd la partie selon qu'il arrive à deviner si le menteur a dit la vérité ou pas : il doit dire quelle est effectivement le côté de la piece visible : côté face (ou côté pile). L'objectif est de mettre au point plusieurs stratégies de jeu (des IA) pour le joueur-mentaliste et étudier l'efficacité de chacune. Pour ces stratégie, le mentaliste peut se baser sur les précédents lancés et annonces du menteur. Trois familles de stratégie sont possibles : * stratégie indépendante de l'historique (IA-0, hors stratégie de pur hasard) * stratégie en fonction de la dernière partie ou de quelques parties précédentes (IA-1, IA-2, ...) pour simuler un comportement et une mémoire-psychologie humaine * stratégie en fonction de l'ensemble de l'historique des parties précédentes (IA-N) pour essayer de tirer profit de la puissance de la machine </div> <div class="nb-cell markdown" name="md2"> N.B. : la dernière stratégie (IA-N) devraient être plus puissantes que des stratégies IA-0, IA-1, ... "simples" (défi) Un début de code est fourni ci-après, comprenant : * une partie consacrée aux stratégies, avec un exemple de stratégie simple et des suggestions d'autres stratégies plus complexes * une partie consacrée à la gestion du jeu et l'évaluation d'une stratégies </div> <div class="nb-cell markdown" name="md3"> Tout cela est à compléter, adapter, améliorer, etc. rem. : librairies chargées (dif, clpq) </div> <div class="nb-cell program" data-background="true" name="p1"> :- use_module(library(dif)). % Sound inequality :- use_module(library(clpq)). % Constraints over rational numbers </div> <div class="nb-cell markdown" name="md4"> ## 1. Stratégies Les stratégies sont des prédicats ayant le profil suivant : ``` %% nomStratégie(en entrée : un entier NumeroDeLaPartie, une liste Historique, %% pour la partie courante : l'état de la piece, l'annonce du menteur, %% en sortie : un réponse proposée "pile" ou "face" par le mentaliste) %% rem. l'historique est la liste des parties jouées %% ex. d'historique : [[pile,pile,pile],[pile,face,face],[face,face,face]] %% une partie comporte en premier l'état de la pièce, puis l'annonce du menteur et la réponse du mentaliste %% c'est un triplet : [Etat,Annonce,Reponse], l'historique est la liste de ces triplets %% pour faciliter l'accès à l'historique, la dernière partie jouée est en premier dans la liste ``` **Important,** dans tous les cas, votre programme (pour le mentaliste) ne doit pas utiliser l'état de la pièce de la partie courante. **Important,** pour une stratégie IA-0, l'historique ne doit pas être utilisée. **Important,** pour une stratégie IA-1, seul le premier élément de l'historique peut être utilisé. Pour une stratégie IA-2, seuls les deux premiers éléments de l'historique peuvent être utilisés. etc. ### 1.0 Stratégies IA-0 Exemple : </div> <div class="nb-cell program" data-background="true" name="p3"> %% strategie00 de type IA-0 (stratégie constante qui ne dépend de rien) %% stratégie simple, constante qui donne toujours face comme réponse strategie00(_NumeroPartie,_Historique,_Etat,_Annonce,face). %% strategie01 de type IA-0 (stratégie qui dépend seulement de l'annonce courante et du numéro de la partie) %%% stratégie simple qui répète l'annonce courante du menteur strategie01(_NumeroPartie,_Historique,_Etat,Annonce,Annonce). </div> <div class="nb-cell markdown" name="md5"> Suggestions pour d'autres stratégies de type IA-0 </div> <div class="nb-cell program" data-background="true" name="p2"> %% strategie02 de type IA-0 (stratégie qui dépend seulement de l'annonce courante et du numéro de la partie) %% stratégie simple qui alterne une répétition de l'annonce courante du menteur ou inverse l'annonce courante du menteur %% selon le numéro de la partie (pair=>repétition, impair=>inversion) %% strategie03 de type IA-0 (stratégie qui dépend seulement de l'annonce courante et du numéro de la partie) %%% extension de la stratégie02 qui suit un cycle (de longueur>2) de répétition ou d'inversion </div> <div class="nb-cell markdown" name="md6"> ### 1.1 Stratégies IA-1, IA-2, ... Exemple : </div> <div class="nb-cell program" data-background="true" name="p6"> %% strategie10 de type IA-1 (stratégie qui dépend de la dernière partie) %% stratégie qui répète la précédente annonce du menteur strategie10(_N,[],_Etat,_Annonce,face). %% face, ou n'importe quoi, quand il n'y a pas de partie précédente (si c'est la première partie) strategie10(_N,[[_Etat1,Annonce1,_Reponse1]|_Historique],_Etat,_Annonce,Annonce1). %% strategie11 de type IA-1 (stratégie qui dépend de la dernière partie) %% stratégie qui répète la précédente réponse si elle a été gagnante, et face sinon strategie11(_N,[],_Etat,_Annonce,face). %% face, ou n'importe quoi, quand il n'y a pas de partie précédente (si c'est la première partie) strategie11(_N,[[Etat1,_Annonce1,Etat1]|_Historique],_Etat,_Annonce,Etat1). strategie11(_N,[[Etat1,_Annonce1,Reponse1]|_Historique],_Etat,_Annonce,face):- dif(Etat1,Reponse1). </div> <div class="nb-cell markdown" name="md8"> Suggestions pour d'autres stratégies de type IA-1, IA-2, ... </div> <div class="nb-cell program" data-background="true" name="p4"> %% strategie12 de type IA-1 (stratégie qui dépend de la dernière partie) %% stratégie qui répète l'annonce courante du menteur si le menteur n'a pas menti dans la dernière partie, et dit l'inverse sinon %% strategie13 de type IA-1 (stratégie qui dépend des 3 dernières parties) %% stratégie qui analyse les 3 dernières parties pour savoir si le menteur a plutôt dit la vérité ou pas </div> <div class="nb-cell markdown" name="md9"> ### 1.N Stratégies IA-N Suggestions pour des stratégies de type IA-N </div> <div class="nb-cell program" data-background="true" name="p7"> %% strategieN1 de type IA-N (stratégie qui dépend de l'analyse de toutes les parties précédentes) %% stratégie qui regarde toutes les parties pour voir si le menteur ment en général ou pas %% strategieN2 de type IA-N (stratégie qui dépend de l'analyse de toutes les parties précédentes) %% stratégie qui regarde toutes les parties pour voir s'il y a des cycles dans les mensonges </div> <div class="nb-cell markdown" name="md7"> ## 2. Gestion du jeu et évaluation de stratégies Le jeu est composée de plusieurs parties, les prédicats suivants gèrent un jeu avec une stratégie strategie00. **Remarque** : pour faire son annonce, le menteur s'appuie aussi sur des stratégies (similaires de celles du mentaliste, le rôle de l'annonce pour le mentaliste est jouée par l'état de la piece pour le menteur). **Remarque** : pour simuler un hasard prévisible et reproductible, une fonction spéciale (limitée) est ajoutée ; elle peut être remplacée par une vraie fonction aléatoire plus générale. </div> <div class="nb-cell program" data-background="true" name="p5"> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% gestion d'un jeu avec strategie00 %%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% jouerUnePartie00(N,H,Etat,Annonce,Reponse):- alea(N,Etat), strategie00(N,H,Etat,Etat,Annonce), %% annonce du menteur strategie00(N,H,Etat,Annonce,Reponse). %% réponse du mentaliste jouerUnJeu00(0,[]). jouerUnJeu00(NombreDeParties,[[Etat,Annonce,Reponse]|ResultatsPrecedents]):- {NombreDeParties>0, NMoins = NombreDeParties-1}, jouerUnJeu00(NMoins,ResultatsPrecedents), jouerUnePartie00(NombreDeParties,ResultatsPrecedents,Etat,Annonce,Reponse). </div> <div class="nb-cell program" data-background="true" name="p9"> alea(1,face). alea(2,pile). alea(3,face). alea(4,pile). alea(5,face). alea(6,face). alea(7,pile). alea(8,pile). alea(9,face). alea(10,face). </div> <div class="nb-cell markdown" name="md10"> Exemples de parties : </div> <div class="nb-cell query" name="q4"> jouerUnJeu00(3,Resultat). </div> <div class="nb-cell query" name="q2"> jouerUnJeu00(10,Resultat). </div> <div class="nb-cell markdown" name="md11"> Pour automatiser l'évaluation des stratégies, la gestion suivante d'une partie est proposée (avec mise en paramètre des stratégies) : </div> <div class="nb-cell program" data-background="true" name="p8"> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% gestion d'une partie entre stratégies données en paramètre %%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% jouerUnePartieParametree(Strat1,Strat2,N,H,Etat,Annonce,Reponse):- alea(N,Etat), call(Strat1,N,H,Etat,Etat,Annonce), %% annonce du menteur call(Strat2,N,H,Etat,Annonce,Reponse). %% réponse du mentaliste jouerUnJeuParametre(_Strat1,_Strat2,0,[]). jouerUnJeuParametre(Strat1,Strat2,NParties,[[Etat,Annonce,Reponse]|ResultatsPrécedents]):- {NParties>0, NMoins = NParties-1}, jouerUnJeuParametre(Strat1,Strat2,NMoins,ResultatsPrécedents), jouerUnePartieParametree(Strat1,Strat2,NParties,ResultatsPrécedents,Etat,Annonce,Reponse). </div> <div class="nb-cell markdown" name="md12"> Exemples d'utilisation : </div> <div class="nb-cell query" name="q1"> jouerUnJeuParametre(strategie00,strategie00,3,R). </div> <div class="nb-cell query" name="q3"> jouerUnJeuParametre(strategie00,strategie11,10,R). </div> <div class="nb-cell markdown" name="md13"> Suggestion d'extensions : * améliorer l'affichage des résultats des parties (vous pouvez même essayer d'ajouter des graphiques). * ajouter une gestion de partie interactive contre un joueur humain. * adapter cette gestion du jeu à des listes de stratégies, pour évaluer une stratégie face un ensemble de stratégies. </div> <div class="nb-cell markdown" name="md14"> Fin. A vous de jouer. Et/ou bon travail ! </div> </div>