src/HOL/Real/Hyperreal/Series.ML
changeset 10607 352f6f209775
parent 10558 09a91221ced1
child 10663 fb08faea465d
equal deleted inserted replaced
10606:e3229a37d53f 10607:352f6f209775
   436 Goalw [real_diff_def] "x ~= y ==> x - y ~= (#0::real)";
   436 Goalw [real_diff_def] "x ~= y ==> x - y ~= (#0::real)";
   437 by (asm_full_simp_tac (simpset() addsimps 
   437 by (asm_full_simp_tac (simpset() addsimps 
   438    [rename_numerals (real_eq_minus_iff2 RS sym)]) 1);
   438    [rename_numerals (real_eq_minus_iff2 RS sym)]) 1);
   439 qed "real_not_eq_diff";
   439 qed "real_not_eq_diff";
   440 
   440 
   441 Goal "x ~= #1 ==> sumr 0 n (%n. x ^ n) = (x ^ n - #1) * rinv(x - #1)";
   441 Goal "x ~= #1 ==> sumr 0 n (%n. x ^ n) = (x ^ n - #1) * inverse(x - #1)";
   442 by (induct_tac "n" 1);
   442 by (induct_tac "n" 1);
   443 by (Auto_tac);
   443 by (Auto_tac);
   444 by (res_inst_tac [("c1","x - #1")] (real_mult_right_cancel RS iffD1) 1);
   444 by (res_inst_tac [("c1","x - #1")] (real_mult_right_cancel RS iffD1) 1);
   445 by (auto_tac (claset(),simpset() addsimps [real_not_eq_diff,
   445 by (auto_tac (claset(),simpset() addsimps [real_not_eq_diff,
   446     real_eq_minus_iff2 RS sym,real_mult_assoc,real_add_mult_distrib]));
   446     real_eq_minus_iff2 RS sym,real_mult_assoc,real_add_mult_distrib]));
   447 by (asm_full_simp_tac (simpset() addsimps [real_add_mult_distrib2,
   447 by (asm_full_simp_tac (simpset() addsimps [real_add_mult_distrib2,
   448     real_diff_def,real_mult_commute]) 1);
   448     real_diff_def,real_mult_commute]) 1);
   449 qed "sumr_geometric";
   449 qed "sumr_geometric";
   450 
   450 
   451 Goal "abs(x) < #1 ==> (%n. x ^ n) sums rinv(#1 - x)";
   451 Goal "abs(x) < #1 ==> (%n. x ^ n) sums inverse(#1 - x)";
   452 by (case_tac "x = #1" 1);
   452 by (case_tac "x = #1" 1);
   453 by (auto_tac (claset() addSDs [LIMSEQ_rabs_realpow_zero2],
   453 by (auto_tac (claset() addSDs [LIMSEQ_rabs_realpow_zero2],
   454     simpset() addsimps [sumr_geometric,abs_one,sums_def,
   454     simpset() addsimps [sumr_geometric,abs_one,sums_def,
   455     real_diff_def,real_add_mult_distrib]));
   455     real_diff_def,real_add_mult_distrib]));
   456 by (rtac (real_add_zero_left RS subst) 1);
   456 by (rtac (real_add_zero_left RS subst) 1);
   457 by (rtac (real_mult_0 RS subst) 1);
   457 by (rtac (real_mult_0 RS subst) 1);
   458 by (rtac LIMSEQ_add 1 THEN rtac LIMSEQ_mult 1);
   458 by (rtac LIMSEQ_add 1 THEN rtac LIMSEQ_mult 1);
   459 by (dtac real_not_eq_diff 3);
   459 by (dtac real_not_eq_diff 3);
   460 by (auto_tac (claset() addIs [LIMSEQ_const], simpset() addsimps 
   460 by (auto_tac (claset() addIs [LIMSEQ_const], simpset() addsimps 
   461     [real_minus_rinv RS sym,real_diff_def,real_add_commute,
   461     [real_minus_inverse RS sym,real_diff_def,real_add_commute,
   462      rename_numerals LIMSEQ_rabs_realpow_zero2]));
   462      rename_numerals LIMSEQ_rabs_realpow_zero2]));
   463 qed "geometric_sums";
   463 qed "geometric_sums";
   464 
   464 
   465 (*-------------------------------------------------------------------
   465 (*-------------------------------------------------------------------
   466     Cauchy-type criterion for convergence of series (c.f. Harrison)
   466     Cauchy-type criterion for convergence of series (c.f. Harrison)
   568 by (dtac real_le_trans 1 THEN assume_tac 1);
   568 by (dtac real_le_trans 1 THEN assume_tac 1);
   569 by (TRYALL(arith_tac));
   569 by (TRYALL(arith_tac));
   570 qed "rabs_ratiotest_lemma";
   570 qed "rabs_ratiotest_lemma";
   571 
   571 
   572 (* lemmas *)
   572 (* lemmas *)
   573 Goal "#0 < r ==> (x * r ^ n) * rinv (r ^ n) = x";
   573 Goal "#0 < (r::real) ==> (x * r ^ n) * inverse (r ^ n) = x";
   574 by (auto_tac (claset(),simpset() addsimps 
   574 by (auto_tac (claset(),simpset() addsimps 
   575     [real_mult_assoc,rename_numerals realpow_not_zero]));
   575     [real_mult_assoc,rename_numerals realpow_not_zero]));
   576 val lemma_rinv_realpow = result();
   576 val lemma_inverse_realpow = result();
   577 
   577 
   578 Goal "[| c ~= #0; ALL n. N <= n --> abs(f(Suc n)) <= c*abs(f n) |] \
   578 Goal "[| (c::real) ~= #0; ALL n. N <= n --> abs(f(Suc n)) <= c*abs(f n) |] \
   579 \  ==> ALL n. N <= n --> abs(f(Suc n)) <= (c * c ^ n)* (rinv(c ^ n)*abs(f n))";
   579 \  ==> ALL n. N <= n --> abs(f(Suc n)) <= (c * c ^ n)* (inverse(c ^ n)*abs(f n))";
   580 by (auto_tac (claset(),simpset() addsimps real_mult_ac));
   580 by (auto_tac (claset(),simpset() addsimps real_mult_ac));
   581 by (res_inst_tac [("z2.1","c ^ n")] (real_mult_left_commute RS subst) 1);
   581 by (res_inst_tac [("z2.1","c ^ n")] (real_mult_left_commute RS subst) 1);
   582 by (auto_tac (claset(),simpset() addsimps [rename_numerals  
   582 by (auto_tac (claset(),simpset() addsimps [rename_numerals  
   583     realpow_not_zero]));
   583     realpow_not_zero]));
   584 val lemma_rinv_realpow2 = result();
   584 val lemma_inverse_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_imp_Suc_add], simpset()));
   588 by (auto_tac (claset() addDs [less_imp_Suc_add], simpset()));
   589 qed "le_Suc_ex";
   589 qed "le_Suc_ex";
   598 by (asm_full_simp_tac (simpset() addsimps [summable_Cauchy]) 1);
   598 by (asm_full_simp_tac (simpset() addsimps [summable_Cauchy]) 1);
   599 by (Step_tac 1 THEN subgoal_tac "ALL n. N <= n --> f (Suc n) = #0" 1);
   599 by (Step_tac 1 THEN subgoal_tac "ALL n. N <= n --> f (Suc n) = #0" 1);
   600 by (blast_tac (claset() addIs [rabs_ratiotest_lemma]) 2);
   600 by (blast_tac (claset() addIs [rabs_ratiotest_lemma]) 2);
   601 by (res_inst_tac [("x","Suc N")] exI 1 THEN Step_tac 1);
   601 by (res_inst_tac [("x","Suc N")] exI 1 THEN Step_tac 1);
   602 by (dtac Suc_le_imp_diff_ge2 1 THEN Auto_tac);
   602 by (dtac Suc_le_imp_diff_ge2 1 THEN Auto_tac);
   603 by (res_inst_tac [("g","%n. (abs (f N)* rinv(c ^ N))*c ^ n")] 
   603 by (res_inst_tac [("g","%n. (abs (f N)* inverse(c ^ N))*c ^ n")] 
   604     summable_comparison_test 1);
   604     summable_comparison_test 1);
   605 by (res_inst_tac [("x","N")] exI 1 THEN Step_tac 1);
   605 by (res_inst_tac [("x","N")] exI 1 THEN Step_tac 1);
   606 by (dtac (le_Suc_ex_iff RS iffD1) 1);
   606 by (dtac (le_Suc_ex_iff RS iffD1) 1);
   607 by (auto_tac (claset(),simpset() addsimps [realpow_add,
   607 by (auto_tac (claset(),simpset() addsimps [realpow_add,
   608     CLAIM_SIMP "(a * b) * (c * d) = (a * d) * (b * (c::real))" real_mult_ac,
   608     CLAIM_SIMP "(a * b) * (c * d) = (a * d) * (b * (c::real))" real_mult_ac,
   610 by (induct_tac "na" 1 THEN Auto_tac);
   610 by (induct_tac "na" 1 THEN Auto_tac);
   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)*inverse(c ^ N))*inverse(#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