Algorithme de Quine¶
Warning
Ce cours a été automatiquement traduit des transparents de M.Noyer par Félix qui continue le travail fait par Lorentzo et Elowan et Mehdi, nous ne nous accordons en aucun cas son travail, ce site à pour seul but d’être plus compréhensible pendant les périodes de révision que des diaporamas.
Crédits
- Un cours de mon collègue Q. fortier
- Ce cours de l’université de Montpellier : ici
Substitution¶
Notation
-
Si \(x\) est une variable, la notation \([x ← T]\) désigne le contexte partiel qui remplace \(x\) par \(T\) (True) et n’affecte aucune autre variable.
-
La notation \([x ← T][y ← F]\) désigne le contexte partiel qui remplace \(x\) par \(T\) (True) ; \(y\) par \(F\) (False) et n’affecte aucune autre variable. De même : \(\sum_{i=1}^n{[x_i ← C_i]}\) désigne contexte partiel qui remplace chaque \(x_i\) par la constante \(C_i\) (vrai ou faux).
-
Si \(P\) est une proposition et \(x\) une variable, \(P[x ← T]\) désigne \(P\) dans laquelle toutes les occurrences de \(x\) sont remplacées par \(T\) (True). Et \(P\) \(\sum_{i=1}^n{[x_i ← C_i]}...\) à votre avis ?
Satisfiabilité par backtracking¶
On dispose de evaluer (P:prop., µ:ctxt complet)
Listing 1 – Algorithme de satisfiabilité | |
---|---|
Cette fonction réalise donc un bactracking et teste potentiellement \(2^{\text{nb de variables de P}}\) contextes.
appel initial : evaluer(P, liste var de P)
.
L'Algorithme de Quine¶
L’algorithme de Quine prend en paramètre une proposition en FNC et réalise un backtracking (comme la recherche de satisfiabilité en force brute).
En revanche, chaque substitution est l’occasion de supprimer un littéral d’une clause ou une clause de la formule.
Suppression de littéral ou de clause¶
Soit \(x\) une variable et \(P\) une proposition en forme normale conjonctive : \(P = c_1 ∧ c_2 ∧ · · · ∧ c_n\). Lors de la substitution \(P[x ← T]\) on effectue des simplifications :
-
Si une clause contient le littéral \(x\), on enlève cette clause car elle est de la forme \(v_1 ∨ v_2 ∨ · · · ∨ \underbrace{T}_{\text{emplacement de } x} ∨ · · · ∨ v_k\) donc vraie.
-
Si une clause contient \(¬x\), on supprime ce littéral de cette clause car il est faux (\(F\) est l’élément neutre de la disjonction). \(v_1 ∨ v_2 ∨ · · · ∨ \underbrace{¬T}_{\text{emplacement de } x} ∨ · · · ∨ v_k\)
Lors de la substitution \(P[x ← F]\) on effectue des simplifications :
- Si une clause contient \(¬x\), on enlève cette clause car elle est de la forme \(v_1 ∨ v_2 ∨ · · · ∨ \underbrace{¬F}_{\text{emplacement de } x} ∨ · · · ∨ v_k\) donc vraie.
- Si une clause contient \(x\), on supprime ce littéral de cette clause car il est faux. \(v_1 ∨ v_2 ∨ · · · ∨ \underbrace{F}_{\text{emplacement de } x} ∨ · · · ∨ v_k\) donc vraie.
Proposition ou clause vide¶
On supprime à chaque étape soit une/des clause(s) soit un/des littéral/littéraux.
Si une clause devient vide (disjonction de \(0\) propositions), la clause est fausse donc la formule (qui est une conjonction de clause) est fausse aussi. On backtrack.
Si la proposition devient vide (conjonction de \(0\) propositions), la formule est vraie. C’est gagné !