Arbre généalogique Prolog

jeudi 1er février 2024
par  Emmanuel Adam
popularité : 3%

Utilisez swi-prolog ou gnu-prolog (à installer),
ou utiliser une version en ligne de prolog : https://swish.swi-prolog.org/

 Arbre généalogique

Base de Faits

Ecrire la base de fait prolog traduisant l’arbre généalogique suivant (on utilisera les faits homme, femme, pere et mere) :

brahim et erika sont les parents de dorothee et djamel
arnaud et dorothee sont les parents de armelle et bahia
djamel et cecile sont les parents de cedric et eric
cedric et florence sont les parents de fabrice


Définissez ensuite les règles :

  • parentde(X, Y)
  • frerede(X, Y) ; soeurde(X, Y)
  • grandperede(X, Y) ; grandmerede(X, Y)
  • grandparentde(X, Y)
  • onclede(X, Y) ; tantede(X, Y)
  • grandonclede(X, Y) ; grandtantede(X, Y)
  • cousinde(X, Y) ; cousinede(X, Y)

Interrogez maintenant la base et donnez la liste des cousins, cousines, oncles, tantes, ...

Exemple de solution

femme(armelle).
femme(bahia).
femme(cecile).
femme(dorothee).
femme(erika).
femme(florence).
femme(celia).
femme(sylvia).

homme(arnaud).
homme(brahim).
homme(cedric).
homme(djamel).
homme(eric).
homme(fabrice).
homme(david).

mere(erika, dorothee).
mere(erika, djamel).
mere(dorothee, armelle).
mere(dorothee, bahia).
mere(cecile, cedric).
mere(cecile, eric).
mere(florence, fabrice).
mere(celia, sylvia).

pere(arnaud, armelle).
pere(arnaud, bahia).
pere(brahim, dorothee).
pere(brahim, djamel).
pere(cedric, fabrice).
pere(djamel, cedric).
pere(djamel, eric).
pere(david, sylvia).

%si besoin de définir le ’not’
%not(X) :- X, !, fail.
%not(_).

parent(X, Y) :- pere(X, Y).
parent(X, Y) :- mere(X, Y).

frere(X, Y) :- homme(X), pere(P, X), mere(M, X), pere(P, Y), mere(M, Y),not(X = Y).
soeur(X, Y) :- femme(X), pere(P, X), mere(M, X), pere(P, Y), mere(M, Y),not(X = Y).

grandpere(X, Y) :- pere(X, Z), parent(Z, Y).
grandmere(X, Y) :- mere(X, Z), parent(Z, Y).

grandparent(X, Y) :- grandpere(X, Y).
grandparent(X, Y) :- grandmere(X, Y).

oncle(X, Y) :- frere(X, Z), parent(Z, Y).
tantede(X, Y) :- soeur(X, Z), parent(Z, Y).

grandoncle(X, Y) :- frere(X, Z), grandparent(Z, Y).
grandtante(X, Y) :- soeur(X, Z), grandparent(Z, Y).

cousin(X, Y) :- homme(X), pere(Z, X), oncle(Z, Y).
cousin(X, Y) :- homme(X), mere(Z, X), tantede(Z, Y).
cousine(X, Y) :- femme(X), pere(Z, X), oncle(Z, Y).
cousine(X, Y) :- femme(X), mere(Z, X), tantede(Z, Y).

%cousin2(X, Y) :- homme(X), grandpere(GP, X), grandpere(GP, Y), X\=Y, not(frere(X,Y)).

ancetre(X, Y) :- parent(X, Y).
ancetre(X, Y) :- parent(X, A), ancetre(A, Y).


 Couples mariés

On utilise maintenant la notion de couples mariés.
Les couples initiaux sont : brahim-erika, arnaud-dorothée, djamel-cécile, cédric-florence.

On ajoute le couple celia-david qui ont pour enfant sylvia.
Mais, djamel et celia se rencontrent, ont le coup de foudre, se séparent de leurs côtés, et se marient ensemble (ils ne sont donc plus mariés à leurs ex conjoints) et sylvia se marie avec fabrice.

Réalisez cette aventure en direct ; dans la console prolog, à l’aide des commandes vues en cours.

  • Définissez les règles beau-père, belle-mère, beau-parents, beau-frere, belle-soeur, demi-frere, demi-soeur
  • cherchez la personne pour qui le beau-père est également le demi-frère.

Remarque : Un beau-pere est le pere du conjoint ou le mari de la mere, qui n’est pas le pere.

  • En utilisant les règles findall, setof, bagof, donnez :
    • tous les petits enfants de erika
    • tous les cousines de eric