Appel du prouveur automatique
pr
pr(r.b.h,f,s)
pr(Tac(t),r.b.h,f,s)
pr(Tac(t))
pr(Red)
pr(Red,r.b.h,f,s)
avec :
Cette commande permet de faire appel au démonstrateur automatique pour prouver l’obligation
de preuve courante.
La commande pr est aussi utile pour relancer une preuve qui a presque réussi, mais
qui s’est arrêtée parce qu’un nombre d’essais maximum était atteint. En effet, le
prouveur automatique possède un certain nombre de compteurs qui limitent le nombre
d’applications de certains mécanismes dans un même appel, pour éviter les bouclages.
Lancer pr plusieurs fois de suite peut donc avoir une action.
Si un appel à pr n’a réellement rien fait, ceci est signalé par le message
Dans ce cas, il est inutile de le relancer.
Le prouveur retourne un message indiquant si la preuve a échoué ou réussi.
Les commandes pr(r.b.h,f,s) et pr(Tac(t),r.b.h,f,s) permettent de lancer le prouveur en mode trace (voir chapitre 10 page §). Les paramètres f, s et Tac(t) sont facultatifs, mais si l’on désire expliciter s, il faut alors expliciter aussi f (l’ordre des paramètres doit être conservé).
Les informations suivantes sont disponibles :
La présence du paramètre Tac(t) permet d’utiliser les règles utilisateurs (pmm (voir chapitre 6
page §), PatchProver (voir chapitre 7 page §)) au sein même du prouveur automatique. Les
tactiques backward de l’utilisateur s’appliquent après la montée des hypothèses locales dans la
pile des hypothèses et avant l’appel à la base de règles.
Les tactiques forward se comportent comme les règles d’une seule théorie. Ces règles sont
employées avec les règles forward du prouveur. L’utilisateur ne peut pas utiliser des tactiques
complexes avec les règles Forward. Par exemple, la tactique forward suivante n’est pas
valable :
Si on utilise la commande pr(Tac(arriere,avant)), le prouveur interactif va tenter d’appliquer
les règles de la théorie arriere. Si celles-ci génèrent des hypothèses, il faut que la théorie
prédéfinie DED apparaisse dans la tactique arriere. Dans ce cas, les règles de la tactique
avant vont traiter les hypothèses montantes.
En force 0 ou 1, la commande pr(Red) permet d’utiliser le prouveur sans tenter de la preuve par cas. Cet appel au prouveur automatique se limite :
En ce qui concerne les forces Rapide, 2 et 3, la commande pr(Red) à le même comportement que pr et peut donc éventuellement déclencher des preuves par cas.
Soit la situation suivante :
New Hypothesis since last command e1: ENS & 1: 1..5 & 1: 1..100 & 1: 1..10 & 0<=1 & 1: NATURAL & 1: INTEGER & 0<=zz & 0<=yy & 0<=xx & not(uu = e5) & not(1: NATURAL) => -1: NATURAL Goal not(uu = e1)
|
Un premier appel au prouveur automatique n’a pas permis de décharger le but courant. On
essaye une deuxième application de la commande pr pour voir si le prouveur automatique n’a
pas échoué dans la preuve, à cause de la limitation du nombre d’applications de règles
(compteurs internes du prouveurs limitant le risque de bouclage (voir chapitre 2.9
page §)).
PRI> pr Starting Prover Call
|
Le message Prover call did nothing nous indique que le prouveur n’a pas réussi, de manière définitive, à prouver le but courant et qu’il n’a pas produit d’hypothèse supplémentaire.
Prover call did nothing Goal not(uu = e1)
|
Voyons maintenant le fonctionnement du prouveur en mode Trace.
Soit la situation suivante :
Hypothesis xx: 1..10 & yy: 1..10 & zz: 1..100 Goal xx+yy-1: 1..100
|
Le prouveur est lancé en mode Trace : le corps des règles ainsi que les informations relatives
aux hypothèses ne sont pas affichées, tous les buts sont listés.
PRI> pr(None.Goal.None) Starting Trace in mode None.Goal.None , NoFile Starting Prover Call After deduction, goal is now xx+yy-1: 1..100
|
Le but initial est décomposé en 2 sous-buts.
By applying atomic rule InSetXY.13, the goal xx+yy-1: 1..100 is now 1<=xx+yy-1 and xx+yy-1<=100 Goal 1<=xx+yy-1 is simplified in 0<= -2+xx+yy Because 0 is a lower bound of -2+xx+yy - 0 Goal 0<= -2+xx+yy is discharged.
|
Le premier sous-but a été simplifié puis déchargé. Le deuxième sous-but est alors traité.
Comme (xx,yy) ∈ (1..10) × (1..10), 101 - xx - yy est minoré par 81 :
Goal xx+yy-1<=100 is simplified in 0<=101-xx-yy Because 81 is a lower bound of 101-xx-yy - 0 Goal 0<=101-xx-yy is discharged. End of trace
|
Si l’on avait appliqué la commande pr(Ru.Goal.None), la partie de la trace concernant la
règle InSetXY.13, c’est à dire :
By applying atomic rule InSetXY.13,
|
aurait été :
By applying atomic rule InSetXY.13, n<=a & a<=p => a: n..p
|
L’exemple suivant présente l’utilisation du paramètre Tac, pour l’utilisation de tactiques
backward et forward.
Soit l’obligation de preuve suivante :
entiers <: INTEGER & xx: INTEGER & xx-1: entiers & => xx: entiers
|
Le fichier PMM associé contient les théories arriere et avant :
THEORY arriere IS xx-1: entiers => xx: entiers => p => p END & THEORY avant IS xx-1: entiers => xx: entiers END
|
La commande pr(Tac((arriere ;DED),avant)) permet de décharger le but courant.