4.38 Prove

Appel du prouveur automatique

Syntaxe

  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 :

Utilisation

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

    Prover call has not done anything

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 :

        Fwd1~;(Fwd2;Fwd3)

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.

Exemple 1

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)  
 


Exemple 2

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  
 


Exemple 3

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.