4.36 Particularize hypothesis

Instanciation dune hypothèse universellement quantifiée

Syntaxe

  ph(v1,,vn,h)
avec :

Utilisation

Cette commande permet d’assigner une valeur aux variables qui apparaissent, en hypothèse, sous la portée d’un même quantificateur universel. On affecte les valeurs v1,,vn aux variables w1,,wn. Si la valeur d’une ou plusieurs variables n’est pas connue, on peut utiliser le mot-clé _h pour signifier que la ou les variables ne seront pas instanciées. Par exemple :

     ph(e1,ENS1,_h,(MAXINT-ff(3)), !(aa,bb,cc,dd).PP(aa,bb,cc,dd))

permettra de générer l’hypothèse correspondant à

     !cc.PP(e1,ENS1,cc,(MAXINT-ff(3)))

B étant le but initial, le but devient :
  P(v1,,vn) (Q(v1,,vn) B)

Les prédicats P(v1,,vn) contiennent les typages de v1,,vn.

Notons cependant que la particularisation des hypothèses quantifiées universellement n’est pas protégée contre le mauvais typage (voir chapitre 2.2 page §) ainsi que la mauvaise définition (voir chapitre 2.3 page §). On peut instancier une variable liée par une valeur mal typée ou mal définie. L’utilisateur doit donc vérifier la correction du typage et la bonne définition de ces valeurs avant d’utiliser cette commande.

Ceci peut être vérifié a posteriori à l’aide de l’outil mdelta (cf. Manuel Utilisateur Version 1.0.).

Exemple

Soit la situation suivante :


 
    Hypothesis  
        ENS = {e1,e2,e3,e4,e5} &  
        tt: ENS &  
        uu: ENS &  
        zz: ENS &  
        !vv.(vv: ENS & (not(uu = vv) or not(tt = vv)) => zz = vv)  
    Goal  
        not(tt = uu)  
 


L’opérateur désire utiliser l’hypothèse vv.(vv ENS (not(uu = vv) not(tt = vv)) zz = vv), en instanciant vv avec la valeur e1.
La preuve de vv ENS (not(uu = vv) not(tt = vv)) zz = vv va se décomposer en deux parties (après instanciation) :

Si ces deux sous-buts sont prouvés alors le but deviendra zz = e1  not(tt = uu).


 
PRI> ph(e1,!vv.(vv: ENS & (not(uu = vv) or not(tt = vv)) => zz = vv))  
Starting Particularize Hypothesis  
 


Le prédicat de typage instancié doit d’abord être prouvé :


 
    Goal  
        e1: ENS  
 


La commande pr permet de décharger ce premier sous-but.


 
PRI> pr  
 


Le but suivant est donc :


 
    Goal  
        not(uu = e1) or not(tt = e1)  
 


L’opérateur lance alors le coeur de preuve :


 
PRI> pr  
Starting Prover Call  
 


Le but est prouvé. Le but suivant est alors généré :


 
    Goal  
        zz = e1 => not(tt = uu))  
 


Le prédicat zz = e1 peut alors être mis en hypothèse par l’une des deux commandes pr ou dd (voir chapitre 4.14 page §).