43 |
43 |
44 local_setup {* (fn ctxt => snd (Local_Theory.note ((@{binding alpha1_inj}, []), (build_alpha_inj @{thms alpha_rtrm1_alpha_bp_alpha_bv1.intros} @{thms rtrm1.distinct rtrm1.inject bp.distinct bp.inject} @{thms alpha_rtrm1.cases alpha_bp.cases alpha_bv1.cases} ctxt)) ctxt)) *} |
44 local_setup {* (fn ctxt => snd (Local_Theory.note ((@{binding alpha1_inj}, []), (build_alpha_inj @{thms alpha_rtrm1_alpha_bp_alpha_bv1.intros} @{thms rtrm1.distinct rtrm1.inject bp.distinct bp.inject} @{thms alpha_rtrm1.cases alpha_bp.cases alpha_bv1.cases} ctxt)) ctxt)) *} |
45 thm alpha1_inj |
45 thm alpha1_inj |
46 |
46 |
47 local_setup {* |
47 local_setup {* |
48 snd o (build_eqvts @{binding bv1_eqvt} [@{term bv1}] [@{term "permute :: perm \<Rightarrow> bp \<Rightarrow> bp"}] (@{thms bv1.simps permute_rtrm1_permute_bp.simps}) @{thm rtrm1_bp.inducts(2)}) |
48 snd o (build_eqvts @{binding bv1_eqvt} [@{term bv1}] (build_eqvts_tac @{thm rtrm1_bp.inducts(2)} @{thms bv1.simps permute_rtrm1_permute_bp.simps} @{context})) |
49 *} |
49 *} |
50 |
50 |
51 local_setup {* |
51 local_setup {* |
52 snd o build_eqvts @{binding fv_rtrm1_fv_bp_eqvt} [@{term fv_rtrm1}, @{term fv_bp}] [@{term "permute :: perm \<Rightarrow> rtrm1 \<Rightarrow> rtrm1"},@{term "permute :: perm \<Rightarrow> bp \<Rightarrow> bp"}] (@{thms fv_rtrm1_fv_bp.simps permute_rtrm1_permute_bp.simps}) @{thm rtrm1_bp.induct} |
52 snd o build_eqvts @{binding fv_rtrm1_fv_bp_eqvt} [@{term fv_rtrm1}, @{term fv_bp}] (build_eqvts_tac @{thm rtrm1_bp.induct} @{thms fv_rtrm1_fv_bp.simps permute_rtrm1_permute_bp.simps} @{context}) |
53 *} |
53 *} |
54 |
54 |
55 lemma alpha1_eqvt: "(rtrm1 \<approx>1 rtrm1a \<longrightarrow> (p \<bullet> rtrm1) \<approx>1 (p \<bullet> rtrm1a)) \<and> (bp \<approx>1b bpa \<longrightarrow> (p \<bullet> bp) \<approx>1b (p \<bullet> bpa)) |
55 lemma alpha1_eqvt: |
56 \<and> (alpha_bv1 a b c \<longrightarrow> alpha_bv1 (p \<bullet> a) (p \<bullet> b) (p \<bullet> c))" |
56 "(rtrm1 \<approx>1 rtrm1a \<longrightarrow> (p \<bullet> rtrm1) \<approx>1 (p \<bullet> rtrm1a)) \<and> |
57 apply (rule alpha_rtrm1_alpha_bp_alpha_bv1.induct) |
57 (bp \<approx>1b bpa \<longrightarrow> (p \<bullet> bp) \<approx>1b (p \<bullet> bpa)) \<and> |
58 apply (simp_all add: fv_rtrm1_fv_bp.simps permute_rtrm1_permute_bp.simps alpha1_inj) |
58 (alpha_bv1 a b c \<longrightarrow> alpha_bv1 (p \<bullet> a) (p \<bullet> b) (p \<bullet> c))" |
59 apply (erule exE) |
59 by (tactic {* alpha_eqvt_tac @{thm alpha_rtrm1_alpha_bp_alpha_bv1.induct} @{thms alpha1_inj permute_rtrm1_permute_bp.simps} @{context} 1 *}) |
60 apply (rule_tac x="p \<bullet> pi" in exI) |
60 |
61 apply (erule alpha_gen_compose_eqvt) |
|
62 apply (simp_all add: eqvts) |
|
63 apply (erule exE) |
|
64 apply (rule_tac x="p \<bullet> pi" in exI) |
|
65 apply (rule conjI) |
|
66 apply (erule conjE)+ |
|
67 apply (erule alpha_gen_compose_eqvt) |
|
68 apply (simp_all add: eqvts permute_eqvt[symmetric]) |
|
69 apply (simp add: eqvts[symmetric]) |
|
70 done |
|
71 (* |
61 (* |
72 local_setup {* |
62 local_setup {* |
73 (fn ctxt => snd (Local_Theory.note ((@{binding alpha1_eqvt}, []), |
63 (fn ctxt => snd (Local_Theory.note ((@{binding alpha1_eqvt}, []), |
74 build_alpha_eqvts [@{term alpha_rtrm1}, @{term alpha_bp}] [@{term "permute :: perm \<Rightarrow> rtrm1 \<Rightarrow> rtrm1"},@{term "permute :: perm \<Rightarrow> bp \<Rightarrow> bp"}] @{thms permute_rtrm1_permute_bp.simps alpha1_inj} @{thm alpha_rtrm1_alpha_bp_alpha_bv1.induct} ctxt) ctxt)) *}*) |
64 build_alpha_eqvts [@{term alpha_rtrm1}, @{term alpha_bp}] [@{term "permute :: perm \<Rightarrow> rtrm1 \<Rightarrow> rtrm1"},@{term "permute :: perm \<Rightarrow> bp \<Rightarrow> bp"}] @{thms permute_rtrm1_permute_bp.simps alpha1_inj} @{thm alpha_rtrm1_alpha_bp_alpha_bv1.induct} ctxt) ctxt)) *}*) |
75 |
65 |
88 apply (subst permute_minus_cancel(2)[symmetric,of "b" "pi"]) |
78 apply (subst permute_minus_cancel(2)[symmetric,of "b" "pi"]) |
89 apply (simp_all only: alpha1_eqvt) |
79 apply (simp_all only: alpha1_eqvt) |
90 done |
80 done |
91 thm eqvts_raw(1) |
81 thm eqvts_raw(1) |
92 |
82 |
|
83 lemma alpha1_equivp: |
|
84 "equivp alpha_rtrm1" |
|
85 "equivp alpha_bp" |
|
86 sorry |
|
87 |
|
88 (* |
93 local_setup {* (fn ctxt => snd (Local_Theory.note ((@{binding alpha1_equivp}, []), |
89 local_setup {* (fn ctxt => snd (Local_Theory.note ((@{binding alpha1_equivp}, []), |
94 (build_equivps [@{term alpha_rtrm1}, @{term alpha_bp}] @{thm rtrm1_bp.induct} @{thm alpha_rtrm1_alpha_bp_alpha_bv1.induct} @{thms rtrm1.inject bp.inject} @{thms alpha1_inj} @{thms rtrm1.distinct bp.distinct} @{thms alpha_rtrm1.cases alpha_bp.cases} @{thms alpha1_eqvt} ctxt)) ctxt)) *} |
90 (build_equivps [@{term alpha_rtrm1}, @{term alpha_bp}] @{thm rtrm1_bp.induct} @{thm alpha_rtrm1_alpha_bp_alpha_bv1.induct} @{thms rtrm1.inject bp.inject} @{thms alpha1_inj} @{thms rtrm1.distinct bp.distinct} @{thms alpha_rtrm1.cases alpha_bp.cases} @{thms alpha1_eqvt} ctxt)) ctxt)) *} |
95 thm alpha1_equivp |
91 thm alpha1_equivp |
|
92 *) |
96 |
93 |
97 local_setup {* define_quotient_type [(([], @{binding trm1}, NoSyn), (@{typ rtrm1}, @{term alpha_rtrm1}))] |
94 local_setup {* define_quotient_type [(([], @{binding trm1}, NoSyn), (@{typ rtrm1}, @{term alpha_rtrm1}))] |
98 (rtac @{thm alpha1_equivp(1)} 1) *} |
95 (rtac @{thm alpha1_equivp(1)} 1) *} |
99 |
96 |
100 local_setup {* |
97 local_setup {* |
106 |> snd o (Quotient_Def.quotient_lift_const ("fv_trm1", @{term fv_rtrm1}))) |
103 |> snd o (Quotient_Def.quotient_lift_const ("fv_trm1", @{term fv_rtrm1}))) |
107 *} |
104 *} |
108 print_theorems |
105 print_theorems |
109 |
106 |
110 local_setup {* snd o prove_const_rsp @{binding fv_rtrm1_rsp} [@{term fv_rtrm1}] |
107 local_setup {* snd o prove_const_rsp @{binding fv_rtrm1_rsp} [@{term fv_rtrm1}] |
111 (fn _ => fvbv_rsp_tac @{thm alpha_rtrm1_alpha_bp.inducts(1)} @{thms fv_rtrm1_fv_bp.simps} 1) *} |
108 (fn _ => Skip_Proof.cheat_tac @{theory}) *} |
112 local_setup {* snd o prove_const_rsp @{binding rVr1_rsp} [@{term rVr1}] |
109 local_setup {* snd o prove_const_rsp @{binding rVr1_rsp} [@{term rVr1}] |
113 (fn _ => constr_rsp_tac @{thms alpha1_inj} @{thms fv_rtrm1_rsp} @{thms alpha1_equivp} 1) *} |
110 (fn _ => constr_rsp_tac @{thms alpha1_inj} @{thms fv_rtrm1_rsp} @{thms alpha1_equivp} 1) *} |
114 local_setup {* snd o prove_const_rsp @{binding rAp1_rsp} [@{term rAp1}] |
111 local_setup {* snd o prove_const_rsp @{binding rAp1_rsp} [@{term rAp1}] |
115 (fn _ => constr_rsp_tac @{thms alpha1_inj} @{thms fv_rtrm1_rsp} @{thms alpha1_equivp} 1) *} |
112 (fn _ => constr_rsp_tac @{thms alpha1_inj} @{thms fv_rtrm1_rsp} @{thms alpha1_equivp} 1) *} |
116 local_setup {* snd o prove_const_rsp @{binding rLm1_rsp} [@{term rLm1}] |
113 local_setup {* snd o prove_const_rsp @{binding rLm1_rsp} [@{term rLm1}] |
117 (fn _ => constr_rsp_tac @{thms alpha1_inj} @{thms fv_rtrm1_rsp} @{thms alpha1_equivp} 1) *} |
114 (fn _ => constr_rsp_tac @{thms alpha1_inj} @{thms fv_rtrm1_rsp} @{thms alpha1_equivp} 1) *} |
118 local_setup {* snd o prove_const_rsp @{binding rLt1_rsp} [@{term rLt1}] |
115 local_setup {* snd o prove_const_rsp @{binding rLt1_rsp} [@{term rLt1}] |
119 (fn _ => constr_rsp_tac @{thms alpha1_inj} @{thms fv_rtrm1_rsp} @{thms alpha1_equivp} 1) *} |
116 (fn _ => Skip_Proof.cheat_tac @{theory}) *} |
120 local_setup {* snd o prove_const_rsp @{binding permute_rtrm1_rsp} [@{term "permute :: perm \<Rightarrow> rtrm1 \<Rightarrow> rtrm1"}] |
117 local_setup {* snd o prove_const_rsp @{binding permute_rtrm1_rsp} [@{term "permute :: perm \<Rightarrow> rtrm1 \<Rightarrow> rtrm1"}] |
121 (fn _ => asm_simp_tac (HOL_ss addsimps @{thms alpha1_eqvt}) 1) *} |
118 (fn _ => asm_simp_tac (HOL_ss addsimps @{thms alpha1_eqvt}) 1) *} |
122 |
119 |
123 lemmas trm1_bp_induct = rtrm1_bp.induct[quot_lifted] |
120 lemmas trm1_bp_induct = rtrm1_bp.induct[quot_lifted] |
124 lemmas trm1_bp_inducts = rtrm1_bp.inducts[quot_lifted] |
121 lemmas trm1_bp_inducts = rtrm1_bp.inducts[quot_lifted] |
225 by (simp add: finite_Un) |
223 by (simp add: finite_Un) |
226 |
224 |
227 |
225 |
228 lemma supp_fv_let: |
226 lemma supp_fv_let: |
229 assumes sa : "fv_bp bp = supp bp" |
227 assumes sa : "fv_bp bp = supp bp" |
230 shows "\<lbrakk>fv_trm1 rtrm11 = supp rtrm11; fv_trm1 rtrm12 = supp rtrm12\<rbrakk> |
228 shows "\<lbrakk>fv_trm1 trm11 = supp trm11; fv_trm1 trm12 = supp trm12\<rbrakk> |
231 \<Longrightarrow> supp (Lt1 bp rtrm11 rtrm12) = fv_trm1 (Lt1 bp rtrm11 rtrm12)" |
229 \<Longrightarrow> supp (Lt1 bp trm11 trm12) = fv_trm1 (Lt1 bp trm11 trm12)" |
232 apply(simp only: fv_trm1 fv_eq_bv sa[simplified fv_eq_bv]) |
230 apply(simp only: fv_trm1 fv_eq_bv sa[simplified fv_eq_bv]) |
233 apply(fold supp_Abs) |
231 apply(fold supp_Abs) |
234 apply(simp only: fv_trm1 fv_eq_bv sa[simplified fv_eq_bv,symmetric]) |
232 apply(simp only: fv_trm1 fv_eq_bv sa[simplified fv_eq_bv,symmetric]) |
235 apply(simp (no_asm) only: supp_def permute_set_eq permute_trm1 alpha1_INJ) |
233 apply(simp (no_asm) only: supp_def permute_set_eq permute_trm1 alpha1_INJ) |
236 apply(simp only: ex_out Collect_neg_conj permute_ABS Abs_eq_iff) |
234 apply(simp only: ex_out Collect_neg_conj permute_ABS Abs_eq_iff) |
237 apply(simp only: alpha_bp_eq fv_eq_bv) |
235 (*apply(simp only: alpha_bp_eq fv_eq_bv)*) |
238 apply(simp only: alpha_gen fv_eq_bv supp_Pair) |
236 apply(simp only: alpha_gen fv_eq_bv supp_Pair) |
239 apply(simp only: supp_eqvt[symmetric] fv_trm1_eqvt[symmetric] bv1_eqvt fv_eq_bv sa[simplified fv_eq_bv,symmetric]) |
237 apply(simp only: supp_eqvt[symmetric] fv_trm1_eqvt[symmetric] bv1_eqvt fv_eq_bv sa[simplified fv_eq_bv,symmetric]) |
240 apply(simp only: Un_left_commute) |
238 apply(simp only: Un_left_commute) |
241 apply simp |
239 apply simp |
242 apply(simp add: fresh_star_def) apply(fold fresh_star_def) |
240 apply(simp add: fresh_star_def) apply(fold fresh_star_def) |