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" |