src/HOL/Real/Hyperreal/Series.ML
changeset 10558 09a91221ced1
parent 10214 77349ed89f45
child 10607 352f6f209775
equal deleted inserted replaced
10557:dc615fccc1e6 10558:09a91221ced1
    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);
    95 qed "sumr_minus";
    95 qed "sumr_minus";
    96 
    96 
    97 context NatArith.thy;
    97 context NatArith.thy;
    98 
    98 
    99 Goal "!!n. ~ Suc n <= m + k ==> ~ Suc n <= m";
    99 Goal "!!n. ~ Suc n <= m + k ==> ~ Suc n <= m";
   100 by (auto_tac (claset() addSDs [not_leE],simpset()));
   100 by (auto_tac (claset() addSDs [not_leE], simpset()));
   101 qed "lemma_not_Suc_add";
   101 qed "lemma_not_Suc_add";
   102 
   102 
   103 context thy;
   103 context thy;
   104 
   104 
   105 Goal "sumr (m+k) (n+k) f = sumr m n (%i. f(i + k))";
   105 Goal "sumr (m+k) (n+k) f = sumr m n (%i. f(i + k))";
   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