généalogie.pl : test de prolog / P. TRAU


/* 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

retour au cours Prolog    retour