equal
deleted
inserted
replaced
37 qed_spec_mp "W_correct"; |
37 qed_spec_mp "W_correct"; |
38 |
38 |
39 val has_type_casesE = map(has_type.mk_cases expr.simps) |
39 val has_type_casesE = map(has_type.mk_cases expr.simps) |
40 [" s |- Var n :: t"," s |- Abs e :: t","s |- App e1 e2 ::t"]; |
40 [" s |- Var n :: t"," s |- Abs e :: t","s |- App e1 e2 ::t"]; |
41 |
41 |
42 |
|
43 (* the resulting type variable is always greater or equal than the given one *) |
42 (* the resulting type variable is always greater or equal than the given one *) |
44 Goal "!a n s t m. W e a n = Ok (s,t,m) --> n<=m"; |
43 Goal "!a n s t m. W e a n = Ok (s,t,m) --> n<=m"; |
45 by (induct_tac "e" 1); |
44 by (induct_tac "e" 1); |
46 (* case Var(n) *) |
45 (* case Var(n) *) |
47 by (Clarsimp_tac 1); |
46 by (Clarsimp_tac 1); |
62 by (asm_full_simp_tac (simpset() addsimps [eq_sym_conv]) 1); |
61 by (asm_full_simp_tac (simpset() addsimps [eq_sym_conv]) 1); |
63 by (etac conjE 1); |
62 by (etac conjE 1); |
64 by (eres_inst_tac [("x","sa")] allE 1); |
63 by (eres_inst_tac [("x","sa")] allE 1); |
65 by (eres_inst_tac [("x","ta")] allE 1); |
64 by (eres_inst_tac [("x","ta")] allE 1); |
66 by (eres_inst_tac [("x","nb")] allE 1); |
65 by (eres_inst_tac [("x","nb")] allE 1); |
67 by (res_inst_tac [("j","na")] le_trans 1); |
66 by (Asm_full_simp_tac 1); |
68 by (Asm_simp_tac 1); |
|
69 by (Asm_simp_tac 1); |
|
70 qed_spec_mp "W_var_ge"; |
67 qed_spec_mp "W_var_ge"; |
71 |
68 |
72 Addsimps [W_var_ge]; |
69 Addsimps [W_var_ge]; |
73 |
70 |
74 Goal "Ok (s,t,m) = W e a n ==> n<=m"; |
71 Goal "Ok (s,t,m) = W e a n ==> n<=m"; |
166 by (eres_inst_tac [("x","TVar n # a")] allE 1); |
163 by (eres_inst_tac [("x","TVar n # a")] allE 1); |
167 by (eres_inst_tac [("x","s")] allE 1); |
164 by (eres_inst_tac [("x","s")] allE 1); |
168 by (eres_inst_tac [("x","t")] allE 1); |
165 by (eres_inst_tac [("x","t")] allE 1); |
169 by (eres_inst_tac [("x","na")] allE 1); |
166 by (eres_inst_tac [("x","na")] allE 1); |
170 by (eres_inst_tac [("x","v")] allE 1); |
167 by (eres_inst_tac [("x","v")] allE 1); |
171 by (force_tac (claset() addSEs [allE] addIs [cod_app_subst], |
168 by (force_tac (claset() addSEs [allE] addIs [cod_app_subst], simpset()) 1); |
172 simpset() addsimps [less_Suc_eq]) 1); |
|
173 (** LEVEL 13 **) |
169 (** LEVEL 13 **) |
174 (* case App e1 e2 *) |
170 (* case App e1 e2 *) |
175 by (simp_tac (simpset() addsplits [split_bind]) 1); |
171 by (simp_tac (simpset() addsplits [split_bind]) 1); |
176 by (strip_tac 1); |
172 by (strip_tac 1); |
177 by (rename_tac "s t na sa ta nb sb sc tb m v" 1); |
173 by (rename_tac "s t na sa ta nb sb sc tb m v" 1); |
195 by (dtac W_var_geD 1); |
191 by (dtac W_var_geD 1); |
196 by ( (forward_tac [less_le_trans] 1) THEN (assume_tac 1) ); |
192 by ( (forward_tac [less_le_trans] 1) THEN (assume_tac 1) ); |
197 (** LEVEL 33 **) |
193 (** LEVEL 33 **) |
198 by (fast_tac (HOL_cs addDs [free_tv_comp_subst RS subsetD,sym RS mgu_free, |
194 by (fast_tac (HOL_cs addDs [free_tv_comp_subst RS subsetD,sym RS mgu_free, |
199 codD,free_tv_app_subst_te RS subsetD,free_tv_app_subst_tel RS subsetD, |
195 codD,free_tv_app_subst_te RS subsetD,free_tv_app_subst_tel RS subsetD, |
200 less_le_trans,less_not_refl2,subsetD] |
196 subsetD] |
201 addEs [UnE] |
197 addEs [UnE] |
202 addss simpset()) 1); |
198 addss simpset()) 1); |
203 by (Asm_full_simp_tac 1); |
199 by (Asm_full_simp_tac 1); |
204 by (dtac (sym RS W_var_geD) 1); |
200 by (dtac (sym RS W_var_geD) 1); |
205 by (dtac (sym RS W_var_geD) 1); |
201 by (dtac (sym RS W_var_geD) 1); |