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 setloop (split_tac [expand_option_bind,expand_if])) 1); |
21 by (simp_tac (!simpset addsplits [expand_option_bind,expand_if]) 1); |
22 by (strip_tac 1); |
22 by (strip_tac 1); |
23 by (etac conjE 1); |
23 by (etac conjE 1); |
24 by (etac conjE 1); |
24 by (etac conjE 1); |
25 by (dtac sym 1); |
25 by (dtac sym 1); |
26 by (dtac sym 1); |
26 by (dtac sym 1); |
27 by (dtac sym 1); |
27 by (dtac sym 1); |
28 by (Asm_full_simp_tac 1); |
28 by (Asm_full_simp_tac 1); |
29 (* case Abs e *) |
29 (* case Abs e *) |
30 by (simp_tac (!simpset setloop (split_tac [expand_option_bind])) 1); |
30 by (simp_tac (!simpset addsplits [expand_option_bind]) 1); |
31 by (fast_tac (HOL_cs addDs [Suc_leD]) 1); |
31 by (fast_tac (HOL_cs addDs [Suc_leD]) 1); |
32 (* case App e1 e2 *) |
32 (* case App e1 e2 *) |
33 by (simp_tac (!simpset setloop (split_tac [expand_option_bind])) 1); |
33 by (simp_tac (!simpset addsplits [expand_option_bind]) 1); |
34 by (strip_tac 1); |
34 by (strip_tac 1); |
35 by (rename_tac "S t n1 S1 t1 n2 S2 S3 t2 m" 1); |
35 by (rename_tac "S t n1 S1 t1 n2 S2 S3 t2 m" 1); |
36 by (eres_inst_tac [("x","A")] allE 1); |
36 by (eres_inst_tac [("x","A")] allE 1); |
37 by (eres_inst_tac [("x","n")] allE 1); |
37 by (eres_inst_tac [("x","n")] allE 1); |
38 by (eres_inst_tac [("x","$ S A")] allE 1); |
38 by (eres_inst_tac [("x","$ S A")] allE 1); |
86 by (mp_tac 2); |
86 by (mp_tac 2); |
87 by (mp_tac 2); |
87 by (mp_tac 2); |
88 by (assume_tac 2); |
88 by (assume_tac 2); |
89 by (rtac add_le_mono 1); |
89 by (rtac add_le_mono 1); |
90 by (Simp_tac 1); |
90 by (Simp_tac 1); |
91 by (simp_tac (!simpset setloop (split_tac [expand_if]) addsimps [max_def]) 1); |
91 by (simp_tac (!simpset addsplits [expand_if] addsimps [max_def]) 1); |
92 by (strip_tac 1); |
92 by (strip_tac 1); |
93 by (rtac new_tv_le 1); |
93 by (rtac new_tv_le 1); |
94 by (mp_tac 2); |
94 by (mp_tac 2); |
95 by (mp_tac 2); |
95 by (mp_tac 2); |
96 by (assume_tac 2); |
96 by (assume_tac 2); |
97 by (rtac add_le_mono 1); |
97 by (rtac add_le_mono 1); |
98 by (Simp_tac 1); |
98 by (Simp_tac 1); |
99 by (simp_tac (!simpset setloop (split_tac [expand_if]) addsimps [max_def]) 1); |
99 by (simp_tac (!simpset addsplits [expand_if] addsimps [max_def]) 1); |
100 by (strip_tac 1); |
100 by (strip_tac 1); |
101 by (dtac not_leE 1); |
101 by (dtac not_leE 1); |
102 by (rtac less_or_eq_imp_le 1); |
102 by (rtac less_or_eq_imp_le 1); |
103 by (Fast_tac 1); |
103 by (Fast_tac 1); |
104 qed_spec_mp "new_tv_bound_typ_inst_sch"; |
104 qed_spec_mp "new_tv_bound_typ_inst_sch"; |
109 goal thy |
109 goal thy |
110 "!n A S t m. new_tv n A --> W e A n = Some (S,t,m) --> \ |
110 "!n A S t m. new_tv n A --> W e A n = Some (S,t,m) --> \ |
111 \ new_tv m S & new_tv m t"; |
111 \ new_tv m S & new_tv m t"; |
112 by (expr.induct_tac "e" 1); |
112 by (expr.induct_tac "e" 1); |
113 (* case Var n *) |
113 (* case Var n *) |
114 by (simp_tac (!simpset setloop (split_tac [expand_option_bind,expand_if])) 1); |
114 by (simp_tac (!simpset addsplits [expand_option_bind,expand_if]) 1); |
115 by (strip_tac 1); |
115 by (strip_tac 1); |
116 by (REPEAT (etac conjE 1)); |
116 by (REPEAT (etac conjE 1)); |
117 by (rtac conjI 1); |
117 by (rtac conjI 1); |
118 by (dtac sym 1); |
118 by (dtac sym 1); |
119 by (Asm_full_simp_tac 1); |
119 by (Asm_full_simp_tac 1); |
123 by (dtac new_tv_nth_nat_A 1); |
123 by (dtac new_tv_nth_nat_A 1); |
124 by (assume_tac 1); |
124 by (assume_tac 1); |
125 by (Asm_full_simp_tac 1); |
125 by (Asm_full_simp_tac 1); |
126 (* case Abs e *) |
126 (* case Abs e *) |
127 by (simp_tac (!simpset addsimps [new_tv_subst,new_tv_Suc_list] |
127 by (simp_tac (!simpset addsimps [new_tv_subst,new_tv_Suc_list] |
128 setloop (split_tac [expand_option_bind])) 1); |
128 addsplits [expand_option_bind]) 1); |
129 by (strip_tac 1); |
129 by (strip_tac 1); |
130 by (eres_inst_tac [("x","Suc n")] allE 1); |
130 by (eres_inst_tac [("x","Suc n")] allE 1); |
131 by (eres_inst_tac [("x","(FVar n)#A")] allE 1); |
131 by (eres_inst_tac [("x","(FVar n)#A")] allE 1); |
132 by (fast_tac (HOL_cs addss (!simpset |
132 by (fast_tac (HOL_cs addss (!simpset |
133 addsimps [new_tv_subst,new_tv_Suc_list])) 1); |
133 addsimps [new_tv_subst,new_tv_Suc_list])) 1); |
134 (* case App e1 e2 *) |
134 (* case App e1 e2 *) |
135 by (simp_tac (!simpset setloop (split_tac [expand_option_bind])) 1); |
135 by (simp_tac (!simpset addsplits [expand_option_bind]) 1); |
136 by (strip_tac 1); |
136 by (strip_tac 1); |
137 by (rename_tac "S t n1 S1 t1 n2 S2 S3 t2 m" 1); |
137 by (rename_tac "S t n1 S1 t1 n2 S2 S3 t2 m" 1); |
138 by (eres_inst_tac [("x","n")] allE 1); |
138 by (eres_inst_tac [("x","n")] allE 1); |
139 by (eres_inst_tac [("x","A")] allE 1); |
139 by (eres_inst_tac [("x","A")] allE 1); |
140 by (eres_inst_tac [("x","S")] allE 1); |
140 by (eres_inst_tac [("x","S")] allE 1); |
172 new_tv_subst_le,new_tv_le] addss !simpset) 1); |
172 new_tv_subst_le,new_tv_le] addss !simpset) 1); |
173 by (fast_tac (HOL_cs addDs [W_var_geD] addIs |
173 by (fast_tac (HOL_cs addDs [W_var_geD] addIs |
174 [new_scheme_list_le,new_tv_subst_scheme_list,new_tv_le] |
174 [new_scheme_list_le,new_tv_subst_scheme_list,new_tv_le] |
175 addss (!simpset)) 1); |
175 addss (!simpset)) 1); |
176 (* case LET e1 e2 *) |
176 (* case LET e1 e2 *) |
177 by (simp_tac (!simpset setloop (split_tac [expand_option_bind])) 1); |
177 by (simp_tac (!simpset addsplits [expand_option_bind]) 1); |
178 by (strip_tac 1); |
178 by (strip_tac 1); |
179 by (rename_tac "n1 A S1 t1 n2 S2 t2 m2 S t m" 1); |
179 by (rename_tac "n1 A S1 t1 n2 S2 t2 m2 S t m" 1); |
180 by (REPEAT (etac conjE 1)); |
180 by (REPEAT (etac conjE 1)); |
181 by (eres_inst_tac [("x","n1")] allE 1); |
181 by (eres_inst_tac [("x","n1")] allE 1); |
182 by (eres_inst_tac [("x","A")] allE 1); |
182 by (eres_inst_tac [("x","A")] allE 1); |
237 "!n A S t m v. W e A n = Some (S,t,m) --> \ |
237 "!n A S t m v. W e A n = Some (S,t,m) --> \ |
238 \ (v:free_tv S | v:free_tv t) --> v<n --> v:free_tv A"; |
238 \ (v:free_tv S | v:free_tv t) --> v<n --> v:free_tv A"; |
239 by (expr.induct_tac "e" 1); |
239 by (expr.induct_tac "e" 1); |
240 (* case Var n *) |
240 (* case Var n *) |
241 by (simp_tac (!simpset addsimps |
241 by (simp_tac (!simpset addsimps |
242 [free_tv_subst] setloop (split_tac [expand_option_bind,expand_if])) 1); |
242 [free_tv_subst] addsplits [expand_option_bind,expand_if]) 1); |
243 by (strip_tac 1); |
243 by (strip_tac 1); |
244 by (REPEAT (etac conjE 1)); |
244 by (REPEAT (etac conjE 1)); |
245 by (hyp_subst_tac 1); |
245 by (hyp_subst_tac 1); |
246 by (asm_full_simp_tac (!simpset addsimps [dom_def,cod_def,id_subst_def]) 1); |
246 by (asm_full_simp_tac (!simpset addsimps [dom_def,cod_def,id_subst_def]) 1); |
247 by (case_tac "v : free_tv (nth nat A)" 1); |
247 by (case_tac "v : free_tv (nth nat A)" 1); |
253 by (etac exE 1); |
253 by (etac exE 1); |
254 by (rotate_tac 3 1); |
254 by (rotate_tac 3 1); |
255 by (Asm_full_simp_tac 1); |
255 by (Asm_full_simp_tac 1); |
256 (* case Abs e *) |
256 (* case Abs e *) |
257 by (asm_full_simp_tac (!simpset addsimps |
257 by (asm_full_simp_tac (!simpset addsimps |
258 [free_tv_subst] setloop (split_tac [expand_option_bind]) delsimps all_simps) 1); |
258 [free_tv_subst] addsplits [expand_option_bind] delsimps all_simps) 1); |
259 by (strip_tac 1); |
259 by (strip_tac 1); |
260 by (rename_tac "S t n1 S1 t1 m v" 1); |
260 by (rename_tac "S t n1 S1 t1 m v" 1); |
261 by (eres_inst_tac [("x","Suc n")] allE 1); |
261 by (eres_inst_tac [("x","Suc n")] allE 1); |
262 by (eres_inst_tac [("x","FVar n # A")] allE 1); |
262 by (eres_inst_tac [("x","FVar n # A")] allE 1); |
263 by (eres_inst_tac [("x","S")] allE 1); |
263 by (eres_inst_tac [("x","S")] allE 1); |
265 by (eres_inst_tac [("x","n1")] allE 1); |
265 by (eres_inst_tac [("x","n1")] allE 1); |
266 by (eres_inst_tac [("x","v")] allE 1); |
266 by (eres_inst_tac [("x","v")] allE 1); |
267 by (best_tac (HOL_cs addIs [cod_app_subst] |
267 by (best_tac (HOL_cs addIs [cod_app_subst] |
268 addss (!simpset addsimps [less_Suc_eq])) 1); |
268 addss (!simpset addsimps [less_Suc_eq])) 1); |
269 (* case App e1 e2 *) |
269 (* case App e1 e2 *) |
270 by (simp_tac (!simpset setloop (split_tac [expand_option_bind]) delsimps all_simps) 1); |
270 by (simp_tac (!simpset addsplits [expand_option_bind] delsimps all_simps) 1); |
271 by (strip_tac 1); |
271 by (strip_tac 1); |
272 by (rename_tac "S t n1 S1 t1 n2 S2 S3 t2 m v" 1); |
272 by (rename_tac "S t n1 S1 t1 n2 S2 S3 t2 m v" 1); |
273 by (eres_inst_tac [("x","n")] allE 1); |
273 by (eres_inst_tac [("x","n")] allE 1); |
274 by (eres_inst_tac [("x","A")] allE 1); |
274 by (eres_inst_tac [("x","A")] allE 1); |
275 by (eres_inst_tac [("x","S")] allE 1); |
275 by (eres_inst_tac [("x","S")] allE 1); |
301 free_tv_app_subst_te RS subsetD,free_tv_app_subst_scheme_list RS subsetD, |
301 free_tv_app_subst_te RS subsetD,free_tv_app_subst_scheme_list RS subsetD, |
302 less_le_trans,subsetD] |
302 less_le_trans,subsetD] |
303 addEs [UnE] |
303 addEs [UnE] |
304 addss !simpset) 1); |
304 addss !simpset) 1); |
305 (* LET e1 e2 *) |
305 (* LET e1 e2 *) |
306 by (simp_tac (!simpset setloop (split_tac [expand_option_bind]) delsimps all_simps) 1); |
306 by (simp_tac (!simpset addsplits [expand_option_bind] delsimps all_simps) 1); |
307 by (strip_tac 1); |
307 by (strip_tac 1); |
308 by (rename_tac "nat A S1 t1 n2 S2 t2 m2 S t m v" 1); |
308 by (rename_tac "nat A S1 t1 n2 S2 t2 m2 S t m v" 1); |
309 by (eres_inst_tac [("x","nat")] allE 1); |
309 by (eres_inst_tac [("x","nat")] allE 1); |
310 by (eres_inst_tac [("x","A")] allE 1); |
310 by (eres_inst_tac [("x","A")] allE 1); |
311 by (eres_inst_tac [("x","S1")] allE 1); |
311 by (eres_inst_tac [("x","S1")] allE 1); |
336 (* correctness of W with respect to has_type *) |
336 (* correctness of W with respect to has_type *) |
337 goal W.thy |
337 goal W.thy |
338 "!A S t m n . new_tv n A --> Some (S,t,m) = W e A n --> $S A |- e :: t"; |
338 "!A S t m n . new_tv n A --> Some (S,t,m) = W e A n --> $S A |- e :: t"; |
339 by (expr.induct_tac "e" 1); |
339 by (expr.induct_tac "e" 1); |
340 (* case Var n *) |
340 (* case Var n *) |
341 by (asm_full_simp_tac (!simpset setloop (split_tac [expand_if])) 1); |
341 by (asm_full_simp_tac (!simpset addsplits [expand_if]) 1); |
342 by (strip_tac 1); |
342 by (strip_tac 1); |
343 by (rtac has_type.VarI 1); |
343 by (rtac has_type.VarI 1); |
344 by (Simp_tac 1); |
344 by (Simp_tac 1); |
345 by (simp_tac (!simpset addsimps [is_bound_typ_instance]) 1); |
345 by (simp_tac (!simpset addsimps [is_bound_typ_instance]) 1); |
346 by (rtac exI 1); |
346 by (rtac exI 1); |
347 by (rtac refl 1); |
347 by (rtac refl 1); |
348 (* case Abs e *) |
348 (* case Abs e *) |
349 by (asm_full_simp_tac (!simpset addsimps [app_subst_list] |
349 by (asm_full_simp_tac (!simpset addsimps [app_subst_list] |
350 setloop (split_tac [expand_option_bind])) 1); |
350 addsplits [expand_option_bind]) 1); |
351 by (strip_tac 1); |
351 by (strip_tac 1); |
352 by (eres_inst_tac [("x","(mk_scheme (TVar n)) # A")] allE 1); |
352 by (eres_inst_tac [("x","(mk_scheme (TVar n)) # A")] allE 1); |
353 by (Asm_full_simp_tac 1); |
353 by (Asm_full_simp_tac 1); |
354 by (rtac has_type.AbsI 1); |
354 by (rtac has_type.AbsI 1); |
355 by (dtac (le_refl RS le_SucI RS new_scheme_list_le) 1); |
355 by (dtac (le_refl RS le_SucI RS new_scheme_list_le) 1); |
467 \ (? S t. (? m. W e A n = Some (S,t,m)) & \ |
467 \ (? S t. (? m. W e A n = Some (S,t,m)) & \ |
468 \ (? R. $S' A = $R ($S A) & t' = $R t))"; |
468 \ (? R. $S' A = $R ($S A) & t' = $R t))"; |
469 by (expr.induct_tac "e" 1); |
469 by (expr.induct_tac "e" 1); |
470 (* case Var n *) |
470 (* case Var n *) |
471 by (strip_tac 1); |
471 by (strip_tac 1); |
472 by (simp_tac (!simpset addcongs [conj_cong] |
472 by (simp_tac (!simpset addcongs [conj_cong] addsplits [expand_if]) 1); |
473 setloop (split_tac [expand_if])) 1); |
|
474 by (eresolve_tac has_type_casesE 1); |
473 by (eresolve_tac has_type_casesE 1); |
475 by (asm_full_simp_tac (!simpset addsimps [is_bound_typ_instance]) 1); |
474 by (asm_full_simp_tac (!simpset addsimps [is_bound_typ_instance]) 1); |
476 by (etac exE 1); |
475 by (etac exE 1); |
477 by (hyp_subst_tac 1); |
476 by (hyp_subst_tac 1); |
478 by (rename_tac "S" 1); |
477 by (rename_tac "S" 1); |
489 by (eres_inst_tac [("x","(FVar n)#A")] allE 1); |
488 by (eres_inst_tac [("x","(FVar n)#A")] allE 1); |
490 by (eres_inst_tac [("x","t2")] allE 1); |
489 by (eres_inst_tac [("x","t2")] allE 1); |
491 by (eres_inst_tac [("x","Suc n")] allE 1); |
490 by (eres_inst_tac [("x","Suc n")] allE 1); |
492 by (best_tac (HOL_cs addSDs [mk_scheme_injective] |
491 by (best_tac (HOL_cs addSDs [mk_scheme_injective] |
493 addss (!simpset addcongs [conj_cong] |
492 addss (!simpset addcongs [conj_cong] |
494 setloop (split_tac [expand_option_bind]))) 1); |
493 addsplits [expand_option_bind])) 1); |
495 (** LEVEL 19 **) |
494 (** LEVEL 19 **) |
496 |
495 |
497 (* case App e1 e2 *) |
496 (* case App e1 e2 *) |
498 by (strip_tac 1); |
497 by (strip_tac 1); |
499 by (eresolve_tac has_type_casesE 1); |
498 by (eresolve_tac has_type_casesE 1); |
529 by (best_tac (HOL_cs addDs [new_tv_W,sym RS W_var_geD, |
528 by (best_tac (HOL_cs addDs [new_tv_W,sym RS W_var_geD, |
530 new_tv_not_free_tv,new_tv_le]) 3); |
529 new_tv_not_free_tv,new_tv_le]) 3); |
531 by (case_tac "na:free_tv Sa" 2); |
530 by (case_tac "na:free_tv Sa" 2); |
532 (* n1 ~: free_tv S1 *) |
531 (* n1 ~: free_tv S1 *) |
533 by (forward_tac [not_free_impl_id] 3); |
532 by (forward_tac [not_free_impl_id] 3); |
534 by (asm_simp_tac (!simpset |
533 by (asm_simp_tac (!simpset addsplits [expand_if]) 3); |
535 setloop (split_tac [expand_if])) 3); |
|
536 (* na : free_tv Sa *) |
534 (* na : free_tv Sa *) |
537 by (dres_inst_tac [("A1","$ S A")] (subst_comp_scheme_list RSN (2,trans)) 2); |
535 by (dres_inst_tac [("A1","$ S A")] (subst_comp_scheme_list RSN (2,trans)) 2); |
538 by (dtac eq_subst_scheme_list_eq_free 2); |
536 by (dtac eq_subst_scheme_list_eq_free 2); |
539 by (fast_tac (HOL_cs addIs [free_tv_W,free_tv_le_new_tv] addDs [new_tv_W]) 2); |
537 by (fast_tac (HOL_cs addIs [free_tv_W,free_tv_le_new_tv] addDs [new_tv_W]) 2); |
540 by (Asm_simp_tac 2); |
538 by (Asm_simp_tac 2); |
541 by (case_tac "na:dom Sa" 2); |
539 by (case_tac "na:dom Sa" 2); |
542 (* na ~: dom Sa *) |
540 (* na ~: dom Sa *) |
543 by (asm_full_simp_tac (!simpset addsimps [dom_def] |
541 by (asm_full_simp_tac (!simpset addsimps [dom_def] addsplits [expand_if]) 3); |
544 setloop (split_tac [expand_if])) 3); |
|
545 (* na : dom Sa *) |
542 (* na : dom Sa *) |
546 by (rtac eq_free_eq_subst_te 2); |
543 by (rtac eq_free_eq_subst_te 2); |
547 by (strip_tac 2); |
544 by (strip_tac 2); |
548 by (subgoal_tac "nb ~= ma" 2); |
545 by (subgoal_tac "nb ~= ma" 2); |
549 by ((forward_tac [new_tv_W] 3) THEN (atac 3)); |
546 by ((forward_tac [new_tv_W] 3) THEN (atac 3)); |
551 by (dtac new_tv_subst_scheme_list 3); |
548 by (dtac new_tv_subst_scheme_list 3); |
552 by (fast_tac (HOL_cs addIs [new_scheme_list_le] addDs [sym RS W_var_geD]) 3); |
549 by (fast_tac (HOL_cs addIs [new_scheme_list_le] addDs [sym RS W_var_geD]) 3); |
553 by (fast_tac (set_cs addDs [new_tv_W,new_tv_not_free_tv] addss |
550 by (fast_tac (set_cs addDs [new_tv_W,new_tv_not_free_tv] addss |
554 (!simpset addsimps [cod_def,free_tv_subst])) 3); |
551 (!simpset addsimps [cod_def,free_tv_subst])) 3); |
555 by (fast_tac (set_cs addss (!simpset addsimps [cod_def,free_tv_subst] |
552 by (fast_tac (set_cs addss (!simpset addsimps [cod_def,free_tv_subst] |
556 setloop (split_tac [expand_if]))) 2); |
553 addsplits [expand_if])) 2); |
557 by (Simp_tac 2); |
554 by (Simp_tac 2); |
558 by (rtac eq_free_eq_subst_te 2); |
555 by (rtac eq_free_eq_subst_te 2); |
559 by (strip_tac 2 ); |
556 by (strip_tac 2 ); |
560 by (subgoal_tac "na ~= ma" 2); |
557 by (subgoal_tac "na ~= ma" 2); |
561 by ((forward_tac [new_tv_W] 3) THEN (atac 3)); |
558 by ((forward_tac [new_tv_W] 3) THEN (atac 3)); |
562 by (etac conjE 3); |
559 by (etac conjE 3); |
563 by (dtac (sym RS W_var_geD) 3); |
560 by (dtac (sym RS W_var_geD) 3); |
564 by (fast_tac (HOL_cs addDs [new_scheme_list_le,new_tv_subst_scheme_list,new_tv_W,new_tv_not_free_tv]) 3); |
561 by (fast_tac (HOL_cs addDs [new_scheme_list_le,new_tv_subst_scheme_list,new_tv_W,new_tv_not_free_tv]) 3); |
565 by (case_tac "na: free_tv t - free_tv Sa" 2); |
562 by (case_tac "na: free_tv t - free_tv Sa" 2); |
566 (* case na ~: free_tv t - free_tv Sa *) |
563 (* case na ~: free_tv t - free_tv Sa *) |
567 by ( asm_full_simp_tac (!simpset setloop (split_tac [expand_if])) 3); |
564 by ( asm_full_simp_tac (!simpset addsplits [expand_if]) 3); |
568 by (Fast_tac 3); |
565 by (Fast_tac 3); |
569 (* case na : free_tv t - free_tv Sa *) |
566 (* case na : free_tv t - free_tv Sa *) |
570 by ( asm_full_simp_tac (!simpset setloop (split_tac [expand_if])) 2); |
567 by ( asm_full_simp_tac (!simpset addsplits [expand_if]) 2); |
571 by (dres_inst_tac [("A1","$ S A")] (subst_comp_scheme_list RSN (2,trans)) 2); |
568 by (dres_inst_tac [("A1","$ S A")] (subst_comp_scheme_list RSN (2,trans)) 2); |
572 by (dtac eq_subst_scheme_list_eq_free 2); |
569 by (dtac eq_subst_scheme_list_eq_free 2); |
573 by (fast_tac (HOL_cs addIs [free_tv_W,free_tv_le_new_tv] addDs [new_tv_W]) 2); |
570 by (fast_tac (HOL_cs addIs [free_tv_W,free_tv_le_new_tv] addDs [new_tv_W]) 2); |
574 (** LEVEL 75 **) |
571 (** LEVEL 75 **) |
575 by (asm_full_simp_tac (!simpset addsimps [free_tv_subst,dom_def]) 2); |
572 by (asm_full_simp_tac (!simpset addsimps [free_tv_subst,dom_def]) 2); |
576 by (asm_simp_tac (!simpset setloop (split_tac [expand_option_bind])) 1); |
573 by (asm_simp_tac (!simpset addsplits [expand_option_bind]) 1); |
577 by (safe_tac HOL_cs ); |
574 by (safe_tac HOL_cs ); |
578 by (dtac mgu_Some 1); |
575 by (dtac mgu_Some 1); |
579 by ( fast_tac (HOL_cs addss !simpset) 1); |
576 by ( fast_tac (HOL_cs addss !simpset) 1); |
580 (** LEVEL 80 *) |
577 (** LEVEL 80 *) |
581 by ((dtac mgu_mg 1) THEN (atac 1)); |
578 by ((dtac mgu_mg 1) THEN (atac 1)); |
601 by (dtac (free_tv_app_subst_scheme_list RS subsetD) 2); |
598 by (dtac (free_tv_app_subst_scheme_list RS subsetD) 2); |
602 by (fast_tac (set_cs addDs [sym RS W_var_geD,new_scheme_list_le,codD, |
599 by (fast_tac (set_cs addDs [sym RS W_var_geD,new_scheme_list_le,codD, |
603 new_tv_not_free_tv]) 2); |
600 new_tv_not_free_tv]) 2); |
604 by (case_tac "na: free_tv t - free_tv Sa" 1); |
601 by (case_tac "na: free_tv t - free_tv Sa" 1); |
605 (* case na ~: free_tv t - free_tv Sa *) |
602 (* case na ~: free_tv t - free_tv Sa *) |
606 by (asm_full_simp_tac (!simpset setloop (split_tac [expand_if])) 2); |
603 by (asm_full_simp_tac (!simpset addsplits [expand_if]) 2); |
607 (* case na : free_tv t - free_tv Sa *) |
604 (* case na : free_tv t - free_tv Sa *) |
608 by (asm_full_simp_tac (!simpset setloop (split_tac [expand_if])) 1); |
605 by (asm_full_simp_tac (!simpset addsplits [expand_if]) 1); |
609 by (dtac (free_tv_app_subst_scheme_list RS subsetD) 1); |
606 by (dtac (free_tv_app_subst_scheme_list RS subsetD) 1); |
610 by (fast_tac (set_cs addDs [codD,subst_comp_scheme_list RSN (2,trans), |
607 by (fast_tac (set_cs addDs [codD,subst_comp_scheme_list RSN (2,trans), |
611 eq_subst_scheme_list_eq_free] addss ((!simpset addsimps |
608 eq_subst_scheme_list_eq_free] addss ((!simpset addsimps |
612 [free_tv_subst,dom_def]))) 1); |
609 [free_tv_subst,dom_def]))) 1); |
613 by (Fast_tac 1); |
610 by (Fast_tac 1); |