@@ -115,6 +115,14 @@ Definition dep_uncurry (A : Type) (B : A -> Type) (C : Type) :
115115 (forall a : A, B a -> C) -> {a : A & B a} -> C :=
116116 fun f p => let (a, Ba) := p in f a Ba.
117117
118+ (* TODO: move *)
119+ Lemma measurable_natmul {R : realType} D n :
120+ measurable_fun D ((@GRing.natmul R)^~ n).
121+ Proof .
122+ under eq_fun do rewrite -mulr_natr.
123+ by do 2 apply: measurable_funM => //.
124+ Qed .
125+
118126Section bernoulli_pmf.
119127Context {R : realType} (p : R).
120128Local Open Scope ring_scope.
@@ -136,6 +144,12 @@ Qed.
136144
137145End bernoulli_pmf.
138146
147+ Lemma measurable_bernoulli_pmf {R : realType} D n :
148+ measurable_fun D (@bernoulli_pmf R ^~ n).
149+ Proof .
150+ by apply/measurable_funTS/measurable_fun_if => //=; exact: measurable_funB.
151+ Qed .
152+
139153Definition bernoulli {R : realType} (p : R) : set bool -> \bar R := fun A =>
140154 if (0 <= p <= 1)%R then \sum_(b \in A) (bernoulli_pmf p b)%:E else \d_false A.
141155
@@ -243,33 +257,18 @@ Proof.
243257apply: (@measurability _ _ _ _ _ _
244258 (@pset _ _ _ : set (set (pprobability _ R)))) => //.
245259move=> _ -[_ [r r01] [Ys mYs <-]] <-; apply: emeasurable_fun_infty_o => //=.
246- rewrite /bernoulli; have := @subsetT _ Ys; rewrite setT_bool => UT.
247- have [->|->|->|->] /= := subset_set2 UT.
248- - rewrite [X in measurable_fun _ X](_ : _ = cst 0%E)//.
249- by apply/funext => x/=; case: ifPn => // _; rewrite fsbig_set0.
250- - rewrite [X in measurable_fun _ X](_ : _ =
251- (fun x => if 0 <= x <= 1 then x%:E else 0%E))//.
252- apply: measurable_fun_ifT => //=; apply: measurable_and => //;
253- apply: (measurable_fun_bool true) => //=.
254- rewrite (_ : _ @^-1` _ = `[0, +oo[%classic)//.
255- by apply/seteqP; split => [x|x] /=; rewrite in_itv/= andbT.
256- by rewrite (_ : _ @^-1` _ = `]-oo, 1]%classic).
257- apply/funext => x/=; case: ifPn => /= x01.
258- by rewrite fsbig_set1//= lee_fin; case/andP : x01.
259- by rewrite diracE memNset//.
260- - rewrite [X in measurable_fun _ X](_ : _ =
261- (fun x => if 0 <= x <= 1 then (`1-x)%:E else 1%E))//.
262- apply: measurable_fun_ifT => //=.
263- apply: measurable_and => //; apply: (measurable_fun_bool true) => //=.
264- rewrite (_ : _ @^-1` _ = `[0, +oo[%classic)//.
265- by apply/seteqP; split => [x|x] /=; rewrite in_itv/= andbT.
266- by rewrite (_ : _ @^-1` _ = `]-oo, 1]%classic).
267- exact/EFin_measurable_fun/measurable_funB.
268- apply/funext => x/=; case: ifPn => /= x01.
269- by rewrite fsbig_set1//= lee_fin subr_ge0; case/andP : x01.
270- by rewrite diracE mem_set.
271- - rewrite [X in measurable_fun _ X](_ : _ = cst 1%E)//; apply/funext => x/=.
272- by rewrite -setT_bool diracT; case: ifPn => // x01; rewrite bernoulli_pmf1.
260+ apply: measurable_fun_if => //=.
261+ apply: measurable_and => //; apply: (measurable_fun_bool true) => //=.
262+ rewrite (_ : _ @^-1` _ = `[0, +oo[%classic)//.
263+ by apply/seteqP; split => [x|x] /=; rewrite in_itv/= andbT.
264+ by rewrite (_ : _ @^-1` _ = `]-oo, 1]%classic).
265+ apply: (eq_measurable_fun (fun t =>
266+ \sum_(b <- fset_set Ys) (bernoulli_pmf t b)%:E)).
267+ move=> x /set_mem[_/= x01].
268+ by rewrite fsbig_finite//=.
269+ apply: emeasurable_fun_sum => n.
270+ move=> k Ysk; apply/measurableT_comp => //.
271+ exact: measurable_bernoulli_pmf.
273272Qed .
274273
275274Lemma measurable_bernoulli2 U : measurable U ->
@@ -296,6 +295,15 @@ Qed.
296295
297296End binomial_pmf.
298297
298+ Lemma measurable_binomial_pmf {R : realType} D n k :
299+ measurable_fun D (@binomial_pmf R n ^~ k).
300+ Proof .
301+ apply: (@measurableT_comp _ _ _ _ _ _ (fun x : R => x *+ 'C(n, k))%R) => /=.
302+ exact: measurable_natmul.
303+ apply: measurable_funM => //=; apply: measurable_fun_pow.
304+ exact: measurable_funB.
305+ Qed .
306+
299307Definition binomial_prob {R : realType} (n : nat) (p : R) : set nat -> \bar R :=
300308 fun U => if (0 <= p <= 1)%R then
301309 \esum_(k in U) (binomial_pmf n p k)%:E else \d_O U.
@@ -432,9 +440,6 @@ rewrite addeC -ge0_sume_distrl.
432440 by apply/mulrn_wge0/mulr_ge0; apply/exprn_ge0 => //; exact/onem_ge0.
433441Qed .
434442
435- Lemma sumbool_ler {R : realDomainType} (x y : R) : (x <= y)%R + (x > y)%R.
436- Proof . by have [_|_] := leP x y; [exact: inl|exact: inr]. Qed .
437-
438443Section binomial_total.
439444Local Open Scope ring_scope.
440445Variables (R : realType) (n : nat).
@@ -448,48 +453,20 @@ apply: (@measurability _ _ _ _ _ _
448453move=> _ -[_ [r r01] [Ys mYs <-]] <-; apply: emeasurable_fun_infty_o => //=.
449454rewrite /binomial_prob/=.
450455set f := (X in measurable_fun _ X).
451- rewrite (_ : f = fun x => if 0 <= x <= 1 then (\sum_(m < n.+1)
452- if sumbool_ler 0 x is inl l0p then
453- if sumbool_ler x 1 is inl lp1 then
454- mscale (@bin_prob _ n _ l0p lp1 m) (\d_(nat_of_ord m)) Ys
455- else
456- (x ^+ m * `1-x ^+ (n - m) *+ 'C(n, m))%:E * \d_(nat_of_ord m) Ys
457- else (x ^+ m * `1-x ^+ (n - m) *+ 'C(n, m))%:E * \d_(nat_of_ord m) Ys)%E
458- else \d_0%N Ys)//.
459- apply: measurable_fun_ifT => //=.
460- apply: measurable_and => //; apply: (measurable_fun_bool true) => //=.
461- rewrite (_ : _ @^-1` _ = `[0, +oo[%classic)//.
462- by apply/seteqP; split => [x|x] /=; rewrite in_itv/= andbT.
463- by rewrite (_ : _ @^-1` _ = `]-oo, 1]%classic).
464- apply: emeasurable_fun_sum => m /=.
465- rewrite /mscale/= [X in measurable_fun _ X](_ : _ = (fun x =>
466- (x ^+ m * `1-x ^+ (n - m) *+ 'C(n, m))%:E * \d_(nat_of_ord m) Ys)%E); last first.
467- by apply:funext => x; case: sumbool_ler => // x0; case: sumbool_ler.
468- apply: emeasurable_funM => //; apply/EFin_measurable_fun => //.
469- under eq_fun do rewrite -mulr_natr.
470- do 2 apply: measurable_funM => //.
471- exact/measurable_fun_pow/measurable_funB.
472- rewrite {}/f; apply/funext => x.
473- case: ifPn => // /andP[x0 x1].
474- rewrite (esumID `I_n.+1)//; last first.
475- by move=> k _; rewrite lee_fin// binomial_pmf_ge0// x0.
476- rewrite [X in (_ + X)%E]esum1 ?adde0; last first.
477- by move=> k [_ /= /negP]; rewrite -leqNgt => nk; rewrite /binomial_pmf bin_small.
478- rewrite esum_mkcondl esum_fset//=; last first.
479- move=> k; rewrite inE/= ltnS => kn.
480- by case: ifPn => // _; rewrite lee_fin binomial_pmf_ge0// x0.
481- rewrite -fsbig_ord//=; apply: eq_bigr => i _.
482- case: ifPn => iYs.
483- case: sumbool_ler => //= x0'.
484- case: sumbool_ler => //= x1'.
485- by rewrite /mscale/= /binomial_pmf diracE iYs mule1.
486- by move: x1'; rewrite ltNge x1.
487- by move: x0'; rewrite ltNge x0.
488- case: sumbool_ler => //= x0'.
489- case: sumbool_ler => //= x1'.
490- by rewrite /mscale/= /binomial_pmf diracE (negbTE iYs) mule0.
491- by move: x1'; rewrite ltNge x1.
492- by move: x0'; rewrite ltNge x0.
456+ apply: measurable_fun_if => //=.
457+ apply: measurable_and => //; apply: (measurable_fun_bool true) => //=.
458+ rewrite (_ : _ @^-1` _ = `[0, +oo[%classic)//.
459+ by apply/seteqP; split => [x|x] /=; rewrite in_itv/= andbT.
460+ by rewrite (_ : _ @^-1` _ = `]-oo, 1]%classic).
461+ apply: (eq_measurable_fun (fun t =>
462+ \sum_(k <oo | k \in Ys) (binomial_pmf n t k)%:E)).
463+ move=> x /set_mem[_/= x01].
464+ rewrite nneseries_esum// -1?[in RHS](set_mem_set Ys)// => k kYs.
465+ by rewrite lee_fin binomial_pmf_ge0.
466+ apply: ge0_emeasurable_fun_sum.
467+ by move=> k x/= [_ x01] _; rewrite lee_fin binomial_pmf_ge0.
468+ move=> k Ysk; apply/measurableT_comp => //.
469+ exact: measurable_binomial_pmf.
493470Qed .
494471
495472End binomial_total.
@@ -1998,9 +1975,9 @@ Context d d' d1 d2 d3 (X : measurableType d) (Y : measurableType d')
19981975 (R : realType).
19991976Import Notations.
20001977Variables (t : R.-sfker X ~> T1)
2001- (u : R.-sfker [the measurableType _ of (X * T1)%type] ~> T2)
2002- (v : R.-sfker [the measurableType _ of (X * T2)%type] ~> Y)
2003- (v' : R.-sfker [the measurableType _ of (X * T1 * T2)%type] ~> Y)
1978+ (u : R.-sfker (X * T1) ~> T2)
1979+ (v : R.-sfker (X * T2) ~> Y)
1980+ (v' : R.-sfker (X * T1 * T2) ~> Y)
20041981 (vv' : forall y, v =1 fun xz => v' (xz.1, y, xz.2)).
20051982
20061983Lemma letinA x A : measurable A ->
0 commit comments