La résolution, ou comment prouver qu'il n'y a rien
Ce que ce chapitre apporte
- Appliquer la règle de résolution et calculer une résolvante sans faute.
- Justifier qu'elle est correcte : la résolvante est conséquence de ses deux parents.
- Énoncer la complétude réfutationnelle et savoir ce qu'elle promet, et ce qu'elle ne promet pas.
- Construire une réfutation complète sur une petite formule.
- Reconnaître la résolution unitaire comme un cas particulier déjà rencontré.
- Comprendre pourquoi l'algorithme de Davis-Putnam a été abandonné.
- Citer les deux familles dont on sait que toute preuve par résolution est exponentielle.
- Dire ce qu'est un certificat DRAT et à quoi il sert.
La règle
Soient deux clauses dont l'une contient le littéral et l'autre le littéral :
et
Leur résolvante sur le pivot est la clause
c'est-à-dire la réunion des deux clauses privée de et de .
Le cas ordinaire. et donnent .
Le littéral commun. et donnent , et non . Une clause est un ensemble de littéraux : le doublon disparaît, et c'est ce qui permet aux clauses de raccourcir.
Le pivot unique. et donnent , qui est une tautologie donc inutile. On ne peut pas résoudre sur et sur en même temps : la règle élimine une seule paire de littéraux opposés à la fois. Résoudre sur les deux produirait la clause vide à partir de deux clauses parfaitement satisfiables, ce qui serait faux.
et sont toutes deux satisfaites par , . Si l'on éliminait les deux paires d'un coup, on obtiendrait la clause vide, donc l'insatisfiabilité, sur une formule qui a un modèle.
La règle ne le permet pas : un pivot, un seul, à chaque étape.
Prenons une affectation qui satisfait et . Le littéral vaut 1 ou 0.
S'il vaut 1, alors vaut 0, donc est satisfaite par l'un de ses , qui figure dans la résolvante.
S'il vaut 0, alors est satisfaite par l'un de ses , qui figure aussi dans la résolvante.
Dans les deux cas la résolvante est satisfaite. Ajouter une résolvante à une formule ne change donc jamais ses modèles : la formule reste équivalente à elle-même, en un peu plus explicite.
Une réfutation complète
Une réfutation d'une formule est une suite de clauses où chacune est soit une clause de , soit la résolvante de deux clauses précédentes, et dont la dernière est la clause vide .
Puisque chaque résolvante est conséquence de , dériver la clause vide signifie que entraîne le faux. Une formule qui entraîne le faux n'a aucun modèle : la réfutation est une preuve d'insatisfiabilité.
Que cette formule soit insatisfiable se vérifie à la main : impose , ce qui force par la deuxième clause et par la troisième, et la première tombe.
La réfutation ci-dessous établit la même chose mécaniquement, sans raisonner sur les valeurs, en trois applications de la règle.
est donnée. Reste à produire , ce qui demande deux clauses ne contenant plus que et un littéral opposé, et ainsi de suite. Chercher à rebours depuis la contradiction est ce que fait un solveur, et le chapitre 8 montrera qu'il en tire ses meilleures clauses.
La complétude réfutationnelle
Si une formule CNF est insatisfiable, alors la clause vide est dérivable par résolution à partir de ses clauses.
Le théorème est réfutationnel : il ne promet que la clause vide, et seulement quand elle est due. C'est suffisant, parce que toute question de logique propositionnelle se ramène à une insatisfiabilité, comme le chapitre 1 l'a montré pour la validité et la conséquence logique.
Il ne dit pas non plus que la preuve est courte. C'est la fin de ce chapitre, et c'est là que tout se joue.
Résoudre avec la clause unitaire donne : la clause a raccourci, précisément parce que a été affecté. Répéter jusqu'à obtenir une clause unitaire, c'est propager ; obtenir la clause vide, c'est le conflit.
Autrement dit, un solveur qui propage résout déjà, sans le dire. Le chapitre 8 montrera que CDCL ne fait rien d'autre que de la résolution, appliquée dans un ordre choisi par la recherche.
Sur , qui est insatisfiable, aucune clause n'est unitaire et la propagation ne démarre pas. Il faut donc résoudre deux clauses binaires entre elles, ce qui est une décision de plus qu'un solveur doit prendre.
C'est exactement pourquoi un solveur a besoin de décider en plus de propager, et c'est le sujet du chapitre suivant.
Davis-Putnam, et pourquoi il a été abandonné
Pour éliminer la variable d'une formule : produire toutes les résolvantes sur , entre chaque clause contenant et chaque clause contenant , puis supprimer toutes les clauses où apparaît.
La formule obtenue ne parle plus de , et elle est équisatisfiable à la précédente.
L'algorithme de Davis et Putnam, publié en 1960, applique cette élimination variable après variable. Quand il ne reste plus rien, la formule était satisfiable ; si la clause vide apparaît en chemin, elle ne l'était pas. C'est correct, complet, et parfaitement déterministe.
Une variable apparaissant dans 50 clauses de chaque côté remplace donc 100 clauses par 2 500. La formule enfle à chaque élimination, et la mémoire cède bien avant que le calcul n'aboutisse.
Deux ans plus tard, en 1962, Davis, Logemann et Loveland remplaçaient l'élimination par un parcours en profondeur : au lieu de produire toutes les résolvantes d'une variable, on lui donne une valeur et l'on descend, quitte à revenir. La mémoire redevient linéaire, au prix d'un temps qui peut exploser. C'est DPLL, et c'est le chapitre suivant.
Sur une instance industrielle, cela retire souvent la moitié des variables pour un coût négligeable. Ce qui était un algorithme complet est devenu une optimisation locale, et c'est un bon exemple de la façon dont une idée abandonnée revient à l'échelle où elle est rentable. Le chapitre 9 y revient.
Le talon d'Achille : la longueur des preuves
C'est ici que la résolution montre sa limite, et le résultat est définitif.
Toute réfutation par résolution du principe des tiroirs compte un nombre exponentiel de clauses.
Tout solveur qui raisonne par résolution, ce qui inclut DPLL, CDCL et tous les outils de ce cours, doit produire une preuve par résolution pour répondre UNSAT. Si toutes ces preuves sont exponentiellement longues, alors le solveur y passera un temps exponentiel, quelle que soit son ingéniosité.
compte 210 variables, et met en échec des solveurs qui traitent par ailleurs des millions de variables. Un humain le réfute en une phrase : il y a plus de pigeons que de casiers. Cette phrase, la résolution ne sait pas l'écrire.
Les deux familles ont un point commun instructif. Dans les deux cas, la raison de l'insatisfiabilité est un argument de comptage : plus de pigeons que de casiers, ou une somme de parités qui vaut 1 alors qu'elle devrait valoir 0. La résolution ne sait pas compter ; elle ne sait qu'enlever des littéraux un par un.
D'où l'existence de systèmes de preuve plus puissants, qui savent additionner des contraintes au lieu de les résoudre, et qui réfutent le principe des tiroirs en quelques lignes. Aucun n'a encore donné de solveur compétitif sur les instances réelles, ce qui est l'un des écarts les plus intrigants du domaine.
Les preuves qu'un solveur rend
Un solveur qui répond UNSAT peut produire un fichier DRAT : la liste, dans l'ordre, des clauses qu'il a ajoutées pendant la recherche, et de celles qu'il a supprimées.
Un programme indépendant, de quelques milliers de lignes, relit ce fichier et vérifie que chaque ajout est licite. S'il valide jusqu'à la clause vide, la réponse UNSAT est démontrée.
La parade est de ne pas faire confiance au solveur, mais à un vérificateur minuscule, simple au point d'être relisible, et lui-même parfois démontré correct. Depuis 2013, les compétitions internationales exigent un certificat DRAT pour toute réponse UNSAT.
C'est la même logique qu'au chapitre 4, poussée jusqu'au bout : une réponse « oui » se certifie par un modèle, une réponse « non » par une preuve, et dans les deux cas c'est le vérificateur, pas le chercheur, qui fonde la confiance.
Elle a pourtant été vérifiée intégralement par un programme, ce qui est le seul sens dans lequel un objet pareil peut être « lu ». Une preuve qu'aucun humain ne lira reste une preuve, à condition que le vérificateur, lui, soit lisible.
Exercices type
Calculer la résolvante de et sur le pivot
On retire et , puis on réunit le reste :
Cette clause contient et : elle est tautologique, donc toujours vraie et parfaitement inutile. Un solveur la jetterait immédiatement.
C'est un cas fréquent, et il vaut la peine de le repérer avant de calculer : dès que les deux clauses contiennent une seconde variable avec des signes opposés, la résolvante sera tautologique.
Résoudre les deux mêmes clauses sur le pivot donnerait en revanche , tautologique elle aussi.
Réfuter
Trois clauses, deux résolutions.
Première étape. et , pivot , donnent .
Deuxième étape. et , pivot , donnent .
La formule est insatisfiable. Noter que les deux étapes emploient une clause unitaire : c'est de la résolution unitaire, donc exactement ce que la propagation aurait fait toute seule.
Peut-on dériver à partir de par résolution ?
Non, et c'est structurel. La résolution produit toujours une clause dont les littéraux viennent des deux parents. Le littéral n'apparaît nulle part dans , donc aucune suite de résolutions ne le fera surgir.
Pourtant entraîne bien : toute affectation qui satisfait la première satisfait la seconde.
C'est la différence entre complétude et complétude réfutationnelle. La résolution ne dérive pas toutes les conséquences ; elle dérive la clause vide quand elle est due, et c'est tout ce dont on a besoin.
Éliminer la variable de
Deux clauses contiennent , deux contiennent : il y a résolvantes à produire.
, , , .
On supprime ensuite les quatre clauses d'origine. Bilan : 4 clauses remplacées par 4, ce qui est le cas neutre.
Avec 10 clauses de chaque côté, ce serait 20 remplacées par 100. C'est cette croissance qui a condamné Davis-Putnam, et c'est aussi pourquoi les solveurs modernes n'éliminent que les variables où , c'est-à-dire presque uniquement celles qui apparaissent deux ou trois fois.
Un solveur répond UNSAT sur une instance critique. Comment s'en assurer ?
Ne pas le croire sur parole. Lui demander un certificat DRAT, puis le passer à un vérificateur indépendant.
Le raisonnement est le même que pour une réponse SAT, où l'on vérifie le modèle en un parcours plutôt que de faire confiance à la recherche. La différence est que le certificat d'un UNSAT est beaucoup plus gros, et que le vérificateur fait un vrai travail.
Ce qu'on gagne : la confiance ne repose plus sur les dizaines de milliers de lignes du solveur, mais sur les quelques milliers du vérificateur, qui est simple, stable, et parfois démontré correct.
Pourquoi est-il difficile pour la résolution alors qu'il est évident pour un humain ?
Parce que l'argument humain est un comptage : il y a pigeons pour casiers, donc deux pigeons partagent un casier.
La résolution ne sait pas compter. Elle ne dispose que d'une opération, éliminer une paire de littéraux opposés, et pour atteindre la contradiction elle doit en quelque sorte parcourir toutes les façons de placer les pigeons. Haken a démontré que ce parcours est nécessairement exponentiel.
La leçon est générale : un système de preuve n'est puissant que sur les arguments qu'il sait exprimer. Il existe des systèmes qui additionnent des contraintes et réfutent en quelques lignes ; aucun n'a encore donné de solveur qui batte CDCL sur les instances réelles.
1.La résolvante de (y ∨ z) et (¬y ∨ z) sur y vaut…
2.Peut-on résoudre (x ∨ y) et (¬x ∨ ¬y) en éliminant x et y à la fois ?
3.Dériver la clause vide à partir des clauses de F prouve que…
4.La résolution peut-elle dériver (x ∨ y) à partir de (x) ?
5.Pourquoi Davis-Putnam a-t-il été remplacé par DPLL dès 1962 ?
6.Un solveur produit un certificat DRAT. À quoi sert-il ?
La méthode
- Chercher une paire de littéraux opposés avant tout : sans elle, aucune résolution n'est possible.
- Ne résoudre que sur un seul pivot à la fois, quelle que soit la tentation.
- Dédoublonner la résolvante, c'est ce qui la fait raccourcir.
- Jeter les résolvantes tautologiques : elles sont licites et sans usage.
- Construire une réfutation à rebours, en partant des deux clauses unitaires opposées qu'il faudra obtenir.
- Reconnaître la propagation unitaire comme un cas de résolution, et non comme un mécanisme distinct.
- Demander un certificat pour toute réponse UNSAT dont dépend une décision.
Synthèse
- La résolvante de deux clauses sur un pivot est leur réunion privée du pivot, sans doublon.
- Un seul pivot par étape : en éliminer deux permettrait de démontrer n'importe quoi.
- La résolvante est conséquence de ses parents : l'ajouter ne change aucun modèle.
- Une réfutation est une dérivation aboutissant à la clause vide, donc une preuve d'insatisfiabilité.
- Robinson : toute formule insatisfiable admet une réfutation par résolution.
- La complétude est réfutationnelle : la règle ne dérive pas toutes les conséquences, seulement .
- La propagation unitaire est de la résolution, avec une clause unitaire pour parent.
- La résolution unitaire seule suffit sur Horn, pas en général : d'où le besoin de décider.
- Davis-Putnam élimine les variables par résolution ; résolvantes font exploser la mémoire.
- Haken : toute réfutation par résolution de est exponentielle, et Urquhart en dit autant des systèmes XOR.
- La résolution ne sait pas compter, et c'est exactement ce qui manque à ces deux familles.
- Un certificat DRAT déplace la confiance du solveur vers un vérificateur minuscule.