4.56 User Simplification

Utilisation de Règles de Réécriture Utilisateur

Syntaxe

  us(T)
  us(T | M)
avec :

Utilisation

Cette commande permet d’utiliser des règles de réécriture utilisateur (contenues dans le PatchProver et/ou dans un fichier Pmm), soit sur l’hypothèse h, soit sur toutes les hypothèses, soit enfin sur le but courant en limitant au maximum la consommation de mémoire.

Lorsqu’une tactique composée (c’est-à-dire une liste de tactique séparée par des point-virgules) est utilisée, on applique d’abord les règles spécifiées par la tactique la plus à gauche, puis celles des autres tactiques, en parcourant la liste de gauche à droite.

Si M = Hyp(h), le but devient :
  H B
où H est obtenu en appliquant les simplifications sur l’hypothèse h, si elle existe.

Si M = AllHyp, le but devient :
  H B
où H est obtenu en appliquant les réécritures sur toutes les hypothèses.

Si M = Goal, le but devient :
  B
B est obtenu en réécrivant le but courant B à l’aide des règles de simplification.

On essaie d’appliquer une règle de réécriture donnée tant qu’elle est susceptible de s’appliquer.

Exemple

Soit les théories utilisateurs suivantes contenues dans le PatchProver ou dans un fichier Pmm :


 
THEORY Mes_Simplifications IS  
 
x: f[{a}] == {x |-> a} <: f;  
 
(x + y)*z == (x*z + y*z)  
END  
 
&  
 
THEORY Enum_Simp IS  
 
binhyp(A : INTEGER) &  
binhyp(B : INTEGER)  
=>  
(x: {A}\/{B} == (x = A) or (x = B))  
 
END  
 


Soit alors l’obligation de preuve suivante :


 
Hypotheses  
...  
aa : INTEGER &  
bb : INTEGER &  
6 <= (xx+2)*3 &  
yy: {aa,bb}  
...  
Goal  
xx: ENS => not((xx+yy)*2 : gg[{5}])  
 


On peut réécrire le but en utilisant les réécritures de Mes_Simplifications :


   PRV> us(Mes_Simplifications|_Goal)  
 


Cela donne donc le but :


    Goal  
        xx: ENS => not({(xx*2 + yy*2) |-> 5} <: gg)  
 


On peut aussi par exemple ne vouloir appliquer que la première règle de réécriture de Mes_Simplifications. On doit alors expliciter la règle que l’on souhaite utiliser. Dans notre cas, le nom de la première règle de la théorie Mes_Simplifications est Mes_Simplifications.1.


 
PRI> us(Mes_Simplifications.1)  
 


Le but devient :


 
    Goal  
        xx: ENS => not({(xx+yy)*2 |-> 5} <: gg)  
 


On a bien appliqué la première règle seulement.

Il est aussi possible d’effectuer les simplifications pour toutes les hypothèses.


 
PRI> us(Mes_Simplifications;Enum_Simp|_AllHyp)  
 


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


 
Goal  
6<=(xx*3 + xx*3) &  
yy = aa or yy = bb  
=>  
xx: ENS => not((xx+yy)*2 : gg[{5}])  
 


On peut enfin décider de ne simplifier qu’une hypothèse :


 
PRV> us(Mes_Simplifications|_Hyp(6<=(xx+2)*3))  
 
 


On obtient alors :


 
Goal  
6<=(xx*3 + xx*3)  
=>  
xx: ENS => not((xx+yy)*2 : gg[{5}])