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
|
% zebre.pl
% programme GNU prolog (gpl)
%
% 1) gplc zebre.pl
% 2) zebre
%
% Résultats :
% -----------
% maison(jaune,norvegien,chat,eau,paul)
% maison(bleue,danois,cheval,the,jean)
% maison(rouge,anglais,oiseau,lait,pierre)
% maison(blanche,suedois,chien,biere,jacques)
% maison(verte,allemand,zebre,cafe,hans)
%
% programme original de :
% -----------------------
%% Where does the zebre live?
%% Puzzle solution written by Claude Sammut.
%
% programme transposé par
% -----------------------
% Jean-Paul Davalan jpdvl@wanadoo.fr
%
% http://perso.wanadoo.fr/jean-paul.davalan/jeux/logic/zebre/
%
% énoncé :
% --------
% Dans la rue il y a cinq maisons.
% Les couleurs des maisons sont toutes différentes.
% Les propriétaires sont de nationalités différentes,
% leurs prénoms sont différents et
% leurs boissons préférées sont différentes
% Dans chaque propriété vit un animal différent.
% L'Anglais vit dans la maison rouge.
% Le Suédois a un chien.
% L'habitant de la maison verte boit du café.
% La maison de Jean est voisine de celle du chat.
% Le Danois boit du thé.
% La maison verte est à droite de la maison blanche.
% Pierre a un oiseau.
% Paul habite la maison jaune.
% Le buveur de lait habite la maison du milieu.
% Le Norvégien habite la première maison à gauche.
% Paul est voisin du cheval.
% Jacques boit de la bière.
% L'Allemand se prénomme Hans.
% Le Norvégien vit près de la maison bleue.
% La personne qui boit de l'eau est voisine de Jean.
%
% Qui a un zèbre ?
%
%
%
%q :- statistics(runtime,_), zebre,
% statistics(runtime,[_,Y]), write('time : '), write(Y), nl.
zebre :-
maisons(Maisons),
membre(maison(rouge, anglais, _, _, _), Maisons),
membre(maison(_,suedois, chien,_,_), Maisons),
membre(maison(verte,_,_,cafe,_), Maisons),
voisin_de(maison(_,_,_,_,jean), maison(_,_,chat,_,_), Maisons),
membre(maison(_,danois,_,the,_), Maisons),
droite_de(maison(verte,_,_,_,_), maison(blanche,_,_,_,_), Maisons),
membre(maison(_,_,oiseau,_,pierre), Maisons),
membre(maison(jaune, _, _, _, paul), Maisons),
Maisons = [_, _, maison(_, _, _, lait, _), _,_],
Maisons = [maison(_, norvegien, _, _, _)|_],
voisin_de(maison(_,_,_,_,paul), maison(_,_,cheval,_,_), Maisons),
membre(maison(_,_,_,biere,jacques), Maisons),
membre(maison(_,allemand,_,_,hans), Maisons),
voisin_de(maison(_,norvegien,_,_,_), maison(bleue,_,_,_,_), Maisons),
voisin_de(maison(_,_,_,eau,_), maison(_,_,_,_,jean), Maisons),
membre(maison(_,_,zebre,_,_), Maisons),
print_maisons(Maisons).
maisons([
maison(_, _, _, _, _),
maison(_, _, _, _, _),
maison(_, _, _, _, _),
maison(_, _, _, _, _),
maison(_, _, _, _, _)
]).
droite_de(A, B, [B, A | _]).
droite_de(A, B, [_ | Y]) :- droite_de(A, B, Y).
voisin_de(A, B, [A, B | _]).
voisin_de(A, B, [B, A | _]).
voisin_de(A, B, [_ | Y]) :- voisin_de(A, B, Y).
membre(X, [X|_]).
membre(X, [_|Y]) :- membre(X, Y).
print_maisons([A|B]) :- !,
write(A), nl,
print_maisons(B).
print_maisons([]).
%:- initialization(q). |
Partager