/*
LE PROBLEME DU ZEBRE
(attribue a Lewis Carroll, pasteur logicien et ecrivain anglais
auteur de nombreux "puzzles")
On considere cinq maisons, toutes de couleurs differentes  (rouge,
bleu, jaune, blanc, vert), dans lesquelles logent cinq
professionnels (peintre, sculpteur, diplomate, docteur et
violoniste) de nationalite differente (anglaise, espagnole,
japonaise, norvegienne et italienne) ayant chacun une boisson
favorite (the, jus de fruits, cafe, lait et vin) et des animaux
favoris (chien, escargots, renard, cheval et zebre).
On dispose des faits suivants :
1. l'Anglais habite la maison rouge
2. l'Espagnol possede un chien
3. le Japonais est peintre
4. l'Italien boit du the
5. le Norvegien habite la premiere maison a gauche
6. le proprietaire de la maison verte boit du cafe
7. la maison verte est a droite de la blanche
8. le sculpteur eleve des escargots
9. le diplomate habite la maison jaune
10. on boit du lait dans la maison du milieu
11. le Norvegien habite a cote de la maison bleue
12. le violoniste boit du jus de fruit
13. le renard est dans une maison voisine de celle du medecin
14. le cheval est a cote de la maison du diplomate
Il s'agit de trouver le possesseur du zebre et le buveur de vin.

On suppose que les maisons sont numerotees de 1 a 5 de gauche
a droite. On gere une liste C de longueur 5 decrivant les couleurs
des 5 maisons. On definit de meme une liste N de nationalites,
une liste B de boissons, une liste A d'animaux et une liste P de
professions.

1) Ecrire les clauses definissant le predicat
            meme_maison(X,L1,Y,L2) qui vaut
   vrai si X et Y sont dans la meme position dans les listes
   L1 et L2

2) Ecrire les clauses definissant le predicat
           maison_a_cote(X,L1,Y,L2) qui vaut
   vrai si X et Y sont dans des positions voisines dans les listes
   L1 et L2

3) Ecrire les clauses definissant le predicat
           maison_a_droite(X,Y,L) qui vaut
   vrai si X est a droite de Y dans la liste L (*** AM; je pense que c'est l'inverse***)

4) Ecrire le predicat zebre(C,N,B,A,P,PossZebre,BoitVin)
*/

meme_maison(X,[X|_],Y,[Y|_]).
meme_maison(X,[_|LX],Y,[_|LY]) :- meme_maison(X,LX,Y,LY).

maison_a_cote(X,[X|_],Y,[_,Y|_]).
maison_a_cote(X,[_,X|_],Y,[Y|_]).
maison_a_cote(X,[_|LX],Y,[_|LY]) :- maison_a_cote(X,LX,Y,LY).

maison_a_droite(X,Y,[X,Y|_]).
maison_a_droite(X,Y,[_|L]) :- maison_a_droite(X,Y,L).

zebre(C,N,B,A,P,PossZebre,BoitVin) :-
        C=[_,_,_,_,_],
        N=[norvegien,_,_,_,_],
        B=[_,_,lait,_,_],
        A=[_,_,_,_,_],
        P=[_,_,_,_,_],
        meme_maison(anglais,N,rouge,C),
        meme_maison(chien,A,espagnol,N),
        meme_maison(japonais,N,peintre,P),
        meme_maison(italien,N,the,B),
        meme_maison(verte,C,cafe,B),
        maison_a_droite(blanche,verte,C),
        meme_maison(sculpteur,P,escargots,A),
        meme_maison(diplomate,P,jaune,C),
        maison_a_cote(norvegien,N,bleu,C),
        meme_maison(violoniste,P,jus_de_fruit,B),
        maison_a_cote(renard,A,medecin,P),
        maison_a_cote(cheval,A,diplomate,P),
        meme_maison(PossZebre,N,zebre,A),
        meme_maison(BoitVin,N,vin,B).
