# HG changeset patch # User huffman # Date 1159897234 -7200 # Node ID 389cd9c8cfe15b6cc515cee1b37df565f01540ec # Parent 27a09c3eca1f6d5c1a89e41f4a988daac221205a rewrite proofs of powser_insidea and termdiffs_aux diff -r 27a09c3eca1f -r 389cd9c8cfe1 src/HOL/Hyperreal/Transcendental.thy --- a/src/HOL/Hyperreal/Transcendental.thy Mon Oct 02 23:15:35 2006 +0200 +++ b/src/HOL/Hyperreal/Transcendental.thy Tue Oct 03 19:40:34 2006 +0200 @@ -46,7 +46,6 @@ "arctan y = (SOME x. -(pi/2) < x & x < pi/2 & tan x = y)" - subsection{*Exponential Function*} lemma summable_exp: "summable (%n. inverse (real (fact n)) * x ^ n)" @@ -54,13 +53,13 @@ apply (cut_tac x = r in reals_Archimedean3, auto) apply (drule_tac x = "\x\" in spec, safe) apply (rule_tac N = n and c = r in ratio_test) -apply (auto simp add: abs_mult mult_assoc [symmetric] simp del: fact_Suc) +apply (safe, simp add: abs_mult mult_assoc [symmetric] del: fact_Suc) apply (rule mult_right_mono) apply (rule_tac b1 = "\x\" in mult_commute [THEN ssubst]) apply (subst fact_Suc) apply (subst real_of_nat_mult) apply (auto) -apply (auto simp add: mult_assoc [symmetric] positive_imp_inverse_positive) +apply (simp add: mult_assoc [symmetric] positive_imp_inverse_positive) apply (rule order_less_imp_le) apply (rule_tac z1 = "real (Suc na)" in real_mult_less_iff1 [THEN iffD1]) apply (auto simp add: real_not_refl2 [THEN not_sym] mult_assoc) @@ -176,45 +175,59 @@ x}, then it sums absolutely for @{term z} with @{term "\z\ < \x\"}.*} lemma powser_insidea: - fixes f :: "nat \ real" - shows - "[| summable (%n. f(n) * (x ^ n)); \z\ < \x\ |] - ==> summable (%n. \f(n)\ * (z ^ n))" -apply (drule summable_LIMSEQ_zero) -apply (drule convergentI) -apply (simp add: Cauchy_convergent_iff [symmetric]) -apply (drule Cauchy_Bseq) -apply (simp add: Bseq_def, safe) -apply (rule_tac g = "%n. K * \z ^ n\ * inverse (\x ^ n\)" in summable_comparison_test) -apply (rule_tac x = 0 in exI, safe) -apply (subgoal_tac "0 < \x ^ n\ ") -apply (rule_tac c="\x ^ n\" in mult_right_le_imp_le) -apply (auto simp add: mult_assoc power_abs abs_mult) - prefer 2 - apply (drule_tac x = 0 in spec, force) -apply (auto simp add: power_abs mult_ac) -apply (rule_tac a2 = "z ^ n" - in abs_ge_zero [THEN real_le_imp_less_or_eq, THEN disjE]) -apply (auto intro!: mult_right_mono simp add: mult_assoc [symmetric] power_abs summable_def power_0_left) -apply (rule_tac x = "K * inverse (1 - (\z\ * inverse (\x\)))" in exI) -apply (auto intro!: sums_mult simp add: mult_assoc) -apply (subgoal_tac "\z ^ n\ * inverse (\x\ ^ n) = (\z\ * inverse (\x\)) ^ n") -apply (auto simp add: power_abs [symmetric]) -apply (subgoal_tac "x \ 0") -apply (subgoal_tac [3] "x \ 0") -apply (auto simp del: abs_inverse - simp add: abs_inverse [symmetric] realpow_not_zero - abs_mult [symmetric] power_inverse power_mult_distrib [symmetric]) -apply (auto intro!: geometric_sums simp add: power_abs inverse_eq_divide) -done + fixes x z :: real + assumes 1: "summable (\n. f n * x ^ n)" + assumes 2: "\z\ < \x\" + shows "summable (\n. \f n\ * z ^ n)" +proof - + from 2 have x_neq_0: "x \ 0" by clarsimp + from 1 have "(\n. f n * x ^ n) ----> 0" + by (rule summable_LIMSEQ_zero) + hence "convergent (\n. f n * x ^ n)" + by (rule convergentI) + hence "Cauchy (\n. f n * x ^ n)" + by (simp add: Cauchy_convergent_iff) + hence "Bseq (\n. f n * x ^ n)" + by (rule Cauchy_Bseq) + then obtain K where 3: "0 < K" and 4: "\n. \f n * x ^ n\ \ K" + by (simp add: Bseq_def, safe) + have "\N. \n\N. norm (\f n\ * z ^ n) \ K * \z ^ n\ * inverse \x ^ n\" + proof (intro exI allI impI) + fix n::nat assume "0 \ n" + have "norm (\f n\ * z ^ n) * \x ^ n\ = \f n * x ^ n\ * \z ^ n\" + by (simp add: abs_mult) + also have "\ \ K * \z ^ n\" + by (simp only: mult_right_mono 4 abs_ge_zero) + also have "\ = K * \z ^ n\ * (inverse \x ^ n\ * \x ^ n\)" + by (simp add: x_neq_0) + also have "\ = K * \z ^ n\ * inverse \x ^ n\ * \x ^ n\" + by (simp only: mult_assoc) + finally show "norm (\f n\ * z ^ n) \ K * \z ^ n\ * inverse \x ^ n\" + by (simp add: mult_le_cancel_right x_neq_0) + qed + moreover have "summable (\n. K * \z ^ n\ * inverse \x ^ n\)" + proof - + from 2 have "norm \z * inverse x\ < 1" + by (simp add: abs_mult divide_inverse [symmetric]) + hence "summable (\n. \z * inverse x\ ^ n)" + by (rule summable_geometric) + hence "summable (\n. K * \z * inverse x\ ^ n)" + by (rule summable_mult) + thus "summable (\n. K * \z ^ n\ * inverse \x ^ n\)" + by (simp add: abs_mult power_mult_distrib power_abs + power_inverse mult_assoc) + qed + ultimately show "summable (\n. \f n\ * z ^ n)" + by (rule summable_comparison_test) +qed lemma powser_inside: - fixes f :: "nat \ real" - shows + fixes f :: "nat \ real" shows "[| summable (%n. f(n) * (x ^ n)); \z\ < \x\ |] ==> summable (%n. f(n) * (z ^ n))" -apply (drule_tac z = "\z\" in powser_insidea) -apply (auto intro: summable_rabs_cancel simp add: abs_mult power_abs [symmetric]) +apply (drule_tac z = "\z\" in powser_insidea, simp) +apply (rule summable_rabs_cancel) +apply (simp add: abs_mult power_abs [symmetric]) done @@ -370,71 +383,80 @@ text{* FIXME: Long proofs*} -ML {* fast_arith_split_limit := 0; *} (* FIXME: rewrite proofs *) - lemma termdiffs_aux: - "[|summable (\n. diffs (diffs c) n * K ^ n); \x\ < \K\ |] - ==> (\h. \n. c n * + assumes 1: "summable (\n. diffs (diffs c) n * K ^ n)" + assumes 2: "\x\ < \K\" + shows "(\h. \n. c n * (((x + h) ^ n - x ^ n) * inverse h - real n * x ^ (n - Suc 0))) -- 0 --> 0" -apply (drule dense, safe) -apply (frule real_less_sum_gt_zero) -apply (drule_tac - f = "%n. \c n\ * real n * real (n - Suc 0) * (r ^ (n - 2))" - and g = "%h n. c (n) * ((( ((x + h) ^ n) - (x ^ n)) * inverse h) - - (real n * (x ^ (n - Suc 0))))" - in lemma_termdiff5) -apply (auto simp add: add_commute) -apply (subgoal_tac "summable (%n. \diffs (diffs c) n\ * (r ^ n))") -apply (rule_tac [2] x = K in powser_insidea, auto) -apply (subgoal_tac [2] "\r\ = r", auto) -apply (rule_tac [2] y1 = "\x\" in order_trans [THEN abs_of_nonneg], auto) -apply (simp add: diffs_def mult_assoc [symmetric]) -apply (subgoal_tac - "\n. real (Suc n) * real (Suc (Suc n)) * \c (Suc (Suc n))\ * (r ^ n) - = diffs (diffs (%n. \c n\)) n * (r ^ n) ") -apply (auto simp add: abs_mult) -apply (drule diffs_equiv) -apply (drule sums_summable) -apply (simp_all add: diffs_def) -apply (simp add: diffs_def mult_ac) -apply (subgoal_tac " (%n. real n * (real (Suc n) * (\c (Suc n)\ * (r ^ (n - Suc 0))))) = (%n. diffs (%m. real (m - Suc 0) * \c m\ * inverse r) n * (r ^ n))") -apply auto - prefer 2 - apply (rule ext) - apply (simp add: diffs_def) - apply (case_tac "n", auto) -txt{*23*} - apply (drule abs_ge_zero [THEN order_le_less_trans]) - apply (simp add: mult_ac) - apply (drule abs_ge_zero [THEN order_le_less_trans]) - apply (simp add: mult_ac) - apply (drule diffs_equiv) - apply (drule sums_summable) -apply (subgoal_tac - "summable - (\n. real n * (real (n - Suc 0) * \c n\ * inverse r) * +proof - + from dense [OF 2] obtain r where 3: "\x\ < r" and 4: "r < \K\" by fast + from 3 have r_neq_0: "r \ 0" by auto + show "(\h. suminf (\n. c n * (((x + h) ^ n - x ^ n) * inverse h - real n * x ^ (n - Suc 0)))) -- 0 --> 0" + proof (rule lemma_termdiff5) + show "0 < r + - \x\" using 3 by simp + next + have A: "summable (%n. \diffs (diffs c) n\ * (r ^ n))" + apply (rule powser_insidea [OF 1]) + apply (subgoal_tac "\r\ = r", erule ssubst, rule 4) + apply (rule_tac y1 = "\x\" in order_trans [THEN abs_of_nonneg]) + apply (rule abs_ge_zero) + apply (rule order_less_imp_le [OF 3]) + done + have B: "\n. real (Suc n) * real (Suc (Suc n)) * + \c (Suc (Suc n))\ * (r ^ n) = diffs (diffs (%n. \c n\)) n * (r ^ n)" + by (simp add: diffs_def mult_assoc) + have C: "(%n. real n * (real (Suc n) * (\c (Suc n)\ * (r ^ (n - Suc 0))))) + = (%n. diffs (%m. real (m - Suc 0) * \c m\ * inverse r) n * (r ^ n))" + apply (rule ext) + apply (simp add: diffs_def) + apply (case_tac n, simp_all add: r_neq_0) + done + have D: + "(\n. real n * (real (n - Suc 0) * \c n\ * inverse r) * r ^ (n - Suc 0)) = - summable - (\n. real n * (\c n\ * (real (n - Suc 0) * r ^ (n - 2))))") -apply simp -apply (rule_tac f = summable in arg_cong, rule ext) -txt{*33*} -apply (case_tac "n", auto) -apply (case_tac "nat", auto) -apply (drule abs_ge_zero [THEN order_le_less_trans], auto) -apply (drule abs_ge_zero [THEN order_le_less_trans]) -apply (simp add: mult_assoc) -apply (rule mult_left_mono) - prefer 2 apply arith -apply (subst add_commute) -apply (simp (no_asm) add: mult_assoc [symmetric]) -apply (rule lemma_termdiff3) -apply (auto intro: abs_triangle_ineq [THEN order_trans], arith) -done - -ML {* fast_arith_split_limit := 9; *} (* FIXME *) + (\n. real n * (\c n\ * (real (n - Suc 0) * r ^ (n - 2))))" + apply (rule ext) + apply (case_tac "n", simp) + apply (case_tac "nat", simp) + apply (simp add: r_neq_0) + done + show "summable (\n. \c n\ * real n * real (n - Suc 0) * r ^ (n - 2))" + apply (cut_tac A) + apply (simp add: diffs_def mult_assoc [symmetric]) + apply (simp only: abs_mult abs_real_of_nat_cancel B) + apply (drule diffs_equiv) + apply (drule sums_summable) + apply (simp only: diffs_def mult_ac) + apply (simp only: C) + apply (drule diffs_equiv) + apply (drule sums_summable) + apply (simp only: D) + done + next + show "\h. 0 < \h\ \ \h\ < r + - \x\ \ (\n. \c n * (((x + h) ^ n - x ^ n) * inverse h - real n * x ^ (n - Suc 0))\ \ \c n\ * real n * real (n - Suc 0) * r ^ (n - 2) * \h\)" + proof (clarify) + fix h::real and n::nat + assume A: "0 < \h\" and B: "\h\ < r + - \x\" + from A have C: "h \ 0" by simp + show "\c n * (((x + h) ^ n - x ^ n) * inverse h - real n * x ^ (n - Suc 0))\ \ \c n\ * real n * real (n - Suc 0) * r ^ (n - 2) * \h\" + apply (cut_tac 3 B C) + apply (subst abs_mult) + apply (drule abs_ge_zero [THEN order_le_less_trans]) + apply (simp only: mult_assoc) + apply (rule mult_left_mono) + prefer 2 apply arith + apply (simp (no_asm) add: mult_assoc [symmetric]) + apply (rule lemma_termdiff3) + apply assumption + apply (rule 3 [THEN order_less_imp_le]) + apply (rule abs_triangle_ineq [THEN order_trans]) + apply arith + done + qed + qed +qed lemma termdiffs: "[| summable(%n. c(n) * (K ^ n));