4.16 Use equality in hypothesis

Réécriture daprès une égalité en hypothèse

Syntaxe

  eh(a, A, f)
avec :

Utilisation

Cette commande permet de remplacer a par A, soit dans le but courant, soit dans toutes les hypothèses, soit enfin dans l’hypothèse h.
Le mot-clé _h permet d’utiliser une égalité dont on ne connait qu’un membre (droit ou gauche). Dans ce cas, la dernière égalité en hypothèse, satisfaisante, est utilisée.

Si f = Hyp(h), le but devient :
  H B
où H est obtenu en remplaçant a par A dans l’hypothèse h, si elle existe.

Si f = AllHyp, le but devient :
  H B
où H est obtenu en remplaçant a par A dans toutes les hypothèses.

Si f = Goal, le but devient :
  B
B est obtenu en remplaçant a par A dans le but courant.

Très souvent, une preuve échoue parce qu’une égalité n’a pas été employée. Les démonstrateurs automatiques sont obligés de prendre des précautions avec les réécritures utilisant des égalités ; en effet, celles-ci peuvent générer des bouclages (voir chapitre 2.9 page §).
Le prouveur interactif peut, quant à lui, se permettre de telles réécritures, qui sont appliquées ponctuellement et sous le contrôle de l’opérateur.
Dans le cas d’une réécriture du but, il se peut que la commande interactive aille à l’encontre d’une normalisation faite par le prouveur automatique ; si on relance en automatique, celui-ci refera immédiatement la transformée inverse.
Néanmoins, la commande peut être utile si l’opérateur utilise d’autres commandes interactives sur le but réécrit, avant de rappeler le démonstrateur automatique.

Exemple 1

Soit la situation suivante :


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


Il est possible de substituer uu par zz dans le but.


 
PRI> eh(uu,zz,Goal)  
Starting use Equality in Hypothesis  
 


Le but devient :


 
    Goal  
        zz = e5 => zz = e1  
 


Il est possible d’effectuer la substitution pour une hypothèse


 
PRI> eh(zz,uu,Hyp(zz = e5 or zz = e1))  
Starting use Equality in Hypothesis  
 


Le but devient :


 
    Goal  
        uu = e5 or uu = e1 =>  (zz = e5 => zz = e1)  
 


Il est possible d’effectuer la substitution pour toutes les hypothèses.


 
PRI> eh(zz,uu,AllHyp)  
Starting use Equality in Hypothesis  
 


Toutes les nouvelles hypothèses apparaissent comme antécédent du but courant :


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


Exemple 2

Soit la situation suivante :


 
    Hypothesis  
        ENS = {e1,e2,e3,e4,e5} &  
      ENS: FIN(NATURAL*{ENS.enum}) &  
      not(ENS = {}) &  
        zz: ENS &  
        uu = tt or uu = zz &  
        tt: {e1,e2,e3,e4} => zz = e5 &  
        zz = e5 => tt: {e1,e2,e3,e4} &  
        tt = e5 => zz = e1 &  
        zz = e1 => tt = e5 &  
        zz = e5  
    Goal  
        e2 = e5 or e2 = zz  
 


Si l’opérateur désire utiliser une égalité avec e5 en membre de droite, sans s’occuper du membre de gauche :


 
PRI> eh(_h,e5,Goal)  
Starting use Equality in Hypothesis  
 


en utilisant l’égalité zz = e5, le but devient :


 
    Goal  
        e2 = e5 or e2 = e5  
 


Si l’opérateur désire utiliser la dernière égalité en hypothèse dont le membre gauche est zz :


 
PRI> eh(zz,_h,Goal)  
Starting use Equality in Hypothesis  
 


le but devient :


 
    Goal  
        e2 = e5 or e2 = e5  
 


Le but est effectivement transformé, en utilisant l’hypothèse zz = e5.