Ce TP reprend des énigmes logiques du
livre qui rend fou de
Raymond Smullyan. J'espère que ça vous donnera envie de livre entier. Beaucoup d'énigmes sont résolvables par Mme. Michu, qui n'a pas la chance de suivre ce cours. Vous êtes plus chanceux, vous allez apprendre à utiliser des outils qui permettent de résoudre des problèmes bien plus complexes. En attendant, vous avez un TP à faire.
Il existe plusieurs implémentations de prolog, nous utiliserons SWI Prolog que l'on lance par la commande
swipl
(jusque là ça va).
Créez un fichier
tp1.pl
qui va contenir votre base de faits dans le même répertoire, puis lancez
swi-prolog
dans le même répertoire. Ensuite chargez votre base de faits avec la commande :
?- [tp1].
Vous devrez relancer cette commande à chaque fois que vous modifiez
tp1.pl
.
C'est l'histoire d'un prisonnier sur une île étrange, dirigé par un roi non moins étrange. Pour une raison qui m'échappe je dois bien l'avouer, le roi décide d'en finir avec le prisonnier à l'aide d'une série d'épreuves. Le destin du brave pénitencier sera soit la mort, dévoré par un tigre sanguinaire, soit l'amour, marié avec la fille du roi (et pas l'inverse). Dès fois que vous posiez des questions, le prisonnier ne sait pas dompter les tigres et il est amoureux de la pricesse. La seule issue est la résolution des énigmes.
Première salle
Le roi veut en finir avant son petit déjeuner, et il a très faim. Il fait venir le prisonnier et lui présente deux portes, chacune ayant une pancarte. Le roi dit au prisonnier : « Votre sort sera décidé par la porte que vous allez passer. Si vous vous trompez, je ne donne pas cher de votre peau. Si vous choisissez bien, je vous donne la main de ma fille. Les indications sur les portes vous aideront à trouver le bon chemin. Je sais que la même personne a écrit les deux pancartes, mais je ne saurais vous dire qui. C'est soit Tweedledee qui dit toujours la vérité, soit Tweedledum qui ment toujours. Bonne chance. »
Il y a un tigre derrière cette porte, ou la princesse derrière l'autre.
La princesse est derrière l'autre porte.
Si vous étiez à la place du prisonnier, vous risqueriez votre vie, et vous n'auriez pas Prolog pour vous aider. A priori vous êtes en sécurité en TP, et vous avez Prolog !
Écrivez un prédicat
contenu
décrit le fait que derrière une porte il y a soit un tigre soit la princesse.
Écrivez les prédicats
pancarte1
et
pancarte2
pour chaque pancarte décrivant ce qu'elles prétendent sur ce qu'il y a derrière chaque porte.
D'après ce qu'a dit le roi soit les deux pancartes disent vrai, soit elles mentent tous les deux.
Écrivez le prédicat
salle1
représentant les solutions, qui explore les deux cas possibles.
Quelle est la solution ? Pour la trouver, identifiez le but à atteindre et exécutez le dans l'interpréteur.
J'imagine que vous voulez savoir le raisonnement qui a permis d'obtenir ce résultat. Pour cela, utilisez a fonction
trace
sur
pancarte1
,
pancarte2
et
salle1
.
Dessinez l'arbre décisionnel du but de la question précédente.
Deuxième salle
Ne me demandez pas comment, mais le prisonnier a suivi vos conseils et a franchi la bonne porte. Cependant, c'est une petite déception qui l'attend. En effet les deux portes menaient au même endroit et au lieu d'y découvrir la princesse il vit le roi. Celui-ci lui dit : « Je voulais savoir comment vous vous y preniez. Voici deux nouvelles portes avec chacune une inscription. Je sais que Tweedledee a écrit l'une d'entre elles et Tweedledum a écrit l'autre, mais je ne peux pas vous dire laquelle dit la vérité et laquelle ment. » Le prisonnier lui demande « Comment puis-je savoir cette fois ci s'il y a réellement une princesse derrière la bonne porte ?». Le roi lui répondit : « Vous ne pouvez pas le savoir. Mais je vous promets que si vous ouvrez la mauvaise porte il y aura bien un tigre, et qu'il a très faim. Concentrez vous et bonne chance ».
Il y a une princesse dans cette cellule et un tigre dans l'autre.
Il y a une princesse dans une cellule et un tigre dans l'autre.
Écrivez le prédicat
salle2
représentant les solutions, qui explore les cas possibles.
Quelle est la solution ?
Dessinez l'arbre décisionnel du but de la question précédente.
Quelle pancarte disait la vérité ?
Prolog peut afficher du texte dans la console grâce à la commande
write
. Elle s'utilise dans le corps des clauses de la façon suivante :
write('test'). %affiche le mot test
write(TEST). %affiche le contenu de la variable TEST
Écrivez une règle qui affiche ce qu'il y a derrière deux portes. Attention, il ne faut afficher QUE les solutions potentielles.
Troisième salle
La déception se lisait de noveau sur le visage du pauvre prisonnier. En effet le roi se tenait de nouveau face à lui avec un grand sourire aux lèvres. Le prisonnier lui dit : « Vous vous êtes de nouveau moqué de moi ! ». Ce à quoi le roi lui répondit : « Ne vous plaignez pas, vous êtes toujours en vie. Ceci étant dit voici votre épreuve finale, je vous en donne ma parole. ». Le prisonnier sentit le piège en voyant trois portes à pancarte devant lui. Le roi poursuivit : « Ma fille se trouve derrière l'une des portes, le tigre derrière une autre, et il n'y a rien derrière la troisième. Après avoir conduit ma fille derrière sa porte, Tweedledee y a accroché une pancarte, qui ne ment donc pas. Tweedledum s'est chargé du tigre et de sa pancarte, qui ne dit donc pas la vérité. Enfin je ne sais pas lequel des deux a rédigé la pancarte de la porte vide. Au revoir, et peut être à bientôt. »
Il n'y a rien derrière la 3e porte.
Le tigre est derrière la 1e porte.
Il n'y a rien derrière cette porte.
Les choses se compliquent de plusieurs façons. Votre première difficulté réside dans le fait que la véracité d'une pancarte dépend de ce qu'il y a derrière la porte correspondante. Vous aurez donc besoin de définir des prédicats décrivant la vraie information correspondant à chaque porte.
Écrivez les prédicats
porte1
,
porte2
,
porte3
. N'oubliez pas que maintenant une salle peut être vide !
Écrivez le prédicat
salle3
représentant les solutions, qui explore les cas possibles.
Quelle est la solution ?
Dessinez l'arbre décisionnel du but de la question précédente.
Le prisonnier franchit l'ultime porte. Un sourire se dessine sur son visage alors qu'il aperçoit la princesse de ses rêves. Le roi, qui se tient à côté d'elle, s'adressa au prisonnier : « Je te félicite jeune homme, tu es d'évidence digne de marier ma fille ! ». Sur ces mots, il offrit la main de sa fille au prisonnier fortuné. Quant à vous je vous félicite, vous avez fini ce TP. C'est déjà ça.