diff -r 3b9c05d158f3 -r a2142526bb01 Nominal/Rsp.thy --- a/Nominal/Rsp.thy Fri Mar 26 09:23:23 2010 +0100 +++ b/Nominal/Rsp.thy Fri Mar 26 10:07:26 2010 +0100 @@ -1,5 +1,5 @@ theory Rsp -imports Abs +imports Abs Tacs begin ML {* @@ -74,12 +74,8 @@ *} ML {* -fun ind_tac induct = (rtac impI THEN' etac induct) ORELSE' rtac induct -*} - -ML {* fun fvbv_rsp_tac induct fvbv_simps ctxt = - ind_tac induct THEN_ALL_NEW + rel_indtac induct THEN_ALL_NEW (TRY o rtac @{thm TrueI}) THEN_ALL_NEW asm_full_simp_tac (HOL_basic_ss addsimps @{thms alpha_gen2}) THEN_ALL_NEW asm_full_simp_tac (HOL_ss addsimps (@{thm alpha_gen} :: fvbv_simps)) THEN_ALL_NEW @@ -92,13 +88,12 @@ fun sym_eqvts ctxt = map (fn x => sym OF [x]) (Nominal_ThmDecls.get_eqvts_thms ctxt) fun all_eqvts ctxt = Nominal_ThmDecls.get_eqvts_thms ctxt @ Nominal_ThmDecls.get_eqvts_raw_thms ctxt -val split_conjs = REPEAT o etac conjE THEN' TRY o REPEAT_ALL_NEW (CHANGED o rtac conjI) *} ML {* fun constr_rsp_tac inj rsp = REPEAT o rtac impI THEN' - simp_tac (HOL_ss addsimps inj) THEN' split_conjs THEN_ALL_NEW + simp_tac (HOL_ss addsimps inj) THEN' split_conj_tac THEN_ALL_NEW (asm_simp_tac HOL_ss THEN_ALL_NEW ( REPEAT o rtac @{thm exI[of _ "0 :: perm"]} THEN_ALL_NEW simp_tac (HOL_basic_ss addsimps @{thms alpha_gen2}) THEN_ALL_NEW @@ -107,23 +102,6 @@ )) *} -(* Testing code -local_setup {* snd o prove_const_rsp @{binding fv_rtrm2_rsp} [@{term rbv2}] - (fn _ => fv_rsp_tac @{thm alpha_rtrm2_alpha_rassign.inducts(2)} @{thms fv_rtrm2_fv_rassign.simps} 1) *}*) - -(*ML {* - val rsp_goals = map (const_rsp @{context}) [@{term rbv2}] - val (fixed, user_goals) = split_list (map (get_rsp_goal @{theory}) rsp_goals) - val fixed' = distinct (op =) (flat fixed) - val user_goal = HOLogic.mk_Trueprop (foldr1 HOLogic.mk_conj user_goals) -*} -prove ug: {* user_goal *} -ML_prf {* -val induct = @{thm alpha_rtrm2_alpha_rassign.inducts(2)} -val fv_simps = @{thms rbv2.simps} -*} -*) - ML {* fun perm_arg arg = let @@ -150,13 +128,13 @@ ML {* fun alpha_eqvt_tac induct simps ctxt = - ind_tac induct THEN_ALL_NEW + rel_indtac induct THEN_ALL_NEW simp_tac ((mk_minimal_ss ctxt) addsimps simps) THEN_ALL_NEW - REPEAT o etac @{thm exi[of _ _ "p"]} THEN' split_conjs THEN_ALL_NEW + REPEAT o etac @{thm exi[of _ _ "p"]} THEN' split_conj_tac THEN_ALL_NEW asm_full_simp_tac (HOL_ss addsimps (all_eqvts ctxt @ simps)) THEN_ALL_NEW asm_full_simp_tac (HOL_ss addsimps @{thms supp_eqvt[symmetric] inter_eqvt[symmetric] empty_eqvt alpha_gen}) THEN_ALL_NEW - (split_conjs THEN_ALL_NEW TRY o resolve_tac + (split_conj_tac THEN_ALL_NEW TRY o resolve_tac @{thms fresh_star_permute_iff[of "- p", THEN iffD1] permute_eq_iff[of "- p", THEN iffD1]}) THEN_ALL_NEW asm_full_simp_tac (HOL_ss addsimps (@{thms split_conv permute_minus_cancel permute_plus permute_eqvt[symmetric]} @ all_eqvts ctxt @ simps)) @@ -231,6 +209,8 @@ end *} +(** alpha_bn_rsp **) + lemma equivp_rspl: "equivp r \ r a b \ r a c = r b c" unfolding equivp_reflp_symp_transp symp_def transp_def @@ -242,39 +222,38 @@ by blast ML {* -fun prove_alpha_bn_rsp alphas inducts exhausts inj_dis equivps ctxt (alpha_bn, n) = +fun alpha_bn_rsp_tac simps res exhausts a ctxt = + rtac allI THEN_ALL_NEW + case_rules_tac ctxt a exhausts THEN_ALL_NEW + asm_full_simp_tac (HOL_ss addsimps simps) THEN_ALL_NEW + TRY o REPEAT_ALL_NEW (rtac @{thm arg_cong2[of _ _ _ _ "op \"]}) THEN_ALL_NEW + TRY o eresolve_tac res THEN_ALL_NEW + asm_full_simp_tac (HOL_ss addsimps simps); +*} + + +ML {* +fun build_alpha_bn_rsp_gl a alphas alpha_bn ctxt = let - val alpha = nth alphas n; - val ty = domain_type (fastype_of alpha); - val ([x, y, a], ctxt') = Variable.variant_fixes ["x","y","a"] ctxt; - val [l, r] = map (fn x => (Free (x, ty))) [x, y] - val lhs = HOLogic.mk_Trueprop (alpha $ l $ r) - val g1 = - Logic.mk_implies (lhs, - HOLogic.mk_Trueprop (HOLogic.mk_all (a, ty, - HOLogic.mk_eq (alpha_bn $ l $ Bound 0, alpha_bn $ r $ Bound 0)))); - val g2 = - Logic.mk_implies (lhs, - HOLogic.mk_Trueprop (HOLogic.mk_all (a, ty, - HOLogic.mk_eq (alpha_bn $ Bound 0 $ l, alpha_bn $ Bound 0 $ r)))); - val resl = map (fn x => @{thm equivp_rspl} OF [x]) equivps; - val resr = map (fn x => @{thm equivp_rspr} OF [x]) equivps; - fun tac {context, ...} = ( - etac (nth inducts n) THEN_ALL_NEW - (TRY o rtac @{thm TrueI}) THEN_ALL_NEW rtac allI THEN_ALL_NEW - split_conjs THEN_ALL_NEW - InductTacs.case_rule_tac context a (nth exhausts n) THEN_ALL_NEW - asm_full_simp_tac (HOL_ss addsimps inj_dis) THEN_ALL_NEW - TRY o REPEAT_ALL_NEW (rtac @{thm arg_cong2[of _ _ _ _ "op \"]}) THEN_ALL_NEW - TRY o eresolve_tac (resl @ resr) THEN_ALL_NEW - asm_full_simp_tac (HOL_ss addsimps inj_dis) - ) 1; - val t1 = Goal.prove ctxt [] [] g1 tac; - val t2 = Goal.prove ctxt [] [] g2 tac; + val ty = domain_type (fastype_of alpha_bn); + val (l, r) = the (AList.lookup (op=) alphas ty); in - Variable.export ctxt' ctxt [t1, t2] + ([HOLogic.mk_all (a, ty, HOLogic.mk_eq (alpha_bn $ l $ Bound 0, alpha_bn $ r $ Bound 0)), + HOLogic.mk_all (a, ty, HOLogic.mk_eq (alpha_bn $ Bound 0 $ l, alpha_bn $ Bound 0 $ r))], ctxt) end *} +ML {* +fun prove_alpha_bn_rsp alphas ind simps equivps exhausts alpha_bns ctxt = +let + val ([a], ctxt') = Variable.variant_fixes ["a"] ctxt; + val resl = map (fn x => @{thm equivp_rspl} OF [x]) equivps; + val resr = map (fn x => @{thm equivp_rspr} OF [x]) equivps; + val ths_loc = prove_by_rel_induct alphas (build_alpha_bn_rsp_gl a) ind + (alpha_bn_rsp_tac simps (resl @ resr) exhausts a) alpha_bns ctxt +in + Variable.export ctxt' ctxt ths_loc +end +*} end