From 920563a298842ca0d29e5d0bfddb77027998d963 Mon Sep 17 00:00:00 2001 From: Yosuke-Ito-345 Date: Tue, 20 Jan 2026 21:39:34 +0900 Subject: [PATCH 1/4] pmf measurable --- CHANGELOG_UNRELEASED.md | 4 ++ classical/classical_sets.v | 5 +++ theories/probability.v | 81 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 86 insertions(+), 4 deletions(-) diff --git a/CHANGELOG_UNRELEASED.md b/CHANGELOG_UNRELEASED.md index e62586ff8f..404ca0e0d1 100644 --- a/CHANGELOG_UNRELEASED.md +++ b/CHANGELOG_UNRELEASED.md @@ -5,6 +5,8 @@ ### Added - in order_topology.v + lemma `itv_closed_ends_closed` +- in classical_sets.v + + lemma `in_set1_eq` - in set_interval.v + definitions `itv_is_closed_unbounded`, `itv_is_cc`, `itv_closed_ends` @@ -15,6 +17,8 @@ - in `Rstruct_topology.v`: + lemma `RlnE` +- in probability.v + + lemmas `pmf_positive_countable`, `pmf_measurable` ### Changed - in set_interval.v diff --git a/classical/classical_sets.v b/classical/classical_sets.v index ca0c4392c3..99c60f144f 100644 --- a/classical/classical_sets.v +++ b/classical/classical_sets.v @@ -422,6 +422,11 @@ Lemma nat_nonempty : [set: nat] !=set0. Proof. by exists 1%N. Qed. #[global] Hint Resolve nat_nonempty : core. +Lemma in_set1_eq {T : eqType} (a : T) (x : T) : x \in [set a] = (x == a). +Proof. +by apply/(sameP _ idP)/(equivP idP); rewrite inE eq_opE. +Qed. + Lemma itv_sub_in2 d (T : porderType d) (P : T -> T -> Prop) (i j : interval T) : [set` j] `<=` [set` i] -> {in i &, forall x y, P x y} -> {in j &, forall x y, P x y}. diff --git a/theories/probability.v b/theories/probability.v index add6f3e5f8..00502dc618 100644 --- a/theories/probability.v +++ b/theories/probability.v @@ -1072,6 +1072,80 @@ Qed. End distribution_dRV. +Definition pmf d (T : measurableType d) (R : realType) (P : probability T R) + (X : {RV P >-> R}) (r : R) : R := fine (P (X @^-1` [set r])). + +Section pmf_measurable. +Local Open Scope ereal_scope. +Context d (T : measurableType d) (R : realType) + (P : probability T R) (X : {RV P >-> R}). + +Lemma pmf_positive_countable : countable [set r | (0 < pmf X r)%R]. +Proof. +have ->: [set r | 0 < (pmf X r)%:E] = + \bigcup_n [set r | (n.+1%:R^-1 < pmf X r)%R]. + rewrite seteqP; split => [r /ltr_add_invr [l] | r [k] _]; last exact: lt_trans. + by rewrite add0r => lpmf; exists l. +apply: bigcup_countable => // n _. +apply: finite_set_countable; apply: contrapT => /infiniteP/pcard_leP/injfunPex. +case=> q q_fun q_inj /=. +have pre1 k : measurable (X @^-1` [set q k]). + by apply: measurable_funPTI; exact: measurable_set1. +rewrite -falseE -(ltxx (1:R)%:E). +apply: (@lt_le_trans _ _ (P (\bigcup_k X @^-1` [set q k]))); + last by apply/probability_le1/bigcup_measurable => k _. +have <-: \big[+%R/0%R]_(0 <= k //=. + move: (trivIset_comp (fun r => X @^-1` [set r]) q_inj); rewrite /comp => ->. + exact: trivIset_preimage1. +apply: (@lt_le_trans _ _ + (\sum_(0 <= k < n.+1 | k \in setT) P (X @^-1` [set q k]))); + last exact: nneseries_lim_ge. +rewrite (eq_bigl xpredT) => [| ?]; last by rewrite in_setT. +under eq_bigr => k _ do + rewrite -(@fineK _ (P _)) ?fin_num_measure// -/(pmf X (q k)). +have ->: 1%R = (\sum_(0 <= k < n.+1) n.+1%:R^-1:R)%R + by rewrite sumr_const_nat subn0 -(mulr_natr _^-1) mulVf. +by rewrite !sumEFin lte_fin; apply: ltr_sum => // k _; exact: q_fun. +Qed. + +Lemma pmf_measurable : measurable_fun setT (pmf X). +Proof. +have : countable [set r | (0 < pmf X r)%R] by exact pmf_positive_countable. +case/countable_bijP => S. +rewrite card_eq_sym; case/pcard_eqP/bijPex => /= h h_bij. +apply/measurable_EFinP. +pose sfun r := + \big[+%R/0%R]_(0 <= k [r _|]. + case: (pselect ([set h k | k in S] r)) => [rS | nrS]. + - pose kr := (pinv S h r). + have neqh k : in_set S k && (k != kr) -> r != h k. + move/andP=>[Sk]; apply: contra_neq. + by rewrite /kr => ->; rewrite pinvKV//; exact: (set_bij_inj h_bij). + rewrite /sfun (@nneseriesD1 _ _ kr)//; last by rewrite in_setE; apply: invS. + rewrite eseries0 => [| k k_ge0 /(neqh _)/negPf]. + by rewrite indicE in_set1_eq pinvK ?in_setE// eq_refl mulr1 addr0. + by rewrite indicE in_set1_eq => ->; rewrite mulr0. + - rewrite /sfun eseries0 => [|k k_ge0 Sk]/=. + apply: le_anti; rewrite pmf_ge0 lee_fin leNgt. + apply/negP/contra_not/nrS. + by rewrite (surj_image_eq _ (set_bij_surj h_bij))//; exact: set_bij_sub. + rewrite indicE in_set1_eq. + have ->: (r == h k) = false; rewrite ?mulr0// -eq_opE eqbF_neg; apply/negP. + apply/contra_not/nrS; rewrite eq_opE => ->. + by exists k; rewrite -?(in_setE S k). +apply: ge0_emeasurable_sum => //= k _. +apply/measurable_EFinP/measurable_funM; + [exact: measurable_cst | exact/measurable_indicP]. +Qed. + +End pmf_measurable. + Section discrete_distribution. Local Open Scope ereal_scope. Context d (T : measurableType d) (R : realType) (P : probability T R). @@ -1122,11 +1196,10 @@ apply: eq_eseriesr => k _; case: ifPn => kX. by rewrite integral_set0 mule0 /enum_prob patchE (negbTE kX) mul0e. Qed. -Definition pmf (X : {RV P >-> R}) (r : R) : R := fine (P (X @^-1` [set r])). - Lemma expectation_pmf (X : {dRV P >-> R}) : - P.-integrable [set: T] (EFin \o X) -> 'E_P[X] = - \sum_(n + 'E_P[X] = \sum_(n iX; rewrite dRV_expectation// [in RHS]eseries_mkcond. apply: eq_eseriesr => k _. From 4514bb2b28fe1f7ebcb66d7c5d76eedf1d486689 Mon Sep 17 00:00:00 2001 From: Yosuke-Ito-345 Date: Tue, 27 Jan 2026 20:47:01 +0900 Subject: [PATCH 2/4] fix proof --- theories/probability.v | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/theories/probability.v b/theories/probability.v index 00502dc618..87aeb7d6df 100644 --- a/theories/probability.v +++ b/theories/probability.v @@ -1080,11 +1080,11 @@ Local Open Scope ereal_scope. Context d (T : measurableType d) (R : realType) (P : probability T R) (X : {RV P >-> R}). -Lemma pmf_positive_countable : countable [set r | (0 < pmf X r)%R]. +Lemma pmf_gt0_countable : countable [set r | (0 < pmf X r)%R]. Proof. have ->: [set r | 0 < (pmf X r)%:E] = \bigcup_n [set r | (n.+1%:R^-1 < pmf X r)%R]. - rewrite seteqP; split => [r /ltr_add_invr [l] | r [k] _]; last exact: lt_trans. + apply/seteqP; split => [r /ltr_add_invr [l] | r [k] _]; last exact: lt_trans. by rewrite add0r => lpmf; exists l. apply: bigcup_countable => // n _. apply: finite_set_countable; apply: contrapT => /infiniteP/pcard_leP/injfunPex. @@ -1096,8 +1096,7 @@ apply: (@lt_le_trans _ _ (P (\bigcup_k X @^-1` [set q k]))); last by apply/probability_le1/bigcup_measurable => k _. have <-: \big[+%R/0%R]_(0 <= k //=. - move: (trivIset_comp (fun r => X @^-1` [set r]) q_inj); rewrite /comp => ->. + rewrite measure_bigcup// (trivIset_comp (fun r => X@^-1` [set r]))//. exact: trivIset_preimage1. apply: (@lt_le_trans _ _ (\sum_(0 <= k < n.+1 | k \in setT) P (X @^-1` [set q k]))); @@ -1112,7 +1111,7 @@ Qed. Lemma pmf_measurable : measurable_fun setT (pmf X). Proof. -have : countable [set r | (0 < pmf X r)%R] by exact pmf_positive_countable. +have : countable [set r | (0 < pmf X r)%R] by exact pmf_gt0_countable. case/countable_bijP => S. rewrite card_eq_sym; case/pcard_eqP/bijPex => /= h h_bij. apply/measurable_EFinP. @@ -1122,9 +1121,9 @@ have pmf_ge0 s : 0 <= (pmf X s)%:E by rewrite fineK ?fin_num_measure. have pmf1_ge0 k s : 0%R <= (pmf X (h k) * \1_[set h k] s)%:E. by rewrite EFinM; apply: mule_ge0. apply: (eq_measurable_fun sfun) => [r _|]. - case: (pselect ([set h k | k in S] r)) => [rS | nrS]. + case/asboolP: ([set h k | k in S] r) => [rS | nrS]. - pose kr := (pinv S h r). - have neqh k : in_set S k && (k != kr) -> r != h k. + have neqh k : (k \in S) && (k != kr) -> r != h k. move/andP=>[Sk]; apply: contra_neq. by rewrite /kr => ->; rewrite pinvKV//; exact: (set_bij_inj h_bij). rewrite /sfun (@nneseriesD1 _ _ kr)//; last by rewrite in_setE; apply: invS. @@ -1136,9 +1135,8 @@ apply: (eq_measurable_fun sfun) => [r _|]. apply/negP/contra_not/nrS. by rewrite (surj_image_eq _ (set_bij_surj h_bij))//; exact: set_bij_sub. rewrite indicE in_set1_eq. - have ->: (r == h k) = false; rewrite ?mulr0// -eq_opE eqbF_neg; apply/negP. - apply/contra_not/nrS; rewrite eq_opE => ->. - by exists k; rewrite -?(in_setE S k). + suff ->: (r == h k) = false by rewrite mulr0. + by apply/eqP/contra_not/nrS => ->; exists k => //; rewrite -(in_setE S k). apply: ge0_emeasurable_sum => //= k _. apply/measurable_EFinP/measurable_funM; [exact: measurable_cst | exact/measurable_indicP]. From ea36eec3170017a345919ccf71fae407521703e9 Mon Sep 17 00:00:00 2001 From: Yosuke-Ito-345 Date: Tue, 27 Jan 2026 20:49:30 +0900 Subject: [PATCH 3/4] modify changelog --- CHANGELOG_UNRELEASED.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG_UNRELEASED.md b/CHANGELOG_UNRELEASED.md index 404ca0e0d1..c2e12fb6c0 100644 --- a/CHANGELOG_UNRELEASED.md +++ b/CHANGELOG_UNRELEASED.md @@ -18,7 +18,7 @@ - in `Rstruct_topology.v`: + lemma `RlnE` - in probability.v - + lemmas `pmf_positive_countable`, `pmf_measurable` + + lemmas `pmf_gt0_countable`, `pmf_measurable` ### Changed - in set_interval.v From ae461337ac51c70f0ed6e83fef1b2978d6886c0d Mon Sep 17 00:00:00 2001 From: Reynald Affeldt Date: Mon, 9 Feb 2026 00:11:07 +0900 Subject: [PATCH 4/4] linting --- CHANGELOG_UNRELEASED.md | 1 + theories/probability.v | 117 +++++++++++++++++++--------------------- 2 files changed, 56 insertions(+), 62 deletions(-) diff --git a/CHANGELOG_UNRELEASED.md b/CHANGELOG_UNRELEASED.md index c2e12fb6c0..b0e9807301 100644 --- a/CHANGELOG_UNRELEASED.md +++ b/CHANGELOG_UNRELEASED.md @@ -18,6 +18,7 @@ - in `Rstruct_topology.v`: + lemma `RlnE` - in probability.v + + lemma `pmf_ge0` + lemmas `pmf_gt0_countable`, `pmf_measurable` ### Changed diff --git a/theories/probability.v b/theories/probability.v index 87aeb7d6df..1b0aae7ad9 100644 --- a/theories/probability.v +++ b/theories/probability.v @@ -1072,74 +1072,67 @@ Qed. End distribution_dRV. -Definition pmf d (T : measurableType d) (R : realType) (P : probability T R) - (X : {RV P >-> R}) (r : R) : R := fine (P (X @^-1` [set r])). +Section pmf_definition. +Context {d} {T : measurableType d} {R : realType}. +Variables (P : probability T R). + +Definition pmf (X : {RV P >-> R}) (r : R) : R := fine (P (X @^-1` [set r])). + +Lemma pmf_ge0 (X : {RV P >-> R}) (r : R) : 0 <= pmf X r. +Proof. by rewrite fine_ge0. Qed. + +End pmf_definition. Section pmf_measurable. Local Open Scope ereal_scope. Context d (T : measurableType d) (R : realType) (P : probability T R) (X : {RV P >-> R}). -Lemma pmf_gt0_countable : countable [set r | (0 < pmf X r)%R]. -Proof. -have ->: [set r | 0 < (pmf X r)%:E] = - \bigcup_n [set r | (n.+1%:R^-1 < pmf X r)%R]. - apply/seteqP; split => [r /ltr_add_invr [l] | r [k] _]; last exact: lt_trans. - by rewrite add0r => lpmf; exists l. -apply: bigcup_countable => // n _. -apply: finite_set_countable; apply: contrapT => /infiniteP/pcard_leP/injfunPex. -case=> q q_fun q_inj /=. -have pre1 k : measurable (X @^-1` [set q k]). - by apply: measurable_funPTI; exact: measurable_set1. -rewrite -falseE -(ltxx (1:R)%:E). -apply: (@lt_le_trans _ _ (P (\bigcup_k X @^-1` [set q k]))); - last by apply/probability_le1/bigcup_measurable => k _. -have <-: \big[+%R/0%R]_(0 <= k X@^-1` [set r]))//. +Lemma pmf_gt0_countable : countable [set r | 0 < pmf X r]%R. +Proof. +rewrite [X in countable X](_ : _ = + \bigcup_n [set r | n.+1%:R^-1 < pmf X r]%R); last first. + by apply/seteqP; split=> [r/= /ltr_add_invr[k /[!add0r] kXr]|r/= [k _]]; + [exists k|exact: lt_trans]. +apply: bigcup_countable => // n _; apply: finite_set_countable. +apply: contrapT => /infiniteP/pcard_leP/injfunPex[/= q q_fun q_inj]. +have /(probability_le1 P) : measurable (\bigcup_k X @^-1` [set q k]). + by apply: bigcup_measurable => k _; exact: measurable_funPTI. +rewrite leNgt => /negP; apply. +rewrite [ltRHS](_ : _ = \sum_(0 <= k // i; rewrite in_setT. + rewrite (trivIset_comp (fun r => X@^-1` [set r]))//. exact: trivIset_preimage1. -apply: (@lt_le_trans _ _ - (\sum_(0 <= k < n.+1 | k \in setT) P (X @^-1` [set q k]))); - last exact: nneseries_lim_ge. -rewrite (eq_bigl xpredT) => [| ?]; last by rewrite in_setT. -under eq_bigr => k _ do - rewrite -(@fineK _ (P _)) ?fin_num_measure// -/(pmf X (q k)). -have ->: 1%R = (\sum_(0 <= k < n.+1) n.+1%:R^-1:R)%R - by rewrite sumr_const_nat subn0 -(mulr_natr _^-1) mulVf. -by rewrite !sumEFin lte_fin; apply: ltr_sum => // k _; exact: q_fun. -Qed. - -Lemma pmf_measurable : measurable_fun setT (pmf X). -Proof. -have : countable [set r | (0 < pmf X r)%R] by exact pmf_gt0_countable. -case/countable_bijP => S. -rewrite card_eq_sym; case/pcard_eqP/bijPex => /= h h_bij. -apply/measurable_EFinP. -pose sfun r := - \big[+%R/0%R]_(0 <= k [r _|]. - case/asboolP: ([set h k | k in S] r) => [rS | nrS]. - - pose kr := (pinv S h r). - have neqh k : (k \in S) && (k != kr) -> r != h k. - move/andP=>[Sk]; apply: contra_neq. - by rewrite /kr => ->; rewrite pinvKV//; exact: (set_bij_inj h_bij). - rewrite /sfun (@nneseriesD1 _ _ kr)//; last by rewrite in_setE; apply: invS. - rewrite eseries0 => [| k k_ge0 /(neqh _)/negPf]. - by rewrite indicE in_set1_eq pinvK ?in_setE// eq_refl mulr1 addr0. - by rewrite indicE in_set1_eq => ->; rewrite mulr0. - - rewrite /sfun eseries0 => [|k k_ge0 Sk]/=. - apply: le_anti; rewrite pmf_ge0 lee_fin leNgt. - apply/negP/contra_not/nrS. - by rewrite (surj_image_eq _ (set_bij_surj h_bij))//; exact: set_bij_sub. - rewrite indicE in_set1_eq. - suff ->: (r == h k) = false by rewrite mulr0. - by apply/eqP/contra_not/nrS => ->; exists k => //; rewrite -(in_setE S k). -apply: ge0_emeasurable_sum => //= k _. -apply/measurable_EFinP/measurable_funM; - [exact: measurable_cst | exact/measurable_indicP]. +apply: (lt_le_trans _ (nneseries_lim_ge n.+1 _)) => //. +rewrite -EFin_sum_fine//; last by move=> ? _; rewrite fin_num_measure. +under eq_bigr do rewrite -/(pmf X (q _)). +rewrite lte_fin (_ : 1%R = (\sum_(0 <= k < n.+1) n.+1%:R^-1:R)%R); last first. + by rewrite sumr_const_nat subn0 -[RHS]mulr_natr mulVf. +by apply: ltr_sum => // k _; exact: q_fun. +Qed. + +Lemma pmf_measurable : measurable_fun [set: R] (pmf X). +Proof. +have /countable_bijP[S] := pmf_gt0_countable. +rewrite card_eq_sym => /pcard_eqP/bijPex[/= h h_bij]. +have pmf1_ge0 k s : 0 <= (pmf X (h k) * \1_[set h k] s)%:E. + by rewrite EFinM mule_ge0// lee_fin pmf_ge0. +pose sfun r := \sum_(0 <= k [r _|]; last first. + by apply: ge0_emeasurable_sum => // *; exact/measurable_EFinP/measurable_funM. +have [rS|nrS] := boolP (r \in [set h k | k in S]). +- pose kr := pinv S h r. + have neqh k : k \in S /\ k != kr -> r != h k. + move=> [Sk]; apply: contra_neq. + by rewrite /kr => ->; rewrite pinvKV//; exact: (set_bij_inj h_bij). + rewrite /sfun (@nneseriesD1 _ _ kr)//; last by rewrite inE; exact/invS/set_mem. + by rewrite eseries0 => [| k k_ge0 /andP/neqh]; rewrite indicE in_set1_eq; + [rewrite pinvK// eqxx mulr1 addr0|move/negPf => ->; rewrite mulr0]. +- rewrite /sfun eseries0 => [|k k_ge0 Sk]/=. + apply: le_anti; rewrite !lee_fin pmf_ge0/= leNgt; apply: contraNN nrS. + by rewrite (surj_image_eq _ (set_bij_surj h_bij)) ?inE//; exact:set_bij_sub. + rewrite indicE in_set1_eq (_ : (r == h k) = false) ?mulr0//. + by apply: contraNF nrS => /eqP ->; exact/image_f. Qed. End pmf_measurable. @@ -1197,7 +1190,7 @@ Qed. Lemma expectation_pmf (X : {dRV P >-> R}) : P.-integrable [set: T] (EFin \o X) -> 'E_P[X] = \sum_(n iX; rewrite dRV_expectation// [in RHS]eseries_mkcond. apply: eq_eseriesr => k _.