# HG changeset patch # User huffman # Date 1230504043 28800 # Node ID 7b09385234f9315c936860df5477908c8854476d # Parent 85889d58b5da55af6c6e70c16968ff030687eb58 clean up proofs of lemma Maclaurin diff -r 85889d58b5da -r 7b09385234f9 src/HOL/MacLaurin.thy --- a/src/HOL/MacLaurin.thy Sun Dec 28 16:39:27 2008 +0100 +++ b/src/HOL/MacLaurin.thy Sun Dec 28 14:40:43 2008 -0800 @@ -58,129 +58,157 @@ *} lemma Maclaurin_lemma2: - "[| \m t. m < n \ 0\t \ t\h \ DERIV (diff m) t :> diff (Suc m) t; - n = Suc k; - difg = + assumes diff: "\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" -apply clarify -apply (rule DERIV_diff) -apply (simp (no_asm_simp)) -apply (tactic {* DERIV_tac @{context} *}) -apply (tactic {* DERIV_tac @{context} *}) -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 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 1]) -apply (simp del: setsum_op_ivl_Suc fact_Suc realpow_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 realpow_Suc) -apply (rule DERIV_cmult) -apply (rule lemma_DERIV_subst) -apply (best intro: DERIV_chain2 intro!: DERIV_intros) -apply (subst fact_Suc) -apply (subst real_of_nat_mult) -apply (simp add: mult_ac) + B * (t ^ (n - m) / real (fact (n - m)))))" + shows + "\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 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 1]) + apply (simp del: setsum_op_ivl_Suc fact_Suc realpow_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 realpow_Suc) + apply (rule DERIV_cmult) + apply (rule lemma_DERIV_subst) + apply (best intro: DERIV_chain2 intro!: DERIV_intros) + apply (subst fact_Suc) + apply (subst real_of_nat_mult) + apply (simp add: mult_ac) done -lemma Maclaurin_lemma3: - fixes difg :: "nat => real => real" shows - "[|\k t. k < Suc m \ 0\t & t\h \ DERIV (difg k) t :> difg (Suc k) t; - \k 0; n < m; 0 < t; - t < h|] - ==> \ta. 0 < ta & ta < t & DERIV (difg (Suc n)) ta :> 0" -apply (rule Rolle, assumption, simp) -apply (drule_tac x = n and P="%k. k difg k 0 = 0" in spec) -apply (rule DERIV_unique) -prefer 2 apply assumption -apply force -apply (metis DERIV_isCont dlo_simps(4) dlo_simps(9) less_trans_Suc nat_less_le not_less_eq real_le_trans) -apply (metis Suc_less_eq differentiableI dlo_simps(7) dlo_simps(8) dlo_simps(9) real_le_trans xt1(8)) -done - lemma Maclaurin: - "[| 0 < h; n > 0; diff 0 = f; - \m t. m < n & 0 \ t & t \ h --> DERIV (diff m) t :> diff (Suc m) t |] - ==> \t. 0 < t & - t < h & + assumes h: "0 < h" + assumes n: "0 < n" + assumes diff_0: "diff 0 = f" + assumes diff_Suc: + "\m t. m < n & 0 \ t & t \ h --> DERIV (diff m) t :> diff (Suc m) t" + shows + "\t. 0 < t & t < h & f h = setsum (%m. (diff m 0 / real (fact m)) * h ^ m) {0..g. - g = (%t. f t - (setsum (%m. (diff m 0 / real(fact m)) * t^m) {0..difg. difg = (%m t. diff m t - (setsum (%p. (diff (m + p) 0 / real (fact p)) * (t ^ p)) {0..ma. ma < n --> (\t. 0 < t & t < h & difg (Suc ma) t = 0) ") - apply (drule_tac x = m and P="%m. m (\t. ?QQ m t)" in spec) - apply (erule impE) - apply (simp (no_asm_simp)) - apply (erule exE) - apply (rule_tac x = t in exI) - apply (simp del: realpow_Suc fact_Suc) -apply (subgoal_tac "\m. m < n --> difg m 0 = 0") - prefer 2 - apply clarify - apply simp - apply (frule less_iff_Suc_add [THEN iffD1], clarify) - apply (simp del: setsum_op_ivl_Suc) -apply (insert sumr_offset4 [of 1]) -apply (simp del: setsum_op_ivl_Suc fact_Suc realpow_Suc) -apply (subgoal_tac "\m. m < n --> (\t. 0 < t & t < h & DERIV (difg m) t :> 0) ") -apply (rule allI, rule impI) -apply (drule_tac x = ma and P="%m. m (\t. ?QQ m t)" in spec) -apply (erule impE, assumption) -apply (erule exE) -apply (rule_tac x = t in exI) -(* do some tidying up *) -apply (erule_tac [!] V= "difg = (%m t. diff m t - (setsum (%p. diff (m + p) 0 / real (fact p) * t ^ p) {0..m = 0..real) / real (fact m) * h ^ m) + + B * (h ^ n / real (fact n))" + using Maclaurin_lemma [OF h] .. + + obtain g where g_def: "g = (%t. f t - + (setsum (%m. (diff m 0 / real(fact m)) * t^m) {0..(m\nat) t\real. + m < n \ (0\real) \ t \ t \ h \ DERIV (difg m) t :> difg (Suc m) t" + using diff_Suc m difg_def by (rule Maclaurin_lemma2) + + have difg_eq_0: "\m. m < n --> difg m 0 = 0" + apply clarify + apply (simp add: m difg_def) + apply (frule less_iff_Suc_add [THEN iffD1], clarify) + apply (simp del: setsum_op_ivl_Suc) + apply (insert sumr_offset4 [of 1]) + apply (simp del: setsum_op_ivl_Suc fact_Suc realpow_Suc) + done + + have isCont_difg: "\m x. \m < n; 0 \ x; x \ h\ \ isCont (difg m) x" + by (rule DERIV_isCont [OF difg_Suc [rule_format]]) simp + + have differentiable_difg: + "\m x. \m < n; 0 \ x; x \ h\ \ difg m differentiable x" + by (rule differentiableI [OF difg_Suc [rule_format]]) simp + + have difg_Suc_eq_0: "\m t. \m < n; 0 \ t; t \ h; DERIV (difg m) t :> 0\ + \ difg (Suc m) t = 0" + by (rule DERIV_unique [OF difg_Suc [rule_format]]) simp + + have "m < n" using m by simp + + have "\t. 0 < t \ t < h \ DERIV (difg m) t :> 0" + using `m < n` + proof (induct m) + case 0 + show ?case + proof (rule Rolle) + show "0 < h" by fact + show "difg 0 0 = difg 0 h" by (simp add: difg_0 g2) + show "\x. 0 \ x \ x \ h \ isCont (difg (0\nat)) x" + by (simp add: isCont_difg n) + show "\x. 0 < x \ x < h \ difg (0\nat) differentiable x" + by (simp add: differentiable_difg n) + qed + next + case (Suc m') + hence "\t. 0 < t \ t < h \ DERIV (difg m') t :> 0" by simp + then obtain t where t: "0 < t" "t < h" "DERIV (difg m') t :> 0" by fast + have "\t'. 0 < t' \ t' < t \ DERIV (difg (Suc m')) t' :> 0" + proof (rule Rolle) + show "0 < t" by fact + show "difg (Suc m') 0 = difg (Suc m') t" + using t `Suc m' < n` by (simp add: difg_Suc_eq_0 difg_eq_0) + show "\x. 0 \ x \ x \ t \ isCont (difg (Suc m')) x" + using `t < h` `Suc m' < n` by (simp add: isCont_difg) + show "\x. 0 < x \ x < t \ difg (Suc m') differentiable x" + using `t < h` `Suc m' < n` by (simp add: differentiable_difg) + qed + thus ?case + using `t < h` by auto + qed + + then obtain t where "0 < t" "t < h" "DERIV (difg m) t :> 0" by fast + + hence "difg (Suc m) t = 0" + using `m < n` by (simp add: difg_Suc_eq_0) + + show ?thesis + proof (intro exI conjI) + show "0 < t" by fact + show "t < h" by fact + show "f h = + (\m = 0..0 & diff 0 = f &