Introduit en 1961 par Martin Davis , George Logemann et Donald W. Loveland , l'algorithme de Davis-Logemann-Loveland est une amélioration de l' algorithme de Davis-Putnam , une méthode basée sur la résolution développée par Davis et Hilary Putnam en 1960. Dans les publications anciennes, il est souvent désigné sous le nom de « méthode de Davis-Putnam » ou d'« algorithme DP ». On le trouve également sous les abréviations DLL et DPLL.
problème SAT est important tant du point de vue théorique que pratique. En théorie de la complexité, il a été le premier problème à être démontré NP-complet , et il peut apparaître dans une grande variété d'applications telles que la vérification de modèles , la planification et l'ordonnancement automatisés , et le diagnostic en intelligence artificielle .De ce fait, la conception de solveurs SAT efficaces est un sujet de recherche depuis de nombreuses années. GRASP (1996-1999) fut l'une des premières implémentations utilisant DPLL. Lors des compétitions internationales SAT, des implémentations basées sur DPLL telles que zChaff et MiniSat ont remporté les premières places des compétitions de 2004 et 2005.
Une autre application qui implique souvent DPLL est la démonstration automatisée de théorèmes ou la satisfaisabilité modulo théories (SMT), qui est un problème SAT dans lequel les variables propositionnelles sont remplacées par des formules d'une autre théorie mathématique .
L'algorithme
L'algorithme de retour arrière de base consiste à choisir une valeur littérale, à lui attribuer une valeur de vérité , à simplifier la formule, puis à vérifier récursivement si la formule simplifiée est satisfaisable. Si c'est le cas, la formule originale est satisfaisable ; sinon, la même vérification récursive est effectuée en supposant la valeur de vérité opposée. C'est ce qu'on appelle la règle de division , car elle divise le problème en deux sous-problèmes plus simples. L'étape de simplification consiste essentiellement à supprimer de la formule toutes les clauses qui deviennent vraies suite à l'attribution, et toutes les valeurs littérales qui deviennent fausses dans les clauses restantes.
L'algorithme DPLL améliore l'algorithme de retour arrière par l'utilisation systématique des règles suivantes à chaque étape :
- propagation unitaire
- Si une clause est une clause unitaire , c'est-à-dire qu'elle ne contient qu'une seule valeur littérale non assignée, cette clause ne peut être satisfaite qu'en assignant la valeur nécessaire pour rendre cette valeur littérale vraie. Ainsi, aucun choix n'est nécessaire. La propagation unitaire consiste à supprimer toute clause contenant la valeur littérale d'une clause unitaire et à supprimer le complément de cette valeur littérale de toute clause contenant ce complément. En pratique, cela conduit souvent à des cascades déterministes d'unités, évitant ainsi une grande partie de l'espace de recherche naïf.
- Élimination littérale pure
- Si une variable propositionnelle n'apparaît que dans une seule polarité au sein de la formule, elle est dite pure . Une valeur littérale pure peut toujours être assignée de manière à rendre vraies toutes les clauses la contenant. Ainsi, lorsqu'elle est assignée de cette façon, ces clauses ne contraignent plus la recherche et peuvent être supprimées.
L'insatisfiabilité d'une affectation partielle est détectée lorsqu'une clause devient vide, c'est-à-dire lorsque toutes ses variables ont été initialisées de manière à rendre les littéraux correspondants faux. La satisfaisabilité de la formule est détectée soit lorsque toutes les variables sont initialisées sans générer de clause vide, soit, dans les implémentations modernes, lorsque toutes les clauses sont satisfaites. L'insatisfiabilité de la formule complète ne peut être détectée qu'après une recherche exhaustive.
L'algorithme DPLL peut être résumé dans le pseudocode suivant, où Φ est la formule CNF :
Dans ce pseudocode, `f` unit-propagate(l, Φ)et ` pure-literal-assign(l, Φ)g` sont des fonctions qui renvoient respectivement le résultat de l'application de la propagation unitaire et de la règle de la conversion littérale pure à la formule `x = 0` let à la formule ` x = 0` Φ. Autrement dit, elles remplacent chaque occurrence de `x = l0` par « vrai » et chaque occurrence de not l`x = 0` par « faux » dans la formule ` x = 0` Φ, et simplifient la formule résultante. L' opérateur ` orx` dans l' returninstruction `g` est un opérateur de court-circuitage . `x` désigne le résultat simplifié de la substitution de `x = 0` par « vrai » dans `x = 0` .Φ ∧ {l}lΦ
L'algorithme se termine dans l'un des deux cas suivants : soit la formule CNF Φest vide (c'est-à-dire qu'elle ne contient aucune clause), auquel cas elle est satisfaite par toute affectation, puisque toutes ses clauses sont trivialement vraies ; soit, lorsqu'elle contient une clause vide, cette clause est trivialement fausse, car une disjonction requiert au moins un élément vrai pour que l'ensemble soit vrai. Dans ce cas, l'existence d'une telle clause implique que la formule (évaluée comme une conjonction de toutes les clauses) ne peut pas être vraie et est donc insatisfaisable.
La fonction DPLL en pseudocode indique seulement si l'affectation finale satisfait la formule ou non. Dans une implémentation réelle, l'affectation partielle satisfaisante est généralement également renvoyée en cas de succès ; on peut la déduire en conservant la trace des littéraux de branchement et des affectations littérales effectuées lors de la propagation unitaire et de l'élimination pure des littéraux.
L'algorithme de Davis-Logemann-Loveland dépend du choix du littéral de branchement , c'est-à-dire le littéral considéré lors de l'étape de retour arrière. Par conséquent, il ne s'agit pas à proprement parler d'un algorithme, mais plutôt d'une famille d'algorithmes, un pour chaque choix possible du littéral de branchement. L'efficacité est fortement influencée par ce choix : il existe des cas où le temps d'exécution est constant ou exponentiel selon le littéral de branchement choisi. Ces fonctions de choix sont également appelées fonctions heuristiques ou heuristiques de branchement.
Formalisation
Le calcul des séquents ( notation similaire à celle utilisée pour le calcul des séquents) permet de formaliser de nombreux algorithmes de réécriture, notamment DPLL. Voici les 5 règles qu'un solveur DPLL peut appliquer pour trouver ou non une affectation satisfaisante, c'est-à-dire :
Si une clause de la formule contient exactement une valeur littérale non affectée dans , toutes les autres valeurs littérales de la clause étant négatives, étendez avec . Cette règle illustre l'idée qu'une clause actuellement fausse avec une seule variable non affectée oblige à affecter cette variable de manière à rendre la clause entière vraie ; sinon, la formule ne sera pas satisfaite. Si une valeur littérale apparaît dans la formule mais pas sa négation , et que et ne sont pas dans , étendez avec . Cette règle illustre l'idée que si une variable n'apparaît que sous sa forme purement positive ou purement négative dans une formule, toutes ses occurrences peuvent être affectées à vrai ou faux pour rendre leurs clauses correspondantes vraies. Si une valeur littérale est dans l'ensemble des valeurs littérales de et que ni ni n'est dans , alors déterminez la valeur de vérité de et étendez avec la valeur littérale de décision . Cette règle illustre l'idée que si vous n'êtes pas obligé d'effectuer une affectation, vous devez choisir une variable à affecter et noter l'affectation choisie afin de pouvoir revenir en arrière si ce choix n'a pas abouti à une affectation satisfaisante. Si une clause se trouve dans , et que ses négations se trouvent dans , et peuvent être représentées comme où , alors il faut revenir en arrière en attribuant à . Cette règle illustre l'idée que si vous rencontrez une contradiction en cherchant une affectation valide, vous devez revenir à l'endroit où vous avez précédemment choisi entre deux affectations et sélectionner l'autre. Si une clause se trouve dans , et que ses négations se trouvent dans , et qu'il n'y a pas de marqueur de conflit dans , alors l'algorithme DPLL échoue. Cette règle illustre l'idée que si vous rencontrez une contradiction sans qu'il y ait eu d'autre solution possible, la formule est insatisfaisable.
Visualisation
Davis, Logemann et Loveland (1961) ont développé cet algorithme. Voici quelques propriétés de cet algorithme original :
- Il est basé sur la recherche.
- Il constitue la base de presque tous les solveurs SAT modernes.
- Il n'utilise ni l'apprentissage ni le retour en arrière non chronologique (introduit en 1996).
Exemple avec visualisation d'un algorithme DPLL avec retour arrière chronologique :
Algorithmes associés
Depuis 1986, les diagrammes de décision binaires (réduits) sont également utilisés pour la résolution de SAT.la démonstration automatique de théorèmes pour des fragments de logique du premier ordre au moyen de l' algorithme DPLL(T) .
Au cours de la décennie 2010-2019, les travaux d'amélioration de l'algorithme ont permis de trouver de meilleures politiques pour le choix des littéraux de branchement et de nouvelles structures de données afin d'accélérer l'algorithme, notamment la partie relative à la propagation unitaire . Cependant, l'amélioration majeure réside dans un algorithme plus puissant, l'apprentissage de clauses piloté par les conflits (CDCL), similaire à DPLL, mais qui, après avoir rencontré un conflit, « apprend » les causes profondes (affectations de variables) de ce conflit et utilise ces informations pour effectuer un retour arrière non chronologique (ou saut arrière ) afin d'éviter de rencontrer à nouveau le même conflit. La plupart des solveurs SAT de pointe étaient basés sur le cadre CDCL en 2019.
Relation avec d'autres notions
Les exécutions d'algorithmes basés sur DPLL sur des instances insatisfaisables correspondent à des preuves de réfutation par résolution d'arbres .