# HG changeset patch # User wenzelm # Date 1379159997 -7200 # Node ID ab5d01b69a07bf9e9177dfbd1a8cbd748be1df1a # Parent e68732cd842e024e4a63730a33608f970332b138 tuned proofs; diff -r e68732cd842e -r ab5d01b69a07 src/HOL/Multivariate_Analysis/Integration.thy --- a/src/HOL/Multivariate_Analysis/Integration.thy Fri Sep 13 23:52:01 2013 +0200 +++ b/src/HOL/Multivariate_Analysis/Integration.thy Sat Sep 14 13:59:57 2013 +0200 @@ -8287,386 +8287,953 @@ done lemma indefinite_integral_continuous_left: - fixes f::"real \ 'a::banach" - assumes "f integrable_on {a..b}" "a < c" "c \ b" "0 < e" - obtains d where "0 < d" "\t. c - d < t \ t \ c \ norm(integral {a..c} f - integral {a..t} f) < e" -proof- have "\w>0. \t. c - w < t \ t < c \ norm(f c) * norm(c - t) < e / 3" - proof(cases "f c = 0") case False hence "0 < e / 3 / norm (f c)" - apply-apply(rule divide_pos_pos) using `e>0` by auto - thus ?thesis apply-apply(rule,rule,assumption,safe) - proof- fix t assume as:"t < c" and "c - e / 3 / norm (f c) < t" - hence "c - t < e / 3 / norm (f c)" by auto - hence "norm (c - t) < e / 3 / norm (f c)" using as by auto - thus "norm (f c) * norm (c - t) < e / 3" using False apply- - apply(subst mult_commute) apply(subst pos_less_divide_eq[symmetric]) by auto - qed next case True show ?thesis apply(rule_tac x=1 in exI) unfolding True using `e>0` by auto - qed then guess w .. note w = conjunctD2[OF this,rule_format] - - have *:"e / 3 > 0" using assms by auto - have "f integrable_on {a..c}" apply(rule integrable_subinterval[OF assms(1)]) using assms(2-3) by auto + fixes f:: "real \ 'a::banach" + assumes "f integrable_on {a..b}" + and "a < c" + and "c \ b" + and "e > 0" + obtains d where "d > 0" + and "\t. c - d < t \ t \ c \ norm (integral {a..c} f - integral {a..t} f) < e" +proof - + have "\w>0. \t. c - w < t \ t < c \ norm (f c) * norm(c - t) < e / 3" + proof (cases "f c = 0") + case False + then have "0 < e / 3 / norm (f c)" + apply - + apply (rule divide_pos_pos) + using `e>0` + apply auto + done + then show ?thesis + apply - + apply rule + apply rule + apply assumption + apply safe + proof - + fix t + assume as: "t < c" and "c - e / 3 / norm (f c) < t" + then have "c - t < e / 3 / norm (f c)" + by auto + then have "norm (c - t) < e / 3 / norm (f c)" + using as by auto + then show "norm (f c) * norm (c - t) < e / 3" + using False + apply - + apply (subst mult_commute) + apply (subst pos_less_divide_eq[symmetric]) + apply auto + done + qed + next + case True + show ?thesis + apply (rule_tac x=1 in exI) + unfolding True + using `e > 0` + apply auto + done + qed + then guess w .. note w = conjunctD2[OF this,rule_format] + + have *: "e / 3 > 0" + using assms by auto + have "f integrable_on {a..c}" + apply (rule integrable_subinterval[OF assms(1)]) + using assms(2-3) + apply auto + done from integrable_integral[OF this,unfolded has_integral,rule_format,OF *] guess d1 .. - note d1 = conjunctD2[OF this,rule_format] def d \ "\x. ball x w \ d1 x" - have "gauge d" unfolding d_def using w(1) d1 by auto - note this[unfolded gauge_def,rule_format,of c] note conjunctD2[OF this] - from this(2)[unfolded open_contains_ball,rule_format,OF this(1)] guess k .. note k=conjunctD2[OF this] - - let ?d = "min k (c - a)/2" show ?thesis apply(rule that[of ?d]) - proof safe - show "?d > 0" using k(1) using assms(2) by auto - fix t assume as:"c - ?d < t" "t \ c" + note d1 = conjunctD2[OF this,rule_format] + def d \ "\x. ball x w \ d1 x" + have "gauge d" + unfolding d_def using w(1) d1 by auto + note this[unfolded gauge_def,rule_format,of c] + note conjunctD2[OF this] + from this(2)[unfolded open_contains_ball,rule_format,OF this(1)] guess k .. + note k=conjunctD2[OF this] + + let ?d = "min k (c - a) / 2" + show ?thesis + apply (rule that[of ?d]) + apply safe + proof - + show "?d > 0" + using k(1) using assms(2) by auto + fix t + assume as: "c - ?d < t" "t \ c" let ?thesis = "norm (integral {a..c} f - integral {a..t} f) < e" - { presume *:"t < c \ ?thesis" - show ?thesis apply(cases "t = c") defer apply(rule *) - apply(subst less_le) using `e>0` as(2) by auto } + { + presume *: "t < c \ ?thesis" + show ?thesis + apply (cases "t = c") + defer + apply (rule *) + apply (subst less_le) + using `e > 0` as(2) + apply auto + done + } assume "t < c" - have "f integrable_on {a..t}" apply(rule integrable_subinterval[OF assms(1)]) using assms(2-3) as(2) by auto + have "f integrable_on {a..t}" + apply (rule integrable_subinterval[OF assms(1)]) + using assms(2-3) as(2) + apply auto + done from integrable_integral[OF this,unfolded has_integral,rule_format,OF *] guess d2 .. note d2 = conjunctD2[OF this,rule_format] def d3 \ "\x. if x \ t then d1 x \ d2 x else d1 x" - have "gauge d3" using d2(1) d1(1) unfolding d3_def gauge_def by auto + have "gauge d3" + using d2(1) d1(1) unfolding d3_def gauge_def by auto from fine_division_exists[OF this, of a t] guess p . note p=this note p'=tagged_division_ofD[OF this(1)] - have pt:"\(x,k)\p. x \ t" proof safe case goal1 from p'(2,3)[OF this] show ?case by auto qed - with p(2) have "d2 fine p" unfolding fine_def d3_def apply safe apply(erule_tac x="(a,b)" in ballE)+ by auto + have pt: "\(x,k)\p. x \ t" + proof safe + case goal1 + from p'(2,3)[OF this] show ?case + by auto + qed + with p(2) have "d2 fine p" + unfolding fine_def d3_def + apply safe + apply (erule_tac x="(a,b)" in ballE)+ + apply auto + done note d2_fin = d2(2)[OF conjI[OF p(1) this]] - have *:"{a..c} \ {x. x \ 1 \ t} = {a..t}" "{a..c} \ {x. x \ 1 \ t} = {t..c}" - using assms(2-3) as by(auto simp add:field_simps) - have "p \ {(c, {t..c})} tagged_division_of {a..c} \ d1 fine p \ {(c, {t..c})}" apply rule - apply(rule tagged_division_union_interval[of _ _ _ 1 "t"]) unfolding * apply(rule p) - apply(rule tagged_division_of_self) unfolding fine_def - proof safe fix x k y assume "(x,k)\p" "y\k" thus "y\d1 x" - using p(2) pt unfolding fine_def d3_def apply- apply(erule_tac x="(x,k)" in ballE)+ by auto - next fix x assume "x\{t..c}" hence "dist c x < k" unfolding dist_real_def - using as(1) by(auto simp add:field_simps) - thus "x \ d1 c" using k(2) unfolding d_def by auto - qed(insert as(2), auto) note d1_fin = d1(2)[OF this] - - have *:"integral{a..c} f - integral {a..t} f = -(((c - t) *\<^sub>R f c + (\(x, k)\p. content k *\<^sub>R f x)) - - integral {a..c} f) + ((\(x, k)\p. content k *\<^sub>R f x) - integral {a..t} f) + (c - t) *\<^sub>R f c" - "e = (e/3 + e/3) + e/3" by auto - have **:"(\(x, k)\p \ {(c, {t..c})}. content k *\<^sub>R f x) = (c - t) *\<^sub>R f c + (\(x, k)\p. content k *\<^sub>R f x)" - proof- have **:"\x F. F \ {x} = insert x F" by auto - have "(c, {t..c}) \ p" proof safe case goal1 from p'(2-3)[OF this] - have "c \ {a..t}" by auto thus False using `t t < c" - proof- have "c - k < t" using `k>0` as(1) by(auto simp add:field_simps) - moreover have "k \ w" apply(rule ccontr) using k(2) - unfolding subset_eq apply(erule_tac x="c + ((k + w)/2)" in ballE) - unfolding d_def using `k>0` `w>0` by(auto simp add:field_simps not_le not_less dist_real_def) - ultimately show ?thesis using `t 'a::banach" - assumes "f integrable_on {a..b}" "a \ c" "c < b" "0 < e" - obtains d where "0 < d" "\t. c \ t \ t < c + d \ norm(integral{a..c} f - integral{a..t} f) < e" -proof- have *:"(\x. f (- x)) integrable_on {- b..- a}" "- b < - c" "- c \ - a" using assms by auto - from indefinite_integral_continuous_left[OF * `e>0`] guess d . note d = this let ?d = "min d (b - c)" - show ?thesis apply(rule that[of "?d"]) - proof safe show "0 < ?d" using d(1) assms(3) by auto - fix t::"real" assume as:"c \ t" "t < c + ?d" - have *:"integral{a..c} f = integral{a..b} f - integral{c..b} f" - "integral{a..t} f = integral{a..b} f - integral{t..b} f" unfolding algebra_simps - apply(rule_tac[!] integral_combine) using assms as by auto - have "(- c) - d < (- t) \ - t \ - c" using as by auto note d(2)[rule_format,OF this] - thus "norm (integral {a..c} f - integral {a..t} f) < e" unfolding * - unfolding integral_reflect apply-apply(subst norm_minus_commute) by(auto simp add:algebra_simps) qed qed - -lemma indefinite_integral_continuous: fixes f::"real \ 'a::banach" - assumes "f integrable_on {a..b}" shows "continuous_on {a..b} (\x. integral {a..x} f)" -proof(unfold continuous_on_iff, safe) fix x e assume as:"x\{a..b}" "0<(e::real)" + have *: "{a..c} \ {x. x \ 1 \ t} = {a..t}" "{a..c} \ {x. x \ 1 \ t} = {t..c}" + using assms(2-3) as by (auto simp add: field_simps) + have "p \ {(c, {t..c})} tagged_division_of {a..c} \ d1 fine p \ {(c, {t..c})}" + apply rule + apply (rule tagged_division_union_interval[of _ _ _ 1 "t"]) + unfolding * + apply (rule p) + apply (rule tagged_division_of_self) + unfolding fine_def + apply safe + proof - + fix x k y + assume "(x,k) \ p" and "y \ k" + then show "y \ d1 x" + using p(2) pt + unfolding fine_def d3_def + apply - + apply (erule_tac x="(x,k)" in ballE)+ + apply auto + done + next + fix x assume "x \ {t..c}" + then have "dist c x < k" + unfolding dist_real_def + using as(1) + by (auto simp add: field_simps) + then show "x \ d1 c" + using k(2) + unfolding d_def + by auto + qed (insert as(2), auto) note d1_fin = d1(2)[OF this] + + have *: "integral{a..c} f - integral {a..t} f = -(((c - t) *\<^sub>R f c + (\(x, k)\p. content k *\<^sub>R f x)) - + integral {a..c} f) + ((\(x, k)\p. content k *\<^sub>R f x) - integral {a..t} f) + (c - t) *\<^sub>R f c" + "e = (e/3 + e/3) + e/3" + by auto + have **: "(\(x, k)\p \ {(c, {t..c})}. content k *\<^sub>R f x) = + (c - t) *\<^sub>R f c + (\(x, k)\p. content k *\<^sub>R f x)" + proof - + have **: "\x F. F \ {x} = insert x F" + by auto + have "(c, {t..c}) \ p" + proof safe + case goal1 + from p'(2-3)[OF this] have "c \ {a..t}" + by auto + then show False using `t < c` + by auto + qed + then show ?thesis + unfolding ** + apply - + apply (subst setsum_insert) + apply (rule p') + unfolding split_conv + defer + apply (subst content_real) + using as(2) + apply auto + done + qed + have ***: "c - w < t \ t < c" + proof - + have "c - k < t" + using `k>0` as(1) by (auto simp add: field_simps) + moreover have "k \ w" + apply (rule ccontr) + using k(2) + unfolding subset_eq + apply (erule_tac x="c + ((k + w)/2)" in ballE) + unfolding d_def + using `k>0` `w>0` + apply (auto simp add: field_simps not_le not_less dist_real_def) + done + ultimately show ?thesis using `t < c` + by (auto simp add: field_simps) + qed + show ?thesis + unfolding *(1) + apply (subst *(2)) + apply (rule norm_triangle_lt add_strict_mono)+ + unfolding norm_minus_cancel + apply (rule d1_fin[unfolded **]) + apply (rule d2_fin) + using w(2)[OF ***] + unfolding norm_scaleR + apply (auto simp add: field_simps) + done + qed +qed + +lemma indefinite_integral_continuous_right: + fixes f :: "real \ 'a::banach" + assumes "f integrable_on {a..b}" + and "a \ c" + and "c < b" + and "e > 0" + obtains d where "0 < d" + and "\t. c \ t \ t < c + d \ norm (integral {a..c} f - integral {a..t} f) < e" +proof - + have *: "(\x. f (- x)) integrable_on {- b..- a}" "- b < - c" "- c \ - a" + using assms by auto + from indefinite_integral_continuous_left[OF * `e>0`] guess d . note d = this + let ?d = "min d (b - c)" + show ?thesis + apply (rule that[of "?d"]) + apply safe + proof - + show "0 < ?d" + using d(1) assms(3) by auto + fix t :: real + assume as: "c \ t" "t < c + ?d" + have *: "integral {a..c} f = integral {a..b} f - integral {c..b} f" + "integral {a..t} f = integral {a..b} f - integral {t..b} f" + unfolding algebra_simps + apply (rule_tac[!] integral_combine) + using assms as + apply auto + done + have "(- c) - d < (- t) \ - t \ - c" + using as by auto note d(2)[rule_format,OF this] + then show "norm (integral {a..c} f - integral {a..t} f) < e" + unfolding * + unfolding integral_reflect + apply (subst norm_minus_commute) + apply (auto simp add: algebra_simps) + done + qed +qed + +lemma indefinite_integral_continuous: + fixes f :: "real \ 'a::banach" + assumes "f integrable_on {a..b}" + shows "continuous_on {a..b} (\x. integral {a..x} f)" +proof (unfold continuous_on_iff, safe) + fix x e :: real + assume as: "x \ {a..b}" "e > 0" let ?thesis = "\d>0. \x'\{a..b}. dist x' x < d \ dist (integral {a..x'} f) (integral {a..x} f) < e" - { presume *:"a ?thesis" - show ?thesis apply(cases,rule *,assumption) - proof- case goal1 hence "{a..b} = {x}" using as(1) apply-apply(rule set_eqI) - unfolding atLeastAtMost_iff by(auto simp only:field_simps not_less) - thus ?case using `e>0` by auto - qed } assume "a x=b) \ (a x a" by auto + { + presume *: "a < b \ ?thesis" + show ?thesis + apply cases + apply (rule *) + apply assumption + proof - + case goal1 + then have "{a..b} = {x}" + using as(1) + apply - + apply (rule set_eqI) + unfolding atLeastAtMost_iff + apply (auto simp only: field_simps not_less) + done + then show ?case using `e > 0` by auto + qed + } + assume "a < b" + have "(x = a \ x = b) \ (a < x \ x < b)" + using as(1) by auto + then show ?thesis + apply (elim disjE) + proof - + assume "x = a" + have "a \ a" .. from indefinite_integral_continuous_right[OF assms(1) this `a0`] guess d . note d=this - show ?thesis apply(rule,rule,rule d,safe) apply(subst dist_commute) - unfolding `x=a` dist_norm apply(rule d(2)[rule_format]) by auto - next assume "x=b" have "b \ b" by auto + show ?thesis + apply rule + apply rule + apply (rule d) + apply safe + apply (subst dist_commute) + unfolding `x = a` dist_norm + apply (rule d(2)[rule_format]) + apply auto + done + next + assume "x = b" + have "b \ b" .. from indefinite_integral_continuous_left[OF assms(1) `a0`] guess d . note d=this - show ?thesis apply(rule,rule,rule d,safe) apply(subst dist_commute) - unfolding `x=b` dist_norm apply(rule d(2)[rule_format]) by auto - next assume "a xb" and xr:"a\x" "x x < b" + then have xl: "a < x" "x \ b" and xr: "a \ x" "x < b" + by auto from indefinite_integral_continuous_left [OF assms(1) xl `e>0`] guess d1 . note d1=this from indefinite_integral_continuous_right[OF assms(1) xr `e>0`] guess d2 . note d2=this - show ?thesis apply(rule_tac x="min d1 d2" in exI) - proof safe show "0 < min d1 d2" using d1 d2 by auto - fix y assume "y\{a..b}" "dist y x < min d1 d2" - thus "dist (integral {a..y} f) (integral {a..x} f) < e" apply-apply(subst dist_commute) - apply(cases "y < x") unfolding dist_norm apply(rule d1(2)[rule_format]) defer - apply(rule d2(2)[rule_format]) unfolding not_less by(auto simp add:field_simps) - qed qed qed + show ?thesis + apply (rule_tac x="min d1 d2" in exI) + proof safe + show "0 < min d1 d2" + using d1 d2 by auto + fix y + assume "y \ {a..b}" and "dist y x < min d1 d2" + then show "dist (integral {a..y} f) (integral {a..x} f) < e" + apply (subst dist_commute) + apply (cases "y < x") + unfolding dist_norm + apply (rule d1(2)[rule_format]) + defer + apply (rule d2(2)[rule_format]) + unfolding not_less + apply (auto simp add: field_simps) + done + qed + qed +qed + subsection {* This doesn't directly involve integration, but that gives an easy proof. *} -lemma has_derivative_zero_unique_strong_interval: fixes f::"real \ 'a::banach" - assumes "finite k" "continuous_on {a..b} f" "f a = y" - "\x\({a..b} - k). (f has_derivative (\h. 0)) (at x within {a..b})" "x \ {a..b}" +lemma has_derivative_zero_unique_strong_interval: + fixes f :: "real \ 'a::banach" + assumes "finite k" + and "continuous_on {a..b} f" + and "f a = y" + and "\x\({a..b} - k). (f has_derivative (\h. 0)) (at x within {a..b})" "x \ {a..b}" shows "f x = y" -proof- have ab:"a\b" using assms by auto - have *:"a\x" using assms(5) by auto +proof - + have ab: "a \ b" + using assms by auto + have *: "a \ x" + using assms(5) by auto have "((\x. 0\'a) has_integral f x - f a) {a..x}" - apply(rule fundamental_theorem_of_calculus_interior_strong[OF assms(1) *]) - apply(rule continuous_on_subset[OF assms(2)]) defer - apply safe unfolding has_vector_derivative_def apply(subst has_derivative_within_open[symmetric]) - apply assumption apply(rule open_interval) apply(rule has_derivative_within_subset[where s="{a..b}"]) - using assms(4) assms(5) by auto note this[unfolded *] + apply (rule fundamental_theorem_of_calculus_interior_strong[OF assms(1) *]) + apply (rule continuous_on_subset[OF assms(2)]) + defer + apply safe + unfolding has_vector_derivative_def + apply (subst has_derivative_within_open[symmetric]) + apply assumption + apply (rule open_interval) + apply (rule has_derivative_within_subset[where s="{a..b}"]) + using assms(4) assms(5) + apply auto + done + note this[unfolded *] note has_integral_unique[OF has_integral_0 this] - thus ?thesis unfolding assms by auto qed + then show ?thesis + unfolding assms by auto +qed + subsection {* Generalize a bit to any convex set. *} -lemma has_derivative_zero_unique_strong_convex: fixes f::"'a::ordered_euclidean_space \ 'b::banach" - assumes "convex s" "finite k" "continuous_on s f" "c \ s" "f c = y" - "\x\(s - k). (f has_derivative (\h. 0)) (at x within s)" "x \ s" +lemma has_derivative_zero_unique_strong_convex: + fixes f :: "'a::ordered_euclidean_space \ 'b::banach" + assumes "convex s" + and "finite k" + and "continuous_on s f" + and "c \ s" + and "f c = y" + and "\x\(s - k). (f has_derivative (\h. 0)) (at x within s)" + and "x \ s" shows "f x = y" -proof- { presume *:"x \ c \ ?thesis" show ?thesis apply(cases,rule *,assumption) - unfolding assms(5)[symmetric] by auto } assume "x\c" +proof - + { + presume *: "x \ c \ ?thesis" + show ?thesis + apply cases + apply (rule *) + apply assumption + unfolding assms(5)[symmetric] + apply auto + done + } + assume "x \ c" note conv = assms(1)[unfolded convex_alt,rule_format] - have as1:"continuous_on {0..1} (f \ (\t. (1 - t) *\<^sub>R c + t *\<^sub>R x))" - apply(rule continuous_on_intros)+ apply(rule continuous_on_subset[OF assms(3)]) - apply safe apply(rule conv) using assms(4,7) by auto - have *:"\t xa. (1 - t) *\<^sub>R c + t *\<^sub>R x = (1 - xa) *\<^sub>R c + xa *\<^sub>R x \ t = xa" - proof- case goal1 hence "(t - xa) *\<^sub>R x = (t - xa) *\<^sub>R c" - unfolding scaleR_simps by(auto simp add:algebra_simps) - thus ?case using `x\c` by auto qed - have as2:"finite {t. ((1 - t) *\<^sub>R c + t *\<^sub>R x) \ k}" using assms(2) - apply(rule finite_surj[where f="\z. SOME t. (1-t) *\<^sub>R c + t *\<^sub>R x = z"]) - apply safe unfolding image_iff apply rule defer apply assumption - apply(rule sym) apply(rule some_equality) defer apply(drule *) by auto + have as1: "continuous_on {0..1} (f \ (\t. (1 - t) *\<^sub>R c + t *\<^sub>R x))" + apply (rule continuous_on_intros)+ + apply (rule continuous_on_subset[OF assms(3)]) + apply safe + apply (rule conv) + using assms(4,7) + apply auto + done + have *: "\t xa. (1 - t) *\<^sub>R c + t *\<^sub>R x = (1 - xa) *\<^sub>R c + xa *\<^sub>R x \ t = xa" + proof - + case goal1 + then have "(t - xa) *\<^sub>R x = (t - xa) *\<^sub>R c" + unfolding scaleR_simps by (auto simp add: algebra_simps) + then show ?case + using `x \ c` by auto + qed + have as2: "finite {t. ((1 - t) *\<^sub>R c + t *\<^sub>R x) \ k}" + using assms(2) + apply (rule finite_surj[where f="\z. SOME t. (1-t) *\<^sub>R c + t *\<^sub>R x = z"]) + apply safe + unfolding image_iff + apply rule + defer + apply assumption + apply (rule sym) + apply (rule some_equality) + defer + apply (drule *) + apply auto + done have "(f \ (\t. (1 - t) *\<^sub>R c + t *\<^sub>R x)) 1 = y" - apply(rule has_derivative_zero_unique_strong_interval[OF as2 as1, of ]) - unfolding o_def using assms(5) defer apply-apply(rule) - proof- fix t assume as:"t\{0..1} - {t. (1 - t) *\<^sub>R c + t *\<^sub>R x \ k}" - have *:"c - t *\<^sub>R c + t *\<^sub>R x \ s - k" apply safe apply(rule conv[unfolded scaleR_simps]) - using `x\s` `c\s` as by(auto simp add: algebra_simps) - have "(f \ (\t. (1 - t) *\<^sub>R c + t *\<^sub>R x) has_derivative (\x. 0) \ (\z. (0 - z *\<^sub>R c) + z *\<^sub>R x)) (at t within {0..1})" - apply(rule diff_chain_within) apply(rule has_derivative_add) + apply (rule has_derivative_zero_unique_strong_interval[OF as2 as1, of ]) + unfolding o_def + using assms(5) + defer + apply - + apply rule + proof - + fix t + assume as: "t \ {0..1} - {t. (1 - t) *\<^sub>R c + t *\<^sub>R x \ k}" + have *: "c - t *\<^sub>R c + t *\<^sub>R x \ s - k" + apply safe + apply (rule conv[unfolded scaleR_simps]) + using `x \ s` `c \ s` as + by (auto simp add: algebra_simps) + have "(f \ (\t. (1 - t) *\<^sub>R c + t *\<^sub>R x) has_derivative (\x. 0) \ (\z. (0 - z *\<^sub>R c) + z *\<^sub>R x)) + (at t within {0..1})" + apply (rule diff_chain_within) + apply (rule has_derivative_add) unfolding scaleR_simps - apply(intro FDERIV_intros) - apply(intro FDERIV_intros) - apply(rule has_derivative_within_subset,rule assms(6)[rule_format]) - apply(rule *) apply safe apply(rule conv[unfolded scaleR_simps]) using `x\s` `c\s` by auto - thus "((\xa. f ((1 - xa) *\<^sub>R c + xa *\<^sub>R x)) has_derivative (\h. 0)) (at t within {0..1})" unfolding o_def . - qed auto thus ?thesis by auto qed - -subsection {* Also to any open connected set with finite set of exceptions. Could + apply (intro FDERIV_intros) + apply (intro FDERIV_intros) + apply (rule has_derivative_within_subset,rule assms(6)[rule_format]) + apply (rule *) + apply safe + apply (rule conv[unfolded scaleR_simps]) + using `x \ s` `c \ s` + apply auto + done + then show "((\xa. f ((1 - xa) *\<^sub>R c + xa *\<^sub>R x)) has_derivative (\h. 0)) (at t within {0..1})" + unfolding o_def . + qed auto + then show ?thesis + by auto +qed + + +text {* Also to any open connected set with finite set of exceptions. Could generalize to locally convex set with limpt-free set of exceptions. *} -lemma has_derivative_zero_unique_strong_connected: fixes f::"'a::ordered_euclidean_space \ 'b::banach" - assumes "connected s" "open s" "finite k" "continuous_on s f" "c \ s" "f c = y" - "\x\(s - k). (f has_derivative (\h. 0)) (at x within s)" "x\s" +lemma has_derivative_zero_unique_strong_connected: + fixes f :: "'a::ordered_euclidean_space \ 'b::banach" + assumes "connected s" + and "open s" + and "finite k" + and "continuous_on s f" + and "c \ s" + and "f c = y" + and "\x\(s - k). (f has_derivative (\h. 0)) (at x within s)" + and "x\s" shows "f x = y" -proof- have "{x \ s. f x \ {y}} = {} \ {x \ s. f x \ {y}} = s" - apply(rule assms(1)[unfolded connected_clopen,rule_format]) apply rule defer - apply(rule continuous_closed_in_preimage[OF assms(4) closed_singleton]) - apply(rule open_openin_trans[OF assms(2)]) unfolding open_contains_ball - proof safe fix x assume "x\s" +proof - + have "{x \ s. f x \ {y}} = {} \ {x \ s. f x \ {y}} = s" + apply (rule assms(1)[unfolded connected_clopen,rule_format]) + apply rule + defer + apply (rule continuous_closed_in_preimage[OF assms(4) closed_singleton]) + apply (rule open_openin_trans[OF assms(2)]) + unfolding open_contains_ball + proof safe + fix x + assume "x \ s" from assms(2)[unfolded open_contains_ball,rule_format,OF this] guess e .. note e=conjunctD2[OF this] - show "\e>0. ball x e \ {xa \ s. f xa \ {f x}}" apply(rule,rule,rule e) - proof safe fix y assume y:"y \ ball x e" thus "y\s" using e by auto - show "f y = f x" apply(rule has_derivative_zero_unique_strong_convex[OF convex_ball]) - apply(rule assms) apply(rule continuous_on_subset,rule assms) apply(rule e)+ - apply(subst centre_in_ball,rule e,rule) apply safe - apply(rule has_derivative_within_subset) apply(rule assms(7)[rule_format]) - using y e by auto qed qed - thus ?thesis using `x\s` `f c = y` `c\s` by auto qed - -subsection {* Integrating characteristic function of an interval. *} - -lemma has_integral_restrict_open_subinterval: fixes f::"'a::ordered_euclidean_space \ 'b::banach" - assumes "(f has_integral i) {c..d}" "{c..d} \ {a..b}" + show "\e>0. ball x e \ {xa \ s. f xa \ {f x}}" + apply rule + apply rule + apply (rule e) + proof safe + fix y + assume y: "y \ ball x e" + then show "y \ s" + using e by auto + show "f y = f x" + apply (rule has_derivative_zero_unique_strong_convex[OF convex_ball]) + apply (rule assms) + apply (rule continuous_on_subset) + apply (rule assms) + apply (rule e)+ + apply (subst centre_in_ball) + apply (rule e) + apply rule + apply safe + apply (rule has_derivative_within_subset) + apply (rule assms(7)[rule_format]) + using y e + apply auto + done + qed + qed + then show ?thesis + using `x \ s` `f c = y` `c \ s` by auto +qed + + +subsection {* Integrating characteristic function of an interval *} + +lemma has_integral_restrict_open_subinterval: + fixes f :: "'a::ordered_euclidean_space \ 'b::banach" + assumes "(f has_integral i) {c..d}" + and "{c..d} \ {a..b}" shows "((\x. if x \ {c<.. "\x. if x \{c<..{} \ ?thesis" - show ?thesis apply(cases,rule *,assumption) - proof- case goal1 hence *:"{c<..{}" +proof - + def g \ "\x. if x \{c<.. {} \ ?thesis" + show ?thesis + apply cases + apply (rule *) + apply assumption + proof - + case goal1 + then have *: "{c<.. {}" from partial_division_extend_1[OF assms(2) this] guess p . note p=this note mon = monoidal_lifted[OF monoidal_monoid] note operat = operative_division[OF this operative_integral p(1), symmetric] let ?P = "(if g integrable_on {a..b} then Some (integral {a..b} g) else None) = Some i" - { presume "?P" hence "g integrable_on {a..b} \ integral {a..b} g = i" - apply- apply(cases,subst(asm) if_P,assumption) by auto - thus ?thesis using integrable_integral unfolding g_def by auto } + { + presume "?P" + then have "g integrable_on {a..b} \ integral {a..b} g = i" + apply - + apply cases + apply (subst(asm) if_P) + apply assumption + apply auto + done + then show ?thesis + using integrable_integral + unfolding g_def + by auto + } note iterate_eq_neutral[OF mon,unfolded neutral_lifted[OF monoidal_monoid]] note * = this[unfolded neutral_add] have iterate:"iterate (lifted op +) (p - {{c..d}}) - (\i. if g integrable_on i then Some (integral i g) else None) = Some 0" - proof(rule *,rule) case goal1 hence "x\p" by auto note div = division_ofD(2-5)[OF p(1) this] - from div(3) guess u v apply-by(erule exE)+ note uv=this - have "interior x \ interior {c..d} = {}" using div(4)[OF p(2)] goal1 by auto - hence "(g has_integral 0) x" unfolding uv apply-apply(rule has_integral_spike_interior[where f="\x. 0"]) - unfolding g_def interior_closed_interval by auto thus ?case by auto + (\i. if g integrable_on i then Some (integral i g) else None) = Some 0" + proof (rule *, rule) + case goal1 + then have "x \ p" + by auto + note div = division_ofD(2-5)[OF p(1) this] + from div(3) guess u v by (elim exE) note uv=this + have "interior x \ interior {c..d} = {}" + using div(4)[OF p(2)] goal1 by auto + then have "(g has_integral 0) x" + unfolding uv + apply - + apply (rule has_integral_spike_interior[where f="\x. 0"]) + unfolding g_def interior_closed_interval + apply auto + done + then show ?case + by auto qed - have *:"p = insert {c..d} (p - {{c..d}})" using p by auto - have **:"g integrable_on {c..d}" apply(rule integrable_spike_interior[where f=f]) - unfolding g_def defer apply(rule has_integral_integrable) using assms(1) by auto - moreover have "integral {c..d} g = i" apply(rule has_integral_unique[OF _ assms(1)]) - apply(rule has_integral_spike_interior[where f=g]) defer - apply(rule integrable_integral[OF **]) unfolding g_def by auto - ultimately show ?P unfolding operat apply- apply(subst *) apply(subst iterate_insert) apply rule+ - unfolding iterate defer apply(subst if_not_P) defer using p by auto qed - -lemma has_integral_restrict_closed_subinterval: fixes f::"'a::ordered_euclidean_space \ 'b::banach" - assumes "(f has_integral i) ({c..d})" "{c..d} \ {a..b}" + have *: "p = insert {c..d} (p - {{c..d}})" + using p by auto + have **: "g integrable_on {c..d}" + apply (rule integrable_spike_interior[where f=f]) + unfolding g_def + defer + apply (rule has_integral_integrable) + using assms(1) + apply auto + done + moreover + have "integral {c..d} g = i" + apply (rule has_integral_unique[OF _ assms(1)]) + apply (rule has_integral_spike_interior[where f=g]) + defer + apply (rule integrable_integral[OF **]) + unfolding g_def + apply auto + done + ultimately show ?P + unfolding operat + apply (subst *) + apply (subst iterate_insert) + apply rule+ + unfolding iterate + defer + apply (subst if_not_P) + defer + using p + apply auto + done +qed + +lemma has_integral_restrict_closed_subinterval: + fixes f :: "'a::ordered_euclidean_space \ 'b::banach" + assumes "(f has_integral i) {c..d}" + and "{c..d} \ {a..b}" shows "((\x. if x \ {c..d} then f x else 0) has_integral i) {a..b}" -proof- note has_integral_restrict_open_subinterval[OF assms] +proof - + note has_integral_restrict_open_subinterval[OF assms] note * = has_integral_spike[OF negligible_frontier_interval _ this] - show ?thesis apply(rule *[of c d]) using interval_open_subset_closed[of c d] by auto qed - -lemma has_integral_restrict_closed_subintervals_eq: fixes f::"'a::ordered_euclidean_space \ 'b::banach" assumes "{c..d} \ {a..b}" - shows "((\x. if x \ {c..d} then f x else 0) has_integral i) {a..b} \ (f has_integral i) {c..d}" (is "?l = ?r") -proof(cases "{c..d} = {}") case False let ?g = "\x. if x \ {c..d} then f x else 0" - show ?thesis apply rule defer apply(rule has_integral_restrict_closed_subinterval[OF _ assms]) - proof assumption assume ?l hence "?g integrable_on {c..d}" - apply-apply(rule integrable_subinterval[OF _ assms]) by auto - hence *:"f integrable_on {c..d}"apply-apply(rule integrable_eq) by auto - hence "i = integral {c..d} f" apply-apply(rule has_integral_unique) - apply(rule `?l`) apply(rule has_integral_restrict_closed_subinterval[OF _ assms]) by auto - thus ?r using * by auto qed qed auto - -subsection {* Hence we can apply the limit process uniformly to all integrals. *} - -lemma has_integral': fixes f::"'n::ordered_euclidean_space \ 'a::banach" shows - "(f has_integral i) s \ (\e>0. \B>0. \a b. ball 0 B \ {a..b} - \ (\z. ((\x. if x \ s then f(x) else 0) has_integral z) {a..b} \ norm(z - i) < e))" (is "?l \ (\e>0. ?r e)") -proof- { presume *:"\a b. s = {a..b} \ ?thesis" - show ?thesis apply(cases,rule *,assumption) - apply(subst has_integral_alt) by auto } - assume "\a b. s = {a..b}" then guess a b apply-by(erule exE)+ note s=this + show ?thesis + apply (rule *[of c d]) + using interval_open_subset_closed[of c d] + apply auto + done +qed + +lemma has_integral_restrict_closed_subintervals_eq: + fixes f :: "'a::ordered_euclidean_space \ 'b::banach" + assumes "{c..d} \ {a..b}" + shows "((\x. if x \ {c..d} then f x else 0) has_integral i) {a..b} \ (f has_integral i) {c..d}" + (is "?l = ?r") +proof (cases "{c..d} = {}") + case False + let ?g = "\x. if x \ {c..d} then f x else 0" + show ?thesis + apply rule + defer + apply (rule has_integral_restrict_closed_subinterval[OF _ assms]) + apply assumption + proof - + assume ?l + then have "?g integrable_on {c..d}" + apply - + apply (rule integrable_subinterval[OF _ assms]) + apply auto + done + then have *: "f integrable_on {c..d}" + apply - + apply (rule integrable_eq) + apply auto + done + then have "i = integral {c..d} f" + apply - + apply (rule has_integral_unique) + apply (rule `?l`) + apply (rule has_integral_restrict_closed_subinterval[OF _ assms]) + apply auto + done + then show ?r + using * by auto + qed +qed auto + + +text {* Hence we can apply the limit process uniformly to all integrals. *} + +lemma has_integral': + fixes f :: "'n::ordered_euclidean_space \ 'a::banach" + shows "(f has_integral i) s \ + (\e>0. \B>0. \a b. ball 0 B \ {a..b} \ + (\z. ((\x. if x \ s then f(x) else 0) has_integral z) {a..b} \ norm(z - i) < e))" + (is "?l \ (\e>0. ?r e)") +proof - + { + presume *: "\a b. s = {a..b} \ ?thesis" + show ?thesis + apply cases + apply (rule *) + apply assumption + apply (subst has_integral_alt) + apply auto + done + } + assume "\a b. s = {a..b}" + then guess a b by (elim exE) note s=this from bounded_interval[of a b, THEN conjunct1, unfolded bounded_pos] guess B .. - note B = conjunctD2[OF this,rule_format] show ?thesis apply safe - proof- fix e assume ?l "e>(0::real)" - show "?r e" apply(rule_tac x="B+1" in exI) apply safe defer apply(rule_tac x=i in exI) - proof fix c d assume as:"ball 0 (B+1) \ {c..d::'n::ordered_euclidean_space}" - thus "((\x. if x \ s then f x else 0) has_integral i) {c..d}" unfolding s - apply-apply(rule has_integral_restrict_closed_subinterval) apply(rule `?l`[unfolded s]) - apply safe apply(drule B(2)[rule_format]) unfolding subset_eq apply(erule_tac x=x in ballE) - by(auto simp add:dist_norm) - qed(insert B `e>0`, auto) - next assume as:"\e>0. ?r e" + note B = conjunctD2[OF this,rule_format] show ?thesis + apply safe + proof - + fix e :: real + assume ?l and "e > 0" + show "?r e" + apply (rule_tac x="B+1" in exI) + apply safe + defer + apply (rule_tac x=i in exI) + proof + fix c d :: 'n + assume as: "ball 0 (B+1) \ {c..d}" + then show "((\x. if x \ s then f x else 0) has_integral i) {c..d}" + unfolding s + apply - + apply (rule has_integral_restrict_closed_subinterval) + apply (rule `?l`[unfolded s]) + apply safe + apply (drule B(2)[rule_format]) + unfolding subset_eq + apply (erule_tac x=x in ballE) + apply (auto simp add: dist_norm) + done + qed (insert B `e>0`, auto) + next + assume as: "\e>0. ?r e" from this[rule_format,OF zero_less_one] guess C .. note C=conjunctD2[OF this,rule_format] - def c \ "(\i\Basis. (- max B C) *\<^sub>R i)::'n::ordered_euclidean_space" - def d \ "(\i\Basis. max B C *\<^sub>R i)::'n::ordered_euclidean_space" - have c_d:"{a..b} \ {c..d}" apply safe apply(drule B(2)) unfolding mem_interval + def c \ "(\i\Basis. (- max B C) *\<^sub>R i)::'n" + def d \ "(\i\Basis. max B C *\<^sub>R i)::'n" + have c_d: "{a..b} \ {c..d}" + apply safe + apply (drule B(2)) + unfolding mem_interval proof - case goal1 thus ?case using Basis_le_norm[OF `i\Basis`, of x] unfolding c_def d_def - by(auto simp add:field_simps setsum_negf) + case goal1 + then show ?case + using Basis_le_norm[OF `i\Basis`, of x] + unfolding c_def d_def + by (auto simp add: field_simps setsum_negf) qed - have "ball 0 C \ {c..d}" apply safe unfolding mem_interval mem_ball dist_norm + have "ball 0 C \ {c..d}" + apply safe + unfolding mem_interval mem_ball dist_norm proof - case goal1 thus ?case - using Basis_le_norm[OF `i\Basis`, of x] unfolding c_def d_def by (auto simp: setsum_negf) + case goal1 + then show ?case + using Basis_le_norm[OF `i\Basis`, of x] + unfolding c_def d_def + by (auto simp: setsum_negf) qed from C(2)[OF this] have "\y. (f has_integral y) {a..b}" - unfolding has_integral_restrict_closed_subintervals_eq[OF c_d,symmetric] unfolding s by auto + unfolding has_integral_restrict_closed_subintervals_eq[OF c_d,symmetric] + unfolding s + by auto then guess y .. note y=this - have "y = i" proof(rule ccontr) assume "y\i" hence "0 < norm (y - i)" by auto + have "y = i" + proof (rule ccontr) + assume "\ ?thesis" + then have "0 < norm (y - i)" + by auto from as[rule_format,OF this] guess C .. note C=conjunctD2[OF this,rule_format] - def c \ "(\i\Basis. (- max B C) *\<^sub>R i)::'n::ordered_euclidean_space" - def d \ "(\i\Basis. max B C *\<^sub>R i)::'n::ordered_euclidean_space" - have c_d:"{a..b} \ {c..d}" apply safe apply(drule B(2)) unfolding mem_interval - proof case goal1 thus ?case using Basis_le_norm[of i x] unfolding c_def d_def - by(auto simp add:field_simps setsum_negf) qed - have "ball 0 C \ {c..d}" apply safe unfolding mem_interval mem_ball dist_norm - proof case goal1 thus ?case using Basis_le_norm[of i x] unfolding c_def d_def by (auto simp: setsum_negf) qed + def c \ "(\i\Basis. (- max B C) *\<^sub>R i)::'n" + def d \ "(\i\Basis. max B C *\<^sub>R i)::'n" + have c_d: "{a..b} \ {c..d}" + apply safe + apply (drule B(2)) + unfolding mem_interval + proof + case goal1 + then show ?case + using Basis_le_norm[of i x] + unfolding c_def d_def + by (auto simp add: field_simps setsum_negf) + qed + have "ball 0 C \ {c..d}" + apply safe + unfolding mem_interval mem_ball dist_norm + proof + case goal1 + then show ?case + using Basis_le_norm[of i x] + unfolding c_def d_def + by (auto simp: setsum_negf) + qed note C(2)[OF this] then guess z .. note z = conjunctD2[OF this, unfolded s] note this[unfolded has_integral_restrict_closed_subintervals_eq[OF c_d]] - hence "z = y" "norm (z - i) < norm (y - i)" apply- apply(rule has_integral_unique[OF _ y(1)]) . - thus False by auto qed - thus ?l using y unfolding s by auto qed qed - -lemma has_integral_le: fixes f::"'n::ordered_euclidean_space \ real" - assumes "(f has_integral i) s" "(g has_integral j) s" "\x\s. (f x) \ (g x)" + then have "z = y" and "norm (z - i) < norm (y - i)" + apply - + apply (rule has_integral_unique[OF _ y(1)]) + apply assumption + apply assumption + done + then show False + by auto + qed + then show ?l + using y + unfolding s + by auto + qed +qed + +lemma has_integral_le: + fixes f :: "'n::ordered_euclidean_space \ real" + assumes "(f has_integral i) s" + and "(g has_integral j) s" + and "\x\s. f x \ g x" shows "i \ j" - using has_integral_component_le[OF _ assms(1-2), of 1] using assms(3) by auto - -lemma integral_le: fixes f::"'n::ordered_euclidean_space \ real" - assumes "f integrable_on s" "g integrable_on s" "\x\s. f x \ g x" + using has_integral_component_le[OF _ assms(1-2), of 1] + using assms(3) + by auto + +lemma integral_le: + fixes f :: "'n::ordered_euclidean_space \ real" + assumes "f integrable_on s" + and "g integrable_on s" + and "\x\s. f x \ g x" shows "integral s f \ integral s g" - using has_integral_le[OF assms(1,2)[unfolded has_integral_integral] assms(3)] . - -lemma has_integral_nonneg: fixes f::"'n::ordered_euclidean_space \ real" - assumes "(f has_integral i) s" "\x\s. 0 \ f x" shows "0 \ i" + by (rule has_integral_le[OF assms(1,2)[unfolded has_integral_integral] assms(3)]) + +lemma has_integral_nonneg: + fixes f :: "'n::ordered_euclidean_space \ real" + assumes "(f has_integral i) s" + and "\x\s. 0 \ f x" + shows "0 \ i" using has_integral_component_nonneg[of 1 f i s] - unfolding o_def using assms by auto - -lemma integral_nonneg: fixes f::"'n::ordered_euclidean_space \ real" - assumes "f integrable_on s" "\x\s. 0 \ f x" shows "0 \ integral s f" - using has_integral_nonneg[OF assms(1)[unfolded has_integral_integral] assms(2)] . - -subsection {* Hence a general restriction property. *} - -lemma has_integral_restrict[simp]: assumes "s \ t" shows - "((\x. if x \ s then f x else (0::'a::banach)) has_integral i) t \ (f has_integral i) s" -proof- have *:"\x. (if x \ t then if x \ s then f x else 0 else 0) = (if x\s then f x else 0)" using assms by auto - show ?thesis apply(subst(2) has_integral') apply(subst has_integral') unfolding * by rule qed - -lemma has_integral_restrict_univ: fixes f::"'n::ordered_euclidean_space \ 'a::banach" shows - "((\x. if x \ s then f x else 0) has_integral i) UNIV \ (f has_integral i) s" by auto - -lemma has_integral_on_superset: fixes f::"'n::ordered_euclidean_space \ 'a::banach" - assumes "\x. ~(x \ s) \ f x = 0" "s \ t" "(f has_integral i) s" + unfolding o_def + using assms + by auto + +lemma integral_nonneg: + fixes f :: "'n::ordered_euclidean_space \ real" + assumes "f integrable_on s" + and "\x\s. 0 \ f x" + shows "0 \ integral s f" + by (rule has_integral_nonneg[OF assms(1)[unfolded has_integral_integral] assms(2)]) + + +text {* Hence a general restriction property. *} + +lemma has_integral_restrict[simp]: + assumes "s \ t" + shows "((\x. if x \ s then f x else (0::'a::banach)) has_integral i) t \ (f has_integral i) s" +proof - + have *: "\x. (if x \ t then if x \ s then f x else 0 else 0) = (if x\s then f x else 0)" + using assms by auto + show ?thesis + apply (subst(2) has_integral') + apply (subst has_integral') + unfolding * + apply rule + done +qed + +lemma has_integral_restrict_univ: + fixes f :: "'n::ordered_euclidean_space \ 'a::banach" + shows "((\x. if x \ s then f x else 0) has_integral i) UNIV \ (f has_integral i) s" + by auto + +lemma has_integral_on_superset: + fixes f :: "'n::ordered_euclidean_space \ 'a::banach" + assumes "\x. x \ s \ f x = 0" + and "s \ t" + and "(f has_integral i) s" shows "(f has_integral i) t" -proof- have "(\x. if x \ s then f x else 0) = (\x. if x \ t then f x else 0)" - apply(rule) using assms(1-2) by auto - thus ?thesis apply- using assms(3) apply(subst has_integral_restrict_univ[symmetric]) - apply- apply(subst(asm) has_integral_restrict_univ[symmetric]) by auto qed - -lemma integrable_on_superset: fixes f::"'n::ordered_euclidean_space \ 'a::banach" - assumes "\x. ~(x \ s) \ f x = 0" "s \ t" "f integrable_on s" +proof - + have "(\x. if x \ s then f x else 0) = (\x. if x \ t then f x else 0)" + apply rule + using assms(1-2) + apply auto + done + then show ?thesis + using assms(3) + apply (subst has_integral_restrict_univ[symmetric]) + apply (subst(asm) has_integral_restrict_univ[symmetric]) + apply auto + done +qed + +lemma integrable_on_superset: + fixes f :: "'n::ordered_euclidean_space \ 'a::banach" + assumes "\x. x \ s \ f x = 0" + and "s \ t" + and "f integrable_on s" shows "f integrable_on t" - using assms unfolding integrable_on_def by(auto intro:has_integral_on_superset) - -lemma integral_restrict_univ[intro]: fixes f::"'n::ordered_euclidean_space \ 'a::banach" + using assms + unfolding integrable_on_def + by (auto intro:has_integral_on_superset) + +lemma integral_restrict_univ[intro]: + fixes f :: "'n::ordered_euclidean_space \ 'a::banach" shows "f integrable_on s \ integral UNIV (\x. if x \ s then f x else 0) = integral s f" - apply(rule integral_unique) unfolding has_integral_restrict_univ by auto - -lemma integrable_restrict_univ: fixes f::"'n::ordered_euclidean_space \ 'a::banach" shows - "(\x. if x \ s then f x else 0) integrable_on UNIV \ f integrable_on s" - unfolding integrable_on_def by auto - -lemma negligible_on_intervals: "negligible s \ (\a b. negligible(s \ {a..b}))" (is "?l = ?r") -proof assume ?r show ?l unfolding negligible_def - proof safe case goal1 show ?case apply(rule has_integral_negligible[OF `?r`[rule_format,of a b]]) - unfolding indicator_def by auto qed qed auto - -lemma has_integral_spike_set_eq: fixes f::"'n::ordered_euclidean_space \ 'a::banach" - assumes "negligible((s - t) \ (t - s))" shows "((f has_integral y) s \ (f has_integral y) t)" - unfolding has_integral_restrict_univ[symmetric,of f] apply(rule has_integral_spike_eq[OF assms]) by (auto split: split_if_asm) - -lemma has_integral_spike_set[dest]: fixes f::"'n::ordered_euclidean_space \ 'a::banach" - assumes "negligible((s - t) \ (t - s))" "(f has_integral y) s" + apply (rule integral_unique) + unfolding has_integral_restrict_univ + apply auto + done + +lemma integrable_restrict_univ: + fixes f :: "'n::ordered_euclidean_space \ 'a::banach" + shows "(\x. if x \ s then f x else 0) integrable_on UNIV \ f integrable_on s" + unfolding integrable_on_def + by auto + +lemma negligible_on_intervals: "negligible s \ (\a b. negligible(s \ {a..b}))" (is "?l \ ?r") +proof + assume ?r + show ?l + unfolding negligible_def + proof safe + case goal1 + show ?case + apply (rule has_integral_negligible[OF `?r`[rule_format,of a b]]) + unfolding indicator_def + apply auto + done + qed +qed auto + +lemma has_integral_spike_set_eq: + fixes f :: "'n::ordered_euclidean_space \ 'a::banach" + assumes "negligible ((s - t) \ (t - s))" + shows "(f has_integral y) s \ (f has_integral y) t" + unfolding has_integral_restrict_univ[symmetric,of f] + apply (rule has_integral_spike_eq[OF assms]) + by (auto split: split_if_asm) + +lemma has_integral_spike_set[dest]: + fixes f :: "'n::ordered_euclidean_space \ 'a::banach" + assumes "negligible ((s - t) \ (t - s))" + and "(f has_integral y) s" shows "(f has_integral y) t" - using assms has_integral_spike_set_eq by auto - -lemma integrable_spike_set[dest]: fixes f::"'n::ordered_euclidean_space \ 'a::banach" - assumes "negligible((s - t) \ (t - s))" "f integrable_on s" - shows "f integrable_on t" using assms(2) unfolding integrable_on_def + using assms has_integral_spike_set_eq + by auto + +lemma integrable_spike_set[dest]: + fixes f :: "'n::ordered_euclidean_space \ 'a::banach" + assumes "negligible ((s - t) \ (t - s))" + and "f integrable_on s" + shows "f integrable_on t" + using assms(2) + unfolding integrable_on_def unfolding has_integral_spike_set_eq[OF assms(1)] . -lemma integrable_spike_set_eq: fixes f::"'n::ordered_euclidean_space \ 'a::banach" - assumes "negligible((s - t) \ (t - s))" - shows "(f integrable_on s \ f integrable_on t)" - apply(rule,rule_tac[!] integrable_spike_set) using assms by auto +lemma integrable_spike_set_eq: + fixes f :: "'n::ordered_euclidean_space \ 'a::banach" + assumes "negligible ((s - t) \ (t - s))" + shows "f integrable_on s \ f integrable_on t" + apply rule + apply (rule_tac[!] integrable_spike_set) + using assms + apply auto + done (*lemma integral_spike_set: "\f:real^M->real^N g s t. @@ -8700,156 +9267,354 @@ MP_TAC(ISPEC `s:real^M->bool` CLOSURE_SUBSET) THEN SET_TAC[]);;*) -subsection {* More lemmas that are useful later. *} - -lemma has_integral_subset_component_le: fixes f::"'n::ordered_euclidean_space \ 'm::ordered_euclidean_space" - assumes k: "k\Basis" and as: "s \ t" "(f has_integral i) s" "(f has_integral j) t" "\x\t. 0 \ f(x)\k" + +subsection {* More lemmas that are useful later *} + +lemma has_integral_subset_component_le: + fixes f :: "'n::ordered_euclidean_space \ 'm::ordered_euclidean_space" + assumes k: "k \ Basis" + and as: "s \ t" "(f has_integral i) s" "(f has_integral j) t" "\x\t. 0 \ f(x)\k" shows "i\k \ j\k" -proof- note has_integral_restrict_univ[symmetric, of f] +proof - + note has_integral_restrict_univ[symmetric, of f] note as(2-3)[unfolded this] note * = has_integral_component_le[OF k this] - show ?thesis apply(rule *) using as(1,4) by auto qed - -lemma has_integral_subset_le: fixes f::"'n::ordered_euclidean_space \ real" - assumes as: "s \ t" "(f has_integral i) s" "(f has_integral j) t" "\x\t. 0 \ f(x)" + show ?thesis + apply (rule *) + using as(1,4) + apply auto + done +qed + +lemma has_integral_subset_le: + fixes f :: "'n::ordered_euclidean_space \ real" + assumes "s \ t" + and "(f has_integral i) s" + and "(f has_integral j) t" + and "\x\t. 0 \ f x" shows "i \ j" - using has_integral_subset_component_le[OF _ assms(1), of 1 f i j] using assms by auto - -lemma integral_subset_component_le: fixes f::"'n::ordered_euclidean_space \ 'm::ordered_euclidean_space" - assumes "k\Basis" "s \ t" "f integrable_on s" "f integrable_on t" "\x \ t. 0 \ f(x)\k" + using has_integral_subset_component_le[OF _ assms(1), of 1 f i j] + using assms + by auto + +lemma integral_subset_component_le: + fixes f :: "'n::ordered_euclidean_space \ 'm::ordered_euclidean_space" + assumes "k \ Basis" + and "s \ t" + and "f integrable_on s" + and "f integrable_on t" + and "\x \ t. 0 \ f x \ k" shows "(integral s f)\k \ (integral t f)\k" - apply(rule has_integral_subset_component_le) using assms by auto - -lemma integral_subset_le: fixes f::"'n::ordered_euclidean_space \ real" - assumes "s \ t" "f integrable_on s" "f integrable_on t" "\x \ t. 0 \ f(x)" - shows "(integral s f) \ (integral t f)" - apply(rule has_integral_subset_le) using assms by auto - -lemma has_integral_alt': fixes f::"'n::ordered_euclidean_space \ 'a::banach" + apply (rule has_integral_subset_component_le) + using assms + apply auto + done + +lemma integral_subset_le: + fixes f :: "'n::ordered_euclidean_space \ real" + assumes "s \ t" + and "f integrable_on s" + and "f integrable_on t" + and "\x \ t. 0 \ f x" + shows "integral s f \ integral t f" + apply (rule has_integral_subset_le) + using assms + apply auto + done + +lemma has_integral_alt': + fixes f :: "'n::ordered_euclidean_space \ 'a::banach" shows "(f has_integral i) s \ (\a b. (\x. if x \ s then f x else 0) integrable_on {a..b}) \ - (\e>0. \B>0. \a b. ball 0 B \ {a..b} \ norm(integral {a..b} (\x. if x \ s then f x else 0) - i) < e)" (is "?l = ?r") -proof assume ?r - show ?l apply- apply(subst has_integral') - proof safe case goal1 from `?r`[THEN conjunct2,rule_format,OF this] guess B .. note B=conjunctD2[OF this] - show ?case apply(rule,rule,rule B,safe) - apply(rule_tac x="integral {a..b} (\x. if x \ s then f x else 0)" in exI) - apply(drule B(2)[rule_format]) using integrable_integral[OF `?r`[THEN conjunct1,rule_format]] by auto - qed next + (\e>0. \B>0. \a b. ball 0 B \ {a..b} \ + norm (integral {a..b} (\x. if x \ s then f x else 0) - i) < e)" + (is "?l = ?r") +proof + assume ?r + show ?l + apply (subst has_integral') + apply safe + proof - + case goal1 + from `?r`[THEN conjunct2,rule_format,OF this] guess B .. note B=conjunctD2[OF this] + show ?case + apply rule + apply rule + apply (rule B) + apply safe + apply (rule_tac x="integral {a..b} (\x. if x \ s then f x else 0)" in exI) + apply (drule B(2)[rule_format]) + using integrable_integral[OF `?r`[THEN conjunct1,rule_format]] + apply auto + done + qed +next assume ?l note as = this[unfolded has_integral'[of f],rule_format] let ?f = "\x. if x \ s then f x else 0" - show ?r proof safe fix a b::"'n::ordered_euclidean_space" + show ?r + proof safe + fix a b :: 'n from as[OF zero_less_one] guess B .. note B=conjunctD2[OF this,rule_format] - let ?a = "\i\Basis. min (a\i) (-B) *\<^sub>R i::'n" and ?b = "\i\Basis. max (b\i) B *\<^sub>R i::'n" - show "?f integrable_on {a..b}" apply(rule integrable_subinterval[of _ ?a ?b]) - proof- have "ball 0 B \ {?a..?b}" apply safe unfolding mem_ball mem_interval dist_norm - proof case goal1 thus ?case using Basis_le_norm[of i x] by(auto simp add:field_simps) qed + let ?a = "\i\Basis. min (a\i) (-B) *\<^sub>R i::'n" + let ?b = "\i\Basis. max (b\i) B *\<^sub>R i::'n" + show "?f integrable_on {a..b}" + proof (rule integrable_subinterval[of _ ?a ?b]) + have "ball 0 B \ {?a..?b}" + apply safe + unfolding mem_ball mem_interval dist_norm + proof + case goal1 + then show ?case using Basis_le_norm[of i x] + by (auto simp add:field_simps) + qed from B(2)[OF this] guess z .. note conjunct1[OF this] - thus "?f integrable_on {?a..?b}" unfolding integrable_on_def by auto - show "{a..b} \ {?a..?b}" apply safe unfolding mem_interval apply(rule,erule_tac x=i in ballE) by auto qed - - fix e::real assume "e>0" from as[OF this] guess B .. note B=conjunctD2[OF this,rule_format] + then show "?f integrable_on {?a..?b}" + unfolding integrable_on_def by auto + show "{a..b} \ {?a..?b}" + apply safe + unfolding mem_interval + apply rule + apply (erule_tac x=i in ballE) + apply auto + done + qed + + fix e :: real + assume "e > 0" + from as[OF this] guess B .. note B=conjunctD2[OF this,rule_format] show "\B>0. \a b. ball 0 B \ {a..b} \ - norm (integral {a..b} (\x. if x \ s then f x else 0) - i) < e" - proof(rule,rule,rule B,safe) case goal1 from B(2)[OF this] guess z .. note z=conjunctD2[OF this] - from integral_unique[OF this(1)] show ?case using z(2) by auto qed qed qed + norm (integral {a..b} (\x. if x \ s then f x else 0) - i) < e" + apply rule + apply rule + apply (rule B) + apply safe + proof - + case goal1 + from B(2)[OF this] guess z .. note z=conjunctD2[OF this] + from integral_unique[OF this(1)] show ?case + using z(2) by auto + qed + qed +qed subsection {* Continuity of the integral (for a 1-dimensional interval). *} -lemma integrable_alt: fixes f::"'n::ordered_euclidean_space \ 'a::banach" shows - "f integrable_on s \ - (\a b. (\x. if x \ s then f x else 0) integrable_on {a..b}) \ - (\e>0. \B>0. \a b c d. ball 0 B \ {a..b} \ ball 0 B \ {c..d} - \ norm(integral {a..b} (\x. if x \ s then f x else 0) - - integral {c..d} (\x. if x \ s then f x else 0)) < e)" (is "?l = ?r") -proof assume ?l then guess y unfolding integrable_on_def .. note this[unfolded has_integral_alt'[of f]] - note y=conjunctD2[OF this,rule_format] show ?r apply safe apply(rule y) - proof- case goal1 hence "e/2 > 0" by auto from y(2)[OF this] guess B .. note B=conjunctD2[OF this,rule_format] - show ?case apply(rule,rule,rule B) - proof safe case goal1 show ?case apply(rule norm_triangle_half_l) - using B(2)[OF goal1(1)] B(2)[OF goal1(2)] by auto qed qed - -next assume ?r note as = conjunctD2[OF this,rule_format] +lemma integrable_alt: + fixes f :: "'n::ordered_euclidean_space \ 'a::banach" + shows "f integrable_on s \ + (\a b. (\x. if x \ s then f x else 0) integrable_on {a..b}) \ + (\e>0. \B>0. \a b c d. ball 0 B \ {a..b} \ ball 0 B \ {c..d} \ + norm (integral {a..b} (\x. if x \ s then f x else 0) - + integral {c..d} (\x. if x \ s then f x else 0)) < e)" + (is "?l = ?r") +proof + assume ?l + then guess y unfolding integrable_on_def .. note this[unfolded has_integral_alt'[of f]] + note y=conjunctD2[OF this,rule_format] + show ?r + apply safe + apply (rule y) + proof - + case goal1 + then have "e/2 > 0" + by auto + from y(2)[OF this] guess B .. note B=conjunctD2[OF this,rule_format] + show ?case + apply rule + apply rule + apply (rule B) + apply safe + proof - + case goal1 + show ?case + apply (rule norm_triangle_half_l) + using B(2)[OF goal1(1)] B(2)[OF goal1(2)] + apply auto + done + qed + qed +next + assume ?r + note as = conjunctD2[OF this,rule_format] let ?cube = "\n. {(\i\Basis. - real n *\<^sub>R i)::'n .. (\i\Basis. real n *\<^sub>R i)} :: 'n set" have "Cauchy (\n. integral (?cube n) (\x. if x \ s then f x else 0))" - proof(unfold Cauchy_def,safe) case goal1 + proof (unfold Cauchy_def, safe) + case goal1 from as(2)[OF this] guess B .. note B = conjunctD2[OF this,rule_format] from real_arch_simple[of B] guess N .. note N = this - { fix n assume n:"n \ N" have "ball 0 B \ ?cube n" apply safe + { + fix n + assume n: "n \ N" + have "ball 0 B \ ?cube n" + apply safe unfolding mem_ball mem_interval dist_norm - proof case goal1 thus ?case using Basis_le_norm[of i x] `i\Basis` - using n N by(auto simp add:field_simps setsum_negf) qed } - thus ?case apply-apply(rule_tac x=N in exI) apply safe unfolding dist_norm apply(rule B(2)) by auto - qed from this[unfolded convergent_eq_cauchy[symmetric]] guess i .. + proof + case goal1 + then show ?case + using Basis_le_norm[of i x] `i\Basis` + using n N + by (auto simp add: field_simps setsum_negf) + qed + } + then show ?case + apply - + apply (rule_tac x=N in exI) + apply safe + unfolding dist_norm + apply (rule B(2)) + apply auto + done + qed + from this[unfolded convergent_eq_cauchy[symmetric]] guess i .. note i = this[THEN LIMSEQ_D] - show ?l unfolding integrable_on_def has_integral_alt'[of f] apply(rule_tac x=i in exI) - apply safe apply(rule as(1)[unfolded integrable_on_def]) - proof- case goal1 hence *:"e/2 > 0" by auto + show ?l unfolding integrable_on_def has_integral_alt'[of f] + apply (rule_tac x=i in exI) + apply safe + apply (rule as(1)[unfolded integrable_on_def]) + proof - + case goal1 + then have *: "e/2 > 0" by auto from i[OF this] guess N .. note N =this[rule_format] - from as(2)[OF *] guess B .. note B=conjunctD2[OF this,rule_format] let ?B = "max (real N) B" - show ?case apply(rule_tac x="?B" in exI) - proof safe show "0 < ?B" using B(1) by auto - fix a b assume ab:"ball 0 ?B \ {a..b::'n::ordered_euclidean_space}" + from as(2)[OF *] guess B .. note B=conjunctD2[OF this,rule_format] + let ?B = "max (real N) B" + show ?case + apply (rule_tac x="?B" in exI) + proof safe + show "0 < ?B" + using B(1) by auto + fix a b :: 'n + assume ab: "ball 0 ?B \ {a..b}" from real_arch_simple[of ?B] guess n .. note n=this show "norm (integral {a..b} (\x. if x \ s then f x else 0) - i) < e" - apply(rule norm_triangle_half_l) apply(rule B(2)) defer apply(subst norm_minus_commute) - apply(rule N[of n]) - proof safe show "N \ n" using n by auto - fix x::"'n::ordered_euclidean_space" assume x:"x \ ball 0 B" hence "x\ ball 0 ?B" by auto - thus "x\{a..b}" using ab by blast - show "x\?cube n" using x unfolding mem_interval mem_ball dist_norm apply- - proof case goal1 thus ?case using Basis_le_norm[of i x] `i\Basis` - using n by(auto simp add:field_simps setsum_negf) qed qed qed qed qed - -lemma integrable_altD: fixes f::"'n::ordered_euclidean_space \ 'a::banach" + apply (rule norm_triangle_half_l) + apply (rule B(2)) + defer + apply (subst norm_minus_commute) + apply (rule N[of n]) + proof safe + show "N \ n" + using n by auto + fix x :: 'n + assume x: "x \ ball 0 B" + then have "x \ ball 0 ?B" + by auto + then show "x \ {a..b}" + using ab by blast + show "x \ ?cube n" + using x + unfolding mem_interval mem_ball dist_norm + apply - + proof + case goal1 + then show ?case + using Basis_le_norm[of i x] `i \ Basis` + using n + by (auto simp add: field_simps setsum_negf) + qed + qed + qed + qed +qed + +lemma integrable_altD: + fixes f :: "'n::ordered_euclidean_space \ 'a::banach" assumes "f integrable_on s" shows "\a b. (\x. if x \ s then f x else 0) integrable_on {a..b}" - "\e. e>0 \ \B>0. \a b c d. ball 0 B \ {a..b} \ ball 0 B \ {c..d} - \ norm(integral {a..b} (\x. if x \ s then f x else 0) - integral {c..d} (\x. if x \ s then f x else 0)) < e" + and "\e. e > 0 \ \B>0. \a b c d. ball 0 B \ {a..b} \ ball 0 B \ {c..d} \ + norm (integral {a..b} (\x. if x \ s then f x else 0) - integral {c..d} (\x. if x \ s then f x else 0)) < e" using assms[unfolded integrable_alt[of f]] by auto -lemma integrable_on_subinterval: fixes f::"'n::ordered_euclidean_space \ 'a::banach" - assumes "f integrable_on s" "{a..b} \ s" shows "f integrable_on {a..b}" - apply(rule integrable_eq) defer apply(rule integrable_altD(1)[OF assms(1)]) - using assms(2) by auto - -subsection {* A straddling criterion for integrability. *} - -lemma integrable_straddle_interval: fixes f::"'n::ordered_euclidean_space \ real" - assumes "\e>0. \g h i j. (g has_integral i) ({a..b}) \ (h has_integral j) ({a..b}) \ - norm(i - j) < e \ (\x\{a..b}. (g x) \ (f x) \ (f x) \(h x))" +lemma integrable_on_subinterval: + fixes f :: "'n::ordered_euclidean_space \ 'a::banach" + assumes "f integrable_on s" + and "{a..b} \ s" shows "f integrable_on {a..b}" -proof(subst integrable_cauchy,safe) - case goal1 hence e:"e/3 > 0" by auto note assms[rule_format,OF this] - then guess g h i j apply- by(erule exE conjE)+ note obt = this + apply (rule integrable_eq) + defer + apply (rule integrable_altD(1)[OF assms(1)]) + using assms(2) + apply auto + done + + +subsection {* A straddling criterion for integrability *} + +lemma integrable_straddle_interval: + fixes f :: "'n::ordered_euclidean_space \ real" + assumes "\e>0. \g h i j. (g has_integral i) {a..b} \ (h has_integral j) {a..b} \ + norm (i - j) < e \ (\x\{a..b}. (g x) \ f x \ f x \ h x)" + shows "f integrable_on {a..b}" +proof (subst integrable_cauchy, safe) + case goal1 + then have e: "e/3 > 0" + by auto + note assms[rule_format,OF this] + then guess g h i j by (elim exE conjE) note obt = this from obt(1)[unfolded has_integral[of g], rule_format, OF e] guess d1 .. note d1=conjunctD2[OF this,rule_format] from obt(2)[unfolded has_integral[of h], rule_format, OF e] guess d2 .. note d2=conjunctD2[OF this,rule_format] - show ?case apply(rule_tac x="\x. d1 x \ d2 x" in exI) apply(rule conjI gauge_inter d1 d2)+ unfolding fine_inter - proof safe have **:"\i j g1 g2 h1 h2 f1 f2. g1 - h2 \ f1 - f2 \ f1 - f2 \ h1 - g2 \ - abs(i - j) < e / 3 \ abs(g2 - i) < e / 3 \ abs(g1 - i) < e / 3 \ - abs(h2 - j) < e / 3 \ abs(h1 - j) < e / 3 \ abs(f1 - f2) < e" using `e>0` by arith - case goal1 note tagged_division_ofD(2-4) note * = this[OF goal1(1)] this[OF goal1(4)] + show ?case + apply (rule_tac x="\x. d1 x \ d2 x" in exI) + apply (rule conjI gauge_inter d1 d2)+ + unfolding fine_inter + proof safe + have **: "\i j g1 g2 h1 h2 f1 f2. g1 - h2 \ f1 - f2 \ f1 - f2 \ h1 - g2 \ + abs (i - j) < e / 3 \ abs (g2 - i) < e / 3 \ abs (g1 - i) < e / 3 \ + abs (h2 - j) < e / 3 \ abs (h1 - j) < e / 3 \ abs (f1 - f2) < e" + using `e > 0` by arith + case goal1 + note tagged_division_ofD(2-4) note * = this[OF goal1(1)] this[OF goal1(4)] have "(\(x, k)\p1. content k *\<^sub>R f x) - (\(x, k)\p1. content k *\<^sub>R g x) \ 0" - "0 \ (\(x, k)\p2. content k *\<^sub>R h x) - (\(x, k)\p2. content k *\<^sub>R f x)" - "(\(x, k)\p2. content k *\<^sub>R f x) - (\(x, k)\p2. content k *\<^sub>R g x) \ 0" - "0 \ (\(x, k)\p1. content k *\<^sub>R h x) - (\(x, k)\p1. content k *\<^sub>R f x)" - unfolding setsum_subtractf[symmetric] apply- apply(rule_tac[!] setsum_nonneg) - apply safe unfolding real_scaleR_def right_diff_distrib[symmetric] - apply(rule_tac[!] mult_nonneg_nonneg) - proof- fix a b assume ab:"(a,b) \ p1" - show "0 \ content b" using *(3)[OF ab] apply safe using content_pos_le . thus "0 \ content b" . - show "0 \ f a - g a" "0 \ h a - f a" using *(1-2)[OF ab] using obt(4)[rule_format,of a] by auto - next fix a b assume ab:"(a,b) \ p2" - show "0 \ content b" using *(6)[OF ab] apply safe using content_pos_le . thus "0 \ content b" . - show "0 \ f a - g a" "0 \ h a - f a" using *(4-5)[OF ab] using obt(4)[rule_format,of a] by auto qed - - thus ?case apply- unfolding real_norm_def apply(rule **) defer defer - unfolding real_norm_def[symmetric] apply(rule obt(3)) - apply(rule d1(2)[OF conjI[OF goal1(4,5)]]) - apply(rule d1(2)[OF conjI[OF goal1(1,2)]]) - apply(rule d2(2)[OF conjI[OF goal1(4,6)]]) - apply(rule d2(2)[OF conjI[OF goal1(1,3)]]) by auto qed qed + and "0 \ (\(x, k)\p2. content k *\<^sub>R h x) - (\(x, k)\p2. content k *\<^sub>R f x)" + and "(\(x, k)\p2. content k *\<^sub>R f x) - (\(x, k)\p2. content k *\<^sub>R g x) \ 0" + and "0 \ (\(x, k)\p1. content k *\<^sub>R h x) - (\(x, k)\p1. content k *\<^sub>R f x)" + unfolding setsum_subtractf[symmetric] + apply - + apply (rule_tac[!] setsum_nonneg) + apply safe + unfolding real_scaleR_def right_diff_distrib[symmetric] + apply (rule_tac[!] mult_nonneg_nonneg) + proof - + fix a b + assume ab: "(a, b) \ p1" + show "0 \ content b" + using *(3)[OF ab] + apply safe + apply (rule content_pos_le) + done + then show "0 \ content b" . + show "0 \ f a - g a" "0 \ h a - f a" + using *(1-2)[OF ab] + using obt(4)[rule_format,of a] + by auto + next + fix a b + assume ab: "(a, b) \ p2" + show "0 \ content b" + using *(6)[OF ab] + apply safe + apply (rule content_pos_le) + done + then show "0 \ content b" . + show "0 \ f a - g a" and "0 \ h a - f a" + using *(4-5)[OF ab] using obt(4)[rule_format,of a] by auto + qed + then show ?case + apply - + unfolding real_norm_def + apply (rule **) + defer + defer + unfolding real_norm_def[symmetric] + apply (rule obt(3)) + apply (rule d1(2)[OF conjI[OF goal1(4,5)]]) + apply (rule d1(2)[OF conjI[OF goal1(1,2)]]) + apply (rule d2(2)[OF conjI[OF goal1(4,6)]]) + apply (rule d2(2)[OF conjI[OF goal1(1,3)]]) + apply auto + done + qed +qed lemma integrable_straddle: fixes f::"'n::ordered_euclidean_space \ real" assumes "\e>0. \g h i j. (g has_integral i) s \ (h has_integral j) s \