# HG changeset patch # User paulson # Date 1523460884 -3600 # Node ID 3f352a91b45a378ac62ec36b3ad01ec19554620f # Parent e9f66b35d63603ccfb6947bd95d8143c1a31546e replacement of set integral abbreviations by actual definitions! diff -r e9f66b35d636 -r 3f352a91b45a src/HOL/Analysis/Equivalence_Lebesgue_Henstock_Integration.thy --- a/src/HOL/Analysis/Equivalence_Lebesgue_Henstock_Integration.thy Mon Apr 09 17:21:10 2018 +0100 +++ b/src/HOL/Analysis/Equivalence_Lebesgue_Henstock_Integration.thy Wed Apr 11 16:34:44 2018 +0100 @@ -839,13 +839,15 @@ lemma set_integral_reflect: fixes S and f :: "real \ 'a :: {banach, second_countable_topology}" shows "(LBINT x : S. f x) = (LBINT x : {x. - x \ S}. f (- x))" + unfolding set_lebesgue_integral_def by (subst lborel_integral_real_affine[where c="-1" and t=0]) (auto intro!: Bochner_Integration.integral_cong split: split_indicator) lemma borel_integrable_atLeastAtMost': fixes f :: "real \ 'a::{banach, second_countable_topology}" assumes f: "continuous_on {a..b} f" - shows "set_integrable lborel {a..b} f" (is "integrable _ ?f") + shows "set_integrable lborel {a..b} f" + unfolding set_integrable_def by (intro borel_integrable_compact compact_Icc f) lemma integral_FTC_atLeastAtMost: @@ -857,7 +859,8 @@ proof - let ?f = "\x. indicator {a .. b} x *\<^sub>R f x" have "(?f has_integral (\x. ?f x \lborel)) UNIV" - using borel_integrable_atLeastAtMost'[OF f] by (rule has_integral_integral_lborel) + using borel_integrable_atLeastAtMost'[OF f] + unfolding set_integrable_def by (rule has_integral_integral_lborel) moreover have "(f has_integral F b - F a) {a .. b}" by (intro fundamental_theorem_of_calculus ballI assms) auto @@ -876,7 +879,8 @@ proof - let ?f = "\x. indicator S x *\<^sub>R f x" have "(?f has_integral LINT x : S | lborel. f x) UNIV" - by (rule has_integral_integral_lborel) fact + using assms has_integral_integral_lborel + unfolding set_integrable_def set_lebesgue_integral_def by blast hence 1: "(f has_integral (set_lebesgue_integral lborel S f)) S" apply (subst has_integral_restrict_UNIV [symmetric]) apply (rule has_integral_eq) @@ -893,8 +897,8 @@ fixes f :: "'a::euclidean_space \ 'b::euclidean_space" assumes f: "set_integrable lebesgue S f" shows "(f has_integral (LINT x:S|lebesgue. f x)) S" - using has_integral_integral_lebesgue[OF f] - by (simp_all add: indicator_def if_distrib[of "\x. x *\<^sub>R f _"] has_integral_restrict_UNIV cong: if_cong) + using has_integral_integral_lebesgue f + by (fastforce simp add: set_integrable_def set_lebesgue_integral_def indicator_def if_distrib[of "\x. x *\<^sub>R f _"] cong: if_cong) lemma set_lebesgue_integral_eq_integral: fixes f :: "'a::euclidean_space \ 'b::euclidean_space" @@ -915,26 +919,26 @@ lemma absolutely_integrable_on_def: fixes f :: "'a::euclidean_space \ 'b::euclidean_space" - shows "f absolutely_integrable_on s \ f integrable_on s \ (\x. norm (f x)) integrable_on s" + shows "f absolutely_integrable_on S \ f integrable_on S \ (\x. norm (f x)) integrable_on S" proof safe - assume f: "f absolutely_integrable_on s" - then have nf: "integrable lebesgue (\x. norm (indicator s x *\<^sub>R f x))" - by (intro integrable_norm) - note integrable_on_lebesgue[OF f] integrable_on_lebesgue[OF nf] - moreover have - "(\x. indicator s x *\<^sub>R f x) = (\x. if x \ s then f x else 0)" - "(\x. norm (indicator s x *\<^sub>R f x)) = (\x. if x \ s then norm (f x) else 0)" + assume f: "f absolutely_integrable_on S" + then have nf: "integrable lebesgue (\x. norm (indicator S x *\<^sub>R f x))" + using integrable_norm set_integrable_def by blast + show "f integrable_on S" + by (rule set_lebesgue_integral_eq_integral[OF f]) + have "(\x. norm (indicator S x *\<^sub>R f x)) = (\x. if x \ S then norm (f x) else 0)" by auto - ultimately show "f integrable_on s" "(\x. norm (f x)) integrable_on s" - by (simp_all add: integrable_restrict_UNIV) + with integrable_on_lebesgue[OF nf] show "(\x. norm (f x)) integrable_on S" + by (simp add: integrable_restrict_UNIV) next - assume f: "f integrable_on s" and nf: "(\x. norm (f x)) integrable_on s" - show "f absolutely_integrable_on s" + assume f: "f integrable_on S" and nf: "(\x. norm (f x)) integrable_on S" + show "f absolutely_integrable_on S" + unfolding set_integrable_def proof (rule integrableI_bounded) - show "(\x. indicator s x *\<^sub>R f x) \ borel_measurable lebesgue" - using f has_integral_implies_lebesgue_measurable[of f _ s] by (auto simp: integrable_on_def) - show "(\\<^sup>+ x. ennreal (norm (indicator s x *\<^sub>R f x)) \lebesgue) < \" - using nf nn_integral_has_integral_lebesgue[of "\x. norm (f x)" _ s] + show "(\x. indicator S x *\<^sub>R f x) \ borel_measurable lebesgue" + using f has_integral_implies_lebesgue_measurable[of f _ S] by (auto simp: integrable_on_def) + show "(\\<^sup>+ x. ennreal (norm (indicator S x *\<^sub>R f x)) \lebesgue) < \" + using nf nn_integral_has_integral_lebesgue[of "\x. norm (f x)" _ S] by (auto simp: integrable_on_def nn_integral_completion) qed qed @@ -951,12 +955,13 @@ by (auto simp: integrable_on_open_interval absolutely_integrable_on_def) lemma absolutely_integrable_restrict_UNIV: - "(\x. if x \ s then f x else 0) absolutely_integrable_on UNIV \ f absolutely_integrable_on s" + "(\x. if x \ S then f x else 0) absolutely_integrable_on UNIV \ f absolutely_integrable_on S" + unfolding set_integrable_def by (intro arg_cong2[where f=integrable]) auto lemma absolutely_integrable_onI: fixes f :: "'a::euclidean_space \ 'b::euclidean_space" - shows "f integrable_on s \ (\x. norm (f x)) integrable_on s \ f absolutely_integrable_on s" + shows "f integrable_on S \ (\x. norm (f x)) integrable_on S \ f absolutely_integrable_on S" unfolding absolutely_integrable_on_def by auto lemma nonnegative_absolutely_integrable_1: @@ -984,7 +989,7 @@ lemma lmeasurable_iff_integrable_on: "S \ lmeasurable \ (\x. 1::real) integrable_on S" by (subst absolutely_integrable_on_iff_nonneg[symmetric]) - (simp_all add: lmeasurable_iff_integrable) + (simp_all add: lmeasurable_iff_integrable set_integrable_def) lemma lmeasure_integral_UNIV: "S \ lmeasurable \ measure lebesgue S = integral UNIV (indicator S)" by (simp add: lmeasurable_iff_has_integral integral_unique) @@ -1532,7 +1537,8 @@ lemma set_integral_norm_bound: fixes f :: "_ \ 'a :: {banach, second_countable_topology}" shows "set_integrable M k f \ norm (LINT x:k|M. f x) \ LINT x:k|M. norm (f x)" - using integral_norm_bound[of M "\x. indicator k x *\<^sub>R f x"] by simp + using integral_norm_bound[of M "\x. indicator k x *\<^sub>R f x"] by (simp add: set_lebesgue_integral_def) + lemma set_integral_finite_UN_AE: fixes f :: "_ \ _ :: {banach, second_countable_topology}" @@ -1557,13 +1563,13 @@ with insert.hyps insert.IH[symmetric] show ?case by (auto intro!: set_integral_Un_AE sets.finite_UN f set_integrable_UN) -qed simp +qed (simp add: set_lebesgue_integral_def) lemma set_integrable_norm: fixes f :: "'a \ 'b::{banach, second_countable_topology}" assumes f: "set_integrable M k f" shows "set_integrable M k (\x. norm (f x))" - using integrable_norm[OF f] by simp - + using integrable_norm f by (force simp add: set_integrable_def) + lemma absolutely_integrable_bounded_variation: fixes f :: "'a::euclidean_space \ 'b::euclidean_space" assumes f: "f absolutely_integrable_on UNIV" @@ -2120,30 +2126,36 @@ and h :: "'n::euclidean_space \ 'p::euclidean_space" shows "f absolutely_integrable_on s \ bounded_linear h \ (h \ f) absolutely_integrable_on s" using integrable_bounded_linear[of h lebesgue "\x. indicator s x *\<^sub>R f x"] - by (simp add: linear_simps[of h]) + by (simp add: linear_simps[of h] set_integrable_def) + +lemma absolutely_integrable_zero [simp]: "(\x. 0) absolutely_integrable_on S" + by (simp add: set_integrable_def) lemma absolutely_integrable_sum: fixes f :: "'a \ 'n::euclidean_space \ 'm::euclidean_space" - assumes "finite t" and "\a. a \ t \ (f a) absolutely_integrable_on s" - shows "(\x. sum (\a. f a x) t) absolutely_integrable_on s" - using assms(1,2) by induct auto + assumes "finite T" and "\a. a \ T \ (f a) absolutely_integrable_on S" + shows "(\x. sum (\a. f a x) T) absolutely_integrable_on S" + using assms by induction auto lemma absolutely_integrable_integrable_bound: fixes f :: "'n::euclidean_space \ 'm::euclidean_space" - assumes le: "\x\s. norm (f x) \ g x" and f: "f integrable_on s" and g: "g integrable_on s" - shows "f absolutely_integrable_on s" + assumes le: "\x. x\S \ norm (f x) \ g x" and f: "f integrable_on S" and g: "g integrable_on S" + shows "f absolutely_integrable_on S" + unfolding set_integrable_def proof (rule Bochner_Integration.integrable_bound) - show "g absolutely_integrable_on s" + have "g absolutely_integrable_on S" unfolding absolutely_integrable_on_def proof - show "(\x. norm (g x)) integrable_on s" + show "(\x. norm (g x)) integrable_on S" using le norm_ge_zero[of "f _"] by (intro integrable_spike_finite[OF _ _ g, of "{}"]) (auto intro!: abs_of_nonneg intro: order_trans simp del: norm_ge_zero) qed fact - show "set_borel_measurable lebesgue s f" + then show "integrable lebesgue (\x. indicat_real S x *\<^sub>R g x)" + by (simp add: set_integrable_def) + show "(\x. indicat_real S x *\<^sub>R f x) \ borel_measurable lebesgue" using f by (auto intro: has_integral_implies_lebesgue_measurable simp: integrable_on_def) -qed (use le in \auto intro!: always_eventually split: split_indicator\) +qed (use le in \force intro!: always_eventually split: split_indicator\) subsection \Componentwise\ @@ -2175,7 +2187,7 @@ lemma absolutely_integrable_componentwise: shows "(\b. b \ Basis \ (\x. f x \ b) absolutely_integrable_on A) \ f absolutely_integrable_on A" - by (simp add: absolutely_integrable_componentwise_iff) + using absolutely_integrable_componentwise_iff by blast lemma absolutely_integrable_component: "f absolutely_integrable_on A \ (\x. f x \ (b :: 'b :: euclidean_space)) absolutely_integrable_on A" @@ -2190,7 +2202,8 @@ have "(\x. c *\<^sub>R x) o f absolutely_integrable_on S" apply (rule absolutely_integrable_linear [OF assms]) by (simp add: bounded_linear_scaleR_right) - then show ?thesis by simp + then show ?thesis + using assms by blast qed lemma absolutely_integrable_scaleR_right: @@ -2202,7 +2215,7 @@ fixes f :: "'a :: euclidean_space \ 'b :: euclidean_space" assumes "f absolutely_integrable_on S" shows "(norm o f) absolutely_integrable_on S" - using assms unfolding absolutely_integrable_on_def by auto + using assms by (simp add: absolutely_integrable_on_def o_def) lemma absolutely_integrable_abs: fixes f :: "'a :: euclidean_space \ 'b :: euclidean_space" @@ -2405,56 +2418,60 @@ lemma dominated_convergence: fixes f :: "nat \ 'n::euclidean_space \ 'm::euclidean_space" - assumes f: "\k. (f k) integrable_on s" and h: "h integrable_on s" - and le: "\k. \x \ s. norm (f k x) \ h x" - and conv: "\x \ s. (\k. f k x) \ g x" - shows "g integrable_on s" "(\k. integral s (f k)) \ integral s g" + assumes f: "\k. (f k) integrable_on S" and h: "h integrable_on S" + and le: "\k x. x \ S \ norm (f k x) \ h x" + and conv: "\x \ S. (\k. f k x) \ g x" + shows "g integrable_on S" "(\k. integral S (f k)) \ integral S g" proof - - have 3: "h absolutely_integrable_on s" + have 3: "h absolutely_integrable_on S" unfolding absolutely_integrable_on_def proof - show "(\x. norm (h x)) integrable_on s" + show "(\x. norm (h x)) integrable_on S" proof (intro integrable_spike_finite[OF _ _ h, of "{}"] ballI) - fix x assume "x \ s - {}" then show "norm (h x) = h x" + fix x assume "x \ S - {}" then show "norm (h x) = h x" by (metis Diff_empty abs_of_nonneg bot_set_def le norm_ge_zero order_trans real_norm_def) qed auto qed fact - have 2: "set_borel_measurable lebesgue s (f k)" for k + have 2: "set_borel_measurable lebesgue S (f k)" for k + unfolding set_borel_measurable_def using f by (auto intro: has_integral_implies_lebesgue_measurable simp: integrable_on_def) - then have 1: "set_borel_measurable lebesgue s g" + then have 1: "set_borel_measurable lebesgue S g" + unfolding set_borel_measurable_def by (rule borel_measurable_LIMSEQ_metric) (use conv in \auto split: split_indicator\) - have 4: "AE x in lebesgue. (\i. indicator s x *\<^sub>R f i x) \ indicator s x *\<^sub>R g x" - "AE x in lebesgue. norm (indicator s x *\<^sub>R f k x) \ indicator s x *\<^sub>R h x" for k + have 4: "AE x in lebesgue. (\i. indicator S x *\<^sub>R f i x) \ indicator S x *\<^sub>R g x" + "AE x in lebesgue. norm (indicator S x *\<^sub>R f k x) \ indicator S x *\<^sub>R h x" for k using conv le by (auto intro!: always_eventually split: split_indicator) - - have g: "g absolutely_integrable_on s" - using 1 2 3 4 by (rule integrable_dominated_convergence) - then show "g integrable_on s" + have g: "g absolutely_integrable_on S" + using 1 2 3 4 unfolding set_borel_measurable_def set_integrable_def + by (rule integrable_dominated_convergence) + then show "g integrable_on S" by (auto simp: absolutely_integrable_on_def) - have "(\k. (LINT x:s|lebesgue. f k x)) \ (LINT x:s|lebesgue. g x)" - using 1 2 3 4 by (rule integral_dominated_convergence) - then show "(\k. integral s (f k)) \ integral s g" + have "(\k. (LINT x:S|lebesgue. f k x)) \ (LINT x:S|lebesgue. g x)" + unfolding set_borel_measurable_def set_lebesgue_integral_def + using 1 2 3 4 unfolding set_borel_measurable_def set_lebesgue_integral_def set_integrable_def + by (rule integral_dominated_convergence) + then show "(\k. integral S (f k)) \ integral S g" using g absolutely_integrable_integrable_bound[OF le f h] by (subst (asm) (1 2) set_lebesgue_integral_eq_integral) auto qed lemma has_integral_dominated_convergence: fixes f :: "nat \ 'n::euclidean_space \ 'm::euclidean_space" - assumes "\k. (f k has_integral y k) s" "h integrable_on s" - "\k. \x\s. norm (f k x) \ h x" "\x\s. (\k. f k x) \ g x" + assumes "\k. (f k has_integral y k) S" "h integrable_on S" + "\k. \x\S. norm (f k x) \ h x" "\x\S. (\k. f k x) \ g x" and x: "y \ x" - shows "(g has_integral x) s" + shows "(g has_integral x) S" proof - - have int_f: "\k. (f k) integrable_on s" + have int_f: "\k. (f k) integrable_on S" using assms by (auto simp: integrable_on_def) - have "(g has_integral (integral s g)) s" - by (intro integrable_integral dominated_convergence[OF int_f assms(2)]) fact+ - moreover have "integral s g = x" + have "(g has_integral (integral S g)) S" + by (metis assms(2-4) dominated_convergence(1) has_integral_integral int_f) + moreover have "integral S g = x" proof (rule LIMSEQ_unique) - show "(\i. integral s (f i)) \ x" + show "(\i. integral S (f i)) \ x" using integral_unique[OF assms(1)] x by simp - show "(\i. integral s (f i)) \ integral s g" - by (intro dominated_convergence[OF int_f assms(2)]) fact+ + show "(\i. integral S (f i)) \ integral S g" + by (metis assms(2) assms(3) assms(4) dominated_convergence(2) int_f) qed ultimately show ?thesis by simp @@ -2720,7 +2737,11 @@ then have "integral (closure S) f = set_lebesgue_integral lebesgue (closure S) f" by (intro set_lebesgue_integral_eq_integral(2)[symmetric]) also have "\ = 0 \ (AE x in lebesgue. indicator (closure S) x *\<^sub>R f x = 0)" - by (rule integral_nonneg_eq_0_iff_AE[OF af]) (use nonneg in \auto simp: indicator_def\) + unfolding set_lebesgue_integral_def + proof (rule integral_nonneg_eq_0_iff_AE) + show "integrable lebesgue (\x. indicat_real (closure S) x *\<^sub>R f x)" + by (metis af set_integrable_def) + qed (use nonneg in \auto simp: indicator_def\) also have "\ \ (AE x in lebesgue. x \ {x. x \ closure S \ f x = 0})" by (auto simp: indicator_def) finally have "(AE x in lebesgue. x \ {x. x \ closure S \ f x = 0})" by simp diff -r e9f66b35d636 -r 3f352a91b45a src/HOL/Analysis/Infinite_Set_Sum.thy --- a/src/HOL/Analysis/Infinite_Set_Sum.thy Mon Apr 09 17:21:10 2018 +0100 +++ b/src/HOL/Analysis/Infinite_Set_Sum.thy Wed Apr 11 16:34:44 2018 +0100 @@ -142,8 +142,6 @@ \ - - lemma restrict_count_space_subset: "A \ B \ restrict_space (count_space B) A = count_space A" by (subst restrict_count_space) (simp_all add: Int_absorb2) @@ -156,17 +154,19 @@ have "count_space A = restrict_space (count_space B) A" by (rule restrict_count_space_subset [symmetric]) fact+ also have "integrable \ f \ set_integrable (count_space B) A f" - by (subst integrable_restrict_space) auto + by (simp add: integrable_restrict_space set_integrable_def) finally show ?thesis - unfolding abs_summable_on_def . + unfolding abs_summable_on_def set_integrable_def . qed lemma abs_summable_on_altdef: "f abs_summable_on A \ set_integrable (count_space UNIV) A f" - by (subst abs_summable_on_restrict[of _ UNIV]) (auto simp: abs_summable_on_def) + unfolding abs_summable_on_def set_integrable_def + by (metis (no_types) inf_top.right_neutral integrable_restrict_space restrict_count_space sets_UNIV) lemma abs_summable_on_altdef': "A \ B \ f abs_summable_on A \ set_integrable (count_space B) A f" - by (subst abs_summable_on_restrict[of _ B]) (auto simp: abs_summable_on_def) + unfolding abs_summable_on_def set_integrable_def + by (metis (no_types) Pow_iff abs_summable_on_def inf.orderE integrable_restrict_space restrict_count_space_subset set_integrable_def sets_count_space space_count_space) lemma abs_summable_on_norm_iff [simp]: "(\x. norm (f x)) abs_summable_on A \ f abs_summable_on A" @@ -205,7 +205,7 @@ assumes "\x. x \ B - A \ g x = 0" assumes "\x. x \ A \ B \ f x = g x" shows "f abs_summable_on A \ g abs_summable_on B" - unfolding abs_summable_on_altdef using assms + unfolding abs_summable_on_altdef set_integrable_def using assms by (intro Bochner_Integration.integrable_cong refl) (auto simp: indicator_def split: if_splits) @@ -418,11 +418,13 @@ lemma infsetsum_altdef: "infsetsum f A = set_lebesgue_integral (count_space UNIV) A f" + unfolding set_lebesgue_integral_def by (subst integral_restrict_space [symmetric]) (auto simp: restrict_count_space_subset infsetsum_def) lemma infsetsum_altdef': "A \ B \ infsetsum f A = set_lebesgue_integral (count_space B) A f" + unfolding set_lebesgue_integral_def by (subst integral_restrict_space [symmetric]) (auto simp: restrict_count_space_subset infsetsum_def) @@ -477,7 +479,8 @@ shows "infsetsum f A = (\n. if n \ A then f n else 0)" proof - from assms have "infsetsum f A = (\n. indicator A n *\<^sub>R f n)" - unfolding infsetsum_altdef abs_summable_on_altdef by (subst integral_count_space_nat) auto + unfolding infsetsum_altdef abs_summable_on_altdef set_lebesgue_integral_def set_integrable_def + by (subst integral_count_space_nat) auto also have "(\n. indicator A n *\<^sub>R f n) = (\n. if n \ A then f n else 0)" by auto finally show ?thesis . @@ -560,7 +563,7 @@ assumes "\x. x \ B - A \ g x = 0" assumes "\x. x \ A \ B \ f x = g x" shows "infsetsum f A = infsetsum g B" - unfolding infsetsum_altdef using assms + unfolding infsetsum_altdef set_lebesgue_integral_def using assms by (intro Bochner_Integration.integral_cong refl) (auto simp: indicator_def split: if_splits) @@ -571,7 +574,7 @@ assumes "\x. x \ A - B \ f x \ 0" assumes "\x. x \ B - A \ g x \ 0" shows "infsetsum f A \ infsetsum g B" - using assms unfolding infsetsum_altdef abs_summable_on_altdef + using assms unfolding infsetsum_altdef set_lebesgue_integral_def abs_summable_on_altdef set_integrable_def by (intro Bochner_Integration.integral_mono) (auto simp: indicator_def) lemma infsetsum_mono_neutral_left: @@ -617,7 +620,8 @@ by (intro pair_sigma_finite.intro sigma_finite_measure_count_space_countable) fact+ have "integrable (count_space (A \ B')) (\z. indicator (Sigma A B) z *\<^sub>R f z)" - using summable by (subst abs_summable_on_altdef' [symmetric]) (auto simp: B'_def) + using summable + by (metis (mono_tags, lifting) abs_summable_on_altdef abs_summable_on_def integrable_cong integrable_mult_indicator set_integrable_def sets_UNIV) also have "?this \ integrable (count_space A \\<^sub>M count_space B') (\(x, y). indicator (B x) y *\<^sub>R f (x, y))" by (intro Bochner_Integration.integrable_cong) (auto simp: pair_measure_countable indicator_def split: if_splits) @@ -627,14 +631,20 @@ (\x. infsetsum (\y. f (x, y)) (B x) \count_space A)" unfolding infsetsum_def by simp also have "\ = (\x. \y. indicator (B x) y *\<^sub>R f (x, y) \count_space B' \count_space A)" - by (intro Bochner_Integration.integral_cong infsetsum_altdef'[of _ B'] refl) - (auto simp: B'_def) + proof (rule Bochner_Integration.integral_cong [OF refl]) + show "\x. x \ space (count_space A) \ + (\\<^sub>ay\B x. f (x, y)) = LINT y|count_space B'. indicat_real (B x) y *\<^sub>R f (x, y)" + using infsetsum_altdef'[of _ B'] + unfolding set_lebesgue_integral_def B'_def + by auto + qed also have "\ = (\(x,y). indicator (B x) y *\<^sub>R f (x, y) \(count_space A \\<^sub>M count_space B'))" by (subst integral_fst [OF integrable]) auto also have "\ = (\z. indicator (Sigma A B) z *\<^sub>R f z \count_space (A \ B'))" by (intro Bochner_Integration.integral_cong) (auto simp: pair_measure_countable indicator_def split: if_splits) also have "\ = infsetsum f (Sigma A B)" + unfolding set_lebesgue_integral_def [symmetric] by (rule infsetsum_altdef' [symmetric]) (auto simp: B'_def) finally show ?thesis .. qed @@ -693,7 +703,6 @@ unfolding B'_def using assms by auto interpret pair_sigma_finite "count_space A" "count_space B'" by (intro pair_sigma_finite.intro sigma_finite_measure_count_space_countable) fact+ - { assume *: "f abs_summable_on Sigma A B" thus "(\y. f (x, y)) abs_summable_on B x" if "x \ A" for x @@ -707,18 +716,18 @@ finally have "integrable (count_space A) (\x. lebesgue_integral (count_space B') (\y. indicator (Sigma A B) (x, y) *\<^sub>R norm (f (x, y))))" - by (rule integrable_fst') + unfolding set_integrable_def by (rule integrable_fst') also have "?this \ integrable (count_space A) (\x. lebesgue_integral (count_space B') (\y. indicator (B x) y *\<^sub>R norm (f (x, y))))" by (intro integrable_cong refl) (simp_all add: indicator_def) also have "\ \ integrable (count_space A) (\x. infsetsum (\y. norm (f (x, y))) (B x))" + unfolding set_lebesgue_integral_def [symmetric] by (intro integrable_cong refl infsetsum_altdef' [symmetric]) (auto simp: B'_def) also have "\ \ (\x. infsetsum (\y. norm (f (x, y))) (B x)) abs_summable_on A" by (simp add: abs_summable_on_def) finally show \ . } - { assume *: "\x\A. (\y. f (x, y)) abs_summable_on B x" assume "(\x. \\<^sub>ay\B x. norm (f (x, y))) abs_summable_on A" @@ -726,6 +735,7 @@ by (intro abs_summable_on_cong refl infsetsum_altdef') (auto simp: B'_def) also have "\ \ (\x. \y. indicator (Sigma A B) (x, y) *\<^sub>R norm (f (x, y)) \count_space B') abs_summable_on A" (is "_ \ ?h abs_summable_on _") + unfolding set_lebesgue_integral_def by (intro abs_summable_on_cong) (auto simp: indicator_def) also have "\ \ integrable (count_space A) ?h" by (simp add: abs_summable_on_def) @@ -740,7 +750,8 @@ by blast also have "?this \ integrable (count_space B') (\y. indicator (B x) y *\<^sub>R f (x, y))" - using x by (intro abs_summable_on_altdef') (auto simp: B'_def) + unfolding set_integrable_def [symmetric] + using x by (intro abs_summable_on_altdef') (auto simp: B'_def) also have "(\y. indicator (B x) y *\<^sub>R f (x, y)) = (\y. indicator (Sigma A B) (x, y) *\<^sub>R f (x, y))" using x by (auto simp: indicator_def) @@ -749,12 +760,13 @@ } thus ?case by (auto simp: AE_count_space) qed (insert **, auto simp: pair_measure_countable) - also have "count_space A \\<^sub>M count_space B' = count_space (A \ B')" + moreover have "count_space A \\<^sub>M count_space B' = count_space (A \ B')" by (simp add: pair_measure_countable) - also have "set_integrable (count_space (A \ B')) (Sigma A B) f \ + moreover have "set_integrable (count_space (A \ B')) (Sigma A B) f \ f abs_summable_on Sigma A B" by (rule abs_summable_on_altdef' [symmetric]) (auto simp: B'_def) - finally show \ . + ultimately show "f abs_summable_on Sigma A B" + by (simp add: set_integrable_def) } qed diff -r e9f66b35d636 -r 3f352a91b45a src/HOL/Analysis/Interval_Integral.thy --- a/src/HOL/Analysis/Interval_Integral.thy Mon Apr 09 17:21:10 2018 +0100 +++ b/src/HOL/Analysis/Interval_Integral.thy Wed Apr 11 16:34:44 2018 +0100 @@ -51,9 +51,7 @@ lemma borel_einterval[measurable]: "einterval a b \ sets borel" unfolding einterval_def by measurable -(* - Approximating a (possibly infinite) interval -*) +subsection\Approximating a (possibly infinite) interval\ lemma filterlim_sup1: "(LIM x F. f x :> G1) \ (LIM x F. f x :> (sup G1 G2))" unfolding filterlim_def by (auto intro: le_supI1) @@ -175,9 +173,7 @@ translations "LBINT x=a..b. f" == "CONST interval_lebesgue_integral CONST lborel a b (\x. f)" -(* - Basic properties of integration over an interval. -*) +subsection\Basic properties of integration over an interval\ lemma interval_lebesgue_integral_cong: "a \ b \ (\x. x \ einterval a b \ f x = g x) \ einterval a b \ sets M \ @@ -200,7 +196,7 @@ show ?thesis unfolding interval_lebesgue_integrable_def using lborel_integrable_real_affine_iff[symmetric, of "-1" "\x. indicator (einterval _ _) x *\<^sub>R f x" 0] - by (simp add: *) + by (simp add: * set_integrable_def) qed lemma interval_lebesgue_integral_add [intro, simp]: @@ -260,7 +256,7 @@ lemma interval_lebesgue_integral_uminus: "interval_lebesgue_integral M a b (\x. - f x) = - interval_lebesgue_integral M a b f" - by (auto simp add: interval_lebesgue_integral_def interval_lebesgue_integrable_def) + by (auto simp add: interval_lebesgue_integral_def interval_lebesgue_integrable_def set_lebesgue_integral_def) lemma interval_lebesgue_integral_of_real: "interval_lebesgue_integral M a b (\x. complex_of_real (f x)) = @@ -287,10 +283,10 @@ using assms by (auto simp add: interval_lebesgue_integral_def less_imp_le einterval_def) lemma interval_integral_endpoints_same [simp]: "(LBINT x=a..a. f x) = 0" - by (simp add: interval_lebesgue_integral_def einterval_same) + by (simp add: interval_lebesgue_integral_def set_lebesgue_integral_def einterval_same) lemma interval_integral_endpoints_reverse: "(LBINT x=a..b. f x) = -(LBINT x=b..a. f x)" - by (cases a b rule: linorder_cases) (auto simp: interval_lebesgue_integral_def einterval_same) + by (cases a b rule: linorder_cases) (auto simp: interval_lebesgue_integral_def set_lebesgue_integral_def einterval_same) lemma interval_integrable_endpoints_reverse: "interval_lebesgue_integrable lborel a b f \ @@ -304,15 +300,16 @@ by (auto simp add: interval_lebesgue_integral_def interval_integrable_endpoints_reverse split: if_split_asm) next - case (le a b) then show ?case - unfolding interval_lebesgue_integral_def - by (subst set_integral_reflect) - (auto simp: interval_lebesgue_integrable_def einterval_iff - ereal_uminus_le_reorder ereal_uminus_less_reorder not_less - uminus_ereal.simps[symmetric] + case (le a b) + have "LBINT x:{x. - x \ einterval a b}. f (- x) = LBINT x:einterval (- b) (- a). f (- x)" + unfolding interval_lebesgue_integrable_def set_lebesgue_integral_def + apply (rule Bochner_Integration.integral_cong [OF refl]) + by (auto simp: einterval_iff ereal_uminus_le_reorder ereal_uminus_less_reorder not_less uminus_ereal.simps[symmetric] simp del: uminus_ereal.simps - intro!: Bochner_Integration.integral_cong split: split_indicator) + then show ?case + unfolding interval_lebesgue_integral_def + by (subst set_integral_reflect) (simp add: le) qed lemma interval_lebesgue_integral_0_infty: @@ -328,21 +325,19 @@ (set_integrable M {a<..} f)" unfolding interval_lebesgue_integrable_def by auto -(* - Basic properties of integration over an interval wrt lebesgue measure. -*) +subsection\Basic properties of integration over an interval wrt lebesgue measure\ lemma interval_integral_zero [simp]: fixes a b :: ereal shows"LBINT x=a..b. 0 = 0" -unfolding interval_lebesgue_integral_def einterval_eq +unfolding interval_lebesgue_integral_def set_lebesgue_integral_def einterval_eq by simp lemma interval_integral_const [intro, simp]: fixes a b c :: real shows "interval_lebesgue_integrable lborel a b (\x. c)" and "LBINT x=a..b. c = c * (b - a)" -unfolding interval_lebesgue_integral_def interval_lebesgue_integrable_def einterval_eq -by (auto simp add: less_imp_le field_simps measure_def) + unfolding interval_lebesgue_integral_def interval_lebesgue_integrable_def einterval_eq + by (auto simp add: less_imp_le field_simps measure_def set_integrable_def set_lebesgue_integral_def) lemma interval_integral_cong_AE: assumes [measurable]: "f \ borel_measurable borel" "g \ borel_measurable borel" @@ -429,7 +424,7 @@ and anti_eq: "\x. b \ a \ b < x \ x < a \ x \ X \ f x = g x" assumes "\x. x \ X \ emeasure M {x} = 0" "\x. x \ X \ {x} \ sets M" shows "interval_lebesgue_integral M a b f = interval_lebesgue_integral M a b g" - unfolding interval_lebesgue_integral_def + unfolding interval_lebesgue_integral_def set_lebesgue_integral_def apply (intro if_cong refl arg_cong[where f="\x. - x"] integral_discrete_difference[of X] assms) apply (auto simp: eq anti_eq einterval_iff split: split_indicator) done @@ -444,13 +439,17 @@ then have ord: "a \ b" "b \ c" "a \ c" and f': "set_integrable lborel (einterval a c) f" by (auto simp: interval_lebesgue_integrable_def) then have f: "set_borel_measurable borel (einterval a c) f" + unfolding set_integrable_def set_borel_measurable_def by (drule_tac borel_measurable_integrable) simp have "(LBINT x:einterval a c. f x) = (LBINT x:einterval a b \ einterval b c. f x)" proof (rule set_integral_cong_set) show "AE x in lborel. (x \ einterval a b \ einterval b c) = (x \ einterval a c)" using AE_lborel_singleton[of "real_of_ereal b"] ord by (cases a b c rule: ereal3_cases) (auto simp: einterval_iff) - qed (insert ord, auto intro!: set_borel_measurable_subset[OF f] simp: einterval_iff) + show "set_borel_measurable lborel (einterval a c) f" "set_borel_measurable lborel (einterval a b \ einterval b c) f" + unfolding set_borel_measurable_def + using ord by (auto simp: einterval_iff intro!: set_borel_measurable_subset[OF f, unfolded set_borel_measurable_def]) + qed also have "\ = (LBINT x:einterval a b. f x) + (LBINT x:einterval b c. f x)" using ord by (intro set_integral_Un_AE) (auto intro!: set_integrable_subset[OF f'] simp: einterval_iff not_less) @@ -475,9 +474,10 @@ interval_lebesgue_integrable lborel a b f" proof (induct a b rule: linorder_wlog) case (le a b) then show ?case + unfolding interval_lebesgue_integrable_def set_integrable_def by (auto simp: interval_lebesgue_integrable_def - intro!: set_integrable_subset[OF borel_integrable_compact[of "{a .. b}"]] - continuous_at_imp_continuous_on) + intro!: set_integrable_subset[unfolded set_integrable_def, OF borel_integrable_compact[of "{a .. b}"]] + continuous_at_imp_continuous_on) qed (auto intro: interval_integrable_endpoints_reverse[THEN iffD1]) lemma interval_integrable_continuous_on: @@ -497,9 +497,8 @@ shows "a \ b \ set_integrable lborel (einterval a b) f \ LBINT x=a..b. f x = integral (einterval a b) f" by (subst interval_lebesgue_integral_le_eq, simp) (rule set_borel_integral_eq_integral) -(* - General limit approximation arguments -*) + +subsection\General limit approximation arguments\ lemma interval_integral_Icc_approx_nonneg: fixes a b :: ereal @@ -517,7 +516,7 @@ "set_integrable lborel (einterval a b) f" "(LBINT x=a..b. f x) = C" proof - - have 1: "\i. set_integrable lborel {l i..u i} f" by (rule f_integrable) + have 1 [unfolded set_integrable_def]: "\i. set_integrable lborel {l i..u i} f" by (rule f_integrable) have 2: "AE x in lborel. mono (\n. indicator {l n..u n} x *\<^sub>R f x)" proof - from f_nonneg have "AE x in lborel. \i. l i \ x \ x \ u i \ 0 \ f x" @@ -544,14 +543,16 @@ unfolding approx(1) by (auto intro!: AE_I2 Lim_eventually split: split_indicator) qed have 4: "(\i. \ x. indicator {l i..u i} x *\<^sub>R f x \lborel) \ C" - using lbint_lim by (simp add: interval_integral_Icc approx less_imp_le) - have 5: "set_borel_measurable lborel (einterval a b) f" by (rule assms) + using lbint_lim by (simp add: interval_integral_Icc [unfolded set_lebesgue_integral_def] approx less_imp_le) + have 5: "(\x. indicat_real (einterval a b) x *\<^sub>R f x) \ borel_measurable lborel" + using f_measurable set_borel_measurable_def by blast have "(LBINT x=a..b. f x) = lebesgue_integral lborel (\x. indicator (einterval a b) x *\<^sub>R f x)" - using assms by (simp add: interval_lebesgue_integral_def less_imp_le) - also have "... = C" by (rule integral_monotone_convergence [OF 1 2 3 4 5]) + using assms by (simp add: interval_lebesgue_integral_def set_lebesgue_integral_def less_imp_le) + also have "... = C" + by (rule integral_monotone_convergence [OF 1 2 3 4 5]) finally show "(LBINT x=a..b. f x) = C" . - show "set_integrable lborel (einterval a b) f" + unfolding set_integrable_def by (rule integrable_monotone_convergence[OF 1 2 3 4 5]) qed @@ -566,13 +567,14 @@ shows "(\i. LBINT x=l i.. u i. f x) \ (LBINT x=a..b. f x)" proof - have "(\i. LBINT x:{l i.. u i}. f x) \ (LBINT x:einterval a b. f x)" + unfolding set_lebesgue_integral_def proof (rule integral_dominated_convergence) show "integrable lborel (\x. norm (indicator (einterval a b) x *\<^sub>R f x))" - by (rule integrable_norm) fact - show "set_borel_measurable lborel (einterval a b) f" - using f_integrable by (rule borel_measurable_integrable) - then show "\i. set_borel_measurable lborel {l i..u i} f" - by (rule set_borel_measurable_subset) (auto simp: approx) + using f_integrable integrable_norm set_integrable_def by blast + show "(\x. indicat_real (einterval a b) x *\<^sub>R f x) \ borel_measurable lborel" + using f_integrable by (simp add: set_integrable_def) + then show "\i. (\x. indicat_real {l i..u i} x *\<^sub>R f x) \ borel_measurable lborel" + by (rule set_borel_measurable_subset [unfolded set_borel_measurable_def]) (auto simp: approx) show "\i. AE x in lborel. norm (indicator {l i..u i} x *\<^sub>R f x) \ norm (indicator (einterval a b) x *\<^sub>R f x)" by (intro AE_I2) (auto simp: approx split: split_indicator) show "AE x in lborel. (\i. indicator {l i..u i} x *\<^sub>R f x) \ indicator (einterval a b) x *\<^sub>R f x" @@ -591,10 +593,12 @@ by (simp add: interval_lebesgue_integral_le_eq[symmetric] interval_integral_Icc less_imp_le) qed +subsection\A slightly stronger Fundamental Theorem of Calculus\ + +text\Three versions: first, for finite intervals, and then two versions for + arbitrary intervals.\ + (* - A slightly stronger version of integral_FTC_atLeastAtMost and related facts, - with continuous_on instead of isCont - TODO: make the older versions corollaries of these (using continuous_at_imp_continuous_on, etc.) *) @@ -606,28 +610,43 @@ where x and y are real. These should be better automated. *) -(* - The first Fundamental Theorem of Calculus - - First, for finite intervals, and then two versions for arbitrary intervals. -*) - lemma interval_integral_FTC_finite: fixes f F :: "real \ 'a::euclidean_space" and a b :: real assumes f: "continuous_on {min a b..max a b} f" assumes F: "\x. min a b \ x \ x \ max a b \ (F has_vector_derivative (f x)) (at x within {min a b..max a b})" shows "(LBINT x=a..b. f x) = F b - F a" - apply (case_tac "a \ b") - apply (subst interval_integral_Icc, simp) - apply (rule integral_FTC_atLeastAtMost, assumption) - apply (metis F max_def min_def) - using f apply (simp add: min_absorb1 max_absorb2) - apply (subst interval_integral_endpoints_reverse) - apply (subst interval_integral_Icc, simp) - apply (subst integral_FTC_atLeastAtMost, auto) - apply (metis F max_def min_def) -using f by (simp add: min_absorb2 max_absorb1) +proof (cases "a \ b") + case True + have "(LBINT x=a..b. f x) = (LBINT x. indicat_real {a..b} x *\<^sub>R f x)" + by (simp add: True interval_integral_Icc set_lebesgue_integral_def) + also have "... = F b - F a" + proof (rule integral_FTC_atLeastAtMost [OF True]) + show "continuous_on {a..b} f" + using True f by linarith + show "\x. \a \ x; x \ b\ \ (F has_vector_derivative f x) (at x within {a..b})" + by (metis F True max.commute max_absorb1 min_def) + qed + finally show ?thesis . +next + case False + then have "b \ a" + by simp + have "- interval_lebesgue_integral lborel (ereal b) (ereal a) f = - (LBINT x. indicat_real {b..a} x *\<^sub>R f x)" + by (simp add: \b \ a\ interval_integral_Icc set_lebesgue_integral_def) + also have "... = F b - F a" + proof (subst integral_FTC_atLeastAtMost [OF \b \ a\]) + show "continuous_on {b..a} f" + using False f by linarith + show "\x. \b \ x; x \ a\ + \ (F has_vector_derivative f x) (at x within {b..a})" + by (metis F False max_def min_def) + qed auto + finally show ?thesis + by (metis interval_integral_endpoints_reverse) +qed + + lemma interval_integral_FTC_nonneg: fixes f F :: "real \ real" and a b :: ereal @@ -655,11 +674,12 @@ have 1: "\i. set_integrable lborel {l i..u i} f" proof - fix i show "set_integrable lborel {l i .. u i} f" - using \a < l i\ \u i < b\ + using \a < l i\ \u i < b\ unfolding set_integrable_def by (intro borel_integrable_compact f continuous_at_imp_continuous_on compact_Icc ballI) (auto simp del: ereal_less_eq simp add: ereal_less_eq(3)[symmetric]) qed have 2: "set_borel_measurable lborel (einterval a b) f" + unfolding set_borel_measurable_def by (auto simp del: real_scaleR_def intro!: borel_measurable_continuous_on_indicator simp: continuous_on_eq_continuous_at einterval_iff f) have 3: "(\i. LBINT x=l i..u i. f x) \ B - A" @@ -779,12 +799,10 @@ qed qed -(* - The substitution theorem +subsection\The substitution theorem\ - Once again, three versions: first, for finite intervals, and then two versions for - arbitrary intervals. -*) +text\Once again, three versions: first, for finite intervals, and then two versions for + arbitrary intervals.\ lemma interval_integral_substitution_finite: fixes a b :: real and f :: "real \ 'a::euclidean_space" @@ -824,6 +842,7 @@ by (blast intro: continuous_on_compose2 contf contg) have "LBINT x=a..b. g' x *\<^sub>R f (g x) = F (g b) - F (g a)" apply (subst interval_integral_Icc, simp add: assms) + unfolding set_lebesgue_integral_def apply (rule integral_FTC_atLeastAtMost[of a b "\x. F (g x)", OF \a \ b\]) apply (rule vector_diff_chain_within[OF v_derivg derivF, unfolded comp_def]) apply (auto intro!: continuous_on_scaleR contg' contfg) @@ -1093,7 +1112,7 @@ shows "interval_lebesgue_integrable lborel a b f \ a \ b \ norm (LBINT t=a..b. f t) \ LBINT t=a..b. norm (f t)" using integral_norm_bound[of lborel "\x. indicator (einterval a b) x *\<^sub>R f x"] - by (auto simp add: interval_lebesgue_integral_def interval_lebesgue_integrable_def) + by (auto simp add: interval_lebesgue_integral_def interval_lebesgue_integrable_def set_lebesgue_integral_def) lemma interval_integral_norm2: "interval_lebesgue_integrable lborel a b f \ @@ -1105,7 +1124,7 @@ case (le a b) then have "\LBINT t=a..b. norm (f t)\ = LBINT t=a..b. norm (f t)" using integrable_norm[of lborel "\x. indicator (einterval a b) x *\<^sub>R f x"] - by (auto simp add: interval_lebesgue_integral_def interval_lebesgue_integrable_def + by (auto simp add: interval_lebesgue_integral_def interval_lebesgue_integrable_def set_lebesgue_integral_def intro!: integral_nonneg_AE abs_of_nonneg) then show ?case using le by (simp add: interval_integral_norm) diff -r e9f66b35d636 -r 3f352a91b45a src/HOL/Analysis/Set_Integral.thy --- a/src/HOL/Analysis/Set_Integral.thy Mon Apr 09 17:21:10 2018 +0100 +++ b/src/HOL/Analysis/Set_Integral.thy Wed Apr 11 16:34:44 2018 +0100 @@ -15,18 +15,18 @@ Notation *) -abbreviation "set_borel_measurable M A f \ (\x. indicator A x *\<^sub>R f x) \ borel_measurable M" +definition "set_borel_measurable M A f \ (\x. indicator A x *\<^sub>R f x) \ borel_measurable M" -abbreviation "set_integrable M A f \ integrable M (\x. indicator A x *\<^sub>R f x)" +definition "set_integrable M A f \ integrable M (\x. indicator A x *\<^sub>R f x)" -abbreviation "set_lebesgue_integral M A f \ lebesgue_integral M (\x. indicator A x *\<^sub>R f x)" +definition "set_lebesgue_integral M A f \ lebesgue_integral M (\x. indicator A x *\<^sub>R f x)" syntax -"_ascii_set_lebesgue_integral" :: "pttrn \ 'a set \ 'a measure \ real \ real" -("(4LINT (_):(_)/|(_)./ _)" [0,60,110,61] 60) + "_ascii_set_lebesgue_integral" :: "pttrn \ 'a set \ 'a measure \ real \ real" + ("(4LINT (_):(_)/|(_)./ _)" [0,60,110,61] 60) translations -"LINT x:A|M. f" == "CONST set_lebesgue_integral M A (\x. f)" + "LINT x:A|M. f" == "CONST set_lebesgue_integral M A (\x. f)" (* Notation for integration wrt lebesgue measure on the reals: @@ -38,12 +38,12 @@ *) syntax -"_lebesgue_borel_integral" :: "pttrn \ real \ real" -("(2LBINT _./ _)" [0,60] 60) + "_lebesgue_borel_integral" :: "pttrn \ real \ real" + ("(2LBINT _./ _)" [0,60] 60) syntax -"_set_lebesgue_borel_integral" :: "pttrn \ real set \ real \ real" -("(3LBINT _:_./ _)" [0,60,61] 60) + "_set_lebesgue_borel_integral" :: "pttrn \ real set \ real \ real" + ("(3LBINT _:_./ _)" [0,60,61] 60) (* Basic properties @@ -60,7 +60,7 @@ shows "f -` B \ X \ sets M" proof - have "f \ borel_measurable (restrict_space M X)" - using assms by (subst borel_measurable_restrict_space_iff) auto + using assms unfolding set_borel_measurable_def by (subst borel_measurable_restrict_space_iff) auto then have "f -` B \ space (restrict_space M X) \ sets (restrict_space M X)" by (rule measurable_sets) fact with \X \ sets M\ show ?thesis @@ -70,7 +70,9 @@ lemma set_lebesgue_integral_cong: assumes "A \ sets M" and "\x. x \ A \ f x = g x" shows "(LINT x:A|M. f x) = (LINT x:A|M. g x)" - using assms by (auto intro!: Bochner_Integration.integral_cong split: split_indicator simp add: sets.sets_into_space) + unfolding set_lebesgue_integral_def + using assms + by (metis indicator_simps(2) real_vector.scale_zero_left) lemma set_lebesgue_integral_cong_AE: assumes [measurable]: "A \ sets M" "f \ borel_measurable M" "g \ borel_measurable M" @@ -79,13 +81,15 @@ proof- have "AE x in M. indicator A x *\<^sub>R f x = indicator A x *\<^sub>R g x" using assms by auto - thus ?thesis by (intro integral_cong_AE) auto + thus ?thesis + unfolding set_lebesgue_integral_def by (intro integral_cong_AE) auto qed lemma set_integrable_cong_AE: "f \ borel_measurable M \ g \ borel_measurable M \ AE x \ A in M. f x = g x \ A \ sets M \ set_integrable M A f = set_integrable M A g" + unfolding set_integrable_def by (rule integrable_cong_AE) auto lemma set_integrable_subset: @@ -94,8 +98,9 @@ shows "set_integrable M B f" proof - have "set_integrable M B (\x. indicator A x *\<^sub>R f x)" - by (rule integrable_mult_indicator) fact+ + using assms integrable_mult_indicator set_integrable_def by blast with \B \ A\ show ?thesis + unfolding set_integrable_def by (simp add: indicator_inter_arith[symmetric] Int_absorb2) qed @@ -104,11 +109,12 @@ assumes f: "set_integrable M S f" and T: "T \ sets (restrict_space M S)" shows "set_integrable M T f" proof - - obtain T' where T_eq: "T = S \ T'" and "T' \ sets M" using T by (auto simp: sets_restrict_space) - + obtain T' where T_eq: "T = S \ T'" and "T' \ sets M" + using T by (auto simp: sets_restrict_space) have \integrable M (\x. indicator T' x *\<^sub>R (indicator S x *\<^sub>R f x))\ - by (rule integrable_mult_indicator; fact) + using \T' \ sets M\ f integrable_mult_indicator set_integrable_def by blast then show ?thesis + unfolding set_integrable_def unfolding T_eq indicator_inter_arith by (simp add: ac_simps) qed @@ -116,41 +122,49 @@ (* TODO: borel_integrable_atLeastAtMost should be named something like set_integrable_Icc_isCont *) lemma set_integral_scaleR_right [simp]: "LINT t:A|M. a *\<^sub>R f t = a *\<^sub>R (LINT t:A|M. f t)" + unfolding set_lebesgue_integral_def by (subst integral_scaleR_right[symmetric]) (auto intro!: Bochner_Integration.integral_cong) lemma set_integral_mult_right [simp]: fixes a :: "'a::{real_normed_field, second_countable_topology}" shows "LINT t:A|M. a * f t = a * (LINT t:A|M. f t)" + unfolding set_lebesgue_integral_def by (subst integral_mult_right_zero[symmetric]) auto lemma set_integral_mult_left [simp]: fixes a :: "'a::{real_normed_field, second_countable_topology}" shows "LINT t:A|M. f t * a = (LINT t:A|M. f t) * a" + unfolding set_lebesgue_integral_def by (subst integral_mult_left_zero[symmetric]) auto lemma set_integral_divide_zero [simp]: fixes a :: "'a::{real_normed_field, field, second_countable_topology}" shows "LINT t:A|M. f t / a = (LINT t:A|M. f t) / a" + unfolding set_lebesgue_integral_def by (subst integral_divide_zero[symmetric], intro Bochner_Integration.integral_cong) (auto split: split_indicator) lemma set_integrable_scaleR_right [simp, intro]: shows "(a \ 0 \ set_integrable M A f) \ set_integrable M A (\t. a *\<^sub>R f t)" + unfolding set_integrable_def unfolding scaleR_left_commute by (rule integrable_scaleR_right) lemma set_integrable_scaleR_left [simp, intro]: fixes a :: "_ :: {banach, second_countable_topology}" shows "(a \ 0 \ set_integrable M A f) \ set_integrable M A (\t. f t *\<^sub>R a)" + unfolding set_integrable_def using integrable_scaleR_left[of a M "\x. indicator A x *\<^sub>R f x"] by simp lemma set_integrable_mult_right [simp, intro]: fixes a :: "'a::{real_normed_field, second_countable_topology}" shows "(a \ 0 \ set_integrable M A f) \ set_integrable M A (\t. a * f t)" + unfolding set_integrable_def using integrable_mult_right[of a M "\x. indicator A x *\<^sub>R f x"] by simp lemma set_integrable_mult_left [simp, intro]: fixes a :: "'a::{real_normed_field, second_countable_topology}" shows "(a \ 0 \ set_integrable M A f) \ set_integrable M A (\t. f t * a)" + unfolding set_integrable_def using integrable_mult_left[of a M "\x. indicator A x *\<^sub>R f x"] by simp lemma set_integrable_divide [simp, intro]: @@ -159,10 +173,11 @@ shows "set_integrable M A (\t. f t / a)" proof - have "integrable M (\x. indicator A x *\<^sub>R f x / a)" - using assms by (rule integrable_divide_zero) + using assms unfolding set_integrable_def by (rule integrable_divide_zero) also have "(\x. indicator A x *\<^sub>R f x / a) = (\x. indicator A x *\<^sub>R (f x / a))" by (auto split: split_indicator) - finally show ?thesis . + finally show ?thesis + unfolding set_integrable_def . qed lemma set_integral_add [simp, intro]: @@ -170,21 +185,23 @@ assumes "set_integrable M A f" "set_integrable M A g" shows "set_integrable M A (\x. f x + g x)" and "LINT x:A|M. f x + g x = (LINT x:A|M. f x) + (LINT x:A|M. g x)" - using assms by (simp_all add: scaleR_add_right) + using assms unfolding set_integrable_def set_lebesgue_integral_def by (simp_all add: scaleR_add_right) lemma set_integral_diff [simp, intro]: assumes "set_integrable M A f" "set_integrable M A g" shows "set_integrable M A (\x. f x - g x)" and "LINT x:A|M. f x - g x = (LINT x:A|M. f x) - (LINT x:A|M. g x)" - using assms by (simp_all add: scaleR_diff_right) + using assms unfolding set_integrable_def set_lebesgue_integral_def by (simp_all add: scaleR_diff_right) (* question: why do we have this for negation, but multiplication by a constant requires an integrability assumption? *) lemma set_integral_uminus: "set_integrable M A f \ LINT x:A|M. - f x = - (LINT x:A|M. f x)" + unfolding set_integrable_def set_lebesgue_integral_def by (subst integral_minus[symmetric]) simp_all lemma set_integral_complex_of_real: "LINT x:A|M. complex_of_real (f x) = of_real (LINT x:A|M. f x)" + unfolding set_lebesgue_integral_def by (subst integral_complex_of_real[symmetric]) (auto intro!: Bochner_Integration.integral_cong split: split_indicator) @@ -193,28 +210,31 @@ assumes "set_integrable M A f" "set_integrable M A g" "\x. x \ A \ f x \ g x" shows "(LINT x:A|M. f x) \ (LINT x:A|M. g x)" -using assms by (auto intro: integral_mono split: split_indicator) + using assms unfolding set_integrable_def set_lebesgue_integral_def + by (auto intro: integral_mono split: split_indicator) lemma set_integral_mono_AE: fixes f g :: "_ \ real" assumes "set_integrable M A f" "set_integrable M A g" "AE x \ A in M. f x \ g x" shows "(LINT x:A|M. f x) \ (LINT x:A|M. g x)" -using assms by (auto intro: integral_mono_AE split: split_indicator) + using assms unfolding set_integrable_def set_lebesgue_integral_def + by (auto intro: integral_mono_AE split: split_indicator) lemma set_integrable_abs: "set_integrable M A f \ set_integrable M A (\x. \f x\ :: real)" - using integrable_abs[of M "\x. f x * indicator A x"] by (simp add: abs_mult ac_simps) + using integrable_abs[of M "\x. f x * indicator A x"]unfolding set_integrable_def by (simp add: abs_mult ac_simps) lemma set_integrable_abs_iff: fixes f :: "_ \ real" shows "set_borel_measurable M A f \ set_integrable M A (\x. \f x\) = set_integrable M A f" + unfolding set_integrable_def set_borel_measurable_def by (subst (2) integrable_abs_iff[symmetric]) (simp_all add: abs_mult ac_simps) lemma set_integrable_abs_iff': fixes f :: "_ \ real" shows "f \ borel_measurable M \ A \ sets M \ set_integrable M A (\x. \f x\) = set_integrable M A f" -by (intro set_integrable_abs_iff) auto + by (simp add: set_borel_measurable_def set_integrable_abs_iff) lemma set_integrable_discrete_difference: fixes f :: "'a \ 'b::{banach, second_countable_topology}" @@ -222,6 +242,7 @@ assumes diff: "(A - B) \ (B - A) \ X" assumes "\x. x \ X \ emeasure M {x} = 0" "\x. x \ X \ {x} \ sets M" shows "set_integrable M A f \ set_integrable M B f" + unfolding set_integrable_def proof (rule integrable_discrete_difference[where X=X]) show "\x. x \ space M \ x \ X \ indicator A x *\<^sub>R f x = indicator B x *\<^sub>R f x" using diff by (auto split: split_indicator) @@ -233,6 +254,7 @@ assumes diff: "(A - B) \ (B - A) \ X" assumes "\x. x \ X \ emeasure M {x} = 0" "\x. x \ X \ {x} \ sets M" shows "set_lebesgue_integral M A f = set_lebesgue_integral M B f" + unfolding set_lebesgue_integral_def proof (rule integral_discrete_difference[where X=X]) show "\x. x \ space M \ x \ X \ indicator A x *\<^sub>R f x = indicator B x *\<^sub>R f x" using diff by (auto split: split_indicator) @@ -246,35 +268,44 @@ proof - have "set_integrable M (A - B) f" using f_A by (rule set_integrable_subset) auto - from Bochner_Integration.integrable_add[OF this f_B] show ?thesis + with f_B have "integrable M (\x. indicator (A - B) x *\<^sub>R f x + indicator B x *\<^sub>R f x)" + unfolding set_integrable_def using integrable_add by blast + then show ?thesis + unfolding set_integrable_def by (rule integrable_cong[THEN iffD1, rotated 2]) (auto split: split_indicator) qed +lemma set_integrable_empty [simp]: "set_integrable M {} f" + by (auto simp: set_integrable_def) + lemma set_integrable_UN: fixes f :: "_ \ _ :: {banach, second_countable_topology}" assumes "finite I" "\i. i\I \ set_integrable M (A i) f" "\i. i\I \ A i \ sets M" shows "set_integrable M (\i\I. A i) f" -using assms by (induct I) (auto intro!: set_integrable_Un) + using assms + by (induct I) (auto simp: set_integrable_Un sets.finite_UN) lemma set_integral_Un: fixes f :: "_ \ _ :: {banach, second_countable_topology}" assumes "A \ B = {}" and "set_integrable M A f" and "set_integrable M B f" - shows "LINT x:A\B|M. f x = (LINT x:A|M. f x) + (LINT x:B|M. f x)" -by (auto simp add: indicator_union_arith indicator_inter_arith[symmetric] - scaleR_add_left assms) +shows "LINT x:A\B|M. f x = (LINT x:A|M. f x) + (LINT x:B|M. f x)" + using assms + unfolding set_integrable_def set_lebesgue_integral_def + by (auto simp add: indicator_union_arith indicator_inter_arith[symmetric] scaleR_add_left) lemma set_integral_cong_set: fixes f :: "_ \ _ :: {banach, second_countable_topology}" - assumes [measurable]: "set_borel_measurable M A f" "set_borel_measurable M B f" + assumes "set_borel_measurable M A f" "set_borel_measurable M B f" and ae: "AE x in M. x \ A \ x \ B" shows "LINT x:B|M. f x = LINT x:A|M. f x" + unfolding set_lebesgue_integral_def proof (rule integral_cong_AE) show "AE x in M. indicator B x *\<^sub>R f x = indicator A x *\<^sub>R f x" using ae by (auto simp: subset_eq split: split_indicator) -qed fact+ +qed (use assms in \auto simp: set_borel_measurable_def\) lemma set_borel_measurable_subset: fixes f :: "_ \ _ :: {banach, second_countable_topology}" @@ -282,10 +313,12 @@ shows "set_borel_measurable M B f" proof - have "set_borel_measurable M B (\x. indicator A x *\<^sub>R f x)" - by measurable - also have "(\x. indicator B x *\<^sub>R indicator A x *\<^sub>R f x) = (\x. indicator B x *\<^sub>R f x)" + using assms unfolding set_borel_measurable_def + using borel_measurable_indicator borel_measurable_scaleR by blast + moreover have "(\x. indicator B x *\<^sub>R indicator A x *\<^sub>R f x) = (\x. indicator B x *\<^sub>R f x)" using \B \ A\ by (auto simp: fun_eq_iff split: split_indicator) - finally show ?thesis . + ultimately show ?thesis + unfolding set_borel_measurable_def by simp qed lemma set_integral_Un_AE: @@ -298,7 +331,7 @@ have f: "set_integrable M (A \ B) f" by (intro set_integrable_Un assms) then have f': "set_borel_measurable M (A \ B) f" - by (rule borel_measurable_integrable) + using integrable_iff_bounded set_borel_measurable_def set_integrable_def by blast have "LINT x:A\B|M. f x = LINT x:(A - A \ B) \ (B - A \ B)|M. f x" proof (rule set_integral_cong_set) show "AE x in M. (x \ A - A \ B \ (B - A \ B)) = (x \ A \ B)" @@ -321,9 +354,13 @@ and "\i. i \ I \ set_integrable M (A i) f" "\i. i \ I \ A i \ sets M" shows "(LINT x:(\i\I. A i)|M. f x) = (\i\I. LINT x:A i|M. f x)" using assms - apply induct - apply (auto intro!: set_integral_Un set_integrable_Un set_integrable_UN simp: disjoint_family_on_def) -by (subst set_integral_Un, auto intro: set_integrable_UN) +proof induction + case (insert x F) + then have "A x \ UNION F A = {}" + by (meson disjoint_family_on_insert) + with insert show ?case + by (simp add: set_integral_Un set_integrable_Un set_integrable_UN disjoint_family_on_insert) +qed (simp add: set_lebesgue_integral_def) (* TODO: find a better name? *) lemma pos_integrable_to_top: @@ -332,10 +369,11 @@ assumes nneg: "\x i. x \ A i \ 0 \ f x" and intgbl: "\i::nat. set_integrable M (A i) f" and lim: "(\i::nat. LINT x:A i|M. f x) \ l" - shows "set_integrable M (\i. A i) f" +shows "set_integrable M (\i. A i) f" + unfolding set_integrable_def apply (rule integrable_monotone_convergence[where f = "\i::nat. \x. indicator (A i) x *\<^sub>R f x" and x = l]) - apply (rule intgbl) - prefer 3 apply (rule lim) + apply (rule intgbl [unfolded set_integrable_def]) + prefer 3 apply (rule lim [unfolded set_lebesgue_integral_def]) apply (rule AE_I2) using \mono A\ apply (auto simp: mono_def nneg split: split_indicator) [] proof (rule AE_I2) @@ -356,8 +394,7 @@ then show "(\x. indicator (\i. A i) x *\<^sub>R f x) \ borel_measurable M" apply (rule borel_measurable_LIMSEQ_real) apply assumption - apply (intro borel_measurable_integrable intgbl) - done + using intgbl set_integrable_def by blast qed (* Proof from Royden Real Analysis, p. 91. *) @@ -367,16 +404,18 @@ and disj: "\i j. i \ j \ A i \ A j = {}" and intgbl: "set_integrable M (\i. A i) f" shows "LINT x:(\i. A i)|M. f x = (\i. (LINT x:(A i)|M. f x))" + unfolding set_lebesgue_integral_def proof (subst integral_suminf[symmetric]) - show int_A: "\i. set_integrable M (A i) f" - using intgbl by (rule set_integrable_subset) auto + show int_A: "integrable M (\x. indicat_real (A i) x *\<^sub>R f x)" for i + using intgbl unfolding set_integrable_def [symmetric] + by (rule set_integrable_subset) auto { fix x assume "x \ space M" have "(\i. indicator (A i) x *\<^sub>R f x) sums (indicator (\i. A i) x *\<^sub>R f x)" by (intro sums_scaleR_left indicator_sums) fact } note sums = this have norm_f: "\i. set_integrable M (A i) (\x. norm (f x))" - using int_A[THEN integrable_norm] by auto + using int_A[THEN integrable_norm] unfolding set_integrable_def by auto show "AE x in M. summable (\i. norm (indicator (A i) x *\<^sub>R f x))" using disj by (intro AE_I2) (auto intro!: summable_mult2 sums_summable[OF indicator_sums]) @@ -387,21 +426,22 @@ show "0 \ LINT x|M. norm (indicator (A n) x *\<^sub>R f x)" using norm_f by (auto intro!: integral_nonneg_AE) - have "(\iR f x)) = - (\ix. norm (f x)))" - by (simp add: abs_mult) + have "(\iR f x)) = (\i = set_lebesgue_integral M (\ix. norm (f x))" using norm_f by (subst set_integral_finite_Union) (auto simp: disjoint_family_on_def disj) also have "\ \ set_lebesgue_integral M (\i. A i) (\x. norm (f x))" - using intgbl[THEN integrable_norm] - by (intro integral_mono set_integrable_UN[of "{..iR f x)) \ set_lebesgue_integral M (\i. A i) (\x. norm (f x))" by simp qed - show "set_lebesgue_integral M (UNION UNIV A) f = LINT x|M. (\i. indicator (A i) x *\<^sub>R f x)" + show "LINT x|M. indicator (UNION UNIV A) x *\<^sub>R f x = LINT x|M. (\i. indicator (A i) x *\<^sub>R f x)" apply (rule Bochner_Integration.integral_cong[OF refl]) apply (subst suminf_scaleR_left[OF sums_summable[OF indicator_sums, OF disj], symmetric]) using sums_unique[OF indicator_sums[OF disj]] @@ -413,14 +453,18 @@ fixes f :: "_ \ 'a :: {banach, second_countable_topology}" assumes [measurable]: "\i. A i \ sets M" and A: "incseq A" and intgbl: "set_integrable M (\i. A i) f" - shows "(\i. LINT x:(A i)|M. f x) \ LINT x:(\i. A i)|M. f x" +shows "(\i. LINT x:(A i)|M. f x) \ LINT x:(\i. A i)|M. f x" + unfolding set_lebesgue_integral_def proof (intro integral_dominated_convergence[where w="\x. indicator (\i. A i) x *\<^sub>R norm (f x)"]) have int_A: "\i. set_integrable M (A i) f" using intgbl by (rule set_integrable_subset) auto - then show "\i. set_borel_measurable M (A i) f" "set_borel_measurable M (\i. A i) f" - "set_integrable M (\i. A i) (\x. norm (f x))" - using intgbl integrable_norm[OF intgbl] by auto - + show "\i. (\x. indicator (A i) x *\<^sub>R f x) \ borel_measurable M" + using int_A integrable_iff_bounded set_integrable_def by blast + show "(\x. indicator (UNION UNIV A) x *\<^sub>R f x) \ borel_measurable M" + using integrable_iff_bounded intgbl set_integrable_def by blast + show "integrable M (\x. indicator (\i. A i) x *\<^sub>R norm (f x))" + using int_A intgbl integrable_norm unfolding set_integrable_def + by fastforce { fix x i assume "x \ A i" with A have "(\xa. indicator (A xa) x::real) \ 1 \ (\xa. 1::real) \ 1" by (intro filterlim_cong refl) @@ -435,15 +479,19 @@ assumes [measurable]: "\i. A i \ sets M" and A: "decseq A" and int0: "set_integrable M (A 0) f" shows "(\i::nat. LINT x:(A i)|M. f x) \ LINT x:(\i. A i)|M. f x" + unfolding set_lebesgue_integral_def proof (rule integral_dominated_convergence) have int_A: "\i. set_integrable M (A i) f" using int0 by (rule set_integrable_subset) (insert A, auto simp: decseq_def) - show "set_integrable M (A 0) (\x. norm (f x))" - using int0[THEN integrable_norm] by simp + have "integrable M (\c. norm (indicat_real (A 0) c *\<^sub>R f c))" + by (metis (no_types) int0 integrable_norm set_integrable_def) + then show "integrable M (\x. indicator (A 0) x *\<^sub>R norm (f x))" + by force have "set_integrable M (\i. A i) f" using int0 by (rule set_integrable_subset) (insert A, auto simp: decseq_def) - with int_A show "set_borel_measurable M (\i. A i) f" "\i. set_borel_measurable M (A i) f" - by auto + with int_A show "(\x. indicat_real (INTER UNIV A) x *\<^sub>R f x) \ borel_measurable M" + "\i. (\x. indicat_real (A i) x *\<^sub>R f x) \ borel_measurable M" + by (auto simp: set_integrable_def) show "\i. AE x in M. norm (indicator (A i) x *\<^sub>R f x) \ indicator (A 0) x *\<^sub>R norm (f x)" using A by (auto split: split_indicator simp: decseq_def) { fix x i assume "x \ space M" "x \ A i" @@ -462,7 +510,8 @@ proof- have "set_lebesgue_integral M {a} f = set_lebesgue_integral M {a} (%x. f a)" by (intro set_lebesgue_integral_cong) simp_all - then show ?thesis using assms by simp + then show ?thesis using assms + unfolding set_lebesgue_integral_def by simp qed @@ -523,6 +572,7 @@ lemma set_measurable_continuous_on_ivl: assumes "continuous_on {a..b} (f :: real \ real)" shows "set_borel_measurable borel {a..b} f" + unfolding set_borel_measurable_def by (rule borel_measurable_continuous_on_indicator[OF _ assms]) simp @@ -670,19 +720,19 @@ lemma set_integral_null_delta: fixes f::"_ \ _ :: {banach, second_countable_topology}" assumes [measurable]: "integrable M f" "A \ sets M" "B \ sets M" - and "(A - B) \ (B - A) \ null_sets M" + and null: "(A - B) \ (B - A) \ null_sets M" shows "(\x \ A. f x \M) = (\x \ B. f x \M)" -proof (rule set_integral_cong_set, auto) +proof (rule set_integral_cong_set) have *: "AE a in M. a \ (A - B) \ (B - A)" - using assms(4) AE_not_in by blast + using null AE_not_in by blast then show "AE x in M. (x \ B) = (x \ A)" by auto -qed +qed (simp_all add: set_borel_measurable_def) lemma set_integral_space: assumes "integrable M f" shows "(\x \ space M. f x \M) = (\x. f x \M)" -by (metis (mono_tags, lifting) indicator_simps(1) Bochner_Integration.integral_cong real_vector.scale_one) + by (metis (no_types, lifting) indicator_simps(1) integral_cong scaleR_one set_lebesgue_integral_def) lemma null_if_pos_func_has_zero_nn_int: fixes f::"'a \ ennreal" @@ -703,7 +753,8 @@ proof - have "AE x in M. indicator A x * f x = 0" apply (subst integral_nonneg_eq_0_iff_AE[symmetric]) - using assms integrable_mult_indicator[OF \A \ sets M\ assms(1)] by auto + using assms integrable_mult_indicator[OF \A \ sets M\ assms(1)] + by (auto simp: set_lebesgue_integral_def) then have "AE x\A in M. f x = 0" by auto then have "AE x\A in M. False" using assms(3) by auto then show "A \ null_sets M" using assms(2) by (simp add: AE_iff_null_sets) @@ -728,31 +779,29 @@ lemma density_unique_real: fixes f f'::"_ \ real" - assumes [measurable]: "integrable M f" "integrable M f'" + assumes M[measurable]: "integrable M f" "integrable M f'" assumes density_eq: "\A. A \ sets M \ (\x \ A. f x \M) = (\x \ A. f' x \M)" shows "AE x in M. f x = f' x" proof - define A where "A = {x \ space M. f x < f' x}" then have [measurable]: "A \ sets M" by simp have "(\x \ A. (f' x - f x) \M) = (\x \ A. f' x \M) - (\x \ A. f x \M)" - using \A \ sets M\ assms(1) assms(2) integrable_mult_indicator by blast + using \A \ sets M\ M integrable_mult_indicator set_integrable_def by blast then have "(\x \ A. (f' x - f x) \M) = 0" using assms(3) by simp then have "A \ null_sets M" using A_def null_if_pos_func_has_zero_int[where ?f = "\x. f' x - f x" and ?A = A] assms by auto then have "AE x in M. x \ A" by (simp add: AE_not_in) then have *: "AE x in M. f' x \ f x" unfolding A_def by auto - define B where "B = {x \ space M. f' x < f x}" then have [measurable]: "B \ sets M" by simp have "(\x \ B. (f x - f' x) \M) = (\x \ B. f x \M) - (\x \ B. f' x \M)" - using \B \ sets M\ assms(1) assms(2) integrable_mult_indicator by blast + using \B \ sets M\ M integrable_mult_indicator set_integrable_def by blast then have "(\x \ B. (f x - f' x) \M) = 0" using assms(3) by simp then have "B \ null_sets M" using B_def null_if_pos_func_has_zero_int[where ?f = "\x. f x - f' x" and ?A = B] assms by auto then have "AE x in M. x \ B" by (simp add: AE_not_in) then have "AE x in M. f' x \ f x" unfolding B_def by auto - then show ?thesis using * by auto qed