/* généalogie : test de prolog /P. TRAU janvier 2001 */ /* pere(X,Y) se dit pour moi "X est le père de Y" (en 1er toujours le sujet) */ /****************************************************** * mes faits de base sont pere, homme et mari. */ pere(pat,elsa). pere(pat,celine). pere(pat,clemence). pere(fred,theo). pere(fred,alix). pere(yann,axelle). pere(yann,josselin). pere(marc,julien). pere(jeanphilippe,camille). pere(jeanphilippe,guillaume). pere(andre,pat). pere(andre,marc). pere(andre,jeanphilippe). pere(antoine,christine). pere(antoine,laurence). pere(antoine,fred). pere(maurice,antoine). pere(rene,andre). pere(gaston,monique). pere(arsene,simone). homme(pat). homme(fred). homme(theo). homme(yann). homme(josselin). homme(marc). homme(julien). homme(jeanphilippe). homme(guillaume). homme(andre). homme(antoine). homme(maurice). homme(rene). homme(gaston). homme(arsene). mari(pat,christine). mari(fred,florence). mari(yann,laurence). mari(marc,elisabeth). mari(jeanphilippe,patricia). mari(andre,simone). mari(antoine,monique). mari(maurice,andree). mari(rene,mimi). mari(gaston,germaine). mari(arsene,josephine). /****************************************************** * règles */ /* toute personne qui apparait au dessus et qui n'est pas un homme est une femme * soit elle est mariée, soit elle est enfant de quelqu'un. */ femme(F) :- mari(_,F). femme(F) :- pere(_,F), not(homme(F)), not(mari(_,F)). /* le dernier pour éviter les doublons ! */ mere(M,E) :- pere(P,E),mari(P,M). mere(X) :- mere(X,_). /* prévoyons également les prédicats d'arité 1, c'est à dire à un seul argument : X est une mère si elle a des enfants */ pere(X) :- pere(X,_). enfant(E,P) :- pere(P,E). enfant(E,M) :- mere(M,E). enfant(X) :- enfant(X,_). /* là, c'est une définition récurente */ descendant(D,A) :- enfant(D,A). descendant(D,A) :- enfant(D,X),descendant(X,A). /****************************************************** * pour mes tests, il suffit de demander "aff." */ aff :- homme(X),write('Homme : '),write(X),nl,fail. aff :- femme(X),write('Femme : '),write(X),nl,fail. aff :- pere(X), write('Père : '), write(X),nl,fail. aff :- mere(X), write('Mère : '), write(X),nl,fail. aff :- enfant(X),write('Enfant : '),write(X),nl,fail. aff :- descendant(D,A),write(D),write(' descend de '),write(A),nl,fail.
Patrick TRAU, ULP - IPST janvier 2002
|