Université Grenoble Alpes
U.F.R. Sciences de l’Homme et de la Société L2 MIASHS
Contrôle Continu
Travail à préparer et à rendre
Il vous est demandé de traiter un sujet parmi les 3 sujets proposés. Vous pouvez travailler seul ou en binôme. Votre programme commenté et comportant le nom du ou des auteur(s) doit être envoyé à jean-michel.adam@univ-grenoble-alpes.fr au plus tard le jeudi 2 mai 2019 à 23h59. Vous recevrez une confirmation ; si vous ne recevez pas de confirmation ce n’est pas bon.
Ne vous y prenez pas au dernier moment pour faire votre programme et l’envoyer, il y aura une pénalité de 2 points par jour de retard.
Sujet 1 : Problème de seaux…
Ecrire un programme Prolog qui résout le problème suivant :
Vous disposez de deux seaux, l’un de 5 litres et l’autre de 3 litres. Vous avez aussi à votre disposition un robinet d'eau. Comment faire pour mesurer 4 litres ?
On considère qu’un état du problème est défini par deux entiers : les contenus des deux seaux. Ecrire le prédicat solution/1 qui détermine la liste des états permettant de passer de [0,0] à un état comprenant la valeur 4. Le résultat est donc une liste de listes à 2 éléments représentant le contenu des deux seaux. Par exemple : [[0,0],[5,0],[2,3],... [4,0]].
Initialement, cette liste est vide. Les opérations possibles sont : - remplir le seau 1 (seau de 5 litres)
- remplir le seau 2 (seau de 3 litres) - vider le seau 1 dans le seau 2 - vider le seau 2 dans le seau 1 - vider complètement le seau 1 - vider complètement le seau 2
a) Ecrire le prédicat solution/1, il fera appel à un prédicat solution/2 qui à partir d’une liste intermédiaire d’états, détermine la liste solution.
b) Ecrire le prédicat best_solution/1 qui calcule toutes les solutions possibles, affiche le nombre de solutions trouvées, en sélectionne la plus courte et l’affiche.
Sujet 2 : Le mot le plus long
Ecrire un programme Prolog qui détermine le(s) mot(s) le(s) plus long(s) que l’on peut construire à l’aide de lettres fournies. Il s’agit d’écrire le prédicat motlepluslong/2 qui pour un ensemble de lettres données sous la forme d’un atome, construit la liste des mots les plus longs constructibles à l’aide de ces lettres. Pour réaliser ce programme un fichier comportant tous les mots du français de 3 à 10 lettres nommé dico10l.pl est fourni. Le nombre de lettre fournies pourra éventuellement être limité à 10 lettres.
Exemple d’utilisation :
?- motlepluslong(aelcgumoe,L).
L = [cagoulee, coagulee, emoulage, glaucome].
a) Ecrire le prédicat motlepluslong/2
b) Ecrire un second prédicat trouvermots/1 qui affiche tous les mots de 3 à 10 lettres constructibles avec les lettres données en argument.
Sujet 3 : Le jeu du pendu
Ecrire un programme Prolog qui joue au jeu du pendu.
Ecrire un programme Prolog qui joue au jeu du pendu. L'utilisateur choisit mentalement un mot et le programme Prolog doit le découvrir en proposant une lettre à chaque tour.
Pour réaliser ce programme un fichier comportant tous les mots du français de 3 à 10 lettres nommé dico10l.pl est fourni.
N'essayez pas de programmer une interface graphique : il suffit juste d'indiquer à chaque fois le nombre d'essais encore possibles. A chaque tour l’ordinateur propose une lettre, et l’utilisateur répond en donnant le mot partiellement construit sous la forme d’une suite de '-' et le lettres, les '-' correspondant aux lettres du mot non encore trouvées.
Si par exemple il faut deviner un mot de 9 lettres, l’utilisateur commencera par introduire la chaine '---' ; si l’ordinateur propose la lettre 'e' et que celle-ci est présente en première et 7ème positions, l’utilisateur doit répondre par la chaine 'e---e-' ; si la lettre proposée n’est pas présente, il suffit de répondre par la même chaîne qu’au tour précédent. L’ordinateur perd un essai chaque fois qu’il ne trouve pas de lettre et il ne triche pas .
Essayez de faire en sorte que votre programme Prolog aille rapidement vers la solution en proposant des lettres qui réduisent au mieux l'espace des possibles.
Pour vous aider à écrire la partie dialogue, voici un exemple de petit dialogue écrit en Prolog :
dialogue:- writeln("Bonjour ! Voulez-vous jouer avec moi ?"), lire_reponse(R), % la réponse R est un atome dialogue(R).
dialogue('non'):- writeln("dommage, peut-être une autre fois, au revoir."),!.
dialogue('oui'):- writeln("super, nous allons bien nous amuser !"),!.
dialogue(R):- reponse(R),
lire_reponse(R1), dialogue(R1).
reponse(bof):- writeln("Il faudrait vous décider..."),
writeln("Voulez-vous jouer avec moi oui ou non ?"),!.
reponse(_):- writeln("Je n'ai pas compris votre réponse. Merci de répondre par oui ou par non."), writeln("Voulez-vous jouer avec moi oui ou non ?").
lire_reponse(R) :-
read_line_to_codes(user_input, Codes), % saisie d'une ligne sous la forme d'une liste de codes UNICODE string_codes(S, Codes), % transforme les caractères saisis en une chaine
string_lower(S,SL), % remplace les majuscules éventuelles par des minuscules string_chars(SL,LC), % transforme la chaine en une liste de caratères
subtract(LC,[' '],LL), % suppression des espaces éventuels de la liste
atom_chars(R,LL). % transforme la liste sans espaces en un atome: la réponse