tp 10 - prolog - L`Université Paris Descartes

Transcription

tp 10 - prolog - L`Université Paris Descartes
TP 10 - PROLOG
http://web.mi.parisdescartes.fr/~bonzon/Cours/prolog.htm
Introduction Choisissez votre éditeur préféré pour créer un fichier tp10_nom_prenom.pl, que vous enverrez par mail avant la
fin du TP à [email protected].
Pensez à commenter et à indenter correctement votre code.
Enoncé On considère cinq maisons, toutes de couleur différente (rouge, bleue, jaune, blanche et verte), dans lesquelles
logent cinq personnes de nationalités différentes (anglaise, suedoise, danoise, norvegienne, allemande) ayant
chacun une boisson favorite (thé, café, lait, bière et eau), un animal de compagnie (chien, chat, oiseau, cheval et
poisson), et un sport favori (football, baseball, volley, hockey, tennis).
On dispose des faits suivants :
9. Le Norvégien habite dans la première maison.
1. L’Anglais vit dans la maison rouge
10. L’homme qui pratique le volley vit à côté de celui
qui a des chats.
2. Le Suédois a des chiens
3. Le Danois boit du thé
4. La maison verte est directement à gauche de la maison blanche.
5. Le propriétaire de la maison verte boit du café.
6. La personne qui joue au football élève des oiseaux.
7. Le propriétaire de la maison jaune joue au baseball.
8. Celui qui vit dans la maison du centre boit du lait.
11. L’homme qui a un cheval est le voisin de celui qui
pratique le baseball.
12. Celui qui pratique le tennis boit de la bière.
13. L’Allemand joue au hockey.
14. Le Norvégien vit juste à côté de la maison bleue.
15. L’homme qui joue au volley a un voisin qui boit de
l’eau.
Il s’agit de trouver qui a un poisson rouge.
On suppose que les maisons sont numérotées de 1 à 5 de gauche à droite. On gère une liste C de 5 couleurs, une
liste N de 5 nationalités, une liste B de 5 boissons, une liste A de 5 animaux et une liste S de 5 sports (il ne faut
pas les définir, Prolog les construira pour trouver la solution).
Par exemple si les listes sont :
C = [jaune, bleu, rouge, vert, blanc],
N = [norvegien, danois, anglais, allemand, suedois],
B = [eau, the, lait, cafe, biere],
A = [chat, cheval, oiseau, poisson, chien],
S = [baseball, volley, football, hockey, tennis]
cela signifie que le danois habite dans la maison bleue, qu’il boit du thé, qu’il a un cheval et qu’il joue au volley,
car bleu, danois, thé, cheval et volley occupent la même position dans les listes.
1
1. Définir 5 prédicats lc, ln, lb, la et ls permettant de poser les contraintes inhérentes aux listes C, N, B, A
et S.
Par exemple, la liste C est constituée de 5 couleurs, qui sont toutes différentes les unes des autres.
2. Définir le prédicat meme_maison(X, L1, Y, L2), qui est vrai si X et Y sont dans la même position dans
les listes L1 et L2.
Par exemple pour le fait 1, on pourra dire que “anglais” est à la même place dans la liste N (liste des
nationalités) que “rouge” dans la liste C (liste des couleurs).
3. Définir le prédicat maison_a_cote(X, L1, Y, L2), qui est vrai si X et Y sont dans des positions voisines
dans les listes L1 et L2.
4. Définir le prédicat maison_a_gauche(X, Y, L), qui est vrai si X est juste à gauche de Y dans la liste L.
5. Définir le prédicat poisson(C, N, B, A, S, Poisson) qui calcule les listes C, N, B, A et S, et qui trouve
dans la variable Poisson la nationalité du propriétaire du poisson en fonction des faits donnés au début
du TP.
Voici ce que doit vous retourner l’intérpréteur Prolog :
?- poisson(C, N, B, A, S, Poisson).
C = [jaune, bleu, rouge, vert, blanc],
N = [norvegien, danois, anglais, allemand, suedois],
B = [eau, the, lait, cafe, biere],
A = [chat, cheval, oiseau, poisson, chien],
S = [baseball, volley, football, hockey, tennis],
Poisson = allemand ;
false.
2