Logique propositionnelle et satisfiabilité
Ce que ce chapitre apporte
- Écrire une formule propositionnelle sans ambiguïté et connaître la priorité des connecteurs.
- Évaluer une formule sous une affectation, à la main et par table de vérité.
- Distinguer satisfiable, valide, insatisfiable, et savoir que ces trois notions se ramènent l'une à l'autre.
- Énoncer le problème SAT et reconnaître ce qu'un solveur rend en sortie.
- Traduire une contrainte du français vers une formule, et vérifier la traduction sur un cas.
- Poser une question de conséquence logique et la ramener à une insatisfiabilité.
- Distinguer équivalence et équisatisfiabilité.
Des variables qui valent vrai ou faux
Une variable propositionnelle est un symbole qui ne peut prendre que deux valeurs : vrai, noté , ou faux, noté .
Elle représente une affirmation indivisible, dont on ne cherche pas à analyser le contenu : « la machine A est allumée », « la tâche 3 est planifiée le lundi », « le fil 7 porte un signal haut ».
C'est une restriction sévère, et c'est elle qui rend tout le reste possible. On ne peut pas écrire « pour tout serveur », ni « le nombre de tâches est inférieur à 5 » : la logique propositionnelle ne connaît ni quantificateur, ni entier, ni fonction. Elle ne connaît que des interrupteurs.
Sans cette ligne, une formule juste et une formule fausse se ressemblent, et rien ne permet de trancher.
Les connecteurs
| Nom | Notation | Se lit | Vaut 1 quand |
|---|---|---|---|
| négation | non | vaut 0 | |
| conjonction | et | les deux valent 1 | |
| disjonction | ou | au moins un des deux vaut 1 | |
| implication | si alors | vaut 0, ou vaut 1 | |
| équivalence | si et seulement si | les deux ont la même valeur |
Le ou exclusif existe, il se note et vaut 1 quand exactement un des deux opérandes vaut 1. Il s'écrit , et il faudra s'en souvenir : c'est lui qui rend les formules issues de la cryptographie si difficiles à résoudre.
Une implication dont la prémisse ne se produit jamais est donc vraie, et sans intérêt. C'est ce qu'on appelle une implication vide, et c'est une source classique de contraintes qui ne contraignent rien.
La règle à retenir sans hésiter, parce que tout le chapitre 2 en dépend :
Priorité et parenthèses
Du plus fort au plus faible : , puis , puis , puis , puis .
Une formule est en réalité un arbre, et les parenthèses ne servent qu'à dire de quel arbre il s'agit. La chaîne en désigne un seul, celui-ci.
Voici l'autre lecture, celle que beaucoup font spontanément, et qui exige des parenthèses pour être écrite.
Dans le doute, parenthéser. Cela n'a jamais coûté un point à personne.
Évaluer une formule
Une affectation attribue une valeur, 0 ou 1, à chaque variable. Une affectation partielle n'en fixe qu'une partie.
L'affectation satisfait la formule si celle-ci vaut 1 sous cette affectation. On dit alors que l'affectation est un modèle de la formule.
Première clause. vaut 1, donc vaut 1. La valeur de ne change plus rien : dès qu'un membre d'une disjonction est vrai, le reste est sans effet.
Seconde clause. vaut 0 et vaut 0, donc vaut 0.
La conjonction. . L'affectation ne satisfait pas la formule.
Une seule clause fausse suffit à tout faire tomber : c'est la propriété qui rend la conjonction si commode à vérifier, et si difficile à satisfaire.
Le bloc ci-dessous permet de manipuler cette formule directement. Chaque variable a trois positions : 0, 1, et ? tant qu'elle n'est pas décidée.
- c1(x∨¬y)
- c2(¬x∨z)
Aucune variable n'est affectée : toutes les clauses attendent.
Poser et laisser en position
? rend la seconde clause orange : il ne lui reste qu'un littéral non décidé, donc ce littéral n'a plus le choix. C'est la propagation unitaire, le mécanisme le plus rentable de tout le domaine, et elle occupera un chapitre entier.Le bouton propager applique cette déduction. La valeur obtenue s'affiche en orange et non en vert, parce qu'elle n'a pas été choisie : elle a été calculée.
Table de vérité
Une table de vérité énumère les affectations possibles de variables et donne la valeur de la formule pour chacune.
| formule | |||||
|---|---|---|---|---|---|
| 0 | 0 | 0 | 1 | 1 | 1 |
| 0 | 0 | 1 | 1 | 1 | 1 |
| 0 | 1 | 0 | 1 | 0 | 0 |
| 0 | 1 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 1 | 0 |
| 1 | 0 | 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 | 0 | 0 |
| 1 | 1 | 1 | 1 | 1 | 1 |
Quatre modèles sur huit affectations. Noter la ligne : la première implication est violée, et il devient inutile de regarder .
Tout le domaine consiste à répondre à la question que pose la table, sans jamais la construire. C'est le programme des chapitres suivants.
| variables | lignes de la table | temps à un milliard de lignes par seconde |
|---|---|---|
| 20 | 1 million | instantané |
| 40 | 18 minutes | |
| 60 | 36 ans | |
| 80 | 38 millions d'années | |
| 300 | plus que l'âge de l'univers, par un facteur inconcevable |
Une instance industrielle en compte des centaines de milliers. Aucune énumération, aussi rapide soit-elle, n'en viendra jamais à bout : ce n'est pas une question de matériel, et il n'y aura pas de machine assez grande.
Satisfiable, valide, insatisfiable
Une formule est satisfiable s'il existe au moins une affectation qui la rend vraie.
Elle est valide, ou tautologie, si toutes les affectations la rendent vraie.
Elle est insatisfiable, ou contradictoire, si aucune ne la rend vraie.
Ces trois notions ne sont pas indépendantes, et le lien entre elles est le fondement de toute la vérification par SAT.
Les deux cas extrêmes valent la peine d'être manipulés une fois. La formule de gauche est satisfaite quoi qu'on fasse ; celle de droite ne l'est jamais.
- c1(x∨¬x)
Aucune variable n'est affectée : toutes les clauses attendent.
- c1(x)⇒ x = 1
- c2(¬x)⇒ x = 0
Deux clauses unitaires réclament des valeurs opposées pour x. Le conflit est déjà là, la prochaine propagation le révélera.
En effet, dire que est vraie partout, c'est dire que n'est vraie nulle part. Les deux phrases décrivent la même situation.
Conséquence pratique, et elle est considérable : un outil qui sait seulement répondre « satisfiable ou non » sait aussi démontrer des théorèmes. Pour prouver que est toujours vraie, il suffit de lui soumettre et d'obtenir « insatisfiable ».
Vérifier que et sont équivalentes, c'est-à-dire que la formule
est valide. On soumet donc sa négation au solveur. Celui-ci répond insatisfiable : aucune affectation ne distingue les deux formules, donc elles sont équivalentes. Aucune table n'a été construite, et le raisonnement vaudrait à l'identique pour deux circuits de dix mille portes.
C'est exactement ainsi que l'industrie vérifie qu'une optimisation de circuit n'a rien changé au comportement : on demande au solveur de trouver une entrée où l'ancien et le nouveau diffèrent. S'il n'en trouve pas, ils sont identiques.
Conséquence logique
C'est la question que l'on pose réellement à un solveur dans l'industrie, et elle mérite son nom.
est conséquence logique de , noté , si tout modèle de est aussi un modèle de .
Autrement dit : dès que est vraie, l'est nécessairement.
décrit un système : les règles d'un protocole, le câblage d'un circuit, les contraintes d'un ordonnanceur.
décrit une propriété qu'on voudrait garantie : « deux processus ne sont jamais en section critique en même temps », « la sortie du circuit optimisé vaut celle du circuit d'origine », « aucune tâche ne démarre avant sa dépendance ».
Demander , c'est demander : le système garantit-il la propriété. C'est la question de la vérification, et c'est celle qu'un solveur SAT sait traiter.
si et seulement si est insatisfiable.
La raison tient en une phrase : un modèle de serait un cas où le système fonctionne et où la propriété est violée, c'est-à-dire un contre-exemple. S'il n'en existe aucun, la propriété est garantie.
S'il répond satisfiable, il rend un modèle, et ce modèle est le contre-exemple : les valeurs exactes des entrées qui font échouer le système. Un ingénieur reçoit donc, au lieu d'un verdict, le scénario à corriger.
C'est la différence entre « ce circuit a un bug » et « avec ces douze entrées à ces valeurs, il sort 0 au lieu de 1 ».
Question : de et , peut-on conclure ?
Écrire la négation de ce qu'on veut prouver. vaut , ce qui donne deux clauses unitaires.
Rassembler le tout : .
Laisser la propagation faire le travail, sur la figure ci-dessous. La clause force , ce qui rend unitaire et force , ce qui rend unitaire et force . Mais la clause exigeait .
Conflit, donc insatisfiable, donc la conséquence est démontrée. Et remarquer qu'aucune énumération n'a eu lieu : trois propagations ont suffi.
- c1(¬x∨y)
- c2(¬y∨z)
- c3(x)⇒ x = 1
- c4(¬z)⇒ z = 0
Propagation unitaire : x = 1, z = 0. Ces valeurs ne sont pas des choix, elles sont imposées.
Le problème SAT
Donnée : une formule propositionnelle .
Question : est-elle satisfiable ?
Un solveur moderne ne se contente pas de répondre par oui ou par non, et c'est cette double sortie qui le rend utilisable :
- s'il répond SAT, il fournit un modèle, une affectation complète que l'on peut vérifier soi-même en temps linéaire ;
- s'il répond UNSAT, il peut fournir une preuve de réfutation : un fichier texte contenant une suite de déductions, chacune tirée des précédentes, qui aboutit à une contradiction manifeste. Un programme indépendant, de quelques centaines de lignes, relit cette suite et confirme que chaque pas est licite. C'est ce qui permet de faire confiance au verdict d'un solveur de cent mille lignes sans avoir à lui faire confiance.
Trouver cette affectation, en revanche, n'a aucune méthode connue qui échappe à une explosion dans le pire cas. Cet écart entre vérifier et trouver est précisément ce que formalise la classe NP, et SAT en est le représentant historique. Le chapitre 4 y revient.
Traduire une contrainte
C'est le geste qui décide de tout, et il s'apprend en le faisant. Trois traductions à connaître par cœur, parce qu'elles reviennent dans toutes les modélisations.
Au moins un parmi : une seule clause, .
Au plus un parmi : toutes les paires s'excluent, soit pour chaque paire .
Sur quatre variables , cela donne six clauses, une par paire :
, , , , , .
En général il y a paires, donc autant de clauses.
Exactement un : les deux ensembles de clauses précédents, réunis.
Une réunion doit se tenir à exactement un des trois créneaux , , . Trois variables, , , , valant 1 si le créneau est retenu.
Au moins un : .
Au plus un : .
Voici les quatre clauses ensemble. Choisir un seul créneau satisfait tout ; en choisir deux fait apparaître une clause rouge.
- c1(a∨b∨c)
- c2(¬a∨¬b)⇒ b = 0
- c3(¬a∨¬c)⇒ c = 0
- c4(¬b∨¬c)
Propagation unitaire : b = 0, c = 0. Ces valeurs ne sont pas des choix, elles sont imposées.
Une traduction qui oublie la moitié « au plus un » laisse passer les deux, et le solveur rendra une solution parfaitement valide pour la formule et parfaitement absurde pour le problème. Le solveur ne se trompe jamais ; la traduction, si.
Équivalence et équisatisfiabilité
et sont équivalentes si elles ont exactement les mêmes modèles. On note .
Elles sont équisatisfiables si elles sont satisfiables toutes les deux, ou insatisfiables toutes les deux. Rien de plus.
L'équivalence est beaucoup plus forte. Deux formules équisatisfiables peuvent porter sur des variables différentes et n'avoir aucun modèle en commun.
Voici une formule dont il vaut la peine de parcourir les quatre affectations, l'une après l'autre.
- c1(a∨b)
- c2(¬a∨¬b)
Aucune variable n'est affectée : toutes les clauses attendent.
Celle qu'on emploie en pratique introduit des variables nouvelles, qui nomment des morceaux de la formule de départ. Elle ne peut donc pas préserver l'équivalence : les deux formules ne portent même plus sur les mêmes variables. Elle préserve seulement l'équisatisfiabilité.
Et cela suffit, parce que la question posée est « existe-t-il un modèle », pas « lesquels ». Confondre les deux notions revient à croire que cette transformation est fausse. Elle ne l'est pas ; elle répond à une question un peu plus modeste, qui se trouve être exactement la bonne.
1.« Le menu comprend un café ou un thé » se traduit par la clause (c ∨ t). Qu'autorise cette clause ?
2.La formule (x → y) est-elle satisfaite quand x = 0 et y = 0 ?
3.Un solveur répond SAT sur la modélisation d'un emploi du temps, et la solution rendue place deux cours dans la même salle au même créneau. Que conclure ?
Exercices type
Combien de modèles a la formule ?
La première clause exige au moins un vrai, la seconde au plus un vrai. Ensemble : exactement un des deux.
Les modèles sont donc et : deux modèles sur quatre affectations.
Cette formule est d'ailleurs une écriture du ou exclusif : elle vaut exactement .
La formule est-elle satisfiable ?
Non. La deuxième clause impose , la troisième impose . Sous ces deux valeurs, vaut , c'est-à-dire 0.
Aucune des quatre affectations restantes n'a besoin d'être testée : les deux clauses unitaires ont déjà tout décidé, et la première est alors violée. C'est un raisonnement de propagation unitaire, mené à la main.
Traduire : « si le serveur A est actif, alors B ou C doit l'être aussi »
Trois variables : , , , valant 1 si le serveur correspondant est actif.
La phrase s'écrit , soit après élimination de l'implication :
Une seule clause. Vérification sur deux cas : avec la clause vaut 0, ce qui est bien le cas interdit ; avec la clause vaut 1 quelles que soient les autres valeurs, ce qui traduit correctement le fait que la contrainte ne dit rien quand A est éteint.
Montrer que et sont équivalentes
C'est l'une des deux lois de De Morgan. Table de vérité :
| 0 | 0 | 0 | 1 | 1 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 0 | 0 |
Les deux dernières colonnes coïncident sur les quatre lignes, donc les formules sont équivalentes.
L'autre loi s'obtient en échangeant les rôles : . Les deux serviront à chaque transformation en forme normale.
Une formule valide peut-elle être insatisfiable ?
Non, à une exception près qui n'existe pas ici : une formule valide est vraie sous toute affectation, et il existe toujours au moins une affectation, puisqu'une formule porte sur un nombre fini de variables. Une formule valide est donc toujours satisfiable.
La réciproque est fausse : est satisfiable, par , sans être valide, puisque la falsifie. Les trois statuts se rangent ainsi : valide implique satisfiable, et insatisfiable est le contraire de satisfiable.
La méthode
- Écrire d'abord ce que signifie chaque variable, en français, avant toute formule.
- Traduire chaque contrainte de l'énoncé séparément, puis les relier par des .
- Éliminer les implications dès que possible, par .
- Parenthéser plutôt que se fier à la priorité des connecteurs.
- Vérifier la traduction sur deux cas, un qui doit passer et un qui doit échouer.
- Passer par la négation pour prouver qu'une formule est valide.
- Ne jamais construire une table de vérité au-delà de quatre ou cinq variables : elle sert à comprendre, pas à calculer.
Synthèse
- Une variable propositionnelle vaut 1 ou 0, et ne représente rien d'autre qu'une affirmation indivisible.
- équivaut à : c'est la réécriture la plus utilisée du domaine.
- Une affectation qui rend la formule vraie est un modèle.
- Satisfiable : au moins un modèle. Valide : tous. Insatisfiable : aucun.
- est valide si et seulement si est insatisfiable : un solveur SAT sait donc démontrer.
- si et seulement si est insatisfiable : un modèle est alors un contre-exemple.
- Une formule est un arbre ; les parenthèses disent lequel.
- SAT demande si une formule est satisfiable ; le solveur rend un modèle, ou une preuve d'impossibilité.
- Vérifier un modèle est immédiat, le trouver n'a aucune méthode connue efficace dans tous les cas.
- « Au moins un » est une clause ; « au plus un » est une clause par paire.
- Équivalentes : mêmes modèles. Équisatisfiables : même réponse à la question SAT, et rien de plus.