Cette fonctionnalité permet à l’utilisateur d’employer des théories de simplification
particulières, dans le cadre de la réalisation de règles utilisateur. Ces théories, ne contenant que
des règles de réécriture, contenues dans le PatchProver et/ou dans le fichier Pmm asocié, sont
utilisables à l’aide de la garde en Langage de Théorie :
où T est la tactique de preuve, B une formule que l’on veut simplifier et R, un joker
(syntaxiquement : une unique lettre), qui reçoit le résultat de l’application des règles de la
tactique T sur la formule B.
Les tactiques de preuve représentent l’ordre d’application des règles de simplifications.
Leur syntaxe est la suivante :
Tactique ::= T | T.n | T ; Tactique | T.n ; Tactique
où T représente un nom de théorie de réécriture et n un entier (donc T.n dénote le nom d’une
règle de la théorie T). Ainsi quand la tactique est réduite à un nom de théorie, on tentera
l’application de toutes les règles de réécriture la composant. Quand la tactique est un nom de
règle, seule la règle de réécriture correspondante sera utilisée. Enfin, si la tactique est de la
forme U ; V où U et V sont des tactiques, on exécutera d’abord la tactique U puis
V.
EXEMPLE
Soit par exemple les règles de réécriture suivantes contenues dans le PatchProver :
THEORY Maplet IS x: f[{a}] == {x |-> a} <: f END & THEORY Enum_Simp IS binhyp(A : INTEGER) & binhyp(B : INTEGER) => (x: {A} \/ {B} == (x = A) or (x = B)) END
|
On peut utiliser ces règles au niveau d’autres règles utilisateur de manière simplifiée et
optimisée pour réduire la consommation mémoire à l’aide de la théorie prédéfinie
UserSimpX :
THEORY Preuve_Admise IS bguard(UserSimpX: UserSimpG(Maplet|x:f[{a}]),R) & bsubfrm({x|->a},btrue,R,r) & bnum(a) & binhyp(not(Eval({x|->a}) = {y,z})) => not(x:{y,z} & x:f[{a}]) END
|