src/HOL/Analysis/Henstock_Kurzweil_Integration.thy
changeset 66112 0e640e04fc56
parent 66089 def95e0bc529
child 66154 bc5e6461f759
equal deleted inserted replaced
66111:20304512a33b 66112:0e640e04fc56
   185 lemma content_real_eq_0: "content {a .. b::real} = 0 \<longleftrightarrow> a \<ge> b"
   185 lemma content_real_eq_0: "content {a .. b::real} = 0 \<longleftrightarrow> a \<ge> b"
   186   by (metis atLeastatMost_empty_iff2 content_empty content_real diff_self eq_iff le_cases le_iff_diff_le_0)
   186   by (metis atLeastatMost_empty_iff2 content_empty content_real diff_self eq_iff le_cases le_iff_diff_le_0)
   187 
   187 
   188 lemma property_empty_interval: "\<forall>a b. content (cbox a b) = 0 \<longrightarrow> P (cbox a b) \<Longrightarrow> P {}"
   188 lemma property_empty_interval: "\<forall>a b. content (cbox a b) = 0 \<longrightarrow> P (cbox a b) \<Longrightarrow> P {}"
   189   using content_empty unfolding empty_as_interval by auto
   189   using content_empty unfolding empty_as_interval by auto
       
   190 
       
   191 lemma interval_bounds_nz_content [simp]:
       
   192   assumes "content (cbox a b) \<noteq> 0"
       
   193   shows "interval_upperbound (cbox a b) = b"
       
   194     and "interval_lowerbound (cbox a b) = a"
       
   195   by (metis assms content_empty interval_bounds')+
   190 
   196 
   191 subsection \<open>Gauge integral\<close>
   197 subsection \<open>Gauge integral\<close>
   192 
   198 
   193 text \<open>Case distinction to define it first on compact intervals first, then use a limit. This is only
   199 text \<open>Case distinction to define it first on compact intervals first, then use a limit. This is only
   194 much later unified. In Fremlin: Measure Theory, Volume 4I this is generalized using residual sets.\<close>
   200 much later unified. In Fremlin: Measure Theory, Volume 4I this is generalized using residual sets.\<close>
   567         done
   573         done
   568     qed
   574     qed
   569   qed
   575   qed
   570 qed
   576 qed
   571 
   577 
   572 lemma has_integral_sub:
   578 lemma has_integral_diff:
   573   "(f has_integral k) s \<Longrightarrow> (g has_integral l) s \<Longrightarrow>
   579   "(f has_integral k) s \<Longrightarrow> (g has_integral l) s \<Longrightarrow>
   574     ((\<lambda>x. f x - g x) has_integral (k - l)) s"
   580     ((\<lambda>x. f x - g x) has_integral (k - l)) s"
   575   using has_integral_add[OF _ has_integral_neg, of f k s g l]
   581   using has_integral_add[OF _ has_integral_neg, of f k s g l]
   576   by (auto simp: algebra_simps)
   582   by (auto simp: algebra_simps)
   577 
   583 
   604   with False show ?thesis by (simp add: not_integrable_integral)
   610   with False show ?thesis by (simp add: not_integrable_integral)
   605 qed
   611 qed
   606 
   612 
   607 lemma integral_diff: "f integrable_on s \<Longrightarrow> g integrable_on s \<Longrightarrow>
   613 lemma integral_diff: "f integrable_on s \<Longrightarrow> g integrable_on s \<Longrightarrow>
   608     integral s (\<lambda>x. f x - g x) = integral s f - integral s g"
   614     integral s (\<lambda>x. f x - g x) = integral s f - integral s g"
   609   by (rule integral_unique) (metis integrable_integral has_integral_sub)
   615   by (rule integral_unique) (metis integrable_integral has_integral_diff)
   610 
   616 
   611 lemma integrable_0: "(\<lambda>x. 0) integrable_on s"
   617 lemma integrable_0: "(\<lambda>x. 0) integrable_on s"
   612   unfolding integrable_on_def using has_integral_0 by auto
   618   unfolding integrable_on_def using has_integral_0 by auto
   613 
   619 
   614 lemma integrable_add: "f integrable_on s \<Longrightarrow> g integrable_on s \<Longrightarrow> (\<lambda>x. f x + g x) integrable_on s"
   620 lemma integrable_add: "f integrable_on s \<Longrightarrow> g integrable_on s \<Longrightarrow> (\<lambda>x. f x + g x) integrable_on s"
   633 lemma integrable_neg: "f integrable_on s \<Longrightarrow> (\<lambda>x. -f(x)) integrable_on s"
   639 lemma integrable_neg: "f integrable_on s \<Longrightarrow> (\<lambda>x. -f(x)) integrable_on s"
   634   unfolding integrable_on_def by(auto intro: has_integral_neg)
   640   unfolding integrable_on_def by(auto intro: has_integral_neg)
   635 
   641 
   636 lemma integrable_diff:
   642 lemma integrable_diff:
   637   "f integrable_on s \<Longrightarrow> g integrable_on s \<Longrightarrow> (\<lambda>x. f x - g x) integrable_on s"
   643   "f integrable_on s \<Longrightarrow> g integrable_on s \<Longrightarrow> (\<lambda>x. f x - g x) integrable_on s"
   638   unfolding integrable_on_def by(auto intro: has_integral_sub)
   644   unfolding integrable_on_def by(auto intro: has_integral_diff)
   639 
   645 
   640 lemma integrable_linear:
   646 lemma integrable_linear:
   641   "f integrable_on s \<Longrightarrow> bounded_linear h \<Longrightarrow> (h \<circ> f) integrable_on s"
   647   "f integrable_on s \<Longrightarrow> bounded_linear h \<Longrightarrow> (h \<circ> f) integrable_on s"
   642   unfolding integrable_on_def by(auto intro: has_integral_linear)
   648   unfolding integrable_on_def by(auto intro: has_integral_linear)
   643 
   649 
   678 
   684 
   679 lemma has_integral_eq:
   685 lemma has_integral_eq:
   680   assumes "\<And>x. x \<in> s \<Longrightarrow> f x = g x"
   686   assumes "\<And>x. x \<in> s \<Longrightarrow> f x = g x"
   681     and "(f has_integral k) s"
   687     and "(f has_integral k) s"
   682   shows "(g has_integral k) s"
   688   shows "(g has_integral k) s"
   683   using has_integral_sub[OF assms(2), of "\<lambda>x. f x - g x" 0]
   689   using has_integral_diff[OF assms(2), of "\<lambda>x. f x - g x" 0]
   684   using has_integral_is_0[of s "\<lambda>x. f x - g x"]
   690   using has_integral_is_0[of s "\<lambda>x. f x - g x"]
   685   using assms(1)
   691   using assms(1)
   686   by auto
   692   by auto
   687 
   693 
   688 lemma integrable_eq: "(\<And>x. x \<in> s \<Longrightarrow> f x = g x) \<Longrightarrow> f integrable_on s \<Longrightarrow> g integrable_on s"
   694 lemma integrable_eq: "(\<And>x. x \<in> s \<Longrightarrow> f x = g x) \<Longrightarrow> f integrable_on s \<Longrightarrow> g integrable_on s"
   772 lemma has_integral_refl[intro]:
   778 lemma has_integral_refl[intro]:
   773   fixes a :: "'a::euclidean_space"
   779   fixes a :: "'a::euclidean_space"
   774   shows "(f has_integral 0) (cbox a a)"
   780   shows "(f has_integral 0) (cbox a a)"
   775     and "(f has_integral 0) {a}"
   781     and "(f has_integral 0) {a}"
   776 proof -
   782 proof -
   777   have *: "{a} = cbox a a"
   783   show "(f has_integral 0) (cbox a a)"
   778     apply (rule set_eqI)
   784      by (rule has_integral_null) simp
   779     unfolding mem_box singleton_iff euclidean_eq_iff[where 'a='a]
   785   then show "(f has_integral 0) {a}"
   780     apply safe
   786     by simp
   781     prefer 3
       
   782     apply (erule_tac x=b in ballE)
       
   783     apply (auto simp add: field_simps)
       
   784     done
       
   785   show "(f has_integral 0) (cbox a a)" "(f has_integral 0) {a}"
       
   786     unfolding *
       
   787     apply (rule_tac[!] has_integral_null)
       
   788     unfolding content_eq_0_interior
       
   789     unfolding interior_cbox
       
   790     using box_sing
       
   791     apply auto
       
   792     done
       
   793 qed
   787 qed
   794 
   788 
   795 lemma integrable_on_refl[intro]: "f integrable_on cbox a a"
   789 lemma integrable_on_refl[intro]: "f integrable_on cbox a a"
   796   unfolding integrable_on_def by auto
   790   unfolding integrable_on_def by auto
   797 
   791 
   992     by auto
   986     by auto
   993   show ?thesis
   987   show ?thesis
   994     unfolding k1 interval_split[OF \<open>k \<in> Basis\<close>]
   988     unfolding k1 interval_split[OF \<open>k \<in> Basis\<close>]
   995     unfolding content_eq_0_interior
   989     unfolding content_eq_0_interior
   996     unfolding interval_split[OF \<open>k \<in> Basis\<close>, symmetric] k1[symmetric]
   990     unfolding interval_split[OF \<open>k \<in> Basis\<close>, symmetric] k1[symmetric]
   997     by (rule tagged_division_split_left_inj[OF assms])
   991     by (metis tagged_division_split_left_inj assms)
   998 qed
   992 qed
   999 
   993 
  1000 lemma tagged_division_split_right_inj_content:
   994 lemma tagged_division_split_right_inj_content:
  1001   assumes d: "d tagged_division_of i"
   995   assumes d: "d tagged_division_of i"
  1002     and "(x1, k1) \<in> d" "(x2, k2) \<in> d" "k1 \<noteq> k2" "k1 \<inter> {x. x\<bullet>k \<ge> c} = k2 \<inter> {x. x\<bullet>k \<ge> c}" "k \<in> Basis"
   996     and "(x1, k1) \<in> d" "(x2, k2) \<in> d" "k1 \<noteq> k2" "k1 \<inter> {x. x\<bullet>k \<ge> c} = k2 \<inter> {x. x\<bullet>k \<ge> c}" "k \<in> Basis"
  1006     by auto
  1000     by auto
  1007   show ?thesis
  1001   show ?thesis
  1008     unfolding k1 interval_split[OF \<open>k \<in> Basis\<close>]
  1002     unfolding k1 interval_split[OF \<open>k \<in> Basis\<close>]
  1009     unfolding content_eq_0_interior
  1003     unfolding content_eq_0_interior
  1010     unfolding interval_split[OF \<open>k \<in> Basis\<close>, symmetric] k1[symmetric]
  1004     unfolding interval_split[OF \<open>k \<in> Basis\<close>, symmetric] k1[symmetric]
  1011     by (rule tagged_division_split_right_inj[OF assms])
  1005     by (metis tagged_division_split_right_inj assms)
  1012 qed
  1006 qed
  1013 
  1007 
  1014 lemma has_integral_split:
  1008 lemma has_integral_split:
  1015   fixes f :: "'a::euclidean_space \<Rightarrow> 'b::real_normed_vector"
  1009   fixes f :: "'a::euclidean_space \<Rightarrow> 'b::real_normed_vector"
  1016   assumes fi: "(f has_integral i) (cbox a b \<inter> {x. x\<bullet>k \<le> c})"
  1010   assumes fi: "(f has_integral i) (cbox a b \<inter> {x. x\<bullet>k \<le> c})"
  3147       have "f integrable_on {a..y}"
  3141       have "f integrable_on {a..y}"
  3148         using f y by (simp add: integrable_subinterval_real)
  3142         using f y by (simp add: integrable_subinterval_real)
  3149       then have Idiff: "?I a y - ?I a x = ?I x y"
  3143       then have Idiff: "?I a y - ?I a x = ?I x y"
  3150         using False x by (simp add: algebra_simps integral_combine)
  3144         using False x by (simp add: algebra_simps integral_combine)
  3151       have fux_int: "((\<lambda>u. f u - f x) has_integral integral {x..y} f - (y - x) *\<^sub>R f x) {x..y}"
  3145       have fux_int: "((\<lambda>u. f u - f x) has_integral integral {x..y} f - (y - x) *\<^sub>R f x) {x..y}"
  3152         apply (rule has_integral_sub)
  3146         apply (rule has_integral_diff)
  3153         using x y apply (force intro: integrable_integral [OF integrable_subinterval_real [OF f]])
  3147         using x y apply (force intro: integrable_integral [OF integrable_subinterval_real [OF f]])
  3154         using has_integral_const_real [of "f x" x y] False
  3148         using has_integral_const_real [of "f x" x y] False
  3155         apply (simp add: )
  3149         apply (simp add: )
  3156         done
  3150         done
  3157       show ?thesis
  3151       show ?thesis
  3165       have "f integrable_on {a..x}"
  3159       have "f integrable_on {a..x}"
  3166         using f x by (simp add: integrable_subinterval_real)
  3160         using f x by (simp add: integrable_subinterval_real)
  3167       then have Idiff: "?I a x - ?I a y = ?I y x"
  3161       then have Idiff: "?I a x - ?I a y = ?I y x"
  3168         using True x y by (simp add: algebra_simps integral_combine)
  3162         using True x y by (simp add: algebra_simps integral_combine)
  3169       have fux_int: "((\<lambda>u. f u - f x) has_integral integral {y..x} f - (x - y) *\<^sub>R f x) {y..x}"
  3163       have fux_int: "((\<lambda>u. f u - f x) has_integral integral {y..x} f - (x - y) *\<^sub>R f x) {y..x}"
  3170         apply (rule has_integral_sub)
  3164         apply (rule has_integral_diff)
  3171         using x y apply (force intro: integrable_integral [OF integrable_subinterval_real [OF f]])
  3165         using x y apply (force intro: integrable_integral [OF integrable_subinterval_real [OF f]])
  3172         using has_integral_const_real [of "f x" y x] True
  3166         using has_integral_const_real [of "f x" y x] True
  3173         apply (simp add: )
  3167         apply (simp add: )
  3174         done
  3168         done
  3175       have "norm (integral {a..x} f - integral {a..y} f - (x - y) *\<^sub>R f x) \<le> e * \<bar>y - x\<bar>"
  3169       have "norm (integral {a..x} f - integral {a..y} f - (x - y) *\<^sub>R f x) \<le> e * \<bar>y - x\<bar>"
  5067     unfolding *
  5061     unfolding *
  5068     apply rule
  5062     apply rule
  5069     done
  5063     done
  5070 qed
  5064 qed
  5071 
  5065 
  5072 lemma has_integral_restrict_univ:
  5066 lemma has_integral_restrict_UNIV:
  5073   fixes f :: "'n::euclidean_space \<Rightarrow> 'a::banach"
  5067   fixes f :: "'n::euclidean_space \<Rightarrow> 'a::banach"
  5074   shows "((\<lambda>x. if x \<in> s then f x else 0) has_integral i) UNIV \<longleftrightarrow> (f has_integral i) s"
  5068   shows "((\<lambda>x. if x \<in> s then f x else 0) has_integral i) UNIV \<longleftrightarrow> (f has_integral i) s"
  5075   by auto
  5069   by auto
  5076 
  5070 
  5077 lemma has_integral_on_superset:
  5071 lemma has_integral_on_superset:
  5086     using assms(1-2)
  5080     using assms(1-2)
  5087     apply auto
  5081     apply auto
  5088     done
  5082     done
  5089   then show ?thesis
  5083   then show ?thesis
  5090     using assms(3)
  5084     using assms(3)
  5091     apply (subst has_integral_restrict_univ[symmetric])
  5085     apply (subst has_integral_restrict_UNIV[symmetric])
  5092     apply (subst(asm) has_integral_restrict_univ[symmetric])
  5086     apply (subst(asm) has_integral_restrict_UNIV[symmetric])
  5093     apply auto
  5087     apply auto
  5094     done
  5088     done
  5095 qed
  5089 qed
  5096 
  5090 
  5097 lemma integrable_on_superset:
  5091 lemma integrable_on_superset:
  5106 
  5100 
  5107 lemma integral_restrict_univ[intro]:
  5101 lemma integral_restrict_univ[intro]:
  5108   fixes f :: "'n::euclidean_space \<Rightarrow> 'a::banach"
  5102   fixes f :: "'n::euclidean_space \<Rightarrow> 'a::banach"
  5109   shows "f integrable_on s \<Longrightarrow> integral UNIV (\<lambda>x. if x \<in> s then f x else 0) = integral s f"
  5103   shows "f integrable_on s \<Longrightarrow> integral UNIV (\<lambda>x. if x \<in> s then f x else 0) = integral s f"
  5110   apply (rule integral_unique)
  5104   apply (rule integral_unique)
  5111   unfolding has_integral_restrict_univ
  5105   unfolding has_integral_restrict_UNIV
  5112   apply auto
  5106   apply auto
  5113   done
  5107   done
  5114 
  5108 
  5115 lemma integrable_restrict_univ:
  5109 lemma integrable_restrict_UNIV:
  5116   fixes f :: "'n::euclidean_space \<Rightarrow> 'a::banach"
  5110   fixes f :: "'n::euclidean_space \<Rightarrow> 'a::banach"
  5117   shows "(\<lambda>x. if x \<in> s then f x else 0) integrable_on UNIV \<longleftrightarrow> f integrable_on s"
  5111   shows "(\<lambda>x. if x \<in> s then f x else 0) integrable_on UNIV \<longleftrightarrow> f integrable_on s"
  5118   unfolding integrable_on_def
  5112   unfolding integrable_on_def
  5119   by auto
  5113   by auto
  5120 
  5114 
  5162 
  5156 
  5163 lemma has_integral_spike_set_eq:
  5157 lemma has_integral_spike_set_eq:
  5164   fixes f :: "'n::euclidean_space \<Rightarrow> 'a::banach"
  5158   fixes f :: "'n::euclidean_space \<Rightarrow> 'a::banach"
  5165   assumes "negligible ((s - t) \<union> (t - s))"
  5159   assumes "negligible ((s - t) \<union> (t - s))"
  5166   shows "(f has_integral y) s \<longleftrightarrow> (f has_integral y) t"
  5160   shows "(f has_integral y) s \<longleftrightarrow> (f has_integral y) t"
  5167   unfolding has_integral_restrict_univ[symmetric,of f]
  5161   unfolding has_integral_restrict_UNIV[symmetric,of f]
  5168   apply (rule has_integral_spike_eq[OF assms])
  5162   apply (rule has_integral_spike_eq[OF assms])
  5169   by (auto split: if_split_asm)
  5163   by (auto split: if_split_asm)
  5170 
  5164 
  5171 lemma has_integral_spike_set:
  5165 lemma has_integral_spike_set:
  5172   fixes f :: "'n::euclidean_space \<Rightarrow> 'a::banach"
  5166   fixes f :: "'n::euclidean_space \<Rightarrow> 'a::banach"
  5193   fixes f :: "'n::euclidean_space \<Rightarrow> 'm::euclidean_space"
  5187   fixes f :: "'n::euclidean_space \<Rightarrow> 'm::euclidean_space"
  5194   assumes k: "k \<in> Basis"
  5188   assumes k: "k \<in> Basis"
  5195     and as: "s \<subseteq> t" "(f has_integral i) s" "(f has_integral j) t" "\<forall>x\<in>t. 0 \<le> f(x)\<bullet>k"
  5189     and as: "s \<subseteq> t" "(f has_integral i) s" "(f has_integral j) t" "\<forall>x\<in>t. 0 \<le> f(x)\<bullet>k"
  5196   shows "i\<bullet>k \<le> j\<bullet>k"
  5190   shows "i\<bullet>k \<le> j\<bullet>k"
  5197 proof -
  5191 proof -
  5198   note has_integral_restrict_univ[symmetric, of f]
  5192   note has_integral_restrict_UNIV[symmetric, of f]
  5199   note as(2-3)[unfolded this] note * = has_integral_component_le[OF k this]
  5193   note as(2-3)[unfolded this] note * = has_integral_component_le[OF k this]
  5200   show ?thesis
  5194   show ?thesis
  5201     apply (rule *)
  5195     apply (rule *)
  5202     using as(1,4)
  5196     using as(1,4)
  5203     apply auto
  5197     apply auto
  5665   assumes "(f has_integral i) s"
  5659   assumes "(f has_integral i) s"
  5666     and "(f has_integral j) t"
  5660     and "(f has_integral j) t"
  5667     and "negligible (s \<inter> t)"
  5661     and "negligible (s \<inter> t)"
  5668   shows "(f has_integral (i + j)) (s \<union> t)"
  5662   shows "(f has_integral (i + j)) (s \<union> t)"
  5669 proof -
  5663 proof -
  5670   note * = has_integral_restrict_univ[symmetric, of f]
  5664   note * = has_integral_restrict_UNIV[symmetric, of f]
  5671   show ?thesis
  5665   show ?thesis
  5672     unfolding *
  5666     unfolding *
  5673     apply (rule has_integral_spike[OF assms(3)])
  5667     apply (rule has_integral_spike[OF assms(3)])
  5674     defer
  5668     defer
  5675     apply (rule has_integral_add[OF assms(1-2)[unfolded *]])
  5669     apply (rule has_integral_add[OF assms(1-2)[unfolded *]])
  5698   assumes "finite t"
  5692   assumes "finite t"
  5699     and "\<forall>s\<in>t. (f has_integral (i s)) s"
  5693     and "\<forall>s\<in>t. (f has_integral (i s)) s"
  5700     and "\<forall>s\<in>t. \<forall>s'\<in>t. s \<noteq> s' \<longrightarrow> negligible (s \<inter> s')"
  5694     and "\<forall>s\<in>t. \<forall>s'\<in>t. s \<noteq> s' \<longrightarrow> negligible (s \<inter> s')"
  5701   shows "(f has_integral (sum i t)) (\<Union>t)"
  5695   shows "(f has_integral (sum i t)) (\<Union>t)"
  5702 proof -
  5696 proof -
  5703   note * = has_integral_restrict_univ[symmetric, of f]
  5697   note * = has_integral_restrict_UNIV[symmetric, of f]
  5704   have **: "negligible (\<Union>((\<lambda>(a,b). a \<inter> b) ` {(a,b). a \<in> t \<and> b \<in> {y. y \<in> t \<and> a \<noteq> y}}))"
  5698   have **: "negligible (\<Union>((\<lambda>(a,b). a \<inter> b) ` {(a,b). a \<in> t \<and> b \<in> {y. y \<in> t \<and> a \<noteq> y}}))"
  5705     apply (rule negligible_Union)
  5699     apply (rule negligible_Union)
  5706     apply (rule finite_imageI)
  5700     apply (rule finite_imageI)
  5707     apply (rule finite_subset[of _ "t \<times> t"])
  5701     apply (rule finite_subset[of _ "t \<times> t"])
  5708     defer
  5702     defer
  6539     note int = assms(2)[unfolded integrable_alt[of _ s],THEN conjunct1,rule_format]
  6533     note int = assms(2)[unfolded integrable_alt[of _ s],THEN conjunct1,rule_format]
  6540     have ifif: "\<And>k t. (\<lambda>x. if x \<in> t then if x \<in> s then f k x else 0 else 0) =
  6534     have ifif: "\<And>k t. (\<lambda>x. if x \<in> t then if x \<in> s then f k x else 0 else 0) =
  6541       (\<lambda>x. if x \<in> t \<inter> s then f k x else 0)"
  6535       (\<lambda>x. if x \<in> t \<inter> s then f k x else 0)"
  6542       by (rule ext) auto
  6536       by (rule ext) auto
  6543     have int': "\<And>k a b. f k integrable_on cbox a b \<inter> s"
  6537     have int': "\<And>k a b. f k integrable_on cbox a b \<inter> s"
  6544       apply (subst integrable_restrict_univ[symmetric])
  6538       apply (subst integrable_restrict_UNIV[symmetric])
  6545       apply (subst ifif[symmetric])
  6539       apply (subst ifif[symmetric])
  6546       apply (subst integrable_restrict_univ)
  6540       apply (subst integrable_restrict_UNIV)
  6547       apply (rule int)
  6541       apply (rule int)
  6548       done
  6542       done
  6549     have "\<And>a b. (\<lambda>x. if x \<in> s then g x else 0) integrable_on cbox a b \<and>
  6543     have "\<And>a b. (\<lambda>x. if x \<in> s then g x else 0) integrable_on cbox a b \<and>
  6550       ((\<lambda>k. integral (cbox a b) (\<lambda>x. if x \<in> s then f k x else 0)) \<longlongrightarrow>
  6544       ((\<lambda>k. integral (cbox a b) (\<lambda>x. if x \<in> s then f k x else 0)) \<longlongrightarrow>
  6551       integral (cbox a b) (\<lambda>x. if x \<in> s then g x else 0)) sequentially"
  6545       integral (cbox a b) (\<lambda>x. if x \<in> s then g x else 0)) sequentially"
  7235   interpret bounded_bilinear prod by fact
  7229   interpret bounded_bilinear prod by fact
  7236   have "((\<lambda>x. prod (f x) (g' x) + prod (f' x) (g x)) has_integral
  7230   have "((\<lambda>x. prod (f x) (g' x) + prod (f' x) (g x)) has_integral
  7237           (prod (f b) (g b) - prod (f a) (g a))) {a..b}"
  7231           (prod (f b) (g b) - prod (f a) (g a))) {a..b}"
  7238     using deriv by (intro fundamental_theorem_of_calculus_interior_strong[OF s le])
  7232     using deriv by (intro fundamental_theorem_of_calculus_interior_strong[OF s le])
  7239                    (auto intro!: continuous_intros continuous_on has_vector_derivative)
  7233                    (auto intro!: continuous_intros continuous_on has_vector_derivative)
  7240   from has_integral_sub[OF this int] show ?thesis by (simp add: algebra_simps)
  7234   from has_integral_diff[OF this int] show ?thesis by (simp add: algebra_simps)
  7241 qed
  7235 qed
  7242 
  7236 
  7243 lemma integration_by_parts_interior:
  7237 lemma integration_by_parts_interior:
  7244   fixes prod :: "_ \<Rightarrow> _ \<Rightarrow> 'b :: banach"
  7238   fixes prod :: "_ \<Rightarrow> _ \<Rightarrow> 'b :: banach"
  7245   assumes "bounded_bilinear (prod)" "a \<le> b"
  7239   assumes "bounded_bilinear (prod)" "a \<le> b"