Probleme – 2-\textsc{sat} : du critère au modèle
Exercice · niveau 3 (difficile) · informatique (MP2I/MPI), chapitre 24 — Composantes fortement connexes et couplages
Énoncé
- Écrire la construction du graphe des implications. Combien de sommets, combien d'arcs ?
- Démontrer le critère de satisfiabilité du chapitre.
- Écrire l'algorithme complet, qui rend un modèle et non seulement un verdict.
- Pourquoi l'idée ne se transporte-t-elle pas à 3-sat ?
Corrigé
1. La construction. On numérote le littéral par le sommet et par ; passer à la négation, c'est basculer le bit de poids faible.
(* Un litteral : (i, true) pour x_i, (i, false) pour non x_i. *)
let som (i, positif) = if positif then 2*i else 2*i + 1
let non (i, positif) = (i, not positif)
(* Graphe des implications d'une formule 2-SAT.
Entrees : n variables, une liste de clauses (l1, l2).
Sortie : un graphe a 2n sommets et 2m arcs. Complexite : Theta(n + m). *)
let graphe_implications n clauses =
let g = Array.make (2*n) [] in
List.iter (fun (l1, l2) ->
g.(som (non l1)) <- som l2 :: g.(som (non l1)); (* non l1 -> l2 *)
g.(som (non l2)) <- som l1 :: g.(som (non l2)) (* non l2 -> l1 *)
) clauses;
g
sommets et arcs : la construction est linéaire, et c'est déjà la moitié du résultat.
2. Le critère. On montre les deux sens.
Si et sont dans la même composante, la formule est insatisfiable. Le graphe des implications a une propriété clé : tout modèle rend vrai le successeur de tout littéral vrai. En effet un arc vient d'une clause , qui interdit avec . Par transitivité, dans un modèle, tous les littéraux accessibles depuis un littéral vrai sont vrais. Or dans une composante fortement connexe, tous les littéraux sont mutuellement accessibles : ils reçoivent donc tous la même valeur. Si et y sont ensemble, on exige : impossible.
Sinon, la construction de la question 3 fournit un modèle, ce qui démontre l'autre sens.
3. L'algorithme. On exploite le fait que Kosaraju numérote les composantes dans l'ordre topologique du quotient.
(* Resout une instance de 2-SAT.
Entrees : n variables, une liste de clauses a deux litteraux.
Sortie : None si insatisfiable, Some v avec v.(i) la valeur de x_i sinon.
Complexite : Theta(n + m). *)
let deux_sat n clauses =
let comp = kosaraju (graphe_implications n clauses) in
let piege = ref false in
for i = 0 to n - 1 do
if comp.(2*i) = comp.(2*i + 1) then piege := true
done;
if !piege then None
else Some (Array.init n (fun i -> comp.(2*i) > comp.(2*i + 1)))
Pourquoi ce modèle est correct. Soit un arc avec affecté à vrai. Deux cas. Si et sont dans la même composante, ils ont la même valeur, et est vrai. Sinon, l'arc du quotient impose puisque la numérotation est topologique. Par ailleurs, vrai signifie . Le graphe des implications est antisymétrique — si est un arc, en est un aussi, car les deux viennent de la même clause —, d'où . En combinant :
donc est vrai lui aussi. Aucune clause n'est violée.
Vérification. Sur formules tirées au hasard (de à variables, de à clauses) — satisfiables et insatisfiables —, la comparaison avec une force brute sur les affectations ne donne aucun désaccord, ni sur le verdict, ni sur la validité du modèle rendu.
Complexité : la construction est en , Kosaraju aussi, l'extraction du modèle en . Total — c'est la promesse du chapitre chap:logique.
4. Le mur de 3-sat. Une clause équivaut à deux implications, chacune entre deux littéraux : c'est un arc. Une clause équivaut à : la conclusion est une disjonction, pas un littéral. Un arc ne sait pas représenter cela.
On pourrait vouloir un hypergraphe, ou dédoubler les cas ; mais alors le raisonnement par composantes fortement connexes s'effondre, car la propriété « tous les littéraux d'une composante ont la même valeur » repose sur la transitivité de l'implication entre littéraux simples. Et le problème 3-sat, lui, est np-complet — le chapitre chap:decidabilite dira ce que cela signifie. Le saut de à n'est pas quantitatif : c'est le passage d'un arc à une disjonction.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.