src/HOL/SEQ.thy
changeset 31355 3d18766ddc4b
parent 31353 14a58e2ca374
child 31392 69570155ddf8
equal deleted inserted replaced
31354:2ad53771c30f 31355:3d18766ddc4b
   130 apply (rule_tac N="k" and K="K" in BseqI2')
   130 apply (rule_tac N="k" and K="K" in BseqI2')
   131 apply clarify
   131 apply clarify
   132 apply (drule_tac x="n - k" in spec, simp)
   132 apply (drule_tac x="n - k" in spec, simp)
   133 done
   133 done
   134 
   134 
       
   135 lemma Bseq_conv_Bfun: "Bseq X \<longleftrightarrow> Bfun X sequentially"
       
   136 unfolding Bfun_def eventually_sequentially
       
   137 apply (rule iffI)
       
   138 apply (simp add: Bseq_def, fast)
       
   139 apply (fast intro: BseqI2')
       
   140 done
       
   141 
   135 
   142 
   136 subsection {* Sequences That Converge to Zero *}
   143 subsection {* Sequences That Converge to Zero *}
   137 
   144 
   138 lemma ZseqI:
   145 lemma ZseqI:
   139   "(\<And>r. 0 < r \<Longrightarrow> \<exists>no. \<forall>n\<ge>no. norm (X n) < r) \<Longrightarrow> Zseq X"
   146   "(\<And>r. 0 < r \<Longrightarrow> \<exists>no. \<forall>n\<ge>no. norm (X n) < r) \<Longrightarrow> Zseq X"
   154 
   161 
   155 lemma Zseq_imp_Zseq:
   162 lemma Zseq_imp_Zseq:
   156   assumes X: "Zseq X"
   163   assumes X: "Zseq X"
   157   assumes Y: "\<And>n. norm (Y n) \<le> norm (X n) * K"
   164   assumes Y: "\<And>n. norm (Y n) \<le> norm (X n) * K"
   158   shows "Zseq (\<lambda>n. Y n)"
   165   shows "Zseq (\<lambda>n. Y n)"
   159 using assms unfolding Zseq_conv_Zfun by (rule Zfun_imp_Zfun)
   166 using X Y Zfun_imp_Zfun [of X sequentially Y K]
       
   167 unfolding Zseq_conv_Zfun by simp
   160 
   168 
   161 lemma Zseq_le: "\<lbrakk>Zseq Y; \<forall>n. norm (X n) \<le> norm (Y n)\<rbrakk> \<Longrightarrow> Zseq X"
   169 lemma Zseq_le: "\<lbrakk>Zseq Y; \<forall>n. norm (X n) \<le> norm (Y n)\<rbrakk> \<Longrightarrow> Zseq X"
   162 by (erule_tac K="1" in Zseq_imp_Zseq, simp)
   170 by (erule_tac K="1" in Zseq_imp_Zseq, simp)
   163 
   171 
   164 lemma Zseq_add:
   172 lemma Zseq_add:
   178 lemma (in bounded_bilinear) Zseq:
   186 lemma (in bounded_bilinear) Zseq:
   179   "Zseq X \<Longrightarrow> Zseq Y \<Longrightarrow> Zseq (\<lambda>n. X n ** Y n)"
   187   "Zseq X \<Longrightarrow> Zseq Y \<Longrightarrow> Zseq (\<lambda>n. X n ** Y n)"
   180 unfolding Zseq_conv_Zfun by (rule Zfun)
   188 unfolding Zseq_conv_Zfun by (rule Zfun)
   181 
   189 
   182 lemma (in bounded_bilinear) Zseq_prod_Bseq:
   190 lemma (in bounded_bilinear) Zseq_prod_Bseq:
   183   assumes X: "Zseq X"
   191   "Zseq X \<Longrightarrow> Bseq Y \<Longrightarrow> Zseq (\<lambda>n. X n ** Y n)"
   184   assumes Y: "Bseq Y"
   192 unfolding Zseq_conv_Zfun Bseq_conv_Bfun
   185   shows "Zseq (\<lambda>n. X n ** Y n)"
   193 by (rule Zfun_prod_Bfun)
   186 proof -
       
   187   obtain K where K: "0 \<le> K"
       
   188     and norm_le: "\<And>x y. norm (x ** y) \<le> norm x * norm y * K"
       
   189     using nonneg_bounded by fast
       
   190   obtain B where B: "0 < B"
       
   191     and norm_Y: "\<And>n. norm (Y n) \<le> B"
       
   192     using Y [unfolded Bseq_def] by fast
       
   193   from X show ?thesis
       
   194   proof (rule Zseq_imp_Zseq)
       
   195     fix n::nat
       
   196     have "norm (X n ** Y n) \<le> norm (X n) * norm (Y n) * K"
       
   197       by (rule norm_le)
       
   198     also have "\<dots> \<le> norm (X n) * B * K"
       
   199       by (intro mult_mono' order_refl norm_Y norm_ge_zero
       
   200                 mult_nonneg_nonneg K)
       
   201     also have "\<dots> = norm (X n) * (B * K)"
       
   202       by (rule mult_assoc)
       
   203     finally show "norm (X n ** Y n) \<le> norm (X n) * (B * K)" .
       
   204   qed
       
   205 qed
       
   206 
   194 
   207 lemma (in bounded_bilinear) Bseq_prod_Zseq:
   195 lemma (in bounded_bilinear) Bseq_prod_Zseq:
   208   assumes X: "Bseq X"
   196   "Bseq X \<Longrightarrow> Zseq Y \<Longrightarrow> Zseq (\<lambda>n. X n ** Y n)"
   209   assumes Y: "Zseq Y"
   197 unfolding Zseq_conv_Zfun Bseq_conv_Bfun
   210   shows "Zseq (\<lambda>n. X n ** Y n)"
   198 by (rule Bfun_prod_Zfun)
   211 proof -
       
   212   obtain K where K: "0 \<le> K"
       
   213     and norm_le: "\<And>x y. norm (x ** y) \<le> norm x * norm y * K"
       
   214     using nonneg_bounded by fast
       
   215   obtain B where B: "0 < B"
       
   216     and norm_X: "\<And>n. norm (X n) \<le> B"
       
   217     using X [unfolded Bseq_def] by fast
       
   218   from Y show ?thesis
       
   219   proof (rule Zseq_imp_Zseq)
       
   220     fix n::nat
       
   221     have "norm (X n ** Y n) \<le> norm (X n) * norm (Y n) * K"
       
   222       by (rule norm_le)
       
   223     also have "\<dots> \<le> B * norm (Y n) * K"
       
   224       by (intro mult_mono' order_refl norm_X norm_ge_zero
       
   225                 mult_nonneg_nonneg K)
       
   226     also have "\<dots> = norm (Y n) * (B * K)"
       
   227       by (simp only: mult_ac)
       
   228     finally show "norm (X n ** Y n) \<le> norm (Y n) * (B * K)" .
       
   229   qed
       
   230 qed
       
   231 
   199 
   232 lemma (in bounded_bilinear) Zseq_left:
   200 lemma (in bounded_bilinear) Zseq_left:
   233   "Zseq X \<Longrightarrow> Zseq (\<lambda>n. X n ** a)"
   201   "Zseq X \<Longrightarrow> Zseq (\<lambda>n. X n ** a)"
   234 by (rule bounded_linear_left [THEN bounded_linear.Zseq])
   202 by (rule bounded_linear_left [THEN bounded_linear.Zseq])
   235 
   203 
   361 lemma LIMSEQ_mult:
   329 lemma LIMSEQ_mult:
   362   fixes a b :: "'a::real_normed_algebra"
   330   fixes a b :: "'a::real_normed_algebra"
   363   shows "[| X ----> a; Y ----> b |] ==> (%n. X n * Y n) ----> a * b"
   331   shows "[| X ----> a; Y ----> b |] ==> (%n. X n * Y n) ----> a * b"
   364 by (rule mult.LIMSEQ)
   332 by (rule mult.LIMSEQ)
   365 
   333 
   366 lemma inverse_diff_inverse:
       
   367   "\<lbrakk>(a::'a::division_ring) \<noteq> 0; b \<noteq> 0\<rbrakk>
       
   368    \<Longrightarrow> inverse a - inverse b = - (inverse a * (a - b) * inverse b)"
       
   369 by (simp add: algebra_simps)
       
   370 
       
   371 lemma Bseq_inverse_lemma:
   334 lemma Bseq_inverse_lemma:
   372   fixes x :: "'a::real_normed_div_algebra"
   335   fixes x :: "'a::real_normed_div_algebra"
   373   shows "\<lbrakk>r \<le> norm x; 0 < r\<rbrakk> \<Longrightarrow> norm (inverse x) \<le> inverse r"
   336   shows "\<lbrakk>r \<le> norm x; 0 < r\<rbrakk> \<Longrightarrow> norm (inverse x) \<le> inverse r"
   374 apply (subst nonzero_norm_inverse, clarsimp)
   337 apply (subst nonzero_norm_inverse, clarsimp)
   375 apply (erule (1) le_imp_inverse_le)
   338 apply (erule (1) le_imp_inverse_le)
   376 done
   339 done
   377 
   340 
   378 lemma Bseq_inverse:
   341 lemma Bseq_inverse:
   379   fixes a :: "'a::real_normed_div_algebra"
   342   fixes a :: "'a::real_normed_div_algebra"
   380   assumes X: "X ----> a"
   343   shows "\<lbrakk>X ----> a; a \<noteq> 0\<rbrakk> \<Longrightarrow> Bseq (\<lambda>n. inverse (X n))"
   381   assumes a: "a \<noteq> 0"
   344 unfolding LIMSEQ_conv_tendsto Bseq_conv_Bfun
   382   shows "Bseq (\<lambda>n. inverse (X n))"
   345 by (rule Bfun_inverse)
   383 proof -
       
   384   from a have "0 < norm a" by simp
       
   385   hence "\<exists>r>0. r < norm a" by (rule dense)
       
   386   then obtain r where r1: "0 < r" and r2: "r < norm a" by fast
       
   387   obtain N where N: "\<And>n. N \<le> n \<Longrightarrow> norm (X n - a) < r"
       
   388     using LIMSEQ_D [OF X r1] by fast
       
   389   show ?thesis
       
   390   proof (rule BseqI2' [rule_format])
       
   391     fix n assume n: "N \<le> n"
       
   392     hence 1: "norm (X n - a) < r" by (rule N)
       
   393     hence 2: "X n \<noteq> 0" using r2 by auto
       
   394     hence "norm (inverse (X n)) = inverse (norm (X n))"
       
   395       by (rule nonzero_norm_inverse)
       
   396     also have "\<dots> \<le> inverse (norm a - r)"
       
   397     proof (rule le_imp_inverse_le)
       
   398       show "0 < norm a - r" using r2 by simp
       
   399     next
       
   400       have "norm a - norm (X n) \<le> norm (a - X n)"
       
   401         by (rule norm_triangle_ineq2)
       
   402       also have "\<dots> = norm (X n - a)"
       
   403         by (rule norm_minus_commute)
       
   404       also have "\<dots> < r" using 1 .
       
   405       finally show "norm a - r \<le> norm (X n)" by simp
       
   406     qed
       
   407     finally show "norm (inverse (X n)) \<le> inverse (norm a - r)" .
       
   408   qed
       
   409 qed
       
   410 
       
   411 lemma LIMSEQ_inverse_lemma:
       
   412   fixes a :: "'a::real_normed_div_algebra"
       
   413   shows "\<lbrakk>X ----> a; a \<noteq> 0; \<forall>n. X n \<noteq> 0\<rbrakk>
       
   414          \<Longrightarrow> (\<lambda>n. inverse (X n)) ----> inverse a"
       
   415 apply (subst LIMSEQ_Zseq_iff)
       
   416 apply (simp add: inverse_diff_inverse nonzero_imp_inverse_nonzero)
       
   417 apply (rule Zseq_minus)
       
   418 apply (rule Zseq_mult_left)
       
   419 apply (rule mult.Bseq_prod_Zseq)
       
   420 apply (erule (1) Bseq_inverse)
       
   421 apply (simp add: LIMSEQ_Zseq_iff)
       
   422 done
       
   423 
   346 
   424 lemma LIMSEQ_inverse:
   347 lemma LIMSEQ_inverse:
   425   fixes a :: "'a::real_normed_div_algebra"
   348   fixes a :: "'a::real_normed_div_algebra"
   426   assumes X: "X ----> a"
   349   shows "\<lbrakk>X ----> a; a \<noteq> 0\<rbrakk> \<Longrightarrow> (\<lambda>n. inverse (X n)) ----> inverse a"
   427   assumes a: "a \<noteq> 0"
   350 unfolding LIMSEQ_conv_tendsto
   428   shows "(\<lambda>n. inverse (X n)) ----> inverse a"
   351 by (rule tendsto_inverse)
   429 proof -
       
   430   from a have "0 < norm a" by simp
       
   431   then obtain k where "\<forall>n\<ge>k. norm (X n - a) < norm a"
       
   432     using LIMSEQ_D [OF X] by fast
       
   433   hence "\<forall>n\<ge>k. X n \<noteq> 0" by auto
       
   434   hence k: "\<forall>n. X (n + k) \<noteq> 0" by simp
       
   435 
       
   436   from X have "(\<lambda>n. X (n + k)) ----> a"
       
   437     by (rule LIMSEQ_ignore_initial_segment)
       
   438   hence "(\<lambda>n. inverse (X (n + k))) ----> inverse a"
       
   439     using a k by (rule LIMSEQ_inverse_lemma)
       
   440   thus "(\<lambda>n. inverse (X n)) ----> inverse a"
       
   441     by (rule LIMSEQ_offset)
       
   442 qed
       
   443 
   352 
   444 lemma LIMSEQ_divide:
   353 lemma LIMSEQ_divide:
   445   fixes a b :: "'a::real_normed_field"
   354   fixes a b :: "'a::real_normed_field"
   446   shows "\<lbrakk>X ----> a; Y ----> b; b \<noteq> 0\<rbrakk> \<Longrightarrow> (\<lambda>n. X n / Y n) ----> a / b"
   355   shows "\<lbrakk>X ----> a; Y ----> b; b \<noteq> 0\<rbrakk> \<Longrightarrow> (\<lambda>n. X n / Y n) ----> a / b"
   447 by (simp add: LIMSEQ_mult LIMSEQ_inverse divide_inverse)
   356 by (simp add: LIMSEQ_mult LIMSEQ_inverse divide_inverse)