Le solveur SMT est un solveur SAT + une procédure de décision
Un solveur SAT est un solveur pour un problème de décision: le problème SAT est un problème de décision. De plus, ce problème de décision est "auto-réductible":
Le problème SAT est auto-réductible, c'est-à-dire que chaque algorithme qui répond correctement si une instance de SAT est résoluble peut être utilisé pour trouver une affectation satisfaisante
- ( wikipedia )
Cela signifie que les solveurs SAT peuvent également donner l'affectation satisfaisante, en plus de décider du problème.
Les solveurs TL; DR SMT résolvent une généralisation du problème SAT, en fonction des types / contraintes autorisés dans la théorie. En outre, ils permettent également le codage de relations de type de niveau supérieur à ce que permettent les codages SAT.
( A = B ) ∧ ( B = C)⟹( A = C)
- Voir le solveur Beaver SMT qui peut même générer le problème SAT équivalent qui devrait être résolu.
Bien que le solveur QF_BV SMT ait cet avantage sur un solveur SAT, je ne pense pas que ce soit un avantage de complexité: ils sont tous deux essentiellement équivalents et prennent un temps exponentiel pour résoudre leurs pires problèmes. Mais en pratique, un solveur SMT QF_BV pourrait être beaucoup plus rapide en raison de cette connaissance supplémentaire. Voir ma réponse aux Limites des solveurs SMT , pour un exemple de quelque chose considéré comme "dur" que les solveurs SMT QF_BV (actuels) et les solveurs SAT étoufferaient tous les deux.
Il existe également des solveurs SMT qui tentent de résoudre des problèmes encore plus difficiles que la satisfaction booléenne (par exemple, autoriser des types et des contraintes sur des réels ou autoriser des quantificateurs); évidemment, ceux-ci sont théoriquement au moins aussi lents qu'un solveur SAT. Ces solveurs SMT permettent de résoudre une généralisation du problème SAT; au lieu d'utiliser des variables binaires, chaque "théorie" permet des relations / contraintes sur différents domaines, tels que des réels, ou des contraintes quantifiées (pour tous).
Prouveur de théorème
Un prouveur de théorème automatisé est un solveur qui, étant donné une sorte de système de preuve, certaines hypothèses et un objectif à prouver, "comblera les lacunes" entre les hypothèses et l'objectif. Il aura également une sorte de vérificateur pour vérifier les preuves (qui s'exécute rapidement). Un prouveur de théorème peut s'appuyer sur un solveur SAT pour remplir les blancs; en fait, siP= NP et il existe un algorithme pratique pour résoudre les problèmes NP-complets, on peut potentiellement prouver presque toutes les choses prouvables utiles (dans un délai raisonnable):
Mais ces changements peuvent avoir une signification pâle par rapport à la révolution qu'une méthode efficace pour résoudre les problèmes NP-complets entraînerait en mathématiques elle-même. Selon Stephen Cook, [19]
... il transformerait les mathématiques en permettant à un ordinateur de trouver une preuve formelle de tout théorème qui a une preuve d'une longueur raisonnable, car les preuves formelles peuvent facilement être reconnues en temps polynomial. Les exemples de problèmes peuvent inclure tous les problèmes de prix CMI.
- ( wikipedia )
[19]: Cook, Stephen (avril 2000). Le problème P versus NP. Clay Mathematics Institute (PDF) .
La raison pour laquelle cela fonctionnerait est que "les preuves formelles peuvent facilement être reconnues en temps polynomial" via le vérificateur, et P= NP impliquerait que les problèmes qui peuvent être vérifiés en temps polynomial peuvent également être résolus en temps polynomial.
Mais pour l'instant, les théoriciens automatisés utilisent principalement des heuristiques ou des algorithmes de temps exponentiels (mais sont toujours utiles).
Solveur de contraintes
Il s'agit généralement de reformulations des solveurs SAT / SMT dans d'autres langues. Si vous avez déjà utilisé des solveurs SAT / SMT pour résoudre un problème, vous pouvez vraiment aimer la capacité non déterministe des solveurs. Autrement dit, au lieu de dire à l'ordinateur comment faire quelque chose, vous lui dites ce que vous voulez , c'est-à-dire. quelles propriétés vous voulez que la sortie ait, et un solveur SAT / SMT le fera dans un "remplissage" non déterministe, sans vous déranger avec les détails d'implémentation. Ce type de paradigme de programmation est très attrayant, et s'appelle la programmation par contraintes , et pour fonctionner, il doit utiliser un solveur de contraintes (qui pourrait utiliser un solveur SAT / SMT dans le backend, selon les types et les contraintes qu'il vous permet d'utiliser) .
Mais je vois des gens appeler Z3 un prouveur de théorème. Je ne sais donc pas comment mépriser ces termes.
AFAIK, Z3 est une suite de nombreux outils, y compris un solveur SMT, plusieurs langages de vérification de modèle / vérification de modèle, et plus encore.
Et quel est le terme le plus général pour tous?
Je pense que la généralisation du problème de satisfiabilité est les Théories de Modulo de Satisfaisabilité , et donc le "solveur SMT" serait le plus général de tous. Cependant, toutes les implémentations de solveurs SMT ne résolvent pas toutes les théories, ce qui ne signifie pas que tous les solveurs SMT sont également généraux.