On considère les prédicats suivants :
parent(X,Y) = X a pour parent Y femme(X) = X est une femme homme(X) = X est un hommeDéfinir les prédicats familiaux suivants
fille(X,Y) = X a pour fille Y fils(X,Y) = X a pour fils Y enfant(X,Y) = X a pour enfant Y mère(X,Y) = X a pour mère Y père(X,Y) = X a pour père Y grand_mère(X,Y) = X a pour grand-mère Y grand_père(X,Y) = X a pour grand-père Y grand_parent(X,Y) = X a pour grand-parent Y soeur(X,Y) = X a pour soeur Y frère(X,Y) = X a pour frère Y cousine(X,Y) = X a pour cousine Y cousin(X,Y) = X a pour cousin Y tante(X,Y) = X a pour tante Y oncle(X,Y) = X a pour oncle Y ancêtre(X,Y) = X a pour ancêtre YOn pourra utiliser l'arbre disponible à http://gperilhous.free.fr/Logique/Solgenealogie.html comme source d'inspiration familiale.
On considère la base de données suivante, qui décrit les employés d'une entreprise (par exemple, pour la première clause, antoine est dans le département des ventes, a une fonction de secrétaire, est dans l'entreprise depuis 6 ans, gagne 10000 € par an, et a pour chef xavier).
chef(employe(antoine,ventes,secretaire,6,10000),xavier). chef(employe(xavier,ventes,directeur,2,15000),boss). chef(employe(boss,direction,president,12,30000),boss). chef(employe(lucie,achats,direction,1,14000),boss). chef(employe(anne,achats,secretaire,11,10000),lucie). chef(employe(jerome,achats,secretaire,11,10000),lucie). chef(employe(etienne,achats,stagiaire,1,2000),anne).Ecrivez des règles Prolog pour répondre aux questions suivantes :
- departement/2 : trouver le département dans lequel une personne travaille.
- directeur/2 : étant donné le nom d'une personne, trouver qui est le directeur du département dans lequel elle travaille.
- employe_valide/1 : la structure de l'entreprise étant hiérarchique, on doit pouvoir remonter depuis n'importe quel employé vers le boss. Le prédicat employe_valide permettra de vérifier qu'un employé est bien sous les ordres du boss en remontant la chaine hiérachique..
- salaire/2 : donne le salaire d'un employé
- salaire_reel/2 : donne le salaire d'un employé en ajoutant au salaire de base un bonus, en utilisant les règles suivantes : 1/ tous les employés présents depuis 5 ans ou plus ont un bonus de 5000€. 2/ Aucune personne ne peut gagner plus que son chef (attention le cas du boss est évidemment spécial).
(on utilisera la fonction is pour réaliser les calculs, par exemple N is N+1)
p(a). q(a,1). r(1,1). r(3,5).
p(b). q(a,2). r(1,2). r(3,6).
q(b,3). r(2,3). r(4,7).
q(b,4). r(2,4). r(4,8).
Quels sont les résultats des requêtes suivantes ?
max(X,Y,X) :- X >= Y, !.
max(X,Y,Y).
La requête max(7,5,5). répond Yes !, déterminez pourquoi et corrigez la définition de max.
La négation en prolog est appelée "négation par l'échec".
La façon standard de représenter le not est ainsi de la forme (fail renvoyant un échec) :
not(X) :- X, !, fail. not(X).Attention, cette négation n'est pas une négation logique standard, et peut fonctionner étrangement du fait de son mécanisme.
Un prolog comme GNU-prolog (et d'autres) propose le prédicat \+ pour signifier la négation.
Il est possible ne Prolog de mimer le "if-then-else" des langages informatiques standards?
Pour cela, on peut définir une expression de la forme :
S :- P, !, Q. /* si P s'unifie, on essaie d'unifier Q */
S :- R /* sinon, on unifie R */Un Prolog comme GNU-prolog (et d'autres) permet de représenter une structure if-then-else sous la forme suivante
S :- (P -> Q ; R)
Reprendre la base familiale du premier exercice. En utilisant les clauses ci-dessus, créer un programme proposant interactivement d'ajouter des enfants à la famille (sexe, parent), d'en enlever (on ne peut enlever que des enfants), de lister puis d'afficher l'ensemble des femmes de la famille. Créer enfin un programme pour afficher l'ensemble des prédicats familiaux qu'on a défini.
http://www.cs.may.ie/~jpower/Courses/PROLOG/ a été source d'inspiration pour quelques exercices.