Les SMT solveurs sont en général basés sur un SAT solveur auquel on
a rajouté une procédure de décision pour chaque théorie. Dans le cas de
l’arithmétique linéaire par exemple, cette procédure est généralement l’algorithme
du simplex que vous verrez si vous faites le cours Algorithmique 2. En se plaçant
dans cette théorie, par exemple vous pouvez donner la formule suivante à un
SMT solveur :
∀x, y, z, 2x≥y+ 4z∨2x+ 3z≥3(y+ 1) ∨7y+ 3 ≥6x+ 4z
et il vous répondra que c’est effectivement un théorème (était-ce évident ?).
Le problème aussi bien avec les SAT solveurs que les SMT solveurs, c’est
qu’ils intègrent seulement une procédure de décision. Autrement dit leur réponse
peut-être :
•Oui
•Non
•Je ne sais pas
Mais imaginez que le SMT solveur ait un bug dans son code et qu’une fois
de temps en temps il se trompe, comment peut-on le savoir ? Afin d’augmenter
notre degré de confiance il peut-être plus intéressant de fournir une preuve (ou un
trace de preuve) dudit théorème. C’est l’objet des démonstrateurs automatiques.
Les démonstrateurs automatiques : ce sont des outils qui à l’instar des
SMT solveurs prennent en entrée un énoncé mathématique mais cette fois es-
sayent aussi de trouver une preuve (voir un contre-exemple). La contre-partie
c’est que trouver la preuve d’un énoncé peut prendre beaucoup plus de temps
que les procédures de décision que l’on trouve dans un SMT solveur.
Les assistants de preuve : ce sont des outils qui comme les démonstrateurs
automatiques construisent des preuves mais non plus de façon automatique mais
en interagissant avec un utilisateur. On ne peut pas attendre (en tout cas
aujourd’hui) des démonstrateurs automatiques de trouver des preuves de gros
théorèmes (petit théorème de Fermat, théorème de Feit-Thompson, théorème de
Fermat-Wiles). Heureusement, il est cependant possible d’écrire cette preuve
formellement et d’avoir un outil qui vérifie si la preuve est correct. C’est ce
qu’on étudiera dans la seconde partie de ce projet.
La programmation logique : c’est un autre paradigme de programmation
qui est très intéressant car il contient intrinsèquement du non-déterminisme.
Autrement dit, on a gratuitement un algorithme qui permet de faire du back-
tracking (ce dont on avait besoin pour le solveur du projet Fling par exemple).
Ce paradigme permet ainsi d’écrire en très peu de code des solveurs basiques
pour de nombreux problèmes (notamment tous les problèmes logiques comme
le sudoku, les dérivés de carrés latins, ...). Mais il est aussi utilisé en bio-
informatique ou bien en traitement automatique de la langue. C’est ce qu’on
verra dans la dernière partie de ce cours.
2