%predicat vin1
vin1(100,chablis,1974,12).
vin1(110,mercurey,1978,13).
vin1(120,macon,1977,12).

%predicat vin2
vin2(100,chablis,1974,12).
vin2(200,sancerre,1979,11).
vin2(  210   ,pouilly  ,   1980    ,  12).
vin2(  230   ,pouilly  ,   1981    ,  12).

%predicat viticulteurs
viticulteurs(nicolas  , pouilly  , bourgogne).
viticulteurs(martin   , bordeaux , bordelais ).

%question 2
%| ?- vin2(X,pouilly,Y,Z).
%X = 210,
%Y = 1980,
%Z = 12 ? ;
%
%X = 230,
%Y = 1981,
%Z = 12 ? ;

%| ?- vin2(N,C,M,12).
%C = chablis,
%M = 1974,
%N = 100 ? ;
%
%C = pouilly,
%M = 1980,
%N = 210 ? ;
%
%C = pouilly,
%M = 1981,
%N = 230 ? ;

%question 3
%vin3= vin1 union vin2
vin3(Millesime,Cru,Annee,Degre) :- vin1(Millesime,Cru,Annee,Degre).
vin3(Millesime,Cru,Annee,Degre) :- vin2(Millesime,Cru,Annee,Degre).

%on peut ajouter ca à la deuxième ligne \+(vin1(Millesime,Cru,Annee,Degre)).

%| ?- vin3(_,Cru,_,_).

%question 4
%negation par l'echec en sicstus : \+(...)
%negation de X  => succes si echec de X
%               => echec si succes de X
%| ?- \+(vin2(X,Y,Z,K)).
%no
%| ?- \+(vin2(100,chablis,1974,12)).
%no
%| ?- \+(vin2(101,chablis,1974,12)).
%yes
%La table vin2 ne contient elle aucun vin de 1978?
%\+(vin2(M,C,1978,A)).
%
%true ? 

%vin3(_,C,_,_),\+(vin2(_,C,_,_)).
%C = mercurey ? ;
%
%C = macon ? ;

%question 5
%vin4= vin1 moins vin2
%

vin4(M,C,A,D):-vin1(M,C,A,D), \+(vin2(M,C,A,D)).

%question 6
%vignoble= vin4 produit viticulteurs

vignoble(N,C,M,D,P,V,R):-vin4(N,C,M,D),viticulteurs(P,V,R).

%question 7
%vin5= proj vin4 sur Cru et Millésime

vin5(C,M):-vin4(_,C,M,_).

%question 8
%vin6 = restr vin3 millésime entre 1975 et 1980
vin6(N,C,M,A):-vin3(N,C,M,A), M>1975, M<1980.

%question 9
%vin7 = vin3 jointure viticulteurs tq ville=cru
vin7(N,C,M,A,P,R):-vin3(N,C,M,A),viticulteurs(P,C,R).

%question 10
%vin8= vin1 intersection vin2
vin8(M,C,A,D):-vin1(M,C,A,D),vin2(M,C,A,D).

%question 11
vin9(macon  ,   1977    ,  12).
vin9(macon  ,   1979    ,  14).
vin9(macon  ,   1980    ,  12).
vin9(saumur  ,   1977    ,  12).
vin9(saumur  ,   1979    ,  14).
vin9(chablis ,   1977    ,  12 ).

type(1977    ,  12).
type(1979    ,  14 ).

cru(C):-vin9(C,_,_),\+(crupasbon(C)).
crupasbon(C):-type(M,D), vin9(C,_,_),\+(vin9(C,M,D)).

%partie II
%données
homme(françoisI).
homme(henriII).
homme(emmanuel_philibert).
homme(charles_emmanuel).
homme(françoisII).
homme(charlesIX).
homme(henriIII).
homme(victor_amedee).

femme(madeleine).
femme(marguerite).
femme(catherine_de_medicis).
femme(margot).
femme(elisabeth).

%X est parent de Y
parent(françoisI,henriII).
parent(françoisI,madeleine).
parent(françoisI,marguerite).
parent(henriII,françoisII).
parent(henriII,charlesIX).
parent(henriII,henriIII).
parent(henriII,margot).
parent(catherine_de_medicis,françoisII).
parent(catherine_de_medicis,charlesIX).
parent(catherine_de_medicis,henriIII).
parent(catherine_de_medicis,margot).
parent(marguerite,charles_emmanuel).
parent(emmanuel_philibert,charles_emmanuel).
parent(charles_emmanuel,victor_amedee).
parent(charlesIX,elisabeth).
%père,mère,fille...
%X est pere de Y
pere(X,Y):-parent(X,Y),homme(X).

%test qui est le père d'HenriII pere(X,henriII)

%X est mere de Y
mere(X,Y):-parent(X,Y),femme(X).

%X est fille de Y
fille(X,Y):-parent(X,Y),femme(Y).

%X et Y ont procréé ensemble
procreer(X,Y):-pere(X,Z),mere(Y,Z).
procreer(X,Y):-pere(Y,Z),mere(X,Z).

%X est gdparent de Y
gdparent(X,Y):-parent(X,U),parent(U,Y).

%X est gdpere de Y
gdpere(X,Y):-pere(X,U),parent(U,Y).

%X est gdmere de Y
gdmere(X,Y):-mere(X,U),parent(U,Y).

%X est ancetre de Y
ancetre(X,Y):-parent(X,Y).
ancetre(X,Y):-parent(X,U),ancetre(U,Y).

%test ancetre de la reine Margot
%?- ancetre(X,margot).
%X = henriII ? ;
%X = catherine_de_medicis ? ;
%X = françoisI ? ;
%no

%X est frère de Y
frere(X,Y):-parent(U,X),parent(U,Y), homme(X),\+(eq(X,Y)).
eq(X,X).
%Henri II est le frère de qui?
%| ?- frere(HenriII,X).
%X = madeleine ? ;
%X = marguerite ? ;
%no

%X est soeur de Y
soeur(X,Y):-parent(U,X),parent(U,Y), femme(X) ,\+(eq(X,Y)).

%oncle frère d'un parent ou mari d'une soeur d'un parent
oncle(X,Y):-parent(U,Y),frere(X,U).
oncle(X,Y):-parent(U,Y),soeur(S,U),procreer(S,X).

%quels sont les couples oncles neveux
%oncle(X,Y)

%tante
tante(X,Y):-parent(U,Y),soeur(X,U).
tante(X,Y):-parent(U,Y),frere(S,U),procreer(S,X).

%cousins
cousins(X,Y):-parent(O,X),oncle(O,Y).
cousins(X,Y):-parent(T,X),tante(T,Y).

%issusdegermains
issusdegermains(X,Y):-parent(PX,X),parent(PY,Y),cousins(PX,PY).

