Programmation Logique par Contraintes
CHIP
P.De Loor
Plan
• Limites de la programmation
logique
Limites de la
programmation logique
Petit programme prolog
fact(0,1).
fact(X,Y):- X2 is X-1, fact(X2,Z), Y is Z*X.
?- fact(3,X).
X = 6
?- fact(Y,6).
[WARNING: Arguments are not sufficiently instanciated]
Limites de la
programmation logique
« is » n ’est pas qu ’une unification
copie(X,Y):- X is Y.
?- copie(X,56).
[WARNING: Arguments are not sufficiently instanciated]
Exception: ( 9) _L169 is _G127 ?
Limites de la
programmation logique
Prolog ne « raisonne » pas sur les opérations
fact(0,1).
fact(X,Y):- X2 = X-1, fact(X2,Z), Y = Z*X.
?- fact(3,X).
: :
Call: (11)fact(3-1-1-1, _L195) ? creep Call: (12) 3-1-1-1==0 ? creep
Fail: (12) 3-1-1-1==0 ? creep
Limites de la
programmation logique
Petit programme CHIP
fact(0,1).
fact(X,Y):- X ^> 0,
X2 ^= X-1, fact(X2,Z), Y ^=Z*X.
?-fact(5,X).
X=120 ?
?-fact(120,Y).
Y=5 ?
Limites de la
programmation logique
Optimiser ?
maximiser(, Min, Max, Val ):- X==Max,
Y is Val.
Généralités sur la PLC
Origines
Généralités sur la PLC
Domaines d ’applications
Généralités sur la PLC
• Ré-utilisation de la
programmation logique, syntaxe prolog.
• CLP(X) concepts : J.L Lassez et J. Jaffar 87.
• Preuves :
- Les solutions trouvées sont correctes.
- Toutes les solutions sont trouvées.
CHIP
généralités
• Version industrielle de la PLC
• Prolog + contraintes
• Société COSYTEC
• Contraintes sur Domaines
• Contraintes sur Rationnels
• Contraintes Booléennes
• Classes
• Interface Oracle, C, Xwindows
• Concurrents : ILOG-SOLVER,
PROLOG IV
Domaines finis : Applications Types
• Emplois du temps
• Planification (capacités finies)
• Placement d ’objets ou de formes
• Optimisation de stratégies (jeux)
• Coloriage de cartes
• Optimisation de parcours
• Problème d ’assignation
Contraintes sur les domaines finis
• Un domaine
– est une variable X
– peut avoir plusieurs valeurs entières.
– le nombre des valeurs est fini.
– possède des bornes min et max
• Les contraintes peuvent être
– arithmétiques,
– symboliques,
Contraintes sur les
domaines finis : exemple
• Puzzle Cryptarithmétique S E N D
+ M O R E --- M O N E Y
• Chaque caractère est un chiffre (0..9)
[S,E,N,D,M,O,R,Y] :: 0..9
Contraintes sur les
domaines finis : exemple
• Les contraintes :
• Tous les chiffres sont différents
alldifferent([S,E,N,D,M,O,R,Y])
• Les nombres ne commencent pas par 0.
S^\=0, M^\=0
• L ’addition doit être satisfaite.
1000*S + 100*E + 10*N + D + 1000*M + 100*O + 10*R + E ^=
10000*M + 1000*O + 100*N + 10*E
Contraintes sur les
domaines finis : exemple
crypt :-
[S,E,N,D,M,O,R,Y]::0..9,
alldifferent([S,E,N,D,M,O,R,Y]), S#\=0, M#\=0,
1000*S + 100*E + 10*N + D + 1000*M + 100*O + 10*R + E #=
10000*M + 1000*O + 100*N +10*E + Y,
labeling([S,E,N,D,M,O,R,Y],0,first_fail, indomain), % vu après
writeln([S,E,N,D,M,O,R,Y]).
allSolutions :-findall(_,crypt,_).
Définition de domaines finis
• X est compris entre 1 et 10 X::1..10
• Liste de variables
[X1,X2,X3]::1..10
• Limite des domaines entre 0 et
100000 (couteux)
Types de domaines finis
• Suite d ’entiers consécutifs X::A..B,
(explicitement représentés en mémoire)
• Ensemble de valeurs
X::[V1, V2, V3],
(restriction a priori de domaine : grande liste = couteux)
• Intervalles
X::A:B,
(Seuls le min et le Max sont mis à jour)
(très peu couteux pour des grands domaines)
(impossibilité d ’enlever des valeurs intermédiaires)
Domaines : exemples
• wflags(64).
(force l ’affichage des domaines)?- X::1..5.
X = X in {1..5} ?
?- X::1:5.
X = X in [1..5] ?
?- X::[5,9,2] ?
X = X in {5,9,2} ?
Termes linéaires sur des domaines finis
• Un entier naturel (c)
• Un domaine (X)
• c * X ou X * c
(c : entier, X : variable)
• X + Y
• Pas de négatifs ni de signes « - »
dans un terme.
Prédicats d ’information sur les variables
• integer(X)
– réussit si X est un entier
• dvar(X)
– réussit si X est une variable à domaine fini
• dvarint(X)
– réussit si X est un entier ou une
variable à domaine fini.
Unification sur les domaines finis
• Domaine X et variable « libre » Y
– Y devient un domaine équivalent à X.
• Domaine X et entier c
– si c appartient au domaine, X devient l ’entier c – sinon échec de l ’unification (fail)
• Domaine X et Domaine Y
– calcul de leur intersection – si intersection vide, échec
– si l ’intersection est une valeur, X et Y deviennent un entier de cette valeur
– si l ’intersection est un ensemble, les domaines de X et Y sont réduits à cet ensemble
Contraintes
arithmétiques sur les domaines
X, Y : domaines
c : variable entière X #< Y
X #<= Y X #> Y X #>= Y X #= Y X #\= Y
X #\ Y + c
arithmétiques sur les domaines
• distance(X,Y,Comp,Dist)
– distance : |X-Y|
– Comp : (>,=,<) – Dist : entier
• notin(X, From, To)
– les valeurs de X ne sont pas entre From et To .
X::1..10, notin(X,5,9) . X = X in {1..4,10}?
X::1:10, notin(X,5,9).
No (more) solutions.
Contraintes symboliques sur les Domaines
allDifferent(List) atleast(N,List,V)
– au moins N de List ont la valeur V
atmost(N,List,V)
– au plus N de List ont la valeur V
maximum(X,List)
– le domaine X possède la plus grande valeur de List.
circuit(L),
- les éléments de L doivent être un circuit Hamiltonien.
38?- length(L,5), L::1..5, circuit(L),
labeling(L,0,first_fail,indomain).
L = [2, 3, 4, 5, 1] ? ; L = [2, 3, 5, 1, 4] ? ; L = [2, 4, 1, 5, 3] ? ; L = [2, 4, 5, 3, 1] ? ; L = [2, 5, 1, 3, 4] ? ; L = [2, 5, 4, 1, 3] ? ; ...
Contraintes symboliques sur les domaines
1 2
4
5
3
Contraintes symboliques sur les domaines
element(Index, List, Value)
X::0..10, element(X,[3,5,9],C).
X
X in {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
C
C in <2,5,8>
Prédicats de Choix
indomain(X)
– choix d ’une valeur de X
– par défaut : commence par la plus petite valeur du domaine.
indomain(X,Method) Method :
- min (idem que indomain/1 ) - max (la plus grande)
- middle
- 3 (un entier )
ex1(X,Y,Z):-
[X,Y,Z]::1:100, X #> Y+10,
Y #> Z + 25, indomain(X).
97?- ex1(X,Y,Z).
X = 38 Y = 27 Z = 1 ? ;
1 call(s) delayed X = 39
Y = Y in [27..28]
Z = Z in [1..2] ? ;
1 call(s) delayed X = 40
Exemple
Prédicats de choix
• Assigner une liste de valeur ?
Labeling([]).
Labeling([H|T]):- indomain(H),
labeling(T).
– Dans quel ordre évaluer les variables ?
– Quelles valeurs tester ?
Prédicats de choix
Labeling(List,Arg,Method,Pred) List : liste des variables ou terms
Arg : 0 pour liste de variable
n° du terme si liste de term
Method : voir page suivante Pred : prédicat d ’affectation,
généralement indomain mais possibilité de
configuration
Prédicats de choix
• Les heuristiques (Méthodes) d ’ordre d ’affectation :
first_fail variable de plus petit domaine, théoriquement plus rapide (petit arbre de
recherche)
most_constrained comme
first_fail mais si conflit, préférer la
variable intervenant le plus souvent dans les
contraintes, solution performante.
Prédicats de choix
smallest variable ayant la plus petite valeur de son domaine : économiser de la mémoire.
Largest l ’inverse de smallest, utiliser si l ’on connaît une valeur max possible (?) max_regret variable ayant la plus grande
différence entre la plus petite et la 2ème plus petite valeur de son domaine ->pour les variables de type cout, ce critère est une bonne mesure du « travail » qu ’il rest à
faire (convergence).
Exemple
top(L,N):-
length(L,N), L::1..N,
alldifferent(L),
labeling(L,0,first_fail, indomain).
99?- top(L,7).
L = [1, 2, 3, 4, 5, 6, 7] ? ; L = [1, 2, 3, 4, 5, 7, 6] ? ; L = [1, 2, 3, 4, 6, 5, 7] ? ; L = [1, 2, 3, 4, 6, 7, 5] ? ...
Prédicats d ’opimisation
• Recherche la meilleur solution
• Recherche rapide
(un findall est exclu)min_max(Goal, C)
Goal : prédicat à satisfaire C : liste de couts
minimise la valeur de C.
Prédicats d ’optimisation
Accélérer la recherche :
min_max(Coal, C, lower, Upper)
Une solution inférieure à lower peut être considérée optimale.
Une solution supérieure à Upper ne peut l ’être
. min_max(Coal, C, lower, Upper,
Percent)
fixe un pourcentage Percent minimum entre deux solutions qui se suivent dans la recherche.
min_max(Coal, C, lower, Upper, Percent, Timeout)
la recherche s ’arrête après Timeout secondes
Exemple
top :-
X::1..10, Y::1..10, X+2 #< Y,
min_max(labeling([X,Y],0,first_fai l,indomain),X+Y).
108?- top.
THE SOLUTION IS
labeling([1, 4], 0, first_fail, indomain)
ITS COST IS 5
min_max -> proven optimality
Exemple
travel(Cities, Costs) :-
Cities=[X1,X2,X3,X4,X5,X6,X7], Costs = [C1,C2,C3,C4,C5,C6,C7],
Cities::1..7,
element(X1,[0,205,377,581,461,878,345], C1), element(X2,[205,0,882,427,390,1105,540], C2), element(X3,[677,882,0,619,316,201,470], C3), element(X4,[581,427,619,0,412,592,570], C4), element(X5,[461,390,316,412,0,517,190], C5), element(X6,[878,1105,201,592,517,0,69], C6), element(X7,[345,540,470,570,190,691,0], C7), circuit(Cities),
min_max(labeling(Costs,0,max_regret,indomain),C1 +C2+C3+C4+C5+C6+C7).
• Xi sera la ième ville visitée
• Ci représente le coût pour aller de la ville i a j.
Exemple : pour aller de la ville 2 à la ville 3 ça
coute 882
Exemple
29?- travel(Citees,Cout).
THE SOLUTION IS
labeling([377, 205, 201, 427, 412, 69, 190], 0 ITS COST IS 1881
--- min_max -> proven optimality
Citees = [3, 1, 6, 2, 4, 7, 5]
Cout = [377, 205, 201, 427, 412, 69, 190] ? ; no (more) solutions
1 3
6 7 5
4 2
377 201
69
412 190 427
205
Contraintes globales sur domaines
diffn(+ListOfRectangle)
– Les rectangles ne doivent pas se chevaucher.
– Leur position et leur taille sont des domaines
diffn([[1,1],[3,2],[5,3]]).
– « Rectangles » à n-dimension (hypercubes)
– contraintes sur les volumes, les distances, les régions :
diffn(+Rectangles, +Min_volume, +Max_volume, +End, +Distances, +Regions)
1 2 3 4 5 6 7 8
début taille
Contraintes globales sur Domaines
• Contraintes cumulatives
– entre ensembles de domaines – basée sur un élément : tache
– répartitions (temporelle, 2D, 3D)
– 20 méthodes de résolutions conjointes
cumulative(Starts, Duration,
Resources, Ends, Surfaces, High, End, Intermediate, Interruption).
Exemple de tâche i
Taux d ’utilisation Hi
Contraintes globales sur Domaines
Exemple d ’utilisation simplifiée :
Si, Di et Ri sont des domaines à définir.
cumulative([S1,S2,…Sn], [D1,D2,…,Dn], [R1,R2,…,Rn], unused, unused,
Limit, End, unused unused).
A tout instant Ri Limit
Limit
End
• Contraintes de précédence
– precedence/5 – cumulative + #<=
• Contraintes de cycle
– cycle/2 à cycle/12 – exemple
49?- length(L,3), L::1..10, cycle(2,L), labeling(L,0,first_fail,indomain).
L = [1, 3, 2] ? ; L = [2, 1, 3] ? ; L = [3, 2, 1] ? ;
Contraintes globales sur Domaines
1
2
1
2
Contraintes globales sur domaines
Among/5
Nombre d ’occurrence de valeur dans une suite de domaines :
[X1,X2,X3, X4,X5]::1..4, K::1..5, among([1,2,K],
[X1,X2,X3,X4,X5],[0,0,0,0,0], [[1,2],[3],[1,3,4]],all),
1 ou 2 apparaissent 1 fois 3 apparaît 2 fois
1,3,4 apparaissent entre 1 et 5 fois
Contraintes globales sur les domaines
Utilisation de among
top:-
[X1,X2,X3, X4,X5]::1..4, K::1..5,
among([1,2,K],[X1,X2,X3,X4,X5], [0,0,0,0,0],[[1,2],[3],
[1,3,4]],all),
labeling([X1,X2,X3,X4,X5],0,most_c onstrained,indomain),
writeln([X1,X2,X3,X4,X5]).
94?- top.
[1, 3, 3, 4, 4]
Prédicats d ’information sur les domaines
dom(X,L)
top(L):-
X1::1..4, X1#\=2,
dom(X1,L).
37?- top(L).
L = [1, 3, 4] ?
39?- X::1..4, indomain(X), dom(X,L).
X = 1
L = [1] ? ; X = 2
L = [2] ? ;
Prédicats d ’information sur les domaines
domain_info(X,Min,Max,Size,Occ urrence,Active)
43?- X::1..4, X#\=3,
domain_info(X,Mn,Mx,S,NbO,NbA).
X = X in {1..2,4}
Mn = 1 Mx = 4 S = 3
NbO = 0 %nb de contraintes où X est utilisée NbA = 0 ? %nb contraintes utilisant X non
résolues
sur les domaines
46?- X::1..4, Y::2..6, X#\=3, X#>=Y, domain_info(X,Mn,Mx,S,NbO,NbA).
1 call(s) delayed X = X in {2,4}
Y = Y in {2..4}
Mn = 2 Mx = 4 S = 2 NbO = 1 NbA = 1 ?
47?- X::1..4, Y::2..6, X#\=3, X#>=Y,
indomain(Y), domain_info(X,Mn,Mx,S,NbO,NbA).
X = X in {2,4}
Y = 2 Mn = 2 Mx = 4 S = 2 NbO = 1 NbA = 0 ?
Prédicats d ’information
is_in_dom(X,V).
Réussi si la valeur V se trouve dans le domaine X
pc(Term).
Affiche toutes les contraintes actives sur
toutes les variables du term Term
Méthodes de recherche partielles
• Propagation conditionelle
If Cond then Pred1 else Pred2
Cond doit etre satisfait pour toutes les valeurs des domaines concernés.
• Démons de mise à jour
touched(Callback, Var, Info, Type) le prédicat Callback(Var,Info) sera appelé
lorsque la condition Type sera satisfaite (souvent utilisé avec la bibliothèque graphique XGIP)
Contraintes Rationnelles
• Les variables sont continues (nombre infini de valeurs)
• Résolution type simplex, Gauss
• Domaine d ’application
– Problèmes mathématiques
– Problèmes financiers (analyse d ’emprunt)
– utilisé de façon complémentaire
aux contraintes sur domaines
Définition de variables rationnelles
• Nombre rationnel = rapport de deux entiers a/b
• Variable rationnelle :
– toute variable utilisée dans une contrainte rationnelle est une variable rationnelle.
– Déclaration explicite :
positive(X)
allpositive(List).
Termes rationnels
• Entier ou nombre rationnel
• Variable rationnelle
• t1+t2, t1-t2 (ti sont des termes)
• -t (t est un terme)
• c*t, t*c, t/c (t : terme, c : nombre
entier ou rationnel)
Tests de type
rational(X)
réussit si X est un nombre rationnel rvar(X)
réussit si X est une variable rationnelle pvar(X)
réussit si X est une variable rationnelle positive
rlinear(X)
réussit si X est un term rationnel
linéaire
Contraintes
arithmétiques sur les rationnels
X, Y : termes rationnels
X^=Y X^>=Y X^<=Y X^>Y X^<Y
power(X,Pow,Y)( Pow : entier)
ne permet pas le calcul des racines nième (pas des rationnels)
sqrt(X,Y)
Optimisation pour termes rationnels
rmax(X)
utilisation du simplex pour trouver la valeur maximum de X
rmin(X)
valeur maximum de X
rmax2(X,Limit)
Limit est unifiée à la valeur maximum
de X, X n ’est pas unifiée.
Exemple
• Page 61 user ’s guide
Regrouper plusieurs contraintes
• But : optimiser la résolution
linear_block(List)
exemple page 62 user guide
Trouver les solutions entières
• Plus rapide que les domaines, mais moins de type de contraintes
cutting(?Obj, +List, -Ncuts,+Time) Obj : terme rationnel à minimiser
List : liste de variables
Ncuts : nombre de contraintes supplémentaires générées
Time: entier non utilisé