src/HOL/Hyperreal/Series.thy
author nipkow
Thu Dec 02 11:42:01 2004 +0100 (2004-12-02)
changeset 15360 300e09825d8b
parent 15251 bb6f072c8d10
child 15536 3ce1cb7a24f0
permissions -rw-r--r--
Added "ALL x > y" and relatives.
     1 (*  Title       : Series.thy
     2     Author      : Jacques D. Fleuriot
     3     Copyright   : 1998  University of Cambridge
     4 
     5 Converted to Isar and polished by lcp
     6 *) 
     7 
     8 header{*Finite Summation and Infinite Series*}
     9 
    10 theory Series
    11 imports SEQ Lim
    12 begin
    13 
    14 syntax sumr :: "[nat,nat,(nat=>real)] => real"
    15 translations
    16   "sumr m n f" => "setsum (f::nat=>real) (atLeastLessThan m n)"
    17 
    18 constdefs
    19    sums  :: "[nat=>real,real] => bool"     (infixr "sums" 80)
    20    "f sums s  == (%n. sumr 0 n f) ----> s"
    21 
    22    summable :: "(nat=>real) => bool"
    23    "summable f == (\<exists>s. f sums s)"
    24 
    25    suminf   :: "(nat=>real) => real"
    26    "suminf f == (@s. f sums s)"
    27 
    28 
    29 lemma sumr_Suc [simp]:
    30      "sumr m (Suc n) f = (if n < m then 0 else sumr m n f + f(n))"
    31 by (simp add: atLeastLessThanSuc)
    32 
    33 lemma sumr_add: "sumr m n f + sumr m n g = sumr m n (%n. f n + g n)"
    34 by (simp add: setsum_addf)
    35 
    36 lemma sumr_mult: "r * sumr m n (f::nat=>real) = sumr m n (%n. r * f n)"
    37 by (simp add: setsum_mult)
    38 
    39 lemma sumr_split_add [rule_format]:
    40      "n < p --> sumr 0 n f + sumr n p f = sumr 0 p (f::nat=>real)"
    41 apply (induct "p", auto)
    42 apply (rename_tac k) 
    43 apply (subgoal_tac "n=k", auto) 
    44 done
    45 
    46 lemma sumr_split_add_minus:
    47      "n < p ==> sumr 0 p f + - sumr 0 n f = sumr n p (f::nat=>real)"
    48 apply (drule_tac f1 = f in sumr_split_add [symmetric])
    49 apply (simp add: add_ac)
    50 done
    51 
    52 lemma sumr_rabs: "abs(sumr m n  (f::nat=>real)) \<le> sumr m n (%i. abs(f i))"
    53 by (simp add: setsum_abs)
    54 
    55 lemma sumr_rabs_ge_zero [iff]: "0 \<le> sumr m n (%n. abs (f n))"
    56 by (simp add: setsum_abs_ge_zero)
    57 
    58 text{*Just a congruence rule*}
    59 lemma sumr_fun_eq:
    60      "(\<forall>r. m \<le> r & r < n --> f r = g r) ==> sumr m n f = sumr m n g"
    61 by (auto intro: setsum_cong) 
    62 
    63 lemma sumr_diff_mult_const: "sumr 0 n f - (real n*r) = sumr 0 n (%i. f i - r)"
    64 by (simp add: diff_minus setsum_addf real_of_nat_def)
    65 
    66 lemma sumr_less_bounds_zero [simp]: "n < m ==> sumr m n f = 0"
    67 by (simp add: atLeastLessThan_empty)
    68 
    69 lemma sumr_minus: "sumr m n (%i. - f i) = - sumr m n f"
    70 by (simp add: Finite_Set.setsum_negf)
    71 
    72 lemma sumr_shift_bounds: "sumr (m+k) (n+k) f = sumr m n (%i. f(i + k))"
    73 by (induct "n", auto)
    74 
    75 lemma sumr_minus_one_realpow_zero [simp]: "sumr 0 (2*n) (%i. (-1) ^ Suc i) = 0"
    76 by (induct "n", auto)
    77 
    78 lemma sumr_interval_const:
    79      "\<lbrakk>\<forall>n. m \<le> Suc n --> f n = r; m \<le> k\<rbrakk> \<Longrightarrow> sumr m k f = (real(k-m) * r)"
    80 apply (induct "k", auto) 
    81 apply (drule_tac x = k in spec)
    82 apply (auto dest!: le_imp_less_or_eq)
    83 apply (simp add: left_distrib real_of_nat_Suc split: nat_diff_split)
    84 done
    85 
    86 lemma sumr_interval_const2:
    87      "[|\<forall>n\<ge>m. f n = r; m \<le> k|]
    88       ==> sumr m k f = (real (k - m) * r)"
    89 apply (induct "k", auto) 
    90 apply (drule_tac x = k in spec)
    91 apply (auto dest!: le_imp_less_or_eq)
    92 apply (simp add: left_distrib real_of_nat_Suc split: nat_diff_split)
    93 done
    94 
    95 
    96 lemma sumr_le:
    97      "[|\<forall>n\<ge>m. 0 \<le> f n; m < k|] ==> sumr 0 m f \<le> sumr 0 k f"
    98 apply (induct "k")
    99 apply (auto simp add: less_Suc_eq_le)
   100 apply (drule_tac x = k in spec, safe)
   101 apply (drule le_imp_less_or_eq, safe)
   102 apply (arith) 
   103 apply (drule_tac a = "sumr 0 m f" in order_refl [THEN add_mono], auto)
   104 done
   105 
   106 lemma sumr_le2 [rule_format (no_asm)]:
   107      "(\<forall>r. m \<le> r & r < n --> f r \<le> g r) --> sumr m n f \<le> sumr m n g"
   108 apply (induct "n")
   109 apply (auto intro: add_mono simp add: le_def)
   110 done
   111 
   112 lemma sumr_ge_zero: "(\<forall>n\<ge>m. 0 \<le> f n) --> 0 \<le> sumr m n f"
   113 apply (induct "n", auto)
   114 apply (drule_tac x = n in spec, arith)
   115 done
   116 
   117 lemma rabs_sumr_rabs_cancel [simp]:
   118      "abs (sumr m n (%k. abs (f k))) = (sumr m n (%k. abs (f k)))"
   119 by (induct "n", simp_all add: add_increasing)
   120 
   121 lemma sumr_zero [rule_format]:
   122      "\<forall>n \<ge> N. f n = 0 ==> N \<le> m --> sumr m n f = 0"
   123 by (induct "n", auto)
   124 
   125 lemma Suc_le_imp_diff_ge2:
   126      "[|\<forall>n \<ge> N. f (Suc n) = 0; Suc N \<le> m|] ==> sumr m n f = 0"
   127 apply (rule sumr_zero) 
   128 apply (case_tac "n", auto)
   129 done
   130 
   131 lemma sumr_one_lb_realpow_zero [simp]: "sumr (Suc 0) n (%n. f(n) * 0 ^ n) = 0"
   132 apply (induct "n")
   133 apply (case_tac [2] "n", auto)
   134 done
   135 
   136 lemma sumr_diff: "sumr m n f - sumr m n g = sumr m n (%n. f n - g n)"
   137 by (simp add: diff_minus sumr_add [symmetric] sumr_minus)
   138 
   139 lemma sumr_subst [rule_format (no_asm)]:
   140      "(\<forall>p. m \<le> p & p < m+n --> (f p = g p)) --> sumr m n f = sumr m n g"
   141 by (induct "n", auto)
   142 
   143 lemma sumr_bound [rule_format (no_asm)]:
   144      "(\<forall>p. m \<le> p & p < m + n --> (f(p) \<le> K))  
   145       --> (sumr m (m + n) f \<le> (real n * K))"
   146 apply (induct "n")
   147 apply (auto intro: add_mono simp add: left_distrib real_of_nat_Suc)
   148 done
   149 
   150 lemma sumr_bound2 [rule_format (no_asm)]:
   151      "(\<forall>p. 0 \<le> p & p < n --> (f(p) \<le> K))  
   152       --> (sumr 0 n f \<le> (real n * K))"
   153 apply (induct "n")
   154 apply (auto intro: add_mono simp add: left_distrib real_of_nat_Suc add_commute)
   155 done
   156 
   157 lemma sumr_group [simp]:
   158      "sumr 0 n (%m. sumr (m * k) (m*k + k) f) = sumr 0 (n * k) f"
   159 apply (subgoal_tac "k = 0 | 0 < k", auto)
   160 apply (induct "n")
   161 apply (simp_all add: sumr_split_add add_commute)
   162 done
   163 
   164 subsection{* Infinite Sums, by the Properties of Limits*}
   165 
   166 (*----------------------
   167    suminf is the sum   
   168  ---------------------*)
   169 lemma sums_summable: "f sums l ==> summable f"
   170 by (simp add: sums_def summable_def, blast)
   171 
   172 lemma summable_sums: "summable f ==> f sums (suminf f)"
   173 apply (simp add: summable_def suminf_def)
   174 apply (blast intro: someI2)
   175 done
   176 
   177 lemma summable_sumr_LIMSEQ_suminf: 
   178      "summable f ==> (%n. sumr 0 n f) ----> (suminf f)"
   179 apply (simp add: summable_def suminf_def sums_def)
   180 apply (blast intro: someI2)
   181 done
   182 
   183 (*-------------------
   184     sum is unique                    
   185  ------------------*)
   186 lemma sums_unique: "f sums s ==> (s = suminf f)"
   187 apply (frule sums_summable [THEN summable_sums])
   188 apply (auto intro!: LIMSEQ_unique simp add: sums_def)
   189 done
   190 
   191 (*
   192 Goalw [sums_def,LIMSEQ_def] 
   193      "(\<forall>m. n \<le> Suc m --> f(m) = 0) ==> f sums (sumr 0 n f)"
   194 by safe
   195 by (res_inst_tac [("x","n")] exI 1);
   196 by (safe THEN ftac le_imp_less_or_eq 1)
   197 by safe
   198 by (dres_inst_tac [("f","f")] sumr_split_add_minus 1);
   199 by (ALLGOALS (Asm_simp_tac));
   200 by (dtac (conjI RS sumr_interval_const) 1);
   201 by Auto_tac
   202 qed "series_zero";
   203 next one was called series_zero2
   204 **********************)
   205 
   206 lemma series_zero: 
   207      "(\<forall>m. n \<le> m --> f(m) = 0) ==> f sums (sumr 0 n f)"
   208 apply (simp add: sums_def LIMSEQ_def, safe)
   209 apply (rule_tac x = n in exI)
   210 apply (safe, frule le_imp_less_or_eq, safe)
   211 apply (drule_tac f = f in sumr_split_add_minus, simp_all)
   212 apply (drule sumr_interval_const2, auto)
   213 done
   214 
   215 lemma sums_mult: "x sums x0 ==> (%n. c * x(n)) sums (c * x0)"
   216 by (auto simp add: sums_def sumr_mult [symmetric]
   217          intro!: LIMSEQ_mult intro: LIMSEQ_const)
   218 
   219 lemma sums_divide: "x sums x' ==> (%n. x(n)/c) sums (x'/c)"
   220 by (simp add: real_divide_def sums_mult mult_commute [of _ "inverse c"])
   221 
   222 lemma sums_diff: "[| x sums x0; y sums y0 |] ==> (%n. x n - y n) sums (x0-y0)"
   223 by (auto simp add: sums_def sumr_diff [symmetric] intro: LIMSEQ_diff)
   224 
   225 lemma suminf_mult: "summable f ==> suminf f * c = suminf(%n. f n * c)"
   226 by (auto intro!: sums_unique sums_mult summable_sums simp add: mult_commute)
   227 
   228 lemma suminf_mult2: "summable f ==> c * suminf f  = suminf(%n. c * f n)"
   229 by (auto intro!: sums_unique sums_mult summable_sums)
   230 
   231 lemma suminf_diff:
   232      "[| summable f; summable g |]   
   233       ==> suminf f - suminf g  = suminf(%n. f n - g n)"
   234 by (auto intro!: sums_diff sums_unique summable_sums)
   235 
   236 lemma sums_minus: "x sums x0 ==> (%n. - x n) sums - x0"
   237 by (auto simp add: sums_def intro!: LIMSEQ_minus simp add: sumr_minus)
   238 
   239 lemma sums_group:
   240      "[|summable f; 0 < k |] ==> (%n. sumr (n*k) (n*k + k) f) sums (suminf f)"
   241 apply (drule summable_sums)
   242 apply (auto simp add: sums_def LIMSEQ_def)
   243 apply (drule_tac x = r in spec, safe)
   244 apply (rule_tac x = no in exI, safe)
   245 apply (drule_tac x = "n*k" in spec)
   246 apply (auto dest!: not_leE)
   247 apply (drule_tac j = no in less_le_trans, auto)
   248 done
   249 
   250 lemma sumr_pos_lt_pair_lemma:
   251      "[|\<forall>d. - f (n + (d + d)) < f (Suc (n + (d + d)))|]
   252       ==> sumr 0 (n + Suc (Suc 0)) f \<le> sumr 0 (Suc (Suc 0) * Suc no + n) f"
   253 apply (induct "no", auto)
   254 apply (drule_tac x = "Suc no" in spec)
   255 apply (simp add: add_ac) 
   256 done
   257 
   258 
   259 lemma sumr_pos_lt_pair:
   260      "[|summable f; 
   261         \<forall>d. 0 < (f(n + (Suc(Suc 0) * d))) + f(n + ((Suc(Suc 0) * d) + 1))|]  
   262       ==> sumr 0 n f < suminf f"
   263 apply (drule summable_sums)
   264 apply (auto simp add: sums_def LIMSEQ_def)
   265 apply (drule_tac x = "f (n) + f (n + 1)" in spec)
   266 apply (auto iff: real_0_less_add_iff)
   267    --{*legacy proof: not necessarily better!*}
   268 apply (rule_tac [2] ccontr, drule_tac [2] linorder_not_less [THEN iffD1])
   269 apply (frule_tac [2] no=no in sumr_pos_lt_pair_lemma) 
   270 apply (drule_tac x = 0 in spec, simp)
   271 apply (rotate_tac 1, drule_tac x = "Suc (Suc 0) * (Suc no) + n" in spec)
   272 apply (safe, simp)
   273 apply (subgoal_tac "suminf f + (f (n) + f (n + 1)) \<le> sumr 0 (Suc (Suc 0) * (Suc no) + n) f")
   274 apply (rule_tac [2] y = "sumr 0 (n+ Suc (Suc 0)) f" in order_trans)
   275 prefer 3 apply assumption
   276 apply (rule_tac [2] y = "sumr 0 n f + (f (n) + f (n + 1))" in order_trans)
   277 apply simp_all 
   278 apply (subgoal_tac "suminf f \<le> sumr 0 (Suc (Suc 0) * (Suc no) + n) f")
   279 apply (rule_tac [2] y = "suminf f + (f (n) + f (n + 1))" in order_trans)
   280 prefer 3 apply simp 
   281 apply (drule_tac [2] x = 0 in spec)
   282  prefer 2 apply simp 
   283 apply (subgoal_tac "0 \<le> sumr 0 (Suc (Suc 0) * Suc no + n) f + - suminf f")
   284 apply (simp add: abs_if) 
   285 apply (auto simp add: linorder_not_less [symmetric])
   286 done
   287 
   288 text{*A summable series of positive terms has limit that is at least as
   289 great as any partial sum.*}
   290 
   291 lemma series_pos_le: 
   292      "[| summable f; \<forall>m \<ge> n. 0 \<le> f(m) |] ==> sumr 0 n f \<le> suminf f"
   293 apply (drule summable_sums)
   294 apply (simp add: sums_def)
   295 apply (cut_tac k = "sumr 0 n f" in LIMSEQ_const)
   296 apply (erule LIMSEQ_le, blast) 
   297 apply (rule_tac x = n in exI, clarify) 
   298 apply (drule le_imp_less_or_eq)
   299 apply (auto intro: sumr_le)
   300 done
   301 
   302 lemma series_pos_less:
   303      "[| summable f; \<forall>m \<ge> n. 0 < f(m) |] ==> sumr 0 n f < suminf f"
   304 apply (rule_tac y = "sumr 0 (Suc n) f" in order_less_le_trans)
   305 apply (rule_tac [2] series_pos_le, auto)
   306 apply (drule_tac x = m in spec, auto)
   307 done
   308 
   309 text{*Sum of a geometric progression.*}
   310 
   311 lemma sumr_geometric: "x ~= 1 ==> sumr 0 n (%n. x ^ n) = (x ^ n - 1) / (x - 1)"
   312 apply (induct "n", auto)
   313 apply (rule_tac c1 = "x - 1" in real_mult_right_cancel [THEN iffD1])
   314 apply (auto simp add: mult_assoc left_distrib  times_divide_eq)
   315 apply (simp add: right_distrib diff_minus mult_commute)
   316 done
   317 
   318 lemma geometric_sums: "abs(x) < 1 ==> (%n. x ^ n) sums (1/(1 - x))"
   319 apply (case_tac "x = 1")
   320 apply (auto dest!: LIMSEQ_rabs_realpow_zero2 
   321         simp add: sumr_geometric sums_def diff_minus add_divide_distrib)
   322 apply (subgoal_tac "1 / (1 + -x) = 0/ (x - 1) + - 1/ (x - 1) ")
   323 apply (erule ssubst)
   324 apply (rule LIMSEQ_add, rule LIMSEQ_divide)
   325 apply (auto intro: LIMSEQ_const simp add: diff_minus minus_divide_right LIMSEQ_rabs_realpow_zero2)
   326 done
   327 
   328 text{*Cauchy-type criterion for convergence of series (c.f. Harrison)*}
   329 
   330 lemma summable_convergent_sumr_iff: "summable f = convergent (%n. sumr 0 n f)"
   331 by (simp add: summable_def sums_def convergent_def)
   332 
   333 lemma summable_Cauchy:
   334      "summable f =  
   335       (\<forall>e > 0. \<exists>N. \<forall>m \<ge> N. \<forall>n. abs(sumr m n f) < e)"
   336 apply (auto simp add: summable_convergent_sumr_iff Cauchy_convergent_iff [symmetric] Cauchy_def)
   337 apply (drule_tac [!] spec, auto) 
   338 apply (rule_tac x = M in exI)
   339 apply (rule_tac [2] x = N in exI, auto)
   340 apply (cut_tac [!] m = m and n = n in less_linear, auto)
   341 apply (frule le_less_trans [THEN less_imp_le], assumption)
   342 apply (drule_tac x = n in spec, simp)
   343 apply (drule_tac x = m in spec)
   344 apply (auto intro: abs_minus_add_cancel [THEN subst]
   345             simp add: sumr_split_add_minus abs_minus_add_cancel)
   346 done
   347 
   348 text{*Comparison test*}
   349 
   350 lemma summable_comparison_test:
   351      "[| \<exists>N. \<forall>n \<ge> N. abs(f n) \<le> g n; summable g |] ==> summable f"
   352 apply (auto simp add: summable_Cauchy)
   353 apply (drule spec, auto)
   354 apply (rule_tac x = "N + Na" in exI, auto)
   355 apply (rotate_tac 2)
   356 apply (drule_tac x = m in spec)
   357 apply (auto, rotate_tac 2, drule_tac x = n in spec)
   358 apply (rule_tac y = "sumr m n (%k. abs (f k))" in order_le_less_trans)
   359 apply (rule sumr_rabs)
   360 apply (rule_tac y = "sumr m n g" in order_le_less_trans)
   361 apply (auto intro: sumr_le2 simp add: abs_interval_iff)
   362 done
   363 
   364 lemma summable_rabs_comparison_test:
   365      "[| \<exists>N. \<forall>n \<ge> N. abs(f n) \<le> g n; summable g |] 
   366       ==> summable (%k. abs (f k))"
   367 apply (rule summable_comparison_test)
   368 apply (auto simp add: abs_idempotent)
   369 done
   370 
   371 text{*Limit comparison property for series (c.f. jrh)*}
   372 
   373 lemma summable_le:
   374      "[|\<forall>n. f n \<le> g n; summable f; summable g |] ==> suminf f \<le> suminf g"
   375 apply (drule summable_sums)+
   376 apply (auto intro!: LIMSEQ_le simp add: sums_def)
   377 apply (rule exI)
   378 apply (auto intro!: sumr_le2)
   379 done
   380 
   381 lemma summable_le2:
   382      "[|\<forall>n. abs(f n) \<le> g n; summable g |]  
   383       ==> summable f & suminf f \<le> suminf g"
   384 apply (auto intro: summable_comparison_test intro!: summable_le)
   385 apply (simp add: abs_le_interval_iff)
   386 done
   387 
   388 text{*Absolute convergence imples normal convergence*}
   389 lemma summable_rabs_cancel: "summable (%n. abs (f n)) ==> summable f"
   390 apply (auto simp add: sumr_rabs summable_Cauchy)
   391 apply (drule spec, auto)
   392 apply (rule_tac x = N in exI, auto)
   393 apply (drule spec, auto)
   394 apply (rule_tac y = "sumr m n (%n. abs (f n))" in order_le_less_trans)
   395 apply (auto intro: sumr_rabs)
   396 done
   397 
   398 text{*Absolute convergence of series*}
   399 lemma summable_rabs:
   400      "summable (%n. abs (f n)) ==> abs(suminf f) \<le> suminf (%n. abs(f n))"
   401 by (auto intro: LIMSEQ_le LIMSEQ_imp_rabs summable_rabs_cancel summable_sumr_LIMSEQ_suminf sumr_rabs)
   402 
   403 
   404 subsection{* The Ratio Test*}
   405 
   406 lemma rabs_ratiotest_lemma: "[| c \<le> 0; abs x \<le> c * abs y |] ==> x = (0::real)"
   407 apply (drule order_le_imp_less_or_eq, auto)
   408 apply (subgoal_tac "0 \<le> c * abs y")
   409 apply (simp add: zero_le_mult_iff, arith)
   410 done
   411 
   412 lemma le_Suc_ex: "(k::nat) \<le> l ==> (\<exists>n. l = k + n)"
   413 apply (drule le_imp_less_or_eq)
   414 apply (auto dest: less_imp_Suc_add)
   415 done
   416 
   417 lemma le_Suc_ex_iff: "((k::nat) \<le> l) = (\<exists>n. l = k + n)"
   418 by (auto simp add: le_Suc_ex)
   419 
   420 (*All this trouble just to get 0<c *)
   421 lemma ratio_test_lemma2:
   422      "[| \<forall>n \<ge> N. abs(f(Suc n)) \<le> c*abs(f n) |]  
   423       ==> 0 < c | summable f"
   424 apply (simp (no_asm) add: linorder_not_le [symmetric])
   425 apply (simp add: summable_Cauchy)
   426 apply (safe, subgoal_tac "\<forall>n. N \<le> n --> f (Suc n) = 0")
   427 prefer 2 apply (blast intro: rabs_ratiotest_lemma)
   428 apply (rule_tac x = "Suc N" in exI, clarify)
   429 apply (drule_tac n=n in Suc_le_imp_diff_ge2, auto) 
   430 done
   431 
   432 lemma ratio_test:
   433      "[| c < 1; \<forall>n \<ge> N. abs(f(Suc n)) \<le> c*abs(f n) |]  
   434       ==> summable f"
   435 apply (frule ratio_test_lemma2, auto)
   436 apply (rule_tac g = "%n. (abs (f N) / (c ^ N))*c ^ n" 
   437        in summable_comparison_test)
   438 apply (rule_tac x = N in exI, safe)
   439 apply (drule le_Suc_ex_iff [THEN iffD1])
   440 apply (auto simp add: power_add realpow_not_zero)
   441 apply (induct_tac "na", auto simp add: times_divide_eq)
   442 apply (rule_tac y = "c*abs (f (N + n))" in order_trans)
   443 apply (auto intro: mult_right_mono simp add: summable_def)
   444 apply (simp add: mult_ac)
   445 apply (rule_tac x = "abs (f N) * (1/ (1 - c)) / (c ^ N)" in exI)
   446 apply (rule sums_divide) 
   447 apply (rule sums_mult) 
   448 apply (auto intro!: geometric_sums)
   449 done
   450 
   451 
   452 text{*Differentiation of finite sum*}
   453 
   454 lemma DERIV_sumr [rule_format (no_asm)]:
   455      "(\<forall>r. m \<le> r & r < (m + n) --> DERIV (%x. f r x) x :> (f' r x))  
   456       --> DERIV (%x. sumr m n (%n. f n x)) x :> sumr m n (%r. f' r x)"
   457 apply (induct "n")
   458 apply (auto intro: DERIV_add)
   459 done
   460 
   461 ML
   462 {*
   463 val sumr_Suc = thm"sumr_Suc";
   464 val sums_def = thm"sums_def";
   465 val summable_def = thm"summable_def";
   466 val suminf_def = thm"suminf_def";
   467 
   468 val sumr_add = thm "sumr_add";
   469 val sumr_mult = thm "sumr_mult";
   470 val sumr_split_add = thm "sumr_split_add";
   471 val sumr_rabs = thm "sumr_rabs";
   472 val sumr_fun_eq = thm "sumr_fun_eq";
   473 val sumr_diff_mult_const = thm "sumr_diff_mult_const";
   474 val sumr_minus_one_realpow_zero = thm "sumr_minus_one_realpow_zero";
   475 val sumr_le2 = thm "sumr_le2";
   476 val rabs_sumr_rabs_cancel = thm "rabs_sumr_rabs_cancel";
   477 val sumr_zero = thm "sumr_zero";
   478 val Suc_le_imp_diff_ge2 = thm "Suc_le_imp_diff_ge2";
   479 val sumr_one_lb_realpow_zero = thm "sumr_one_lb_realpow_zero";
   480 val sumr_diff = thm "sumr_diff";
   481 val sumr_subst = thm "sumr_subst";
   482 val sumr_bound = thm "sumr_bound";
   483 val sumr_bound2 = thm "sumr_bound2";
   484 val sumr_group = thm "sumr_group";
   485 val sums_summable = thm "sums_summable";
   486 val summable_sums = thm "summable_sums";
   487 val summable_sumr_LIMSEQ_suminf = thm "summable_sumr_LIMSEQ_suminf";
   488 val sums_unique = thm "sums_unique";
   489 val series_zero = thm "series_zero";
   490 val sums_mult = thm "sums_mult";
   491 val sums_divide = thm "sums_divide";
   492 val sums_diff = thm "sums_diff";
   493 val suminf_mult = thm "suminf_mult";
   494 val suminf_mult2 = thm "suminf_mult2";
   495 val suminf_diff = thm "suminf_diff";
   496 val sums_minus = thm "sums_minus";
   497 val sums_group = thm "sums_group";
   498 val sumr_pos_lt_pair_lemma = thm "sumr_pos_lt_pair_lemma";
   499 val sumr_pos_lt_pair = thm "sumr_pos_lt_pair";
   500 val series_pos_le = thm "series_pos_le";
   501 val series_pos_less = thm "series_pos_less";
   502 val sumr_geometric = thm "sumr_geometric";
   503 val geometric_sums = thm "geometric_sums";
   504 val summable_convergent_sumr_iff = thm "summable_convergent_sumr_iff";
   505 val summable_Cauchy = thm "summable_Cauchy";
   506 val summable_comparison_test = thm "summable_comparison_test";
   507 val summable_rabs_comparison_test = thm "summable_rabs_comparison_test";
   508 val summable_le = thm "summable_le";
   509 val summable_le2 = thm "summable_le2";
   510 val summable_rabs_cancel = thm "summable_rabs_cancel";
   511 val summable_rabs = thm "summable_rabs";
   512 val rabs_ratiotest_lemma = thm "rabs_ratiotest_lemma";
   513 val le_Suc_ex = thm "le_Suc_ex";
   514 val le_Suc_ex_iff = thm "le_Suc_ex_iff";
   515 val ratio_test_lemma2 = thm "ratio_test_lemma2";
   516 val ratio_test = thm "ratio_test";
   517 val DERIV_sumr = thm "DERIV_sumr";
   518 *}
   519 
   520 end