11 |
11 |
12 open Eta; |
12 open Eta; |
13 |
13 |
14 Addsimps eta.intrs; |
14 Addsimps eta.intrs; |
15 |
15 |
16 val eta_cases = map (eta.mk_cases db.simps) |
16 val eta_cases = map (eta.mk_cases dB.simps) |
17 ["Fun s -e> z","s @ t -e> u","Var i -e> t"]; |
17 ["Abs s -e> z","s @ t -e> u","Var i -e> t"]; |
18 |
18 |
19 val beta_cases = map (beta.mk_cases db.simps) |
19 val beta_cases = map (beta.mk_cases dB.simps) |
20 ["s @ t -> u","Var i -> t"]; |
20 ["s @ t -> u","Var i -> t"]; |
21 |
21 |
22 AddIs eta.intrs; |
22 AddIs eta.intrs; |
23 AddSEs (beta_cases@eta_cases); |
23 AddSEs (beta_cases@eta_cases); |
24 |
24 |
25 section "decr and free"; |
25 section "eta, subst and free"; |
|
26 |
|
27 goal Eta.thy "!i t u. ~free s i --> s[t/i] = s[u/i]"; |
|
28 by (dB.induct_tac "s" 1); |
|
29 by (ALLGOALS(simp_tac (addsplit (!simpset)))); |
|
30 by (fast_tac HOL_cs 1); |
|
31 by (fast_tac HOL_cs 1); |
|
32 qed_spec_mp "subst_not_free"; |
|
33 Addsimps [subst_not_free RS eqTrueI]; |
26 |
34 |
27 goal Eta.thy "!i k. free (lift t k) i = \ |
35 goal Eta.thy "!i k. free (lift t k) i = \ |
28 \ (i < k & free t i | k < i & free t (pred i))"; |
36 \ (i < k & free t i | k < i & free t (pred i))"; |
29 by (db.induct_tac "t" 1); |
37 by (dB.induct_tac "t" 1); |
30 by (ALLGOALS(asm_full_simp_tac (addsplit (!simpset) addcongs [conj_cong]))); |
38 by (ALLGOALS(asm_full_simp_tac (addsplit (!simpset) addcongs [conj_cong]))); |
31 by (fast_tac HOL_cs 2); |
39 by (fast_tac HOL_cs 2); |
32 by(simp_tac (!simpset addsimps [pred_def] |
40 by(simp_tac (!simpset addsimps [pred_def] |
33 setloop (split_tac [expand_nat_case])) 1); |
41 setloop (split_tac [expand_nat_case])) 1); |
34 by (safe_tac HOL_cs); |
42 by (safe_tac HOL_cs); |
49 qed "free_subst"; |
57 qed "free_subst"; |
50 Addsimps [free_subst]; |
58 Addsimps [free_subst]; |
51 |
59 |
52 goal Eta.thy "!!s. s -e> t ==> !i. free t i = free s i"; |
60 goal Eta.thy "!!s. s -e> t ==> !i. free t i = free s i"; |
53 by (etac eta.induct 1); |
61 by (etac eta.induct 1); |
54 by (ALLGOALS(asm_simp_tac (!simpset addsimps [decr_def] addcongs [conj_cong]))); |
62 by (ALLGOALS(asm_simp_tac (!simpset addcongs [conj_cong]))); |
55 qed_spec_mp "free_eta"; |
63 qed_spec_mp "free_eta"; |
56 |
64 |
57 goal Eta.thy "!!s. [| s -e> t; ~free s i |] ==> ~free t i"; |
65 goal Eta.thy "!!s. [| s -e> t; ~free s i |] ==> ~free t i"; |
58 by (asm_simp_tac (!simpset addsimps [free_eta]) 1); |
66 by (asm_simp_tac (!simpset addsimps [free_eta]) 1); |
59 qed "not_free_eta"; |
67 qed "not_free_eta"; |
60 |
68 |
61 goal Eta.thy "!i t u. ~free s i --> s[t/i] = s[u/i]"; |
|
62 by (db.induct_tac "s" 1); |
|
63 by (ALLGOALS(simp_tac (addsplit (!simpset)))); |
|
64 by (fast_tac HOL_cs 1); |
|
65 by (fast_tac HOL_cs 1); |
|
66 qed_spec_mp "subst_not_free"; |
|
67 |
|
68 goalw Eta.thy [decr_def] "!!s. ~free s i ==> s[t/i] = decr s i"; |
|
69 by (etac subst_not_free 1); |
|
70 qed "subst_decr"; |
|
71 |
|
72 goal Eta.thy "!!s. s -e> t ==> !u i. s[u/i] -e> t[u/i]"; |
69 goal Eta.thy "!!s. s -e> t ==> !u i. s[u/i] -e> t[u/i]"; |
73 by (etac eta.induct 1); |
70 by (etac eta.induct 1); |
74 by (ALLGOALS(asm_simp_tac (!simpset addsimps [subst_subst RS sym,decr_def]))); |
71 by (ALLGOALS(asm_simp_tac (!simpset addsimps [subst_subst RS sym]))); |
75 by (asm_simp_tac (!simpset addsimps [subst_decr]) 1); |
|
76 qed_spec_mp "eta_subst"; |
72 qed_spec_mp "eta_subst"; |
77 Addsimps [eta_subst]; |
73 Addsimps [eta_subst]; |
78 |
|
79 goalw Eta.thy [decr_def] "!!s. s -e> t ==> decr s i -e> decr t i"; |
|
80 by (etac eta_subst 1); |
|
81 qed "eta_decr"; |
|
82 |
74 |
83 section "Confluence of -e>"; |
75 section "Confluence of -e>"; |
84 |
76 |
85 goalw Eta.thy [square_def,id_def] "square eta eta (eta^=) (eta^=)"; |
77 goalw Eta.thy [square_def,id_def] "square eta eta (eta^=) (eta^=)"; |
86 by (rtac (impI RS allI RS allI) 1); |
78 by (rtac (impI RS allI RS allI) 1); |
87 by (Simp_tac 1); |
79 by (Simp_tac 1); |
88 by (etac eta.induct 1); |
80 by (etac eta.induct 1); |
89 by (best_tac (!claset addSIs [eta_decr] |
81 by (slow_tac (!claset addIs [subst_not_free,eta_subst] |
90 addIs [free_eta RS iffD1] addss !simpset) 1); |
82 addIs [free_eta RS iffD1] addss !simpset) 1); |
91 by (slow_tac (!claset) 1); |
83 by (slow_tac (!claset) 1); |
92 by (slow_tac (!claset) 1); |
84 by (slow_tac (!claset) 1); |
93 by (slow_tac (!claset addSIs [eta_decr] |
85 by (slow_tac (!claset addSIs [eta_subst] |
94 addIs [free_eta RS iffD1]) 1); |
86 addIs [free_eta RS iffD1]) 1); |
95 val lemma = result(); |
87 qed "square_eta"; |
96 |
88 |
97 goal Eta.thy "confluent(eta)"; |
89 goal Eta.thy "confluent(eta)"; |
98 by (rtac (lemma RS square_reflcl_confluent) 1); |
90 by (rtac (square_eta RS square_reflcl_confluent) 1); |
99 qed "eta_confluent"; |
91 qed "eta_confluent"; |
100 |
92 |
101 section "Congruence rules for -e>>"; |
93 section "Congruence rules for -e>>"; |
102 |
94 |
103 goal Eta.thy "!!s. s -e>> s' ==> Fun s -e>> Fun s'"; |
95 goal Eta.thy "!!s. s -e>> s' ==> Abs s -e>> Abs s'"; |
104 by (etac rtrancl_induct 1); |
96 by (etac rtrancl_induct 1); |
105 by (ALLGOALS(fast_tac (!claset addIs [rtrancl_refl,rtrancl_into_rtrancl]))); |
97 by (ALLGOALS(fast_tac (!claset addIs [rtrancl_refl,rtrancl_into_rtrancl]))); |
106 qed "rtrancl_eta_Fun"; |
98 qed "rtrancl_eta_Abs"; |
107 |
99 |
108 goal Eta.thy "!!s. s -e>> s' ==> s @ t -e>> s' @ t"; |
100 goal Eta.thy "!!s. s -e>> s' ==> s @ t -e>> s' @ t"; |
109 by (etac rtrancl_induct 1); |
101 by (etac rtrancl_induct 1); |
110 by (ALLGOALS(fast_tac (!claset addIs [rtrancl_refl,rtrancl_into_rtrancl]))); |
102 by (ALLGOALS(fast_tac (!claset addIs [rtrancl_refl,rtrancl_into_rtrancl]))); |
111 qed "rtrancl_eta_AppL"; |
103 qed "rtrancl_eta_AppL"; |
125 goal Eta.thy "!!s t. s -> t ==> (!i. free t i --> free s i)"; |
117 goal Eta.thy "!!s t. s -> t ==> (!i. free t i --> free s i)"; |
126 by (etac beta.induct 1); |
118 by (etac beta.induct 1); |
127 by (ALLGOALS(Asm_full_simp_tac)); |
119 by (ALLGOALS(Asm_full_simp_tac)); |
128 qed_spec_mp "free_beta"; |
120 qed_spec_mp "free_beta"; |
129 |
121 |
130 goalw Eta.thy [decr_def] "!!s t. s -> t ==> (!i. decr s i -> decr t i)"; |
122 goal Eta.thy "!!s t. s -> t ==> !u i. s[u/i] -> t[u/i]"; |
131 by (etac beta.induct 1); |
123 by (etac beta.induct 1); |
132 by (ALLGOALS(asm_full_simp_tac (!simpset addsimps [subst_subst RS sym]))); |
124 by (ALLGOALS(asm_full_simp_tac (!simpset addsimps [subst_subst RS sym]))); |
133 qed_spec_mp "beta_decr"; |
125 qed_spec_mp "beta_subst"; |
134 |
126 AddIs [beta_subst]; |
135 goalw Eta.thy [decr_def] |
127 |
136 "decr (Var i) k = (if i<=k then Var i else Var(pred i))"; |
128 goal Eta.thy "!i. t[Var i/i] = t[Var(i)/Suc i]"; |
137 by (simp_tac (addsplit (!simpset) addsimps [le_def]) 1); |
129 by (dB.induct_tac "t" 1); |
138 qed "decr_Var"; |
130 by (ALLGOALS (asm_simp_tac (addsplit (!simpset)))); |
139 Addsimps [decr_Var]; |
131 by(safe_tac (HOL_cs addSEs [nat_neqE])); |
140 |
132 by(ALLGOALS trans_tac); |
141 goalw Eta.thy [decr_def] "decr (s@t) i = (decr s i)@(decr t i)"; |
133 qed_spec_mp "subst_Var_Suc"; |
142 by (Simp_tac 1); |
134 Addsimps [subst_Var_Suc]; |
143 qed "decr_App"; |
|
144 Addsimps [decr_App]; |
|
145 |
|
146 goalw Eta.thy [decr_def] "decr (Fun s) i = Fun (decr s (Suc i))"; |
|
147 by (Simp_tac 1); |
|
148 qed "decr_Fun"; |
|
149 Addsimps [decr_Fun]; |
|
150 |
|
151 goal Eta.thy "!i. ~free t (Suc i) --> decr t (Suc i) = decr t i"; |
|
152 by (db.induct_tac "t" 1); |
|
153 by (ALLGOALS |
|
154 (asm_simp_tac (addsplit (!simpset) addsimps [le_def, less_Suc_eq]))); |
|
155 qed_spec_mp "decr_not_free"; |
|
156 Addsimps [decr_not_free]; |
|
157 |
135 |
158 goal Eta.thy "!!s t. s -e> t ==> (!i. lift s i -e> lift t i)"; |
136 goal Eta.thy "!!s t. s -e> t ==> (!i. lift s i -e> lift t i)"; |
159 by (etac eta.induct 1); |
137 by (etac eta.induct 1); |
160 by (ALLGOALS(asm_simp_tac (addsplit (!simpset) addsimps [decr_def]))); |
138 by (ALLGOALS(asm_simp_tac (addsplit (!simpset)))); |
161 by (asm_simp_tac (!simpset addsimps [subst_decr]) 1); |
|
162 qed_spec_mp "eta_lift"; |
139 qed_spec_mp "eta_lift"; |
163 Addsimps [eta_lift]; |
140 Addsimps [eta_lift]; |
164 |
141 |
165 goal Eta.thy "!s t i. s -e> t --> u[s/i] -e>> u[t/i]"; |
142 goal Eta.thy "!s t i. s -e> t --> u[s/i] -e>> u[t/i]"; |
166 by (db.induct_tac "u" 1); |
143 by (dB.induct_tac "u" 1); |
167 by (ALLGOALS(asm_simp_tac (addsplit (!simpset)))); |
144 by (ALLGOALS(asm_simp_tac (addsplit (!simpset)))); |
168 by (fast_tac (!claset addIs [r_into_rtrancl]) 1); |
145 by (fast_tac (!claset addIs [r_into_rtrancl]) 1); |
169 by (fast_tac (!claset addSIs [rtrancl_eta_App]) 1); |
146 by (fast_tac (!claset addSIs [rtrancl_eta_App]) 1); |
170 by (fast_tac (!claset addSIs [rtrancl_eta_Fun,eta_lift]) 1); |
147 by (fast_tac (!claset addSIs [rtrancl_eta_Abs,eta_lift]) 1); |
171 qed_spec_mp "rtrancl_eta_subst"; |
148 qed_spec_mp "rtrancl_eta_subst"; |
172 |
149 |
173 goalw Eta.thy [square_def] "square beta eta (eta^*) (beta^=)"; |
150 goalw Eta.thy [square_def] "square beta eta (eta^*) (beta^=)"; |
174 by (rtac (impI RS allI RS allI) 1); |
151 by (rtac (impI RS allI RS allI) 1); |
175 by (etac beta.induct 1); |
152 by (etac beta.induct 1); |
176 by (strip_tac 1); |
153 by (slow_tac (!claset addIs [r_into_rtrancl,rtrancl_eta_subst,eta_subst] |
177 by (eresolve_tac eta_cases 1); |
154 addss !simpset) 1); |
178 by (eresolve_tac eta_cases 1); |
|
179 by (fast_tac (!claset addss (!simpset addsimps [subst_decr])) 1); |
|
180 by (slow_tac (!claset addIs [r_into_rtrancl,eta_subst]) 1); |
|
181 by (slow_tac (!claset addIs [rtrancl_eta_subst]) 1); |
|
182 by (slow_tac (!claset addIs [r_into_rtrancl,rtrancl_eta_AppL]) 1); |
155 by (slow_tac (!claset addIs [r_into_rtrancl,rtrancl_eta_AppL]) 1); |
183 by (slow_tac (!claset addIs [r_into_rtrancl,rtrancl_eta_AppR]) 1); |
156 by (slow_tac (!claset addIs [r_into_rtrancl,rtrancl_eta_AppR]) 1); |
184 by (slow_tac (!claset addIs [r_into_rtrancl,rtrancl_eta_Fun,free_beta,beta_decr] |
157 by (slow_tac (!claset addIs [r_into_rtrancl,rtrancl_eta_Abs,free_beta] |
185 addss (!simpset addsimps[subst_decr,symmetric decr_def])) 1); |
158 addss !simpset) 1); |
186 qed "square_beta_eta"; |
159 qed "square_beta_eta"; |
187 |
160 |
188 goal Eta.thy "confluent(beta Un eta)"; |
161 goal Eta.thy "confluent(beta Un eta)"; |
189 by (REPEAT(ares_tac [square_rtrancl_reflcl_commute,confluent_Un, |
162 by (REPEAT(ares_tac [square_rtrancl_reflcl_commute,confluent_Un, |
190 beta_confluent,eta_confluent,square_beta_eta] 1)); |
163 beta_confluent,eta_confluent,square_beta_eta] 1)); |
191 qed "confluent_beta_eta"; |
164 qed "confluent_beta_eta"; |
192 |
165 |
193 |
166 section "Implicit definition of -e>: Abs(lift s 0 @ Var 0) -e> s"; |
194 section "Implicit definition of -e>: Fun(lift s 0 @ Var 0) -e> s"; |
|
195 |
167 |
196 goal Eta.thy "!i. (~free s i) = (? t. s = lift t i)"; |
168 goal Eta.thy "!i. (~free s i) = (? t. s = lift t i)"; |
197 by (db.induct_tac "s" 1); |
169 by (dB.induct_tac "s" 1); |
198 by (simp_tac (!simpset setloop (split_tac [expand_if])) 1); |
170 by (simp_tac (!simpset setloop (split_tac [expand_if])) 1); |
199 by (SELECT_GOAL(safe_tac HOL_cs)1); |
171 by (SELECT_GOAL(safe_tac HOL_cs)1); |
200 by (res_inst_tac [("m","nat"),("n","i")] nat_less_cases 1); |
172 by(etac nat_neqE 1); |
201 by (res_inst_tac [("x","Var nat")] exI 1); |
173 by (res_inst_tac [("x","Var nat")] exI 1); |
202 by (Asm_simp_tac 1); |
174 by (Asm_simp_tac 1); |
203 by (fast_tac HOL_cs 1); |
|
204 by (res_inst_tac [("x","Var(pred nat)")] exI 1); |
175 by (res_inst_tac [("x","Var(pred nat)")] exI 1); |
205 by (Asm_simp_tac 1); |
176 by (Asm_simp_tac 1); |
206 by (rtac notE 1); |
177 by (rtac notE 1); |
207 by (assume_tac 2); |
178 by (assume_tac 2); |
208 by (etac thin_rl 1); |
179 by (etac thin_rl 1); |
209 by (res_inst_tac [("db","t")] db_case_distinction 1); |
180 by (res_inst_tac [("dB","t")] dB_case_distinction 1); |
210 by (simp_tac (!simpset setloop (split_tac [expand_if])) 1); |
181 by (simp_tac (!simpset setloop (split_tac [expand_if])) 1); |
211 by (fast_tac (HOL_cs addDs [less_not_refl2]) 1); |
182 by (fast_tac (HOL_cs addDs [less_not_refl2]) 1); |
212 by (Simp_tac 1); |
183 by (Simp_tac 1); |
213 by (Simp_tac 1); |
184 by (Simp_tac 1); |
214 by (Asm_simp_tac 1); |
185 by (Asm_simp_tac 1); |
220 by (rename_tac "u1 u2" 1); |
191 by (rename_tac "u1 u2" 1); |
221 by (res_inst_tac [("x","u1@u2")] exI 1); |
192 by (res_inst_tac [("x","u1@u2")] exI 1); |
222 by (Asm_simp_tac 1); |
193 by (Asm_simp_tac 1); |
223 by (etac exE 1); |
194 by (etac exE 1); |
224 by (etac rev_mp 1); |
195 by (etac rev_mp 1); |
225 by (res_inst_tac [("db","t")] db_case_distinction 1); |
196 by (res_inst_tac [("dB","t")] dB_case_distinction 1); |
226 by (simp_tac (!simpset setloop (split_tac [expand_if])) 1); |
197 by (simp_tac (!simpset setloop (split_tac [expand_if])) 1); |
227 by (Simp_tac 1); |
198 by (Simp_tac 1); |
228 by (fast_tac HOL_cs 1); |
199 by (fast_tac HOL_cs 1); |
229 by (Simp_tac 1); |
200 by (Simp_tac 1); |
230 by (Asm_simp_tac 1); |
201 by (Asm_simp_tac 1); |
231 by (etac thin_rl 1); |
202 by (etac thin_rl 1); |
232 by (rtac allI 1); |
203 by (rtac allI 1); |
233 by (rtac iffI 1); |
204 by (rtac iffI 1); |
234 by (etac exE 1); |
205 by (etac exE 1); |
235 by (res_inst_tac [("x","Fun t")] exI 1); |
206 by (res_inst_tac [("x","Abs t")] exI 1); |
236 by (Asm_simp_tac 1); |
207 by (Asm_simp_tac 1); |
237 by (etac exE 1); |
208 by (etac exE 1); |
238 by (etac rev_mp 1); |
209 by (etac rev_mp 1); |
239 by (res_inst_tac [("db","t")] db_case_distinction 1); |
210 by (res_inst_tac [("dB","t")] dB_case_distinction 1); |
240 by (simp_tac (!simpset setloop (split_tac [expand_if])) 1); |
211 by (simp_tac (!simpset setloop (split_tac [expand_if])) 1); |
241 by (Simp_tac 1); |
212 by (Simp_tac 1); |
242 by (Simp_tac 1); |
213 by (Simp_tac 1); |
243 by (fast_tac HOL_cs 1); |
214 by (fast_tac HOL_cs 1); |
244 qed_spec_mp "not_free_iff_lifted"; |
215 qed_spec_mp "not_free_iff_lifted"; |
245 |
216 |
246 goalw Eta.thy [decr_def] |
217 goal Eta.thy "(!s u. (~free s 0) --> R(Abs(s @ Var 0))(s[u/0])) = \ |
247 "(!s. (~free s 0) --> R(Fun(s @ Var 0))(decr s 0)) = \ |
218 \ (!s. R(Abs(lift s 0 @ Var 0))(s))"; |
248 \ (!s. R(Fun(lift s 0 @ Var 0))(s))"; |
219 by (fast_tac (HOL_cs addss (!simpset addsimps [not_free_iff_lifted])) 1); |
249 by (fast_tac (HOL_cs addss (!simpset addsimps [lemma,not_free_iff_lifted])) 1); |
|
250 qed "explicit_is_implicit"; |
220 qed "explicit_is_implicit"; |