Satisfiabilité

I/ 2-SAT

1) Exemple

Sur l'île au trésor, il y a trois habitants :Alice, Bob et Carole. En bon chasseur de trésor, vous essayez de savoir où creuser. Mais vous n'avez pas le temps de mener un long interrogatoire sur chacun des habitants et vous avez besoin de savoir qui sait où est le trésor. Vous savez pour l'instant que :

2) 2-satisfiabilité

En notant les propositions suivantes

Texte françaisFormule propositionnelle
Alice connaît l'emplacement du trésora
Bob connaît l'emplacement du trésorb
Carole connaît l'emplacement du trésorc
Alice ignore l'emplacement du trésor¬a
Bob ignore l'emplacement du trésor¬b
Carole ignore l'emplacement du trésor¬c

Alors les quatre propositions de l'énoncé s'écrivent a ∨ b, ¬b ∨ ¬c, ¬a ∨ c et a ∨ c. Comme chacune d'entre elles ne fait intervenir que deux variables propositionnelles, résoudre ce problème fait partie de la classe 2-SAT.

Il s'agit d'un problème de satisfiabilité car on veut savoir s'il existe une valuation des variables propositionnelles a, b et c qui satisfasse la formule (a ∨ b) ∧ (¬b ∨ ¬c) ∧ (¬a ∨ c) ∧ (a ∨ c). Autrement dit, cette formule a-t-elle un modèle ?

%3 r s r--s t r--t u s--u v s--v w t--w x t--x a1 a u--a1 b1 b u--b1 n1 ¬ v--n1 n2 ¬ v--n2 n3 ¬ w--n3 c1 c w--c1 a2 a x--a2 c2 c x--c2 b2 b n1--b2 c3 c n2--c3 a3 a n3--a3

3) Méthode d'Emil Post

En 1921, Emil Post propose un algorithme pour résoudre les problèmes SAT : on met dans un tableau les valuations possibles ⊥ et ⊤ des variables a, b et c et on calcule les valeurs de la formule φ pour chacune de ces valuations. Avec 3 variables cela fait 23=8 lignes dans le tableau de Post 

abc¬a¬b¬ca ∨ b¬b ∨ ¬c¬a ∨ ca ∨ cφ

Il n'y a qu'une seule ligne (en gras) où la colonne de φ comporte ⊤, mais il y en a une : si φ n'est pas valide, elle est tout de même satisfaite par la valuation (⊤,⊥,⊤). On note

(a=⊤,b=⊥,c=⊤) ⊨ (a ∨ b) ∧ (¬b ∨ ¬c) ∧ (¬a ∨ c) ∧ (a ∨ c)

ou

(a=⊤,b=⊥,c=⊤) ⊨ φ

Comme pour n variables propositionnelles, il y a 2n lignes dans le tableau, l'algorithme de Post est de complexité exponentielle.

4) Méthode de Quine

L'algorithme de Quine-McCluskey consiste à construire un arbre de déduction, avec un embranchement pour chaque variable (qui peut prendre les valeurs ⊥ et ⊤ ce qui fait que l'arbre est binaire). Par exemple,

En convenant d'aller vers la gauche si a=⊥ et vers la droite si a=⊤, on obtient l'arbre suivant, dans lequel on a des expressions plus faciles à évaluer :

%3 r (a∨b)∧(¬b∨¬c)∧(¬a∨c)∧(a∨c) s r--s t ¬b∧c r--t

À gauche on a ⊥ indépendamment des valeurs de vérité de b et c, donc on n'a aucune chance de trouver un modèle de φ à gauche. Mais à droite on crée une nouvelle bifurcation selon que b=⊥ (à gauche) ou b=⊤ (à droite).

%3 r (a∨b)∧(¬b∨¬c)∧(¬a∨c)∧(a∨c) s r--s t ¬b∧c r--t u c t--u v t--v

Pour compléter l'arbre binaire, il reste à faire la même chose pour c : bifurquer selon que c=⊥ (à gauche) ou c=⊤ (à droite) :

%3 r (a∨b)∧(¬b∨¬c)∧(¬a∨c)∧(a∨c) s r--s t ¬b∧c r--t u c t--u v t--v w u--w x u--x

Une fois cet arbre calculé, on peut savoir si φ est valide (pour cela il faut et il suffit que toutes les feuilles soient ⊤, ce qui n'est pas le cas ici) et on peut savoir aussi si φ est satisfiable : pour cela il suffit qu'une des feuilles soit ⊤. C'est le cas ici :

%3 r (a∨b)∧(¬b∨¬c)∧(¬a∨c)∧(a∨c) s r--s t ¬b∧c r--t u c t--u v t--v w u--w x u--x

On voit ici non seulement que φ est satisfiable (la feuille verte) mais aussi pour quelle valuation. Pour aller à la feuille, on va successivement

  1. à droite (a=⊤),
  2. à gauche (b=⊥)
  3. à droite (c=⊤).

5) Méthode de Gentzen

La déduction naturelle sert à prouver non seulement la satisfiabilité d'une formule, mais sa validité. On a vu dans le (2) que la formule φ n'est pas valide (par exemple elle est invalidée si Alice, Bob et Carole connaissent tous les trois l'emplacement du trésor). Mais montrer qu'une formule est satisfiable, c'est montrer que sa négation est invalide.

6) Méthode de Davis et Putnam

Aller sur ce site et y coller le texte suivant :

((a or b) and (a or c) and ((not a) or c) and ((not b) or (not c)))

puis cliquer sur « check for satifiability » pour voir le résultat.

7) Graphe d'implication

Les termes de φ sont des disjonctions. On peut les transformer en implications :

DisjonctionImplicationContraposée
a ∨ b¬a → b¬b → a
¬b ∨ ¬cb → ¬cc → ¬b
¬a ∨ ca → c¬c → ¬a
a ∨ c¬a → c¬c → a

Cette relation d'ordre partiel peut être représentée par un graphe orienté appelé graphe d'implication :

%3 ¬a ¬a b b ¬a->b c c ¬a->c ¬c ¬c b->¬c ¬c->¬a a a ¬c->a a->c ¬b ¬b c->¬b ¬b->a

Ce graphe a deux composantes fortement connexes :

%3 ¬a ¬a b b ¬a->b c c ¬a->c ¬c ¬c b->¬c ¬c->¬a a a ¬c->a a->c ¬b ¬b c->¬b ¬b->a

On constate que

Or un problème 2-SAT admet une solution si et seulement si le graphe d'implication est tel qu'aucune variable n'est dans la même composante connexe que sa négation.

Cela prouve que le problème ci-dessus a une solution.

II/ Coloration de graphes

1) Bicoloration

On aimerait savoir s'il est possible de colorier ce graphe avec seulement deux couleurs, de manière que deux sommets adjacents ne soient jamais de la même couleur :

%3 a a b b a--b c c b--c c--a

Pour dire que le sommet a est rouge, on note r(a). Pour dire que le sommet a est bleu, on note ¬r(a). Comme il n'y a que deux couleurs, on n'a besoin que du prédicat r (signifiant rouge).

Si a est rouge alors ni b ni c ne le sont, puisqu'ils sont adjacents à a. Et si a n'est pas rouge alors c'est qu'il est bleu et dans ce cas b et c sont rouges. Ce qui donne ce graphe d'implication :

%3 r(a) r(a) ¬r(b) ¬r(b) r(a)->¬r(b) ¬r(c) ¬r(c) r(a)->¬r(c) ¬r(b)->r(a) r(c) r(c) ¬r(b)->r(c) ¬r(c)->r(a) r(b) r(b) ¬r(c)->r(b) r(b)->¬r(c) ¬r(a) ¬r(a) r(b)->¬r(a) ¬r(a)->r(b) ¬r(a)->r(c) r(c)->¬r(b) r(c)->¬r(a)

Comme ce graphe est fortement connexe, on en déduit que le problème 2-SAT de la bicoloration du graphe à 3 sommets n'a pas de solution.

En fait il y a un algorithme encore plus rapide pour savoir si un graphe est bipartite (c'est-à-dire colorable en deux couleurs seulement) : il suffit d'effectuer un parcours en profondeur, à partir de a par exemple, et de colorier alternativement les sommets rencontrés en rouge et en bleu :

%3 a a b b a--b c c b--c

Une fois le graphe parcouru

Ce qui prouve que le graphe ne peut être bicolorié.

%3 a a b b a--b c c b--c c--a

Par contre, le graphe cycle d'ordre 4 est bipartite :

%3 a a b b a--b c c b--c d d c--d d--a

On s'en rend compte aisément en parcourant le graphe en profondeur, mais aussi avec le graphe d'implication :

%3 r(a) r(a) ¬r(b) ¬r(b) r(a)->¬r(b) ¬r(d) ¬r(d) r(a)->¬r(d) ¬r(b)->r(a) r(c) r(c) ¬r(b)->r(c) ¬r(d)->r(a) ¬r(d)->r(c) r(b) r(b) ¬r(c) ¬r(c) r(b)->¬r(c) ¬r(a) ¬r(a) r(b)->¬r(a) ¬r(c)->r(b) r(d) r(d) ¬r(c)->r(d) ¬r(a)->r(b) ¬r(a)->r(d) r(c)->¬r(b) r(c)->¬r(d) r(d)->¬r(c) r(d)->¬r(a)

Le graphe a deux composantes fortement connexes (correspondant à deux manières de colorier, l'une avec a et c en rouge, l'autre avec b et d en rouge). Aucune de ces composantes fortement connexe ne comportant une proposition et sa négation, le graphe est bicoloriable.

2) Tricoloration

En allant sur cette page, et en choisissant la conversion d'une 3-coloration d'un graphe vers 3-SAT, le graphe précédent, codé

({vertices: [1, 2, 3],
edges:  [[1, 2], [1, 3], [2, 3]]})

et le problème 3-SAT obtenu est

((1 in red) or (1 in blue) or (1 in yellow))
((2 in red) or (2 in blue) or (2 in yellow))
((3 in red) or (3 in blue) or (3 in yellow))
((not (1 in red)) or (not (1 in blue)))
((not (1 in red)) or (not (1 in yellow)))
((not (1 in blue)) or (not (1 in red)))
((not (1 in blue)) or (not (1 in yellow)))
((not (1 in yellow)) or (not (1 in red)))
((not (1 in yellow)) or (not (1 in blue)))
((not (2 in red)) or (not (2 in blue)))
((not (2 in red)) or (not (2 in yellow)))
((not (2 in blue)) or (not (2 in red)))
((not (2 in blue)) or (not (2 in yellow)))
((not (2 in yellow)) or (not (2 in red)))
((not (2 in yellow)) or (not (2 in blue)))
((not (3 in red)) or (not (3 in blue)))
((not (3 in red)) or (not (3 in yellow)))
((not (3 in blue)) or (not (3 in red)))
((not (3 in blue)) or (not (3 in yellow)))
((not (3 in yellow)) or (not (3 in red)))
((not (3 in yellow)) or (not (3 in blue)))
((not (1 in red)) or (not (2 in red)))
((not (1 in red)) or (not (3 in red)))
((not (2 in red)) or (not (3 in red)))
((not (1 in blue)) or (not (2 in blue)))
((not (1 in blue)) or (not (3 in blue)))
((not (2 in blue)) or (not (3 in blue)))
((not (1 in yellow)) or (not (2 in yellow)))
((not (1 in yellow)) or (not (3 in yellow)))
((not (2 in yellow)) or (not (3 in yellow)))

En soumettant ce problème 3-SAT à cette autre page et en cliquant sur « check for satisfiability » on obtient la confirmation que le problème a bien une solution :

(1 in blue) (2 in yellow) (3 in red)
%3 a a b b a--b c c b--c c--a