11 |
11 |
12 theory SEQ |
12 theory SEQ |
13 imports Limits |
13 imports Limits |
14 begin |
14 begin |
15 |
15 |
16 definition |
16 abbreviation |
17 LIMSEQ :: "[nat \<Rightarrow> 'a::metric_space, 'a] \<Rightarrow> bool" |
17 LIMSEQ :: "[nat \<Rightarrow> 'a::metric_space, 'a] \<Rightarrow> bool" |
18 ("((_)/ ----> (_))" [60, 60] 60) where |
18 ("((_)/ ----> (_))" [60, 60] 60) where |
19 --{*Standard definition of convergence of sequence*} |
19 "X ----> L \<equiv> (X ---> L) sequentially" |
20 [code del]: "X ----> L = (\<forall>r>0. \<exists>no. \<forall>n\<ge>no. dist (X n) L < r)" |
|
21 |
20 |
22 definition |
21 definition |
23 lim :: "(nat \<Rightarrow> 'a::metric_space) \<Rightarrow> 'a" where |
22 lim :: "(nat \<Rightarrow> 'a::metric_space) \<Rightarrow> 'a" where |
24 --{*Standard definition of limit using choice operator*} |
23 --{*Standard definition of limit using choice operator*} |
25 "lim X = (THE L. X ----> L)" |
24 "lim X = (THE L. X ----> L)" |
117 subsection {* Limits of Sequences *} |
116 subsection {* Limits of Sequences *} |
118 |
117 |
119 lemma [trans]: "X=Y ==> Y ----> z ==> X ----> z" |
118 lemma [trans]: "X=Y ==> Y ----> z ==> X ----> z" |
120 by simp |
119 by simp |
121 |
120 |
122 lemma LIMSEQ_conv_tendsto: "(X ----> L) \<longleftrightarrow> (X ---> L) sequentially" |
121 lemma LIMSEQ_def: "X ----> L = (\<forall>r>0. \<exists>no. \<forall>n\<ge>no. dist (X n) L < r)" |
123 unfolding LIMSEQ_def tendsto_iff eventually_sequentially .. |
122 unfolding tendsto_iff eventually_sequentially .. |
124 |
123 |
125 lemma LIMSEQ_iff: |
124 lemma LIMSEQ_iff: |
126 fixes L :: "'a::real_normed_vector" |
125 fixes L :: "'a::real_normed_vector" |
127 shows "(X ----> L) = (\<forall>r>0. \<exists>no. \<forall>n \<ge> no. norm (X n - L) < r)" |
126 shows "(X ----> L) = (\<forall>r>0. \<exists>no. \<forall>n \<ge> no. norm (X n - L) < r)" |
128 unfolding LIMSEQ_def dist_norm .. |
127 unfolding LIMSEQ_def dist_norm .. |
129 |
128 |
130 lemma LIMSEQ_iff_nz: "X ----> L = (\<forall>r>0. \<exists>no>0. \<forall>n\<ge>no. dist (X n) L < r)" |
129 lemma LIMSEQ_iff_nz: "X ----> L = (\<forall>r>0. \<exists>no>0. \<forall>n\<ge>no. dist (X n) L < r)" |
131 by (auto simp add: LIMSEQ_def) (metis Suc_leD zero_less_Suc) |
130 unfolding LIMSEQ_def by (metis Suc_leD zero_less_Suc) |
132 |
131 |
133 lemma LIMSEQ_Zfun_iff: "((\<lambda>n. X n) ----> L) = Zfun (\<lambda>n. X n - L) sequentially" |
132 lemma LIMSEQ_Zfun_iff: "((\<lambda>n. X n) ----> L) = Zfun (\<lambda>n. X n - L) sequentially" |
134 by (simp only: LIMSEQ_iff Zfun_def eventually_sequentially) |
133 by (rule tendsto_Zfun_iff) |
135 |
134 |
136 lemma metric_LIMSEQ_I: |
135 lemma metric_LIMSEQ_I: |
137 "(\<And>r. 0 < r \<Longrightarrow> \<exists>no. \<forall>n\<ge>no. dist (X n) L < r) \<Longrightarrow> X ----> L" |
136 "(\<And>r. 0 < r \<Longrightarrow> \<exists>no. \<forall>n\<ge>no. dist (X n) L < r) \<Longrightarrow> X ----> L" |
138 by (simp add: LIMSEQ_def) |
137 by (simp add: LIMSEQ_def) |
139 |
138 |
150 fixes L :: "'a::real_normed_vector" |
149 fixes L :: "'a::real_normed_vector" |
151 shows "\<lbrakk>X ----> L; 0 < r\<rbrakk> \<Longrightarrow> \<exists>no. \<forall>n\<ge>no. norm (X n - L) < r" |
150 shows "\<lbrakk>X ----> L; 0 < r\<rbrakk> \<Longrightarrow> \<exists>no. \<forall>n\<ge>no. norm (X n - L) < r" |
152 by (simp add: LIMSEQ_iff) |
151 by (simp add: LIMSEQ_iff) |
153 |
152 |
154 lemma LIMSEQ_const: "(\<lambda>n. k) ----> k" |
153 lemma LIMSEQ_const: "(\<lambda>n. k) ----> k" |
155 by (simp add: LIMSEQ_def) |
154 by (rule tendsto_const) |
156 |
155 |
157 lemma LIMSEQ_const_iff: "(\<lambda>n. k) ----> l \<longleftrightarrow> k = l" |
156 lemma LIMSEQ_const_iff: "(\<lambda>n. k) ----> l \<longleftrightarrow> k = l" |
158 apply (safe intro!: LIMSEQ_const) |
157 apply (safe intro!: LIMSEQ_const) |
159 apply (rule ccontr) |
158 apply (rule ccontr) |
160 apply (drule_tac r="dist k l" in metric_LIMSEQ_D) |
159 apply (drule_tac r="dist k l" in metric_LIMSEQ_D) |
163 done |
162 done |
164 |
163 |
165 lemma LIMSEQ_norm: |
164 lemma LIMSEQ_norm: |
166 fixes a :: "'a::real_normed_vector" |
165 fixes a :: "'a::real_normed_vector" |
167 shows "X ----> a \<Longrightarrow> (\<lambda>n. norm (X n)) ----> norm a" |
166 shows "X ----> a \<Longrightarrow> (\<lambda>n. norm (X n)) ----> norm a" |
168 unfolding LIMSEQ_conv_tendsto by (rule tendsto_norm) |
167 by (rule tendsto_norm) |
169 |
168 |
170 lemma LIMSEQ_ignore_initial_segment: |
169 lemma LIMSEQ_ignore_initial_segment: |
171 "f ----> a \<Longrightarrow> (\<lambda>n. f (n + k)) ----> a" |
170 "f ----> a \<Longrightarrow> (\<lambda>n. f (n + k)) ----> a" |
172 apply (rule metric_LIMSEQ_I) |
171 apply (rule metric_LIMSEQ_I) |
173 apply (drule (1) metric_LIMSEQ_D) |
172 apply (drule (1) metric_LIMSEQ_D) |
201 by (metis div_le_dividend div_mult_self1_is_m le_trans nat_mult_commute) |
200 by (metis div_le_dividend div_mult_self1_is_m le_trans nat_mult_commute) |
202 |
201 |
203 lemma LIMSEQ_add: |
202 lemma LIMSEQ_add: |
204 fixes a b :: "'a::real_normed_vector" |
203 fixes a b :: "'a::real_normed_vector" |
205 shows "\<lbrakk>X ----> a; Y ----> b\<rbrakk> \<Longrightarrow> (\<lambda>n. X n + Y n) ----> a + b" |
204 shows "\<lbrakk>X ----> a; Y ----> b\<rbrakk> \<Longrightarrow> (\<lambda>n. X n + Y n) ----> a + b" |
206 unfolding LIMSEQ_conv_tendsto by (rule tendsto_add) |
205 by (rule tendsto_add) |
207 |
206 |
208 lemma LIMSEQ_minus: |
207 lemma LIMSEQ_minus: |
209 fixes a :: "'a::real_normed_vector" |
208 fixes a :: "'a::real_normed_vector" |
210 shows "X ----> a \<Longrightarrow> (\<lambda>n. - X n) ----> - a" |
209 shows "X ----> a \<Longrightarrow> (\<lambda>n. - X n) ----> - a" |
211 unfolding LIMSEQ_conv_tendsto by (rule tendsto_minus) |
210 by (rule tendsto_minus) |
212 |
211 |
213 lemma LIMSEQ_minus_cancel: |
212 lemma LIMSEQ_minus_cancel: |
214 fixes a :: "'a::real_normed_vector" |
213 fixes a :: "'a::real_normed_vector" |
215 shows "(\<lambda>n. - X n) ----> - a \<Longrightarrow> X ----> a" |
214 shows "(\<lambda>n. - X n) ----> - a \<Longrightarrow> X ----> a" |
216 by (drule LIMSEQ_minus, simp) |
215 by (rule tendsto_minus_cancel) |
217 |
216 |
218 lemma LIMSEQ_diff: |
217 lemma LIMSEQ_diff: |
219 fixes a b :: "'a::real_normed_vector" |
218 fixes a b :: "'a::real_normed_vector" |
220 shows "\<lbrakk>X ----> a; Y ----> b\<rbrakk> \<Longrightarrow> (\<lambda>n. X n - Y n) ----> a - b" |
219 shows "\<lbrakk>X ----> a; Y ----> b\<rbrakk> \<Longrightarrow> (\<lambda>n. X n - Y n) ----> a - b" |
221 unfolding LIMSEQ_conv_tendsto by (rule tendsto_diff) |
220 by (rule tendsto_diff) |
222 |
221 |
223 lemma LIMSEQ_unique: "\<lbrakk>X ----> a; X ----> b\<rbrakk> \<Longrightarrow> a = b" |
222 lemma LIMSEQ_unique: "\<lbrakk>X ----> a; X ----> b\<rbrakk> \<Longrightarrow> a = b" |
224 apply (rule ccontr) |
223 apply (rule ccontr) |
225 apply (drule_tac r="dist a b / 2" in metric_LIMSEQ_D, simp add: zero_less_dist_iff) |
224 apply (drule_tac r="dist a b / 2" in metric_LIMSEQ_D, simp add: zero_less_dist_iff) |
226 apply (drule_tac r="dist a b / 2" in metric_LIMSEQ_D, simp add: zero_less_dist_iff) |
225 apply (drule_tac r="dist a b / 2" in metric_LIMSEQ_D, simp add: zero_less_dist_iff) |
231 apply (subst dist_commute, rule dist_triangle) |
230 apply (subst dist_commute, rule dist_triangle) |
232 done |
231 done |
233 |
232 |
234 lemma (in bounded_linear) LIMSEQ: |
233 lemma (in bounded_linear) LIMSEQ: |
235 "X ----> a \<Longrightarrow> (\<lambda>n. f (X n)) ----> f a" |
234 "X ----> a \<Longrightarrow> (\<lambda>n. f (X n)) ----> f a" |
236 unfolding LIMSEQ_conv_tendsto by (rule tendsto) |
235 by (rule tendsto) |
237 |
236 |
238 lemma (in bounded_bilinear) LIMSEQ: |
237 lemma (in bounded_bilinear) LIMSEQ: |
239 "\<lbrakk>X ----> a; Y ----> b\<rbrakk> \<Longrightarrow> (\<lambda>n. X n ** Y n) ----> a ** b" |
238 "\<lbrakk>X ----> a; Y ----> b\<rbrakk> \<Longrightarrow> (\<lambda>n. X n ** Y n) ----> a ** b" |
240 unfolding LIMSEQ_conv_tendsto by (rule tendsto) |
239 by (rule tendsto) |
241 |
240 |
242 lemma LIMSEQ_mult: |
241 lemma LIMSEQ_mult: |
243 fixes a b :: "'a::real_normed_algebra" |
242 fixes a b :: "'a::real_normed_algebra" |
244 shows "[| X ----> a; Y ----> b |] ==> (%n. X n * Y n) ----> a * b" |
243 shows "[| X ----> a; Y ----> b |] ==> (%n. X n * Y n) ----> a * b" |
245 by (rule mult.LIMSEQ) |
244 by (rule mult.tendsto) |
246 |
245 |
247 lemma increasing_LIMSEQ: |
246 lemma increasing_LIMSEQ: |
248 fixes f :: "nat \<Rightarrow> real" |
247 fixes f :: "nat \<Rightarrow> real" |
249 assumes inc: "!!n. f n \<le> f (Suc n)" |
248 assumes inc: "!!n. f n \<le> f (Suc n)" |
250 and bdd: "!!n. f n \<le> l" |
249 and bdd: "!!n. f n \<le> l" |
285 done |
284 done |
286 |
285 |
287 lemma Bseq_inverse: |
286 lemma Bseq_inverse: |
288 fixes a :: "'a::real_normed_div_algebra" |
287 fixes a :: "'a::real_normed_div_algebra" |
289 shows "\<lbrakk>X ----> a; a \<noteq> 0\<rbrakk> \<Longrightarrow> Bseq (\<lambda>n. inverse (X n))" |
288 shows "\<lbrakk>X ----> a; a \<noteq> 0\<rbrakk> \<Longrightarrow> Bseq (\<lambda>n. inverse (X n))" |
290 unfolding LIMSEQ_conv_tendsto Bseq_conv_Bfun |
289 unfolding Bseq_conv_Bfun by (rule Bfun_inverse) |
291 by (rule Bfun_inverse) |
|
292 |
290 |
293 lemma LIMSEQ_inverse: |
291 lemma LIMSEQ_inverse: |
294 fixes a :: "'a::real_normed_div_algebra" |
292 fixes a :: "'a::real_normed_div_algebra" |
295 shows "\<lbrakk>X ----> a; a \<noteq> 0\<rbrakk> \<Longrightarrow> (\<lambda>n. inverse (X n)) ----> inverse a" |
293 shows "\<lbrakk>X ----> a; a \<noteq> 0\<rbrakk> \<Longrightarrow> (\<lambda>n. inverse (X n)) ----> inverse a" |
296 unfolding LIMSEQ_conv_tendsto |
|
297 by (rule tendsto_inverse) |
294 by (rule tendsto_inverse) |
298 |
295 |
299 lemma LIMSEQ_divide: |
296 lemma LIMSEQ_divide: |
300 fixes a b :: "'a::real_normed_field" |
297 fixes a b :: "'a::real_normed_field" |
301 shows "\<lbrakk>X ----> a; Y ----> b; b \<noteq> 0\<rbrakk> \<Longrightarrow> (\<lambda>n. X n / Y n) ----> a / b" |
298 shows "\<lbrakk>X ----> a; Y ----> b; b \<noteq> 0\<rbrakk> \<Longrightarrow> (\<lambda>n. X n / Y n) ----> a / b" |
302 by (simp add: LIMSEQ_mult LIMSEQ_inverse divide_inverse) |
299 by (rule tendsto_divide) |
303 |
300 |
304 lemma LIMSEQ_pow: |
301 lemma LIMSEQ_pow: |
305 fixes a :: "'a::{power, real_normed_algebra}" |
302 fixes a :: "'a::{power, real_normed_algebra}" |
306 shows "X ----> a \<Longrightarrow> (\<lambda>n. (X n) ^ m) ----> a ^ m" |
303 shows "X ----> a \<Longrightarrow> (\<lambda>n. (X n) ^ m) ----> a ^ m" |
307 by (induct m) (simp_all add: LIMSEQ_const LIMSEQ_mult) |
304 by (induct m) (simp_all add: LIMSEQ_const LIMSEQ_mult) |
308 |
305 |
309 lemma LIMSEQ_setsum: |
306 lemma LIMSEQ_setsum: |
310 fixes L :: "'a \<Rightarrow> 'b::real_normed_vector" |
307 fixes L :: "'a \<Rightarrow> 'b::real_normed_vector" |
311 assumes n: "\<And>n. n \<in> S \<Longrightarrow> X n ----> L n" |
308 assumes n: "\<And>n. n \<in> S \<Longrightarrow> X n ----> L n" |
312 shows "(\<lambda>m. \<Sum>n\<in>S. X n m) ----> (\<Sum>n\<in>S. L n)" |
309 shows "(\<lambda>m. \<Sum>n\<in>S. X n m) ----> (\<Sum>n\<in>S. L n)" |
313 using n unfolding LIMSEQ_conv_tendsto by (rule tendsto_setsum) |
310 using assms by (rule tendsto_setsum) |
314 |
311 |
315 lemma LIMSEQ_setprod: |
312 lemma LIMSEQ_setprod: |
316 fixes L :: "'a \<Rightarrow> 'b::{real_normed_algebra,comm_ring_1}" |
313 fixes L :: "'a \<Rightarrow> 'b::{real_normed_algebra,comm_ring_1}" |
317 assumes n: "\<And>n. n \<in> S \<Longrightarrow> X n ----> L n" |
314 assumes n: "\<And>n. n \<in> S \<Longrightarrow> X n ----> L n" |
318 shows "(\<lambda>m. \<Prod>n\<in>S. X n m) ----> (\<Prod>n\<in>S. L n)" |
315 shows "(\<lambda>m. \<Prod>n\<in>S. X n m) ----> (\<Prod>n\<in>S. L n)" |
332 case False |
329 case False |
333 thus ?thesis |
330 thus ?thesis |
334 by (simp add: setprod_def LIMSEQ_const) |
331 by (simp add: setprod_def LIMSEQ_const) |
335 qed |
332 qed |
336 |
333 |
337 lemma LIMSEQ_add_const: |
334 lemma LIMSEQ_add_const: (* FIXME: delete *) |
338 fixes a :: "'a::real_normed_vector" |
335 fixes a :: "'a::real_normed_vector" |
339 shows "f ----> a ==> (%n.(f n + b)) ----> a + b" |
336 shows "f ----> a ==> (%n.(f n + b)) ----> a + b" |
340 by (simp add: LIMSEQ_add LIMSEQ_const) |
337 by (intro tendsto_intros) |
341 |
338 |
342 (* FIXME: delete *) |
339 (* FIXME: delete *) |
343 lemma LIMSEQ_add_minus: |
340 lemma LIMSEQ_add_minus: |
344 fixes a b :: "'a::real_normed_vector" |
341 fixes a b :: "'a::real_normed_vector" |
345 shows "[| X ----> a; Y ----> b |] ==> (%n. X n + -Y n) ----> a + -b" |
342 shows "[| X ----> a; Y ----> b |] ==> (%n. X n + -Y n) ----> a + -b" |
346 by (simp only: LIMSEQ_add LIMSEQ_minus) |
343 by (intro tendsto_intros) |
347 |
344 |
348 lemma LIMSEQ_diff_const: |
345 lemma LIMSEQ_diff_const: (* FIXME: delete *) |
349 fixes a b :: "'a::real_normed_vector" |
346 fixes a b :: "'a::real_normed_vector" |
350 shows "f ----> a ==> (%n.(f n - b)) ----> a - b" |
347 shows "f ----> a ==> (%n.(f n - b)) ----> a - b" |
351 by (simp add: LIMSEQ_diff LIMSEQ_const) |
348 by (intro tendsto_intros) |
352 |
349 |
353 lemma LIMSEQ_diff_approach_zero: |
350 lemma LIMSEQ_diff_approach_zero: |
354 fixes L :: "'a::real_normed_vector" |
351 fixes L :: "'a::real_normed_vector" |
355 shows "g ----> L ==> (%x. f x - g x) ----> 0 ==> f ----> L" |
352 shows "g ----> L ==> (%x. f x - g x) ----> 0 ==> f ----> L" |
356 by (drule (1) LIMSEQ_add, simp) |
353 by (drule (1) LIMSEQ_add, simp) |