Devoir-Paradigme de Programmation

Télécharger au format doc, pdf ou txt
Télécharger au format doc, pdf ou txt
Vous êtes sur la page 1sur 3

Travaux pratiques Prolog

1) 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 homme

Dé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 Y
2) Utilisation basique de prolog : structure de données + requêtes.

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, Samir est dans le département des ventes, a une fonction
de secrétaire général, est dans l'entreprise depuis 6 ans, gagne 1000000 D.A par an, et a
pour chef Hamid).

chef(employe(Samir,ventes,secretaireGeneral,6,1000000),hamid).
chef(employe(hamid,ventes,directeur,2,150000),omar).
chef(employe(omar,direction,president,12,300000),omar).
chef(employe(khaled,achats,direction,1,140000),omar).
chef(employe(samia,achats,secretaire,11,100000),omar).
chef(employe(imene,achats,secretaire,11,10000),omar).
chef(employe(fateh,achats,stagiaire,1,2000),khaled).

Ecrivez des règles Prolog pour répondre aux questions suivantes :

1. departement/2 : trouver le département dans lequel une personne


travaille.
2. directeur/2 : étant donné le nom d'une personne, trouver qui est le
directeur du département dans lequel elle travaille.
3. employe_valide/1 : la structure de l'entreprise étant hiérarchique, on
doit pouvoir remonter depuis n'importe quel employé vers omar. 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..
4. salaire/2 : donne le salaire d'un employé
5. 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).

3) Un peu de mathématiques et de récursion

1. Définir un prédicat factorielle/2 qui calcule la factorielle de N


(fact(0)=1, fact(n) = n*fact(n-1), pour n>0).
2. Définir un prédicat fibonnaci/2 qui calcule la suite de Fibonnaci de N
(fib(0) = 1, fib(1) = 1, fib(n) = fib(n-1)+fib(n-2), pour n>1).

(on utilisera la fonction is pour réaliser les calculs, par exemple N is N+1)

4) Coupure, Negation, If-Then-Else

1. Supposons qu'on ait les faits suivants dans un programme Prolog :

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 ?

o p(X), q(X,Y), r(Y,Z).


o !, p(X), q(X,Y), r(Y,Z).

o p(X), !, q(X,Y), r(Y,Z).

o p(X), q(X,Y), !, r(Y,Z).


o p(X), q(X,Y), r(Y,Z), !.

2. On considère le programme suivant, qui définit le troisième argument (numérique)


comme le maximum des deux premiers.

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.

Prolog propose le prédicat \+ pour signifier la négation.

Il est possible en 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 */

Prolog permet de représenter une structure if-then-else sous la forme suivante

S :- (P -> Q ; R)

5) Manipulations de listes

1. Définir un prédicat renverse/2, tel que renverse(L1,L2)est vrai si L2 et la


liste inverse de L1.
2. Définir un prédicat sousens/2, tel que sousens(L1,L2)est vrai si L1 est un
sous-ensemble de L2.
3. Définir un prédicat average/2, tel que average(L, N) est vrai si N est la
moyenne des entiers de N, ou 0 si la somme est 0
4. Définir un prédicat maxlist/2, tel que maxlist(L, N) est vrai si N est le plus
grand élément de L.
5. Définir un prédicat moinsder/2, tel que moinsder(L1, L2) est vrai si si L2
est L1 moins le dernier élément.
6. Définir un prédicat debut/3, tel que debut(L1,N,L2) est vrai si L2 contient les
N premiers éléments de L1.

Vous aimerez peut-être aussi