Aller au contenu principal
satLes cas où la difficulté disparaît

Les cas où la difficulté disparaît

Ce que ce chapitre apporte

  • Résoudre 2-SAT en temps linéaire, et en extraire un modèle, pas seulement une réponse.
  • Distinguer un chemin qui force une valeur d'un chemin qui rend la formule insatisfiable.
  • Reconnaître une formule de Horn et la résoudre par propagation unitaire seule.
  • Reconnaître un système XOR et savoir qu'il se résout par élimination de Gauss.
  • Expliquer pourquoi l'encodage d'un XOR en clauses détruit ce qui le rendait facile.
  • Énoncer le théorème de Schaefer et s'en servir pour trancher devant une modélisation.
Le chapitre précédent a placé SAT au sommet de NP. Il aurait tort de laisser croire que toute formule est difficile : trois familles se résolvent en temps polynomial, et pour trois raisons différentes. Les connaître n'est pas une curiosité théorique. C'est un réflexe d'ingénieur, parce qu'une modélisation qui tombe dans l'une d'elles se résout par un algorithme dédié qui écrasera n'importe quel solveur général, et parce qu'une modélisation qui en sort de peu vaut la peine d'être retravaillée. Un fil conducteur les relie : la difficulté disparaît exactement là où le choix disparaît.

Premier cas facile : 2-SAT

Le graphe d'implication d'une formule 2-SAT

Une clause (ab)(a \vee b) équivaut à deux implications : ¬ab\neg a \rightarrow b et ¬ba\neg b \rightarrow a.

On construit un graphe orienté dont les sommets sont les 2n2n littéraux, avec un arc par implication.

Pourquoi deux arcs et non un seul
Une clause n'a pas de sens de lecture privilégié. (ab)(a \vee b) dit « au moins un des deux », ce qui se raconte aussi bien par « si aa est faux, bb doit être vrai » que par « si bb est faux, aa doit être vrai ».
Ces deux implications sont contraposées l'une de l'autre, donc logiquement équivalentes. Les dessiner toutes les deux n'ajoute aucune information : cela rend simplement le graphe parcourable dans les deux sens, ce dont l'algorithme a besoin.

Ce qu'un chemin de xx vers ¬x\neg x signifie

C'est ici que se joue toute la subtilité, et elle mérite une figure à elle seule.

Graphe orienté4 sommets, 6 arêtes
xy¬y¬x
Le graphe de (¬x ∨ y) ∧ (x ∨ y) ∧ (¬x ∨ ¬y). Un chemin mène de x à ¬x, en passant par y. Ce n'est pas une contradiction : cela dit seulement que supposer x vrai conduit à x faux, donc que x doit valoir 0. La formule est bien satisfiable, par x = 0 et y = 1.
Un chemin de xx vers ¬x\neg x ne rend pas la formule insatisfiable
Il force une valeur, il n'interdit rien. Supposer xx vrai mène à xx faux : l'hypothèse est intenable, et il ne reste que x=0x = 0. C'est une déduction, pas un échec.
L'insatisfiabilité demande les deux chemins : xx mène à ¬x\neg x et ¬x\neg x mène à xx. Aucune des deux valeurs ne tient alors, et il n'y a plus d'issue.
Le critère

La formule est insatisfiable si et seulement si une variable xx et sa négation ¬x\neg x appartiennent à la même composante fortement connexe du graphe.

Une composante fortement connexe est un ensemble de sommets qui s'atteignent mutuellement. Dire que xx et ¬x\neg x y sont ensemble, c'est exactement dire que les deux chemins existent.

Graphe orienté4 sommets, 8 arêtes
¬xy¬yx
Le graphe de (x ∨ y) ∧ (x ∨ ¬y) ∧ (¬x ∨ y) ∧ (¬x ∨ ¬y). Cette fois les quatre sommets s'atteignent tous mutuellement : ils forment une seule composante fortement connexe, qui contient x et ¬x. La formule est insatisfiable, ce que confirme le décompte direct, puisque les quatre clauses interdisent les quatre affectations possibles.

Lire un modèle sur le graphe

Le critère répond par oui ou par non. L'algorithme donne mieux : quand la formule est satisfiable, il construit un modèle sans essai ni retour arrière.

La règle d'affectation

Calculer les composantes fortement connexes, puis les ranger en ordre topologique.

Poser x=1x = 1 si la composante de xx vient après celle de ¬x\neg x dans cet ordre, et x=0x = 0 sinon.

Graphe orienté6 sommets, 6 arêtes
¬z¬yx¬xyz
Le graphe de (x ∨ y) ∧ (¬x ∨ y) ∧ (¬y ∨ z), rangé de gauche à droite. Aucun circuit ici : chaque littéral forme sa propre composante, et les colonnes donnent directement l'ordre topologique.
Extraire le modèle, colonne par colonne

La variable yy. Sur la figure, ¬y\neg y occupe la deuxième colonne et yy la quatrième : yy vient après. Donc y=1\mathbf{y = 1}.

La lecture directe dit la même chose : il existe un chemin de ¬y\neg y vers yy, en passant par xx ou par ¬x\neg x. Supposer yy faux conduit à yy vrai, donc yy est vrai.

La variable zz. ¬z\neg z est en première colonne, zz en dernière. Donc z=1\mathbf{z = 1}.

La variable xx. xx et ¬x\neg x sont dans la même colonne. Ni l'un ni l'autre n'atteint son opposé : les deux valeurs conviennent, et la variable est libre.

Le modèle. y=1y = 1, z=1z = 1, et xx au choix. Contrôle avec x=0x = 0 : (xy)=1(x \vee y) = 1, (¬xy)=1(\neg x \vee y) = 1, (¬yz)=1(\neg y \vee z) = 1. Les trois clauses sont satisfaites.

Pourquoi la règle est correcte
Elle repose sur une symétrie du graphe. Si le graphe contient un arc uvu \rightarrow v, il contient aussi l'arc ¬v¬u\neg v \rightarrow \neg u, parce que les deux viennent de la même clause. Le graphe est donc identique à lui-même quand on renverse tous les arcs et qu'on remplace chaque littéral par son opposé.
Conséquence : les composantes vont par paires, celle d'un littéral et celle de son opposé, et elles occupent des positions symétriques dans l'ordre topologique. Choisir systématiquement celle qui vient en dernier revient donc à choisir, pour chaque variable, le côté qui n'implique rien de contradictoire.
Pourquoi c'est linéaire
Le graphe compte 2n2n sommets et 2m2m arcs. Les composantes fortement connexes se calculent en O(n+m)O(n + m) par l'algorithme de Tarjan, vu au chapitre sur les graphes orientés, et celui-ci les rend déjà dans un ordre topologique inverse : l'affectation ne coûte donc rien de plus.
Total : linéaire, sans aucun retour arrière, sans aucune décision. Et il y a là plus qu'un tour de force. 2-SAT est facile parce qu'une clause de deux littéraux est une implication, donc une information locale qui se propage. Il n'y a jamais de choix à faire.
Une clause de trois littéraux n'est plus une implication
(abc)(a \vee b \vee c) se lit « si aa est faux, alors bb ou cc ». La conclusion est une disjonction, et il faut choisir laquelle des deux tenir.
Ce « ou » dans la conclusion est exactement ce qui fait passer du temps linéaire au NP-complet. Un arc de graphe sait porter « alors bb » ; il ne sait pas porter « alors bb ou cc ».

Deuxième cas facile : Horn-SAT

Clause de Horn

Une clause de Horn contient au plus un littéral positif.

Elle s'écrit donc soit (¬a1¬akb)(\neg a_1 \vee \cdots \vee \neg a_k \vee b), ce qui est exactement la règle « si a1a_1 et … et aka_k alors bb », soit sans littéral positif du tout, ce qui est une contrainte d'exclusion.

Reconnaître une clause de Horn en une seconde
Compter les littéraux sans signe moins. Zéro ou un : c'est du Horn. Deux ou plus : ce n'en est pas.
(¬a¬bc)(\neg a \vee \neg b \vee c) est de Horn, un seul positif. (ab)(a \vee b) ne l'est pas, deux positifs. (¬a¬b)(\neg a \vee \neg b) l'est, aucun positif.
Une seule clause hors norme suffit à faire sortir la formule entière du fragment, et donc à lui rendre toute sa difficulté.
L'algorithme, en entier

Partir de toutes les variables à 0.

Tant qu'il existe une clause dont tous les littéraux négatifs sont faux, c'est-à-dire dont toutes les conditions sont réunies, et dont le littéral positif vaut encore 0 : mettre ce littéral positif à 1.

S'arrêter quand plus aucune clause n'est dans ce cas. Si une clause sans littéral positif se retrouve falsifiée, la formule est insatisfiable.

C'est la propagation unitaire, et rien d'autre. Elle suffit, et le résultat obtenu est le modèle minimal de la formule.

4 clausesunitaireen attente
  • c1(a)a = 1
  • c2(b)b = 1
  • c3(¬a¬bc)
  • c4(¬cd)
abcd
vert = décidé, orange = déduit par propagation.

Propagation unitaire : a = 1, b = 1. Ces valeurs ne sont pas des choix, elles sont imposées.

Une formule de Horn : deux faits, puis deux règles. Propager jusqu'au bout suffit à la résoudre, sans jamais décider d'une variable. C'est exactement le chaînage avant d'un moteur de règles.
Un diagnostic, écrit en clauses de Horn

Les faits observés : le service ne répond pas, et la charge processeur est normale. Deux clauses unitaires, (muet)(\text{muet}) et (charge)(\text{charge}).

Les règles du diagnostic, chacune de la forme « si … alors … » :

  • si le service est muet et la charge normale, alors le processus est arrêté : (¬muet¬chargearret)(\neg \text{muet} \vee \neg \text{charge} \vee \text{arret}) ;
  • si le processus est arrêté, consulter le journal : (¬arretjournal)(\neg \text{arret} \vee \text{journal}) ;
  • si le processus est arrêté, alerter l'astreinte : (¬arretalerte)(\neg \text{arret} \vee \text{alerte}).

Le déroulement est mécanique. Les deux faits passent à 1, ce qui rend la première règle unitaire et pose arret=1\text{arret} = 1, ce qui rend les deux suivantes unitaires à leur tour. Conclusion : consulter le journal et alerter.

Aucune décision n'a été prise, aucune hypothèse n'a été testée puis abandonnée. Un moteur de règles ne fait rien d'autre, et c'est pourquoi il répond instantanément là où un solveur général chercherait.

Pourquoi la propagation suffit, ici et pas ailleurs
Une formule de Horn satisfiable possède un modèle minimal unique : parmi tous ses modèles, il en existe un qui met à 1 le moins de variables possible, et il est contenu dans tous les autres.
L'algorithme le construit exactement. Il ne met une variable à 1 que lorsqu'une clause l'y oblige, donc il ne dépasse jamais ce minimum ; et il s'arrête quand plus rien ne l'oblige, donc il l'atteint.
Si ce modèle minimal falsifie une clause sans littéral positif, aucun autre ne la satisfera : les autres modèles ne font qu'ajouter des 1, ce qui ne peut pas aider une clause entièrement négative. D'où l'insatisfiabilité, sans avoir rien essayé.
C'est cette unicité qui disparaît dès qu'une clause a deux littéraux positifs : « bb ou cc » ouvre deux minima possibles, donc un choix.
Où l'on croise Horn sans le savoir
Prolog, les moteurs de règles, les systèmes de types, les gestionnaires de dépendances de paquets : tous manipulent des clauses de Horn, parce qu'une règle « si les conditions alors la conclusion » en est une, et qu'un conflit « ces deux paquets sont incompatibles » aussi.
Ces outils sortent du fragment dès qu'ils permettent d'écrire « ce paquet exige l'un de ceux-ci », qui compte plusieurs littéraux positifs. Ce n'est pas un hasard si c'est précisément à partir de là que la résolution de dépendances est devenue lente, et que plusieurs d'entre eux embarquent aujourd'hui un vrai solveur SAT.

Troisième cas facile : XOR-SAT

Celui-ci est le plus surprenant des trois, et le plus utile à connaître pour comprendre pourquoi certaines instances réputées petites résistent aux meilleurs solveurs.

Contrainte XOR

Une contrainte XOR porte sur la parité d'un ensemble de variables :

x1x2xk=bx_1 \oplus x_2 \oplus \cdots \oplus x_k = b, avec bb valant 0 ou 1.

Elle exige que le nombre de variables valant 1 soit pair si b=0b = 0, impair si b=1b = 1.

Un tel système est un système d'équations linéaires sur le corps à deux éléments, où le ou exclusif joue le rôle de l'addition. Il se résout donc par élimination de Gauss, exactement comme un système linéaire ordinaire, en temps polynomial.

Résoudre un système XOR à la main

xy=1x \oplus y = 1, yz=0\quad y \oplus z = 0, xz=1\quad x \oplus z = 1

La deuxième équation donne y=zy = z.

La première donne x=1yx = 1 \oplus y, donc xx est l'inverse de yy.

Contrôle sur la troisième. xz=(1y)y=1x \oplus z = (1 \oplus y) \oplus y = 1, puisque yy=0y \oplus y = 0. L'équation est satisfaite quelle que soit la valeur de yy : elle n'apporte rien de neuf, elle est combinaison des deux autres.

Les solutions : y=z=0y = z = 0 avec x=1x = 1, ou y=z=1y = z = 1 avec x=0x = 0. Deux solutions, obtenues sans le moindre essai.

Et un système sans solution

xy=1x \oplus y = 1, yz=1\quad y \oplus z = 1, xz=1\quad x \oplus z = 1

Additionner les trois équations. À gauche, chaque variable apparaît exactement deux fois, et vv=0v \oplus v = 0 : le membre de gauche vaut 00. À droite, 111=11 \oplus 1 \oplus 1 = 1.

On obtient 0=10 = 1. Le système est insatisfiable, et la démonstration tient en une ligne.

C'est la même structure que le cycle impair du chapitre sur la coloration : trois contraintes « ces deux-là doivent différer » posées sur un triangle, et l'on ne peut pas satisfaire les trois.

Le geste de Gauss, en une phrase
Additionner deux équations élimine toute variable qui apparaît dans les deux. C'est cette opération, et elle seule, qui rend le problème facile : elle permet de faire disparaître les variables une à une jusqu'à un système trivial.
Elle n'a aucun équivalent sur les clauses. Additionner deux clauses n'a pas de sens ; la seule opération dont dispose un solveur est la résolution, qui élimine une variable à la fois et sur un seul littéral. Le chapitre suivant montrera à quel point c'est plus faible.

Ce que la traduction en clauses détruit

Une contrainte XOR coûte cher en CNF
Une contrainte XOR sur kk variables demande 2k12^{k-1} clauses de kk littéraux : il faut interdire, une par une, toutes les affectations de mauvaise parité.
Pour k=3k = 3, cela fait quatre clauses. Pour k=20k = 20, plus d'un demi-million. C'est déjà mauvais, mais ce n'est pas le pire.

Voici les quatre clauses de xyz=1x \oplus y \oplus z = 1. Chacune interdit une affectation de parité paire.

4 clausessatisfaiteunitaire
  • c1(xyz)
  • c2(¬x¬yz)z = 1
  • c3(¬xy¬z)
  • c4(x¬y¬z)
xyz
vert = décidé, orange = déduit par propagation.

Propagation unitaire : z = 1. Ces valeurs ne sont pas des choix, elles sont imposées.

L'écriture en clauses de « x ⊕ y ⊕ z = 1 ». Poser x = 1 et y = 1 rend la deuxième clause unitaire, qui impose z = 1 : la parité se propage correctement. Essayer ensuite x = 1, y = 0 impose z = 0, et toute affectation de parité paire fait apparaître une clause rouge.
Le vrai coût : la structure devient invisible
Le nombre de clauses n'est que la moitié du problème. L'autre moitié est que, une fois écrit en CNF, un système XOR ne se reconnaît plus. Le solveur voit des clauses ordinaires et perd le droit d'additionner deux équations, qui était précisément l'opération qui rendait le problème facile.
Pire, ce n'est pas seulement une occasion manquée : on sait démontrer que certains systèmes XOR, écrits en CNF, exigent des preuves par résolution de taille exponentielle. Comme tous les solveurs CDCL raisonnent par résolution, aucun d'eux ne peut y échapper. Le chapitre 6 revient sur ce résultat.
D'où l'existence de solveurs, dont CryptoMiniSat est le plus connu, qui gardent les contraintes XOR à part et leur appliquent Gauss en parallèle du raisonnement par clauses. C'est aussi la raison pour laquelle les instances issues de la cryptographie, saturées de ou exclusifs, sont si dures : leur difficulté est en grande partie fabriquée par l'encodage.
Un fragment facile plus une clause quelconque n'est plus un fragment facile
Les trois cas de ce chapitre supposent que toutes les clauses respectent la restriction. Une seule clause de trois littéraux dans une formule 2-SAT, une seule clause à deux positifs dans une formule de Horn, une seule contrainte non linéaire dans un système XOR, et la garantie tombe entièrement.
Ce n'est pas une subtilité de définition : c'est ce qui arrive constamment en modélisation. Une contrainte « exactement un » se réduit à des clauses binaires, sauf la clause « au moins un » qui en compte nn. Le modèle n'est donc pas du 2-SAT, et il ne le sera jamais.
La bonne question n'est donc pas « mon problème est-il dans un fragment facile », qui reçoit presque toujours la réponse non, mais « quelle partie de mon problème l'est », parce que c'est de là que viennent les propagations gratuites.

Pourquoi exactement ces trois cas

Ces trois fragments ne sont pas une collection d'accidents heureux. La question « quelles restrictions rendent SAT facile » a une réponse complète, et elle est ancienne.

FragmentLa restrictionPourquoi c'est facileLe coût
2-SATdeux littéraux par clauseune clause est une implication : tout se propage, rien ne se choisitO(n+m)O(n + m)
Hornau plus un littéral positifla propagation unitaire seule construit le modèle minimalO(n+m)O(n + m)
XORcontraintes de paritéc'est de l'algèbre linéaire, et Gauss s'appliqueO(n3)O(n^3)
Théorème de dichotomie de Schaefer, 1978

Si l'on fixe à l'avance les types de contraintes autorisés, le problème de satisfaction correspondant est soit dans P, soit NP-complet. Il n'y a rien entre les deux.

Les cas faciles sont exactement au nombre de six : les formules toujours satisfaites par tout à 0, celles toujours satisfaites par tout à 1, les formules de Horn, leur symétrique où chaque clause a au plus un littéral négatif, les formules à deux littéraux par clause, et les systèmes affines, c'est-à-dire XOR.

Ce que ce théorème apporte à un ingénieur
Il rend la question tranchable en regardant la formule. Devant une modélisation, il ne s'agit pas de deviner si elle sera difficile : il suffit d'examiner la forme des clauses.
Si toutes ont deux littéraux, ou au plus un positif, ou sont des parités, le problème est facile et il existe un algorithme dédié qui écrasera n'importe quel solveur général.
Sinon, il n'y a aucun moyen terme à espérer : le problème est NP-complet, et la seule question qui reste porte sur la structure de l'instance particulière, au sens du chapitre précédent.
Le fil conducteur des trois cas
2-SAT : une clause binaire est une implication, donc une déduction, jamais un choix.
Horn : la propagation unitaire construit le modèle minimal, donc il n'y a rien à choisir.
XOR : Gauss élimine les variables une à une, sans jamais parier sur une valeur.
Dans les trois cas, la difficulté disparaît avec le choix. C'est exactement ce que les chapitres suivants vont exploiter : tout le travail d'un solveur consiste à décider le moins souvent possible, et à ne jamais refaire deux fois le même mauvais choix.

Exercices type

La formule (xy)(¬xy)(x¬y)(x \vee y) \wedge (\neg x \vee y) \wedge (x \vee \neg y) est-elle satisfiable ? Répondre par le graphe.

C'est du 2-SAT. Les six arcs :

(xy)(x \vee y) donne ¬xy\neg x \rightarrow y et ¬yx\neg y \rightarrow x. (¬xy)(\neg x \vee y) donne xyx \rightarrow y et ¬y¬x\neg y \rightarrow \neg x. (x¬y)(x \vee \neg y) donne ¬x¬y\neg x \rightarrow \neg y et yxy \rightarrow x.

Chercher les allers-retours. Depuis xx : xyxx \rightarrow y \rightarrow x. Les sommets xx et yy sont donc dans une même composante. Cette composante contient-elle ¬x\neg x ? Depuis xx on atteint yy, et depuis yy on atteint xx, sans jamais sortir de la paire. Donc non.

Satisfiable. Pour le modèle : ¬x\neg x atteint xx, par ¬xyx\neg x \rightarrow y \rightarrow x, alors que xx n'atteint pas ¬x\neg x. La composante de xx vient donc après celle de ¬x\neg x, d'où x=1x = 1. De même y=1y = 1.

Contrôle : (11)(1 \vee 1), (01)(0 \vee 1), (10)(1 \vee 0). Les trois clauses sont satisfaites.

Une formule 2-SAT de 5 variables contient un chemin de x1x_1 vers ¬x1\neg x_1 et un chemin de ¬x3\neg x_3 vers x3x_3. Que peut-on conclure ?

Deux forçages, aucune contradiction.

Le premier chemin dit que supposer x1x_1 vrai mène à x1x_1 faux : donc x1=0x_1 = 0. Le second dit que supposer x3x_3 faux mène à x3x_3 vrai : donc x3=1x_3 = 1.

La formule reste parfaitement satisfiable en l'état de ces informations. Il faudrait, pour conclure à l'insatisfiabilité, trouver une variable dont les deux chemins existent simultanément.

C'est la confusion la plus fréquente sur 2-SAT : un chemin unique déduit, une paire de chemins réfute.

La formule (¬a¬bc)(¬cd)(a)(b)(\neg a \vee \neg b \vee c) \wedge (\neg c \vee d) \wedge (a) \wedge (b) est-elle de Horn ? La résoudre.

Oui : chaque clause a au plus un littéral positif. Les deux premières sont des règles, les deux dernières des faits.

Application de l'algorithme, en partant de tout à 0 :

(a)(a) est falsifiée, on pose a=1a = 1. (b)(b) de même, b=1b = 1. (¬a¬bc)(\neg a \vee \neg b \vee c) devient falsifiée, on pose c=1c = 1. (¬cd)(\neg c \vee d) devient falsifiée, on pose d=1d = 1. Plus rien n'est falsifié.

Modèle : a=b=c=d=1a = b = c = d = 1, et c'est le modèle minimal. Le calcul est du pur chaînage avant, exactement ce que fait un moteur de règles, et il n'a demandé aucune décision.

La formule (¬abc)(¬bd)(\neg a \vee b \vee c) \wedge (\neg b \vee d) est-elle de Horn ?

Non. La première clause contient deux littéraux positifs, bb et cc. Elle se lit « si aa alors bb ou cc », et c'est précisément ce « ou » dans la conclusion qui fait sortir du fragment.

La différence n'est pas cosmétique : elle réintroduit le choix. Un moteur de règles sait dérouler « si aa alors bb » ; face à « si aa alors bb ou cc », il doit parier sur l'un des deux et savoir revenir en arrière. C'est toute la distance entre un chaînage avant linéaire et une recherche.

La seconde clause, elle, est bien de Horn.

Une formule de Horn est-elle toujours satisfiable ?

Non. Il suffit d'une clause sans littéral positif que le modèle minimal falsifie.

Exemple : (a)(¬ab)(¬a¬b)(a) \wedge (\neg a \vee b) \wedge (\neg a \vee \neg b). Les trois clauses sont bien de Horn, avec respectivement un, un et zéro littéral positif.

Le déroulement : (a)(a) force a=1a = 1, puis (¬ab)(\neg a \vee b) force b=1b = 1. La troisième clause, (¬a¬b)(\neg a \vee \neg b), se retrouve alors entièrement fausse.

Insatisfiable, et détecté en deux propagations. Noter que la clause fautive est celle qui n'a aucun littéral positif : ce sont les seules qui peuvent échouer, puisque toutes les autres peuvent toujours être satisfaites en mettant leur conclusion à 1.

Écrire xyz=0x \oplus y \oplus z = 0 en clauses

La contrainte exige un nombre pair de variables à 1. Il faut donc interdire les quatre affectations de parité impaire, une clause chacune.

Les affectations à exclure sont (1,0,0)(1,0,0), (0,1,0)(0,1,0), (0,0,1)(0,0,1) et (1,1,1)(1,1,1). Chacune donne la clause qui la nie :

(¬xyz)(\neg x \vee y \vee z), (x¬yz)(x \vee \neg y \vee z), (xy¬z)(x \vee y \vee \neg z), (¬x¬y¬z)(\neg x \vee \neg y \vee \neg z).

Quatre clauses, soit 2312^{3-1}. Noter au passage que ce sont exactement les clauses complémentaires de celles de xyz=1x \oplus y \oplus z = 1 : chaque signe est inversé.

Le système xy=1x \oplus y = 1, yz=0y \oplus z = 0, xz=0x \oplus z = 0 a-t-il une solution ?

Additionner les trois équations. Chaque variable apparaît deux fois à gauche et s'annule, donc le membre de gauche vaut 0. À droite, 100=11 \oplus 0 \oplus 0 = 1.

On obtient 0=10 = 1 : le système est insatisfiable.

La vérification directe confirme : la deuxième équation impose y=zy = z, la troisième impose x=zx = z, donc x=yx = y, ce qui contredit la première.

Ce raisonnement d'une ligne est hors de portée d'un solveur CDCL travaillant sur les douze clauses de l'encodage, qui devra les explorer. Sur un système de mille équations, l'écart devient insurmontable.

Une modélisation produit 4 000 clauses binaires et 12 clauses de cinq littéraux. Est-elle facile ?

Non, pas au sens du théorème. Le fragment 2-SAT exige que toutes les clauses soient binaires, et douze exceptions suffisent à faire perdre la garantie.

Mais la lecture utile n'est pas là. Ces douze clauses sont les seules qui demandent un choix : une fois leurs littéraux fixés, tout le reste est du 2-SAT, donc résoluble en temps linéaire.

Autrement dit, la formule possède une porte dérobée naturelle, au sens du chapitre précédent, et il suffit d'explorer les combinaisons issues de ces douze clauses. C'est précisément le raisonnement qui explique pourquoi tant d'instances industrielles, formellement NP-complètes, se résolvent en quelques secondes.

Vérification rapideon peut se reprendre

1.La formule (x ∨ y) ∧ (¬x ∨ z) ∧ (¬y ∨ ¬z) relève de…

2.Dans un graphe d'implication 2-SAT, il existe un chemin de x vers ¬x mais aucun de ¬x vers x. Que conclure ?

3.La clause (¬a ∨ b ∨ c) est-elle une clause de Horn ?

4.Quelle clause de Horn peut être falsifiée par le modèle minimal ?

5.Un système de 500 contraintes XOR est traduit en clauses puis donné à un solveur CDCL. À quoi s'attendre ?

6.D'après le théorème de Schaefer, un problème de satisfaction à contraintes fixées peut-il être « moyennement difficile » ?

La méthode

  1. Compter les littéraux par clause avant tout : deux partout signifie temps linéaire.
  2. Compter les littéraux positifs par clause : au plus un partout signifie Horn, donc temps linéaire.
  3. Chercher les contraintes de parité : un système XOR se résout par Gauss, et se traduit très mal en clauses.
  4. Construire le graphe d'implication pour toute question 2-SAT, et y lire le modèle, pas seulement la réponse.
  5. Ne pas confondre un chemin qui force une valeur et une paire de chemins qui réfute.
  6. Vérifier que la restriction vaut pour toutes les clauses : une seule exception fait tomber la garantie.
  7. Chercher quelle partie du problème est facile quand l'ensemble ne l'est pas : c'est là que se trouvent les propagations gratuites.

Synthèse

  • 2-SAT : composantes fortement connexes du graphe d'implication, en temps linéaire, et l'ordre topologique donne le modèle.
  • Un chemin de xx vers ¬x\neg x force x=0x = 0 ; il faut les deux chemins pour l'insatisfiabilité.
  • Une clause de trois littéraux n'est plus une implication : sa conclusion est un « ou », donc un choix.
  • Horn-SAT se résout par la seule propagation unitaire, qui construit le modèle minimal unique.
  • Seules les clauses de Horn sans littéral positif peuvent être falsifiées par ce modèle.
  • XOR-SAT est de l'algèbre linéaire sur deux éléments : Gauss le résout en additionnant des équations.
  • Une contrainte XOR sur kk variables coûte 2k12^{k-1} clauses, et son encodage rend la structure invisible.
  • Schaefer : soit dans P, soit NP-complet, et rien entre les deux. Les cas faciles sont au nombre de six.
  • Une seule clause hors du fragment fait tomber toute la garantie.
  • Le fil conducteur : la difficulté disparaît exactement quand le choix disparaît.