41 qed "sumr_mult"; |
41 qed "sumr_mult"; |
42 |
42 |
43 Goal "n < p --> sumr 0 n f + sumr n p f = sumr 0 p f"; |
43 Goal "n < p --> sumr 0 n f + sumr n p f = sumr 0 p f"; |
44 by (induct_tac "p" 1); |
44 by (induct_tac "p" 1); |
45 by (auto_tac (claset() addSDs [CLAIM "n < Suc na ==> n <= na", |
45 by (auto_tac (claset() addSDs [CLAIM "n < Suc na ==> n <= na", |
46 leI] addDs [le_anti_sym],simpset())); |
46 leI] addDs [le_anti_sym], simpset())); |
47 qed_spec_mp "sumr_split_add"; |
47 qed_spec_mp "sumr_split_add"; |
48 |
48 |
49 Goal "!!n. n < p ==> sumr 0 p f + \ |
49 Goal "!!n. n < p ==> sumr 0 p f + \ |
50 \ - sumr 0 n f = sumr n p f"; |
50 \ - sumr 0 n f = sumr n p f"; |
51 by (dres_inst_tac [("f1","f")] (sumr_split_add RS sym) 1); |
51 by (dres_inst_tac [("f1","f")] (sumr_split_add RS sym) 1); |
53 qed "sumr_split_add_minus"; |
53 qed "sumr_split_add_minus"; |
54 |
54 |
55 Goal "abs(sumr m n f) <= sumr m n (%i. abs(f i))"; |
55 Goal "abs(sumr m n f) <= sumr m n (%i. abs(f i))"; |
56 by (induct_tac "n" 1); |
56 by (induct_tac "n" 1); |
57 by (auto_tac (claset() addIs [(abs_triangle_ineq |
57 by (auto_tac (claset() addIs [(abs_triangle_ineq |
58 RS real_le_trans),real_add_le_mono1],simpset())); |
58 RS real_le_trans),real_add_le_mono1], simpset())); |
59 qed "sumr_rabs"; |
59 qed "sumr_rabs"; |
60 |
60 |
61 Goal "!!f g. (ALL r. m <= r & r < n --> f r = g r) \ |
61 Goal "!!f g. (ALL r. m <= r & r < n --> f r = g r) \ |
62 \ --> sumr m n f = sumr m n g"; |
62 \ --> sumr m n f = sumr m n g"; |
63 by (induct_tac "n" 1); |
63 by (induct_tac "n" 1); |
81 by (full_simp_tac (simpset() addsimps [sumr_add_mult_const]) 1); |
81 by (full_simp_tac (simpset() addsimps [sumr_add_mult_const]) 1); |
82 qed "sumr_diff_mult_const"; |
82 qed "sumr_diff_mult_const"; |
83 |
83 |
84 Goal "n < m --> sumr m n f = #0"; |
84 Goal "n < m --> sumr m n f = #0"; |
85 by (induct_tac "n" 1); |
85 by (induct_tac "n" 1); |
86 by (auto_tac (claset() addDs [less_imp_le],simpset())); |
86 by (auto_tac (claset() addDs [less_imp_le], simpset())); |
87 qed_spec_mp "sumr_less_bounds_zero"; |
87 qed_spec_mp "sumr_less_bounds_zero"; |
88 Addsimps [sumr_less_bounds_zero]; |
88 Addsimps [sumr_less_bounds_zero]; |
89 |
89 |
90 Goal "sumr m n (%i. - f i) = - sumr m n f"; |
90 Goal "sumr m n (%i. - f i) = - sumr m n f"; |
91 by (induct_tac "n" 1); |
91 by (induct_tac "n" 1); |
118 by (Auto_tac); |
118 by (Auto_tac); |
119 qed "sumr_minus_one_realpow_zero2"; |
119 qed "sumr_minus_one_realpow_zero2"; |
120 Addsimps [sumr_minus_one_realpow_zero2]; |
120 Addsimps [sumr_minus_one_realpow_zero2]; |
121 |
121 |
122 Goal "m < Suc n ==> Suc n - m = Suc (n - m)"; |
122 Goal "m < Suc n ==> Suc n - m = Suc (n - m)"; |
123 by (dtac less_eq_Suc_add 1); |
123 by (dtac less_imp_Suc_add 1); |
124 by (Auto_tac); |
124 by (Auto_tac); |
125 val Suc_diff_n = result(); |
125 val Suc_diff_n = result(); |
126 |
126 |
127 Goal "(ALL n. m <= Suc n --> f n = r) & m <= na \ |
127 Goal "(ALL n. m <= Suc n --> f n = r) & m <= na \ |
128 \ --> sumr m na f = (real_of_nat (na - m) * r)"; |
128 \ --> sumr m na f = (real_of_nat (na - m) * r)"; |
183 qed_spec_mp "sumr_ge_zero"; |
183 qed_spec_mp "sumr_ge_zero"; |
184 |
184 |
185 Goal "(ALL n. m <= n --> #0 <= f n) --> #0 <= sumr m n f"; |
185 Goal "(ALL n. m <= n --> #0 <= f n) --> #0 <= sumr m n f"; |
186 by (induct_tac "n" 1); |
186 by (induct_tac "n" 1); |
187 by (auto_tac (claset() addIs [rename_numerals real_le_add_order] |
187 by (auto_tac (claset() addIs [rename_numerals real_le_add_order] |
188 addDs [leI],simpset())); |
188 addDs [leI], simpset())); |
189 qed_spec_mp "sumr_ge_zero2"; |
189 qed_spec_mp "sumr_ge_zero2"; |
190 |
190 |
191 Goal "#0 <= sumr m n (%n. abs (f n))"; |
191 Goal "#0 <= sumr m n (%n. abs (f n))"; |
192 by (induct_tac "n" 1); |
192 by (induct_tac "n" 1); |
193 by (auto_tac (claset() addSIs [rename_numerals real_le_add_order, |
193 by (auto_tac (claset() addSIs [rename_numerals real_le_add_order, |
194 abs_ge_zero],simpset())); |
194 abs_ge_zero], simpset())); |
195 qed "sumr_rabs_ge_zero"; |
195 qed "sumr_rabs_ge_zero"; |
196 Addsimps [sumr_rabs_ge_zero]; |
196 Addsimps [sumr_rabs_ge_zero]; |
197 AddSIs [sumr_rabs_ge_zero]; |
197 AddSIs [sumr_rabs_ge_zero]; |
198 |
198 |
199 Goal "abs (sumr m n (%n. abs (f n))) = (sumr m n (%n. abs (f n)))"; |
199 Goal "abs (sumr m n (%n. abs (f n))) = (sumr m n (%n. abs (f n)))"; |
348 simpset())); |
348 simpset())); |
349 qed "suminf_mult2"; |
349 qed "suminf_mult2"; |
350 |
350 |
351 Goal "[| summable f; summable g |] \ |
351 Goal "[| summable f; summable g |] \ |
352 \ ==> suminf f - suminf g = suminf(%n. f n - g n)"; |
352 \ ==> suminf f - suminf g = suminf(%n. f n - g n)"; |
353 by (auto_tac (claset() addSIs [sums_diff,sums_unique,summable_sums],simpset())); |
353 by (auto_tac (claset() addSIs [sums_diff,sums_unique,summable_sums], simpset())); |
354 qed "suminf_diff"; |
354 qed "suminf_diff"; |
355 |
355 |
356 goalw Series.thy [sums_def] |
356 goalw Series.thy [sums_def] |
357 "!!x. x sums x0 ==> (%n. - x n) sums - x0"; |
357 "!!x. x sums x0 ==> (%n. - x n) sums - x0"; |
358 by (auto_tac (claset() addSIs [LIMSEQ_minus],simpset() addsimps [sumr_minus])); |
358 by (auto_tac (claset() addSIs [LIMSEQ_minus], simpset() addsimps [sumr_minus])); |
359 qed "sums_minus"; |
359 qed "sums_minus"; |
360 |
360 |
361 Goal "[|summable f; 0 < k |] \ |
361 Goal "[|summable f; 0 < k |] \ |
362 \ ==> (%n. sumr (n*k) (n*k + k) f) sums (suminf f)"; |
362 \ ==> (%n. sumr (n*k) (n*k + k) f) sums (suminf f)"; |
363 by (dtac summable_sums 1); |
363 by (dtac summable_sums 1); |
364 by (auto_tac (claset(),simpset() addsimps [sums_def,LIMSEQ_def])); |
364 by (auto_tac (claset(),simpset() addsimps [sums_def,LIMSEQ_def])); |
365 by (dres_inst_tac [("x","r")] spec 1 THEN Step_tac 1); |
365 by (dres_inst_tac [("x","r")] spec 1 THEN Step_tac 1); |
366 by (res_inst_tac [("x","no")] exI 1 THEN Step_tac 1); |
366 by (res_inst_tac [("x","no")] exI 1 THEN Step_tac 1); |
367 by (dres_inst_tac [("x","n*k")] spec 1); |
367 by (dres_inst_tac [("x","n*k")] spec 1); |
368 by (auto_tac (claset() addSDs [not_leE],simpset())); |
368 by (auto_tac (claset() addSDs [not_leE], simpset())); |
369 by (dres_inst_tac [("j","no")] less_le_trans 1); |
369 by (dres_inst_tac [("j","no")] less_le_trans 1); |
370 by (Auto_tac); |
370 by (Auto_tac); |
371 qed "sums_group"; |
371 qed "sums_group"; |
372 |
372 |
373 Goal "[|summable f; ALL d. #0 < (f(n + (2 * d))) + f(n + ((2 * d) + 1))|] \ |
373 Goal "[|summable f; ALL d. #0 < (f(n + (2 * d))) + f(n + ((2 * d) + 1))|] \ |
414 by (rewtac sums_def); |
414 by (rewtac sums_def); |
415 by (cut_inst_tac [("k","sumr 0 n f")] LIMSEQ_const 1); |
415 by (cut_inst_tac [("k","sumr 0 n f")] LIMSEQ_const 1); |
416 by (etac LIMSEQ_le 1 THEN Step_tac 1); |
416 by (etac LIMSEQ_le 1 THEN Step_tac 1); |
417 by (res_inst_tac [("x","n")] exI 1 THEN Step_tac 1); |
417 by (res_inst_tac [("x","n")] exI 1 THEN Step_tac 1); |
418 by (dtac le_imp_less_or_eq 1 THEN Step_tac 1); |
418 by (dtac le_imp_less_or_eq 1 THEN Step_tac 1); |
419 by (auto_tac (claset() addIs [sumr_le],simpset())); |
419 by (auto_tac (claset() addIs [sumr_le], simpset())); |
420 qed "series_pos_le"; |
420 qed "series_pos_le"; |
421 |
421 |
422 Goal "!!f. [| summable f; ALL m. n <= m --> #0 < f(m) |] \ |
422 Goal "!!f. [| summable f; ALL m. n <= m --> #0 < f(m) |] \ |
423 \ ==> sumr 0 n f < suminf f"; |
423 \ ==> sumr 0 n f < suminf f"; |
424 by (res_inst_tac [("j","sumr 0 (Suc n) f")] real_less_le_trans 1); |
424 by (res_inst_tac [("j","sumr 0 (Suc n) f")] real_less_le_trans 1); |
522 (* Limit comparison property for series (c.f. jrh) *) |
522 (* Limit comparison property for series (c.f. jrh) *) |
523 (*------------------------------------------------------------------*) |
523 (*------------------------------------------------------------------*) |
524 Goal "[|ALL n. f n <= g n; summable f; summable g |] \ |
524 Goal "[|ALL n. f n <= g n; summable f; summable g |] \ |
525 \ ==> suminf f <= suminf g"; |
525 \ ==> suminf f <= suminf g"; |
526 by (REPEAT(dtac summable_sums 1)); |
526 by (REPEAT(dtac summable_sums 1)); |
527 by (auto_tac (claset() addSIs [LIMSEQ_le],simpset() addsimps [sums_def])); |
527 by (auto_tac (claset() addSIs [LIMSEQ_le], simpset() addsimps [sums_def])); |
528 by (rtac exI 1); |
528 by (rtac exI 1); |
529 by (auto_tac (claset() addSIs [sumr_le2],simpset())); |
529 by (auto_tac (claset() addSIs [sumr_le2], simpset())); |
530 qed "summable_le"; |
530 qed "summable_le"; |
531 |
531 |
532 Goal "[|ALL n. abs(f n) <= g n; summable g |] \ |
532 Goal "[|ALL n. abs(f n) <= g n; summable g |] \ |
533 \ ==> summable f & suminf f <= suminf g"; |
533 \ ==> summable f & suminf f <= suminf g"; |
534 by (auto_tac (claset() addIs [summable_comparison_test] |
534 by (auto_tac (claset() addIs [summable_comparison_test] |
535 addSIs [summable_le],simpset())); |
535 addSIs [summable_le], simpset())); |
536 by (auto_tac (claset(),simpset() addsimps [abs_le_interval_iff])); |
536 by (auto_tac (claset(),simpset() addsimps [abs_le_interval_iff])); |
537 qed "summable_le2"; |
537 qed "summable_le2"; |
538 |
538 |
539 (*------------------------------------------------------------------- |
539 (*------------------------------------------------------------------- |
540 Absolute convergence imples normal convergence |
540 Absolute convergence imples normal convergence |
543 by (auto_tac (claset(),simpset() addsimps [sumr_rabs,summable_Cauchy])); |
543 by (auto_tac (claset(),simpset() addsimps [sumr_rabs,summable_Cauchy])); |
544 by (dtac spec 1 THEN Auto_tac); |
544 by (dtac spec 1 THEN Auto_tac); |
545 by (res_inst_tac [("x","N")] exI 1 THEN Auto_tac); |
545 by (res_inst_tac [("x","N")] exI 1 THEN Auto_tac); |
546 by (dtac spec 1 THEN Auto_tac); |
546 by (dtac spec 1 THEN Auto_tac); |
547 by (res_inst_tac [("j","sumr m n (%n. abs(f n))")] real_le_less_trans 1); |
547 by (res_inst_tac [("j","sumr m n (%n. abs(f n))")] real_le_less_trans 1); |
548 by (auto_tac (claset() addIs [sumr_rabs],simpset())); |
548 by (auto_tac (claset() addIs [sumr_rabs], simpset())); |
549 qed "summable_rabs_cancel"; |
549 qed "summable_rabs_cancel"; |
550 |
550 |
551 (*------------------------------------------------------------------- |
551 (*------------------------------------------------------------------- |
552 Absolute convergence of series |
552 Absolute convergence of series |
553 -------------------------------------------------------------------*) |
553 -------------------------------------------------------------------*) |
554 Goal "summable (%n. abs (f n)) ==> abs(suminf f) <= suminf (%n. abs(f n))"; |
554 Goal "summable (%n. abs (f n)) ==> abs(suminf f) <= suminf (%n. abs(f n))"; |
555 by (auto_tac (claset() addIs [LIMSEQ_le,LIMSEQ_imp_rabs,summable_rabs_cancel, |
555 by (auto_tac (claset() addIs [LIMSEQ_le,LIMSEQ_imp_rabs,summable_rabs_cancel, |
556 summable_sumr_LIMSEQ_suminf,sumr_rabs],simpset())); |
556 summable_sumr_LIMSEQ_suminf,sumr_rabs], simpset())); |
557 qed "summable_rabs"; |
557 qed "summable_rabs"; |
558 |
558 |
559 (*------------------------------------------------------------------- |
559 (*------------------------------------------------------------------- |
560 The ratio test |
560 The ratio test |
561 -------------------------------------------------------------------*) |
561 -------------------------------------------------------------------*) |
583 realpow_not_zero])); |
583 realpow_not_zero])); |
584 val lemma_rinv_realpow2 = result(); |
584 val lemma_rinv_realpow2 = result(); |
585 |
585 |
586 Goal "(k::nat) <= l ==> (EX n. l = k + n)"; |
586 Goal "(k::nat) <= l ==> (EX n. l = k + n)"; |
587 by (dtac le_imp_less_or_eq 1); |
587 by (dtac le_imp_less_or_eq 1); |
588 by (auto_tac (claset() addDs [less_eq_Suc_add],simpset())); |
588 by (auto_tac (claset() addDs [less_imp_Suc_add], simpset())); |
589 qed "le_Suc_ex"; |
589 qed "le_Suc_ex"; |
590 |
590 |
591 Goal "((k::nat) <= l) = (EX n. l = k + n)"; |
591 Goal "((k::nat) <= l) = (EX n. l = k + n)"; |
592 by (auto_tac (claset(),simpset() addsimps [le_Suc_ex])); |
592 by (auto_tac (claset(),simpset() addsimps [le_Suc_ex])); |
593 qed "le_Suc_ex_iff"; |
593 qed "le_Suc_ex_iff"; |
611 by (res_inst_tac [("j","c*abs(f(N + n))")] real_le_trans 1); |
611 by (res_inst_tac [("j","c*abs(f(N + n))")] real_le_trans 1); |
612 by (auto_tac (claset() addIs [real_mult_le_le_mono1], |
612 by (auto_tac (claset() addIs [real_mult_le_le_mono1], |
613 simpset() addsimps [summable_def, CLAIM_SIMP |
613 simpset() addsimps [summable_def, CLAIM_SIMP |
614 "a * (b * c) = b * (a * (c::real))" real_mult_ac])); |
614 "a * (b * c) = b * (a * (c::real))" real_mult_ac])); |
615 by (res_inst_tac [("x","(abs(f N)*rinv(c ^ N))*rinv(#1 - c)")] exI 1); |
615 by (res_inst_tac [("x","(abs(f N)*rinv(c ^ N))*rinv(#1 - c)")] exI 1); |
616 by (auto_tac (claset() addSIs [sums_mult,geometric_sums],simpset() addsimps |
616 by (auto_tac (claset() addSIs [sums_mult,geometric_sums], simpset() addsimps |
617 [abs_eqI2])); |
617 [abs_eqI2])); |
618 qed "ratio_test"; |
618 qed "ratio_test"; |
619 |
619 |
620 |
620 |
621 (*----------------------------------------------------------------------------*) |
621 (*----------------------------------------------------------------------------*) |
623 (*----------------------------------------------------------------------------*) |
623 (*----------------------------------------------------------------------------*) |
624 |
624 |
625 Goal "(ALL r. m <= r & r < (m + n) --> DERIV (%x. f r x) x :> (f' r x)) \ |
625 Goal "(ALL r. m <= r & r < (m + n) --> DERIV (%x. f r x) x :> (f' r x)) \ |
626 \ --> DERIV (%x. sumr m n (%n. f n x)) x :> sumr m n (%r. f' r x)"; |
626 \ --> DERIV (%x. sumr m n (%n. f n x)) x :> sumr m n (%r. f' r x)"; |
627 by (induct_tac "n" 1); |
627 by (induct_tac "n" 1); |
628 by (auto_tac (claset() addIs [DERIV_add],simpset())); |
628 by (auto_tac (claset() addIs [DERIV_add], simpset())); |
629 qed "DERIV_sumr"; |
629 qed "DERIV_sumr"; |
630 |
630 |
631 |
631 |
632 |
632 |
633 |
633 |