Chapter 8
User Simplification: user-provided simplification theories

This function allows to use user-provided rewrite theories in an efficient way. This theories are written in the PatchProver and/or in the associated Pmm file, they contain only rewrite rules and can be used with the following guard of the Logic Solver language:

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

where T is the proof tactic, B a formula we want to simplify and R a wildcard (syntaxically: a single letter) that receives the result of the tactic T rule application to formula B.

The order of rule applications is given by the proof tactics.

Syntax is as follows:

Tactic ::= T | T.n | T ; Tactic | T.n ; Tactic

where T is a rewrite theory name and n a positive integer (therefore T.n is a name of a rule from theory T). If the tactic is just a theory name, all the rewrite rules within it will be tried. If the tactic is a rule name, only the rewrite rule of the same name will be used. Finally, if the tactic is of form U ; V where U and V are tactics, Tactic U will be executed at first and then V.

EXAMPLE

Let us consider, for instance, the following rewrite rules that are contained in the PatchProver file:


 
        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  
 


These rules can be used in other user-provided rules in an efficient way with the predefined theory UserSimpX:


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