Quot/Nominal/Rsp.thy
changeset 1258 7d8949da7d99
parent 1252 4b0563bc4b03
child 1259 db158e995bfc
equal deleted inserted replaced
1252:4b0563bc4b03 1258:7d8949da7d99
     1 theory Rsp
       
     2 imports Abs
       
     3 begin
       
     4 
       
     5 ML {*
       
     6 fun define_quotient_type args tac ctxt =
       
     7 let
       
     8   val mthd = Method.SIMPLE_METHOD tac
       
     9   val mthdt = Method.Basic (fn _ => mthd)
       
    10   val bymt = Proof.global_terminal_proof (mthdt, NONE)
       
    11 in
       
    12   bymt (Quotient_Type.quotient_type args ctxt)
       
    13 end
       
    14 *}
       
    15 
       
    16 ML {*
       
    17 fun const_rsp lthy const =
       
    18 let
       
    19   val nty = fastype_of (Quotient_Term.quotient_lift_const ("", const) lthy)
       
    20   val rel = Quotient_Term.equiv_relation_chk lthy (fastype_of const, nty);
       
    21 in
       
    22   HOLogic.mk_Trueprop (rel $ const $ const)
       
    23 end
       
    24 *}
       
    25 
       
    26 (* Replaces bounds by frees and meta implications by implications *)
       
    27 ML {*
       
    28 fun prepare_goal trm =
       
    29 let
       
    30   val vars = strip_all_vars trm
       
    31   val fs = rev (map Free vars)
       
    32   val (fixes, no_alls) = ((map fst vars), subst_bounds (fs, (strip_all_body trm)))
       
    33   val prems = map HOLogic.dest_Trueprop (Logic.strip_imp_prems no_alls)
       
    34   val concl = HOLogic.dest_Trueprop (Logic.strip_imp_concl no_alls)
       
    35 in
       
    36   (fixes, fold (curry HOLogic.mk_imp) prems concl)
       
    37 end
       
    38 *}
       
    39 
       
    40 ML {*
       
    41 fun get_rsp_goal thy trm =
       
    42 let
       
    43   val goalstate = Goal.init (cterm_of thy trm);
       
    44   val tac = REPEAT o rtac @{thm fun_rel_id};
       
    45 in
       
    46   case (SINGLE (tac 1) goalstate) of
       
    47     NONE => error "rsp_goal failed"
       
    48   | SOME th => prepare_goal (term_of (cprem_of th 1))
       
    49 end
       
    50 *}
       
    51 
       
    52 ML {*
       
    53 fun repeat_mp thm = repeat_mp (mp OF [thm]) handle THM _ => thm
       
    54 *}
       
    55 
       
    56 ML {*
       
    57 fun prove_const_rsp bind consts tac ctxt =
       
    58 let
       
    59   val rsp_goals = map (const_rsp ctxt) consts
       
    60   val thy = ProofContext.theory_of ctxt
       
    61   val (fixed, user_goals) = split_list (map (get_rsp_goal thy) rsp_goals)
       
    62   val fixed' = distinct (op =) (flat fixed)
       
    63   val user_goal = HOLogic.mk_Trueprop (foldr1 HOLogic.mk_conj user_goals)
       
    64   val user_thm = Goal.prove ctxt fixed' [] user_goal tac
       
    65   val user_thms = map repeat_mp (HOLogic.conj_elims user_thm)
       
    66   fun tac _ = (REPEAT o rtac @{thm fun_rel_id} THEN' resolve_tac user_thms THEN_ALL_NEW atac) 1
       
    67   val rsp_thms = map (fn gl => Goal.prove ctxt [] [] gl tac) rsp_goals
       
    68 in
       
    69    ctxt
       
    70 |> snd o Local_Theory.note 
       
    71   ((Binding.empty, [Attrib.internal (fn _ => Quotient_Info.rsp_rules_add)]), rsp_thms)
       
    72 |> snd o Local_Theory.note ((bind, []), user_thms)
       
    73 end
       
    74 *}
       
    75 
       
    76 
       
    77 
       
    78 ML {*
       
    79 fun fvbv_rsp_tac induct fvbv_simps =
       
    80   ((((rtac impI THEN' etac induct) ORELSE' rtac induct) THEN_ALL_NEW
       
    81   (TRY o rtac @{thm TrueI})) THEN_ALL_NEW asm_full_simp_tac
       
    82   (HOL_ss addsimps (@{thm alpha_gen} :: fvbv_simps)))
       
    83 *}
       
    84 
       
    85 ML {*
       
    86 fun constr_rsp_tac inj rsp equivps =
       
    87 let
       
    88   val reflps = map (fn x => @{thm equivp_reflp} OF [x]) equivps
       
    89 in
       
    90   REPEAT o rtac impI THEN'
       
    91   simp_tac (HOL_ss addsimps inj) THEN'
       
    92   (TRY o REPEAT_ALL_NEW (CHANGED o rtac conjI)) THEN_ALL_NEW
       
    93   (asm_simp_tac HOL_ss THEN_ALL_NEW (
       
    94    rtac @{thm exI[of _ "0 :: perm"]} THEN'
       
    95    asm_full_simp_tac (HOL_ss addsimps (rsp @ reflps @
       
    96      @{thms alpha_gen fresh_star_def fresh_zero_perm permute_zero ball_triv}))
       
    97   ))
       
    98 end
       
    99 *}
       
   100 
       
   101 (* Testing code
       
   102 local_setup {* prove_const_rsp @{binding fv_rtrm2_rsp} [@{term rbv2}]
       
   103   (fn _ => fv_rsp_tac @{thm alpha_rtrm2_alpha_rassign.inducts(2)} @{thms fv_rtrm2_fv_rassign.simps} 1) *}*)
       
   104 
       
   105 (*ML {*
       
   106   val rsp_goals = map (const_rsp @{context}) [@{term rbv2}]
       
   107   val (fixed, user_goals) = split_list (map (get_rsp_goal @{theory}) rsp_goals)
       
   108   val fixed' = distinct (op =) (flat fixed)
       
   109   val user_goal = HOLogic.mk_Trueprop (foldr1 HOLogic.mk_conj user_goals)
       
   110 *}
       
   111 prove ug: {* user_goal *}
       
   112 ML_prf {*
       
   113 val induct = @{thm alpha_rtrm2_alpha_rassign.inducts(2)}
       
   114 val fv_simps = @{thms rbv2.simps}
       
   115 *} 
       
   116 *)
       
   117 
       
   118 end