src/HOL/Analysis/Henstock_Kurzweil_Integration.thy
changeset 66536 9c95b2b54337
parent 66535 64035d9161d3
child 66537 e2249cd6df67
equal deleted inserted replaced
66535:64035d9161d3 66536:9c95b2b54337
  1979     qed
  1979     qed
  1980   qed
  1980   qed
  1981 qed
  1981 qed
  1982 
  1982 
  1983 
  1983 
  1984 lemma negligible_standard_hyperplane[intro]:
  1984 proposition negligible_standard_hyperplane[intro]:
  1985   fixes k :: "'a::euclidean_space"
  1985   fixes k :: "'a::euclidean_space"
  1986   assumes k: "k \<in> Basis"
  1986   assumes k: "k \<in> Basis"
  1987   shows "negligible {x. x\<bullet>k = c}"
  1987   shows "negligible {x. x\<bullet>k = c}"
  1988   unfolding negligible_def has_integral
  1988   unfolding negligible_def has_integral
  1989 proof (clarify, goal_cases)
  1989 proof clarsimp
  1990   case (1 a b e)
  1990   fix a b and e::real assume "e > 0"
  1991   from this and k obtain d where d: "0 < d" "content (cbox a b \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}) < e"
  1991   with k obtain d where d: "0 < d" "content (cbox a b \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}) < e"
  1992     by (rule content_doublesplit)
  1992     by (metis content_doublesplit)
  1993   let ?i = "indicator {x::'a. x\<bullet>k = c} :: 'a\<Rightarrow>real"
  1993   let ?i = "indicator {x::'a. x\<bullet>k = c} :: 'a\<Rightarrow>real"
  1994   show ?case
  1994   show "\<exists>\<gamma>. gauge \<gamma> \<and>
  1995     apply (rule_tac x="\<lambda>x. ball x d" in exI)
  1995            (\<forall>\<D>. \<D> tagged_division_of cbox a b \<and> \<gamma> fine \<D> \<longrightarrow>
  1996     apply rule
  1996                  \<bar>\<Sum>(x,K) \<in> \<D>. content K * ?i x\<bar> < e)"
  1997     apply (rule gauge_ball)
  1997   proof (intro exI, safe)
  1998     apply (rule d)
  1998     show "gauge (\<lambda>x. ball x d)"
  1999   proof (rule, rule)
  1999       using d(1) by blast
  2000     fix p
  2000   next
  2001     assume p: "p tagged_division_of (cbox a b) \<and> (\<lambda>x. ball x d) fine p"
  2001     fix \<D>
  2002     have *: "(\<Sum>(x, ka)\<in>p. content ka *\<^sub>R ?i x) =
  2002     assume p: "\<D> tagged_division_of (cbox a b)" "(\<lambda>x. ball x d) fine \<D>"
  2003       (\<Sum>(x, ka)\<in>p. content (ka \<inter> {x. \<bar>x\<bullet>k - c\<bar> \<le> d}) *\<^sub>R ?i x)"
  2003     have *: "(\<Sum>(x,K)\<in>\<D>. content K * ?i x) = (\<Sum>(x,K)\<in>\<D>. content (K \<inter> {x. \<bar>x\<bullet>k - c\<bar> \<le> d}) *\<^sub>R ?i x)"
  2004       apply (rule sum.cong)
  2004       apply (rule sum.cong [OF refl])
  2005       apply (rule refl)
       
  2006       unfolding split_paired_all real_scaleR_def mult_cancel_right split_conv
  2005       unfolding split_paired_all real_scaleR_def mult_cancel_right split_conv
  2007       apply cases
  2006       apply cases
  2008       apply (rule disjI1)
  2007        apply (rule disjI1)
  2009       apply assumption
  2008        apply assumption
  2010       apply (rule disjI2)
  2009       apply (rule disjI2)
  2011     proof -
  2010     proof -
  2012       fix x l
  2011       fix x l
  2013       assume as: "(x, l) \<in> p" "?i x \<noteq> 0"
  2012       assume as: "(x, l) \<in> \<D>" "?i x \<noteq> 0"
  2014       then have xk: "x\<bullet>k = c"
  2013       then have xk: "x\<bullet>k = c"
  2015         unfolding indicator_def
  2014         by (simp add: indicator_def split: if_split_asm)
  2016         apply -
       
  2017         apply (rule ccontr)
       
  2018         apply auto
       
  2019         done
       
  2020       show "content l = content (l \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d})"
  2015       show "content l = content (l \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d})"
  2021         apply (rule arg_cong[where f=content])
  2016         apply (rule arg_cong[where f=content])
  2022         apply (rule set_eqI)
  2017         apply (rule set_eqI)
  2023         apply rule
  2018         apply rule
  2024         apply rule
  2019          apply rule
  2025         unfolding mem_Collect_eq
  2020         unfolding mem_Collect_eq
  2026       proof -
  2021       proof -
  2027         fix y
  2022         fix y
  2028         assume y: "y \<in> l"
  2023         assume y: "y \<in> l"
  2029         note p[THEN conjunct2,unfolded fine_def,rule_format,OF as(1),unfolded split_conv]
  2024         note p(2)[unfolded fine_def,rule_format,OF as(1),unfolded split_conv]
  2030         note this[unfolded subset_eq mem_ball dist_norm,rule_format,OF y]
  2025         note this[unfolded subset_eq mem_ball dist_norm,rule_format,OF y]
  2031         note le_less_trans[OF Basis_le_norm[OF k] this]
  2026         note le_less_trans[OF Basis_le_norm[OF k] this]
  2032         then show "\<bar>y \<bullet> k - c\<bar> \<le> d"
  2027         then show "\<bar>y \<bullet> k - c\<bar> \<le> d"
  2033           unfolding inner_simps xk by auto
  2028           unfolding inner_simps xk by auto
  2034       qed auto
  2029       qed auto
  2035     qed
  2030     qed
  2036     note p'= tagged_division_ofD[OF p[THEN conjunct1]] and p''=division_of_tagged_division[OF p[THEN conjunct1]]
  2031     note p'= tagged_division_ofD[OF p(1)] and p''=division_of_tagged_division[OF p(1)]
  2037     have "(\<Sum>(x, ka)\<in>p. content (ka \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}) * indicator {x. x \<bullet> k = c} x) < e"
  2032     have "(\<Sum>(x,K)\<in>\<D>. content (K \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}) * indicator {x. x \<bullet> k = c} x) < e"
  2038     proof -
  2033     proof -
  2039       have "(\<Sum>(x, ka)\<in>p. content (ka \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}) * ?i x) \<le>
  2034       have "(\<Sum>(x,K)\<in>\<D>. content (K \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}) * ?i x) \<le>
  2040         (\<Sum>(x, ka)\<in>p. content (ka \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}))"
  2035         (\<Sum>(x,K)\<in>\<D>. content (K \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}))"
  2041         apply (rule sum_mono)
  2036         apply (rule sum_mono)
  2042         unfolding split_paired_all split_conv
  2037         unfolding split_paired_all split_conv
  2043         apply (rule mult_right_le_one_le)
  2038         apply (rule mult_right_le_one_le)
  2044         apply (drule p'(4))
  2039           apply (drule p'(4))
  2045         apply (auto simp add:interval_doublesplit[OF k])
  2040           apply (auto simp add:interval_doublesplit[OF k])
  2046         done
  2041         done
  2047       also have "\<dots> < e"
  2042       also have "\<dots> < e"
  2048       proof (subst sum.over_tagged_division_lemma[OF p[THEN conjunct1]], goal_cases)
  2043       proof (subst sum.over_tagged_division_lemma[OF p(1)], goal_cases)
  2049         case prems: (1 u v)
  2044         case prems: (1 u v)
  2050         then have *: "content (cbox u v) = 0"
  2045         then have *: "content (cbox u v) = 0"
  2051           unfolding content_eq_0_interior by simp
  2046           unfolding content_eq_0_interior by simp
  2052         have "content (cbox u v \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}) \<le> content (cbox u v)"
  2047         have "content (cbox u v \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}) \<le> content (cbox u v)"
  2053           unfolding interval_doublesplit[OF k]
  2048           unfolding interval_doublesplit[OF k]
  2057           done
  2052           done
  2058         then show ?case
  2053         then show ?case
  2059           unfolding * interval_doublesplit[OF k]
  2054           unfolding * interval_doublesplit[OF k]
  2060           by (blast intro: antisym)
  2055           by (blast intro: antisym)
  2061       next
  2056       next
  2062         have "(\<Sum>l\<in>snd ` p. content (l \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d})) =
  2057         have "(\<Sum>l\<in>snd ` \<D>. content (l \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d})) =
  2063           sum content ((\<lambda>l. l \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d})`{l\<in>snd ` p. l \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d} \<noteq> {}})"
  2058           sum content ((\<lambda>l. l \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d})`{l\<in>snd ` \<D>. l \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d} \<noteq> {}})"
  2064         proof (subst (2) sum.reindex_nontrivial)
  2059         proof (subst (2) sum.reindex_nontrivial)
  2065           fix x y assume "x \<in> {l \<in> snd ` p. l \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d} \<noteq> {}}" "y \<in> {l \<in> snd ` p. l \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d} \<noteq> {}}"
  2060           fix x y assume "x \<in> {l \<in> snd ` \<D>. l \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d} \<noteq> {}}" "y \<in> {l \<in> snd ` \<D>. l \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d} \<noteq> {}}"
  2066             "x \<noteq> y" and eq: "x \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d} = y \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}"
  2061             "x \<noteq> y" and eq: "x \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d} = y \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}"
  2067           then obtain x' y' where "(x', x) \<in> p" "x \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d} \<noteq> {}" "(y', y) \<in> p" "y \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d} \<noteq> {}"
  2062           then obtain x' y' where "(x', x) \<in> \<D>" "x \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d} \<noteq> {}" "(y', y) \<in> \<D>" "y \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d} \<noteq> {}"
  2068             by (auto)
  2063             by (auto)
  2069           from p'(5)[OF \<open>(x', x) \<in> p\<close> \<open>(y', y) \<in> p\<close>] \<open>x \<noteq> y\<close> have "interior (x \<inter> y) = {}"
  2064           from p'(5)[OF \<open>(x', x) \<in> \<D>\<close> \<open>(y', y) \<in> \<D>\<close>] \<open>x \<noteq> y\<close> have "interior (x \<inter> y) = {}"
  2070             by auto
  2065             by auto
  2071           moreover have "interior ((x \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}) \<inter> (y \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d})) \<subseteq> interior (x \<inter> y)"
  2066           moreover have "interior ((x \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}) \<inter> (y \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d})) \<subseteq> interior (x \<inter> y)"
  2072             by (auto intro: interior_mono)
  2067             by (auto intro: interior_mono)
  2073           ultimately have "interior (x \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}) = {}"
  2068           ultimately have "interior (x \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}) = {}"
  2074             by (auto simp: eq)
  2069             by (auto simp: eq)
  2075           then show "content (x \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}) = 0"
  2070           then show "content (x \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}) = 0"
  2076             using p'(4)[OF \<open>(x', x) \<in> p\<close>] by (auto simp: interval_doublesplit[OF k] content_eq_0_interior simp del: interior_Int)
  2071             using p'(4)[OF \<open>(x', x) \<in> \<D>\<close>] by (auto simp: interval_doublesplit[OF k] content_eq_0_interior simp del: interior_Int)
  2077         qed (insert p'(1), auto intro!: sum.mono_neutral_right)
  2072         qed (insert p'(1), auto intro!: sum.mono_neutral_right)
  2078         also have "\<dots> \<le> norm (\<Sum>l\<in>(\<lambda>l. l \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d})`{l\<in>snd ` p. l \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d} \<noteq> {}}. content l *\<^sub>R 1::real)"
  2073         also have "\<dots> \<le> norm (\<Sum>l\<in>(\<lambda>l. l \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d})`{l\<in>snd ` \<D>. l \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d} \<noteq> {}}. content l *\<^sub>R 1::real)"
  2079           by simp
  2074           by simp
  2080         also have "\<dots> \<le> 1 * content (cbox a b \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d})"
  2075         also have "\<dots> \<le> 1 * content (cbox a b \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d})"
  2081           using division_doublesplit[OF p'' k, unfolded interval_doublesplit[OF k]]
  2076           using division_doublesplit[OF p'' k, unfolded interval_doublesplit[OF k]]
  2082           unfolding interval_doublesplit[OF k] by (intro dsum_bound) auto
  2077           unfolding interval_doublesplit[OF k] by (intro dsum_bound) auto
  2083         also have "\<dots> < e"
  2078         also have "\<dots> < e"
  2084           using d(2) by simp
  2079           using d(2) by simp
  2085         finally show "(\<Sum>ka\<in>snd ` p. content (ka \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d})) < e" .
  2080         finally show "(\<Sum>K\<in>snd ` \<D>. content (K \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d})) < e" .
  2086       qed
  2081       qed
  2087       finally show "(\<Sum>(x, ka)\<in>p. content (ka \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}) * ?i x) < e" .
  2082       finally show "(\<Sum>(x, K)\<in>\<D>. content (K \<inter> {x. \<bar>x \<bullet> k - c\<bar> \<le> d}) * ?i x) < e" .
  2088     qed
  2083     qed
  2089     then show "norm ((\<Sum>(x, ka)\<in>p. content ka *\<^sub>R ?i x) - 0) < e"
  2084     then show "\<bar>\<Sum>(x, K)\<in>\<D>. content K * ?i x\<bar> < e"
  2090       unfolding * real_norm_def
  2085       unfolding * 
  2091       apply (subst abs_of_nonneg)
  2086       apply (subst abs_of_nonneg)
  2092       using measure_nonneg  by (force simp add: indicator_def intro: sum_nonneg)+
  2087       using measure_nonneg       
       
  2088       by (force simp add: indicator_def intro: sum_nonneg)+
  2093   qed
  2089   qed
  2094 qed
  2090 qed
  2095 
  2091 
  2096 
  2092 
  2097 subsubsection \<open>Hence the main theorem about negligible sets.\<close>
  2093 subsubsection \<open>Hence the main theorem about negligible sets.\<close>
  2958   assumes "0 \<le> e"
  2954   assumes "0 \<le> e"
  2959   shows "operative conj True (\<lambda>i. f integrable_on i)"
  2955   shows "operative conj True (\<lambda>i. f integrable_on i)"
  2960 proof -
  2956 proof -
  2961   interpret comm_monoid conj True
  2957   interpret comm_monoid conj True
  2962     by standard auto
  2958     by standard auto
       
  2959   have 1: "\<And>a b. box a b = {} \<Longrightarrow> f integrable_on cbox a b"
       
  2960     by (simp add: content_eq_0_interior integrable_on_null)
       
  2961   have 2: "\<And>a b c k.
       
  2962        \<lbrakk>k \<in> Basis;
       
  2963         f integrable_on cbox a b \<inter> {x. x \<bullet> k \<le> c};
       
  2964         f integrable_on cbox a b \<inter> {x. c \<le> x \<bullet> k}\<rbrakk>
       
  2965        \<Longrightarrow> f integrable_on cbox a b"
       
  2966     unfolding integrable_on_def by (auto intro!: has_integral_split)
  2963   show ?thesis
  2967   show ?thesis
  2964     apply standard
  2968     apply standard
  2965     apply safe
  2969     using 1 2 by blast+
  2966        apply (subst integrable_on_def)
       
  2967        apply rule
       
  2968        apply (rule has_integral_null_eq[where i=0, THEN iffD2])
       
  2969         apply (simp add: content_eq_0_interior)
       
  2970        apply rule
       
  2971       apply (rule, assumption, assumption)+
       
  2972     unfolding integrable_on_def
       
  2973     apply (auto intro!: has_integral_split)
       
  2974     done
       
  2975 qed
  2970 qed
  2976 
  2971 
  2977 lemma integrable_subinterval:
  2972 lemma integrable_subinterval:
  2978   fixes f :: "'b::euclidean_space \<Rightarrow> 'a::banach"
  2973   fixes f :: "'b::euclidean_space \<Rightarrow> 'a::banach"
  2979   assumes "f integrable_on cbox a b"
  2974   assumes "f integrable_on cbox a b"
  3160 done
  3155 done
  3161 
  3156 
  3162 lemma antiderivative_continuous:
  3157 lemma antiderivative_continuous:
  3163   fixes q b :: real
  3158   fixes q b :: real
  3164   assumes "continuous_on {a..b} f"
  3159   assumes "continuous_on {a..b} f"
  3165   obtains g where "\<forall>x\<in>{a..b}. (g has_vector_derivative (f x::_::banach)) (at x within {a..b})"
  3160   obtains g where "\<And>x. x \<in> {a..b} \<Longrightarrow> (g has_vector_derivative (f x::_::banach)) (at x within {a..b})"
  3166   apply (rule that)
  3161   using integral_has_vector_derivative[OF assms] by auto
  3167   apply rule
       
  3168   using integral_has_vector_derivative[OF assms]
       
  3169   apply auto
       
  3170   done
       
  3171 
  3162 
  3172 
  3163 
  3173 subsection \<open>Combined fundamental theorem of calculus.\<close>
  3164 subsection \<open>Combined fundamental theorem of calculus.\<close>
  3174 
  3165 
  3175 lemma antiderivative_integral_continuous:
  3166 lemma antiderivative_integral_continuous:
  3489 subsection \<open>even more special cases.\<close>
  3480 subsection \<open>even more special cases.\<close>
  3490 
  3481 
  3491 lemma uminus_interval_vector[simp]:
  3482 lemma uminus_interval_vector[simp]:
  3492   fixes a b :: "'a::euclidean_space"
  3483   fixes a b :: "'a::euclidean_space"
  3493   shows "uminus ` cbox a b = cbox (-b) (-a)"
  3484   shows "uminus ` cbox a b = cbox (-b) (-a)"
  3494   apply (rule set_eqI)
  3485   apply safe
  3495   apply rule
  3486    apply (simp add: mem_box(2))
  3496   defer
  3487   apply (rule_tac x="-x" in image_eqI)
  3497   unfolding image_iff
  3488    apply (auto simp add: mem_box)
  3498   apply (rule_tac x="-x" in bexI)
       
  3499   apply (auto simp add:minus_le_iff le_minus_iff mem_box)
       
  3500   done
  3489   done
  3501 
  3490 
  3502 lemma has_integral_reflect_lemma[intro]:
  3491 lemma has_integral_reflect_lemma[intro]:
  3503   assumes "(f has_integral i) (cbox a b)"
  3492   assumes "(f has_integral i) (cbox a b)"
  3504   shows "((\<lambda>x. f(-x)) has_integral i) (cbox (-b) (-a))"
  3493   shows "((\<lambda>x. f(-x)) has_integral i) (cbox (-b) (-a))"
  3512   unfolding box_real[symmetric]
  3501   unfolding box_real[symmetric]
  3513   by (rule has_integral_reflect_lemma)
  3502   by (rule has_integral_reflect_lemma)
  3514 
  3503 
  3515 lemma has_integral_reflect[simp]:
  3504 lemma has_integral_reflect[simp]:
  3516   "((\<lambda>x. f (-x)) has_integral i) (cbox (-b) (-a)) \<longleftrightarrow> (f has_integral i) (cbox a b)"
  3505   "((\<lambda>x. f (-x)) has_integral i) (cbox (-b) (-a)) \<longleftrightarrow> (f has_integral i) (cbox a b)"
  3517   apply rule
  3506   by (auto dest: has_integral_reflect_lemma)
  3518   apply (drule_tac[!] has_integral_reflect_lemma)
       
  3519   apply auto
       
  3520   done
       
  3521 
  3507 
  3522 lemma integrable_reflect[simp]: "(\<lambda>x. f(-x)) integrable_on cbox (-b) (-a) \<longleftrightarrow> f integrable_on cbox a b"
  3508 lemma integrable_reflect[simp]: "(\<lambda>x. f(-x)) integrable_on cbox (-b) (-a) \<longleftrightarrow> f integrable_on cbox a b"
  3523   unfolding integrable_on_def by auto
  3509   unfolding integrable_on_def by auto
  3524 
  3510 
  3525 lemma integrable_reflect_real[simp]: "(\<lambda>x. f(-x)) integrable_on {-b .. -a} \<longleftrightarrow> f integrable_on {a..b::real}"
  3511 lemma integrable_reflect_real[simp]: "(\<lambda>x. f(-x)) integrable_on {-b .. -a} \<longleftrightarrow> f integrable_on {a..b::real}"
  4444   (is "?l = ?r")
  4430   (is "?l = ?r")
  4445 proof (cases "cbox c d = {}")
  4431 proof (cases "cbox c d = {}")
  4446   case False
  4432   case False
  4447   let ?g = "\<lambda>x. if x \<in> cbox c d then f x else 0"
  4433   let ?g = "\<lambda>x. if x \<in> cbox c d then f x else 0"
  4448   show ?thesis
  4434   show ?thesis
  4449     apply rule
  4435   proof 
  4450     defer
       
  4451     apply (rule has_integral_restrict_closed_subinterval[OF _ assms])
       
  4452     apply assumption
       
  4453   proof -
       
  4454     assume ?l
  4436     assume ?l
  4455     then have "?g integrable_on cbox c d"
  4437     then have "?g integrable_on cbox c d"
  4456       using assms has_integral_integrable integrable_subinterval by blast
  4438       using assms has_integral_integrable integrable_subinterval by blast
  4457     then have *: "f integrable_on cbox c d"
  4439     then have "f integrable_on cbox c d"
  4458       apply -
  4440       apply -
  4459       apply (rule integrable_eq)
  4441       apply (rule integrable_eq)
  4460       apply auto
  4442       apply auto
  4461       done
  4443       done
  4462     then have "i = integral (cbox c d) f"
  4444     moreover then have "i = integral (cbox c d) f"
  4463       apply -
  4445       by (meson \<open>((\<lambda>x. if x \<in> cbox c d then f x else 0) has_integral i) (cbox a b)\<close> assms has_integral_restrict_closed_subinterval has_integral_unique integrable_integral)
  4464       apply (rule has_integral_unique)
  4446     ultimately show ?r by auto
  4465       apply (rule \<open>?l\<close>)
  4447   next
  4466       apply (rule has_integral_restrict_closed_subinterval[OF _ assms])
  4448     assume ?r then show ?l
  4467       apply auto
  4449       by (rule has_integral_restrict_closed_subinterval[OF _ assms])
  4468       done
       
  4469     then show ?r
       
  4470       using * by auto
       
  4471   qed
  4450   qed
  4472 qed auto
  4451 qed auto
  4473 
  4452 
  4474 
  4453 
  4475 text \<open>Hence we can apply the limit process uniformly to all integrals.\<close>
  4454 text \<open>Hence we can apply the limit process uniformly to all integrals.\<close>