src/HOL/NSA/HSeries.thy
changeset 61609 77b453bd616f
parent 58878 f962e42e324d
child 61945 1135b8de26c3
equal deleted inserted replaced
61553:933eb9e6a1cc 61609:77b453bd616f
     1 (*  Title       : HSeries.thy
     1 (*  Title       : HSeries.thy
     2     Author      : Jacques D. Fleuriot
     2     Author      : Jacques D. Fleuriot
     3     Copyright   : 1998  University of Cambridge
     3     Copyright   : 1998  University of Cambridge
     4 
     4 
     5 Converted to Isar and polished by lcp    
     5 Converted to Isar and polished by lcp
     6 *) 
     6 *)
     7 
     7 
     8 section{*Finite Summation and Infinite Series for Hyperreals*}
     8 section{*Finite Summation and Infinite Series for Hyperreals*}
     9 
     9 
    10 theory HSeries
    10 theory HSeries
    11 imports HSEQ
    11 imports HSEQ
    12 begin
    12 begin
    13 
    13 
    14 definition
    14 definition
    15   sumhr :: "(hypnat * hypnat * (nat=>real)) => hypreal" where
    15   sumhr :: "(hypnat * hypnat * (nat=>real)) => hypreal" where
    16   "sumhr = 
    16   "sumhr =
    17       (%(M,N,f). starfun2 (%m n. setsum f {m..<n}) M N)"
    17       (%(M,N,f). starfun2 (%m n. setsum f {m..<n}) M N)"
    18 
    18 
    19 definition
    19 definition
    20   NSsums  :: "[nat=>real,real] => bool"     (infixr "NSsums" 80) where
    20   NSsums  :: "[nat=>real,real] => bool"     (infixr "NSsums" 80) where
    21   "f NSsums s = (%n. setsum f {..<n}) ----NS> s"
    21   "f NSsums s = (%n. setsum f {..<n}) ----NS> s"
    34 text{*Base case in definition of @{term sumr}*}
    34 text{*Base case in definition of @{term sumr}*}
    35 lemma sumhr_zero [simp]: "!!m. sumhr (m,0,f) = 0"
    35 lemma sumhr_zero [simp]: "!!m. sumhr (m,0,f) = 0"
    36 unfolding sumhr_app by transfer simp
    36 unfolding sumhr_app by transfer simp
    37 
    37 
    38 text{*Recursive case in definition of @{term sumr}*}
    38 text{*Recursive case in definition of @{term sumr}*}
    39 lemma sumhr_if: 
    39 lemma sumhr_if:
    40      "!!m n. sumhr(m,n+1,f) = 
    40      "!!m n. sumhr(m,n+1,f) =
    41       (if n + 1 \<le> m then 0 else sumhr(m,n,f) + ( *f* f) n)"
    41       (if n + 1 \<le> m then 0 else sumhr(m,n,f) + ( *f* f) n)"
    42 unfolding sumhr_app by transfer simp
    42 unfolding sumhr_app by transfer simp
    43 
    43 
    44 lemma sumhr_Suc_zero [simp]: "!!n. sumhr (n + 1, n, f) = 0"
    44 lemma sumhr_Suc_zero [simp]: "!!n. sumhr (n + 1, n, f) = 0"
    45 unfolding sumhr_app by transfer simp
    45 unfolding sumhr_app by transfer simp
    71 lemma sumhr_hrabs: "!!m n. abs(sumhr(m,n,f)) \<le> sumhr(m,n,%i. abs(f i))"
    71 lemma sumhr_hrabs: "!!m n. abs(sumhr(m,n,f)) \<le> sumhr(m,n,%i. abs(f i))"
    72 unfolding sumhr_app by transfer (rule setsum_abs)
    72 unfolding sumhr_app by transfer (rule setsum_abs)
    73 
    73 
    74 text{* other general version also needed *}
    74 text{* other general version also needed *}
    75 lemma sumhr_fun_hypnat_eq:
    75 lemma sumhr_fun_hypnat_eq:
    76    "(\<forall>r. m \<le> r & r < n --> f r = g r) -->  
    76    "(\<forall>r. m \<le> r & r < n --> f r = g r) -->
    77       sumhr(hypnat_of_nat m, hypnat_of_nat n, f) =  
    77       sumhr(hypnat_of_nat m, hypnat_of_nat n, f) =
    78       sumhr(hypnat_of_nat m, hypnat_of_nat n, g)"
    78       sumhr(hypnat_of_nat m, hypnat_of_nat n, g)"
    79 unfolding sumhr_app by transfer simp
    79 unfolding sumhr_app by transfer simp
    80 
    80 
    81 lemma sumhr_const:
    81 lemma sumhr_const:
    82      "!!n. sumhr(0, n, %i. r) = hypreal_of_hypnat n * hypreal_of_real r"
    82      "!!n. sumhr(0, n, %i. r) = hypreal_of_hypnat n * hypreal_of_real r"
    83 unfolding sumhr_app by transfer (simp add: real_of_nat_def)
    83 unfolding sumhr_app by transfer simp
    84 
    84 
    85 lemma sumhr_less_bounds_zero [simp]: "!!m n. n < m ==> sumhr(m,n,f) = 0"
    85 lemma sumhr_less_bounds_zero [simp]: "!!m n. n < m ==> sumhr(m,n,f) = 0"
    86 unfolding sumhr_app by transfer simp
    86 unfolding sumhr_app by transfer simp
    87 
    87 
    88 lemma sumhr_minus: "!!m n. sumhr(m, n, %i. - f i) = - sumhr(m, n, f)"
    88 lemma sumhr_minus: "!!m n. sumhr(m, n, %i. - f i) = - sumhr(m, n, f)"
    96 
    96 
    97 subsection{*Nonstandard Sums*}
    97 subsection{*Nonstandard Sums*}
    98 
    98 
    99 text{*Infinite sums are obtained by summing to some infinite hypernatural
    99 text{*Infinite sums are obtained by summing to some infinite hypernatural
   100  (such as @{term whn})*}
   100  (such as @{term whn})*}
   101 lemma sumhr_hypreal_of_hypnat_omega: 
   101 lemma sumhr_hypreal_of_hypnat_omega:
   102       "sumhr(0,whn,%i. 1) = hypreal_of_hypnat whn"
   102       "sumhr(0,whn,%i. 1) = hypreal_of_hypnat whn"
   103 by (simp add: sumhr_const)
   103 by (simp add: sumhr_const)
   104 
   104 
   105 lemma sumhr_hypreal_omega_minus_one: "sumhr(0, whn, %i. 1) = omega - 1"
   105 lemma sumhr_hypreal_omega_minus_one: "sumhr(0, whn, %i. 1) = omega - 1"
   106 apply (simp add: sumhr_const)
   106 apply (simp add: sumhr_const)
   107 (* FIXME: need lemma: hypreal_of_hypnat whn = omega - 1 *)
   107 (* FIXME: need lemma: hypreal_of_hypnat whn = omega - 1 *)
   108 (* maybe define omega = hypreal_of_hypnat whn + 1 *)
   108 (* maybe define omega = hypreal_of_hypnat whn + 1 *)
   109 apply (unfold star_class_defs omega_def hypnat_omega_def
   109 apply (unfold star_class_defs omega_def hypnat_omega_def
   110               of_hypnat_def star_of_def)
   110               of_hypnat_def star_of_def)
   111 apply (simp add: starfun_star_n starfun2_star_n real_of_nat_def)
   111 apply (simp add: starfun_star_n starfun2_star_n)
   112 done
   112 done
   113 
   113 
   114 lemma sumhr_minus_one_realpow_zero [simp]: 
   114 lemma sumhr_minus_one_realpow_zero [simp]:
   115      "!!N. sumhr(0, N + N, %i. (-1) ^ (i+1)) = 0"
   115      "!!N. sumhr(0, N + N, %i. (-1) ^ (i+1)) = 0"
   116 unfolding sumhr_app
   116 unfolding sumhr_app
   117 apply transfer 
   117 apply transfer
   118 apply (simp del: power_Suc add: mult_2 [symmetric])
   118 apply (simp del: power_Suc add: mult_2 [symmetric])
   119 apply (induct_tac N)
   119 apply (induct_tac N)
   120 apply simp_all
   120 apply simp_all
   121 done
   121 done
   122 
   122 
   123 lemma sumhr_interval_const:
   123 lemma sumhr_interval_const:
   124      "(\<forall>n. m \<le> Suc n --> f n = r) & m \<le> na  
   124      "(\<forall>n. m \<le> Suc n --> f n = r) & m \<le> na
   125       ==> sumhr(hypnat_of_nat m,hypnat_of_nat na,f) =  
   125       ==> sumhr(hypnat_of_nat m,hypnat_of_nat na,f) =
   126           (hypreal_of_nat (na - m) * hypreal_of_real r)"
   126           (hypreal_of_nat (na - m) * hypreal_of_real r)"
   127 unfolding sumhr_app by transfer simp
   127 unfolding sumhr_app by transfer simp
   128 
   128 
   129 lemma starfunNat_sumr: "!!N. ( *f* (%n. setsum f {0..<n})) N = sumhr(0,N,f)"
   129 lemma starfunNat_sumr: "!!N. ( *f* (%n. setsum f {0..<n})) N = sumhr(0,N,f)"
   130 unfolding sumhr_app by transfer (rule refl)
   130 unfolding sumhr_app by transfer (rule refl)
   131 
   131 
   132 lemma sumhr_hrabs_approx [simp]: "sumhr(0, M, f) @= sumhr(0, N, f)  
   132 lemma sumhr_hrabs_approx [simp]: "sumhr(0, M, f) @= sumhr(0, N, f)
   133       ==> abs (sumhr(M, N, f)) @= 0"
   133       ==> abs (sumhr(M, N, f)) @= 0"
   134 apply (cut_tac x = M and y = N in linorder_less_linear)
   134 apply (cut_tac x = M and y = N in linorder_less_linear)
   135 apply (auto simp add: approx_refl)
   135 apply (auto simp add: approx_refl)
   136 apply (drule approx_sym [THEN approx_minus_iff [THEN iffD1]])
   136 apply (drule approx_sym [THEN approx_minus_iff [THEN iffD1]])
   137 apply (auto dest: approx_hrabs 
   137 apply (auto dest: approx_hrabs
   138             simp add: sumhr_split_diff)
   138             simp add: sumhr_split_diff)
   139 done
   139 done
   140 
   140 
   141 (*----------------------------------------------------------------
   141 (*----------------------------------------------------------------
   142       infinite sums: Standard and NS theorems
   142       infinite sums: Standard and NS theorems
   164 lemma NSseries_zero:
   164 lemma NSseries_zero:
   165   "\<forall>m. n \<le> Suc m --> f(m) = 0 ==> f NSsums (setsum f {..<n})"
   165   "\<forall>m. n \<le> Suc m --> f(m) = 0 ==> f NSsums (setsum f {..<n})"
   166 by (auto simp add: sums_NSsums_iff [symmetric] not_le[symmetric] intro!: sums_finite)
   166 by (auto simp add: sums_NSsums_iff [symmetric] not_le[symmetric] intro!: sums_finite)
   167 
   167 
   168 lemma NSsummable_NSCauchy:
   168 lemma NSsummable_NSCauchy:
   169      "NSsummable f =  
   169      "NSsummable f =
   170       (\<forall>M \<in> HNatInfinite. \<forall>N \<in> HNatInfinite. abs (sumhr(M,N,f)) @= 0)"
   170       (\<forall>M \<in> HNatInfinite. \<forall>N \<in> HNatInfinite. abs (sumhr(M,N,f)) @= 0)"
   171 apply (auto simp add: summable_NSsummable_iff [symmetric]
   171 apply (auto simp add: summable_NSsummable_iff [symmetric]
   172        summable_iff_convergent convergent_NSconvergent_iff atLeast0LessThan[symmetric]
   172        summable_iff_convergent convergent_NSconvergent_iff atLeast0LessThan[symmetric]
   173        NSCauchy_NSconvergent_iff [symmetric] NSCauchy_def starfunNat_sumr)
   173        NSCauchy_NSconvergent_iff [symmetric] NSCauchy_def starfunNat_sumr)
   174 apply (cut_tac x = M and y = N in linorder_less_linear)
   174 apply (cut_tac x = M and y = N in linorder_less_linear)
   175 apply auto
   175 apply auto
   176 apply (rule approx_minus_iff [THEN iffD2, THEN approx_sym])
   176 apply (rule approx_minus_iff [THEN iffD2, THEN approx_sym])
   177 apply (rule_tac [2] approx_minus_iff [THEN iffD2])
   177 apply (rule_tac [2] approx_minus_iff [THEN iffD2])
   178 apply (auto dest: approx_hrabs_zero_cancel 
   178 apply (auto dest: approx_hrabs_zero_cancel
   179             simp add: sumhr_split_diff atLeast0LessThan[symmetric])
   179             simp add: sumhr_split_diff atLeast0LessThan[symmetric])
   180 done
   180 done
   181 
   181 
   182 text{*Terms of a convergent series tend to zero*}
   182 text{*Terms of a convergent series tend to zero*}
   183 lemma NSsummable_NSLIMSEQ_zero: "NSsummable f ==> f ----NS> 0"
   183 lemma NSsummable_NSLIMSEQ_zero: "NSsummable f ==> f ----NS> 0"