Nominal/Rsp.thy
changeset 2115 9b109ef7bf47
parent 2112 7c9746795767
child 2116 ce228f7b2b72
equal deleted inserted replaced
2114:3201a8c3456b 2115:9b109ef7bf47
    82    REPEAT o rtac @{thm exI[of _ "0 :: perm"]} THEN_ALL_NEW
    82    REPEAT o rtac @{thm exI[of _ "0 :: perm"]} THEN_ALL_NEW
    83    simp_tac (HOL_basic_ss addsimps @{thms alphas2}) THEN_ALL_NEW
    83    simp_tac (HOL_basic_ss addsimps @{thms alphas2}) THEN_ALL_NEW
    84    asm_full_simp_tac (HOL_ss addsimps (rsp @
    84    asm_full_simp_tac (HOL_ss addsimps (rsp @
    85      @{thms split_conv alphas fresh_star_def fresh_zero_perm permute_zero ball_triv add_0_left prod_rel.simps prod_fv.simps}))
    85      @{thms split_conv alphas fresh_star_def fresh_zero_perm permute_zero ball_triv add_0_left prod_rel.simps prod_fv.simps}))
    86   ))
    86   ))
    87 *}
       
    88 
       
    89 
       
    90 lemma exi: "\<exists>(pi :: perm). P pi \<Longrightarrow> (\<And>(p :: perm). P p \<Longrightarrow> Q (pi \<bullet> p)) \<Longrightarrow> \<exists>pi. Q pi"
       
    91 apply (erule exE)
       
    92 apply (rule_tac x="pi \<bullet> pia" in exI)
       
    93 by auto
       
    94 
       
    95 
       
    96 ML {*
       
    97 fun alpha_eqvt_tac induct simps ctxt =
       
    98   rtac induct THEN_ALL_NEW
       
    99   simp_tac (HOL_basic_ss addsimps simps) THEN_ALL_NEW split_conj_tac THEN_ALL_NEW
       
   100   REPEAT o etac @{thm exi[of _ _ "p"]} THEN' split_conj_tac THEN_ALL_NEW
       
   101   asm_full_simp_tac (HOL_ss addsimps (all_eqvts ctxt @ simps)) THEN_ALL_NEW
       
   102   asm_full_simp_tac (HOL_ss addsimps 
       
   103     @{thms supp_eqvt[symmetric] inter_eqvt[symmetric] empty_eqvt alphas prod_rel.simps prod_fv.simps}) THEN_ALL_NEW
       
   104   (split_conj_tac THEN_ALL_NEW TRY o resolve_tac
       
   105     @{thms fresh_star_permute_iff[of "- p", THEN iffD1] permute_eq_iff[of "- p", THEN iffD1]})
       
   106   THEN_ALL_NEW
       
   107   asm_full_simp_tac (HOL_ss addsimps (@{thms split_conv permute_minus_cancel permute_plus permute_eqvt[symmetric]} @ all_eqvts ctxt @ simps))
       
   108 *}
       
   109 
       
   110 ML {*
       
   111 fun build_alpha_eqvt alpha names =
       
   112 let
       
   113   val pi = Free ("p", @{typ perm});
       
   114   val (tys, _) = strip_type (fastype_of alpha)
       
   115   val indnames = Name.variant_list names (Datatype_Prop.make_tnames (map body_type tys));
       
   116   val args = map Free (indnames ~~ tys);
       
   117   val perm_args = map (fn x => mk_perm pi x) args
       
   118 in
       
   119   (HOLogic.mk_imp (list_comb (alpha, args), list_comb (alpha, perm_args)), indnames @ names)
       
   120 end
       
   121 *}
       
   122 
       
   123 ML {*
       
   124 fun build_alpha_eqvts funs tac ctxt =
       
   125 let
       
   126   val (gls, names) = fold_map build_alpha_eqvt funs ["p"]
       
   127   val gl = HOLogic.mk_Trueprop (foldr1 HOLogic.mk_conj gls)
       
   128   val thm = Goal.prove ctxt names [] gl tac
       
   129 in
       
   130   map (fn x => mp OF [x]) (HOLogic.conj_elims thm)
       
   131 end
       
   132 *}
    87 *}
   133 
    88 
   134 ML {*
    89 ML {*
   135 fun prove_fv_rsp fv_alphas_lst all_alphas tac ctxt =
    90 fun prove_fv_rsp fv_alphas_lst all_alphas tac ctxt =
   136 let
    91 let