Master d’Ing´eni´erie Informatique de Paris 7
M1: Prolog et programmation par contraintes
Examen du 13 juin 2007 - Dur´ee: 2 h
Documents autoris´es; le bar`eme est donn´e `a titre indicatif.
Partie “Prolog”
Exercice 1 (3 points)
Soit p/3 le pr´edicat d´efini par
p(X,Y,Z):-Z>=X,Z=<Y.
1. Donner, en une phrase, une sp´ecification de ce pr´edicat.
2. Quel est le r´esultat de la requˆete p(3,7,X). ?
3. D´efinir un pr´edicat entre(+plancher,+plafond,-r´esultat) tel que la requˆete entre(n,m,X), pour net
mentiers, donne comme r´esultats tous les entiers compris entre net m.
Par exemple:
?- entre(3,7,X).
X=3?;
X=4?;
X=5?;
X=6?;
X=7?;
no
Exercice 2 (2 point)
L’´enonc´e suivant sp´ecifie un algorithme r´ecursif bien connu:
Un entier positif ndivise un entier positif msi n≤met si ou bien n=m, ou bien ndivise m−n.
Ecrire un pr´edicat div(+diviseur,+dividende) qui implemente cet algorithme.
Exercice 3 (3 point)
1. A l’aide de entre et div, ´ecrire un pr´edicat nonpremier/1 tel que la requˆete nonpremier(n), pour n
entier non n´egatif, r´eussi si et seulement si nn’est pas un nombre premier.
2. A l’aide de nonpremier, ´ecrire un pr´edicat premier/1 qui r´eussi si et seulement si l’argument est un
nombre premier.
Exercice 4 (2 point)
1. On consid`ere le pr´edicat
premier1(X):- X>1, P is X-1, entre(2,P,Y), not(div(Y,X)).
Que calcule ce pr´edicat?
2. La primalit´e d’un nombre est une propri´et´e universelle: kest premier si pour tout entier nentre 2et
k−1,nne divise pas k
Sa n´egation est donc une propri´et´e existentielle: kn’est pas premier s’il existe un entier nentre 2et k−1,
qui divise k
Commenter bri`evement le fait que pour tester en Prolog une propri´et´e universelle Pil convient de tester
la n´egation de la n´egation de P.
1