Chapitre 8
User Simplification : théories de simplification de l’utilisateur

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 :

bguard(UserSimpX : UserSimpG(T | B), R)

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

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 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