# HG changeset patch # User hoelzl # Date 1465998902 -7200 # Node ID 8d591640c3bd029467a64b1bf311668165e80264 # Parent 6b26c378ab35f5fc67d915afd2c6db4c947854b4 Probability: introduce Hahn decomposition; use it to clean up Radon_Nikodym diff -r 6b26c378ab35 -r 8d591640c3bd src/HOL/Probability/Radon_Nikodym.thy --- a/src/HOL/Probability/Radon_Nikodym.thy Tue Jun 14 12:18:45 2016 +0200 +++ b/src/HOL/Probability/Radon_Nikodym.thy Wed Jun 15 15:55:02 2016 +0200 @@ -8,6 +8,155 @@ imports Bochner_Integration begin +lemma (in finite_measure) finite_measure_Diff': + "A \ sets M \ B \ sets M \ measure M (A - B) = measure M A - measure M (A \ B)" + using finite_measure_Diff[of A "A \ B"] by (auto simp: Diff_Int) + +lemma (in finite_measure) finite_measure_Union': + "A \ sets M \ B \ sets M \ measure M (A \ B) = measure M A + measure M (B - A)" + using finite_measure_Union[of A "B - A"] by auto + +lemma finite_unsigned_Hahn_decomposition: + assumes "finite_measure M" "finite_measure N" and [simp]: "sets N = sets M" + shows "\Y\sets M. (\X\sets M. X \ Y \ N X \ M X) \ (\X\sets M. X \ Y = {} \ M X \ N X)" +proof - + interpret M: finite_measure M by fact + interpret N: finite_measure N by fact + + define d where "d X = measure M X - measure N X" for X + + have [intro]: "bdd_above (d`sets M)" + using sets.sets_into_space[of _ M] + by (intro bdd_aboveI[where M="measure M (space M)"]) + (auto simp: d_def field_simps subset_eq intro!: add_increasing M.finite_measure_mono) + + define \ where "\ = (SUP X:sets M. d X)" + have le_\[intro]: "X \ sets M \ d X \ \" for X + by (auto simp: \_def intro!: cSUP_upper) + + have "\f. \n. f n \ sets M \ d (f n) > \ - 1 / 2^n" + proof (intro choice_iff[THEN iffD1] allI) + fix n + have "\X\sets M. \ - 1 / 2^n < d X" + unfolding \_def by (intro less_cSUP_iff[THEN iffD1]) auto + then show "\y. y \ sets M \ \ - 1 / 2 ^ n < d y" + by auto + qed + then obtain E where [measurable]: "E n \ sets M" and E: "d (E n) > \ - 1 / 2^n" for n + by auto + + define F where "F m n = (if m \ n then \i\{m..n}. E i else space M)" for m n + + have [measurable]: "m \ n \ F m n \ sets M" for m n + by (auto simp: F_def) + + have 1: "\ - 2 / 2 ^ m + 1 / 2 ^ n \ d (F m n)" if "m \ n" for m n + using that + proof (induct rule: dec_induct) + case base with E[of m] show ?case + by (simp add: F_def field_simps) + next + case (step i) + have F_Suc: "F m (Suc i) = F m i \ E (Suc i)" + using \m \ i\ by (auto simp: F_def le_Suc_eq) + + have "\ + (\ - 2 / 2^m + 1 / 2 ^ Suc i) \ (\ - 1 / 2^Suc i) + (\ - 2 / 2^m + 1 / 2^i)" + by (simp add: field_simps) + also have "\ \ d (E (Suc i)) + d (F m i)" + using E[of "Suc i"] by (intro add_mono step) auto + also have "\ = d (E (Suc i)) + d (F m i - E (Suc i)) + d (F m (Suc i))" + using \m \ i\ by (simp add: d_def field_simps F_Suc M.finite_measure_Diff' N.finite_measure_Diff') + also have "\ = d (E (Suc i) \ F m i) + d (F m (Suc i))" + using \m \ i\ by (simp add: d_def field_simps M.finite_measure_Union' N.finite_measure_Union') + also have "\ \ \ + d (F m (Suc i))" + using \m \ i\ by auto + finally show ?case + by auto + qed + + define F' where "F' m = (\i\{m..}. E i)" for m + have F'_eq: "F' m = (\i. F m (i + m))" for m + by (fastforce simp: le_iff_add[of m] F'_def F_def) + + have [measurable]: "F' m \ sets M" for m + by (auto simp: F'_def) + + have \_le: "\ - 0 \ d (\m. F' m)" + proof (rule LIMSEQ_le) + show "(\n. \ - 2 / 2 ^ n) \ \ - 0" + by (intro tendsto_intros LIMSEQ_divide_realpow_zero) auto + have "incseq F'" + by (auto simp: incseq_def F'_def) + then show "(\m. d (F' m)) \ d (\m. F' m)" + unfolding d_def + by (intro tendsto_diff M.finite_Lim_measure_incseq N.finite_Lim_measure_incseq) auto + + have "\ - 2 / 2 ^ m + 0 \ d (F' m)" for m + proof (rule LIMSEQ_le) + have *: "decseq (\n. F m (n + m))" + by (auto simp: decseq_def F_def) + show "(\n. d (F m n)) \ d (F' m)" + unfolding d_def F'_eq + by (rule LIMSEQ_offset[where k=m]) + (auto intro!: tendsto_diff M.finite_Lim_measure_decseq N.finite_Lim_measure_decseq *) + show "(\n. \ - 2 / 2 ^ m + 1 / 2 ^ n) \ \ - 2 / 2 ^ m + 0" + by (intro tendsto_add LIMSEQ_divide_realpow_zero tendsto_const) auto + show "\N. \n\N. \ - 2 / 2 ^ m + 1 / 2 ^ n \ d (F m n)" + using 1[of m] by (intro exI[of _ m]) auto + qed + then show "\N. \n\N. \ - 2 / 2 ^ n \ d (F' n)" + by auto + qed + + show ?thesis + proof (safe intro!: bexI[of _ "\m. F' m"]) + fix X assume [measurable]: "X \ sets M" and X: "X \ (\m. F' m)" + have "d (\m. F' m) - d X = d ((\m. F' m) - X)" + using X by (auto simp: d_def M.finite_measure_Diff N.finite_measure_Diff) + also have "\ \ \" + by auto + finally have "0 \ d X" + using \_le by auto + then show "emeasure N X \ emeasure M X" + by (auto simp: d_def M.emeasure_eq_measure N.emeasure_eq_measure) + next + fix X assume [measurable]: "X \ sets M" and X: "X \ (\m. F' m) = {}" + then have "d (\m. F' m) + d X = d (X \ (\m. F' m))" + by (auto simp: d_def M.finite_measure_Union N.finite_measure_Union) + also have "\ \ \" + by auto + finally have "d X \ 0" + using \_le by auto + then show "emeasure M X \ emeasure N X" + by (auto simp: d_def M.emeasure_eq_measure N.emeasure_eq_measure) + qed auto +qed + +lemma unsigned_Hahn_decomposition: + assumes [simp]: "sets N = sets M" and [measurable]: "A \ sets M" + and [simp]: "emeasure M A \ top" "emeasure N A \ top" + shows "\Y\sets M. Y \ A \ (\X\sets M. X \ Y \ N X \ M X) \ (\X\sets M. X \ A \ X \ Y = {} \ M X \ N X)" +proof - + have "\Y\sets (restrict_space M A). + (\X\sets (restrict_space M A). X \ Y \ (restrict_space N A) X \ (restrict_space M A) X) \ + (\X\sets (restrict_space M A). X \ Y = {} \ (restrict_space M A) X \ (restrict_space N A) X)" + proof (rule finite_unsigned_Hahn_decomposition) + show "finite_measure (restrict_space M A)" "finite_measure (restrict_space N A)" + by (auto simp: space_restrict_space emeasure_restrict_space less_top intro!: finite_measureI) + qed (simp add: sets_restrict_space) + then guess Y .. + then show ?thesis + apply (intro bexI[of _ Y] conjI ballI conjI) + apply (simp_all add: sets_restrict_space emeasure_restrict_space) + apply safe + subgoal for X Z + by (erule ballE[of _ _ X]) (auto simp add: Int_absorb1) + subgoal for X Z + by (erule ballE[of _ _ X]) (auto simp add: Int_absorb1 ac_simps) + apply auto + done +qed + definition diff_measure :: "'a measure \ 'a measure \ 'a measure" where "diff_measure M N = measure_of (space M) (sets M) (\A. emeasure M A - emeasure N A)" @@ -121,6 +270,10 @@ "(\x. \ x \ A ; f x \ 0 \ \ g x \ 0) \ absolutely_continuous (point_measure A f) (point_measure A g)" unfolding absolutely_continuous_def by (force simp: null_sets_point_measure_iff) +lemma absolutely_continuousD: + "absolutely_continuous M N \ A \ sets M \ emeasure M A = 0 \ emeasure N A = 0" + by (auto simp: absolutely_continuous_def null_sets_def) + lemma absolutely_continuous_AE: assumes sets_eq: "sets M' = sets M" and "absolutely_continuous M M'" "AE x in M. P x" @@ -138,161 +291,16 @@ subsection "Existence of the Radon-Nikodym derivative" -lemma (in finite_measure) Radon_Nikodym_aux_epsilon: - fixes e :: real assumes "0 < e" - assumes "finite_measure N" and sets_eq: "sets N = sets M" - shows "\A\sets M. measure M (space M) - measure N (space M) \ measure M A - measure N A \ - (\B\sets M. B \ A \ - e < measure M B - measure N B)" -proof - - interpret M': finite_measure N by fact - let ?d = "\A. measure M A - measure N A" - let ?A = "\A. if (\B\sets M. B \ space M - A \ -e < ?d B) - then {} - else (SOME B. B \ sets M \ B \ space M - A \ ?d B \ -e)" - define A where "A n = ((\B. B \ ?A B) ^^ n) {}" for n - have A_simps[simp]: - "A 0 = {}" - "\n. A (Suc n) = (A n \ ?A (A n))" unfolding A_def by simp_all - { fix A assume "A \ sets M" - have "?A A \ sets M" - by (auto intro!: someI2[of _ _ "\A. A \ sets M"] simp: not_less) } - note A'_in_sets = this - { fix n have "A n \ sets M" - proof (induct n) - case (Suc n) thus "A (Suc n) \ sets M" - using A'_in_sets[of "A n"] by (auto split: if_split_asm) - qed (simp add: A_def) } - note A_in_sets = this - hence "range A \ sets M" by auto - { fix n B - assume Ex: "\B. B \ sets M \ B \ space M - A n \ ?d B \ -e" - hence False: "\ (\B\sets M. B \ space M - A n \ -e < ?d B)" by (auto simp: not_less) - have "?d (A (Suc n)) \ ?d (A n) - e" unfolding A_simps if_not_P[OF False] - proof (rule someI2_ex[OF Ex]) - fix B assume "B \ sets M \ B \ space M - A n \ ?d B \ - e" - hence "A n \ B = {}" "B \ sets M" and dB: "?d B \ -e" by auto - hence "?d (A n \ B) = ?d (A n) + ?d B" - using \A n \ sets M\ finite_measure_Union M'.finite_measure_Union by (simp add: sets_eq) - also have "\ \ ?d (A n) - e" using dB by simp - finally show "?d (A n \ B) \ ?d (A n) - e" . - qed } - note dA_epsilon = this - { fix n have "?d (A (Suc n)) \ ?d (A n)" - proof (cases "\B. B\sets M \ B \ space M - A n \ ?d B \ - e") - case True from dA_epsilon[OF this] show ?thesis using \0 < e\ by simp - next - case False - hence "\B\sets M. B \ space M - A n \ -e < ?d B" by (auto simp: not_le) - thus ?thesis by simp - qed } - note dA_mono = this - show ?thesis - proof (cases "\n. \B\sets M. B \ space M - A n \ -e < ?d B") - case True then obtain n where B: "\B. \ B \ sets M; B \ space M - A n\ \ -e < ?d B" by blast - show ?thesis - proof (safe intro!: bexI[of _ "space M - A n"]) - fix B assume "B \ sets M" "B \ space M - A n" - from B[OF this] show "-e < ?d B" . - next - show "space M - A n \ sets M" by (rule sets.compl_sets) fact - next - show "?d (space M) \ ?d (space M - A n)" - proof (induct n) - fix n assume "?d (space M) \ ?d (space M - A n)" - also have "\ \ ?d (space M - A (Suc n))" - using A_in_sets sets.sets_into_space dA_mono[of n] finite_measure_compl M'.finite_measure_compl - by (simp del: A_simps add: sets_eq sets_eq_imp_space_eq[OF sets_eq]) - finally show "?d (space M) \ ?d (space M - A (Suc n))" . - qed simp - qed - next - case False hence B: "\n. \B. B\sets M \ B \ space M - A n \ ?d B \ - e" - by (auto simp add: not_less) - { fix n have "?d (A n) \ - real n * e" - proof (induct n) - case (Suc n) with dA_epsilon[of n, OF B] show ?case by (simp del: A_simps add: field_simps) - next - case 0 with measure_empty show ?case by (simp add: zero_ennreal_def) - qed } note dA_less = this - have decseq: "decseq (\n. ?d (A n))" unfolding decseq_eq_incseq - proof (rule incseq_SucI) - fix n show "- ?d (A n) \ - ?d (A (Suc n))" using dA_mono[of n] by auto - qed - have A: "incseq A" by (auto intro!: incseq_SucI) - from finite_Lim_measure_incseq[OF _ A] \range A \ sets M\ - M'.finite_Lim_measure_incseq[OF _ A] - have convergent: "(\i. ?d (A i)) \ ?d (\i. A i)" - by (auto intro!: tendsto_diff simp: sets_eq) - obtain n :: nat where "- ?d (\i. A i) / e < real n" using reals_Archimedean2 by auto - moreover from order_trans[OF decseq_le[OF decseq convergent] dA_less] - have "real n \ - ?d (\i. A i) / e" using \0 by (simp add: field_simps) - ultimately show ?thesis by auto - qed -qed - -lemma (in finite_measure) Radon_Nikodym_aux: - assumes "finite_measure N" and sets_eq: "sets N = sets M" - shows "\A\sets M. measure M (space M) - measure N (space M) \ measure M A - measure N A \ - (\B\sets M. B \ A \ 0 \ measure M B - measure N B)" -proof - - interpret N: finite_measure N by fact - let ?d = "\A. measure M A - measure N A" - let ?P = "\A n. if n = 0 then A = space M else (\C\sets M. C \ A \ - 1 / real (Suc n) < ?d C)" - let ?Q = "\A B. A \ B \ ?d B \ ?d A" - - have "\A. \n. (A n \ sets M \ ?P (A n) n) \ ?Q (A (Suc n)) (A n)" - proof (rule dependent_nat_choice) - show "\A. A \ sets M \ ?P A 0" - by auto - next - fix A n assume "A \ sets M \ ?P A n" - then have A: "A \ sets M" by auto - then have "finite_measure (density M (indicator A))" "0 < 1 / real (Suc (Suc n))" - "finite_measure (density N (indicator A))" "sets (density N (indicator A)) = sets (density M (indicator A))" - by (auto simp: finite_measure_restricted N.finite_measure_restricted sets_eq) - from finite_measure.Radon_Nikodym_aux_epsilon[OF this] guess X .. note X = this - with A have "A \ X \ sets M \ ?P (A \ X) (Suc n) \ ?Q (A \ X) A" - by (simp add: measure_restricted sets_eq sets.Int) (metis inf_absorb2) - then show "\B. (B \ sets M \ ?P B (Suc n)) \ ?Q B A" - by blast - qed - then obtain A where A: "\n. A n \ sets M" "\n. ?P (A n) n" "\n. ?Q (A (Suc n)) (A n)" - by metis - then have mono_dA: "mono (\i. ?d (A i))" and A_0[simp]: "A 0 = space M" - by (auto simp add: mono_iff_le_Suc) - show ?thesis - proof (safe intro!: bexI[of _ "\i. A i"]) - show "(\i. A i) \ sets M" using \\n. A n \ sets M\ by auto - have "decseq A" using A by (auto intro!: decseq_SucI) - from A(1) finite_Lim_measure_decseq[OF _ this] N.finite_Lim_measure_decseq[OF _ this] - have "(\i. ?d (A i)) \ ?d (\i. A i)" by (auto intro!: tendsto_diff simp: sets_eq) - thus "?d (space M) \ ?d (\i. A i)" using mono_dA[THEN monoD, of 0 _] - by (rule_tac LIMSEQ_le_const) auto - next - fix B assume B: "B \ sets M" "B \ (\i. A i)" - show "0 \ ?d B" - proof (rule ccontr) - assume "\ 0 \ ?d B" - hence "0 < - ?d B" by auto - from reals_Archimedean[OF this] - obtain n where *: "?d B < - 1 / real (Suc n)" - by (auto simp: field_simps) - also have "\ \ - 1 / real (Suc (Suc n))" - by (auto simp: field_simps) - finally show False - using * A(2)[of "Suc n"] B by (auto elim!: ballE[of _ _ B]) - qed - qed -qed - lemma (in finite_measure) Radon_Nikodym_finite_measure: - assumes "finite_measure N" and sets_eq: "sets N = sets M" + assumes "finite_measure N" and sets_eq[simp]: "sets N = sets M" assumes "absolutely_continuous M N" shows "\f \ borel_measurable M. density M f = N" proof - interpret N: finite_measure N by fact define G where "G = {g \ borel_measurable M. \A\sets M. (\\<^sup>+x. g x * indicator A x \M) \ N A}" - { fix f have "f \ G \ f \ borel_measurable M" by (auto simp: G_def) } + have [measurable_dest]: "f \ G \ f \ borel_measurable M" + and G_D: "\A. f \ G \ A \ sets M \ (\\<^sup>+x. f x * indicator A x \M) \ N A" for f + by (auto simp: G_def) note this[measurable_dest] have "(\x. 0) \ G" unfolding G_def by auto hence "G \ {}" by auto @@ -314,7 +322,7 @@ also have "\ \ N (?A \ A) + N ((space M - ?A) \ A)" using f g unfolding G_def by (auto intro!: add_mono) also have "\ = N A" - using union by (subst plus_emeasure) (auto simp: sets_eq) + using union by (subst plus_emeasure) auto finally show "(\\<^sup>+x. max (g x) (f x) * indicator A x \M) \ N A" . qed auto } note max_in_G = this @@ -333,7 +341,7 @@ by (intro nn_integral_monotone_convergence_SUP) (auto simp: G_def incseq_Suc_iff le_fun_def split: split_indicator) finally show "(\\<^sup>+x. (SUP i. f i x) * indicator A x \M) \ N A" - using f \A \ sets M\ by (auto intro!: SUP_least simp: G_def) + using f \A \ sets M\ by (auto intro!: SUP_least simp: G_D) qed } note SUP_in_G = this let ?y = "SUP g : G. integral\<^sup>N M g" @@ -367,11 +375,12 @@ note g_in_G = this have "incseq ?g" using gs_not_empty by (auto intro!: incseq_SucI le_funI simp add: atMost_Suc) + from SUP_in_G[OF this g_in_G] have [measurable]: "f \ G" unfolding f_def . - then have [simp, intro]: "f \ borel_measurable M" unfolding G_def by auto + then have [measurable]: "f \ borel_measurable M" unfolding G_def by auto + have "integral\<^sup>N M f = (SUP i. integral\<^sup>N M (?g i))" unfolding f_def - using g_in_G \incseq ?g\ - by (auto intro!: nn_integral_monotone_convergence_SUP simp: G_def) + using g_in_G \incseq ?g\ by (auto intro!: nn_integral_monotone_convergence_SUP simp: G_def) also have "\ = ?y" proof (rule antisym) show "(SUP i. integral\<^sup>N M (?g i)) \ ?y" @@ -380,145 +389,95 @@ by (auto intro!: SUP_mono nn_integral_mono Max_ge) qed finally have int_f_eq_y: "integral\<^sup>N M f = ?y" . - let ?t = "\A. N A - (\\<^sup>+x. ?F A x \M)" - let ?M = "diff_measure N (density M f)" - have f_le_N: "\A. A \ sets M \ (\\<^sup>+x. ?F A x \M) \ N A" - using \f \ G\ unfolding G_def by auto - have emeasure_M: "\A. A \ sets M \ emeasure ?M A = ?t A" - proof (subst emeasure_diff_measure) - from f_le_N[of "space M"] show "finite_measure N" "finite_measure (density M f)" - by (auto intro!: finite_measureI simp: emeasure_density top_unique cong: nn_integral_cong) - next - fix B assume "B \ sets N" with f_le_N[of B] show "emeasure (density M f) B \ emeasure N B" - by (auto simp: sets_eq emeasure_density cong: nn_integral_cong) - qed (auto simp: sets_eq emeasure_density) - from emeasure_M[of "space M"] N.finite_emeasure_space - interpret M': finite_measure ?M - by (auto intro!: finite_measureI simp: sets_eq_imp_space_eq[OF sets_eq] N.emeasure_eq_measure ) - have ac: "absolutely_continuous M ?M" unfolding absolutely_continuous_def - proof - fix A assume A_M: "A \ null_sets M" - with \absolutely_continuous M N\ have A_N: "A \ null_sets N" - unfolding absolutely_continuous_def by auto - moreover from A_M A_N have "(\\<^sup>+ x. ?F A x \M) \ N A" using \f \ G\ by (auto simp: G_def) - ultimately have "N A - (\\<^sup>+ x. ?F A x \M) = 0" - by (auto intro!: antisym) - then show "A \ null_sets ?M" - using A_M by (simp add: emeasure_M null_sets_def sets_eq) - qed - have upper_bound: "\A\sets M. ?M A \ 0" + have upper_bound: "\A\sets M. N A \ density M f A" proof (rule ccontr) assume "\ ?thesis" - then obtain A where A: "A \ sets M" and pos: "0 < ?M A" + then obtain A where A[measurable]: "A \ sets M" and f_less_N: "density M f A < N A" + by (auto simp: not_le) + then have pos_A: "0 < M A" + using \absolutely_continuous M N\[THEN absolutely_continuousD, OF A] by (auto simp: zero_less_iff_neq_zero) - note pos - also have "?M A \ ?M (space M)" - using emeasure_space[of ?M A] by (simp add: sets_eq[THEN sets_eq_imp_space_eq]) - finally have pos_t: "0 < ?M (space M)" by simp - moreover - from pos_t have "emeasure M (space M) \ 0" - using ac unfolding absolutely_continuous_def by (auto simp: null_sets_def) - then have pos_M: "0 < emeasure M (space M)" - by (simp add: zero_less_iff_neq_zero) - moreover - have "(\\<^sup>+x. f x * indicator (space M) x \M) \ N (space M)" - using \f \ G\ unfolding G_def by auto - hence "(\\<^sup>+x. f x * indicator (space M) x \M) \ \" - using M'.finite_emeasure_space by (auto simp: top_unique) + + define b where "b = (N A - density M f A) / M A / 2" + with f_less_N pos_A have "0 < b" "b \ top" + by (auto intro!: diff_gr0_ennreal simp: zero_less_iff_neq_zero diff_eq_0_iff_ennreal ennreal_divide_eq_top_iff) + + let ?f = "\x. f x + b" + have "nn_integral M f \ top" + using `f \ G`[THEN G_D, of "space M"] by (auto simp: top_unique cong: nn_integral_cong) + with \b \ top\ interpret Mf: finite_measure "density M ?f" + by (intro finite_measureI) + (auto simp: field_simps mult_indicator_subset ennreal_mult_eq_top_iff + emeasure_density nn_integral_cmult_indicator nn_integral_add + cong: nn_integral_cong) + + from unsigned_Hahn_decomposition[of "density M ?f" N A] + obtain Y where [measurable]: "Y \ sets M" and [simp]: "Y \ A" + and Y1: "\C. C \ sets M \ C \ Y \ density M ?f C \ N C" + and Y2: "\C. C \ sets M \ C \ A \ C \ Y = {} \ N C \ density M ?f C" + by auto + + let ?f' = "\x. f x + b * indicator Y x" + have "M Y \ 0" + proof + assume "M Y = 0" + then have "N Y = 0" + using \absolutely_continuous M N\[THEN absolutely_continuousD, of Y] by auto + then have "N A = N (A - Y)" + by (subst emeasure_Diff) auto + also have "\ \ density M ?f (A - Y)" + by (rule Y2) auto + also have "\ \ density M ?f A - density M ?f Y" + by (subst emeasure_Diff) auto + also have "\ \ density M ?f A - 0" + by (intro ennreal_minus_mono) auto + also have "density M ?f A = b * M A + density M f A" + by (simp add: emeasure_density field_simps mult_indicator_subset nn_integral_add nn_integral_cmult_indicator) + also have "\ < N A" + using f_less_N pos_A + by (cases "density M f A"; cases "M A"; cases "N A") + (auto simp: b_def ennreal_less_iff ennreal_minus divide_ennreal ennreal_numeral[symmetric] + ennreal_plus[symmetric] ennreal_mult[symmetric] field_simps + simp del: ennreal_numeral ennreal_plus) + finally show False + by simp + qed + then have "nn_integral M f < nn_integral M ?f'" + using \0 < b\ \nn_integral M f \ top\ + by (simp add: nn_integral_add nn_integral_cmult_indicator ennreal_zero_less_mult_iff zero_less_iff_neq_zero) moreover - define b where "b = ?M (space M) / emeasure M (space M) / 2" - ultimately have b: "b \ 0 \ b \ \" - by (auto simp: ennreal_divide_eq_top_iff) - then have b: "b \ 0" "0 < b" "b \ \" - by (auto simp: less_le) - let ?Mb = "density M (\_. b)" - have Mb: "finite_measure ?Mb" "sets ?Mb = sets ?M" - using b by (auto simp: emeasure_density_const sets_eq ennreal_mult_eq_top_iff intro!: finite_measureI) - from M'.Radon_Nikodym_aux[OF this] guess A0 .. - then have "A0 \ sets M" - and space_le_A0: "measure ?M (space M) - enn2real b * measure M (space M) \ measure ?M A0 - enn2real b * measure M A0" - and *: "\B. B \ sets M \ B \ A0 \ 0 \ measure ?M B - enn2real b * measure M B" - using b by (simp_all add: measure_density_const sets_eq_imp_space_eq[OF sets_eq] sets_eq) - { fix B assume B: "B \ sets M" "B \ A0" - with *[OF this] have "b * emeasure M B \ ?M B" - using b unfolding M'.emeasure_eq_measure emeasure_eq_measure - by (cases b rule: ennreal_cases) (auto simp: ennreal_mult[symmetric]) } - note bM_le_t = this - let ?f0 = "\x. f x + b * indicator A0 x" - { fix A assume A: "A \ sets M" - hence "A \ A0 \ sets M" using \A0 \ sets M\ by auto - have "(\\<^sup>+x. ?f0 x * indicator A x \M) = - (\\<^sup>+x. f x * indicator A x + b * indicator (A \ A0) x \M)" - by (auto intro!: nn_integral_cong split: split_indicator) - hence "(\\<^sup>+x. ?f0 x * indicator A x \M) = - (\\<^sup>+x. f x * indicator A x \M) + b * emeasure M (A \ A0)" - using \A0 \ sets M\ \A \ A0 \ sets M\ A b \f \ G\ - by (simp add: nn_integral_add nn_integral_cmult_indicator G_def) } - note f0_eq = this - { fix A assume A: "A \ sets M" - hence "A \ A0 \ sets M" using \A0 \ sets M\ by auto - have f_le_v: "(\\<^sup>+x. ?F A x \M) \ N A" using \f \ G\ A unfolding G_def by auto - note f0_eq[OF A] - also have "(\\<^sup>+x. ?F A x \M) + b * emeasure M (A \ A0) \ (\\<^sup>+x. ?F A x \M) + ?M (A \ A0)" - using bM_le_t[OF \A \ A0 \ sets M\] \A \ sets M\ \A0 \ sets M\ - by (auto intro!: add_left_mono) - also have "\ \ (\\<^sup>+x. f x * indicator A x \M) + ?M A" - using emeasure_mono[of "A \ A0" A ?M] \A \ sets M\ \A0 \ sets M\ - by (auto intro!: add_left_mono simp: sets_eq) - also have "\ \ N A" - unfolding emeasure_M[OF \A \ sets M\] - using f_le_v N.emeasure_eq_measure[of A] - by (cases "\\<^sup>+x. ?F A x \M" "N A" rule: ennreal2_cases) - (auto simp: top_unique ennreal_minus ennreal_plus[symmetric] simp del: ennreal_plus) - finally have "(\\<^sup>+x. ?f0 x * indicator A x \M) \ N A" . } - hence "?f0 \ G" using \A0 \ sets M\ b \f \ G\ by (auto simp: G_def) - have int_f_finite: "integral\<^sup>N M f \ \" - by (metis top_unique infinity_ennreal_def int_f_eq_y y_le N.emeasure_finite) - have pos: "0 < measure ?M (space M) - enn2real b * measure M (space M)" - using pos_t pos_M - by (simp add: M'.emeasure_eq_measure emeasure_eq_measure b_def divide_ennreal ennreal_divide_numeral) - also have "\ \ measure ?M A0 - enn2real b * measure M A0" - by (rule space_le_A0) - finally have "enn2real b * measure M A0 < measure ?M A0" - by simp - with b have "?M A0 \ 0" - by (cases b rule: ennreal_cases) - (auto simp: M'.emeasure_eq_measure mult_less_0_iff not_le[symmetric]) - then have "emeasure M A0 \ 0" - using ac \A0 \ sets M\ by (auto simp: absolutely_continuous_def null_sets_def) - then have "0 < emeasure M A0" - by (auto simp: zero_less_iff_neq_zero) - hence "0 < b * emeasure M A0" - using b by (auto simp: ennreal_zero_less_mult_iff) - with int_f_finite have "?y < integral\<^sup>N M f + b * emeasure M A0" - unfolding int_f_eq_y by auto - also have "\ = integral\<^sup>N M ?f0" - using f0_eq[OF sets.top] \A0 \ sets M\ sets.sets_into_space by (simp cong: nn_integral_cong) - finally have "?y < integral\<^sup>N M ?f0" - by simp - moreover have "integral\<^sup>N M ?f0 \ ?y" - using \?f0 \ G\ by (auto intro!: SUP_upper) - ultimately show False by auto + have "?f' \ G" + unfolding G_def + proof safe + fix X assume [measurable]: "X \ sets M" + have "(\\<^sup>+ x. ?f' x * indicator X x \M) = density M f (X - Y) + density M ?f (X \ Y)" + by (auto simp add: emeasure_density nn_integral_add[symmetric] split: split_indicator intro!: nn_integral_cong) + also have "\ \ N (X - Y) + N (X \ Y)" + using G_D[OF \f \ G\] by (intro add_mono Y1) (auto simp: emeasure_density) + also have "\ = N X" + by (subst plus_emeasure) (auto intro!: arg_cong2[where f=emeasure]) + finally show "(\\<^sup>+ x. ?f' x * indicator X x \M) \ N X" . + qed simp + then have "nn_integral M ?f' \ ?y" + by (rule SUP_upper) + ultimately show False + by (simp add: int_f_eq_y) qed show ?thesis - proof (intro bexI[of _ f] measure_eqI conjI) - show "sets (density M f) = sets N" - by (simp add: sets_eq) - fix A assume A: "A\sets (density M f)" - then show "emeasure (density M f) A = emeasure N A" - using \f \ G\ A upper_bound[THEN bspec, of A] N.emeasure_eq_measure[of A] - by (cases "integral\<^sup>N M (?F A)") - (auto intro!: antisym simp: emeasure_density G_def emeasure_M ennreal_minus_eq_0 top_unique - simp del: measure_nonneg) + proof (intro bexI[of _ f] measure_eqI conjI antisym) + fix A assume "A \ sets (density M f)" then show "emeasure (density M f) A \ emeasure N A" + by (auto simp: emeasure_density intro!: G_D[OF \f \ G\]) + next + fix A assume A: "A \ sets (density M f)" then show "emeasure N A \ emeasure (density M f) A" + using upper_bound by auto qed auto qed lemma (in finite_measure) split_space_into_finite_sets_and_rest: - assumes ac: "absolutely_continuous M N" and sets_eq: "sets N = sets M" - shows "\A0\sets M. \B::nat\'a set. disjoint_family B \ range B \ sets M \ A0 = space M - (\i. B i) \ - (\A\sets M. A \ A0 \ (emeasure M A = 0 \ N A = 0) \ (emeasure M A > 0 \ N A = \)) \ - (\i. N (B i) \ \)" + assumes ac: "absolutely_continuous M N" and sets_eq[simp]: "sets N = sets M" + shows "\B::nat\'a set. disjoint_family B \ range B \ sets M \ (\i. N (B i) \ \) \ + (\A\sets M. A \ (\i. B i) = {} \ (emeasure M A = 0 \ N A = 0) \ (emeasure M A > 0 \ N A = \))" proof - let ?Q = "{Q\sets M. N Q \ \}" let ?a = "SUP Q:?Q. emeasure M Q" @@ -542,13 +501,13 @@ show "range ?O \ sets M" using Q' by auto show "incseq ?O" by (fastforce intro!: incseq_SucI) qed - have Q'_sets: "\i. Q' i \ sets M" using Q' by auto + have Q'_sets[measurable]: "\i. Q' i \ sets M" using Q' by auto have O_sets: "\i. ?O i \ sets M" using Q' by auto then have O_in_G: "\i. ?O i \ ?Q" proof (safe del: notI) fix i have "Q' ` {..i} \ sets M" using Q' by auto then have "N (?O i) \ (\i\i. N (Q' i))" - by (simp add: sets_eq emeasure_subadditive_finite) + by (simp add: emeasure_subadditive_finite) also have "\ < \" using Q' by (simp add: less_top) finally show "N (?O i) \ \" by simp qed auto @@ -568,17 +527,18 @@ qed let ?O_0 = "(\i. ?O i)" have "?O_0 \ sets M" using Q' by auto - define Q where "Q i = (case i of 0 \ Q' 0 | Suc n \ ?O (Suc n) - ?O n)" for i - { fix i have "Q i \ sets M" unfolding Q_def using Q'[of 0] by (cases i) (auto intro: O_sets) } + have "disjointed Q' i \ sets M" for i + using sets.range_disjointed_sets[of Q' M] using Q'_sets by (auto simp: subset_eq) note Q_sets = this show ?thesis proof (intro bexI exI conjI ballI impI allI) - show "disjoint_family Q" - by (fastforce simp: disjoint_family_on_def Q_def - split: nat.split_asm) - show "range Q \ sets M" - using Q_sets by auto - { fix A assume A: "A \ sets M" "A \ space M - ?O_0" + show "disjoint_family (disjointed Q')" + by (rule disjoint_family_disjointed) + show "range (disjointed Q') \ sets M" + using Q'_sets by (intro sets.range_disjointed_sets) auto + { fix A assume A: "A \ sets M" "A \ (\i. disjointed Q' i) = {}" + then have A1: "A \ (\i. Q' i) = {}" + unfolding UN_disjointed_eq by auto show "emeasure M A = 0 \ N A = 0 \ 0 < emeasure M A \ N A = \" proof (rule disjCI, simp) assume *: "emeasure M A = 0 \ N A \ top" @@ -592,7 +552,7 @@ case False with * have "N A \ \" by auto with A have "emeasure M ?O_0 + emeasure M A = emeasure M (?O_0 \ A)" - using Q' by (auto intro!: plus_emeasure sets.countable_UN) + using Q' A1 by (auto intro!: plus_emeasure simp: set_eq_iff) also have "\ = (SUP i. emeasure M (?O i \ A))" proof (rule SUP_emeasure_incseq[of "\i. ?O i \ A", symmetric, simplified]) show "range (\i. ?O i \ A) \ sets M" @@ -604,7 +564,7 @@ proof (safe del: notI) show "?O i \ A \ sets M" using O_sets A by auto from O_in_G[of i] have "N (?O i \ A) \ N (?O i) + N A" - using emeasure_subadditive[of "?O i" N A] A O_sets by (auto simp: sets_eq) + using emeasure_subadditive[of "?O i" N A] A O_sets by auto with O_in_G[of i] show "N (?O i \ A) \ \" using \N A \ \\ by (auto simp: top_unique) qed @@ -615,30 +575,11 @@ with \emeasure M A \ 0\ show ?thesis by auto qed qed } - { fix i show "N (Q i) \ \" - proof (cases i) - case 0 then show ?thesis - unfolding Q_def using Q'[of 0] by simp - next - case (Suc n) - with \?O n \ ?Q\ \?O (Suc n) \ ?Q\ emeasure_Diff[OF _ _ _ O_mono, of N n] - show ?thesis - by (auto simp: sets_eq Q_def) - qed } - show "space M - ?O_0 \ sets M" using Q'_sets by auto - { fix j have "(\i\j. ?O i) = (\i\j. Q i)" - proof (induct j) - case 0 then show ?case by (simp add: Q_def) - next - case (Suc j) - have eq: "\j. (\i\j. ?O i) = (\i\j. Q' i)" by fastforce - have "{..j} \ {..Suc j} = {..Suc j}" by auto - then have "(\i\Suc j. Q' i) = (\i\j. Q' i) \ Q (Suc j)" - by (simp add: UN_Un[symmetric] Q_def del: UN_Un) - then show ?case using Suc by (auto simp add: eq atMost_Suc) - qed } - then have "(\j. (\i\j. ?O i)) = (\j. (\i\j. Q i))" by simp - then show "space M - ?O_0 = space M - (\i. Q i)" by fastforce + { fix i + have "N (disjointed Q' i) \ N (Q' i)" + by (auto intro!: emeasure_mono simp: disjointed_def) + then show "N (disjointed Q' i) \ \" + using Q'(2)[of i] by (auto simp: top_unique) } qed qed @@ -647,10 +588,9 @@ shows "\f\borel_measurable M. density M f = N" proof - from split_space_into_finite_sets_and_rest[OF assms] - obtain Q0 and Q :: "nat \ 'a set" + obtain Q :: "nat \ 'a set" where Q: "disjoint_family Q" "range Q \ sets M" - and Q0: "Q0 \ sets M" "Q0 = space M - (\i. Q i)" - and in_Q0: "\A. A \ sets M \ A \ Q0 \ emeasure M A = 0 \ N A = 0 \ 0 < emeasure M A \ N A = \" + and in_Q0: "\A. A \ sets M \ A \ (\i. Q i) = {} \ emeasure M A = 0 \ N A = 0 \ 0 < emeasure M A \ N A = \" and Q_fin: "\i. N (Q i) \ \" by force from Q have Q_sets: "\i. Q i \ sets M" by auto let ?N = "\i. density N (indicator (Q i))" and ?M = "\i. density M (indicator (Q i))" @@ -683,10 +623,10 @@ using A Q by (simp add: f_density emeasure_restricted subset_eq sets_eq) finally have "emeasure N (Q i \ A) = (\\<^sup>+x. f i x * indicator (Q i \ A) x \M)" .. } note integral_eq = this - let ?f = "\x. (\i. f i x * indicator (Q i) x) + \ * indicator Q0 x" + let ?f = "\x. (\i. f i x * indicator (Q i) x) + \ * indicator (space M - (\i. Q i)) x" show ?thesis proof (safe intro!: bexI[of _ ?f]) - show "?f \ borel_measurable M" using Q0 borel Q_sets + show "?f \ borel_measurable M" using borel Q_sets by (auto intro!: measurable_If) show "density M ?f = N" proof (rule measure_eqI) @@ -695,31 +635,31 @@ have Qi: "\i. Q i \ sets M" using Q by auto have [intro,simp]: "\i. (\x. f i x * indicator (Q i \ A) x) \ borel_measurable M" "\i. AE x in M. 0 \ f i x * indicator (Q i \ A) x" - using borel Qi Q0(1) \A \ sets M\ by auto - have "(\\<^sup>+x. ?f x * indicator A x \M) = (\\<^sup>+x. (\i. f i x * indicator (Q i \ A) x) + \ * indicator (Q0 \ A) x \M)" + using borel Qi \A \ sets M\ by auto + have "(\\<^sup>+x. ?f x * indicator A x \M) = (\\<^sup>+x. (\i. f i x * indicator (Q i \ A) x) + \ * indicator ((space M - (\i. Q i)) \ A) x \M)" using borel by (intro nn_integral_cong) (auto simp: indicator_def) - also have "\ = (\\<^sup>+x. (\i. f i x * indicator (Q i \ A) x) \M) + \ * emeasure M (Q0 \ A)" - using borel Qi Q0(1) \A \ sets M\ + also have "\ = (\\<^sup>+x. (\i. f i x * indicator (Q i \ A) x) \M) + \ * emeasure M ((space M - (\i. Q i)) \ A)" + using borel Qi \A \ sets M\ by (subst nn_integral_add) (auto simp add: nn_integral_cmult_indicator sets.Int intro!: suminf_0_le) - also have "\ = (\i. N (Q i \ A)) + \ * emeasure M (Q0 \ A)" + also have "\ = (\i. N (Q i \ A)) + \ * emeasure M ((space M - (\i. Q i)) \ A)" by (subst integral_eq[OF \A \ sets M\], subst nn_integral_suminf) auto - finally have "(\\<^sup>+x. ?f x * indicator A x \M) = (\i. N (Q i \ A)) + \ * emeasure M (Q0 \ A)" . + finally have "(\\<^sup>+x. ?f x * indicator A x \M) = (\i. N (Q i \ A)) + \ * emeasure M ((space M - (\i. Q i)) \ A)" . moreover have "(\i. N (Q i \ A)) = N ((\i. Q i) \ A)" using Q Q_sets \A \ sets M\ by (subst suminf_emeasure) (auto simp: disjoint_family_on_def sets_eq) - moreover have "\ * emeasure M (Q0 \ A) = N (Q0 \ A)" - proof - - have "Q0 \ A \ sets M" using Q0(1) \A \ sets M\ by blast - from in_Q0[OF this] show ?thesis by (auto simp: ennreal_top_mult) - qed - moreover have "Q0 \ A \ sets M" "((\i. Q i) \ A) \ sets M" - using Q_sets \A \ sets M\ Q0(1) by auto - moreover have "((\i. Q i) \ A) \ (Q0 \ A) = A" "((\i. Q i) \ A) \ (Q0 \ A) = {}" - using \A \ sets M\ sets.sets_into_space Q0 by auto + moreover + have "(space M - (\x. Q x)) \ A \ (\x. Q x) = {}" + by auto + then have "\ * emeasure M ((space M - (\i. Q i)) \ A) = N ((space M - (\i. Q i)) \ A)" + using in_Q0[of "(space M - (\i. Q i)) \ A"] \A \ sets M\ Q by (auto simp: ennreal_top_mult) + moreover have "(space M - (\i. Q i)) \ A \ sets M" "((\i. Q i) \ A) \ sets M" + using Q_sets \A \ sets M\ by auto + moreover have "((\i. Q i) \ A) \ ((space M - (\i. Q i)) \ A) = A" "((\i. Q i) \ A) \ ((space M - (\i. Q i)) \ A) = {}" + using \A \ sets M\ sets.sets_into_space by auto ultimately have "N A = (\\<^sup>+x. ?f x * indicator A x \M)" - using plus_emeasure[of "(\i. Q i) \ A" N "Q0 \ A"] by (simp add: sets_eq) - with \A \ sets M\ borel Q Q0(1) show "emeasure (density M ?f) A = N A" + using plus_emeasure[of "(\i. Q i) \ A" N "(space M - (\i. Q i)) \ A"] by (simp add: sets_eq) + with \A \ sets M\ borel Q show "emeasure (density M ?f) A = N A" by (auto simp: subset_eq emeasure_density) qed (simp add: sets_eq) qed @@ -816,15 +756,14 @@ have ac: "absolutely_continuous M (density M f)" "sets (density M f) = sets M" using borel by (auto intro!: absolutely_continuousI_density) from split_space_into_finite_sets_and_rest[OF this] - obtain Q0 and Q :: "nat \ 'a set" + obtain Q :: "nat \ 'a set" where Q: "disjoint_family Q" "range Q \ sets M" - and Q0: "Q0 \ sets M" "Q0 = space M - (\i. Q i)" - and in_Q0: "\A. A \ sets M \ A \ Q0 \ emeasure M A = 0 \ ?D f A = 0 \ 0 < emeasure M A \ ?D f A = \" + and in_Q0: "\A. A \ sets M \ A \ (\i. Q i) = {} \ emeasure M A = 0 \ ?D f A = 0 \ 0 < emeasure M A \ ?D f A = \" and Q_fin: "\i. ?D f (Q i) \ \" by force - with borel pos have in_Q0: "\A. A \ sets M \ A \ Q0 \ emeasure M A = 0 \ ?N A = 0 \ 0 < emeasure M A \ ?N A = \" + with borel pos have in_Q0: "\A. A \ sets M \ A \ (\i. Q i) = {} \ emeasure M A = 0 \ ?N A = 0 \ 0 < emeasure M A \ ?N A = \" and Q_fin: "\i. ?N (Q i) \ \" by (auto simp: emeasure_density subset_eq) - from Q have Q_sets: "\i. Q i \ sets M" by auto + from Q have Q_sets[measurable]: "\i. Q i \ sets M" by auto let ?D = "{x\space M. f x \ f' x}" have "?D \ sets M" using borel by auto have *: "\i x A. \y::ennreal. y * indicator (Q i) x * indicator A x = y * indicator (Q i \ A) x" @@ -832,15 +771,15 @@ have "\i. AE x in M. ?f (Q i) x = ?f' (Q i) x" using borel Q_fin Q pos by (intro finite_density_unique[THEN iffD1] allI) (auto intro!: f measure_eqI simp: emeasure_density * subset_eq) - moreover have "AE x in M. ?f Q0 x = ?f' Q0 x" + moreover have "AE x in M. ?f (space M - (\i. Q i)) x = ?f' (space M - (\i. Q i)) x" proof (rule AE_I') { fix f :: "'a \ ennreal" assume borel: "f \ borel_measurable M" and eq: "\A. A \ sets M \ ?N A = (\\<^sup>+x. f x * indicator A x \M)" - let ?A = "\i. Q0 \ {x \ space M. f x < (i::nat)}" + let ?A = "\i. (space M - (\i. Q i)) \ {x \ space M. f x < (i::nat)}" have "(\i. ?A i) \ null_sets M" proof (rule null_sets_UN) fix i ::nat have "?A i \ sets M" - using borel Q0(1) by auto + using borel by auto have "?N (?A i) \ (\\<^sup>+x. (i::ennreal) * indicator (?A i) x \M)" unfolding eq[OF \?A i \ sets M\] by (auto intro!: nn_integral_mono simp: indicator_def) @@ -850,21 +789,21 @@ finally have "?N (?A i) \ \" by simp then show "?A i \ null_sets M" using in_Q0[OF \?A i \ sets M\] \?A i \ sets M\ by auto qed - also have "(\i. ?A i) = Q0 \ {x\space M. f x \ \}" + also have "(\i. ?A i) = (space M - (\i. Q i)) \ {x\space M. f x \ \}" by (auto simp: ennreal_Ex_less_of_nat less_top[symmetric]) - finally have "Q0 \ {x\space M. f x \ \} \ null_sets M" by simp } + finally have "(space M - (\i. Q i)) \ {x\space M. f x \ \} \ null_sets M" by simp } from this[OF borel(1) refl] this[OF borel(2) f] - have "Q0 \ {x\space M. f x \ \} \ null_sets M" "Q0 \ {x\space M. f' x \ \} \ null_sets M" by simp_all - then show "(Q0 \ {x\space M. f x \ \}) \ (Q0 \ {x\space M. f' x \ \}) \ null_sets M" by (rule null_sets.Un) - show "{x \ space M. ?f Q0 x \ ?f' Q0 x} \ - (Q0 \ {x\space M. f x \ \}) \ (Q0 \ {x\space M. f' x \ \})" by (auto simp: indicator_def) + have "(space M - (\i. Q i)) \ {x\space M. f x \ \} \ null_sets M" "(space M - (\i. Q i)) \ {x\space M. f' x \ \} \ null_sets M" by simp_all + then show "((space M - (\i. Q i)) \ {x\space M. f x \ \}) \ ((space M - (\i. Q i)) \ {x\space M. f' x \ \}) \ null_sets M" by (rule null_sets.Un) + show "{x \ space M. ?f (space M - (\i. Q i)) x \ ?f' (space M - (\i. Q i)) x} \ + ((space M - (\i. Q i)) \ {x\space M. f x \ \}) \ ((space M - (\i. Q i)) \ {x\space M. f' x \ \})" by (auto simp: indicator_def) qed - moreover have "AE x in M. (?f Q0 x = ?f' Q0 x) \ (\i. ?f (Q i) x = ?f' (Q i) x) \ + moreover have "AE x in M. (?f (space M - (\i. Q i)) x = ?f' (space M - (\i. Q i)) x) \ (\i. ?f (Q i) x = ?f' (Q i) x) \ ?f (space M) x = ?f' (space M) x" - by (auto simp: indicator_def Q0) + by (auto simp: indicator_def) ultimately have "AE x in M. ?f (space M) x = ?f' (space M) x" unfolding AE_all_countable[symmetric] - by eventually_elim (auto intro!: AE_I2 split: if_split_asm simp: indicator_def) + by eventually_elim (auto split: if_split_asm simp: indicator_def) then show "AE x in M. f x = f' x" by auto qed