You are on page 1of 13

1/24/11

Prolog Programmation par contraintes

Adrien Coulet
adrien.coulet@loria.fr LORIA, bureau B156

3A IL 2010/2011

Programmation par contraintes


n

"Constraint programming represents one of the closest approaches computer science has yet made to the Holy Grail of programming: the user states the problem, the computer solves it."

1/24/11

Les contraintes
n

relation logique entre plusieurs variables inconnues chaque variable ne peut prendre qu'une valeur appartenant un ensemble donn, appel le domaine => Ansi les valeurs que peuvent prendre les variables d'une contrainte sont restreintes relationnelle = non dirige
n n

z = x + 2y on peut dtrminer z si x et y sont connus ou y si x et z sont connus z = x + 2 est d'arit binaire

arit = nombre de variables


n

dclarative (on dcrit les contraintes, pas la faon de rsoudre le problme)

Dfinition d'une contrainte


n n

C'est une relation entre diffrentes variables. Cette relation peut tre dfinie en extension ou en intension
n n

Exemple de contrainte : "x est plus petit que y" en intention, on utilise des proprits mathmatiques :
n

x<y

en extension, on numre les tuples de valeurs appartenant la relation : Domaines (x et y) = {1,2}


n n

(x=0 et y=1) ou (x=0 et y=2) ou (x=1 et y=2) (x,y) lment-de {(0,1),(0,2),(1,2)

1/24/11

Les contraintes
n

plusieurs types
n

contraintes numriques sur les entiers n sur les rels n linaires n non linaires contraintes boolennes
n

n n n

contraintes sur des ensembles contraintes de Herbrand galit ou disgalit entre 2 termes arborescents n exemple : l'unification en Prolog
n

Les problmes de satisfaction de contraintes


n

les CSP : Constraints Satisfaction Program Un CSP = un triplet (V,D,C) un ensemble de variables V = {V1,V2, V3, ..., Vn}

Une fonction qui associe chaque variable Vi sont domaine D(Vi) un ensemble de contraintes entre ces variables C = {C1, C2, C3, ..., Ck} N.b. : Cj dcrit des contraintes entre en sous ensemble des variables de V

1/24/11

Les problmes de satisfaction de contraintes


n

Solution d'un CSP :


n

Affectation A = { (V1,val1), (V2,val2), ..., (Vr,valr) } totale ou n partielle Violation de contrainte


n

A viole une contrainte Ck si toutes les variables de Ck sont instancies dans A n et si la relation dfinie par Ck n'est pas vrifie pour les valeurs des variables de Ck dfinies dans A Une affectation est inconsistante ou consistante selon si elle viole ou non une contraintes (ou plusieurs contraintes)
n

Une solution est une affectation totale consistante

Les problmes de satisfaction de contraintes

Algorithme gnre et teste


n

gnrer l'ensemble des affectations possibles et s'arrter ds que l'on en trouve une qui satisfasse les contraintes peu efficace (explosion combinatoire)

1/24/11

Les problmes de satisfaction de contraintes


n

Exemple
V = {X,Y} D(X) = D(Y) = {1,2} C1 = {X > 1} C2 = {X Y}

S = {} S = {X = 1} S = {X = 1, Y = 1} S = {X = 1, Y = 2} S = {X = 2} S = {X = 2, Y = 1} S = {X = 2, Y = 2}

S = {X = 1} et S = {X = 2} ont des instanciations partielles S = {X = 1} est inconsistante car elle ne satisfait pas la C1

Les problmes de satisfaction de contraintes


n

Algorithme simple retour arrire


n

si une affectation est inconsistante alors on arrte l'exploration de cette voie retour arrire jusqu' la premire affecation partielle consistante (backtracking)
S = {} S = {X = 1} S = {X = 2} S = {X = 2, Y = 1} S = {X = 2, Y = 2}

1/24/11

Les problmes de satisfaction de contraintes


n

Algorithme par anticipation (look ahead)


n

si une variable non affecte n'a plus de valeur dans son domaine qui soit consistante avec l'affectation partielle alors on fait un retour arrire directe chaque tape, on filtre le domaines des variables non affectes = on enlve les valeurs qui sont inconsistantes avec la solution partielle filtrage simple (ou 1-consistance) : on numre les affectations possibles et on supprime celles qui sont inconsistantes n filtrage k-consistance : on vrifie que quelque soit l'affectation des variables V2, .., Vk, la valeur v de D (V1) est impossible
n

Les problmes de satisfaction de contraintes


n

Exemple
V = {X,Y} D(X) = D(Y) = {1,2} C1 = {X Y}

S = {} S = {X = 1} S = {X = 1, Y = 1} S = {X = 1, Y = 2} S = {X = 2} S = {X = 2, Y = 1} S = {X = 2, Y = 2}

Non explore car le domaine de Y a t rduit {2}

Non explore car le domaine de Y a t rduit {1}

1/24/11

Les problmes de satisfaction de contraintes


n

Utilisation d'heuristiques
n

instanciation des variables dans un ordre plus performant instancier en premier les variables les plus critiques statique : de la variable intervenant dans le plus de contraintes celle intervenant dans le moins de contraintes n dynamique, chec d'abord : chaque tape, on instancie la variable dont le domaine est le plus petit
n

En Prolog
n

Variables sur domaine fini : valeur entire, positive ou nulle Cd? quel domaine de valeur ?
n

Le domaine initial (c' est aussi le plus grand possible avec Prolog) : les entiers entre 0 et fd_max_integer
| ?- fd_max_integer(X). X = 268435455

On peut rduire le domaine : n fd_domain/3 : limite une variable ou une liste de variables entre 2 bornes donnes n fd_domain/2 : limite une variable ou une liste de variables une liste d'entiers donns
| ?- fd_domain([X,Y],[5,9,52]). X = _#2(5:9:52) Y = _#35(5:9:52) yes

| ?- fd_domain(X,1,4). X = _#3(1..4) yes | ?- fd_domain([X,Y],1,4). X = _#3(1..4) Y = _#25(1..4) yes

1/24/11

En Prolog
n

Variables sur domaine fini (suite)


n

fd_min/2 : connatre la plus petite valeur du domaine d'une variable fd_max/2 : connatre la plus grande valeur du domaine d'une variable fd_size/2 : cardinalit du domaine d'une variable fd_dom/2 : valeurs du domaine d'une variable domaine initial : entier entre 0 et fd_max_integer
| ?- fd_domain(X,2,5),fd_min(X,Z),fd_max(X,U),fd_size(X,W),fd_dom(X,T). T = [2,3,4,5] U=5 W=4 X = _#3(2..5) Z=2

n n n

En Prolog : contraintes arithmtiques sur des variable FD


n

Consistance d'arc totale : 2-consistante Consistance d'arc partielle : plus faible car considres des contraintes sur des intervalles de valeurs et les vrification ne sont faites que sur les bornes Contraintes arithmtiques (partielle et totale)
n n n

galit : V1 #= V2, V1 #=# V2 diffrence : V1 #\= V2, V1 #\=# V2 ingalits V1 #< V2, V1 #<# V2 n V1 #> V2, V1 #># V2 n V1 #=< V2, V1 #=<# V2 n V1 #>= V2, V1 #>=# V2
n

1/24/11

En Prolog
n

fd_labeling(L) : affecte une valeur chaque variable de la liste L (Prolog affecte les valeurs dans l'ordre de la liste)
?- L = [X,Y,Z], fd_domain(L,1,3),X#\=Y,Z #> Y, fd_labeling(L). L = [1,2,3] X=1 Y=2 Z=3?; L = [2,1,2] X=2 Y=1 Z=2?; L = [2,1,3] X=2 Y=1 Z=3?; L = [3,1,2] X=3 Y=1 Z=2?; L = [3,1,3] X=3 Y=1 Z=3?; L = [3,2,3] X=3 Y=2 Z=3 yes

En Prolog
n

Contraintes boolennes
n n n

1 = vrai, 0 = faux les variables doivent avoir un domaine inclus dans [0,1]... ... ou tre une contrainte elle-mme :
n n n n n n n

quivalence : E1 #<=> E2 non quivalence : E1 #\<=> E2 implication : E1 #==> E2 non logique : #\E1 ou logique : E1 #\/ E2 ou exclusif : E1 ## E2 et logique : E1 #/\ E2

1/24/11

En Prolog
n

un exemple :
| ?- L = [X,Y,Z], fd_domain(L,1,2),X#=Y ,Z #> 1, fd_labeling(L). L = [1,1,2] X=1 Y=1 Z=2?; L = [2,2,2] X=2 Y=2 Z=2 | ?- L = [X,Y,Z], fd_domain(L,1,2),X#=Y #<=> Z #> 1, fd_labeling(L). L = [1,1,2] X=1 Y=1 Z=2?; L = [1,2,1] X=1 Y=2 Z=1?; L = [2,1,1] X=2 Y=1 Z=1?; L = [2,2,2] X=2 Y=2 Z=2

En Prolog
n

Contraintes symboliques = poser des contraintes symboliques, sur des ensembles de variables
n

fd_all_different/1 : fd_all_different(L) contraint toutes les variables de la liste L avoir des valeurs diffrentes
| ?- L = [X,Y], fd_domain(L,1,2),fd_all_different(L), fd_labeling(L). L = [1,2] X=1 Y=2?; L = [2,1] X=2 Y=1

fd_atmost/3 : fd_atmost(N,L,V) V est affecte au plus N variables de L

10

1/24/11

En Prolog
n

Contraintes symboliques
n

fd_atleast/3 : fd_atleast(N,L,V) V est affecte au moins N variables de L fd_exactly/3 : fd_exactly(N,L,V) V est affecte exactement N variables de L
| ?- L = [X,Y,Z], fd_domain(L, 1,3),fd_exactly(2,L,2), fd_labeling(L). L = [1,2,2] X=1 Y=2 Z=2?; L = [2,1,2] X=2 Y=1 Z=2?; L = [2,2,1] X=2 Y=2 Z=1?; L = [2,2,3] X=2 Y=2 Z=3?; L = [2,3,2] X=2 Y=3 Z=2?; L = [3,2,2] X=3 Y=2 Z=2

En Prolog
n

Contraintes symboliques
n

fd_relation/2 : fd_relation(L1,L2) contraint la liste de variables L2 tre gale la liste d'entiers L1 permet de dfinir des contraintes en extension, en donnant explicitement les listes de valeurs que peut prendre une liste de variables

| ?- L = [X,Y,Z], fd_domain(L,1,3),fd_relation([[1,1,1],[1,2,3]],L), fd_labeling(L). L = [1,1,1] X=1 Y=1 Z=1?; L = [1,2,3] X=1 Y=2 Z=3 yes

11

1/24/11

Un cryptarithme
n

Chaque lettre reprsente un chiffre diffrent L'opration suivante doit tre valide :
SEND +MORE MONEY

On dfinit la liste de variables et leur domaine (chiffres) :


V = [S,E,N,D,M,O,R,Y], fd_domain(V,0,9)

Chaque lettre est un chiffre diffrent et chaque premier chiffre ne peut pas tre zro
fd_all_different(V), S #\= 0, M#\= 0

On dfinit chaque nombre comme un terme complexe


Send = 1000 * S + 100 *E + 10 * N + D More = 1000 * M + 100 * O + 10 *R +E Money = 10000*M + 1000 * O + 100* N + 10 *E + Y

Un cryptarithme
n

On utilise ensuite une contrainte arithmtique qui utiliserons les termes en tant qu'oprations mathmatiques
Send + More #= Money

Au final :
| ?- V = [S,E,N,D,M,O,R,Y], fd_domain(V,0,9), fd_all_different(V), S #\= 0, M#\= 0, Send = 1000 * S + 100 *E + 10 * N + D, More = 1000 * M + 100 * O + 10 *R +E, Money = 10000*M + 1000 * O + 100* N + 10 *E + Y, Send + More #= Money, fd_labeling(V). D=7 E=5 M=1 Money = 10000*1+1000*0+100*6+10*5+2 More = 1000*1+100*0+10*8+5 N=6 O=0 R=8 S=9 Send = 1000*9+100*5+10*6+7 V = [9,5,6,7,1,0,8,2] Y=2?;

12

1/24/11

Conclusion

Prolog est un solveur de contraintes sur le domaine de Herbrand Gnu-Prolog propose une extension sur les domaines finis en gnral
n

diffrents type de contraintes : arithmtiques, boolennes ou symboliques utilise en gnral la 2-consistance on peut aussi utiliser l'heuristique chec d'abord
n

n n

fd_labeling(V,variable_method(first_fail))

13

You might also like