Chapitre 5
Satisfaisabilité de formes conjonctives normales
Table de Matières
Vers an algorithme ecace
Une stratégie d'énumération, et une optimisation Variables qui apparaissent avec une seule polarité L'algorithme DPLL complet
Un exemple complet Conclusion
Le problème
I Satisfaisabilité d'une formule DNF: très facile
I Validité d'une formule CNF: très facile
I Beaucoup de problèmes concernent la satisfaisabilité d'une formule en CNF (ou facilement transformée en CNF):
I Problème de planication :
I beaucoup de contraintes à résoudre (qui doivent toutes être satisfaites⇒Conjonction)
I chaque contrainte consiste en plusieurs alternatives (⇒ Disjonction)
Le problème
I Satisfaisabilité d'une formule DNF: très facile
I Validité d'une formule CNF: très facile
I Beaucoup de problèmes concernent la satisfaisabilité d'une formule en CNF (ou facilement transformée en CNF):
I Problème de planication :
I beaucoup de contraintes à résoudre (qui doivent toutes être satisfaites⇒Conjonction)
I chaque contrainte consiste en plusieurs alternatives (⇒ Disjonction)
Le problème
I Satisfaisabilité d'une formule DNF: très facile
I Validité d'une formule CNF: très facile
I Beaucoup de problèmes concernent la satisfaisabilité d'une formule en CNF (ou facilement transformée en CNF):
I Problème de planication :
I beaucoup de contraintes à résoudre (qui doivent toutes être satisfaites⇒Conjonction)
I chaque contrainte consiste en plusieurs alternatives (⇒ Disjonction)
Le problème
I Satisfaisabilité d'une formule DNF: très facile
I Validité d'une formule CNF: très facile
I Beaucoup de problèmes concernent la satisfaisabilité d'une formule en CNF (ou facilement transformée en CNF):
I Problème de planication :
I beaucoup de contraintes à résoudre (qui doivent toutes être satisfaites⇒Conjonction)
I chaque contrainte consiste en plusieurs alternatives (⇒ Disjonction)
Le problème
I Satisfaisabilité d'une formule DNF: très facile
I Validité d'une formule CNF: très facile
I Beaucoup de problèmes concernent la satisfaisabilité d'une formule en CNF (ou facilement transformée en CNF):
I Problème de planication :
I beaucoup de contraintes à résoudre (qui doivent toutes être satisfaites⇒Conjonction)
I chaque contrainte consiste en plusieurs alternatives (⇒ Disjonction)
Le problème
I Satisfaisabilité d'une formule DNF: très facile
I Validité d'une formule CNF: très facile
I Beaucoup de problèmes concernent la satisfaisabilité d'une formule en CNF (ou facilement transformée en CNF):
I Problème de planication :
I beaucoup de contraintes à résoudre (qui doivent toutes être satisfaites⇒Conjonction)
I chaque contrainte consiste en plusieurs alternatives (⇒ Disjonction)
Table de vérité ?
I La table d'une vérité pour une formule avec n variable a 2n lignes.
I Avec n=300:
2300 =21030≈10330=1090
I Nombre estimé de particules élémentaires dans l'univers connu : 1079 1081
I Des problèmes réalistes peuvent avoir facilement des milliers de variables.
Table de vérité ?
I La table d'une vérité pour une formule avec n variable a 2n lignes.
I Avec n=300:
2300 =21030≈10330=1090
I Nombre estimé de particules élémentaires dans l'univers connu : 1079 1081
I Des problèmes réalistes peuvent avoir facilement des milliers de variables.
Table de vérité ?
I La table d'une vérité pour une formule avec n variable a 2n lignes.
I Avec n=300:
2300 =21030≈10330=1090
I Nombre estimé de particules élémentaires dans l'univers connu : 1079 1081
I Des problèmes réalistes peuvent avoir facilement des milliers de variables.
Table de vérité ?
I La table d'une vérité pour une formule avec n variable a 2n lignes.
I Avec n=300:
2300 =21030≈10330=1090
I Nombre estimé de particules élémentaires dans l'univers connu : 1079 1081
I Des problèmes réalistes peuvent avoir facilement des milliers de variables.
Table de vérité ?
I La table d'une vérité pour une formule avec n variable a 2n lignes.
I Avec n=300:
2300 =21030≈10330=1090
I Nombre estimé de particules élémentaires dans l'univers connu : 1079 1081
I Des problèmes réalistes peuvent avoir facilement des milliers de variables.
Table de vérité ?
I La table d'une vérité pour une formule avec n variable a 2n lignes.
I Avec n=300:
2300 =21030≈10330=1090
I Nombre estimé de particules élémentaires dans l'univers connu : 1079 1081
I Des problèmes réalistes peuvent avoir facilement des milliers de variables.
Table de vérité ?
I La table d'une vérité pour une formule avec n variable a 2n lignes.
I Avec n=300:
2300 =21030≈10330=1090
I Nombre estimé de particules élémentaires dans l'univers connu : 1079 1081
I Des problèmes réalistes peuvent avoir facilement des milliers de variables.
L'algorithme DPLL
I Dû à Martin Davis, Hilary Putnam, George Logemann, Donald Loveland, 1962
I Parfois aussi (incorrectement) appelé algorithme de Davis-Putnam (DP)
I C'est la base des SAT-solveurs actuels.
L'algorithme DPLL
I Dû à Martin Davis, Hilary Putnam, George Logemann, Donald Loveland, 1962
I Parfois aussi (incorrectement) appelé algorithme de Davis-Putnam (DP)
I C'est la base des SAT-solveurs actuels.
L'algorithme DPLL
I Dû à Martin Davis, Hilary Putnam, George Logemann, Donald Loveland, 1962
I Parfois aussi (incorrectement) appelé algorithme de Davis-Putnam (DP)
I C'est la base des SAT-solveurs actuels.
Polarité d'une occurrence d'une variable
I Variable x apparaît avec polarité positive dans une clause . . .∨x ∨. . .
I Variable x apparaît avec polarité négativedans une clause . . .∨ ¬x ∨. . .
I A priori, une variable peut apparaître à la fois avec polarité positive et avec polarité négative dans une clause :
y1∨x∨y2∨¬x ∨y3
Polarité d'une occurrence d'une variable
I Variable x apparaît avec polarité positive dans une clause . . .∨x ∨. . .
I Variable x apparaît avec polarité négativedans une clause . . .∨ ¬x ∨. . .
I A priori, une variable peut apparaître à la fois avec polarité positive et avec polarité négative dans une clause :
y1∨x∨y2∨¬x ∨y3
Polarité d'une occurrence d'une variable
I Variable x apparaît avec polarité positive dans une clause . . .∨x ∨. . .
I Variable x apparaît avec polarité négativedans une clause . . .∨ ¬x ∨. . .
I A priori, une variable peut apparaître à la fois avec polarité positive et avec polarité négative dans une clause :
y1∨x∨y2∨¬x ∨y3
Hypothèse sur la forme des clauses
I Hypothèse : aucune variable apparaît deux fois dans la même clause. Justication :
I Si deux occurrences de la même polarité : . . .∨x∨. . .∨x ∨. . . on peut simplier la clause
I Si deux occurrences de polarité opposée : . . .∨x ∨. . .∨¬x∨. . . Tautologie, on peut supprimer la clause.
Hypothèse sur la forme des clauses
I Hypothèse : aucune variable apparaît deux fois dans la même clause. Justication :
I Si deux occurrences de la même polarité : . . .∨x∨. . .∨x ∨. . . on peut simplier la clause
I Si deux occurrences de polarité opposée : . . .∨x ∨. . .∨¬x∨. . . Tautologie, on peut supprimer la clause.
Hypothèse sur la forme des clauses
I Hypothèse : aucune variable apparaît deux fois dans la même clause. Justication :
I Si deux occurrences de la même polarité : . . .∨x∨. . .∨x ∨. . . on peut simplier la clause
I Si deux occurrences de polarité opposée : . . .∨x ∨. . .∨¬x∨. . . Tautologie, on peut supprimer la clause.
Mieux que Générer et tester ?
I Table de vérité : algorithme générer et tester
I Avantage de ce paradigme : séparation de l'algorithme en deux parties clairement distinguées.
I Inconvénient : parfois, on peut détecter qu'une formule n'est pas satisfaisable en essayant des valeurs pour quelques unes de ses variables seulement :
x ∧(¬x∨y1∨ ¬y2∨y3)∧¬x ∧(y2∨ ¬y4∨y5) (essayer les valeurs possibles pour x !)
Mieux que Générer et tester ?
I Table de vérité : algorithme générer et tester
I Avantage de ce paradigme : séparation de l'algorithme en deux parties clairement distinguées.
I Inconvénient : parfois, on peut détecter qu'une formule n'est pas satisfaisable en essayant des valeurs pour quelques unes de ses variables seulement :
x ∧(¬x∨y1∨ ¬y2∨y3)∧¬x ∧(y2∨ ¬y4∨y5) (essayer les valeurs possibles pour x !)
Mieux que Générer et tester ?
I Table de vérité : algorithme générer et tester
I Avantage de ce paradigme : séparation de l'algorithme en deux parties clairement distinguées.
I Inconvénient : parfois, on peut détecter qu'une formule n'est pas satisfaisable en essayant des valeurs pour quelques unes de ses variables seulement :
x ∧(¬x∨y1∨ ¬y2∨y3)∧¬x ∧(y2∨ ¬y4∨y5) (essayer les valeurs possibles pour x !)
Évaluation partielle d'une clause disjonctive
d : clause disjonctive
d[x/b] =
True si b=1 et x apparait avec polarité positive en d True si b=0 et x apparait avec polarité négative en d d \ {¬x} si b=1 et x apparait avec polarité négative en d d \ {x} si b=0 et x apparait avec polarité positive en d d si x n'apparait pas en d.
Ici : d\l est la clause d sans le littéral l
Évaluation partielle d'une clause disjonctive
d : clause disjonctive
d[x/b] =
True si b=1 et x apparait avec polarité positive en d True si b=0 et x apparait avec polarité négative en d d \ {¬x} si b=1 et x apparait avec polarité négative en d d \ {x} si b=0 et x apparait avec polarité positive en d d si x n'apparait pas en d.
Ici : d\l est la clause d sans le littéral l
Évaluation partielle d'une clause disjonctive
d : clause disjonctive
d[x/b] =
True si b=1 et x apparait avec polarité positive en d True si b=0 et x apparait avec polarité négative en d d \ {¬x} si b=1 et x apparait avec polarité négative en d d \ {x} si b=0 et x apparait avec polarité positive en d d si x n'apparait pas en d.
Ici : d\l est la clause d sans le littéral l
Évaluation partielle d'une clause disjonctive
d : clause disjonctive
d[x/b] =
True si b=1 et x apparait avec polarité positive en d True si b=0 et x apparait avec polarité négative en d d \ {¬x} si b=1 et x apparait avec polarité négative en d d \ {x} si b=0 et x apparait avec polarité positive en d d si x n'apparait pas en d.
Ici : d\l est la clause d sans le littéral l
Évaluation partielle d'une clause disjonctive
d : clause disjonctive
d[x/b] =
True si b=1 et x apparait avec polarité positive en d True si b=0 et x apparait avec polarité négative en d d \ {¬x} si b=1 et x apparait avec polarité négative en d d \ {x} si b=0 et x apparait avec polarité positive en d d si x n'apparait pas en d.
Ici : d\l est la clause d sans le littéral l
Évaluation partielle d'une clause disjonctive
d : clause disjonctive
d[x/b] =
True si b=1 et x apparait avec polarité positive en d True si b=0 et x apparait avec polarité négative en d d \ {¬x} si b=1 et x apparait avec polarité négative en d d \ {x} si b=0 et x apparait avec polarité positive en d d si x n'apparait pas en d.
Ici : d\l est la clause d sans le littéral l
Rappel important
I False est une abréviation pour la clause disjonctive vide
I Si on supprime de la clause x le littéral x on obtient la clause vide notée False.
Rappel important
I False est une abréviation pour la clause disjonctive vide
I Si on supprime de la clause x le littéral x on obtient la clause vide notée False.
Exemples d'évaluation partielle d'une clause
(x∨ ¬y ∨z)[x/1] = True (¬x∨ ¬y ∨z)[x/0] = True (¬x∨ ¬y ∨z)[x/1] = (¬y∨z)
(x∨ ¬y ∨z)[x/0] = (¬y∨z) (y1∨ ¬y2∨z)[x/1] = (y1∨ ¬y2∨z)
x[x/0] = False
Exemples d'évaluation partielle d'une clause
(x∨ ¬y ∨z)[x/1] = True (¬x∨ ¬y ∨z)[x/0] = True (¬x∨ ¬y ∨z)[x/1] = (¬y∨z)
(x∨ ¬y ∨z)[x/0] = (¬y∨z) (y1∨ ¬y2∨z)[x/1] = (y1∨ ¬y2∨z)
x[x/0] = False
Exemples d'évaluation partielle d'une clause
(x∨ ¬y ∨z)[x/1] = True (¬x∨ ¬y ∨z)[x/0] = True (¬x∨ ¬y ∨z)[x/1] = (¬y∨z)
(x∨ ¬y ∨z)[x/0] = (¬y∨z) (y1∨ ¬y2∨z)[x/1] = (y1∨ ¬y2∨z)
x[x/0] = False
Exemples d'évaluation partielle d'une clause
(x∨ ¬y ∨z)[x/1] = True (¬x∨ ¬y ∨z)[x/0] = True (¬x∨ ¬y ∨z)[x/1] = (¬y∨z)
(x∨ ¬y ∨z)[x/0] = (¬y∨z) (y1∨ ¬y2∨z)[x/1] = (y1∨ ¬y2∨z)
x[x/0] = False
Exemples d'évaluation partielle d'une clause
(x∨ ¬y ∨z)[x/1] = True (¬x∨ ¬y ∨z)[x/0] = True (¬x∨ ¬y ∨z)[x/1] = (¬y∨z)
(x∨ ¬y ∨z)[x/0] = (¬y∨z) (y1∨ ¬y2∨z)[x/1] = (y1∨ ¬y2∨z)
x[x/0] = False
Exemples d'évaluation partielle d'une clause
(x∨ ¬y ∨z)[x/1] = True (¬x∨ ¬y ∨z)[x/0] = True (¬x∨ ¬y ∨z)[x/1] = (¬y∨z)
(x∨ ¬y ∨z)[x/0] = (¬y∨z) (y1∨ ¬y2∨z)[x/1] = (y1∨ ¬y2∨z)
x[x/0] = False
Évaluation partielle d'une formule en CNF
c : formule en forme CNF de la forme d1∧. . .∧dn c[x/b] = ^
1≤i≤n di[x/b]6=True
di[x/b]
C'est-à-dire :
I Évaluation partielle de toutes les clauses
I Supprimer les clauses évalues comme True
Exemples d'évaluation partielle d'une formule en CNF
c = x ∧(¬x∨y1∨ ¬y2∨y3) ∧¬x ∧(y2∨ ¬y4∨y5) c[x/0] = False ∧True ∧True ∧(y2∨ ¬y4∨y5)
= False
c[x/1] = True ∧(y1∨ ¬y2∨y3) ∧False ∧(y2∨ ¬y4∨y5)
= False
Exemples d'évaluation partielle d'une formule en CNF
c = x ∧(¬x∨y1∨ ¬y2∨y3) ∧¬x ∧(y2∨ ¬y4∨y5) c[x/0] = False ∧True ∧True ∧(y2∨ ¬y4∨y5)
= False
c[x/1] = True ∧(y1∨ ¬y2∨y3) ∧False ∧(y2∨ ¬y4∨y5)
= False
Exemples d'évaluation partielle d'une formule en CNF
c = x ∧(¬x∨y1∨ ¬y2∨y3) ∧¬x ∧(y2∨ ¬y4∨y5) c[x/0] = False ∧True ∧True ∧(y2∨ ¬y4∨y5)
= False
c[x/1] = True ∧(y1∨ ¬y2∨y3) ∧False ∧(y2∨ ¬y4∨y5)
= False
Exemples d'évaluation partielle d'une formule en CNF
c = x ∧(¬x∨y1∨ ¬y2∨y3) ∧¬x ∧(y2∨ ¬y4∨y5) c[x/0] = False ∧True ∧True ∧(y2∨ ¬y4∨y5)
= False
c[x/1] = True ∧(y1∨ ¬y2∨y3) ∧False ∧(y2∨ ¬y4∨y5)
= False
Exemples d'évaluation partielle d'une formule en CNF
c = x ∧(¬x∨y1∨ ¬y2∨y3) ∧¬x ∧(y2∨ ¬y4∨y5) c[x/0] = False ∧True ∧True ∧(y2∨ ¬y4∨y5)
= False
c[x/1] = True ∧(y1∨ ¬y2∨y3) ∧False ∧(y2∨ ¬y4∨y5)
= False
Propriétés de l'évaluation partielle
c : formule en forme CNF
I
[[c[x/b]]]v = [[c]](v[x/b]) pour toute aectation v et valeur booléenne b
I
c |=c[x/0]∨c[x/1]
Propriétés de l'évaluation partielle
c : formule en forme CNF
I
[[c[x/b]]]v = [[c]](v[x/b]) pour toute aectation v et valeur booléenne b
I
c |=c[x/0]∨c[x/1]
Un arbre de recherche
I Donc, c est satisfaisable si c[x/0]est satisfaisable ou si c[x/1] est satisfaisable.
I Cela donne lieu à un arbre de recherche car il faut a priori exploiter les deux possibilités :
c
c[x/0] c[x/1]
I L'arbre de recherche décrit le déroulement du programme, il n'est pas entièrement représenté en mémoire.
Un arbre de recherche
I Donc, c est satisfaisable si c[x/0]est satisfaisable ou si c[x/1] est satisfaisable.
I Cela donne lieu à un arbre de recherche car il faut a priori exploiter les deux possibilités :
c
c[x/0] c[x/1]
I L'arbre de recherche décrit le déroulement du programme, il n'est pas entièrement représenté en mémoire.
Un arbre de recherche
I Donc, c est satisfaisable si c[x/0]est satisfaisable ou si c[x/1] est satisfaisable.
I Cela donne lieu à un arbre de recherche car il faut a priori exploiter les deux possibilités :
c
c[x/0] c[x/1]
I L'arbre de recherche décrit le déroulement du programme, il n'est pas entièrement représenté en mémoire.
Un premier algorithme
1. Si c est la conjonction vide, notée True, alors c est même une tautologie, et donc en particulier satisfaisable.
2. Si c contient une clause qui est la disjonction vide, notée False, alors c n'est pas satisfaisable.
3. Sinon, choisir une variable pivot x, et continuer sur c[x/0]et c[x/1](branchement dans l'arbre de recherche).
Un premier algorithme
1. Si c est la conjonction vide, notée True, alors c est même une tautologie, et donc en particulier satisfaisable.
2. Si c contient une clause qui est la disjonction vide, notée False, alors c n'est pas satisfaisable.
3. Sinon, choisir une variable pivot x, et continuer sur c[x/0]et c[x/1](branchement dans l'arbre de recherche).
Un premier algorithme
1. Si c est la conjonction vide, notée True, alors c est même une tautologie, et donc en particulier satisfaisable.
2. Si c contient une clause qui est la disjonction vide, notée False, alors c n'est pas satisfaisable.
3. Sinon, choisir une variable pivot x, et continuer sur c[x/0]et c[x/1](branchement dans l'arbre de recherche).
Exemple pour le premier algorithme
c c[x/0]
c[x/0][y/0] c[x/0][y/1]
c[x/1]
c[x/1][z/0] c[x/1][z/1]
La construction de l'arbre s'arrête quand on peut conclure par l'évaluation partielle.
Comment choisir les variables de pivot ?
(x1∨x2∨x3) ∧ (¬x1∨x2∨x3) ∧ x3
∧ (x1∨x2∨ ¬x3) ∧ (¬x1∨x2∨ ¬x3) ∧ ¬x3
∧ (x1∨ ¬x2∨x3) ∧ (¬x1∨ ¬x2∨x3)
∧ (x1∨ ¬x2∨ ¬x3) ∧ (¬x1∨ ¬x2∨ ¬x3)
I Mauvais choix : x1−x2
I Bon choix : x3
Comment choisir les variables de pivot ?
(x1∨x2∨x3) ∧ (¬x1∨x2∨x3) ∧ x3
∧ (x1∨x2∨ ¬x3) ∧ (¬x1∨x2∨ ¬x3) ∧ ¬x3
∧ (x1∨ ¬x2∨x3) ∧ (¬x1∨ ¬x2∨x3)
∧ (x1∨ ¬x2∨ ¬x3) ∧ (¬x1∨ ¬x2∨ ¬x3)
I Mauvais choix : x1−x2
I Bon choix : x3
Comment choisir les variables de pivot ?
(x1∨x2∨x3) ∧ (¬x1∨x2∨x3) ∧ x3
∧ (x1∨x2∨ ¬x3) ∧ (¬x1∨x2∨ ¬x3) ∧ ¬x3
∧ (x1∨ ¬x2∨x3) ∧ (¬x1∨ ¬x2∨x3)
∧ (x1∨ ¬x2∨ ¬x3) ∧ (¬x1∨ ¬x2∨ ¬x3)
I Mauvais choix : x1−x2
I Bon choix : x3
Un bon choix de la variable pivot
I S'il y a une clause qui consiste en un seul littéral x ou ¬x alors on choisit la variable x.
I Denition
Une clause (conjonctive ou disjonctive) qui consiste en un seul littéral est appeléeunitaire.
Un bon choix de la variable pivot
I S'il y a une clause qui consiste en un seul littéral x ou ¬x alors on choisit la variable x.
I Denition
Une clause (conjonctive ou disjonctive) qui consiste en un seul littéral est appeléeunitaire.
Optimisation : Résolution unitaire
Si c contient la clause unitaire x :
I Le choix x =0 donne forcement une formule c qui contient la clause False.
I c est satisfaisable si et seulement si c[x/1]est satisfaisable.
I On peut donc passer de la formule c directement à la formule c[x/1]qui est une formule plus petite, et cela sans d'avoir fait un choix.
I Analogue dans le cas d'une clause unaire¬x
Optimisation : Résolution unitaire
Si c contient la clause unitaire x :
I Le choix x =0 donne forcement une formule c qui contient la clause False.
I c est satisfaisable si et seulement si c[x/1]est satisfaisable.
I On peut donc passer de la formule c directement à la formule c[x/1]qui est une formule plus petite, et cela sans d'avoir fait un choix.
I Analogue dans le cas d'une clause unaire¬x
Optimisation : Résolution unitaire
Si c contient la clause unitaire x :
I Le choix x =0 donne forcement une formule c qui contient la clause False.
I c est satisfaisable si et seulement si c[x/1]est satisfaisable.
I On peut donc passer de la formule c directement à la formule c[x/1]qui est une formule plus petite, et cela sans d'avoir fait un choix.
I Analogue dans le cas d'une clause unaire¬x
Optimisation : Résolution unitaire
Si c contient la clause unitaire x :
I Le choix x =0 donne forcement une formule c qui contient la clause False.
I c est satisfaisable si et seulement si c[x/1]est satisfaisable.
I On peut donc passer de la formule c directement à la formule c[x/1]qui est une formule plus petite, et cela sans d'avoir fait un choix.
I Analogue dans le cas d'une clause unaire¬x
Résolution unitaire
I Passer de C1∧x ∧C2 à C1[x/1]∧C2[x/1]
I Passer de C1∧ ¬x ∧C2 à C1[x/0]∧C2[x/0]
Exemple de résolution unitaire
(x∨y)∧¬y ∧(¬x ∨y ∨ ¬z) est satisfaisable ssi x ∧(¬x∨ ¬z) est satisfaisable
ssi ¬z est satisfaisable
ssi True est satisfaisable
Exemple de résolution unitaire
(x∨y)∧¬y ∧(¬x ∨y ∨ ¬z) est satisfaisable ssi x ∧(¬x∨ ¬z) est satisfaisable
ssi ¬z est satisfaisable
ssi True est satisfaisable
Exemple de résolution unitaire
(x∨y)∧¬y ∧(¬x ∨y ∨ ¬z) est satisfaisable ssi x ∧(¬x∨ ¬z) est satisfaisable
ssi ¬z est satisfaisable
ssi True est satisfaisable
Exemple de résolution unitaire
(x∨y)∧¬y ∧(¬x ∨y ∨ ¬z) est satisfaisable ssi x ∧(¬x∨ ¬z) est satisfaisable
ssi ¬z est satisfaisable
ssi True est satisfaisable
Remarques sur l'exemple
I La résolution unitaire conserve la satisfaisabilité, mais ce n'est pas une transformation d'équivalence !
I Si la formule obtenue à la n est satisfaisable alors la formule de départ l'est aussi.
I Par contre, si la formule à la n est une tautologie il se peut que la formule de départ ne l'est pas.
Remarques sur l'exemple
I La résolution unitaire conserve la satisfaisabilité, mais ce n'est pas une transformation d'équivalence !
I Si la formule obtenue à la n est satisfaisable alors la formule de départ l'est aussi.
I Par contre, si la formule à la n est une tautologie il se peut que la formule de départ ne l'est pas.
Remarques sur l'exemple
I La résolution unitaire conserve la satisfaisabilité, mais ce n'est pas une transformation d'équivalence !
I Si la formule obtenue à la n est satisfaisable alors la formule de départ l'est aussi.
I Par contre, si la formule à la n est une tautologie il se peut que la formule de départ ne l'est pas.
Pourquoi n'est ce pas une transformation d'équivalence ?
I x ∧(¬x∨y) est transformée en y
I Regardez l'aectation[x 7→0,y 7→1]
Pourquoi n'est ce pas une transformation d'équivalence ?
I x ∧(¬x∨y) est transformée en y
I Regardez l'aectation[x 7→0,y 7→1]
Qu'est-ce qu'on a gagné ?
I La résolution unitaire peut faire apparaître de nouvelles clauses unitaires.
I Si on a la chance de cela, ça fait des simplications en cascade.
I Quoi faire quand toutes les clauses contiennent au moins deux littéraux ?
Qu'est-ce qu'on a gagné ?
I La résolution unitaire peut faire apparaître de nouvelles clauses unitaires.
I Si on a la chance de cela, ça fait des simplications en cascade.
I Quoi faire quand toutes les clauses contiennent au moins deux littéraux ?
Qu'est-ce qu'on a gagné ?
I La résolution unitaire peut faire apparaître de nouvelles clauses unitaires.
I Si on a la chance de cela, ça fait des simplications en cascade.
I Quoi faire quand toutes les clauses contiennent au moins deux littéraux ?
Une optimisation
Proposition : Soit c en forme conjonctive normale.
I Si la variable x apparaît seulement avec polarité positive en c alors c est satisfaisable si et seulement si c[x/1]est
satisfaisable.
I Si la variable x apparaît seulement avec polarité négative en c alors c est satisfaisable si et seulement si c[x/0]est
satisfaisable.
Idée derrière cette optimisation
I Si une variable n'apparraît qu'avec polarité positive, alors ça ne peut pas faire du mal de la mettre à la valeur 1
I Si une variable n'apparraît qu'avec polarité négative, alors ça ne peut pas faire du mal de la mettre à la valeur 0
Idée derrière cette optimisation
I Si une variable n'apparraît qu'avec polarité positive, alors ça ne peut pas faire du mal de la mettre à la valeur 1
I Si une variable n'apparraît qu'avec polarité négative, alors ça ne peut pas faire du mal de la mettre à la valeur 0
Démonstration du premier énoncé
I Si c[x/1]est satisfaisable, disons v |=c[x/1], alors on a que 1= [[c[x/1]]]v = [[c]](v[x/1])
et c est alors également satisfaisable.
I Soit c satisfaisable, disons v |=c. On peut montrer facilement que pour toute clause d en c on a que [[d]](v[x/1])≥[[d]]v car x ne peut apparaître que positivement en d, et par conséquent que
[[c[x/1]]]v = [[c]](v[x/1])≥1 Donc, c[x/1]est satisfaisable.
Démonstration du premier énoncé
I Si c[x/1]est satisfaisable, disons v |=c[x/1], alors on a que 1= [[c[x/1]]]v = [[c]](v[x/1])
et c est alors également satisfaisable.
I Soit c satisfaisable, disons v |=c. On peut montrer facilement que pour toute clause d en c on a que [[d]](v[x/1])≥[[d]]v car x ne peut apparaître que positivement en d, et par conséquent que
[[c[x/1]]]v = [[c]](v[x/1])≥1 Donc, c[x/1]est satisfaisable.
Propriétés de cette règle
I Elle conserve la satisfaisabilité.
I Elle n'est pas une équivalence.
I Exemple(x∨y)∧(x ∨z)donne True.
Aectation[x 7→0,y 7→0,z 7→0]
I Cette règle peut déclencher une reduction en cascade (voir l'exemple suivant).
Propriétés de cette règle
I Elle conserve la satisfaisabilité.
I Elle n'est pas une équivalence.
I Exemple(x∨y)∧(x ∨z)donne True.
Aectation[x 7→0,y 7→0,z 7→0]
I Cette règle peut déclencher une reduction en cascade (voir l'exemple suivant).
Propriétés de cette règle
I Elle conserve la satisfaisabilité.
I Elle n'est pas une équivalence.
I Exemple(x∨y)∧(x ∨z)donne True.
Aectation[x 7→0,y 7→0,z 7→0]
I Cette règle peut déclencher une reduction en cascade (voir l'exemple suivant).
Propriétés de cette règle
I Elle conserve la satisfaisabilité.
I Elle n'est pas une équivalence.
I Exemple(x∨y)∧(x ∨z)donne True.
Aectation[x 7→0,y 7→0,z 7→0]
I Cette règle peut déclencher une reduction en cascade (voir l'exemple suivant).
Exemple
(x ∨ ¬y)∧(y∨z1)∧(¬z1∨ ¬z2) est satisfaisable ssi (y ∨z1)∧(¬z1∨ ¬z2) est satisfaisable ssi (¬z1∨ ¬z2) est satisfaisable
ssi True est satisfaisable
La formule de départ est donc satisfaisable.
Exemple
(x ∨ ¬y)∧(y∨z1)∧(¬z1∨ ¬z2) est satisfaisable ssi (y ∨z1)∧(¬z1∨ ¬z2) est satisfaisable ssi (¬z1∨ ¬z2) est satisfaisable
ssi True est satisfaisable
La formule de départ est donc satisfaisable.
Exemple
(x ∨ ¬y)∧(y∨z1)∧(¬z1∨ ¬z2) est satisfaisable ssi (y ∨z1)∧(¬z1∨ ¬z2) est satisfaisable ssi (¬z1∨ ¬z2) est satisfaisable
ssi True est satisfaisable
La formule de départ est donc satisfaisable.
Exemple
(x ∨ ¬y)∧(y∨z1)∧(¬z1∨ ¬z2) est satisfaisable ssi (y ∨z1)∧(¬z1∨ ¬z2) est satisfaisable ssi (¬z1∨ ¬z2) est satisfaisable
ssi True est satisfaisable
La formule de départ est donc satisfaisable.
c est une formule en forme CNF
function dp(c) =case
(1) if c =True then true
(2) if c contient une clause False then false (3) if c contient une clause unitaire x then dp(c[x/1]) (4) if c contient une clause unitaire ¬x then dp(c[x/0]) (5) if x n'apparaît qu'avec polarité positive en c then dp(c[x/1]) (6) if x n'apparaît qu'avec polarité négative en c then dp(c[x/0]) (7) else choisir x ∈ V(c);dp(c[x/0])or dp(c[x/1])
c est une formule en forme CNF
function dp(c) =case
(1) if c =True then true
(2) if c contient une clause False then false (3) if c contient une clause unitaire x then dp(c[x/1]) (4) if c contient une clause unitaire ¬x then dp(c[x/0]) (5) if x n'apparaît qu'avec polarité positive en c then dp(c[x/1]) (6) if x n'apparaît qu'avec polarité négative en c then dp(c[x/0]) (7) else choisir x ∈ V(c);dp(c[x/0])or dp(c[x/1])
c est une formule en forme CNF
function dp(c) =case
(1) if c =True then true
(2) if c contient une clause False then false (3) if c contient une clause unitaire x then dp(c[x/1]) (4) if c contient une clause unitaire ¬x then dp(c[x/0]) (5) if x n'apparaît qu'avec polarité positive en c then dp(c[x/1]) (6) if x n'apparaît qu'avec polarité négative en c then dp(c[x/0]) (7) else choisir x ∈ V(c);dp(c[x/0])or dp(c[x/1])
c est une formule en forme CNF
function dp(c) =case
(1) if c =True then true
(2) if c contient une clause False then false (3) if c contient une clause unitaire x then dp(c[x/1]) (4) if c contient une clause unitaire ¬x then dp(c[x/0]) (5) if x n'apparaît qu'avec polarité positive en c then dp(c[x/1]) (6) if x n'apparaît qu'avec polarité négative en c then dp(c[x/0]) (7) else choisir x ∈ V(c);dp(c[x/0])or dp(c[x/1])
c est une formule en forme CNF
function dp(c) =case
(1) if c =True then true
(2) if c contient une clause False then false (3) if c contient une clause unitaire x then dp(c[x/1]) (4) if c contient une clause unitaire ¬x then dp(c[x/0]) (5) if x n'apparaît qu'avec polarité positive en c then dp(c[x/1]) (6) if x n'apparaît qu'avec polarité négative en c then dp(c[x/0]) (7) else choisir x ∈ V(c);dp(c[x/0])or dp(c[x/1])
c est une formule en forme CNF
function dp(c) =case
(1) if c =True then true
(2) if c contient une clause False then false (3) if c contient une clause unitaire x then dp(c[x/1]) (4) if c contient une clause unitaire ¬x then dp(c[x/0]) (5) if x n'apparaît qu'avec polarité positive en c then dp(c[x/1]) (6) if x n'apparaît qu'avec polarité négative en c then dp(c[x/0]) (7) else choisir x ∈ V(c);dp(c[x/0])or dp(c[x/1])
c est une formule en forme CNF
function dp(c) =case
(1) if c =True then true
(2) if c contient une clause False then false (3) if c contient une clause unitaire x then dp(c[x/1]) (4) if c contient une clause unitaire ¬x then dp(c[x/0]) (5) if x n'apparaît qu'avec polarité positive en c then dp(c[x/1]) (6) if x n'apparaît qu'avec polarité négative en c then dp(c[x/0]) (7) else choisir x ∈ V(c);dp(c[x/0])or dp(c[x/1])
c est une formule en forme CNF
function dp(c) =case
(1) if c =True then true
(2) if c contient une clause False then false (3) if c contient une clause unitaire x then dp(c[x/1]) (4) if c contient une clause unitaire ¬x then dp(c[x/0]) (5) if x n'apparaît qu'avec polarité positive en c then dp(c[x/1]) (6) if x n'apparaît qu'avec polarité négative en c then dp(c[x/0]) (7) else choisir x ∈ V(c);dp(c[x/0])or dp(c[x/1])
Remarques sur l'algorithme
I Les tests diérents dans l'instruction case peuvent être faits dans un ordre quelconque.
I On a donc la liberté de choisir sa stratégie dans
l'implémentation de cet algorithme. Intéressant pour la priorité entre les cas (3) à (6).
I Les deux cas (5) et (6) sont parfois omis dans des implémentations car trop chers.
Remarques sur l'algorithme
I Les tests diérents dans l'instruction case peuvent être faits dans un ordre quelconque.
I On a donc la liberté de choisir sa stratégie dans
l'implémentation de cet algorithme. Intéressant pour la priorité entre les cas (3) à (6).
I Les deux cas (5) et (6) sont parfois omis dans des implémentations car trop chers.
Remarques sur l'algorithme
I Les tests diérents dans l'instruction case peuvent être faits dans un ordre quelconque.
I On a donc la liberté de choisir sa stratégie dans
l'implémentation de cet algorithme. Intéressant pour la priorité entre les cas (3) à (6).
I Les deux cas (5) et (6) sont parfois omis dans des implémentations car trop chers.
Terminaison de l'algorithme
I Dans chaque appel récursif de l'algorithme, le nombre de variables dans la formule est décrémenté.
I Le temps d'exécution peut quand même, dans le pire des cas, être exponentiel dans le nombre de variables (à cause du branchement).
Terminaison de l'algorithme
I Dans chaque appel récursif de l'algorithme, le nombre de variables dans la formule est décrémenté.
I Le temps d'exécution peut quand même, dans le pire des cas, être exponentiel dans le nombre de variables (à cause du branchement).
Formule de départ
(x1∨ ¬x2∨y1∨ ¬y2∨ ¬z2∨ ¬z4)
∧(x2∨y1)∧(x2∨y1∨y2∨z1∨z4)∧(x2∨ ¬y2∨z1∨ ¬z2)
∧(x2∨ ¬y1∨z3∨ ¬z4)∧(x2∨ ¬y2∨z2∨ ¬z3)
∧(¬x2∨ ¬y1)∧(¬x2∨ ¬y1∨ ¬y2)∧(¬x2∨y1∨y2)∧(¬x2∨ ¬y2∨z1)
∧(¬x2∨ ¬z1∨z2)
∧(¬z3∨ ¬z4)∧(z3∨z4)∧(¬z3∨z4)
Formule de départ
(x1∨ ¬x2∨y1∨ ¬y2∨ ¬z2∨ ¬z4)
∧(x2∨y1)∧(x2∨y1∨y2∨z1∨z4)∧(x2∨ ¬y2∨z1∨ ¬z2)
∧(x2∨ ¬y1∨z3∨ ¬z4)∧(x2∨ ¬y2∨z2∨ ¬z3)
∧(¬x2∨ ¬y1)∧(¬x2∨ ¬y1∨ ¬y2)∧(¬x2∨y1∨y2)∧(¬x2∨ ¬y2∨z1)
∧(¬x2∨ ¬z1∨z2)
∧(¬z3∨ ¬z4)∧(z3∨z4)∧(¬z3∨z4)
x1 apparaît seulement avec polarité positive⇒supprimer la première clause
Formule de départ
(x1∨ ¬x2∨y1∨ ¬y2∨ ¬z2∨ ¬z4)
∧(x2∨y1)∧(x2∨y1∨y2∨z1∨z4)∧(x2∨ ¬y2∨z1∨ ¬z2)
∧(x2∨ ¬y1∨z3∨ ¬z4)∧(x2∨ ¬y2∨z2∨ ¬z3)
∧(¬x2∨ ¬y1)∧(¬x2∨ ¬y1∨ ¬y2)∧(¬x2∨y1∨y2)∧(¬x2∨ ¬y2∨z1)
∧(¬x2∨ ¬z1∨z2)
∧(¬z3∨ ¬z4)∧(z3∨z4)∧(¬z3∨z4)
x1 apparaît seulement avec polarité positive⇒supprimer la première clause
Après suppression de la première clause
(x2∨y1)∧(x2∨y1∨y2∨z1∨z4)∧(x2∨ ¬y2∨z1∨ ¬z2)
∧(x2∨ ¬y1∨z3∨ ¬z4)∧(x2∨ ¬y2∨z2∨ ¬z3)
∧(¬x2∨ ¬y1)∧(¬x2∨ ¬y1∨ ¬y2)∧(¬x2∨y1∨y2)∧(¬x2∨ ¬y2∨z1)
∧(¬x2∨ ¬z1∨z2)
∧(¬z3∨ ¬z4)∧(z3∨z4)∧(¬z3∨z4)
Après suppression de la première clause
(x2∨y1)∧(x2∨y1∨y2∨z1∨z4)∧(x2∨ ¬y2∨z1∨ ¬z2)
∧(x2∨ ¬y1∨z3∨ ¬z4)∧(x2∨ ¬y2∨z2∨ ¬z3)
∧(¬x2∨ ¬y1)∧(¬x2∨ ¬y1∨ ¬y2)∧(¬x2∨y1∨y2)∧(¬x2∨ ¬y2∨z1)
∧(¬x2∨ ¬z1∨z2)
∧(¬z3∨ ¬z4)∧(z3∨z4)∧(¬z3∨z4)
Seulement (7) s'applique⇒choisir comme variable de pivot x2 I Cas 1 : x2=0
I Cas 2 : x2=1