# HG changeset patch # User Andreas Lochbihler # Date 1423676314 -3600 # Node ID af02440afb4a35899e86260e4a9f9da4b335c982 # Parent dfe6449aecd8a918ee00d229ea8c9c8c2b7be594 generalise lemma diff -r dfe6449aecd8 -r af02440afb4a src/HOL/Probability/Probability_Mass_Function.thy --- a/src/HOL/Probability/Probability_Mass_Function.thy Wed Feb 11 15:22:37 2015 +0100 +++ b/src/HOL/Probability/Probability_Mass_Function.thy Wed Feb 11 18:38:34 2015 +0100 @@ -1078,29 +1078,32 @@ qed lemma bind_cond_pmf_cancel: - assumes in_S: "\x. x \ set_pmf p \ x \ S x" + assumes in_S: "\x. x \ set_pmf p \ x \ S x" "\x. x \ set_pmf q \ x \ S x" assumes S_eq: "\x y. x \ S y \ S x = S y" - shows "bind_pmf p (\x. cond_pmf p (S x)) = p" + and same: "\x. measure (measure_pmf p) (S x) = measure (measure_pmf q) (S x)" + shows "bind_pmf p (\x. cond_pmf q (S x)) = q" (is "?lhs = _") proof (rule pmf_eqI) - have [simp]: "\x. x \ p \ p \ (S x) \ {}" - using in_S by auto + { fix x + assume "x \ set_pmf p" + hence "set_pmf p \ (S x) \ {}" using in_S by auto + hence "measure (measure_pmf p) (S x) \ 0" + by(auto simp add: measure_pmf.prob_eq_0 AE_measure_pmf_iff) + with same have "measure (measure_pmf q) (S x) \ 0" by simp + hence "set_pmf q \ S x \ {}" + by(auto simp add: measure_pmf.prob_eq_0 AE_measure_pmf_iff) } + note [simp] = this + fix z - have pmf_le: "pmf p z \ measure p (S z)" - proof cases - assume "z \ p" from in_S[OF this] show ?thesis - by (auto intro!: measure_pmf.finite_measure_mono simp: pmf.rep_eq) - qed (simp add: set_pmf_iff measure_nonneg) + have pmf_q_z: "z \ S z \ pmf q z = 0" + by(erule contrapos_np)(simp add: pmf_eq_0_set_pmf in_S) - have "ereal (pmf (bind_pmf p (\x. cond_pmf p (S x))) z) = - (\\<^sup>+ x. ereal (pmf p z / measure p (S z)) * indicator (S z) x \p)" - by (subst ereal_pmf_bind) - (auto intro!: nn_integral_cong_AE dest!: S_eq split: split_indicator - simp: AE_measure_pmf_iff pmf_cond pmf_eq_0_set_pmf in_S) - also have "\ = pmf p z" - using pmf_le pmf_nonneg[of p z] - by (subst nn_integral_cmult) (simp_all add: measure_nonneg measure_pmf.emeasure_eq_measure) - finally show "pmf (bind_pmf p (\x. cond_pmf p (S x))) z = pmf p z" - by simp + have "ereal (pmf ?lhs z) = \\<^sup>+ x. ereal (pmf (cond_pmf q (S x)) z) \measure_pmf p" + by(simp add: ereal_pmf_bind) + also have "\ = \\<^sup>+ x. ereal (pmf q z / measure p (S z)) * indicator (S z) x \measure_pmf p" + by(rule nn_integral_cong_AE)(auto simp add: AE_measure_pmf_iff pmf_cond same pmf_q_z in_S dest!: S_eq split: split_indicator) + also have "\ = pmf q z" using pmf_nonneg[of q z] + by (subst nn_integral_cmult)(auto simp add: measure_nonneg measure_pmf.emeasure_eq_measure same measure_pmf.prob_eq_0 AE_measure_pmf_iff pmf_eq_0_set_pmf in_S) + finally show "pmf ?lhs z = pmf q z" by simp qed inductive rel_pmf :: "('a \ 'b \ bool) \ 'a pmf \ 'b pmf \ bool"