Utilisation de Règles de Réécriture Utilisateur
us(T)
us(T | M)
avec :
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′
où 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.
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}])
|