src/HOL/SEQ.thy
changeset 36660 1cc4ab4b7ff7
parent 36657 f376af79f6b7
child 36662 621122eeb138
equal deleted inserted replaced
36659:f794e92784aa 36660:1cc4ab4b7ff7
    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)