16 (* the resulting type variable is always greater or equal than the given one *) |
16 (* the resulting type variable is always greater or equal than the given one *) |
17 goal thy |
17 goal thy |
18 "!A n S t m. W e A n = Some (S,t,m) --> n<=m"; |
18 "!A n S t m. W e A n = Some (S,t,m) --> n<=m"; |
19 by (expr.induct_tac "e" 1); |
19 by (expr.induct_tac "e" 1); |
20 (* case Var(n) *) |
20 (* case Var(n) *) |
21 by (simp_tac (!simpset addsplits [expand_option_bind,expand_if]) 1); |
21 by (simp_tac (!simpset addsplits [split_option_bind,expand_if]) 1); |
22 (* case Abs e *) |
22 (* case Abs e *) |
23 by (simp_tac (!simpset addsplits [expand_option_bind]) 1); |
23 by (simp_tac (!simpset addsplits [split_option_bind]) 1); |
24 by (fast_tac (HOL_cs addDs [Suc_leD]) 1); |
24 by (fast_tac (HOL_cs addDs [Suc_leD]) 1); |
25 (* case App e1 e2 *) |
25 (* case App e1 e2 *) |
26 by (simp_tac (!simpset addsplits [expand_option_bind]) 1); |
26 by (simp_tac (!simpset addsplits [split_option_bind]) 1); |
27 by(blast_tac (!claset addIs [le_SucI,le_trans]) 1); |
27 by(blast_tac (!claset addIs [le_SucI,le_trans]) 1); |
28 (* case LET e1 e2 *) |
28 (* case LET e1 e2 *) |
29 by (simp_tac (!simpset addsplits [expand_option_bind]) 1); |
29 by (simp_tac (!simpset addsplits [split_option_bind]) 1); |
30 by(blast_tac (!claset addIs [le_trans]) 1); |
30 by(blast_tac (!claset addIs [le_trans]) 1); |
31 qed_spec_mp "W_var_ge"; |
31 qed_spec_mp "W_var_ge"; |
32 |
32 |
33 Addsimps [W_var_ge]; |
33 Addsimps [W_var_ge]; |
34 |
34 |
79 goal thy |
79 goal thy |
80 "!n A S t m. new_tv n A --> W e A n = Some (S,t,m) --> \ |
80 "!n A S t m. new_tv n A --> W e A n = Some (S,t,m) --> \ |
81 \ new_tv m S & new_tv m t"; |
81 \ new_tv m S & new_tv m t"; |
82 by (expr.induct_tac "e" 1); |
82 by (expr.induct_tac "e" 1); |
83 (* case Var n *) |
83 (* case Var n *) |
84 by (simp_tac (!simpset addsplits [expand_option_bind,expand_if]) 1); |
84 by (simp_tac (!simpset addsplits [split_option_bind,expand_if]) 1); |
85 by (strip_tac 1); |
85 by (strip_tac 1); |
86 by (dtac new_tv_nth_nat_A 1); |
86 by (dtac new_tv_nth_nat_A 1); |
87 by (assume_tac 1); |
87 by (assume_tac 1); |
88 by (Asm_simp_tac 1); |
88 by (Asm_simp_tac 1); |
89 (* case Abs e *) |
89 (* case Abs e *) |
90 by (simp_tac (!simpset addsimps [new_tv_subst,new_tv_Suc_list] |
90 by (simp_tac (!simpset addsimps [new_tv_subst,new_tv_Suc_list] |
91 addsplits [expand_option_bind]) 1); |
91 addsplits [split_option_bind]) 1); |
92 by (strip_tac 1); |
92 by (strip_tac 1); |
93 by (eres_inst_tac [("x","Suc n")] allE 1); |
93 by (eres_inst_tac [("x","Suc n")] allE 1); |
94 by (eres_inst_tac [("x","(FVar n)#A")] allE 1); |
94 by (eres_inst_tac [("x","(FVar n)#A")] allE 1); |
95 by (fast_tac (HOL_cs addss (!simpset |
95 by (fast_tac (HOL_cs addss (!simpset |
96 addsimps [new_tv_subst,new_tv_Suc_list])) 1); |
96 addsimps [new_tv_subst,new_tv_Suc_list])) 1); |
97 (* case App e1 e2 *) |
97 (* case App e1 e2 *) |
98 by (simp_tac (!simpset addsplits [expand_option_bind]) 1); |
98 by (simp_tac (!simpset addsplits [split_option_bind]) 1); |
99 by (strip_tac 1); |
99 by (strip_tac 1); |
100 by (rename_tac "S1 t1 n1 S2 t2 n2 S3" 1); |
100 by (rename_tac "S1 t1 n1 S2 t2 n2 S3" 1); |
101 by (eres_inst_tac [("x","n")] allE 1); |
101 by (eres_inst_tac [("x","n")] allE 1); |
102 by (eres_inst_tac [("x","A")] allE 1); |
102 by (eres_inst_tac [("x","A")] allE 1); |
103 by (eres_inst_tac [("x","S1")] allE 1); |
103 by (eres_inst_tac [("x","S1")] allE 1); |
135 new_tv_subst_le,new_tv_le] addss !simpset) 1); |
135 new_tv_subst_le,new_tv_le] addss !simpset) 1); |
136 by (fast_tac (HOL_cs addDs [W_var_geD] addIs |
136 by (fast_tac (HOL_cs addDs [W_var_geD] addIs |
137 [new_scheme_list_le,new_tv_subst_scheme_list,new_tv_le] |
137 [new_scheme_list_le,new_tv_subst_scheme_list,new_tv_le] |
138 addss (!simpset)) 1); |
138 addss (!simpset)) 1); |
139 (* 41: case LET e1 e2 *) |
139 (* 41: case LET e1 e2 *) |
140 by (simp_tac (!simpset addsplits [expand_option_bind]) 1); |
140 by (simp_tac (!simpset addsplits [split_option_bind]) 1); |
141 by (strip_tac 1); |
141 by (strip_tac 1); |
142 by(EVERY1[etac allE,etac allE,etac allE,etac allE,etac allE,mp_tac,mp_tac]); |
142 by(EVERY1[etac allE,etac allE,etac allE,etac allE,etac allE,mp_tac,mp_tac]); |
143 by (etac conjE 1); |
143 by (etac conjE 1); |
144 by(EVERY[etac allE 1,etac allE 1,etac allE 1,etac allE 1,etac allE 1, |
144 by(EVERY[etac allE 1,etac allE 1,etac allE 1,etac allE 1,etac allE 1, |
145 etac impE 1, mp_tac 2]); |
145 etac impE 1, mp_tac 2]); |
176 "!n A S t m v. W e A n = Some (S,t,m) --> \ |
176 "!n A S t m v. W e A n = Some (S,t,m) --> \ |
177 \ (v:free_tv S | v:free_tv t) --> v<n --> v:free_tv A"; |
177 \ (v:free_tv S | v:free_tv t) --> v<n --> v:free_tv A"; |
178 by (expr.induct_tac "e" 1); |
178 by (expr.induct_tac "e" 1); |
179 (* case Var n *) |
179 (* case Var n *) |
180 by (simp_tac (!simpset addsimps |
180 by (simp_tac (!simpset addsimps |
181 [free_tv_subst] addsplits [expand_option_bind,expand_if]) 1); |
181 [free_tv_subst] addsplits [split_option_bind,expand_if]) 1); |
182 by (strip_tac 1); |
182 by (strip_tac 1); |
183 by (case_tac "v : free_tv (nth nat A)" 1); |
183 by (case_tac "v : free_tv (nth nat A)" 1); |
184 by (Asm_full_simp_tac 1); |
184 by (Asm_full_simp_tac 1); |
185 by (dtac free_tv_bound_typ_inst1 1); |
185 by (dtac free_tv_bound_typ_inst1 1); |
186 by (simp_tac (!simpset addsimps [o_def]) 1); |
186 by (simp_tac (!simpset addsimps [o_def]) 1); |
187 by (etac exE 1); |
187 by (etac exE 1); |
188 by (rotate_tac 3 1); |
188 by (rotate_tac 3 1); |
189 by (Asm_full_simp_tac 1); |
189 by (Asm_full_simp_tac 1); |
190 (* case Abs e *) |
190 (* case Abs e *) |
191 by (asm_full_simp_tac (!simpset addsimps |
191 by (asm_full_simp_tac (!simpset addsimps |
192 [free_tv_subst] addsplits [expand_option_bind] delsimps all_simps) 1); |
192 [free_tv_subst] addsplits [split_option_bind] delsimps all_simps) 1); |
193 by (strip_tac 1); |
193 by (strip_tac 1); |
194 by (rename_tac "S t n1 S1 t1 m v" 1); |
194 by (rename_tac "S t n1 S1 t1 m v" 1); |
195 by (eres_inst_tac [("x","Suc n")] allE 1); |
195 by (eres_inst_tac [("x","Suc n")] allE 1); |
196 by (eres_inst_tac [("x","FVar n # A")] allE 1); |
196 by (eres_inst_tac [("x","FVar n # A")] allE 1); |
197 by (eres_inst_tac [("x","S")] allE 1); |
197 by (eres_inst_tac [("x","S")] allE 1); |
199 by (eres_inst_tac [("x","n1")] allE 1); |
199 by (eres_inst_tac [("x","n1")] allE 1); |
200 by (eres_inst_tac [("x","v")] allE 1); |
200 by (eres_inst_tac [("x","v")] allE 1); |
201 by (best_tac (HOL_cs addIs [cod_app_subst] |
201 by (best_tac (HOL_cs addIs [cod_app_subst] |
202 addss (!simpset addsimps [less_Suc_eq])) 1); |
202 addss (!simpset addsimps [less_Suc_eq])) 1); |
203 (* case App e1 e2 *) |
203 (* case App e1 e2 *) |
204 by (simp_tac (!simpset addsplits [expand_option_bind] delsimps all_simps) 1); |
204 by (simp_tac (!simpset addsplits [split_option_bind] delsimps all_simps) 1); |
205 by (strip_tac 1); |
205 by (strip_tac 1); |
206 by (rename_tac "S t n1 S1 t1 n2 S2 S3 t2 m v" 1); |
206 by (rename_tac "S t n1 S1 t1 n2 S2 S3 t2 m v" 1); |
207 by (eres_inst_tac [("x","n")] allE 1); |
207 by (eres_inst_tac [("x","n")] allE 1); |
208 by (eres_inst_tac [("x","A")] allE 1); |
208 by (eres_inst_tac [("x","A")] allE 1); |
209 by (eres_inst_tac [("x","S")] allE 1); |
209 by (eres_inst_tac [("x","S")] allE 1); |
235 free_tv_app_subst_te RS subsetD,free_tv_app_subst_scheme_list RS subsetD, |
235 free_tv_app_subst_te RS subsetD,free_tv_app_subst_scheme_list RS subsetD, |
236 less_le_trans,subsetD] |
236 less_le_trans,subsetD] |
237 addEs [UnE] |
237 addEs [UnE] |
238 addss !simpset) 1); |
238 addss !simpset) 1); |
239 (* LET e1 e2 *) |
239 (* LET e1 e2 *) |
240 by (simp_tac (!simpset addsplits [expand_option_bind] delsimps all_simps) 1); |
240 by (simp_tac (!simpset addsplits [split_option_bind] delsimps all_simps) 1); |
241 by (strip_tac 1); |
241 by (strip_tac 1); |
242 by (rename_tac "nat A S1 t1 n2 S2 t2 m2 S t m v" 1); |
242 by (rename_tac "nat A S1 t1 n2 S2 t2 m2 S t m v" 1); |
243 by (eres_inst_tac [("x","nat")] allE 1); |
243 by (eres_inst_tac [("x","nat")] allE 1); |
244 by (eres_inst_tac [("x","A")] allE 1); |
244 by (eres_inst_tac [("x","A")] allE 1); |
245 by (eres_inst_tac [("x","S1")] allE 1); |
245 by (eres_inst_tac [("x","S1")] allE 1); |
279 by (simp_tac (!simpset addsimps [is_bound_typ_instance]) 1); |
279 by (simp_tac (!simpset addsimps [is_bound_typ_instance]) 1); |
280 by (rtac exI 1); |
280 by (rtac exI 1); |
281 by (rtac refl 1); |
281 by (rtac refl 1); |
282 (* case Abs e *) |
282 (* case Abs e *) |
283 by (asm_full_simp_tac (!simpset addsimps [app_subst_list] |
283 by (asm_full_simp_tac (!simpset addsimps [app_subst_list] |
284 addsplits [expand_option_bind]) 1); |
284 addsplits [split_option_bind]) 1); |
285 by (strip_tac 1); |
285 by (strip_tac 1); |
286 by (eres_inst_tac [("x","(mk_scheme (TVar n)) # A")] allE 1); |
286 by (eres_inst_tac [("x","(mk_scheme (TVar n)) # A")] allE 1); |
287 by (Asm_full_simp_tac 1); |
287 by (Asm_full_simp_tac 1); |
288 by (rtac has_type.AbsI 1); |
288 by (rtac has_type.AbsI 1); |
289 by (dtac (le_refl RS le_SucI RS new_scheme_list_le) 1); |
289 by (dtac (le_refl RS le_SucI RS new_scheme_list_le) 1); |
292 by (etac impE 1); |
292 by (etac impE 1); |
293 by (mp_tac 2); |
293 by (mp_tac 2); |
294 by (Asm_simp_tac 1); |
294 by (Asm_simp_tac 1); |
295 by (assume_tac 1); |
295 by (assume_tac 1); |
296 (* case App e1 e2 *) |
296 (* case App e1 e2 *) |
297 by (simp_tac (!simpset addsplits [expand_option_bind]) 1); |
297 by (simp_tac (!simpset addsplits [split_option_bind]) 1); |
298 by (strip_tac 1); |
298 by (strip_tac 1); |
299 by (rename_tac "S1 t1 n1 S2 t2 n2 S3" 1); |
299 by (rename_tac "S1 t1 n1 S2 t2 n2 S3" 1); |
300 by (res_inst_tac [("t2.0","$ S3 t2")] has_type.AppI 1); |
300 by (res_inst_tac [("t2.0","$ S3 t2")] has_type.AppI 1); |
301 by (res_inst_tac [("S1","S3")] (app_subst_TVar RS subst) 1); |
301 by (res_inst_tac [("S1","S3")] (app_subst_TVar RS subst) 1); |
302 by (rtac (app_subst_Fun RS subst) 1); |
302 by (rtac (app_subst_Fun RS subst) 1); |
324 by (etac thin_rl 1); |
324 by (etac thin_rl 1); |
325 by (mp_tac 1); |
325 by (mp_tac 1); |
326 by (mp_tac 1); |
326 by (mp_tac 1); |
327 by (assume_tac 1); |
327 by (assume_tac 1); |
328 (* case Let e1 e2 *) |
328 (* case Let e1 e2 *) |
329 by (simp_tac (!simpset addsplits [expand_option_bind]) 1); |
329 by (simp_tac (!simpset addsplits [split_option_bind]) 1); |
330 by (strip_tac 1); |
330 by (strip_tac 1); |
331 by (rename_tac "w q m1 S1 t1 m2 S2 t n2" 1); |
331 by (rename_tac "w q m1 S1 t1 m2 S2 t n2" 1); |
332 by (res_inst_tac [("t1.0","$ S2 t1")] has_type.LETI 1); |
332 by (res_inst_tac [("t1.0","$ S2 t1")] has_type.LETI 1); |
333 by (simp_tac (!simpset addsimps [o_def]) 1); |
333 by (simp_tac (!simpset addsimps [o_def]) 1); |
334 by (simp_tac (HOL_ss addsimps [subst_comp_scheme_list RS sym]) 1); |
334 by (simp_tac (HOL_ss addsimps [subst_comp_scheme_list RS sym]) 1); |
422 by (eres_inst_tac [("x","(FVar n)#A")] allE 1); |
422 by (eres_inst_tac [("x","(FVar n)#A")] allE 1); |
423 by (eres_inst_tac [("x","t2")] allE 1); |
423 by (eres_inst_tac [("x","t2")] allE 1); |
424 by (eres_inst_tac [("x","Suc n")] allE 1); |
424 by (eres_inst_tac [("x","Suc n")] allE 1); |
425 by (best_tac (HOL_cs addSDs [mk_scheme_injective] |
425 by (best_tac (HOL_cs addSDs [mk_scheme_injective] |
426 addss (!simpset addcongs [conj_cong] |
426 addss (!simpset addcongs [conj_cong] |
427 addsplits [expand_option_bind])) 1); |
427 addsplits [split_option_bind])) 1); |
428 (** LEVEL 19 **) |
428 (** LEVEL 19 **) |
429 |
429 |
430 (* case App e1 e2 *) |
430 (* case App e1 e2 *) |
431 by (strip_tac 1); |
431 by (strip_tac 1); |
432 by (eresolve_tac has_type_casesE 1); |
432 by (eresolve_tac has_type_casesE 1); |
502 by (dres_inst_tac [("A1","$ S A")] (subst_comp_scheme_list RSN (2,trans)) 2); |
502 by (dres_inst_tac [("A1","$ S A")] (subst_comp_scheme_list RSN (2,trans)) 2); |
503 by (dtac eq_subst_scheme_list_eq_free 2); |
503 by (dtac eq_subst_scheme_list_eq_free 2); |
504 by (fast_tac (HOL_cs addIs [free_tv_W,free_tv_le_new_tv] addDs [new_tv_W]) 2); |
504 by (fast_tac (HOL_cs addIs [free_tv_W,free_tv_le_new_tv] addDs [new_tv_W]) 2); |
505 (** LEVEL 75 **) |
505 (** LEVEL 75 **) |
506 by (asm_full_simp_tac (!simpset addsimps [free_tv_subst,dom_def]) 2); |
506 by (asm_full_simp_tac (!simpset addsimps [free_tv_subst,dom_def]) 2); |
507 by (asm_simp_tac (!simpset addsplits [expand_option_bind]) 1); |
507 by (asm_simp_tac (!simpset addsplits [split_option_bind]) 1); |
508 by (safe_tac HOL_cs ); |
508 by (safe_tac HOL_cs ); |
509 by (dtac mgu_Some 1); |
509 by (dtac mgu_Some 1); |
510 by ( fast_tac (HOL_cs addss !simpset) 1); |
510 by ( fast_tac (HOL_cs addss !simpset) 1); |
511 (** LEVEL 80 *) |
511 (** LEVEL 80 *) |
512 by ((dtac mgu_mg 1) THEN (atac 1)); |
512 by ((dtac mgu_mg 1) THEN (atac 1)); |