| author | wenzelm | 
| Tue, 08 Nov 2005 10:43:08 +0100 | |
| changeset 18117 | 61a430a67d7c | 
| parent 17149 | e2b19c92ef51 | 
| child 19106 | 6e6b5b1fdc06 | 
| permissions | -rw-r--r-- | 
| 10751 | 1 | (* Title : Series.thy | 
| 2 | Author : Jacques D. Fleuriot | |
| 3 | Copyright : 1998 University of Cambridge | |
| 14416 | 4 | |
| 5 | Converted to Isar and polished by lcp | |
| 15539 | 6 | Converted to setsum and polished yet more by TNN | 
| 16819 | 7 | Additional contributions by Jeremy Avigad | 
| 10751 | 8 | *) | 
| 9 | ||
| 14416 | 10 | header{*Finite Summation and Infinite Series*}
 | 
| 10751 | 11 | |
| 15131 | 12 | theory Series | 
| 15140 | 13 | imports SEQ Lim | 
| 15131 | 14 | begin | 
| 15561 | 15 | |
| 15539 | 16 | declare atLeastLessThan_iff[iff] | 
| 15561 | 17 | declare setsum_op_ivl_Suc[simp] | 
| 10751 | 18 | |
| 19 | constdefs | |
| 15543 | 20 | sums :: "(nat => real) => real => bool" (infixr "sums" 80) | 
| 15536 | 21 |    "f sums s  == (%n. setsum f {0..<n}) ----> s"
 | 
| 10751 | 22 | |
| 14416 | 23 | summable :: "(nat=>real) => bool" | 
| 24 | "summable f == (\<exists>s. f sums s)" | |
| 25 | ||
| 26 | suminf :: "(nat=>real) => real" | |
| 15539 | 27 | "suminf f == SOME s. f sums s" | 
| 14416 | 28 | |
| 15546 | 29 | syntax | 
| 30 |   "_suminf" :: "idt => real => real"    ("\<Sum>_. _" [0, 10] 10)
 | |
| 31 | translations | |
| 32 | "\<Sum>i. b" == "suminf (%i. b)" | |
| 33 | ||
| 14416 | 34 | |
| 15539 | 35 | lemma sumr_diff_mult_const: | 
| 36 |  "setsum f {0..<n} - (real n*r) = setsum (%i. f i - r) {0..<n::nat}"
 | |
| 15536 | 37 | by (simp add: diff_minus setsum_addf real_of_nat_def) | 
| 38 | ||
| 15542 | 39 | lemma real_setsum_nat_ivl_bounded: | 
| 40 | "(!!p. p < n \<Longrightarrow> f(p) \<le> K) | |
| 41 |       \<Longrightarrow> setsum f {0..<n::nat} \<le> real n * K"
 | |
| 42 | using setsum_bounded[where A = "{0..<n}"]
 | |
| 43 | by (auto simp:real_of_nat_def) | |
| 14416 | 44 | |
| 15539 | 45 | (* Generalize from real to some algebraic structure? *) | 
| 46 | lemma sumr_minus_one_realpow_zero [simp]: | |
| 15543 | 47 | "(\<Sum>i=0..<2*n. (-1) ^ Suc i) = (0::real)" | 
| 15251 | 48 | by (induct "n", auto) | 
| 14416 | 49 | |
| 15539 | 50 | (* FIXME this is an awful lemma! *) | 
| 51 | lemma sumr_one_lb_realpow_zero [simp]: | |
| 52 | "(\<Sum>n=Suc 0..<n. f(n) * (0::real) ^ n) = 0" | |
| 15251 | 53 | apply (induct "n") | 
| 14416 | 54 | apply (case_tac [2] "n", auto) | 
| 55 | done | |
| 56 | ||
| 15543 | 57 | lemma sumr_group: | 
| 15539 | 58 |      "(\<Sum>m=0..<n::nat. setsum f {m * k ..< m*k + k}) = setsum f {0 ..< n * k}"
 | 
| 15543 | 59 | apply (subgoal_tac "k = 0 | 0 < k", auto) | 
| 15251 | 60 | apply (induct "n") | 
| 15539 | 61 | apply (simp_all add: setsum_add_nat_ivl add_commute) | 
| 14416 | 62 | done | 
| 15539 | 63 | |
| 16819 | 64 | (* FIXME generalize? *) | 
| 65 | lemma sumr_offset: | |
| 66 |  "(\<Sum>m=0..<n::nat. f(m+k)::real) = setsum f {0..<n+k} - setsum f {0..<k}"
 | |
| 67 | by (induct "n", auto) | |
| 68 | ||
| 69 | lemma sumr_offset2: | |
| 70 |  "\<forall>f. (\<Sum>m=0..<n::nat. f(m+k)::real) = setsum f {0..<n+k} - setsum f {0..<k}"
 | |
| 71 | by (induct "n", auto) | |
| 72 | ||
| 73 | lemma sumr_offset3: | |
| 74 |   "setsum f {0::nat..<n+k} = (\<Sum>m=0..<n. f (m+k)::real) + setsum f {0..<k}"
 | |
| 75 | by (simp add: sumr_offset) | |
| 76 | ||
| 77 | lemma sumr_offset4: | |
| 78 |  "\<forall>n f. setsum f {0::nat..<n+k} =
 | |
| 79 |         (\<Sum>m=0..<n. f (m+k)::real) + setsum f {0..<k}"
 | |
| 80 | by (simp add: sumr_offset) | |
| 81 | ||
| 82 | (* | |
| 83 | lemma sumr_from_1_from_0: "0 < n ==> | |
| 84 | (\<Sum>n=Suc 0 ..< Suc n. if even(n) then 0 else | |
| 85 | ((- 1) ^ ((n - (Suc 0)) div 2))/(real (fact n))) * a ^ n = | |
| 86 | (\<Sum>n=0..<Suc n. if even(n) then 0 else | |
| 87 | ((- 1) ^ ((n - (Suc 0)) div 2))/(real (fact n))) * a ^ n" | |
| 88 | by (rule_tac n1 = 1 in sumr_split_add [THEN subst], auto) | |
| 89 | *) | |
| 14416 | 90 | |
| 91 | subsection{* Infinite Sums, by the Properties of Limits*}
 | |
| 92 | ||
| 93 | (*---------------------- | |
| 94 | suminf is the sum | |
| 95 | ---------------------*) | |
| 96 | lemma sums_summable: "f sums l ==> summable f" | |
| 97 | by (simp add: sums_def summable_def, blast) | |
| 98 | ||
| 99 | lemma summable_sums: "summable f ==> f sums (suminf f)" | |
| 100 | apply (simp add: summable_def suminf_def) | |
| 101 | apply (blast intro: someI2) | |
| 102 | done | |
| 103 | ||
| 104 | lemma summable_sumr_LIMSEQ_suminf: | |
| 15539 | 105 |      "summable f ==> (%n. setsum f {0..<n}) ----> (suminf f)"
 | 
| 14416 | 106 | apply (simp add: summable_def suminf_def sums_def) | 
| 107 | apply (blast intro: someI2) | |
| 108 | done | |
| 109 | ||
| 110 | (*------------------- | |
| 111 | sum is unique | |
| 112 | ------------------*) | |
| 113 | lemma sums_unique: "f sums s ==> (s = suminf f)" | |
| 114 | apply (frule sums_summable [THEN summable_sums]) | |
| 115 | apply (auto intro!: LIMSEQ_unique simp add: sums_def) | |
| 116 | done | |
| 117 | ||
| 16819 | 118 | lemma sums_split_initial_segment: "f sums s ==> | 
| 119 | (%n. f(n + k)) sums (s - (SUM i = 0..< k. f i))" | |
| 120 | apply (unfold sums_def); | |
| 121 | apply (simp add: sumr_offset); | |
| 122 | apply (rule LIMSEQ_diff_const) | |
| 123 | apply (rule LIMSEQ_ignore_initial_segment) | |
| 124 | apply assumption | |
| 125 | done | |
| 126 | ||
| 127 | lemma summable_ignore_initial_segment: "summable f ==> | |
| 128 | summable (%n. f(n + k))" | |
| 129 | apply (unfold summable_def) | |
| 130 | apply (auto intro: sums_split_initial_segment) | |
| 131 | done | |
| 132 | ||
| 133 | lemma suminf_minus_initial_segment: "summable f ==> | |
| 134 | suminf f = s ==> suminf (%n. f(n + k)) = s - (SUM i = 0..< k. f i)" | |
| 135 | apply (frule summable_ignore_initial_segment) | |
| 136 | apply (rule sums_unique [THEN sym]) | |
| 137 | apply (frule summable_sums) | |
| 138 | apply (rule sums_split_initial_segment) | |
| 139 | apply auto | |
| 140 | done | |
| 141 | ||
| 142 | lemma suminf_split_initial_segment: "summable f ==> | |
| 143 | suminf f = (SUM i = 0..< k. f i) + suminf (%n. f(n + k))" | |
| 144 | by (auto simp add: suminf_minus_initial_segment) | |
| 145 | ||
| 14416 | 146 | lemma series_zero: | 
| 15539 | 147 |      "(\<forall>m. n \<le> m --> f(m) = 0) ==> f sums (setsum f {0..<n})"
 | 
| 15537 | 148 | apply (simp add: sums_def LIMSEQ_def diff_minus[symmetric], safe) | 
| 14416 | 149 | apply (rule_tac x = n in exI) | 
| 15542 | 150 | apply (clarsimp simp add:setsum_diff[symmetric] cong:setsum_ivl_cong) | 
| 14416 | 151 | done | 
| 152 | ||
| 16819 | 153 | lemma sums_zero: "(%n. 0) sums 0"; | 
| 154 | apply (unfold sums_def); | |
| 155 | apply simp; | |
| 156 | apply (rule LIMSEQ_const); | |
| 157 | done; | |
| 15539 | 158 | |
| 16819 | 159 | lemma summable_zero: "summable (%n. 0)"; | 
| 160 | apply (rule sums_summable); | |
| 161 | apply (rule sums_zero); | |
| 162 | done; | |
| 163 | ||
| 164 | lemma suminf_zero: "suminf (%n. 0) = 0"; | |
| 165 | apply (rule sym); | |
| 166 | apply (rule sums_unique); | |
| 167 | apply (rule sums_zero); | |
| 168 | done; | |
| 169 | ||
| 170 | lemma sums_mult: "f sums a ==> (%n. c * f n) sums (c * a)" | |
| 15536 | 171 | by (auto simp add: sums_def setsum_mult [symmetric] | 
| 14416 | 172 | intro!: LIMSEQ_mult intro: LIMSEQ_const) | 
| 173 | ||
| 16819 | 174 | lemma summable_mult: "summable f ==> summable (%n. c * f n)"; | 
| 175 | apply (unfold summable_def); | |
| 176 | apply (auto intro: sums_mult); | |
| 177 | done; | |
| 178 | ||
| 179 | lemma suminf_mult: "summable f ==> suminf (%n. c * f n) = c * suminf f"; | |
| 180 | apply (rule sym); | |
| 181 | apply (rule sums_unique); | |
| 182 | apply (rule sums_mult); | |
| 183 | apply (erule summable_sums); | |
| 184 | done; | |
| 185 | ||
| 186 | lemma sums_mult2: "f sums a ==> (%n. f n * c) sums (a * c)" | |
| 187 | apply (subst mult_commute) | |
| 188 | apply (subst mult_commute);back; | |
| 189 | apply (erule sums_mult) | |
| 190 | done | |
| 191 | ||
| 192 | lemma summable_mult2: "summable f ==> summable (%n. f n * c)" | |
| 193 | apply (unfold summable_def) | |
| 194 | apply (auto intro: sums_mult2) | |
| 195 | done | |
| 196 | ||
| 197 | lemma suminf_mult2: "summable f ==> suminf f * c = (\<Sum>n. f n * c)" | |
| 198 | by (auto intro!: sums_unique sums_mult summable_sums simp add: mult_commute) | |
| 199 | ||
| 200 | lemma sums_divide: "f sums a ==> (%n. (f n)/c) sums (a/c)" | |
| 14416 | 201 | by (simp add: real_divide_def sums_mult mult_commute [of _ "inverse c"]) | 
| 202 | ||
| 16819 | 203 | lemma summable_divide: "summable f ==> summable (%n. (f n) / c)"; | 
| 204 | apply (unfold summable_def); | |
| 205 | apply (auto intro: sums_divide); | |
| 206 | done; | |
| 207 | ||
| 208 | lemma suminf_divide: "summable f ==> suminf (%n. (f n) / c) = (suminf f) / c"; | |
| 209 | apply (rule sym); | |
| 210 | apply (rule sums_unique); | |
| 211 | apply (rule sums_divide); | |
| 212 | apply (erule summable_sums); | |
| 213 | done; | |
| 214 | ||
| 215 | lemma sums_add: "[| x sums x0; y sums y0 |] ==> (%n. x n + y n) sums (x0+y0)" | |
| 216 | by (auto simp add: sums_def setsum_addf intro: LIMSEQ_add) | |
| 217 | ||
| 218 | lemma summable_add: "summable f ==> summable g ==> summable (%x. f x + g x)"; | |
| 219 | apply (unfold summable_def); | |
| 220 | apply clarify; | |
| 221 | apply (rule exI); | |
| 222 | apply (erule sums_add); | |
| 223 | apply assumption; | |
| 224 | done; | |
| 225 | ||
| 226 | lemma suminf_add: | |
| 227 | "[| summable f; summable g |] | |
| 228 | ==> suminf f + suminf g = (\<Sum>n. f n + g n)" | |
| 229 | by (auto intro!: sums_add sums_unique summable_sums) | |
| 230 | ||
| 14416 | 231 | lemma sums_diff: "[| x sums x0; y sums y0 |] ==> (%n. x n - y n) sums (x0-y0)" | 
| 15536 | 232 | by (auto simp add: sums_def setsum_subtractf intro: LIMSEQ_diff) | 
| 14416 | 233 | |
| 16819 | 234 | lemma summable_diff: "summable f ==> summable g ==> summable (%x. f x - g x)"; | 
| 235 | apply (unfold summable_def); | |
| 236 | apply clarify; | |
| 237 | apply (rule exI); | |
| 238 | apply (erule sums_diff); | |
| 239 | apply assumption; | |
| 240 | done; | |
| 14416 | 241 | |
| 242 | lemma suminf_diff: | |
| 243 | "[| summable f; summable g |] | |
| 15546 | 244 | ==> suminf f - suminf g = (\<Sum>n. f n - g n)" | 
| 14416 | 245 | by (auto intro!: sums_diff sums_unique summable_sums) | 
| 246 | ||
| 16819 | 247 | lemma sums_minus: "f sums s ==> (%x. - f x) sums (- s)"; | 
| 248 | by (simp add: sums_def setsum_negf LIMSEQ_minus); | |
| 249 | ||
| 250 | lemma summable_minus: "summable f ==> summable (%x. - f x)"; | |
| 251 | by (auto simp add: summable_def intro: sums_minus); | |
| 252 | ||
| 253 | lemma suminf_minus: "summable f ==> suminf (%x. - f x) = - (suminf f)"; | |
| 254 | apply (rule sym); | |
| 255 | apply (rule sums_unique); | |
| 256 | apply (rule sums_minus); | |
| 257 | apply (erule summable_sums); | |
| 258 | done; | |
| 14416 | 259 | |
| 260 | lemma sums_group: | |
| 15539 | 261 |      "[|summable f; 0 < k |] ==> (%n. setsum f {n*k..<n*k+k}) sums (suminf f)"
 | 
| 14416 | 262 | apply (drule summable_sums) | 
| 15543 | 263 | apply (auto simp add: sums_def LIMSEQ_def sumr_group) | 
| 14416 | 264 | apply (drule_tac x = r in spec, safe) | 
| 265 | apply (rule_tac x = no in exI, safe) | |
| 266 | apply (drule_tac x = "n*k" in spec) | |
| 267 | apply (auto dest!: not_leE) | |
| 268 | apply (drule_tac j = no in less_le_trans, auto) | |
| 269 | done | |
| 270 | ||
| 271 | lemma sumr_pos_lt_pair_lemma: | |
| 15539 | 272 | "[|\<forall>d. - f (n + (d + d)) < (f (Suc (n + (d + d))) :: real) |] | 
| 273 |    ==> setsum f {0..<n+Suc(Suc 0)} \<le> setsum f {0..<Suc(Suc 0) * Suc no + n}"
 | |
| 15251 | 274 | apply (induct "no", auto) | 
| 275 | apply (drule_tac x = "Suc no" in spec) | |
| 15539 | 276 | apply (simp add: add_ac) | 
| 16733 
236dfafbeb63
linear arithmetic now takes "&" in assumptions apart.
 nipkow parents: 
15561diff
changeset | 277 | (* FIXME why does simp require a separate step to prove the (pure arithmetic) | 
| 
236dfafbeb63
linear arithmetic now takes "&" in assumptions apart.
 nipkow parents: 
15561diff
changeset | 278 | left-over? With del cong: strong_setsum_cong it works! | 
| 
236dfafbeb63
linear arithmetic now takes "&" in assumptions apart.
 nipkow parents: 
15561diff
changeset | 279 | *) | 
| 
236dfafbeb63
linear arithmetic now takes "&" in assumptions apart.
 nipkow parents: 
15561diff
changeset | 280 | apply simp | 
| 14416 | 281 | done | 
| 10751 | 282 | |
| 283 | ||
| 14416 | 284 | lemma sumr_pos_lt_pair: | 
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 285 | "[|summable f; | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 286 | \<forall>d. 0 < (f(n + (Suc(Suc 0) * d))) + f(n + ((Suc(Suc 0) * d) + 1))|] | 
| 15539 | 287 |       ==> setsum f {0..<n} < suminf f"
 | 
| 14416 | 288 | apply (drule summable_sums) | 
| 289 | apply (auto simp add: sums_def LIMSEQ_def) | |
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 290 | apply (drule_tac x = "f (n) + f (n + 1)" in spec) | 
| 15085 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15053diff
changeset | 291 | apply (auto iff: real_0_less_add_iff) | 
| 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15053diff
changeset | 292 |    --{*legacy proof: not necessarily better!*}
 | 
| 14416 | 293 | apply (rule_tac [2] ccontr, drule_tac [2] linorder_not_less [THEN iffD1]) | 
| 294 | apply (frule_tac [2] no=no in sumr_pos_lt_pair_lemma) | |
| 295 | apply (drule_tac x = 0 in spec, simp) | |
| 296 | apply (rotate_tac 1, drule_tac x = "Suc (Suc 0) * (Suc no) + n" in spec) | |
| 297 | apply (safe, simp) | |
| 15539 | 298 | apply (subgoal_tac "suminf f + (f (n) + f (n + 1)) \<le> | 
| 299 |  setsum f {0 ..< Suc (Suc 0) * (Suc no) + n}")
 | |
| 300 | apply (rule_tac [2] y = "setsum f {0..<n+ Suc (Suc 0)}" in order_trans)
 | |
| 14416 | 301 | prefer 3 apply assumption | 
| 15539 | 302 | apply (rule_tac [2] y = "setsum f {0..<n} + (f (n) + f (n + 1))" in order_trans)
 | 
| 14416 | 303 | apply simp_all | 
| 15539 | 304 | apply (subgoal_tac "suminf f \<le> setsum f {0..< Suc (Suc 0) * (Suc no) + n}")
 | 
| 14416 | 305 | apply (rule_tac [2] y = "suminf f + (f (n) + f (n + 1))" in order_trans) | 
| 15539 | 306 | prefer 3 apply simp | 
| 14416 | 307 | apply (drule_tac [2] x = 0 in spec) | 
| 308 | prefer 2 apply simp | |
| 15539 | 309 | apply (subgoal_tac "0 \<le> setsum f {0 ..< Suc (Suc 0) * Suc no + n} + - suminf f")
 | 
| 310 | apply (simp add: abs_if) | |
| 14416 | 311 | apply (auto simp add: linorder_not_less [symmetric]) | 
| 312 | done | |
| 313 | ||
| 15085 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15053diff
changeset | 314 | text{*A summable series of positive terms has limit that is at least as
 | 
| 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15053diff
changeset | 315 | great as any partial sum.*} | 
| 14416 | 316 | |
| 317 | lemma series_pos_le: | |
| 15539 | 318 |      "[| summable f; \<forall>m \<ge> n. 0 \<le> f(m) |] ==> setsum f {0..<n} \<le> suminf f"
 | 
| 14416 | 319 | apply (drule summable_sums) | 
| 320 | apply (simp add: sums_def) | |
| 15539 | 321 | apply (cut_tac k = "setsum f {0..<n}" in LIMSEQ_const)
 | 
| 322 | apply (erule LIMSEQ_le, blast) | |
| 323 | apply (rule_tac x = n in exI, clarify) | |
| 324 | apply (rule setsum_mono2) | |
| 325 | apply auto | |
| 14416 | 326 | done | 
| 327 | ||
| 328 | lemma series_pos_less: | |
| 15539 | 329 |      "[| summable f; \<forall>m \<ge> n. 0 < f(m) |] ==> setsum f {0..<n} < suminf f"
 | 
| 330 | apply (rule_tac y = "setsum f {0..<Suc n}" in order_less_le_trans)
 | |
| 14416 | 331 | apply (rule_tac [2] series_pos_le, auto) | 
| 332 | apply (drule_tac x = m in spec, auto) | |
| 333 | done | |
| 334 | ||
| 15085 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15053diff
changeset | 335 | text{*Sum of a geometric progression.*}
 | 
| 14416 | 336 | |
| 17149 
e2b19c92ef51
Lemmas on dvd, power and finite summation added or strengthened.
 ballarin parents: 
16819diff
changeset | 337 | lemmas sumr_geometric = geometric_sum [where 'a = real] | 
| 14416 | 338 | |
| 339 | lemma geometric_sums: "abs(x) < 1 ==> (%n. x ^ n) sums (1/(1 - x))" | |
| 340 | apply (case_tac "x = 1") | |
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 341 | apply (auto dest!: LIMSEQ_rabs_realpow_zero2 | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 342 | simp add: sumr_geometric sums_def diff_minus add_divide_distrib) | 
| 14416 | 343 | apply (subgoal_tac "1 / (1 + -x) = 0/ (x - 1) + - 1/ (x - 1) ") | 
| 344 | apply (erule ssubst) | |
| 345 | apply (rule LIMSEQ_add, rule LIMSEQ_divide) | |
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 346 | apply (auto intro: LIMSEQ_const simp add: diff_minus minus_divide_right LIMSEQ_rabs_realpow_zero2) | 
| 14416 | 347 | done | 
| 348 | ||
| 15085 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15053diff
changeset | 349 | text{*Cauchy-type criterion for convergence of series (c.f. Harrison)*}
 | 
| 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15053diff
changeset | 350 | |
| 15539 | 351 | lemma summable_convergent_sumr_iff: | 
| 352 |  "summable f = convergent (%n. setsum f {0..<n})"
 | |
| 14416 | 353 | by (simp add: summable_def sums_def convergent_def) | 
| 354 | ||
| 355 | lemma summable_Cauchy: | |
| 356 | "summable f = | |
| 15539 | 357 |       (\<forall>e > 0. \<exists>N. \<forall>m \<ge> N. \<forall>n. abs(setsum f {m..<n}) < e)"
 | 
| 15537 | 358 | apply (auto simp add: summable_convergent_sumr_iff Cauchy_convergent_iff [symmetric] Cauchy_def diff_minus[symmetric]) | 
| 15539 | 359 | apply (drule_tac [!] spec, auto) | 
| 14416 | 360 | apply (rule_tac x = M in exI) | 
| 361 | apply (rule_tac [2] x = N in exI, auto) | |
| 362 | apply (cut_tac [!] m = m and n = n in less_linear, auto) | |
| 363 | apply (frule le_less_trans [THEN less_imp_le], assumption) | |
| 15360 | 364 | apply (drule_tac x = n in spec, simp) | 
| 14416 | 365 | apply (drule_tac x = m in spec) | 
| 15539 | 366 | apply(simp add: setsum_diff[symmetric]) | 
| 15537 | 367 | apply(subst abs_minus_commute) | 
| 15539 | 368 | apply(simp add: setsum_diff[symmetric]) | 
| 369 | apply(simp add: setsum_diff[symmetric]) | |
| 14416 | 370 | done | 
| 371 | ||
| 15085 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15053diff
changeset | 372 | text{*Comparison test*}
 | 
| 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15053diff
changeset | 373 | |
| 14416 | 374 | lemma summable_comparison_test: | 
| 15360 | 375 | "[| \<exists>N. \<forall>n \<ge> N. abs(f n) \<le> g n; summable g |] ==> summable f" | 
| 14416 | 376 | apply (auto simp add: summable_Cauchy) | 
| 377 | apply (drule spec, auto) | |
| 378 | apply (rule_tac x = "N + Na" in exI, auto) | |
| 379 | apply (rotate_tac 2) | |
| 380 | apply (drule_tac x = m in spec) | |
| 381 | apply (auto, rotate_tac 2, drule_tac x = n in spec) | |
| 15539 | 382 | apply (rule_tac y = "\<Sum>k=m..<n. abs(f k)" in order_le_less_trans) | 
| 15536 | 383 | apply (rule setsum_abs) | 
| 15539 | 384 | apply (rule_tac y = "setsum g {m..<n}" in order_le_less_trans)
 | 
| 385 | apply (auto intro: setsum_mono simp add: abs_interval_iff) | |
| 14416 | 386 | done | 
| 387 | ||
| 388 | lemma summable_rabs_comparison_test: | |
| 15360 | 389 | "[| \<exists>N. \<forall>n \<ge> N. abs(f n) \<le> g n; summable g |] | 
| 14416 | 390 | ==> summable (%k. abs (f k))" | 
| 391 | apply (rule summable_comparison_test) | |
| 15543 | 392 | apply (auto) | 
| 14416 | 393 | done | 
| 394 | ||
| 15085 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15053diff
changeset | 395 | text{*Limit comparison property for series (c.f. jrh)*}
 | 
| 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15053diff
changeset | 396 | |
| 14416 | 397 | lemma summable_le: | 
| 398 | "[|\<forall>n. f n \<le> g n; summable f; summable g |] ==> suminf f \<le> suminf g" | |
| 399 | apply (drule summable_sums)+ | |
| 400 | apply (auto intro!: LIMSEQ_le simp add: sums_def) | |
| 401 | apply (rule exI) | |
| 15539 | 402 | apply (auto intro!: setsum_mono) | 
| 14416 | 403 | done | 
| 404 | ||
| 405 | lemma summable_le2: | |
| 406 | "[|\<forall>n. abs(f n) \<le> g n; summable g |] | |
| 407 | ==> summable f & suminf f \<le> suminf g" | |
| 408 | apply (auto intro: summable_comparison_test intro!: summable_le) | |
| 409 | apply (simp add: abs_le_interval_iff) | |
| 410 | done | |
| 411 | ||
| 15085 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15053diff
changeset | 412 | text{*Absolute convergence imples normal convergence*}
 | 
| 14416 | 413 | lemma summable_rabs_cancel: "summable (%n. abs (f n)) ==> summable f" | 
| 15536 | 414 | apply (auto simp add: summable_Cauchy) | 
| 14416 | 415 | apply (drule spec, auto) | 
| 416 | apply (rule_tac x = N in exI, auto) | |
| 417 | apply (drule spec, auto) | |
| 15539 | 418 | apply (rule_tac y = "\<Sum>n=m..<n. abs(f n)" in order_le_less_trans) | 
| 15536 | 419 | apply (auto) | 
| 14416 | 420 | done | 
| 421 | ||
| 15085 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15053diff
changeset | 422 | text{*Absolute convergence of series*}
 | 
| 14416 | 423 | lemma summable_rabs: | 
| 15546 | 424 | "summable (%n. abs (f n)) ==> abs(suminf f) \<le> (\<Sum>n. abs(f n))" | 
| 15536 | 425 | by (auto intro: LIMSEQ_le LIMSEQ_imp_rabs summable_rabs_cancel summable_sumr_LIMSEQ_suminf) | 
| 14416 | 426 | |
| 427 | ||
| 428 | subsection{* The Ratio Test*}
 | |
| 429 | ||
| 430 | lemma rabs_ratiotest_lemma: "[| c \<le> 0; abs x \<le> c * abs y |] ==> x = (0::real)" | |
| 431 | apply (drule order_le_imp_less_or_eq, auto) | |
| 432 | apply (subgoal_tac "0 \<le> c * abs y") | |
| 433 | apply (simp add: zero_le_mult_iff, arith) | |
| 434 | done | |
| 435 | ||
| 436 | lemma le_Suc_ex: "(k::nat) \<le> l ==> (\<exists>n. l = k + n)" | |
| 437 | apply (drule le_imp_less_or_eq) | |
| 438 | apply (auto dest: less_imp_Suc_add) | |
| 439 | done | |
| 440 | ||
| 441 | lemma le_Suc_ex_iff: "((k::nat) \<le> l) = (\<exists>n. l = k + n)" | |
| 442 | by (auto simp add: le_Suc_ex) | |
| 443 | ||
| 444 | (*All this trouble just to get 0<c *) | |
| 445 | lemma ratio_test_lemma2: | |
| 15360 | 446 | "[| \<forall>n \<ge> N. abs(f(Suc n)) \<le> c*abs(f n) |] | 
| 14416 | 447 | ==> 0 < c | summable f" | 
| 448 | apply (simp (no_asm) add: linorder_not_le [symmetric]) | |
| 449 | apply (simp add: summable_Cauchy) | |
| 15543 | 450 | apply (safe, subgoal_tac "\<forall>n. N < n --> f (n) = 0") | 
| 451 | prefer 2 | |
| 452 | apply clarify | |
| 453 | apply(erule_tac x = "n - 1" in allE) | |
| 454 | apply (simp add:diff_Suc split:nat.splits) | |
| 455 | apply (blast intro: rabs_ratiotest_lemma) | |
| 14416 | 456 | apply (rule_tac x = "Suc N" in exI, clarify) | 
| 15543 | 457 | apply(simp cong:setsum_ivl_cong) | 
| 14416 | 458 | done | 
| 459 | ||
| 460 | lemma ratio_test: | |
| 15360 | 461 | "[| c < 1; \<forall>n \<ge> N. abs(f(Suc n)) \<le> c*abs(f n) |] | 
| 14416 | 462 | ==> summable f" | 
| 463 | apply (frule ratio_test_lemma2, auto) | |
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 464 | apply (rule_tac g = "%n. (abs (f N) / (c ^ N))*c ^ n" | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 465 | in summable_comparison_test) | 
| 14416 | 466 | apply (rule_tac x = N in exI, safe) | 
| 467 | apply (drule le_Suc_ex_iff [THEN iffD1]) | |
| 468 | apply (auto simp add: power_add realpow_not_zero) | |
| 15539 | 469 | apply (induct_tac "na", auto) | 
| 14416 | 470 | apply (rule_tac y = "c*abs (f (N + n))" in order_trans) | 
| 471 | apply (auto intro: mult_right_mono simp add: summable_def) | |
| 472 | apply (simp add: mult_ac) | |
| 15234 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 473 | apply (rule_tac x = "abs (f N) * (1/ (1 - c)) / (c ^ N)" in exI) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 474 | apply (rule sums_divide) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 475 | apply (rule sums_mult) | 
| 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 paulson parents: 
15229diff
changeset | 476 | apply (auto intro!: geometric_sums) | 
| 14416 | 477 | done | 
| 478 | ||
| 479 | ||
| 15085 
5693a977a767
removed some [iff] declarations from RealDef.thy, concerning inequalities
 paulson parents: 
15053diff
changeset | 480 | text{*Differentiation of finite sum*}
 | 
| 14416 | 481 | |
| 482 | lemma DERIV_sumr [rule_format (no_asm)]: | |
| 483 | "(\<forall>r. m \<le> r & r < (m + n) --> DERIV (%x. f r x) x :> (f' r x)) | |
| 15539 | 484 | --> DERIV (%x. \<Sum>n=m..<n::nat. f n x) x :> (\<Sum>r=m..<n. f' r x)" | 
| 15251 | 485 | apply (induct "n") | 
| 14416 | 486 | apply (auto intro: DERIV_add) | 
| 487 | done | |
| 488 | ||
| 489 | ML | |
| 490 | {*
 | |
| 491 | val sums_def = thm"sums_def"; | |
| 492 | val summable_def = thm"summable_def"; | |
| 493 | val suminf_def = thm"suminf_def"; | |
| 494 | ||
| 495 | val sumr_minus_one_realpow_zero = thm "sumr_minus_one_realpow_zero"; | |
| 496 | val sumr_one_lb_realpow_zero = thm "sumr_one_lb_realpow_zero"; | |
| 497 | val sumr_group = thm "sumr_group"; | |
| 498 | val sums_summable = thm "sums_summable"; | |
| 499 | val summable_sums = thm "summable_sums"; | |
| 500 | val summable_sumr_LIMSEQ_suminf = thm "summable_sumr_LIMSEQ_suminf"; | |
| 501 | val sums_unique = thm "sums_unique"; | |
| 502 | val series_zero = thm "series_zero"; | |
| 503 | val sums_mult = thm "sums_mult"; | |
| 504 | val sums_divide = thm "sums_divide"; | |
| 505 | val sums_diff = thm "sums_diff"; | |
| 506 | val suminf_mult = thm "suminf_mult"; | |
| 507 | val suminf_mult2 = thm "suminf_mult2"; | |
| 508 | val suminf_diff = thm "suminf_diff"; | |
| 509 | val sums_minus = thm "sums_minus"; | |
| 510 | val sums_group = thm "sums_group"; | |
| 511 | val sumr_pos_lt_pair_lemma = thm "sumr_pos_lt_pair_lemma"; | |
| 512 | val sumr_pos_lt_pair = thm "sumr_pos_lt_pair"; | |
| 513 | val series_pos_le = thm "series_pos_le"; | |
| 514 | val series_pos_less = thm "series_pos_less"; | |
| 515 | val sumr_geometric = thm "sumr_geometric"; | |
| 516 | val geometric_sums = thm "geometric_sums"; | |
| 517 | val summable_convergent_sumr_iff = thm "summable_convergent_sumr_iff"; | |
| 518 | val summable_Cauchy = thm "summable_Cauchy"; | |
| 519 | val summable_comparison_test = thm "summable_comparison_test"; | |
| 520 | val summable_rabs_comparison_test = thm "summable_rabs_comparison_test"; | |
| 521 | val summable_le = thm "summable_le"; | |
| 522 | val summable_le2 = thm "summable_le2"; | |
| 523 | val summable_rabs_cancel = thm "summable_rabs_cancel"; | |
| 524 | val summable_rabs = thm "summable_rabs"; | |
| 525 | val rabs_ratiotest_lemma = thm "rabs_ratiotest_lemma"; | |
| 526 | val le_Suc_ex = thm "le_Suc_ex"; | |
| 527 | val le_Suc_ex_iff = thm "le_Suc_ex_iff"; | |
| 528 | val ratio_test_lemma2 = thm "ratio_test_lemma2"; | |
| 529 | val ratio_test = thm "ratio_test"; | |
| 530 | val DERIV_sumr = thm "DERIV_sumr"; | |
| 531 | *} | |
| 532 | ||
| 533 | end |