Cinq maisons consecutives, de couleurs differentes, sont habitees par des
hommes de differentes nationalites. Ils possedent tous un animal different,
ont chacun une boisson preferee differente et fument des cigarettes
differentes.
1.  Le norvegien habite la premiere maison,
2.  La maison a cote de celle du norvegien est bleu,
3.  L'habitant de la troisieme maison boit du lait,
4.  L'anglais habite la maison rouge,
5.  L'habitant de la maison verte boit du cafe,
6.  L'habitant de la maison jaune fume des kool
7.  La maison blanche se trouve juste apres la verte,
8.  L'espagnol a un chien,
9.  L'ukrainien boit du the,
10. Le japonais fume des craven
11. Le fumeur de old gold a un escargot,
12. Le fumeur de gitane boit du vin,
13. Le voisin du fumeur de chesterfield a un renard,
14. Le voisin du fumeur de kool a un cheval.
*/
/* Solution Prolog
   on suppose que les maisons sont numerotees de 1 a 5 de gauche a droite.
   C est une liste de 5 couleurs [C1,C2,C3,C4,C5]
         tq Ci=couleur de la maison i
   N est une liste de 5 nationalites [N1,N2,N3,N4,N5]
         tq Ni=nationalite de l'habitant de la maison i
   B est une liste de 5 boissons [B1,B2,B3,B4,B5]
         tq Bi=boisson de l'habitant de la maison i
   A est une liste de 5 animaux [A1,A2,A3,A4,A5]
         tq Ai=animal de la maison i
   F est une liste de 5 marques de cigarettes [F1,F2,F3,F4,F5]
         tq Fi=marque des cigarettes fumees par l'habitant de la maison i
*/
/* Calcul des reponses */
   zebre(ProprietaireZebre,BuveurEau) :-
        relation(C,N,F,B,A),
        meme_position(zebre,ProprietaireZebre,A,N),
        meme_position(eau,BuveurEau,B,N).
/* Construction des listes a partir de l'information fournie */
relation(C,N,F,B,A):-
           C=[_,bleu,_,_,_], N =[norvegien,_,_,_,_],
           B= [_,_,lait,_,_], A= [_,_,_,_,_],

meme_position(rouge,anglais,C,N),
meme_position(vert,cafe,C,B),
meme_position(jaune,kool,C,F),
voisin_droit(vert,blanc,C),
meme_position(espagnol,chien,N,A),
meme_position(ukrainien,the,N,B),
meme_position(japonais,craven,N,F),
meme_position(old_gold,escargot,F,A),
meme_position(gitane,vin,F,B),
voisin(chesterfield,renard,F,A),
voisin(kool,cheval,F,A).

/* meme_position(I,J,K,L). */
/* Les elements I et J sont a la meme position dans les listes K et L */
meme_position(I,J,[I|U],[J|V]).
meme_position(I,J,[M|U],[N|V]):-
I ¯= M,
J ¯= N,
meme_position(I,J,U,V).
/* I et J occupent des positions voisines sur les listes U et V */
voisin(I,J,[I|_],[_,J|_]).
voisin(I,J,[_,I|_],[J|_]).
voisin(I,J,[X|U],[Y|U]):-
I ¯= X,
J ¯= Y,
voisin(I,J,U,V).

/* voisin_droit(I,J,L) */
/* J est le voisin droit de I sur la liste L */
voisin_droit(I,J,[I,J|L]).
voisin_droit(I,J,[K|L]):-
I ¯= K,
voisin_droit(I,J,L).