/* homme(X) est vrai si X est un homme */ homme(patrick). homme(gerard). homme(louis). homme(pierre). /* femme(X) est vrai si X est une femme */ femme(therese). femme(sandrine). femme(muriel). femme(germaine). femme(yvette). /* enfant_parents(Enfant,Parent1,Parent2) est vrai si Enfant est un enfant de Parent1 et Parent2 */ enfant_parents(gerard,germaine,louis). enfant_parents(therese,yvette,pierre). enfant_parents(patrick,gerard,therese). enfant_parents(muriel,gerard,therese). enfant_parents(sandrine,gerard,therese). enfant_parents(astride,jean,therese). /* enfant_parent(Enfant,Parent) est vrai si Enfant est un enfant de Parent */ enfant_parent(Enfant,Parent) :- enfant_parents(Enfant,Parent,_). enfant_parent(Enfant,Parent) :- enfant_parents(Enfant,_,Parent). /* pere_enfant(Pere,Enfant) est vrai si Pere est pere de Enfant */ pere_enfant(Pere,Enfant) :- homme(Pere), enfant_parent(Enfant,Pere). /* mere_enfant(Mere,Enfant) est vrai si Mere est mere de Enfant */ mere_enfant(Mere,Enfant) :- femme(Mere), enfant_parent(Enfant,Mere). /* grandpere_enfant(GrandPere,Enfant) vrai si GrandPere est grand-pere de Enfant */ grandpere_enfant(GrandPere,Enfant) :- pere_enfant(GrandPere,Parent), pere_enfant(Parent,Enfant). grandpere_enfant(GrandPere,Enfant) :- pere_enfant(GrandPere,Parent), mere_enfant(Parent,Enfant). /* grandmere_enfant(GrandMere,Enfant) vrai si GrandMere est grand-mere de Enfant */ grandmere_enfant(GrandMere,Enfant) :- mere_enfant(GrandMere,Parent), pere_enfant(Parent,Enfant). grandmere_enfant(GrandMere,Enfant) :- mere_enfant(GrandMere,Parent), mere_enfant(Parent,Enfant). grandparent(GrandParent, Enfant) :- enfant_parent(Parent, GrandParent), enfant_parent(Enfant, Parent). /* frere(Personne,FrereOuSoeur) est vrai si la personne Personne est un frere de FrereOuSoeur */ frere(Personne,FrereOuSoeur) :- homme(Personne), freresOuSoeurs(Personne,L), membre(FrereOuSoeur,L). /* freresOuSoeurs(Personne,L) est vrai si L contient les freres ou soeurs de Personne */ freresOuSoeurs(Personne,L) :- pere_enfant(Pere,Personne), mere_enfant(Mere,Personne), enfants(Pere,L1), enfants(Mere,L2), concatener(L1,L2,L3), supprimer_doublon(L3,L4), supprimer(Personne,L4,L). /* enfants(Personne,L) est vrai si L est la liste des enfants de Personne */ enfants(Personne,L) :- enfants(Personne,[],L). /* enfants(Personne,L1,L2) est vrai si L2 est la liste des enfants de Personne */ /* la question doit donner la valeur [] a L1*/ /* Exemple typique de construction d'une liste avec des elements qui */ /* satisfont un predicat (ici enfant/2) */ enfants(Personne,L,[Enfant|L1]) :- enfant_parent(Enfant,Personne),!,not(membre(Enfant,L)),enfants(Personne,[Enfant|L],L1). enfants(_,_,[]). /* supprimer(E,L1,L2) signifie que L2 possede tous les elements de L1 sauf E */ supprimer(_,[],[]) :- !. supprimer(E,[E|L],L1) :- supprimer(E,L,L1),!. supprimer(E,[E1|L],[E1|L1]) :- supprimer(E,L,L1). /* membre(E,L) est vrai si E est un element de L*/ membre(E,[E|_]). membre(E,[E1|L]) :- membre(E,L),E\=E1. /* supprimer_doublon(L1,L2) signifie que L2 contient tous les elemnts de L1 sans soublon*/ supprimer_doublon([],[]) :-!. supprimer_doublon([E|L1],[E|L2]) :- not(membre(E,L1)),!, supprimer_doublon(L1,L2). supprimer_doublon([_|L1],L2) :- supprimer_doublon(L1,L2). /* concatener(L1,L2,L3) signifie que L3 est la concatenation de L1 et L2 */ concatener([],L,L). concatener(L,[],L). concatener([E1|L1],L2,[E1|L3]) :- concatener(L1,L2,L3).