Cours 3 : avec contraintes PLC ESIL Université de la méditerranée Odile.Papini@esil.univ-mrs.fr http://pages-perso.esil.univmed.fr/ papini/
Plan du cours 3 1 Introduction 2 3 4
Bibliographie Livres : K. Marriott and P. Stuckey. Programming with constraints. MIT Press 1998 F. Fages. Programming Logique par contraintes. Ellipes, 1996 K. R. Apt. Principles in Constraint Programming. Cambridge Univ Press, 2003 Supports de cours : Support de cours : Gilles Pesant école polytechnique de Montréal : http ://www.cours.polyti.ca/inf6101/
Applications industrielles de la PPC Conception de matériel informatique vérification de circuits connexion des couches de circuits moins efficace que le code dédié mais plus flexible utilisateurs : Dassault, Siemens
Applications industrielles de la PPC Placement d objets placement de containers remplissage de containers utilisateurs : Michelin
Applications industrielles de la PPC Problèmes de découpage minimisation de pertes lors de la découpe de matériaux (papier, verre, bois, métaux, ) utilisateur : Dassault pour les pièces d avion performances dépendent du contexte papier : facile, programmation linéaire métaux : plus difficile, programmation par contraintes
Applications industrielles de la PPC Allocation d espace portes pour les avions quais pour les trains et les bateaux utilisateur : Aéroport CDG
Applications industrielles de la PPC Allocation de fréquences trouver des fréquences radio pour les : tèléphones portables communications radio armée,
Applications industrielles de la PPC Ordonnancement de la production planifier les tâches sur des machines dans une usine plus important succès de la PPC meilleures performances que la RO plusieurs installations commerciales librairies dédiées à l ordonnancement (ILOG scheduler)
Applications industrielles de la PPC emploi du temps emploi du temps construction d horaires de personnel : santé, commerce, usine, planification des équipages sur les avions, les trains tournée de véhicules
programmation déclarative premier langage de programmation logique : PROLOG (Luminy, 1973) basé sur la logique des prédicats premier paradigme à intégrer les contraintes
Définition un programme logique est un ensemble fini de règles de la forme : A. ou A B 1,,B n. A : tête de la règle B 1,,B n : corps de la règle A, B i pour 1 i n : atomes
vs programmation impérative programmation impérative à l origine ordinateur conçu pour calculer ne traite pas de situations non spécifiées à l avance codage d un algorithme dans un langage de programmation chaque type de question nécessite l écriture d une partie ou d un programme différent programmation logique représentation des connaissances sur un sujet dans un formalisme adéquat représentation à partir de laquelle sont déduites des rèponses aux questions de l utilisateur
vs programmation impérative programmation logique programmation impérative règle ensemble de règles question (but) preuve substitution, unification procédure programme appel de procédure exécution passage de paramètres
Langage celui du calcul des prédicats : un ensemble infini dénombrable de symboles de prédicats ou prédicats : S p un ensemble infini dénombrable de symboles fonctionnels : S F un ensemble infini dénombrables de variables : V un atome est de la forme : P(t 1,, t n ) où t 1,, t n sont des termes et P est un prédicat un terme est : une variable x un symbole fonctionnel f (constantes : symboles fonctionnels d arité 0) f (t 1,, t n ) où t 1,, t n sont des termes
programmation logique : programme logique mécanisme d inférence mécanisme d inférence : déclenché par une requête(but) fournit certaines conséquences du programme l ensemble des conséquences d un programme logique constitue sa signification (sémantique)
Trois sémantiques d un programme logique déclarative (plus petit modèle) dénotationnelle (point fixe, par chaînage avant) opérationnelle (procédurale, par chaînage arrière) (résolution SLD) les trois sémantiques sont équivalentes
sémantique déclarative d un programme logique On pose une question Q à un programme logique P sémantique déclarative : P = Q.? est-ce que Q est une conséquence logique de P? interprétation du symbole en logique des prédicats A B 1,, B n. : A B 1,, B n. programme logique P : ensemble de clauses de Horn sémantique déclarative : recherche des conséquences logiques d un ensemble de clauses de Horn
sémantique déclarative d un programme logique : conséquences logiques d un ensemble de clauses de Horn revoir le cours sur la logique des prédicats si besoin à partir d un ensemble de clauses de Horn construction d une base de Herbrand B H construction d un modèle de Herbrand on montre l existence d un plus petit modèle de Herbrand associé à un programme P : M P intersection de tous les modèles de Herbrand associés à P
sémantique déclarative d un programme logique P = Q? construction de la base de Herbrand B H correspondant à P Q B H construction du système de Herbrand S H correspondant à P P = Q ssi S H { Q} est insatisfaisable ssi S H { Q} n a pas de modèle de Herbrand ssi Q est vrai dans tous les modèle de Herbrand ssi Q M P
sémantique déclarative d un programme logique : exemple P = r? P = s? Programme logique P : p. q. r p,q. r p, q. s r. r p,s. s p, q, r.
sémantique déclarative d un programme logique : exemple P = r? P = s? Programme logique P : p. q. r p,q. r p, q. s r. r p,s. s p, q, r. univers de Herbrand U H? base de Herbrand B H? système de Herbrand B H? modèle de Herbrand de P M P?
sémantique dénotationnelle d un programme logique sémantique du point fixe : plus petite solution de I = T P (I) I : interprétation de Herbrand T P : oprérateur de transformation des interprétations de Herbrand 2 B H 2 B H I T P (I) T P (I) = {A B H B 1,, B n I }, avec A B 1,, B n inst(p) et inst(p) : ensemble des instances de P obtenu en remplaçant les variables de P par des termes de l univers de Herbrand
sémantique dénotationnelle d un programme logique une interprétation supportée de P est une interprétation I telle que : pour tout A I il existe une règle A B 1,,B n inst(p) et B 1,,B n I Soit P un programme logique et I une interprétation I est un modèle de P (noté I = P) ssi T P (I) I I est un modèle supporté de P ssi T P (I) = I sémantique du point fixe : définition constructive du plus petit modèle de Herbrand
sémantique dénotationnelle d un programme logique : exemple P = r? P = s? Programme logique P : p. q. r p,q. r p, q. s r. r p,s. s p, q, r.
sémantique dénotationnelle d un programme logique : exemple P = r? P = s? Programme logique P : p. q. r p,q. r p, q. s r. r p,s. s p, q, r. I? point fixe de T P (I) = I? construction du modèle de Herbrand de M P, r M P? s M P?
sémantique opérationnelle d un programme logique : résolution transformation de P en clauses de Horn puis Résolution (à la Robinson) SLD résolution (Résolution avec règle de sélection) règle de simplification des buts qui procède par unification avec les têtes des règles du programme variante du principe de résolution de Robinson principe d inférence complet pour la logique des prédicats
sémantique opérationnelle d un programme logique P un programme logique : relation de re-écriture des buts : plus petite relation satisfaisant au principe de résolution SLD (A A 1,,A n )Θ P σ UP(B i,a) (B 1,,B i,,b k ) (B 1,,B i 1,A 1,,A n,b i+1,,b k )σ Θ : substitution de renommage pour éviter les conflits de variables : Var(A,A 1,,A n ) Var((B 1,,B i,,b k ) = but sélectionné : B i but résolvant : (B 1,,B i 1,A 1,,A n,b i+1,,b k )σ unificateurs principaux de B i et A : UP(B i,a)
sémantique opérationnelle d un programme logique une étape de la SLD résolution : G i, C, σ G ième atome du but de la règle C du programme P : le but vide
sémantique opérationnelle d un programme logique : exemple P = p(x)? Programme logique P : R1 p(0). R2 p(s(s(x))) p(x).
sémantique opérationnelle d un programme logique : exemple P = p(x)? Programme logique P : R1 p(0). R2 p(s(s(x))) p(x). But : p(x), on renomme x avec Θ(x) = x 1 on obtient p(x 1 ) : avec R1 on l unifie avec p(0) donc σ 1 = {x 1 0} p(x 1 ) 1, R1, σ1 avec R2 on l unifie avec p(s(s(x))) avec σ 2 = {x 1 s(s(x 2 ))} p(x 1 ) 2, R2, σ2 1, R1, σ1
sémantique opérationnelle d un programme logique dérivation SLD une dérivation SLD pour un but G : suite finie ou infinie de buts G j, j 0, de variantes de règles C j de P, de substitutions σ j tels que : G 0 = G et pour tout j 0 : G j ij, C j, σ j G j+1
sémantique opérationnelle d un programme logique : exemple P = r? P = s? Programme logique P : p. q. r p,q. r p, q. s r. r p,s. s p, q, r.
sémantique opérationnelle d un programme logique réfutation SLD une réfutation SLD pour un but G : est une dérivation SLD finie qui se termine avec le but vide : G ij, C j, σ j G 1 in, C n, σ n
sémantique opérationnelle d un programme logique stratégies de sélection 2 sources de non-déterminisme : choix du but à résoudre choix de la règle à utiliser procédure de résolution SLD comporte : stratégie de sélection qui fixe : le choix du but à résoudre stratégie de recherche qui fixe : le choix de la règle à utiliser à chaque étape stratégie de recherche est complète si tous les choix de règles pour résoudre un but donné sont employés Programmation aprés unpar nombre contraintes fini d étapes
construction d un arbre de dérivation SLD un arbre de dérivation SLD pour un but G est un arbre étiqueté par des buts tels que i) la racine est étiqueté par G ii) les noeuds étiquetés par le but vide sont des feuilles iii) les noeuds étiquetés par un but (A 1,,A i,,a n ), n 0, où A i est l atome sélectionné ont autant de fils qu il ya de résolvantes du but avec A i. Un but déterministe est but qui étiquette un noeud qui n a qu un seul successeur
Langage de programmation PROLOG construit sur une implantation de la résolution SLD : la liste des buts à résoudre est gérée par une pile : stratégie de sélection des buts le but le plus à gauche stratégie de recherche exploration de l arbre de dérivation en profondeur d abord variables : commencent par une lettre majuscule ou par le caractère règles : A :- B 1,,B n. faits : A. buts :?- A 1,,A m.
exemple de programme PROLOG (syntaxe GNU PROLOG) arc(a, b). arc(b, c). chemin(x, Y) :- arc(x, Y). chemin(x, Y) :- arc(x, Z), chemin (Z, Y). but :?- chemin(a, c).
Syntaxe GNU PROLOG : http : \\www.gprolog.org/ manual variables : chaînes alphanumériques commençant par une majuscule constantes : entiers ou flottants, chaînes de caractères entre guillemets, chaînes alphanumériques commençant par une minuscule fonctions : chaînes alphanumériques commençant par une minuscule prédicats : chaînes alphanumériques commençant par une minuscule exemples repas(x, Y, Z) :- hors doeuvre(x), plat(y), dessert(z). hors doeuvre(melon). repas(melon, X, Y).
quelques prédicats prédéfinis sur les termes en GNU PROLOG (=)/2 : termes unifiables (\ =)/2 : termes non unifiables (==)/2 : termes égaux (\ ==)/2 : termes différents exemple plat vegetarien(x) :- plat(x), X \ == roti), X \ == steak.
quelques prédicats prédéfinis pour les expressions arithmétiques en GNU PROLOG (is)/2 : évaluation d expression arithmétique (+)/2, ( )/2, ( )/2, (/)/2, (mod)/2 : opérations sur les expressions arithmétiques (=:=)/2 : égalité d expressions arithmétiques (= \ =)/2 : inégalité d expressions arithmétiques (=<)/2, (<)/2, (>=)/2, (>)/2, : comparaisons d expressions arithmétiques. exemple nat(0). nat(n) :- Nat(N1), N is N1 + 1.
listes en GNU PROLOG exemple : liste de 4 entiers : [1,2,3,4] liste vide : [ ] liste : [X Y] X : tête de liste Y : queue de liste exemples de manipulation de listes parcours de liste construction directe de liste construction indirecte de liste
listes en GNU PROLOG liste : arbre particulier : peigne dessin liste : [X Y], X : tête de liste, Y : queue de liste liste : [X 1, X 2, Y] X 1 : premier élément, X 2 : second élément, Y : queue de liste liste : [X 1, X 2,, X n Y] X 1 : premier élément,, X n : nième élément, Y : queue de liste
parcours de listes en PROLOG algorithme du parcours récursif d une liste fonction parcours(l : liste) début si L = [ ] alors arrêt sinon écrire X parcours(y) finsi fin
parcours de listes en PROLOG programme PROLOG de parcours d une liste parcours([ ]). condition d arrêt de la récursivité parcours([x Y]) :- write(x), parcours(y). appel récursif
construction directe de listes en PROLOG algorithme de contruction de la liste des éléments de rang pair (L a un nombre pair d éléments) : fonction rang pair(l, L : listes) début si L = [ ] alors L = [ ] sinon L = [Y U] rang pair(l, U) finsi fin
construction directe de listes en PROLOG construction directe d une liste d éléments de rang pair rang pair([ ],[ ]). condition d arrêt de la récursivité rang pair([x,y L], [Y U]) :- rang pair(l, U). appel récursif
construction directe de listes en PROLOG construction dans la descente de la récursivité 2 listes : liste initiale, liste résultat construction dans la tête de règle construction des èléments dans l ordre
construction indirecte de listes en PROLOG algorithme d inversion de liste : fonction renverse(l, L, R : listes) début si L = [ ] alors R = L sinon renverse(y, L, R) L = [X L] finsi fin
construction indirecte de listes en PROLOG construction indirecte d une liste d éléments dans l ordre inverse renverse([ ], L, L). condition d arrêt de la récursivité renverse([x Y], L, R) :- renverse(y, [X L], R). appel récursif
construction indirecte de listes en PROLOG construction dans la remontée de la récursivité construction dans le corps de règle 3 listes : liste initiale, liste auxiliaire, liste résultat construction des èléments dans l ordre inverse
prédicat de coupure :! prédicat de coupure (ou cut ) dans la règle : A A 1,,A m,!,b 1,,B n abandon des choix restant sur A,A 1,,A m lorsque le prédicat de coupure est sélectionné
prédicat de coupure : exemple hors doeuvre(melon). hors doeuvre(celeri). viande(roti). poisson(sole). dessert(fruit). viande(steak). poisson(rouget). dessert(flan). plat(x) :- viande(x). plat(x) :- poisson(x). repas(x, Y, Z) :- hors doeuvre(x), plat(y), dessert(z). buts : repas(melon, Y, Z),!. repas(celeri, Y, Z), poisson(y),!.
Utilisation du prédicat de coupure :! expression conditionnelle : si alors sinon : début si X mod 2 = 0 alors écrire ( pair ) sinon écrire ( impair ) finsi fin parite(x) :- Y is X mod 2, Y is 0,!, write( pair ). parite(x) :- write( impair ).
par contraintes : PLC par contraintes : intégration de solveur de contraintes naturelle en PROLOG PROLOG peut être considéré comme un langage de programmation par contrainte : domaine des variables : univers de Herbrand contraintes : égalité entre termes
par contraintes : PLC PROLOG : langage de programmation par contraintes : exemple p(x, Y, Z) :- Z is X+Y.?- p(3, 4, Z). Z = 7?- p(x, 4, 7). ERREUR MAIS
par contraintes : PLC par contraintes : généralisation de la programmation logique mécanisme d inférence + solveur de contraintes enrichit le domaine du discours contraintes dans : le programme le but la question
par contraintes : PLC par contraintes : généralisation de la programmation logique considérer d autres structures mathématiques S que l univers de Herbrand généralisation de la résolution SLD remplacer l unfication sur les termes par la résolution de contraintes dans S formules logiques : clause de Horn de la forme A c 1,, c m B 1,, B n c i, 1 i m : contraintes B j, 1 j n : atomes définition d une classe de langages de programmation PLC(S)
par contraintes : PLC Langage des contraintes langage du premier ordre défini par : un ensemble dénombrable de symboles de prédicats ou prédicats : S C (contenant true et =) un ensemble dénombrable de symboles fonctionnels : S F un ensemble infini dénombrable de variables : V contrainte atomique : proposition atomique de ce langage ensemble de contraintes basiques : ensemble de formules du premier ordre contenant des contraintes atomiques et fermé par renommage des variables langage de contraintes : fermeture par conjonction et quantification existentielle de l ensemble des contraintes basiques
par contraintes : PLC Interprétation du langage de contraintes choix d une structure mathématique S = (D,E,O,R) où : D : domaine E : E D : associés à chaque symbole de constante, notés [c] pour c S F d arité 0 O : ensemble d opérateurs sur D associés à chaque symbole de fonction notés [f ] : D n D pour tout f S F d arité n R : ensemble de relations sur D associés à chaque symbole de prédicat notés [p] : D n {0,1} pour tout p S C d arité n
par contraintes : PLC Interprétation du langage de contraintes S-valuation : fonction ρ : V D cρ : proposition dont la valeur de vérité est déterminée par S si S = cρ alors ρ est une solution de c c est satisfaisable si c admet une solution dans S
par contraintes : PLC Complétude pour la satisfaction des contraintes On suppose que dans S le problème de la satisfaisabilité des contraintes est décidable ( c, soit S = (c) soit S = (c)) S est représenté par une théorie axiomatique T définie sur l alphabet vérifiant S = T (correction) soit T (c), soit T = (c) (complétude pour la satisfaction des contraintes) S = (c) ssi T (c)
par contraintes :PLC(S) Programmes PLC(S) un programme logique est constitué de : règles de la forme : A c 1,,c m B 1,,B n A : tête de la règle c 1,,c m B 1,,B n, m 0, n 0 : corps de la règle A, B j pour 1 j n : atomes c i 1 i m : contraintes basiques atome : proposition atomique formé sur S P, S F et V, S P S C =
par contraintes :PLC(S) sémantique déclarative(plus petit modèle) opérationnelle (procédurale, par chaînage arrière) (résolution CSLD)
par contraintes :PLC(S) différentes classes de langages de programmation logique par contraintes LPC(H), univers de Herbrand : Prolog LPC(T R), termes rationnels : Prolog II LPC(λ) : λ-prolog LPC(R) : réels : Prolog IV LPC(B) : booléens LPC(FD) : domaines finis : CHIP, Gnu-Prolog
par contraintes : PLC par contraintes : différents solveurs CHIP Eclipse PROLOG IV Gnu-Prolog
par contraintes :PLC(F D) Solveur Gnu-Prolog résolution des contraintes par propagation : consistance d arc types de contraintes : arithmétiques booléenes symboliques
par contraintes :PLC(F D) prédicats prédéfinis en Gnu-Prolog site web de Gnu-Prolog : http : //www.gprolog.org/ documentation : http : //www.gprolog.org/ manual (chapitre 8) différents types de prédicats : variables sur les domaines finis contraintes sur les domaines finis arithmétiques booléenes symboliques résolution
par contraintes :PLC(F D) conventions de description de prédicats prédéfinis en Gnu-Prolog designation : nom prédicat/arité description partie schéma d appel : mode et type de chaque argument mode : + instancié à l appel mode : - non instancié à l appel, mode :? instancié à l appel types : terme, variable, variable FD, liste de X partie description partie exemple
Prédicats prédéfinis en Gnu-Prolog définition d intervalle designation : fd max integer/1 schéma d appel : fd max integer(?integer) intrevalle : 0.. fd max integer
Prédicats prédéfinis en Gnu-Prolog variables sur les domaines finis designation : fd domain/3 schéma d appel : fd domain(+liste de variables FD,+entier,+entier) ou fd domain(?variable FD,+entier,+entier) description : fd domain(l,min,max) ou fd domain(x,min,max)
Prédicats prédéfinis en Gnu-Prolog variables sur les domaines finis : exemple modélisation CSP du problèmes des 4 reines : fd domain([x1,x2,x3,x4],1,4) ou fd domain(x1,1,4), fd domain(x2,1,4), fd domain(x3,1,4), fd domain(x4,1,4)
Prédicats prédéfinis en Gnu-Prolog variables sur les domaines finis designation : fd domain/2 schéma d appel : fd domain(+liste de variables FD,+liste d entiers) ou fd domain(variable FD,+liste d entiers) description : fd domain(l,valeurs) ou fd domain(x,valeurs) (Valeurs : liste de valeurs)
Prédicats prédéfinis en Gnu-Prolog contraintes arithmétiques : consistance d arc partielle Expr1 et Expr2 : deux expressions arithmétiques égalité : Expr1 = Expr2 inégalité : Expr1 \ = Expr2 inférieur : Expr1 < Expr2 inférieur ou égal : Expr1 =< Expr2 supérieur : Expr1 > Expr2 supérieur ou égal : Expr1 >= Expr2
Prédicats prédéfinis en Gnu-Prolog contraintes arithmétiques : consistance d arc totale Expr1 et Expr2 : deux expressions arithmétiques égalité : Expr1 = Expr2 inégalité : Expr1 \ = Expr2 inférieur : Expr1 < Expr2 inférieur ou égal : Expr1 =< Expr2 supérieur : Expr1 > Expr2 supérieur ou égal : Expr1 >= Expr2
Prédicats prédéfinis en Gnu-Prolog contraintes booléennes Expr1 et Expr2 : deux expressions booléennes équivalence : Expr1 <=> Expr2 non équivalence : Expr1 \ <=> Expr2 non : Expr1 \ Expr2 ou : Expr1 \/ Expr2 ou exclusif : Expr1 Expr2 supérieur ou égal : Expr1 /\ Expr2
Prédicats prédéfinis en Gnu-Prolog contraintes de cardinalité : contraintes sur le nombre de contraintes satisfaites fd cardinality/2 fd cardinality/3 fd at least one/1 fd at most one/1 fd only one/1
Prédicats prédéfinis en Gnu-Prolog contraintes symboliques fd all different/1 : contraint les variables de la liste à prendre des valeurs différentes 2 à 2 fd relation/2 : définition des contraintes en extension fd element/3 : contraint une variable à prendre une valeur de rang donné dans une liste fd element var/3 : contraint une variable à prendre une valeur fd atmost/3 : contraint au moins une variable à prendre une valeur dans une liste de valeurs fd atleast/3 : contraint au plus une variable à prendre une valeur dans une liste de valeurs fd exactly/3 : contraint exactement une variable à prendre une valeur dans une liste de valeurs
Prédicats prédéfinis en Gnu-Prolog résolution designation : fd labeling/1 schéma d appel : fd labeling(+liste de variables FD) description : fd labeling(l) : affecte une valeur à chaque variable FD de L afin de satisfaitre toutes les contraintes exemple Problème des 4 reines : déclaration des 4 variables X1, X2, X3 et X4 écriture des contraintes sur X1, X2, X3 et X4 rechercher d une solution : fd labeling([x1,x2,x3,x4])
Prédicats prédéfinis en Gnu-Prolog résolution designation : fd labeling/2 schéma d appel : fd labeling(+liste de variables FD,+liste d options) description : fd labeling(l,o) : affecte une valeur à chaque variable FD de L afin de satisfaitre toutes les contraintes. O : liste d options pour l ordre d affectation des variables exemple Problème des 4 reines résolution avec heuristique echec-d abord : fd labeling([x1,x2,x3,x4],[variable method(first fail)])
PLC(FD)avec Gnu-Prolog Méthodologie définir le(s) domaine(s) fini(s) et déclarer les variables description des contraintes résolution exemple problem([x, Y, Z]) :- fd domain(x, 0, 5), fd domain([y,z], 3, 7), X+Y < 2 * Z, fd labeling([x, Y, Z],[]).
PLC(FD) avec Gnu-Prolog Exemple problem([x, Y, Z]) :- fd domain(x, 0, 5), fd domain([y,z], 3, 7), X+Y < 2 * Z, fd labeling([x, Y, Z],[]).?- problem(l).?- L = [0, 3, 3]?;?- L = [0, 3, 4]?;?- L = [0, 3, 5]?;