Master d`Ingéniérie Informatique de Paris 7 M1: Prolog et

publicité
Master d’Ingéniérie Informatique de Paris 7
M1: Prolog et programmation par contraintes
Examen du 13 juin 2007 - Durée: 2 h
Documents autorisés; le barème est donné à titre indicatif.
Partie “Prolog”
Exercice 1 (3 points)
Soit p/3 le prédicat défini par
p(X,Y,Z):-Z>=X,Z=<Y.
1. Donner, en une phrase, une spécification de ce prédicat.
2. Quel est le résultat de la requête p(3,7,X). ?
3. Définir un prédicat entre(+plancher,+plafond,-résultat) tel que la requête entre(n,m,X), pour n et
m entiers, donne comme résultats tous les entiers compris entre n et m.
Par exemple:
?X = 3
X = 4
X = 5
X = 6
X = 7
no
entre(3,7,X).
? ;
? ;
? ;
? ;
? ;
Exercice 2 (2 point)
L’énoncé suivant spécifie un algorithme récursif bien connu:
Un entier positif n divise un entier positif m si n ≤ m et si ou bien n = m, ou bien n divise m − n.
Ecrire un prédicat div(+diviseur,+dividende) qui implemente cet algorithme.
Exercice 3 (3 point)
1. A l’aide de entre et div, écrire un prédicat nonpremier/1 tel que la requête nonpremier(n), pour n
entier non négatif, réussi si et seulement si n n’est pas un nombre premier.
2. A l’aide de nonpremier, écrire un prédicat premier/1 qui réussi si et seulement si l’argument est un
nombre premier.
Exercice 4 (2 point)
1. On considère le prédicat
premier1(X):- X>1, P is X-1, entre(2,P,Y), not(div(Y,X)).
Que calcule ce prédicat?
2. La primalité d’un nombre est une propriété universelle: k est premier si pour tout entier n entre 2 et
k − 1, n ne divise pas k
Sa négation est donc une propriété existentielle: k n’est pas premier s’il existe un entier n entre 2 et k − 1,
qui divise k
Commenter brièvement le fait que pour tester en Prolog une propriété universelle P il convient de tester
la négation de la négation de P .
1
Partie “Programmation par Contraintes”
Exercice 5 (2 points)
Considérez le problème suivant:
Minimiser 2 ∗ Y − X + 2 par rapport à
U = 2 + 3 ∗ Y − 2 ∗ X et
Z = 1 + 6 ∗ Y − 2 ∗ X et
X ≥ 0 et Y ≥ 0 et Z ≥ 0 et U ≥ 0
• Quel est la requète qu’on doit poser à YAP pour obtenir la valeur du minimum ?
• Le problème est déjà en forme résolue de base. Quelle est l’équation que l’algorithme simplex choisit pour
pivoter ?
• Donnez le nouveau problème après un pas de l’algorithme.
• À la fin de l’algorithme on obtient quelle minimum ? Il est obtenu avec quelles valeurs des variables ?
Exercice 6 (2 points) Considérez la contrainte suivante:
X 6= Y ∧ X = 2 ∗ Y + 2
avec domaines X : [3..9], Y : |2..7]
• Appliquez l’algorithme de borne consistance sur cette contrainte.
• Est-ce qu’avec l’arc-consistance on pourrait réduire les domaines plus ?
Exercice 7 (2 points) Appliquer l’algorithme de Fourier sur la contrainte suivante pour éliminer les variables
X1 , X2 et X3 (dans cet ordre).
X1 + 3 ≤ X4 ∧ X2 − 2 ≥ X5 ∧ X1 ≤ X2 + 1 ∧ X2 ≤ X1 + 3 ∧ 2X1 ≥ 4X3 − 2
Exercice 8 (4 points)
Le Kakuro est un jeu. Le but est de remplir les cases blanches des grilles de Kakuro en utilisant seulement
les chiffes de 1 a 9. Chaque Kakuro est composé de plusieurs bloc disposes sur des lignes et des colonnes, limités
par des cases noires, de la même manière que les mots croisés. Ces cases doivent être remplies par des chiffres
dont la somme correspond au nombre indiqué dans la case noire (en bas, pour le bloc vertical, en haut pour le
bloc horizontal). Aucun chiffre ne doit apparaı̂tre deux fois dans le même bloc. Considérez la grille suivante:
• Modélisez le problème comme un problème de satisfaction de contraintes (en donnant les variables, leurs
domaines, et les contraintes).
• Écrivez un programme en GPROLOG qui résout cette grille.
2
Téléchargement