| author | webertj | 
| Sat, 10 Jan 2004 13:35:10 +0100 | |
| changeset 14350 | 41b32020d0b3 | 
| parent 7036 | 895c7c1e56ba | 
| permissions | -rw-r--r-- | 
| 2525 | 1  | 
(* Title: HOL/MiniML/Generalize.ML  | 
2  | 
ID: $Id$  | 
|
3  | 
Author: Wolfgang Naraschewski and Tobias Nipkow  | 
|
4  | 
Copyright 1996 TU Muenchen  | 
|
5  | 
*)  | 
|
6  | 
||
7  | 
AddSEs [equalityE];  | 
|
8  | 
||
| 5118 | 9  | 
Goal "free_tv A = free_tv B ==> gen A t = gen B t";  | 
| 5184 | 10  | 
by (induct_tac "t" 1);  | 
| 2525 | 11  | 
by (ALLGOALS Asm_simp_tac);  | 
12  | 
qed "gen_eq_on_free_tv";  | 
|
13  | 
||
| 5118 | 14  | 
Goal "(free_tv t) <= (free_tv sch) --> gen sch t = (mk_scheme t)";  | 
| 5184 | 15  | 
by (induct_tac "t" 1);  | 
| 2525 | 16  | 
by (Asm_simp_tac 1);  | 
17  | 
by (Simp_tac 1);  | 
|
18  | 
by (Fast_tac 1);  | 
|
19  | 
qed_spec_mp "gen_without_effect";  | 
|
20  | 
||
21  | 
Addsimps [gen_without_effect];  | 
|
22  | 
||
| 5118 | 23  | 
Goal "free_tv (gen ($ S A) t) = free_tv t Int free_tv ($ S A)";  | 
| 5184 | 24  | 
by (induct_tac "t" 1);  | 
| 2525 | 25  | 
by (Simp_tac 1);  | 
26  | 
by (case_tac "nat : free_tv ($ S A)" 1);  | 
|
27  | 
by (Asm_simp_tac 1);  | 
|
28  | 
by (Fast_tac 1);  | 
|
29  | 
by (Asm_simp_tac 1);  | 
|
30  | 
by (Fast_tac 1);  | 
|
31  | 
by (Asm_full_simp_tac 1);  | 
|
32  | 
by (Fast_tac 1);  | 
|
33  | 
qed "free_tv_gen";  | 
|
34  | 
||
35  | 
Addsimps [free_tv_gen];  | 
|
36  | 
||
| 5118 | 37  | 
Goal "free_tv (gen ($ S A) t # $ S A) = free_tv ($ S A)";  | 
| 2525 | 38  | 
by (Simp_tac 1);  | 
39  | 
by (Fast_tac 1);  | 
|
40  | 
qed "free_tv_gen_cons";  | 
|
41  | 
||
42  | 
Addsimps [free_tv_gen_cons];  | 
|
43  | 
||
| 5118 | 44  | 
Goal "bound_tv (gen A t1) = (free_tv t1) - (free_tv A)";  | 
| 5184 | 45  | 
by (induct_tac "t1" 1);  | 
| 2525 | 46  | 
by (Simp_tac 1);  | 
47  | 
by (case_tac "nat : free_tv A" 1);  | 
|
| 4686 | 48  | 
by (Asm_simp_tac 1);  | 
49  | 
by (Asm_simp_tac 1);  | 
|
| 2525 | 50  | 
by (Fast_tac 1);  | 
51  | 
by (Asm_simp_tac 1);  | 
|
52  | 
by (Fast_tac 1);  | 
|
53  | 
qed "bound_tv_gen";  | 
|
54  | 
||
55  | 
Addsimps [bound_tv_gen];  | 
|
56  | 
||
| 5118 | 57  | 
Goal "new_tv n t --> new_tv n (gen A t)";  | 
| 5184 | 58  | 
by (induct_tac "t" 1);  | 
| 
7036
 
895c7c1e56ba
deleted a reference to "nat", now erroneous because "nat" is a function
 
paulson 
parents: 
5522 
diff
changeset
 | 
59  | 
by Auto_tac;  | 
| 2525 | 60  | 
qed_spec_mp "new_tv_compatible_gen";  | 
61  | 
||
| 5118 | 62  | 
Goalw [gen_ML_def] "gen A t = gen_ML A t";  | 
| 5184 | 63  | 
by (induct_tac "t" 1);  | 
| 5522 | 64  | 
by (simp_tac (simpset() addsimps [free_tv_ML_scheme_list]) 1);  | 
| 4089 | 65  | 
by (asm_simp_tac (simpset() addsimps [free_tv_ML_scheme_list]) 1);  | 
| 2525 | 66  | 
qed "gen_eq_gen_ML";  | 
67  | 
||
| 5118 | 68  | 
Goal "(free_tv S) Int ((free_tv t) - (free_tv A)) = {} \
 | 
69  | 
\ --> gen ($ S A) ($ S t) = $ S (gen A t)";  | 
|
| 4681 | 70  | 
by (induct_tac "t" 1);  | 
71  | 
by (strip_tac 1);  | 
|
72  | 
by (case_tac "nat:(free_tv A)" 1);  | 
|
73  | 
by (Asm_simp_tac 1);  | 
|
74  | 
by (Asm_full_simp_tac 1);  | 
|
75  | 
by (subgoal_tac "nat ~: free_tv S" 1);  | 
|
76  | 
by (Fast_tac 2);  | 
|
77  | 
by (asm_full_simp_tac (simpset() addsimps [free_tv_subst,dom_def]) 1);  | 
|
78  | 
by (cut_facts_tac [free_tv_app_subst_scheme_list] 1);  | 
|
79  | 
by (Fast_tac 1);  | 
|
| 2525 | 80  | 
by (Asm_simp_tac 1);  | 
| 4681 | 81  | 
by (Blast_tac 1);  | 
| 2525 | 82  | 
qed_spec_mp "gen_subst_commutes";  | 
83  | 
||
| 5069 | 84  | 
Goal "free_tv(t::typ) <= free_tv(A) --> bound_typ_inst S (gen A t) = t";  | 
| 5184 | 85  | 
by (induct_tac "t" 1);  | 
| 3018 | 86  | 
by (ALLGOALS Asm_simp_tac);  | 
87  | 
by (Fast_tac 1);  | 
|
| 2525 | 88  | 
qed_spec_mp "bound_typ_inst_gen";  | 
89  | 
Addsimps [bound_typ_inst_gen];  | 
|
90  | 
||
| 5069 | 91  | 
Goalw [le_type_scheme_def,is_bound_typ_instance]  | 
| 2525 | 92  | 
"gen ($ S A) ($ S t) <= $ S (gen A t)";  | 
| 4153 | 93  | 
by Safe_tac;  | 
| 3018 | 94  | 
by (rename_tac "R" 1);  | 
95  | 
by (res_inst_tac [("x", "(%a. bound_typ_inst R (gen ($S A) (S a)))")] exI 1);
 | 
|
| 5184 | 96  | 
by (induct_tac "t" 1);  | 
| 4686 | 97  | 
by (Simp_tac 1);  | 
| 3018 | 98  | 
by (Asm_simp_tac 1);  | 
| 2525 | 99  | 
qed "gen_bound_typ_instance";  | 
100  | 
||
| 5069 | 101  | 
Goalw [le_type_scheme_def,is_bound_typ_instance]  | 
| 5118 | 102  | 
"free_tv B <= free_tv A ==> gen A t <= gen B t";  | 
| 4153 | 103  | 
by Safe_tac;  | 
| 3018 | 104  | 
by (rename_tac "S" 1);  | 
105  | 
by (res_inst_tac [("x","%b. if b:free_tv A then TVar b else S b")] exI 1);
 | 
|
| 5184 | 106  | 
by (induct_tac "t" 1);  | 
| 4686 | 107  | 
by (Asm_simp_tac 1);  | 
| 3018 | 108  | 
by (Fast_tac 1);  | 
109  | 
by (Asm_simp_tac 1);  | 
|
| 2525 | 110  | 
qed "free_tv_subset_gen_le";  | 
111  | 
||
| 5069 | 112  | 
Goalw [le_type_scheme_def,is_bound_typ_instance]  | 
| 5118 | 113  | 
"new_tv n A --> \  | 
114  | 
\ gen A t <= gen A ($ (%x. TVar (if x : free_tv A then x else n + x)) t)";  | 
|
| 2525 | 115  | 
by (strip_tac 1);  | 
116  | 
by (etac exE 1);  | 
|
117  | 
by (hyp_subst_tac 1);  | 
|
118  | 
by (res_inst_tac [("x","(%x. S (if n <= x then x - n else x))")] exI 1);
 | 
|
| 5184 | 119  | 
by (induct_tac "t" 1);  | 
| 2525 | 120  | 
by (Simp_tac 1);  | 
121  | 
by (case_tac "nat : free_tv A" 1);  | 
|
| 4686 | 122  | 
by (Asm_simp_tac 1);  | 
123  | 
by (Asm_simp_tac 1);  | 
|
| 2525 | 124  | 
by (subgoal_tac "n <= n + nat" 1);  | 
125  | 
by (forw_inst_tac [("t","A")] new_tv_le 1);
 | 
|
| 3018 | 126  | 
by (assume_tac 1);  | 
| 2525 | 127  | 
by (dtac new_tv_not_free_tv 1);  | 
128  | 
by (dtac new_tv_not_free_tv 1);  | 
|
| 4089 | 129  | 
by (asm_simp_tac (simpset() addsimps [diff_add_inverse]) 1);  | 
130  | 
by (simp_tac (simpset() addsimps [le_add1]) 1);  | 
|
| 2525 | 131  | 
by (Asm_simp_tac 1);  | 
132  | 
qed_spec_mp "gen_t_le_gen_alpha_t";  | 
|
133  | 
||
134  | 
Addsimps [gen_t_le_gen_alpha_t];  |