# HG changeset patch # User bulwahn # Date 1292398441 -3600 # Node ID 74e41b2d48eaa325b4eeb33a4d21fee659258e43 # Parent 573f557ed716accf87c47828a89772762d7c70e4 adding an Isar version of the MacLaurin theorem from some students' work in 2005 diff -r 573f557ed716 -r 74e41b2d48ea src/HOL/MacLaurin.thy --- a/src/HOL/MacLaurin.thy Tue Dec 14 00:16:30 2010 +0100 +++ b/src/HOL/MacLaurin.thy Wed Dec 15 08:34:01 2010 +0100 @@ -1,6 +1,7 @@ (* Author : Jacques D. Fleuriot Copyright : 2001 University of Edinburgh Conversion to Isar and new proofs by Lawrence C Paulson, 2004 + Conversion of Mac Laurin to Isar by Lukas Bulwahn and Bernhard Häupler, 2005 *) header{*MacLaurin Series*} @@ -18,11 +19,9 @@ "0 < h ==> \B. f h = (\m=0..m=0..m t. m < n \ 0\t \ t\h \ DERIV (diff m) t :> diff (Suc m) t" - assumes n: "n = Suc k" - assumes difg: "difg = - (\m t. diff m t - - ((\p = 0..m t. m < n & 0 \ t & t \ h --> DERIV (difg m) t :> difg (Suc m) t" -unfolding difg - apply clarify - apply (rule DERIV_diff) - apply (simp add: diff) - apply (simp only: n) - apply (rule DERIV_add) - apply (rule_tac [2] DERIV_cmult) - apply (rule_tac [2] lemma_DERIV_subst) - apply (rule_tac [2] DERIV_quotient) - apply (rule_tac [3] DERIV_const) - apply (rule_tac [2] DERIV_pow) - prefer 3 + assumes DERIV : "\m t. m < n \ 0\t \ t\h \ DERIV (diff m) t :> diff (Suc m) t" + and INIT : "n = Suc k" + and DIFG_DEF: "difg = (\m t. diff m t - ((\p = 0..m t. m < n & 0 \ t & t \ h --> DERIV (difg m) t :> difg (Suc m) t" +proof (rule allI)+ + fix m + fix t + show "m < n \ 0 \ t \ t \ h \ DERIV (difg m) t :> difg (Suc m) t" + proof + assume INIT2: "m < n & 0 \ t & t \ h" + hence INTERV: "0 \ t & t \ h" .. + from INIT2 and INIT have mtok: "m < Suc k" by arith + have "DERIV (\t. diff m t - + ((\p = 0.. diff (Suc m) t - + ((\p = 0.. diff (Suc m) t" by simp + moreover + have " DERIV (\x. (\p = 0.. (\p = 0..x. \p = 0.. (\p = 0.. d. k = m + d" + proof - + from INIT2 have "m < n" .. + hence "\ d. n = m + d + Suc 0" by arith + with INIT show ?thesis by (simp del: setsum_op_ivl_Suc) + qed + from this obtain d where kmd: "k = m + d" .. + have "DERIV (\x. (\ma = 0.. (\p = 0..x. (\ma = 0.. (\r = 0..x. (\ma = 0.. (\r = 0..r. 0 \ r \ r < 0 + d \ + DERIV (\x. diff (Suc (m + r)) 0 * x ^ Suc r / real (fact (Suc r))) t + :> diff (Suc (m + r)) 0 * t ^ r / real (fact r)" + proof (rule allI) + fix r + show " 0 \ r \ r < 0 + d \ + DERIV (\x. diff (Suc (m + r)) 0 * x ^ Suc r / real (fact (Suc r))) t + :> diff (Suc (m + r)) 0 * t ^ r / real (fact r)" + proof + assume "0 \ r & r < 0 + d" + have "DERIV (\x. diff (Suc (m + r)) 0 * + (x ^ Suc r * inverse (real (fact (Suc r))))) + t :> diff (Suc (m + r)) 0 * (t ^ r * inverse (real (fact r)))" + proof - + have "(1 + real r) * real (fact r) \ 0" by auto + from this have "real (fact r) + real r * real (fact r) \ 0" + by (metis add_nonneg_eq_0_iff mult_nonneg_nonneg real_of_nat_fact_not_zero real_of_nat_ge_zero) + from this have "DERIV (\x. x ^ Suc r * inverse (real (fact (Suc r)))) t :> real (Suc r) * t ^ (Suc r - Suc 0) * inverse (real (fact (Suc r))) + + 0 * t ^ Suc r" + apply - by ( rule DERIV_intros | rule refl)+ auto + moreover + have "real (Suc r) * t ^ (Suc r - Suc 0) * inverse (real (fact (Suc r))) + + 0 * t ^ Suc r = + t ^ r * inverse (real (fact r))" + proof - + + have " real (Suc r) * t ^ (Suc r - Suc 0) * + inverse (real (Suc r) * real (fact r)) + + 0 * t ^ Suc r = + t ^ r * inverse (real (fact r))" by (simp add: mult_ac) + hence "real (Suc r) * t ^ (Suc r - Suc 0) * inverse (real (Suc r * fact r)) + + 0 * t ^ Suc r = + t ^ r * inverse (real (fact r))" by (subst real_of_nat_mult) + thus ?thesis by (subst fact_Suc) + qed + ultimately have " DERIV (\x. x ^ Suc r * inverse (real (fact (Suc r)))) t + :> t ^ r * inverse (real (fact r))" by (rule lemma_DERIV_subst) + thus ?thesis by (rule DERIV_cmult) + qed + thus "DERIV (\x. diff (Suc (m + r)) 0 * x ^ Suc r / + real (fact (Suc r))) + t :> diff (Suc (m + r)) 0 * t ^ r / real (fact r)" by (simp (no_asm) add: divide_inverse mult_assoc del: fact_Suc power_Suc) + qed + qed + thus ?thesis by (rule DERIV_sumr) + qed + moreover + from DERIV_const have "DERIV (\x. diff m 0) t :> 0" . + ultimately show ?thesis by (rule DERIV_add) + qed + moreover + have " (\r = 0..p = 0..x. B * (x ^ (Suc k - m) / real (fact (Suc k - m)))) t + :> B * (t ^ (Suc k - Suc m) / real (fact (Suc k - Suc m)))" + proof - + have " DERIV (\x. x ^ (Suc k - m) / real (fact (Suc k - m))) t + :> t ^ (Suc k - Suc m) / real (fact (Suc k - Suc m))" + proof - + have "DERIV (\x. x ^ (Suc k - m)) t :> real (Suc k - m) * t ^ (Suc k - m - Suc 0)" by (rule DERIV_pow) + moreover + have "DERIV (\x. real (fact (Suc k - m))) t :> 0" by (rule DERIV_const) + moreover + have "(\x. real (fact (Suc k - m))) t \ 0" by simp + ultimately have " DERIV (\y. y ^ (Suc k - m) / real (fact (Suc k - m))) t + :> ( real (Suc k - m) * t ^ (Suc k - m - Suc 0) * real (fact (Suc k - m)) + - (0 * t ^ (Suc k - m))) / + real (fact (Suc k - m)) ^ Suc (Suc 0)" + apply - + apply (rule DERIV_cong) by (rule DERIV_intros | rule refl)+ auto + moreover + from mtok and INIT have "( real (Suc k - m) * t ^ (Suc k - m - Suc 0) * real (fact (Suc k - m)) + - (0 * t ^ (Suc k - m))) / + real (fact (Suc k - m)) ^ Suc (Suc 0) = t ^ (Suc k - Suc m) / real (fact (Suc k - Suc m))" by (simp add: fact_diff_Suc) + ultimately show ?thesis by (rule lemma_DERIV_subst) + qed + moreover + thus ?thesis by (rule DERIV_cmult) + qed + ultimately show ?thesis by (rule DERIV_add) + qed + ultimately show ?thesis by (rule DERIV_diff) + qed + from INIT and this and DIFG_DEF show "DERIV (difg m) t :> difg (Suc m) t" by clarify + qed +qed -apply (simp add: fact_diff_Suc) - prefer 2 apply simp - apply (frule less_iff_Suc_add [THEN iffD1], clarify) - apply (simp del: setsum_op_ivl_Suc) - apply (insert sumr_offset4 [of "Suc 0"]) - apply (simp del: setsum_op_ivl_Suc fact_Suc power_Suc) - apply (rule lemma_DERIV_subst) - apply (rule DERIV_add) - apply (rule_tac [2] DERIV_const) - apply (rule DERIV_sumr, clarify) - prefer 2 apply simp - apply (simp (no_asm) add: divide_inverse mult_assoc del: fact_Suc power_Suc) - apply (rule DERIV_cmult) - apply (rule lemma_DERIV_subst) - apply (best intro!: DERIV_intros) - apply (subst fact_Suc) - apply (subst real_of_nat_mult) - apply (simp add: mult_ac) -done lemma Maclaurin: assumes h: "0 < h" @@ -83,7 +177,7 @@ "\t. 0 < t & t < h & f h = setsum (%m. (diff m 0 / real (fact m)) * h ^ m) {0..m t. - m < n & 0 \ t & t \ h --> DERIV (diff m) t :> diff (Suc m) t |] - ==> \t. 0 < t & - t \ h & - f h = - (\m=0..m t. + m < n & 0 \ t & t \ h --> DERIV (diff m) t :> diff (Suc m) t" + shows "\t. 0 < t \ t \ h \ f h = + (\m=0.. 0" by simp + from INIT1 this INIT2 DERIV have "\t>0. t < h \ + f h = + (\m = 0.. 0; diff 0 = f; - \m t. m < n & h \ t & t \ 0 --> DERIV (diff m) t :> diff (Suc m) t |] - ==> \t. h < t & - t < 0 & - f h = - (\m=0..m = 0..m = 0..m t. m < n & h \ t & t \ 0 --> DERIV (diff m) t :> diff (Suc m) t" + shows "\t. h < t & t < 0 & + f h = (\m=0..m t. m < n \ 0 \ t \ t \ - h \ + DERIV (\x. (- 1) ^ m * diff m (- x)) t :> (- 1) ^ Suc m * diff (Suc m) (- t)" + proof (rule allI impI)+ + fix m t + assume tINTERV:" m < n \ 0 \ t \ t \ - h" + with ABL show "DERIV (\x. (- 1) ^ m * diff m (- x)) t :> (- 1) ^ Suc m * diff (Suc m) (- t)" + proof - + + from ABL and tINTERV have "DERIV (\x. diff m (- x)) t :> - diff (Suc m) (- t)" (is ?tABL) + proof - + from ABL and tINTERV have "DERIV (diff m) (- t) :> diff (Suc m) (- t)" by force + moreover + from DERIV_ident[of t] have "DERIV uminus t :> (- 1)" by (rule DERIV_minus) + ultimately have "DERIV (\x. diff m (- x)) t :> diff (Suc m) (- t) * - 1" by (rule DERIV_chain2) + thus ?thesis by simp + qed + thus ?thesis + proof - + assume ?tABL hence "DERIV (\x. -1 ^ m * diff m (- x)) t :> -1 ^ m * - diff (Suc m) (- t)" by (rule DERIV_cmult) + hence "DERIV (\x. -1 ^ m * diff m (- x)) t :> - (-1 ^ m * diff (Suc m) (- t))" by (subst minus_mult_right) + thus ?thesis by simp + qed + qed + qed + ultimately have t_exists: "\t>0. t < - h \ + f (- (- h)) = + (\m = 0.. t. ?P t") by (rule Maclaurin) + from this obtain t where t_def: "?P t" .. + moreover + have "-1 ^ n * diff n (- t) * (- h) ^ n / real (fact n) = diff n (- t) * h ^ n / real (fact n)" + by (auto simp add: power_mult_distrib[symmetric]) + moreover + have "(SUM m = 0.. + - t < 0 \ + f h = + (\m = 0.. 0 & diff 0 = f & @@ -269,42 +400,109 @@ by (induct "n", auto) lemma Maclaurin_bi_le: - "[| diff 0 = f; - \m t. m < n & abs t \ abs x --> DERIV (diff m) t :> diff (Suc m) t |] - ==> \t. abs t \ abs x & + assumes INIT : "diff 0 = f" + and DERIV : "\m t. m < n & abs t \ abs x --> DERIV (diff m) t :> diff (Suc m) t" + shows "\t. abs t \ abs x & f x = (\m=0.. 0" . + from False INIT DERIV show ?thesis + proof (cases "x = 0") + case True show ?thesis + proof - + from n_not_zero True INIT DERIV have "\0\ \ \x\ \ + f x = (\m = 0..m t. m < n \ x \ t \ t \ 0 \ DERIV (diff m) t :> diff (Suc m) t" + proof (rule allI, rule allI, rule impI) + fix m t + assume "m < n & x \ t & t \ 0" + with DERIV show " DERIV (diff m) t :> diff (Suc m) t" by (fastsimp simp add: abs_if) + qed + ultimately have t_exists:"\t>x. t < 0 \ + diff 0 x = + (\m = 0.. t. ?P t") by (rule Maclaurin_minus) + from this obtain t where t_def: "?P t" .. + from t_def x_less_zero INIT have "\t\ \ \x\ \ + f x = (\m = 0.. 0" moreover + from n_not_zero have "0 < n" by simp moreover + have "diff 0 = diff 0" by simp moreover + have "\m t. m < n \ 0 \ t \ t \ x \ DERIV (diff m) t :> diff (Suc m) t" + proof (rule allI, rule allI, rule impI) + fix m t + assume "m < n & 0 \ t & t \ x" + with DERIV show " DERIV (diff m) t :> diff (Suc m) t" by fastsimp + qed + ultimately have t_exists:"\t>0. t < x \ + diff 0 x = + (\m = 0.. t. ?P t") by (rule Maclaurin) + from this obtain t where t_def: "?P t" .. + from t_def x_greater_zero INIT have "\t\ \ \x\ \ + f x = (\m = 0..m x. DERIV (diff m) x :> diff(Suc m) x; - x ~= 0; n > 0 - |] ==> \t. 0 < abs t & abs t < abs x & + assumes INIT1: "diff 0 = f" and INIT2: "0 < n" and INIT3: "x \ 0" + and DERIV: "\m x. DERIV (diff m) x :> diff(Suc m) x" + shows "\t. 0 < abs t & abs t < abs x & f x = (\m=0.. ?thesis" + proof - + assume "x = 0" + with INIT3 show "(x = 0) \ ?thesis".. + qed + moreover have "(x < 0) \ ?thesis" + proof - + assume x_less_zero: "x < 0" + from DERIV have "\m t. m < n \ x \ t \ t \ 0 \ DERIV (diff m) t :> diff (Suc m) t" by simp + with x_less_zero INIT2 INIT1 have "\t>x. t < 0 \ f x = (\m = 0.. t. ?P t") by (rule Maclaurin_minus) + from this obtain t where "?P t" .. + with x_less_zero have "0 < \t\ \ + \t\ < \x\ \ + f x = (\m = 0.. 0) \ ?thesis" + proof - + assume x_greater_zero: "x > 0" + from DERIV have "\m t. m < n \ 0 \ t \ t \ x \ DERIV (diff m) t :> diff (Suc m) t" by simp + with x_greater_zero INIT2 INIT1 have "\t>0. t < x \ f x = (\m = 0.. t. ?P t") by (rule Maclaurin) + from this obtain t where "?P t" .. + with x_greater_zero have "0 < \t\ \ + \t\ < \x\ \ + f x = (\m = 0..m x. DERIV (diff m) x :> diff (Suc m) x - |] ==> \t. abs t \ abs x & + +lemma Maclaurin_all_le: + assumes INIT: "diff 0 = f" + and DERIV: "\m x. DERIV (diff m) x :> diff (Suc m) x" + shows "\t. abs t \ abs x & f x = (\m=0.. 0" with INIT show ?thesis by force + next + assume n_greater_zero: "n > 0" show ?thesis + proof (cases "x = 0") + case True + from n_greater_zero have "n \ 0" by auto + from True this have f_0:"(\m = 0.. 0" by (rule gr_implies_not0) + hence "\ m. n = Suc m" by (rule not0_implies_Suc) + with f_0 True INIT have " \0\ \ \x\ \ + f x = (\m = 0..t. 0 < \t\ \ + \t\ < \x\ \ f x = (\m = 0.. t. ?P t") by (rule Maclaurin_all_lt) + from this obtain t where "?P t" .. + hence "\t\ \ \x\ \ + f x = (\m = 0..m x. DERIV (diff m) x :> diff (Suc m) x)