8 |
8 |
9 open Nat; |
9 open Nat; |
10 |
10 |
11 goal Nat.thy "mono(%X. {Zero_Rep} Un (Suc_Rep``X))"; |
11 goal Nat.thy "mono(%X. {Zero_Rep} Un (Suc_Rep``X))"; |
12 by (REPEAT (ares_tac [monoI, subset_refl, image_mono, Un_mono] 1)); |
12 by (REPEAT (ares_tac [monoI, subset_refl, image_mono, Un_mono] 1)); |
13 val Nat_fun_mono = result(); |
13 qed "Nat_fun_mono"; |
14 |
14 |
15 val Nat_unfold = Nat_fun_mono RS (Nat_def RS def_lfp_Tarski); |
15 val Nat_unfold = Nat_fun_mono RS (Nat_def RS def_lfp_Tarski); |
16 |
16 |
17 (* Zero is a natural number -- this also justifies the type definition*) |
17 (* Zero is a natural number -- this also justifies the type definition*) |
18 goal Nat.thy "Zero_Rep: Nat"; |
18 goal Nat.thy "Zero_Rep: Nat"; |
19 by (rtac (Nat_unfold RS ssubst) 1); |
19 by (rtac (Nat_unfold RS ssubst) 1); |
20 by (rtac (singletonI RS UnI1) 1); |
20 by (rtac (singletonI RS UnI1) 1); |
21 val Zero_RepI = result(); |
21 qed "Zero_RepI"; |
22 |
22 |
23 val prems = goal Nat.thy "i: Nat ==> Suc_Rep(i) : Nat"; |
23 val prems = goal Nat.thy "i: Nat ==> Suc_Rep(i) : Nat"; |
24 by (rtac (Nat_unfold RS ssubst) 1); |
24 by (rtac (Nat_unfold RS ssubst) 1); |
25 by (rtac (imageI RS UnI2) 1); |
25 by (rtac (imageI RS UnI2) 1); |
26 by (resolve_tac prems 1); |
26 by (resolve_tac prems 1); |
27 val Suc_RepI = result(); |
27 qed "Suc_RepI"; |
28 |
28 |
29 (*** Induction ***) |
29 (*** Induction ***) |
30 |
30 |
31 val major::prems = goal Nat.thy |
31 val major::prems = goal Nat.thy |
32 "[| i: Nat; P(Zero_Rep); \ |
32 "[| i: Nat; P(Zero_Rep); \ |
33 \ !!j. [| j: Nat; P(j) |] ==> P(Suc_Rep(j)) |] ==> P(i)"; |
33 \ !!j. [| j: Nat; P(j) |] ==> P(Suc_Rep(j)) |] ==> P(i)"; |
34 by (rtac ([Nat_def, Nat_fun_mono, major] MRS def_induct) 1); |
34 by (rtac ([Nat_def, Nat_fun_mono, major] MRS def_induct) 1); |
35 by (fast_tac (set_cs addIs prems) 1); |
35 by (fast_tac (set_cs addIs prems) 1); |
36 val Nat_induct = result(); |
36 qed "Nat_induct"; |
37 |
37 |
38 val prems = goalw Nat.thy [Zero_def,Suc_def] |
38 val prems = goalw Nat.thy [Zero_def,Suc_def] |
39 "[| P(0); \ |
39 "[| P(0); \ |
40 \ !!k. P(k) ==> P(Suc(k)) |] ==> P(n)"; |
40 \ !!k. P(k) ==> P(Suc(k)) |] ==> P(n)"; |
41 by (rtac (Rep_Nat_inverse RS subst) 1); (*types force good instantiation*) |
41 by (rtac (Rep_Nat_inverse RS subst) 1); (*types force good instantiation*) |
42 by (rtac (Rep_Nat RS Nat_induct) 1); |
42 by (rtac (Rep_Nat RS Nat_induct) 1); |
43 by (REPEAT (ares_tac prems 1 |
43 by (REPEAT (ares_tac prems 1 |
44 ORELSE eresolve_tac [Abs_Nat_inverse RS subst] 1)); |
44 ORELSE eresolve_tac [Abs_Nat_inverse RS subst] 1)); |
45 val nat_induct = result(); |
45 qed "nat_induct"; |
46 |
46 |
47 (*Perform induction on n. *) |
47 (*Perform induction on n. *) |
48 fun nat_ind_tac a i = |
48 fun nat_ind_tac a i = |
49 EVERY [res_inst_tac [("n",a)] nat_induct i, |
49 EVERY [res_inst_tac [("n",a)] nat_induct i, |
50 rename_last_tac a ["1"] (i+1)]; |
50 rename_last_tac a ["1"] (i+1)]; |
58 by (res_inst_tac [("x","m")] spec 1); |
58 by (res_inst_tac [("x","m")] spec 1); |
59 by (nat_ind_tac "n" 1); |
59 by (nat_ind_tac "n" 1); |
60 by (rtac allI 2); |
60 by (rtac allI 2); |
61 by (nat_ind_tac "x" 2); |
61 by (nat_ind_tac "x" 2); |
62 by (REPEAT (ares_tac (prems@[allI]) 1 ORELSE etac spec 1)); |
62 by (REPEAT (ares_tac (prems@[allI]) 1 ORELSE etac spec 1)); |
63 val diff_induct = result(); |
63 qed "diff_induct"; |
64 |
64 |
65 (*Case analysis on the natural numbers*) |
65 (*Case analysis on the natural numbers*) |
66 val prems = goal Nat.thy |
66 val prems = goal Nat.thy |
67 "[| n=0 ==> P; !!x. n = Suc(x) ==> P |] ==> P"; |
67 "[| n=0 ==> P; !!x. n = Suc(x) ==> P |] ==> P"; |
68 by (subgoal_tac "n=0 | (EX x. n = Suc(x))" 1); |
68 by (subgoal_tac "n=0 | (EX x. n = Suc(x))" 1); |
69 by (fast_tac (HOL_cs addSEs prems) 1); |
69 by (fast_tac (HOL_cs addSEs prems) 1); |
70 by (nat_ind_tac "n" 1); |
70 by (nat_ind_tac "n" 1); |
71 by (rtac (refl RS disjI1) 1); |
71 by (rtac (refl RS disjI1) 1); |
72 by (fast_tac HOL_cs 1); |
72 by (fast_tac HOL_cs 1); |
73 val natE = result(); |
73 qed "natE"; |
74 |
74 |
75 (*** Isomorphisms: Abs_Nat and Rep_Nat ***) |
75 (*** Isomorphisms: Abs_Nat and Rep_Nat ***) |
76 |
76 |
77 (*We can't take these properties as axioms, or take Abs_Nat==Inv(Rep_Nat), |
77 (*We can't take these properties as axioms, or take Abs_Nat==Inv(Rep_Nat), |
78 since we assume the isomorphism equations will one day be given by Isabelle*) |
78 since we assume the isomorphism equations will one day be given by Isabelle*) |
79 |
79 |
80 goal Nat.thy "inj(Rep_Nat)"; |
80 goal Nat.thy "inj(Rep_Nat)"; |
81 by (rtac inj_inverseI 1); |
81 by (rtac inj_inverseI 1); |
82 by (rtac Rep_Nat_inverse 1); |
82 by (rtac Rep_Nat_inverse 1); |
83 val inj_Rep_Nat = result(); |
83 qed "inj_Rep_Nat"; |
84 |
84 |
85 goal Nat.thy "inj_onto(Abs_Nat,Nat)"; |
85 goal Nat.thy "inj_onto(Abs_Nat,Nat)"; |
86 by (rtac inj_onto_inverseI 1); |
86 by (rtac inj_onto_inverseI 1); |
87 by (etac Abs_Nat_inverse 1); |
87 by (etac Abs_Nat_inverse 1); |
88 val inj_onto_Abs_Nat = result(); |
88 qed "inj_onto_Abs_Nat"; |
89 |
89 |
90 (*** Distinctness of constructors ***) |
90 (*** Distinctness of constructors ***) |
91 |
91 |
92 goalw Nat.thy [Zero_def,Suc_def] "Suc(m) ~= 0"; |
92 goalw Nat.thy [Zero_def,Suc_def] "Suc(m) ~= 0"; |
93 by (rtac (inj_onto_Abs_Nat RS inj_onto_contraD) 1); |
93 by (rtac (inj_onto_Abs_Nat RS inj_onto_contraD) 1); |
94 by (rtac Suc_Rep_not_Zero_Rep 1); |
94 by (rtac Suc_Rep_not_Zero_Rep 1); |
95 by (REPEAT (resolve_tac [Rep_Nat, Suc_RepI, Zero_RepI] 1)); |
95 by (REPEAT (resolve_tac [Rep_Nat, Suc_RepI, Zero_RepI] 1)); |
96 val Suc_not_Zero = result(); |
96 qed "Suc_not_Zero"; |
97 |
97 |
98 val Zero_not_Suc = standard (Suc_not_Zero RS not_sym); |
98 val Zero_not_Suc = standard (Suc_not_Zero RS not_sym); |
99 |
99 |
100 val Suc_neq_Zero = standard (Suc_not_Zero RS notE); |
100 val Suc_neq_Zero = standard (Suc_not_Zero RS notE); |
101 val Zero_neq_Suc = sym RS Suc_neq_Zero; |
101 val Zero_neq_Suc = sym RS Suc_neq_Zero; |
106 by (rtac injI 1); |
106 by (rtac injI 1); |
107 by (dtac (inj_onto_Abs_Nat RS inj_ontoD) 1); |
107 by (dtac (inj_onto_Abs_Nat RS inj_ontoD) 1); |
108 by (REPEAT (resolve_tac [Rep_Nat, Suc_RepI] 1)); |
108 by (REPEAT (resolve_tac [Rep_Nat, Suc_RepI] 1)); |
109 by (dtac (inj_Suc_Rep RS injD) 1); |
109 by (dtac (inj_Suc_Rep RS injD) 1); |
110 by (etac (inj_Rep_Nat RS injD) 1); |
110 by (etac (inj_Rep_Nat RS injD) 1); |
111 val inj_Suc = result(); |
111 qed "inj_Suc"; |
112 |
112 |
113 val Suc_inject = inj_Suc RS injD;; |
113 val Suc_inject = inj_Suc RS injD;; |
114 |
114 |
115 goal Nat.thy "(Suc(m)=Suc(n)) = (m=n)"; |
115 goal Nat.thy "(Suc(m)=Suc(n)) = (m=n)"; |
116 by (EVERY1 [rtac iffI, etac Suc_inject, etac arg_cong]); |
116 by (EVERY1 [rtac iffI, etac Suc_inject, etac arg_cong]); |
117 val Suc_Suc_eq = result(); |
117 qed "Suc_Suc_eq"; |
118 |
118 |
119 goal Nat.thy "n ~= Suc(n)"; |
119 goal Nat.thy "n ~= Suc(n)"; |
120 by (nat_ind_tac "n" 1); |
120 by (nat_ind_tac "n" 1); |
121 by (ALLGOALS(asm_simp_tac (HOL_ss addsimps [Zero_not_Suc,Suc_Suc_eq]))); |
121 by (ALLGOALS(asm_simp_tac (HOL_ss addsimps [Zero_not_Suc,Suc_Suc_eq]))); |
122 val n_not_Suc_n = result(); |
122 qed "n_not_Suc_n"; |
123 |
123 |
124 val Suc_n_not_n = n_not_Suc_n RS not_sym; |
124 val Suc_n_not_n = n_not_Suc_n RS not_sym; |
125 |
125 |
126 (*** nat_case -- the selection operator for nat ***) |
126 (*** nat_case -- the selection operator for nat ***) |
127 |
127 |
128 goalw Nat.thy [nat_case_def] "nat_case(a, f, 0) = a"; |
128 goalw Nat.thy [nat_case_def] "nat_case(a, f, 0) = a"; |
129 by (fast_tac (set_cs addIs [select_equality] addEs [Zero_neq_Suc]) 1); |
129 by (fast_tac (set_cs addIs [select_equality] addEs [Zero_neq_Suc]) 1); |
130 val nat_case_0 = result(); |
130 qed "nat_case_0"; |
131 |
131 |
132 goalw Nat.thy [nat_case_def] "nat_case(a, f, Suc(k)) = f(k)"; |
132 goalw Nat.thy [nat_case_def] "nat_case(a, f, Suc(k)) = f(k)"; |
133 by (fast_tac (set_cs addIs [select_equality] |
133 by (fast_tac (set_cs addIs [select_equality] |
134 addEs [make_elim Suc_inject, Suc_neq_Zero]) 1); |
134 addEs [make_elim Suc_inject, Suc_neq_Zero]) 1); |
135 val nat_case_Suc = result(); |
135 qed "nat_case_Suc"; |
136 |
136 |
137 (** Introduction rules for 'pred_nat' **) |
137 (** Introduction rules for 'pred_nat' **) |
138 |
138 |
139 goalw Nat.thy [pred_nat_def] "<n, Suc(n)> : pred_nat"; |
139 goalw Nat.thy [pred_nat_def] "<n, Suc(n)> : pred_nat"; |
140 by (fast_tac set_cs 1); |
140 by (fast_tac set_cs 1); |
141 val pred_natI = result(); |
141 qed "pred_natI"; |
142 |
142 |
143 val major::prems = goalw Nat.thy [pred_nat_def] |
143 val major::prems = goalw Nat.thy [pred_nat_def] |
144 "[| p : pred_nat; !!x n. [| p = <n, Suc(n)> |] ==> R \ |
144 "[| p : pred_nat; !!x n. [| p = <n, Suc(n)> |] ==> R \ |
145 \ |] ==> R"; |
145 \ |] ==> R"; |
146 by (rtac (major RS CollectE) 1); |
146 by (rtac (major RS CollectE) 1); |
147 by (REPEAT (eresolve_tac ([asm_rl,exE]@prems) 1)); |
147 by (REPEAT (eresolve_tac ([asm_rl,exE]@prems) 1)); |
148 val pred_natE = result(); |
148 qed "pred_natE"; |
149 |
149 |
150 goalw Nat.thy [wf_def] "wf(pred_nat)"; |
150 goalw Nat.thy [wf_def] "wf(pred_nat)"; |
151 by (strip_tac 1); |
151 by (strip_tac 1); |
152 by (nat_ind_tac "x" 1); |
152 by (nat_ind_tac "x" 1); |
153 by (fast_tac (HOL_cs addSEs [mp, pred_natE, Pair_inject, |
153 by (fast_tac (HOL_cs addSEs [mp, pred_natE, Pair_inject, |
154 make_elim Suc_inject]) 2); |
154 make_elim Suc_inject]) 2); |
155 by (fast_tac (HOL_cs addSEs [mp, pred_natE, Pair_inject, Zero_neq_Suc]) 1); |
155 by (fast_tac (HOL_cs addSEs [mp, pred_natE, Pair_inject, Zero_neq_Suc]) 1); |
156 val wf_pred_nat = result(); |
156 qed "wf_pred_nat"; |
157 |
157 |
158 |
158 |
159 (*** nat_rec -- by wf recursion on pred_nat ***) |
159 (*** nat_rec -- by wf recursion on pred_nat ***) |
160 |
160 |
161 val nat_rec_unfold = standard (wf_pred_nat RS (nat_rec_def RS def_wfrec)); |
161 val nat_rec_unfold = standard (wf_pred_nat RS (nat_rec_def RS def_wfrec)); |
163 (** conversion rules **) |
163 (** conversion rules **) |
164 |
164 |
165 goal Nat.thy "nat_rec(0,c,h) = c"; |
165 goal Nat.thy "nat_rec(0,c,h) = c"; |
166 by (rtac (nat_rec_unfold RS trans) 1); |
166 by (rtac (nat_rec_unfold RS trans) 1); |
167 by (simp_tac (HOL_ss addsimps [nat_case_0]) 1); |
167 by (simp_tac (HOL_ss addsimps [nat_case_0]) 1); |
168 val nat_rec_0 = result(); |
168 qed "nat_rec_0"; |
169 |
169 |
170 goal Nat.thy "nat_rec(Suc(n), c, h) = h(n, nat_rec(n,c,h))"; |
170 goal Nat.thy "nat_rec(Suc(n), c, h) = h(n, nat_rec(n,c,h))"; |
171 by (rtac (nat_rec_unfold RS trans) 1); |
171 by (rtac (nat_rec_unfold RS trans) 1); |
172 by (simp_tac (HOL_ss addsimps [nat_case_Suc, pred_natI, cut_apply]) 1); |
172 by (simp_tac (HOL_ss addsimps [nat_case_Suc, pred_natI, cut_apply]) 1); |
173 val nat_rec_Suc = result(); |
173 qed "nat_rec_Suc"; |
174 |
174 |
175 (*These 2 rules ease the use of primitive recursion. NOTE USE OF == *) |
175 (*These 2 rules ease the use of primitive recursion. NOTE USE OF == *) |
176 val [rew] = goal Nat.thy |
176 val [rew] = goal Nat.thy |
177 "[| !!n. f(n) == nat_rec(n,c,h) |] ==> f(0) = c"; |
177 "[| !!n. f(n) == nat_rec(n,c,h) |] ==> f(0) = c"; |
178 by (rewtac rew); |
178 by (rewtac rew); |
179 by (rtac nat_rec_0 1); |
179 by (rtac nat_rec_0 1); |
180 val def_nat_rec_0 = result(); |
180 qed "def_nat_rec_0"; |
181 |
181 |
182 val [rew] = goal Nat.thy |
182 val [rew] = goal Nat.thy |
183 "[| !!n. f(n) == nat_rec(n,c,h) |] ==> f(Suc(n)) = h(n,f(n))"; |
183 "[| !!n. f(n) == nat_rec(n,c,h) |] ==> f(Suc(n)) = h(n,f(n))"; |
184 by (rewtac rew); |
184 by (rewtac rew); |
185 by (rtac nat_rec_Suc 1); |
185 by (rtac nat_rec_Suc 1); |
186 val def_nat_rec_Suc = result(); |
186 qed "def_nat_rec_Suc"; |
187 |
187 |
188 fun nat_recs def = |
188 fun nat_recs def = |
189 [standard (def RS def_nat_rec_0), |
189 [standard (def RS def_nat_rec_0), |
190 standard (def RS def_nat_rec_Suc)]; |
190 standard (def RS def_nat_rec_Suc)]; |
191 |
191 |
196 |
196 |
197 val prems = goalw Nat.thy [less_def] "[| i<j; j<k |] ==> i<(k::nat)"; |
197 val prems = goalw Nat.thy [less_def] "[| i<j; j<k |] ==> i<(k::nat)"; |
198 by (rtac (trans_trancl RS transD) 1); |
198 by (rtac (trans_trancl RS transD) 1); |
199 by (resolve_tac prems 1); |
199 by (resolve_tac prems 1); |
200 by (resolve_tac prems 1); |
200 by (resolve_tac prems 1); |
201 val less_trans = result(); |
201 qed "less_trans"; |
202 |
202 |
203 goalw Nat.thy [less_def] "n < Suc(n)"; |
203 goalw Nat.thy [less_def] "n < Suc(n)"; |
204 by (rtac (pred_natI RS r_into_trancl) 1); |
204 by (rtac (pred_natI RS r_into_trancl) 1); |
205 val lessI = result(); |
205 qed "lessI"; |
206 |
206 |
207 (* i<j ==> i<Suc(j) *) |
207 (* i<j ==> i<Suc(j) *) |
208 val less_SucI = lessI RSN (2, less_trans); |
208 val less_SucI = lessI RSN (2, less_trans); |
209 |
209 |
210 goal Nat.thy "0 < Suc(n)"; |
210 goal Nat.thy "0 < Suc(n)"; |
211 by (nat_ind_tac "n" 1); |
211 by (nat_ind_tac "n" 1); |
212 by (rtac lessI 1); |
212 by (rtac lessI 1); |
213 by (etac less_trans 1); |
213 by (etac less_trans 1); |
214 by (rtac lessI 1); |
214 by (rtac lessI 1); |
215 val zero_less_Suc = result(); |
215 qed "zero_less_Suc"; |
216 |
216 |
217 (** Elimination properties **) |
217 (** Elimination properties **) |
218 |
218 |
219 val prems = goalw Nat.thy [less_def] "n<m ==> ~ m<(n::nat)"; |
219 val prems = goalw Nat.thy [less_def] "n<m ==> ~ m<(n::nat)"; |
220 by(fast_tac (HOL_cs addIs ([wf_pred_nat, wf_trancl RS wf_asym]@prems))1); |
220 by(fast_tac (HOL_cs addIs ([wf_pred_nat, wf_trancl RS wf_asym]@prems))1); |
221 val less_not_sym = result(); |
221 qed "less_not_sym"; |
222 |
222 |
223 (* [| n<m; m<n |] ==> R *) |
223 (* [| n<m; m<n |] ==> R *) |
224 val less_asym = standard (less_not_sym RS notE); |
224 val less_asym = standard (less_not_sym RS notE); |
225 |
225 |
226 goalw Nat.thy [less_def] "~ n<(n::nat)"; |
226 goalw Nat.thy [less_def] "~ n<(n::nat)"; |
227 by (rtac notI 1); |
227 by (rtac notI 1); |
228 by (etac (wf_pred_nat RS wf_trancl RS wf_anti_refl) 1); |
228 by (etac (wf_pred_nat RS wf_trancl RS wf_anti_refl) 1); |
229 val less_not_refl = result(); |
229 qed "less_not_refl"; |
230 |
230 |
231 (* n<n ==> R *) |
231 (* n<n ==> R *) |
232 val less_anti_refl = standard (less_not_refl RS notE); |
232 val less_anti_refl = standard (less_not_refl RS notE); |
233 |
233 |
234 goal Nat.thy "!!m. n<m ==> m ~= (n::nat)"; |
234 goal Nat.thy "!!m. n<m ==> m ~= (n::nat)"; |
235 by(fast_tac (HOL_cs addEs [less_anti_refl]) 1); |
235 by(fast_tac (HOL_cs addEs [less_anti_refl]) 1); |
236 val less_not_refl2 = result(); |
236 qed "less_not_refl2"; |
237 |
237 |
238 |
238 |
239 val major::prems = goalw Nat.thy [less_def] |
239 val major::prems = goalw Nat.thy [less_def] |
240 "[| i<k; k=Suc(i) ==> P; !!j. [| i<j; k=Suc(j) |] ==> P \ |
240 "[| i<k; k=Suc(i) ==> P; !!j. [| i<j; k=Suc(j) |] ==> P \ |
241 \ |] ==> P"; |
241 \ |] ==> P"; |
242 by (rtac (major RS tranclE) 1); |
242 by (rtac (major RS tranclE) 1); |
243 by (fast_tac (HOL_cs addSEs (prems@[pred_natE, Pair_inject])) 1); |
243 by (fast_tac (HOL_cs addSEs (prems@[pred_natE, Pair_inject])) 1); |
244 by (fast_tac (HOL_cs addSEs (prems@[pred_natE, Pair_inject])) 1); |
244 by (fast_tac (HOL_cs addSEs (prems@[pred_natE, Pair_inject])) 1); |
245 val lessE = result(); |
245 qed "lessE"; |
246 |
246 |
247 goal Nat.thy "~ n<0"; |
247 goal Nat.thy "~ n<0"; |
248 by (rtac notI 1); |
248 by (rtac notI 1); |
249 by (etac lessE 1); |
249 by (etac lessE 1); |
250 by (etac Zero_neq_Suc 1); |
250 by (etac Zero_neq_Suc 1); |
251 by (etac Zero_neq_Suc 1); |
251 by (etac Zero_neq_Suc 1); |
252 val not_less0 = result(); |
252 qed "not_less0"; |
253 |
253 |
254 (* n<0 ==> R *) |
254 (* n<0 ==> R *) |
255 val less_zeroE = standard (not_less0 RS notE); |
255 val less_zeroE = standard (not_less0 RS notE); |
256 |
256 |
257 val [major,less,eq] = goal Nat.thy |
257 val [major,less,eq] = goal Nat.thy |
277 by (rtac impI 1); |
277 by (rtac impI 1); |
278 by (etac less_zeroE 1); |
278 by (etac less_zeroE 1); |
279 by (fast_tac (HOL_cs addSIs [lessI RS less_SucI] |
279 by (fast_tac (HOL_cs addSIs [lessI RS less_SucI] |
280 addSDs [Suc_inject] |
280 addSDs [Suc_inject] |
281 addEs [less_trans, lessE]) 1); |
281 addEs [less_trans, lessE]) 1); |
282 val Suc_lessD = result(); |
282 qed "Suc_lessD"; |
283 |
283 |
284 val [major,minor] = goal Nat.thy |
284 val [major,minor] = goal Nat.thy |
285 "[| Suc(i)<k; !!j. [| i<j; k=Suc(j) |] ==> P \ |
285 "[| Suc(i)<k; !!j. [| i<j; k=Suc(j) |] ==> P \ |
286 \ |] ==> P"; |
286 \ |] ==> P"; |
287 by (rtac (major RS lessE) 1); |
287 by (rtac (major RS lessE) 1); |
288 by (etac (lessI RS minor) 1); |
288 by (etac (lessI RS minor) 1); |
289 by (etac (Suc_lessD RS minor) 1); |
289 by (etac (Suc_lessD RS minor) 1); |
290 by (assume_tac 1); |
290 by (assume_tac 1); |
291 val Suc_lessE = result(); |
291 qed "Suc_lessE"; |
292 |
292 |
293 val [major] = goal Nat.thy "Suc(m) < Suc(n) ==> m<n"; |
293 val [major] = goal Nat.thy "Suc(m) < Suc(n) ==> m<n"; |
294 by (rtac (major RS lessE) 1); |
294 by (rtac (major RS lessE) 1); |
295 by (REPEAT (rtac lessI 1 |
295 by (REPEAT (rtac lessI 1 |
296 ORELSE eresolve_tac [make_elim Suc_inject, ssubst, Suc_lessD] 1)); |
296 ORELSE eresolve_tac [make_elim Suc_inject, ssubst, Suc_lessD] 1)); |
297 val Suc_less_SucD = result(); |
297 qed "Suc_less_SucD"; |
298 |
298 |
299 val prems = goal Nat.thy "m<n ==> Suc(m) < Suc(n)"; |
299 val prems = goal Nat.thy "m<n ==> Suc(m) < Suc(n)"; |
300 by (subgoal_tac "m<n --> Suc(m) < Suc(n)" 1); |
300 by (subgoal_tac "m<n --> Suc(m) < Suc(n)" 1); |
301 by (fast_tac (HOL_cs addIs prems) 1); |
301 by (fast_tac (HOL_cs addIs prems) 1); |
302 by (nat_ind_tac "n" 1); |
302 by (nat_ind_tac "n" 1); |
303 by (rtac impI 1); |
303 by (rtac impI 1); |
304 by (etac less_zeroE 1); |
304 by (etac less_zeroE 1); |
305 by (fast_tac (HOL_cs addSIs [lessI] |
305 by (fast_tac (HOL_cs addSIs [lessI] |
306 addSDs [Suc_inject] |
306 addSDs [Suc_inject] |
307 addEs [less_trans, lessE]) 1); |
307 addEs [less_trans, lessE]) 1); |
308 val Suc_mono = result(); |
308 qed "Suc_mono"; |
309 |
309 |
310 goal Nat.thy "(Suc(m) < Suc(n)) = (m<n)"; |
310 goal Nat.thy "(Suc(m) < Suc(n)) = (m<n)"; |
311 by (EVERY1 [rtac iffI, etac Suc_less_SucD, etac Suc_mono]); |
311 by (EVERY1 [rtac iffI, etac Suc_less_SucD, etac Suc_mono]); |
312 val Suc_less_eq = result(); |
312 qed "Suc_less_eq"; |
313 |
313 |
314 goal Nat.thy "~(Suc(n) < n)"; |
314 goal Nat.thy "~(Suc(n) < n)"; |
315 by(fast_tac (HOL_cs addEs [Suc_lessD RS less_anti_refl]) 1); |
315 by(fast_tac (HOL_cs addEs [Suc_lessD RS less_anti_refl]) 1); |
316 val not_Suc_n_less_n = result(); |
316 qed "not_Suc_n_less_n"; |
317 |
317 |
318 (*"Less than" is a linear ordering*) |
318 (*"Less than" is a linear ordering*) |
319 goal Nat.thy "m<n | m=n | n<(m::nat)"; |
319 goal Nat.thy "m<n | m=n | n<(m::nat)"; |
320 by (nat_ind_tac "m" 1); |
320 by (nat_ind_tac "m" 1); |
321 by (nat_ind_tac "n" 1); |
321 by (nat_ind_tac "n" 1); |
322 by (rtac (refl RS disjI1 RS disjI2) 1); |
322 by (rtac (refl RS disjI1 RS disjI2) 1); |
323 by (rtac (zero_less_Suc RS disjI1) 1); |
323 by (rtac (zero_less_Suc RS disjI1) 1); |
324 by (fast_tac (HOL_cs addIs [lessI, Suc_mono, less_SucI] addEs [lessE]) 1); |
324 by (fast_tac (HOL_cs addIs [lessI, Suc_mono, less_SucI] addEs [lessE]) 1); |
325 val less_linear = result(); |
325 qed "less_linear"; |
326 |
326 |
327 (*Can be used with less_Suc_eq to get n=m | n<m *) |
327 (*Can be used with less_Suc_eq to get n=m | n<m *) |
328 goal Nat.thy "(~ m < n) = (n < Suc(m))"; |
328 goal Nat.thy "(~ m < n) = (n < Suc(m))"; |
329 by (res_inst_tac [("m","m"),("n","n")] diff_induct 1); |
329 by (res_inst_tac [("m","m"),("n","n")] diff_induct 1); |
330 by(ALLGOALS(asm_simp_tac (HOL_ss addsimps |
330 by(ALLGOALS(asm_simp_tac (HOL_ss addsimps |
331 [not_less0,zero_less_Suc,Suc_less_eq]))); |
331 [not_less0,zero_less_Suc,Suc_less_eq]))); |
332 val not_less_eq = result(); |
332 qed "not_less_eq"; |
333 |
333 |
334 (*Complete induction, aka course-of-values induction*) |
334 (*Complete induction, aka course-of-values induction*) |
335 val prems = goalw Nat.thy [less_def] |
335 val prems = goalw Nat.thy [less_def] |
336 "[| !!n. [| ! m::nat. m<n --> P(m) |] ==> P(n) |] ==> P(n)"; |
336 "[| !!n. [| ! m::nat. m<n --> P(m) |] ==> P(n) |] ==> P(n)"; |
337 by (wf_ind_tac "n" [wf_pred_nat RS wf_trancl] 1); |
337 by (wf_ind_tac "n" [wf_pred_nat RS wf_trancl] 1); |
338 by (eresolve_tac prems 1); |
338 by (eresolve_tac prems 1); |
339 val less_induct = result(); |
339 qed "less_induct"; |
340 |
340 |
341 |
341 |
342 (*** Properties of <= ***) |
342 (*** Properties of <= ***) |
343 |
343 |
344 goalw Nat.thy [le_def] "0 <= n"; |
344 goalw Nat.thy [le_def] "0 <= n"; |
345 by (rtac not_less0 1); |
345 by (rtac not_less0 1); |
346 val le0 = result(); |
346 qed "le0"; |
347 |
347 |
348 val nat_simps = [not_less0, less_not_refl, zero_less_Suc, lessI, |
348 val nat_simps = [not_less0, less_not_refl, zero_less_Suc, lessI, |
349 Suc_less_eq, less_Suc_eq, le0, not_Suc_n_less_n, |
349 Suc_less_eq, less_Suc_eq, le0, not_Suc_n_less_n, |
350 Suc_not_Zero, Zero_not_Suc, Suc_Suc_eq, |
350 Suc_not_Zero, Zero_not_Suc, Suc_Suc_eq, |
351 n_not_Suc_n, Suc_n_not_n, |
351 n_not_Suc_n, Suc_n_not_n, |
362 "m=n ==> nat_rec(m,a,f) = nat_rec(n,a,f)" |
362 "m=n ==> nat_rec(m,a,f) = nat_rec(n,a,f)" |
363 (fn [prem] => [rtac (prem RS arg_cong) 1]); |
363 (fn [prem] => [rtac (prem RS arg_cong) 1]); |
364 |
364 |
365 val prems = goalw Nat.thy [le_def] "~(n<m) ==> m<=(n::nat)"; |
365 val prems = goalw Nat.thy [le_def] "~(n<m) ==> m<=(n::nat)"; |
366 by (resolve_tac prems 1); |
366 by (resolve_tac prems 1); |
367 val leI = result(); |
367 qed "leI"; |
368 |
368 |
369 val prems = goalw Nat.thy [le_def] "m<=n ==> ~(n<(m::nat))"; |
369 val prems = goalw Nat.thy [le_def] "m<=n ==> ~(n<(m::nat))"; |
370 by (resolve_tac prems 1); |
370 by (resolve_tac prems 1); |
371 val leD = result(); |
371 qed "leD"; |
372 |
372 |
373 val leE = make_elim leD; |
373 val leE = make_elim leD; |
374 |
374 |
375 goalw Nat.thy [le_def] "!!m. ~ m <= n ==> n<(m::nat)"; |
375 goalw Nat.thy [le_def] "!!m. ~ m <= n ==> n<(m::nat)"; |
376 by (fast_tac HOL_cs 1); |
376 by (fast_tac HOL_cs 1); |
377 val not_leE = result(); |
377 qed "not_leE"; |
378 |
378 |
379 goalw Nat.thy [le_def] "!!m. m < n ==> Suc(m) <= n"; |
379 goalw Nat.thy [le_def] "!!m. m < n ==> Suc(m) <= n"; |
380 by(simp_tac nat_ss0 1); |
380 by(simp_tac nat_ss0 1); |
381 by (fast_tac (HOL_cs addEs [less_anti_refl,less_asym]) 1); |
381 by (fast_tac (HOL_cs addEs [less_anti_refl,less_asym]) 1); |
382 val lessD = result(); |
382 qed "lessD"; |
383 |
383 |
384 goalw Nat.thy [le_def] "!!m. Suc(m) <= n ==> m <= n"; |
384 goalw Nat.thy [le_def] "!!m. Suc(m) <= n ==> m <= n"; |
385 by(asm_full_simp_tac nat_ss0 1); |
385 by(asm_full_simp_tac nat_ss0 1); |
386 by(fast_tac HOL_cs 1); |
386 by(fast_tac HOL_cs 1); |
387 val Suc_leD = result(); |
387 qed "Suc_leD"; |
388 |
388 |
389 goalw Nat.thy [le_def] "!!m. m < n ==> m <= (n::nat)"; |
389 goalw Nat.thy [le_def] "!!m. m < n ==> m <= (n::nat)"; |
390 by (fast_tac (HOL_cs addEs [less_asym]) 1); |
390 by (fast_tac (HOL_cs addEs [less_asym]) 1); |
391 val less_imp_le = result(); |
391 qed "less_imp_le"; |
392 |
392 |
393 goalw Nat.thy [le_def] "!!m. m <= n ==> m < n | m=(n::nat)"; |
393 goalw Nat.thy [le_def] "!!m. m <= n ==> m < n | m=(n::nat)"; |
394 by (cut_facts_tac [less_linear] 1); |
394 by (cut_facts_tac [less_linear] 1); |
395 by (fast_tac (HOL_cs addEs [less_anti_refl,less_asym]) 1); |
395 by (fast_tac (HOL_cs addEs [less_anti_refl,less_asym]) 1); |
396 val le_imp_less_or_eq = result(); |
396 qed "le_imp_less_or_eq"; |
397 |
397 |
398 goalw Nat.thy [le_def] "!!m. m<n | m=n ==> m <=(n::nat)"; |
398 goalw Nat.thy [le_def] "!!m. m<n | m=n ==> m <=(n::nat)"; |
399 by (cut_facts_tac [less_linear] 1); |
399 by (cut_facts_tac [less_linear] 1); |
400 by (fast_tac (HOL_cs addEs [less_anti_refl,less_asym]) 1); |
400 by (fast_tac (HOL_cs addEs [less_anti_refl,less_asym]) 1); |
401 by (flexflex_tac); |
401 by (flexflex_tac); |
402 val less_or_eq_imp_le = result(); |
402 qed "less_or_eq_imp_le"; |
403 |
403 |
404 goal Nat.thy "(x <= (y::nat)) = (x < y | x=y)"; |
404 goal Nat.thy "(x <= (y::nat)) = (x < y | x=y)"; |
405 by (REPEAT(ares_tac [iffI,less_or_eq_imp_le,le_imp_less_or_eq] 1)); |
405 by (REPEAT(ares_tac [iffI,less_or_eq_imp_le,le_imp_less_or_eq] 1)); |
406 val le_eq_less_or_eq = result(); |
406 qed "le_eq_less_or_eq"; |
407 |
407 |
408 goal Nat.thy "n <= (n::nat)"; |
408 goal Nat.thy "n <= (n::nat)"; |
409 by(simp_tac (HOL_ss addsimps [le_eq_less_or_eq]) 1); |
409 by(simp_tac (HOL_ss addsimps [le_eq_less_or_eq]) 1); |
410 val le_refl = result(); |
410 qed "le_refl"; |
411 |
411 |
412 val prems = goal Nat.thy "!!i. [| i <= j; j < k |] ==> i < (k::nat)"; |
412 val prems = goal Nat.thy "!!i. [| i <= j; j < k |] ==> i < (k::nat)"; |
413 by (dtac le_imp_less_or_eq 1); |
413 by (dtac le_imp_less_or_eq 1); |
414 by (fast_tac (HOL_cs addIs [less_trans]) 1); |
414 by (fast_tac (HOL_cs addIs [less_trans]) 1); |
415 val le_less_trans = result(); |
415 qed "le_less_trans"; |
416 |
416 |
417 goal Nat.thy "!!i. [| i <= j; j <= k |] ==> i <= (k::nat)"; |
417 goal Nat.thy "!!i. [| i <= j; j <= k |] ==> i <= (k::nat)"; |
418 by (EVERY1[dtac le_imp_less_or_eq, dtac le_imp_less_or_eq, |
418 by (EVERY1[dtac le_imp_less_or_eq, dtac le_imp_less_or_eq, |
419 rtac less_or_eq_imp_le, fast_tac (HOL_cs addIs [less_trans])]); |
419 rtac less_or_eq_imp_le, fast_tac (HOL_cs addIs [less_trans])]); |
420 val le_trans = result(); |
420 qed "le_trans"; |
421 |
421 |
422 val prems = goal Nat.thy "!!m. [| m <= n; n <= m |] ==> m = (n::nat)"; |
422 val prems = goal Nat.thy "!!m. [| m <= n; n <= m |] ==> m = (n::nat)"; |
423 by (EVERY1[dtac le_imp_less_or_eq, dtac le_imp_less_or_eq, |
423 by (EVERY1[dtac le_imp_less_or_eq, dtac le_imp_less_or_eq, |
424 fast_tac (HOL_cs addEs [less_anti_refl,less_asym])]); |
424 fast_tac (HOL_cs addEs [less_anti_refl,less_asym])]); |
425 val le_anti_sym = result(); |
425 qed "le_anti_sym"; |
426 |
426 |
427 val nat_ss = nat_ss0 addsimps [le_refl]; |
427 val nat_ss = nat_ss0 addsimps [le_refl]; |