Nominal/nominal_dt_supp.ML
changeset 2448 b9d9c4540265
child 2449 6b51117b8955
equal deleted inserted replaced
2447:76be909eaf04 2448:b9d9c4540265
       
     1 (*  Title:      nominal_dt_alpha.ML
       
     2     Author:     Christian Urban
       
     3     Author:     Cezary Kaliszyk
       
     4 
       
     5   Deriving support propoerties for the quotient types.
       
     6 *)
       
     7 
       
     8 signature NOMINAL_DT_SUPP =
       
     9 sig
       
    10   val prove_supports: Proof.context -> thm list -> term list -> thm list  
       
    11 
       
    12 end
       
    13 
       
    14 structure Nominal_Dt_Supp: NOMINAL_DT_SUPP =
       
    15 struct
       
    16 
       
    17 
       
    18 (* supports lemmas *)
       
    19 
       
    20 fun mk_supports_goal ctxt qtrm =
       
    21 let  
       
    22   val vs = fresh_args ctxt qtrm
       
    23   val rhs = list_comb (qtrm, vs)
       
    24   val lhs = mk_supp (foldl1 HOLogic.mk_prod vs)
       
    25 in
       
    26   mk_supports lhs rhs
       
    27   |> HOLogic.mk_Trueprop
       
    28 end
       
    29 
       
    30 fun supports_tac ctxt perm_simps =
       
    31 let
       
    32   val ss1 = HOL_basic_ss addsimps @{thms supports_def fresh_def[symmetric]}
       
    33   val ss2 = HOL_ss addsimps @{thms swap_fresh_fresh fresh_Pair}
       
    34 in
       
    35   EVERY' [ simp_tac ss1,
       
    36            Nominal_Permeq.eqvt_strict_tac ctxt perm_simps [],
       
    37            simp_tac ss2 ]
       
    38 end
       
    39 
       
    40 fun prove_supports_single ctxt perm_simps qtrm =
       
    41 let
       
    42   val goal = mk_supports_goal ctxt qtrm 
       
    43   val ctxt' = Variable.auto_fixes goal ctxt
       
    44 in
       
    45   Goal.prove ctxt' [] [] goal
       
    46    (K (HEADGOAL (supports_tac ctxt perm_simps)))
       
    47   |> singleton (ProofContext.export ctxt' ctxt)
       
    48 end
       
    49 
       
    50 fun prove_supports ctxt perm_simps qtrms =
       
    51   map (prove_supports_single ctxt perm_simps) qtrms
       
    52 
       
    53 
       
    54 
       
    55 
       
    56 end (* structure *)
       
    57