43 |
43 |
44 goal thy "!!A. bound_tv (gen A t1) = (free_tv t1) - (free_tv A)"; |
44 goal thy "!!A. bound_tv (gen A t1) = (free_tv t1) - (free_tv A)"; |
45 by (typ.induct_tac "t1" 1); |
45 by (typ.induct_tac "t1" 1); |
46 by (Simp_tac 1); |
46 by (Simp_tac 1); |
47 by (case_tac "nat : free_tv A" 1); |
47 by (case_tac "nat : free_tv A" 1); |
48 by (asm_simp_tac (!simpset addsplits [expand_if]) 1); |
48 by (asm_simp_tac (simpset() addsplits [expand_if]) 1); |
49 by (asm_simp_tac (!simpset addsplits [expand_if]) 1); |
49 by (asm_simp_tac (simpset() addsplits [expand_if]) 1); |
50 by (Fast_tac 1); |
50 by (Fast_tac 1); |
51 by (Asm_simp_tac 1); |
51 by (Asm_simp_tac 1); |
52 by (Fast_tac 1); |
52 by (Fast_tac 1); |
53 qed "bound_tv_gen"; |
53 qed "bound_tv_gen"; |
54 |
54 |
63 by (Asm_full_simp_tac 1); |
63 by (Asm_full_simp_tac 1); |
64 qed_spec_mp "new_tv_compatible_gen"; |
64 qed_spec_mp "new_tv_compatible_gen"; |
65 |
65 |
66 goalw thy [gen_ML_def] "!!A. gen A t = gen_ML A t"; |
66 goalw thy [gen_ML_def] "!!A. gen A t = gen_ML A t"; |
67 by (typ.induct_tac "t" 1); |
67 by (typ.induct_tac "t" 1); |
68 by (simp_tac (!simpset addsimps [free_tv_ML_scheme_list]) 1); |
68 by (simp_tac (simpset() addsimps [free_tv_ML_scheme_list]) 1); |
69 by (asm_simp_tac (!simpset addsimps [free_tv_ML_scheme_list]) 1); |
69 by (asm_simp_tac (simpset() addsimps [free_tv_ML_scheme_list]) 1); |
70 qed "gen_eq_gen_ML"; |
70 qed "gen_eq_gen_ML"; |
71 |
71 |
72 goal thy "!!S. (free_tv S) Int ((free_tv t) - (free_tv A)) = {} \ |
72 goal thy "!!S. (free_tv S) Int ((free_tv t) - (free_tv A)) = {} \ |
73 \ --> gen ($ S A) ($ S t) = $ S (gen A t)"; |
73 \ --> gen ($ S A) ($ S t) = $ S (gen A t)"; |
74 by (typ.induct_tac "t" 1); |
74 by (typ.induct_tac "t" 1); |
76 by (case_tac "nat:(free_tv A)" 1); |
76 by (case_tac "nat:(free_tv A)" 1); |
77 by (Asm_simp_tac 1); |
77 by (Asm_simp_tac 1); |
78 by (Asm_full_simp_tac 1); |
78 by (Asm_full_simp_tac 1); |
79 by (subgoal_tac "nat ~: free_tv S" 1); |
79 by (subgoal_tac "nat ~: free_tv S" 1); |
80 by (Fast_tac 2); |
80 by (Fast_tac 2); |
81 by (asm_full_simp_tac (!simpset addsimps [free_tv_subst,dom_def,de_Morgan_disj]) 1); |
81 by (asm_full_simp_tac (simpset() addsimps [free_tv_subst,dom_def,de_Morgan_disj]) 1); |
82 by (split_tac [expand_if] 1); |
82 by (split_tac [expand_if] 1); |
83 by (cut_facts_tac [free_tv_app_subst_scheme_list] 1); |
83 by (cut_facts_tac [free_tv_app_subst_scheme_list] 1); |
84 by (Fast_tac 1); |
84 by (Fast_tac 1); |
85 by (Asm_simp_tac 1); |
85 by (Asm_simp_tac 1); |
86 by (Best_tac 1); |
86 by (Best_tac 1); |
93 qed_spec_mp "bound_typ_inst_gen"; |
93 qed_spec_mp "bound_typ_inst_gen"; |
94 Addsimps [bound_typ_inst_gen]; |
94 Addsimps [bound_typ_inst_gen]; |
95 |
95 |
96 goalw Generalize.thy [le_type_scheme_def,is_bound_typ_instance] |
96 goalw Generalize.thy [le_type_scheme_def,is_bound_typ_instance] |
97 "gen ($ S A) ($ S t) <= $ S (gen A t)"; |
97 "gen ($ S A) ($ S t) <= $ S (gen A t)"; |
98 by (safe_tac (!claset)); |
98 by (safe_tac (claset())); |
99 by (rename_tac "R" 1); |
99 by (rename_tac "R" 1); |
100 by (res_inst_tac [("x", "(%a. bound_typ_inst R (gen ($S A) (S a)))")] exI 1); |
100 by (res_inst_tac [("x", "(%a. bound_typ_inst R (gen ($S A) (S a)))")] exI 1); |
101 by (typ.induct_tac "t" 1); |
101 by (typ.induct_tac "t" 1); |
102 by (simp_tac (!simpset addsplits [expand_if]) 1); |
102 by (simp_tac (simpset() addsplits [expand_if]) 1); |
103 by (Asm_simp_tac 1); |
103 by (Asm_simp_tac 1); |
104 qed "gen_bound_typ_instance"; |
104 qed "gen_bound_typ_instance"; |
105 |
105 |
106 goalw Generalize.thy [le_type_scheme_def,is_bound_typ_instance] |
106 goalw Generalize.thy [le_type_scheme_def,is_bound_typ_instance] |
107 "!!A B. free_tv B <= free_tv A ==> gen A t <= gen B t"; |
107 "!!A B. free_tv B <= free_tv A ==> gen A t <= gen B t"; |
108 by (safe_tac (!claset)); |
108 by (safe_tac (claset())); |
109 by (rename_tac "S" 1); |
109 by (rename_tac "S" 1); |
110 by (res_inst_tac [("x","%b. if b:free_tv A then TVar b else S b")] exI 1); |
110 by (res_inst_tac [("x","%b. if b:free_tv A then TVar b else S b")] exI 1); |
111 by (typ.induct_tac "t" 1); |
111 by (typ.induct_tac "t" 1); |
112 by (asm_simp_tac (!simpset addsplits [expand_if]) 1); |
112 by (asm_simp_tac (simpset() addsplits [expand_if]) 1); |
113 by (Fast_tac 1); |
113 by (Fast_tac 1); |
114 by (Asm_simp_tac 1); |
114 by (Asm_simp_tac 1); |
115 qed "free_tv_subset_gen_le"; |
115 qed "free_tv_subset_gen_le"; |
116 |
116 |
117 goalw thy [le_type_scheme_def,is_bound_typ_instance] |
117 goalw thy [le_type_scheme_def,is_bound_typ_instance] |
121 by (hyp_subst_tac 1); |
121 by (hyp_subst_tac 1); |
122 by (res_inst_tac [("x","(%x. S (if n <= x then x - n else x))")] exI 1); |
122 by (res_inst_tac [("x","(%x. S (if n <= x then x - n else x))")] exI 1); |
123 by (typ.induct_tac "t" 1); |
123 by (typ.induct_tac "t" 1); |
124 by (Simp_tac 1); |
124 by (Simp_tac 1); |
125 by (case_tac "nat : free_tv A" 1); |
125 by (case_tac "nat : free_tv A" 1); |
126 by (asm_simp_tac (!simpset addsplits [expand_if]) 1); |
126 by (asm_simp_tac (simpset() addsplits [expand_if]) 1); |
127 by (asm_simp_tac (!simpset addsplits [expand_if]) 1); |
127 by (asm_simp_tac (simpset() addsplits [expand_if]) 1); |
128 by (subgoal_tac "n <= n + nat" 1); |
128 by (subgoal_tac "n <= n + nat" 1); |
129 by (forw_inst_tac [("t","A")] new_tv_le 1); |
129 by (forw_inst_tac [("t","A")] new_tv_le 1); |
130 by (assume_tac 1); |
130 by (assume_tac 1); |
131 by (dtac new_tv_not_free_tv 1); |
131 by (dtac new_tv_not_free_tv 1); |
132 by (dtac new_tv_not_free_tv 1); |
132 by (dtac new_tv_not_free_tv 1); |
133 by (asm_simp_tac (!simpset addsimps [diff_add_inverse]) 1); |
133 by (asm_simp_tac (simpset() addsimps [diff_add_inverse]) 1); |
134 by (simp_tac (!simpset addsimps [le_add1]) 1); |
134 by (simp_tac (simpset() addsimps [le_add1]) 1); |
135 by (Asm_simp_tac 1); |
135 by (Asm_simp_tac 1); |
136 qed_spec_mp "gen_t_le_gen_alpha_t"; |
136 qed_spec_mp "gen_t_le_gen_alpha_t"; |
137 |
137 |
138 Addsimps [gen_t_le_gen_alpha_t]; |
138 Addsimps [gen_t_le_gen_alpha_t]; |