Skip to content

Commit 666855b

Browse files
affeldt-aisthoheinzollernCohenCyrilproux01t6s
authored
Merge pull request #1607 from affeldt-aist/measurable_realfun_20250501
Co-authored-by: Alessandro Bruni <[email protected]> Co-authored-by: Cyril Cohen <[email protected]> Co-authored-by: Pierre Roux <[email protected]> Co-authored-by: Takafumi Saikawa <[email protected]>
2 parents a976c02 + c2ec895 commit 666855b

File tree

5 files changed

+149
-45
lines changed

5 files changed

+149
-45
lines changed

CHANGELOG_UNRELEASED.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@
5959
- in `constructive_ereal.v`:
6060
+ lemmas `expe_ge0`, `expe_eq0`, `expe_gt0`
6161

62+
- in `ereal.v`:
63+
+ lemmas `ereal_sup_cst`, `ereal_inf_cst`,
64+
`ereal_sup_pZl`, `ereal_supZl`, `ereal_inf_pZl`, `ereal_infZl`
65+
66+
- in `sequences.v`:
67+
+ lemmas `ereal_inf_seq`, `ereal_sup_seq`
68+
6269
### Changed
6370

6471
- in `pi_irrational`:

theories/ereal.v

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,60 @@ Arguments ereal_inf_ltP {R S x}.
684684
Arguments ereal_sup_geP {R S x}.
685685
Arguments ereal_inf_leP {R S x}.
686686

687+
Section ereal_sup_cst.
688+
Context {R : realFieldType}.
689+
Implicit Types (x : \bar R) (X : set (\bar R)).
690+
Local Open Scope ereal_scope.
691+
692+
Lemma ereal_sup_cst T x (A : set T) : A != set0 -> ereal_sup (cst x @` A) = x.
693+
Proof. by move=> AN0; rewrite set_cst ifN// ereal_sup1. Qed.
694+
695+
Lemma ereal_inf_cst T x (A : set T) : A != set0 -> ereal_inf (cst x @` A) = x.
696+
Proof. by move=> AN0; rewrite set_cst ifN// ereal_inf1. Qed.
697+
698+
End ereal_sup_cst.
699+
700+
Section ereal_supZ.
701+
Context {R : realType}.
702+
Implicit Types (r s : R) (X : set (\bar R)).
703+
Local Open Scope ereal_scope.
704+
705+
Lemma ereal_sup_pZl X r : (0 < r)%R ->
706+
ereal_sup [set r%:E * x | x in X] = r%:E * ereal_sup X.
707+
Proof.
708+
move=> /[dup] r_gt0; rewrite lt0r => /andP[r_neq0 r_ge0].
709+
gen have gen : r r_gt0 {r_ge0 r_neq0} X /
710+
ereal_sup [set r%:E * x | x in X] <= r%:E * ereal_sup X.
711+
apply/ereal_supP => y/= [x Ax <-]; rewrite lee_pmul2l//=.
712+
by apply/ereal_supP => //=; exists x.
713+
apply/eqP; rewrite eq_le gen//= -lee_pdivlMl//.
714+
rewrite (le_trans _ (gen _ _ _)) ?invr_gt0 ?image_comp//=.
715+
by under eq_imagel do rewrite /= muleA -EFinM mulVf ?mul1e//=; rewrite image_id.
716+
Qed.
717+
718+
Lemma ereal_supZl X r : X != set0 -> (0 <= r)%R ->
719+
ereal_sup [set r%:E * x | x in X] = r%:E * ereal_sup X.
720+
Proof.
721+
move=> AN0; have [r_gt0|//|<-] := ltgtP => _; first by rewrite ereal_sup_pZl.
722+
by rewrite mul0e; under eq_imagel do rewrite mul0e/=; rewrite ereal_sup_cst.
723+
Qed.
724+
725+
Lemma ereal_inf_pZl X r : (0 < r)%R ->
726+
ereal_inf [set r%:E * x | x in X] = r%:E * ereal_inf X.
727+
Proof.
728+
move=> r_gt0; rewrite !ereal_infEN muleN image_comp/=; congr (- _).
729+
by under eq_imagel do rewrite /= -muleN; rewrite -image_comp ereal_sup_pZl.
730+
Qed.
731+
732+
Lemma ereal_infZl X r : X != set0 -> (0 < r)%R ->
733+
ereal_sup [set r%:E * x | x in X] = r%:E * ereal_sup X.
734+
Proof.
735+
move=> XN0 r_gt0; rewrite !ereal_supEN muleN image_comp/=; congr (- _).
736+
by under eq_imagel do rewrite /= -muleN; rewrite -image_comp ereal_inf_pZl.
737+
Qed.
738+
739+
End ereal_supZ.
740+
687741
Lemma restrict_abse T (R : numDomainType) (f : T -> \bar R) (D : set T) :
688742
(abse \o f) \_ D = abse \o (f \_ D).
689743
Proof.

theories/measurable_realfun.v

Lines changed: 43 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1540,7 +1540,7 @@ Lemma outer_measure_open_itv_cover A : (l^* A)%mu =
15401540
ereal_inf [set \sum_(k <oo) l (F k) | F in open_itv_cover A].
15411541
Proof.
15421542
apply/eqP; rewrite eq_le; apply/andP; split.
1543-
- apply: le_ereal_inf => _ /= [F [Fitv AF <-]].
1543+
apply: le_ereal_inf => _ /= [F [Fitv AF <-]].
15441544
exists (fun i => `](sval (cid (Fitv i))).1, (sval (cid (Fitv i))).2]%classic).
15451545
+ split=> [i|].
15461546
* have [?|?] := ltP (sval (cid (Fitv i))).1 (sval (cid (Fitv i))).2.
@@ -1552,56 +1552,55 @@ apply/eqP; rewrite eq_le; apply/andP; split.
15521552
+ apply: eq_eseriesr => k _; rewrite /l wlength_itv/=.
15531553
case: (Fitv k) => /= -[a b]/= Fkab.
15541554
by case: cid => /= -[x1 x2] ->; rewrite wlength_itv.
1555-
- have [/lb_ereal_inf_adherent lA|] :=
1556-
boolP ((l^* A)%mu \is a fin_num); last first.
1557-
rewrite ge0_fin_numE ?outer_measure_ge0// -leNgt leye_eq => /eqP ->.
1558-
exact: leey.
1559-
apply/lee_addgt0Pr => /= e e0.
1560-
have : (0 < e / 2)%R by rewrite divr_gt0.
1561-
move=> /lA[_ [/= F [mF AF]] <-]; rewrite -/((l^* A)%mu) => lFe.
1562-
have Fcover n : exists2 B, F n `<=` B &
1563-
is_open_itv B /\ l B <= l (F n) + (e / 2 ^+ n.+2)%:E.
1564-
have [[a b] _ /= abFn] := mF n.
1565-
exists `]a, b + e / 2^+n.+2[%classic.
1566-
rewrite -abFn => x/= /[!in_itv] /andP[->/=] /le_lt_trans; apply.
1567-
by rewrite ltrDl divr_gt0.
1568-
split; first by exists (a, b + e / 2^+n.+2).
1569-
have [ab|ba] := ltP a b.
1570-
rewrite /l -abFn !wlength_itv//= !lte_fin ifT.
1571-
by rewrite ab -!EFinD lee_fin addrAC.
1572-
by rewrite ltr_wpDr// divr_ge0// ltW.
1573-
rewrite -abFn [in leRHS]set_itv_ge ?bnd_simp -?leNgt// /l wlength0 add0r.
1574-
rewrite wlength_itv//=; case: ifPn => [abe|_]; last first.
1575-
by rewrite lee_fin divr_ge0// ltW.
1576-
by rewrite -EFinD addrAC lee_fin -[leRHS]add0r lerD2r subr_le0.
1577-
pose G := fun n => sval (cid2 (Fcover n)).
1578-
have FG n : F n `<=` G n by rewrite /G; case: cid2.
1579-
have Gitv n : is_open_itv (G n) by rewrite /G; case: cid2 => ? ? [].
1580-
have lGFe n : l (G n) <= l (F n) + (e / 2 ^+ n.+2)%:E.
1581-
by rewrite /G; case: cid2 => ? ? [].
1582-
have AG : A `<=` \bigcup_k G k.
1583-
by apply: (subset_trans AF) => [/= r [n _ /FG Gnr]]; exists n.
1584-
apply: (@le_trans _ _ (\sum_(0 <= k <oo) (l (F k) + (e / 2 ^+ k.+2)%:E))).
1585-
apply: (@le_trans _ _ (\sum_(0 <= k <oo) l (G k))).
1586-
by apply: ereal_inf_lbound => /=; exists G.
1587-
exact: lee_nneseries.
1588-
rewrite nneseriesD//; last first.
1589-
by move=> i _; rewrite lee_fin// divr_ge0// ltW.
1590-
rewrite [in leRHS](splitr e) EFinD addeA leeD//; first exact/ltW.
1591-
have := @cvg_geometric_eseries_half R e 1; rewrite expr1.
1592-
rewrite [X in eseries X](_ : _ = (fun k => (e / (2 ^+ (k.+2))%:R)%:E)); last first.
1593-
by apply/funext => n; rewrite addn2 natrX.
1594-
move/cvg_lim => <-//; apply: lee_nneseries => //.
1595-
- by move=> n _; rewrite lee_fin divr_ge0// ltW.
1596-
- by move=> n _; rewrite lee_fin -natrX.
1555+
have [/lb_ereal_inf_adherent lA|] :=
1556+
boolP ((l^* A)%mu \is a fin_num); last first.
1557+
rewrite ge0_fin_numE ?outer_measure_ge0// -leNgt leye_eq => /eqP ->.
1558+
exact: leey.
1559+
apply/lee_addgt0Pr => /= e e0.
1560+
have : (0 < e / 2)%R by rewrite divr_gt0.
1561+
move=> /lA[_ [/= F [mF AF]] <-]; rewrite -/((l^* A)%mu) => lFe.
1562+
have Fcover n : exists2 B, F n `<=` B &
1563+
is_open_itv B /\ l B <= l (F n) + (e / 2 ^+ n.+2)%:E.
1564+
have [[a b] _ /= abFn] := mF n.
1565+
exists `]a, b + e / 2^+n.+2[%classic.
1566+
rewrite -abFn => x/= /[!in_itv] /andP[->/=] /le_lt_trans; apply.
1567+
by rewrite ltrDl divr_gt0.
1568+
split; first by exists (a, b + e / 2^+n.+2).
1569+
have [ab|ba] := ltP a b.
1570+
rewrite /l -abFn !wlength_itv//= !lte_fin ifT.
1571+
by rewrite ab -!EFinD lee_fin addrAC.
1572+
by rewrite ltr_wpDr// divr_ge0// ltW.
1573+
rewrite -abFn [in leRHS]set_itv_ge ?bnd_simp -?leNgt// /l wlength0 add0r.
1574+
rewrite wlength_itv//=; case: ifPn => [abe|_]; last first.
1575+
by rewrite lee_fin divr_ge0// ltW.
1576+
by rewrite -EFinD addrAC lee_fin -[leRHS]add0r lerD2r subr_le0.
1577+
pose G := fun n => sval (cid2 (Fcover n)).
1578+
have FG n : F n `<=` G n by rewrite /G; case: cid2.
1579+
have Gitv n : is_open_itv (G n) by rewrite /G; case: cid2 => ? ? [].
1580+
have lGFe n : l (G n) <= l (F n) + (e / 2 ^+ n.+2)%:E.
1581+
by rewrite /G; case: cid2 => ? ? [].
1582+
have AG : A `<=` \bigcup_k G k.
1583+
by apply: (subset_trans AF) => [/= r [n _ /FG Gnr]]; exists n.
1584+
apply: (@le_trans _ _ (\sum_(0 <= k <oo) (l (F k) + (e / 2 ^+ k.+2)%:E))).
1585+
apply: (@le_trans _ _ (\sum_(0 <= k <oo) l (G k))).
1586+
by apply: ereal_inf_lbound => /=; exists G.
1587+
exact: lee_nneseries.
1588+
rewrite nneseriesD//; last first.
1589+
by move=> i _; rewrite lee_fin// divr_ge0// ltW.
1590+
rewrite [in leRHS](splitr e) EFinD addeA leeD//; first exact/ltW.
1591+
have := @cvg_geometric_eseries_half R e 1; rewrite expr1.
1592+
rewrite [X in eseries X](_ : _ = (fun k => (e / (2 ^+ (k.+2))%:R)%:E)); last first.
1593+
by apply/funext => n; rewrite addn2 natrX.
1594+
move/cvg_lim => <-//; apply: lee_nneseries => //.
1595+
- by move=> n _; rewrite lee_fin divr_ge0// ltW.
1596+
- by move=> n _; rewrite lee_fin -natrX.
15971597
Qed.
15981598

15991599
End open_itv_cover.
16001600

16011601
Section egorov.
16021602
Context d {R : realType} {T : measurableType d}.
16031603
Context (mu : {measure set T -> \bar R}).
1604-
16051604
Local Open Scope ereal_scope.
16061605

16071606
(*TODO : this generalizes to any metric space with a borel measure*)

theories/normedtype_theory/ereal_normedtype.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ Lemma limf_esup_ge0 f F : ~ F set0 ->
8888
Proof.
8989
move=> F0 f0; rewrite limf_esupE; apply: lb_ereal_inf => /= x [A].
9090
have [-> /F0//|/set0P[y Ay FA] <-{x}] := eqVneq A set0.
91-
by apply: ereal_sup_le; exists (f y).
91+
by apply: ereal_sup_ge; exists (f y).
9292
Qed.
9393

9494
End limf_esup_einf_realType.

theories/sequences.v

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,6 +1286,50 @@ Unshelve. all: by end_near. Qed.
12861286

12871287
(** Sequences of extended real numbers *)
12881288

1289+
Section ereal_inf_sup_seq.
1290+
Context {R : realType}.
1291+
Implicit Types (S : set (\bar R)).
1292+
Local Open Scope ereal_scope.
1293+
1294+
Lemma ereal_inf_seq S : S != set0 ->
1295+
{u : (\bar R)^nat | forall i, S (u i) & u @ \oo --> ereal_inf S}.
1296+
Proof.
1297+
move=> SN0; apply/cid2; have [|Ninfy] := eqVneq (ereal_inf S) +oo.
1298+
move=> /[dup]/ereal_inf_pinfty/subset_set1/orW[/eqP/negPn/[!SN0]//|->] ->.
1299+
by exists (fun=> +oo) => //; apply: cvg_cst.
1300+
suff: exists2 v : (\bar R)^nat, v @ \oo --> ereal_inf S &
1301+
forall n, exists2 x : \bar R, x \in S & x < v n.
1302+
move=> [v vcvg] /(_ _)/sig2W-/all_sig/= [u /all_and2[/(_ _)/set_mem Su u_lt]].
1303+
exists u => //; move: vcvg.
1304+
have: cst (ereal_inf S) @ \oo --> ereal_inf S by exact: cvg_cst.
1305+
apply: squeeze_cvge; apply: nearW => n; rewrite /cst/=.
1306+
by rewrite ereal_inf_le /= 1?ltW; last by exists (u n).
1307+
have [infNy|NinfNy] := eqVneq (ereal_inf S) -oo.
1308+
exists [sequence - (n%:R%:E)]_n => /=; last first.
1309+
by move=> n; setoid_rewrite set_mem_set; apply: lb_ereal_infNy_adherent.
1310+
rewrite infNy; apply/cvgNey; under eq_cvg do rewrite EFinN oppeK.
1311+
exact/cvgeryP/cvgr_idn.
1312+
have inf_fin : ereal_inf S \is a fin_num by case: ereal_inf Ninfy NinfNy.
1313+
exists [sequence ereal_inf S + n.+1%:R^-1%:E]_n => /=; last first.
1314+
by move=> n; setoid_rewrite set_mem_set; exact: lb_ereal_inf_adherent.
1315+
apply/sube_cvg0 => //=; apply/cvg_abse0P.
1316+
rewrite (@eq_cvg _ _ _ _ (fun n => n.+1%:R^-1%:E)).
1317+
exact: cvge_harmonic.
1318+
by move=> n /=; rewrite /= addrAC subee// add0e gee0_abs.
1319+
Unshelve. all: by end_near. Qed.
1320+
1321+
Lemma ereal_sup_seq S : S != set0 ->
1322+
{u : nat -> \bar R | forall i, S (u i) & u @ \oo --> ereal_sup S}.
1323+
Proof.
1324+
move=> SN0; have NSN0 : [set - x | x in S] != set0.
1325+
by have /set0P[x Sx] := SN0; apply/set0P; exists (- x), x.
1326+
have [u /= Nxu] := ereal_inf_seq NSN0.
1327+
rewrite ereal_infN => /cvgeN; rewrite oppeK => Nu_to_sup.
1328+
by exists (\- u) => // i; have [? ? <-] := Nxu i; rewrite oppeK.
1329+
Qed.
1330+
1331+
End ereal_inf_sup_seq.
1332+
12891333
Notation "\big [ op / idx ]_ ( m <= i <oo | P ) F" :=
12901334
(limn (fun n => (\big[ op / idx ]_(m <= i < n | P) F))) : big_scope.
12911335
Notation "\big [ op / idx ]_ ( m <= i <oo ) F" :=

0 commit comments

Comments
 (0)