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 |