• Aucun résultat trouvé

Chapitre 5 Satisfaisabilité de formes conjonctives normales

N/A
N/A
Protected

Academic year: 2022

Partager "Chapitre 5 Satisfaisabilité de formes conjonctives normales"

Copied!
159
0
0

Texte intégral

(1)

Chapitre 5

Satisfaisabilité de formes conjonctives normales

(2)

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

(3)

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 satisfaitesConjonction)

I chaque contrainte consiste en plusieurs alternatives ( Disjonction)

(4)

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 satisfaitesConjonction)

I chaque contrainte consiste en plusieurs alternatives ( Disjonction)

(5)

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 satisfaitesConjonction)

I chaque contrainte consiste en plusieurs alternatives ( Disjonction)

(6)

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 satisfaitesConjonction)

I chaque contrainte consiste en plusieurs alternatives ( Disjonction)

(7)

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 satisfaitesConjonction)

I chaque contrainte consiste en plusieurs alternatives ( Disjonction)

(8)

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 satisfaitesConjonction)

I chaque contrainte consiste en plusieurs alternatives ( Disjonction)

(9)

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.

(10)

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.

(11)

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.

(12)

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.

(13)

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.

(14)

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.

(15)

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.

(16)

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.

(17)

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.

(18)

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.

(19)

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

(20)

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

(21)

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

(22)

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.

(23)

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.

(24)

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.

(25)

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 !)

(26)

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 !)

(27)

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 !)

(28)

É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

(29)

É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

(30)

É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

(31)

É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

(32)

É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

(33)

É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

(34)

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.

(35)

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.

(36)

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

(37)

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

(38)

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

(39)

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

(40)

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

(41)

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

(42)

Évaluation partielle d'une formule en CNF

c : formule en forme CNF de la forme d1∧. . .∧dn c[x/b] = ^

1in 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

(43)

Exemples d'évaluation partielle d'une formule en CNF

c = x ∧(¬xy1∨ ¬y2y3) ∧¬x ∧(y2∨ ¬y4y5) c[x/0] = False True True (y2∨ ¬y4y5)

= False

c[x/1] = True (y1∨ ¬y2y3) False (y2∨ ¬y4y5)

= False

(44)

Exemples d'évaluation partielle d'une formule en CNF

c = x ∧(¬xy1∨ ¬y2y3) ∧¬x ∧(y2∨ ¬y4y5) c[x/0] = False True True (y2∨ ¬y4y5)

= False

c[x/1] = True (y1∨ ¬y2y3) False (y2∨ ¬y4y5)

= False

(45)

Exemples d'évaluation partielle d'une formule en CNF

c = x ∧(¬xy1∨ ¬y2y3) ∧¬x ∧(y2∨ ¬y4y5) c[x/0] = False True True (y2∨ ¬y4y5)

= False

c[x/1] = True (y1∨ ¬y2y3) False (y2∨ ¬y4y5)

= False

(46)

Exemples d'évaluation partielle d'une formule en CNF

c = x ∧(¬xy1∨ ¬y2y3) ∧¬x ∧(y2∨ ¬y4y5) c[x/0] = False True True (y2∨ ¬y4y5)

= False

c[x/1] = True (y1∨ ¬y2y3) False (y2∨ ¬y4y5)

= False

(47)

Exemples d'évaluation partielle d'une formule en CNF

c = x ∧(¬xy1∨ ¬y2y3) ∧¬x ∧(y2∨ ¬y4y5) c[x/0] = False True True (y2∨ ¬y4y5)

= False

c[x/1] = True (y1∨ ¬y2y3) False (y2∨ ¬y4y5)

= False

(48)

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]

(49)

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]

(50)

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.

(51)

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.

(52)

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.

(53)

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).

(54)

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).

(55)

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).

(56)

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.

(57)

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

(58)

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

(59)

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

(60)

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.

(61)

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.

(62)

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

(63)

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

(64)

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

(65)

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

(66)

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]

(67)

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

(68)

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

(69)

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

(70)

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

(71)

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.

(72)

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.

(73)

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.

(74)

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]

(75)

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]

(76)

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 ?

(77)

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 ?

(78)

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 ?

(79)

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.

(80)

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

(81)

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

(82)

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.

(83)

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.

(84)

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).

(85)

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).

(86)

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).

(87)

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).

(88)

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.

(89)

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.

(90)

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.

(91)

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.

(92)

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])

(93)

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])

(94)

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])

(95)

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])

(96)

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])

(97)

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])

(98)

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])

(99)

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])

(100)

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.

(101)

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.

(102)

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.

(103)

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).

(104)

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).

(105)

Formule de départ

(x1∨ ¬x2y1∨ ¬y2∨ ¬z2∨ ¬z4)

∧(x2y1)(x2y1y2z1z4)(x2∨ ¬y2z1∨ ¬z2)

∧(x2∨ ¬y1z3∨ ¬z4)(x2∨ ¬y2z2∨ ¬z3)

∧(¬x2∨ ¬y1)x2∨ ¬y1∨ ¬y2)x2y1y2)x2∨ ¬y2z1)

∧(¬x2∨ ¬z1z2)

∧(¬z3∨ ¬z4)(z3z4)z3z4)

(106)

Formule de départ

(x1∨ ¬x2y1∨ ¬y2∨ ¬z2∨ ¬z4)

∧(x2y1)(x2y1y2z1z4)(x2∨ ¬y2z1∨ ¬z2)

∧(x2∨ ¬y1z3∨ ¬z4)(x2∨ ¬y2z2∨ ¬z3)

∧(¬x2∨ ¬y1)x2∨ ¬y1∨ ¬y2)x2y1y2)x2∨ ¬y2z1)

∧(¬x2∨ ¬z1z2)

∧(¬z3∨ ¬z4)(z3z4)z3z4)

x1 apparaît seulement avec polarité positivesupprimer la première clause

(107)

Formule de départ

(x1∨ ¬x2y1∨ ¬y2∨ ¬z2∨ ¬z4)

∧(x2y1)(x2y1y2z1z4)(x2∨ ¬y2z1∨ ¬z2)

∧(x2∨ ¬y1z3∨ ¬z4)(x2∨ ¬y2z2∨ ¬z3)

∧(¬x2∨ ¬y1)x2∨ ¬y1∨ ¬y2)x2y1y2)x2∨ ¬y2z1)

∧(¬x2∨ ¬z1z2)

∧(¬z3∨ ¬z4)(z3z4)z3z4)

x1 apparaît seulement avec polarité positivesupprimer la première clause

(108)

Après suppression de la première clause

(x2y1)(x2y1y2z1z4)(x2∨ ¬y2z1∨ ¬z2)

∧(x2∨ ¬y1z3∨ ¬z4)(x2∨ ¬y2z2∨ ¬z3)

∧(¬x2∨ ¬y1)x2∨ ¬y1∨ ¬y2)x2y1y2)x2∨ ¬y2z1)

∧(¬x2∨ ¬z1z2)

∧(¬z3∨ ¬z4)(z3z4)z3z4)

(109)

Après suppression de la première clause

(x2y1)(x2y1y2z1z4)(x2∨ ¬y2z1∨ ¬z2)

∧(x2∨ ¬y1z3∨ ¬z4)(x2∨ ¬y2z2∨ ¬z3)

∧(¬x2∨ ¬y1)x2∨ ¬y1∨ ¬y2)x2y1y2)x2∨ ¬y2z1)

∧(¬x2∨ ¬z1z2)

∧(¬z3∨ ¬z4)(z3z4)z3z4)

Seulement (7) s'appliquechoisir comme variable de pivot x2 I Cas 1 : x2=0

I Cas 2 : x2=1

Références

Documents relatifs

The left plot shows the mean CPU time needed by Minisat to solve all the instances of each set, and the right plot shows the ratio of satisfiable instances over the total number

Pour déterminer graphiquement l’image du nombre 6, on se place sur l’axe des abscisses, on repère l’abscisse 6 et à l’aide de la courbe C f , on trouve son

I Normalement : toute formule doit pouvoir être transfomée en une formule en forme normale, et qui lui est équivalente, alors appelée sa forme normale.. I Il y a des notions

(Sketch) To show that CDCL-R p-simulates resolution, we show that for any resolution refutation Π of clause set Γ , there is an extended decision sequence δ s.t., when CDCL-R

The results presented in this section can be summarized as follows. First, using auxiliary variables, we avoid the main drawback of Purdom and Boufkhad approaches i.e. the

Comme l’évalua- tion d’une valuation d’une contrainte CNF est linéaire par rapport à son nombre total de littéraux, on pourrait égale- ment considérer le nombre total

Then, in the blockwise conversion algorithm, these m-blocks are converted individually using the standard conversion and for each converted block of polynomials we compute a reduced

En utilisant une variable aléatoire suivant la loi normale standard N(0 ; 1), déterminer la valeur de pour laquelle la probabilité qu’un pain soit commercialisable est égale à