Skip to content

Commit 7a7988f

Browse files
committed
pointwise birkhoff theorem
1 parent 160dbc2 commit 7a7988f

13 files changed

Lines changed: 370 additions & 72 deletions

File tree

Mathlib/Analysis/BoxIntegral/Basic.lean

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -655,11 +655,11 @@ theorem integrable_of_bounded_and_ae_continuousWithinAt [CompleteSpace E] {I : B
655655
centered at x is ≤ ε₁ -/
656656
have comp : IsCompact (Box.Icc I \ U) :=
657657
I.isCompact_Icc.of_isClosed_subset (I.isCompact_Icc.isClosed.sdiff Uopen) Set.diff_subset
658-
have : ∀ x ∈ (Box.Icc I \ U), oscillationWithin f (Box.Icc I) x < (ENNReal.ofReal ε₁) := by
658+
have : ∀ x ∈ (Box.Icc I \ U), oscillationWithinAt f (Box.Icc I) x < (ENNReal.ofReal ε₁) := by
659659
intro x hx
660-
suffices oscillationWithin f (Box.Icc I) x = 0 by rw [this]; exact ofReal_pos.2 ε₁0
661-
simpa [OscillationWithin.eq_zero_iff_continuousWithinAt, D, hx.1] using hx.2 ∘ (fun a ↦ UD a)
662-
rcases comp.uniform_oscillationWithin this with ⟨r, r0, hr⟩
660+
suffices oscillationWithinAt f (Box.Icc I) x = 0 by rw [this]; exact ofReal_pos.2 ε₁0
661+
simpa [OscillationWithinAt.eq_zero_iff_continuousWithinAt, D, hx.1] using hx.2 ∘ (fun a ↦ UD a)
662+
rcases comp.uniform_oscillationWithinAt this with ⟨r, r0, hr⟩
663663
/- We prove the claim for partitions π₁ and π₂ subordinate to r/2, by writing the difference as
664664
an integralSum over π₁ ⊓ π₂ and considering separately the boxes of π₁ ⊓ π₂ which are/aren't
665665
fully contained within U. -/

Mathlib/Analysis/InnerProductSpace/MeanErgodic.lean

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,18 @@ see `ContinuousLinearMap.tendsto_birkhoffAverage_orthogonalProjection`.
2323

2424
public section
2525

26-
open Filter Finset Function Bornology
26+
namespace Module.End
27+
28+
variable {R M F : Type*} [Semiring R] [AddCommGroup M] [Module R M]
29+
[FunLike F M M] [One F] [LinearMapClass F R M M]
30+
31+
abbrev fixedPoints (f : F) : Submodule R M := LinearMap.eqLocus f 1
32+
33+
abbrev coboundaries (f : F) : Submodule R M := (f - 1 : M →ₗ[R] M).range
34+
35+
end Module.End
36+
37+
open Filter Set Function Bornology Module
2738
open scoped Topology
2839

2940
variable {𝕜 E : Type*} [RCLike 𝕜] [NormedAddCommGroup E]
@@ -45,9 +56,9 @@ I chose to do it in order to isolate parts of the proof that do not rely
4556
on the inner product space structure.
4657
-/
4758
theorem LinearMap.tendsto_birkhoffAverage_of_ker_subset_closure [NormedSpace 𝕜 E]
48-
(f : E →ₗ[𝕜] E) (hf : LipschitzWith 1 f) (g : E →L[𝕜] LinearMap.eqLocus f 1)
49-
(hg_proj : ∀ x : LinearMap.eqLocus f 1, g x = x)
50-
(hg_ker : (g.ker : Set E) ⊆ closure (LinearMap.range (f - 1))) (x : E) :
59+
(f : E →ₗ[𝕜] E) (hf : LipschitzWith 1 f) (g : E →L[𝕜] End.fixedPoints f)
60+
(hg_proj : ∀ x : End.fixedPoints f, g x = x)
61+
(hg_ker : g.ker ≤ (End.coboundaries f).topologicalClosure) (x : E) :
5162
Tendsto (birkhoffAverage 𝕜 f _root_.id · x) atTop (𝓝 (g x)) := by
5263
/- Any point can be represented as a sum of `y ∈ LinearMap.ker g` and a fixed point `z`. -/
5364
obtain ⟨y, hy, z, hz, rfl⟩ : ∃ y, g y = 0 ∧ ∃ z, IsFixedPt f z ∧ x = y + z :=
@@ -59,7 +70,7 @@ theorem LinearMap.tendsto_birkhoffAverage_of_ker_subset_closure [NormedSpace
5970
simpa [hy, hgz, birkhoffAverage, birkhoffSum, Finset.sum_add_distrib, smul_add]
6071
using this.add (hz.tendsto_birkhoffAverage 𝕜 _root_.id)
6172
/- By continuity, it suffices to prove the theorem on a dense subset of `LinearMap.ker g`.
62-
By assumption, `LinearMap.range (f - 1)` is dense in the kernel of `g`,
73+
By assumption, `f.coboundaries` is dense in the kernel of `g`,
6374
so it suffices to prove the theorem for `y = f x - x`. -/
6475
have : IsClosed {x | Tendsto (birkhoffAverage 𝕜 f _root_.id · x) atTop (𝓝 0)} :=
6576
isClosed_setOf_tendsto_birkhoffAverage 𝕜 hf uniformContinuous_id continuous_const
@@ -78,6 +89,31 @@ variable [InnerProductSpace 𝕜 E] [CompleteSpace E]
7889

7990
local notation "⟪" x ", " y "⟫" => inner 𝕜 x y
8091

92+
open Submodule
93+
94+
/-- The closure of the coboundaries of the form `f x - x` contains the orthogonal complement of the
95+
fixed points of `f`.
96+
-/
97+
theorem eqLocus_orthogonal_le_topologicalClosure_coboundary (f : E →L[𝕜] E) (hf : ‖f‖ ≤ 1) :
98+
(End.fixedPoints f)ᗮ ≤ (End.coboundaries f).topologicalClosure := by
99+
/- In other words, we need to verify that any vector that is orthogonal to the range of `f - 1`
100+
is a fixed point of `f`. -/
101+
rw [← Submodule.orthogonal_orthogonal_eq_closure]
102+
/- To verify this, we verify `‖f x‖ ≤ ‖x‖` (because `‖f‖ ≤ 1`) and `⟪f x, x⟫ = ‖x‖²`. -/
103+
refine Submodule.orthogonal_le fun x hx ↦ eq_of_norm_le_re_inner_eq_norm_sq (𝕜 := 𝕜) ?_ ?_
104+
· simpa using f.le_of_opNorm_le hf x
105+
· have : ∀ y, ⟪f y, x⟫ = ⟪y, x⟫ := by
106+
simpa [Submodule.mem_orthogonal, inner_sub_left, sub_eq_zero] using hx
107+
simp [this]
108+
109+
theorem topologicalClosure_eqLocus_sum_coboundary_eq_top (f : E →L[𝕜] E) (hf : ‖f‖ ≤ 1) :
110+
(End.fixedPoints f + End.coboundaries f).topologicalClosure = ⊤ := by
111+
have h := sup_orthogonal_of_hasOrthogonalProjection (K := End.fixedPoints f)
112+
rw [eq_top_iff] at *
113+
grw [eqLocus_orthogonal_le_topologicalClosure_coboundary f hf,
114+
ClosureOperator.sup_closure_le _ (LinearMap.eqLocus f 1)] at h
115+
assumption
116+
81117
set_option backward.isDefEq.respectTransparency false in
82118
/-- **Von Neumann Mean Ergodic Theorem** for an operator in a Hilbert space.
83119
For a contracting continuous linear self-map `f : E →L[𝕜] E` of a Hilbert space, `‖f‖ ≤ 1`,
@@ -89,20 +125,12 @@ converge to the orthogonal projection of `x` to the subspace of fixed points of
89125
theorem ContinuousLinearMap.tendsto_birkhoffAverage_orthogonalProjection (f : E →L[𝕜] E)
90126
(hf : ‖f‖ ≤ 1) (x : E) :
91127
Tendsto (birkhoffAverage 𝕜 f _root_.id · x) atTop
92-
(𝓝 <| (LinearMap.eqLocus f 1).orthogonalProjection x) := by
128+
(𝓝 <| (End.fixedPoints f).orthogonalProjection x) := by
93129
/- Due to the previous theorem, it suffices to verify
94130
that the range of `f - 1` is dense in the orthogonal complement
95131
to the submodule of fixed points of `f`. -/
96-
apply (f : E →ₗ[𝕜] E).tendsto_birkhoffAverage_of_ker_subset_closure (f.lipschitz.weaken hf)
132+
apply f.tendsto_birkhoffAverage_of_ker_subset_closure (f.lipschitz.weaken hf)
97133
· exact (LinearMap.eqLocus f 1).orthogonalProjection_mem_subspace_eq_self
98134
· clear x
99-
/- In other words, we need to verify that any vector that is orthogonal to the range of `f - 1`
100-
is a fixed point of `f`. -/
101-
rw [Submodule.ker_orthogonalProjection, ← Submodule.topologicalClosure_coe,
102-
SetLike.coe_subset_coe, ← Submodule.orthogonal_orthogonal_eq_closure]
103-
/- To verify this, we verify `‖f x‖ ≤ ‖x‖` (because `‖f‖ ≤ 1`) and `⟪f x, x⟫ = ‖x‖²`. -/
104-
refine Submodule.orthogonal_le fun x hx ↦ eq_of_norm_le_re_inner_eq_norm_sq (𝕜 := 𝕜) ?_ ?_
105-
· simpa using f.le_of_opNorm_le hf x
106-
· have : ∀ y, ⟪f y, x⟫ = ⟪y, x⟫ := by
107-
simpa [Submodule.mem_orthogonal, inner_sub_left, sub_eq_zero] using hx
108-
simp [this]
135+
rw [Submodule.ker_orthogonalProjection]
136+
exact eqLocus_orthogonal_le_topologicalClosure_coboundary f hf

Mathlib/Analysis/Oscillation.lean

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public import Mathlib.Topology.EMetricSpace.Diam
1111
public import Mathlib.Topology.EMetricSpace.Lipschitz
1212
public import Mathlib.Topology.UniformSpace.Cauchy
1313
public import Mathlib.Analysis.Normed.Group.Uniform
14+
public import Mathlib.Order.LiminfLimsup
1415
import Mathlib.Tactic.Scratchpad
1516

1617
/-!
@@ -42,12 +43,15 @@ variable {E : Type u} {F : Type v} [PseudoEMetricSpace F]
4243
noncomputable def oscillation (f : E → F) (l : Filter E) : ENNReal :=
4344
⨅ S ∈ l.map f, ediam S
4445

46+
theorem oscillation_le_ediam_range {f : E → F} {l} : oscillation f l ≤ ediam (range f) :=
47+
iInf_le_of_le (range f) (by simp)
48+
4549
/-- The oscillation of `f : E → F` at `x`. -/
4650
noncomputable abbrev oscillationAt [TopologicalSpace E] (f : E → F) (x : E) : ENNReal :=
4751
oscillation f (𝓝 x)
4852

4953
/-- The oscillation of `f : E → F` within `D` at `x`. -/
50-
noncomputable def oscillationWithinAt [TopologicalSpace E] (f : E → F) (D : Set E) (x : E) :
54+
noncomputable abbrev oscillationWithinAt [TopologicalSpace E] (f : E → F) (D : Set E) (x : E) :
5155
ENNReal :=
5256
oscillation f (𝓝[D] x)
5357

@@ -209,6 +213,14 @@ lemma mul_biInf {p : ι → Prop} (hp : ∃ i, p i) {a : ℝ≥0∞} {f : ι →
209213
simp_rw [iInf_subtype, Subtype.exists] at this
210214
exact this hinfty
211215

216+
@[to_dual iInf₂_eq_of_forall_ge_of_forall_gt_exists_lt]
217+
theorem iSup₂_eq_of_forall_le_of_forall_lt_exists_gt [CompleteLattice α] {b : α}
218+
(h₁ : ∀ i j, f i j ≤ b) (h₂ : ∀ w, w < b → ∃ i j, w < f i j) : ⨆ (i) (j), f i j = b := by
219+
have := iSup_eq_of_forall_le_of_forall_lt_exists_gt
220+
(f := fun (ij : PSigma κ) ↦ f ij.1 ij.2) (b := b)
221+
simp_rw [PSigma.forall, PSigma.exists, iSup_psigma] at this
222+
exact this h₁ h₂
223+
212224
end MoveMe
213225

214226
section Cauchy
@@ -263,11 +275,11 @@ theorem LipschitzWith.oscillation_comp₂_le (g : α → β → γ) (f₁ : E
263275
≤ ↑K₁ * oscillation f₁ l + ↑K₂ * oscillation f₂ l := by
264276
unfold oscillation
265277
simp_rw [mul_biInf ⟨_, Filter.univ_mem⟩ (coe_ne_top · |>.elim)]
266-
change_set _ ≤ (?a + ?b : ℝ≥0∞)
278+
change_set _ ≤ ?a + ?b
267279
by_cases! ha : a = ∞; · simp [ha]
268280
by_cases! hb : b = ∞; · simp [hb]
269-
apply ENNReal.le_of_forall_pos_le_add
270-
intro ε hε hfin
281+
apply _root_.le_of_forall_pos_le_add
282+
intro ε hε
271283
rcases iInf₂_le_iff_forall_lt (l := a) |>.mp le_rfl (a + ε / 2)
272284
(lt_add_right ha (by norm_num [hε.ne'])) with ⟨sa, hsa, hsa'⟩
273285
rcases iInf₂_le_iff_forall_lt (l := b) |>.mp le_rfl (b + ε / 2)
@@ -297,4 +309,20 @@ theorem oscillation_mul_le (f₁ : E → F) (f₂ : E → F) (l : Filter E) :
297309
(fun _ => (isometry_mul_left _).lipschitz)
298310
|>.trans_eq (by simp only [coe_one, one_mul])
299311

312+
@[to_additive]
313+
theorem oscillation_le_add_div (f₁ : E → F) (f₂ : E → F) (l : Filter E) :
314+
oscillation f₁ l ≤ oscillation f₂ l + oscillation (f₁ / f₂) l := by
315+
nth_rw 1 [show f₁ = f₂ * (f₁ / f₂) by simp]
316+
exact oscillation_mul_le ..
317+
318+
@[to_additive oscillation_le_two_mul_iSup_enorm]
319+
theorem oscillation_le_two_mul_iSup_enorm' (f : E → F) (l : Filter E) :
320+
oscillation f l ≤ 2 * iSup (‖f ·‖ₑ) := by
321+
apply oscillation_le_ediam_range.trans
322+
refine ediam_le fun x hx y hy => ?_
323+
rw [edist_eq_enorm_div x y, two_mul]
324+
apply enorm_div_le.trans <| add_le_add _ _
325+
· exact hx.out.elim fun z hz ↦ hz ▸ le_iSup (‖f ·‖ₑ) ..
326+
· exact hy.out.elim fun z hz ↦ hz ▸ le_iSup (‖f ·‖ₑ) ..
327+
300328
end SeminormedAddCommGroup

Mathlib/Data/EReal/Basic.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -693,6 +693,14 @@ theorem coe_ennreal_mul : ∀ x y : ℝ≥0∞, ((x * y : ℝ≥0∞) : EReal) =
693693
theorem coe_ennreal_nsmul (n : ℕ) (x : ℝ≥0∞) : (↑(n • x) : EReal) = n • (x : EReal) :=
694694
map_nsmul (⟨⟨(↑), coe_ennreal_zero⟩, coe_ennreal_add⟩ : ℝ≥0∞ →+ EReal) _ _
695695

696+
@[simp, norm_cast]
697+
theorem coe_ennreal_iSup {ι : Sort*} [hι : Nonempty ι] (f : ι → ℝ≥0∞) :
698+
((⨆ i, f i : ℝ≥0∞) : EReal) = ⨆ i, (f i : EReal) := by
699+
refine le_antisymm ?_ (iSup_le fun i ↦ mod_cast le_iSup f i)
700+
refine le_iSup_iff.mpr fun b hb ↦ ?_
701+
lift b to ℝ≥0using hι.elim fun i ↦ (EReal.coe_ennreal_nonneg _).trans (hb i)
702+
exact mod_cast iSup_le fun i ↦ mod_cast hb i
703+
696704
/-! ### toENNReal -/
697705

698706
/-- `x.toENNReal` returns `x` if it is nonnegative, `0` otherwise. -/

Mathlib/Dynamics/BirkhoffSum/Average.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ module
77

88
public import Mathlib.Dynamics.BirkhoffSum.Basic
99
public import Mathlib.Algebra.Module.Basic
10+
public import Mathlib.Analysis.Normed.Group.Defs
1011

1112
/-!
1213
# Birkhoff average

Mathlib/Dynamics/BirkhoffSum/Maximal.lean

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ import Mathlib.Analysis.InnerProductSpace.Basic
1313
import Mathlib.Analysis.RCLike.Lemmas
1414
import Mathlib.Data.Real.StarOrdered
1515
public import Mathlib.Dynamics.BirkhoffSum.Average
16-
import Mathlib.Dynamics.BirkhoffSum.Measurable
17-
import Mathlib.Dynamics.BirkhoffSum.Integrable
16+
public import Mathlib.Dynamics.BirkhoffSum.Measurable
17+
public import Mathlib.Dynamics.BirkhoffSum.Integrable
1818

1919
/-!
2020
# Maximal ergodic theorem.
@@ -93,14 +93,14 @@ variable [MeasurableSpace α] (μ : Measure α := by volume_tac) (hf : MeasurePr
9393
include hf
9494

9595
@[fun_prop]
96-
lemma birkhoffMax_aestronglyMeasurable (hg : AEStronglyMeasurable g μ) :
96+
public lemma birkhoffMax_aestronglyMeasurable (hg : AEStronglyMeasurable g μ) :
9797
AEStronglyMeasurable (birkhoffMax f g n) μ := by
9898
unfold birkhoffMax
9999
induction n <;> measurability
100100

101101
include hg
102102

103-
lemma birkhoffMax_integrable : Integrable (birkhoffMax f g n) μ := by
103+
public lemma birkhoffMax_integrable : Integrable (birkhoffMax f g n) μ := by
104104
unfold birkhoffMax
105105
induction n with
106106
| zero => exact integrable_zero ..
@@ -192,8 +192,7 @@ theorem lt_birkhoffAverageSup_iff_lt_birkhoffSumSup {a : ℝ} (ha : 0 < a) :
192192

193193
section MeasurePreserving
194194

195-
variable {f : α → α} [MeasurableSpace α] (μ : Measure α := by volume_tac)
196-
(hf : MeasurePreserving f μ μ)
195+
variable [MeasurableSpace α] (μ : Measure α) (hf : MeasurePreserving f μ μ)
197196

198197
include hf
199198

@@ -243,14 +242,14 @@ end Real
243242

244243
section NormedAddCommGroup
245244

246-
variable {E : Type*} [NormedAddCommGroup E] {g : α → E} (hg : Integrable g μ) [IsFiniteMeasure μ]
245+
variable [NormedAddCommGroup M] {g : α → M} (hg : Integrable g μ) [IsFiniteMeasure μ]
247246

248247
include hg
249248

250249
/-- Maximal ergodic theorem: the operator `birkhoffAverageSup` satisfies a weak-type inequality. -/
251250
public theorem iSup_distribution_birkhoffAverageSup_le_norm :
252-
a : ℝ, a * μ.real {x | a < birkhoffAverageSup f (‖g ·‖) x} ≤ ∫ x, ‖g x‖ ∂μ := by
253-
refine ciSup_le fun a ↦ ?_
251+
a : ℝ, a * μ.real {x | a < birkhoffAverageSup f (‖g ·‖) x} ≤ ∫ x, ‖g x‖ ∂μ := by
252+
intro a
254253
by_cases! ha : 0 < a; swap
255254
· apply mul_nonpos_of_nonpos_of_nonneg ha measureReal_nonneg |>.trans
256255
exact integral_nonneg (fun _ ↦ norm_nonneg _)
@@ -260,6 +259,11 @@ public theorem iSup_distribution_birkhoffAverageSup_le_norm :
260259
_ ≤ ∫ x, ‖g x‖ ∂μ := by
261260
exact setIntegral_le_integral hg.norm (ae_of_all _ (norm_nonneg <| g ·))
262261

262+
/-- Maximal ergodic theorem: the operator `birkhoffAverageSup` satisfies a weak-type inequality. -/
263+
public theorem iSup_distribution_birkhoffAverageSup_le_norm' :
264+
∀ a : ENNReal, μ {x | a < birkhoffAverageSup f (‖g ·‖) x} ≤ a⁻¹ * ‖hg.toL1‖ₑ := by
265+
sorry
266+
263267
end NormedAddCommGroup
264268

265269
end MeasurePreserving

Mathlib/Dynamics/BirkhoffSum/NormedSpace.lean

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,27 @@ theorem tendsto_birkhoffAverage_apply_sub_birkhoffAverage' {g : α → E}
9898
Tendsto (fun n ↦ birkhoffAverage 𝕜 f g n (f x) - birkhoffAverage 𝕜 f g n x) atTop (𝓝 0) :=
9999
tendsto_birkhoffAverage_apply_sub_birkhoffAverage _ <| h.subset <| range_comp_subset_range _ _
100100

101+
section TriangleInequality
102+
103+
variable {f : α → α} {g : α → E} {n : ℕ} {x : α}
104+
105+
@[bound]
106+
lemma norm_birkhoffSum_le :
107+
‖birkhoffSum f g n x‖ ≤ birkhoffSum f (‖g ·‖) n x :=
108+
norm_sum_le _ _
109+
110+
@[bound]
111+
lemma norm_birkhoffAverage_le {R : Type*} [RCLike R] [NormedSpace R E] :
112+
‖birkhoffAverage R f g n x‖ ≤ birkhoffAverage ℝ f (‖g ·‖) n x := by
113+
by_cases! h : n = 0
114+
· simp [birkhoffAverage, h]
115+
apply Nat.zero_lt_of_ne_zero at h
116+
simp only [birkhoffAverage, norm_smul, norm_inv, RCLike.norm_natCast, smul_eq_mul]
117+
gcongr
118+
exact norm_birkhoffSum_le
119+
120+
end TriangleInequality
121+
101122
end
102123

103124
variable (𝕜 : Type*) {X E : Type*}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/-
2+
Copyright (c) 2025 Lua Viana Reis. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Lua Viana Reis
5+
-/
6+
module
7+
8+
import Mathlib.Analysis.Oscillation
9+
import Mathlib.Dynamics.BirkhoffSum.Maximal
10+
import Mathlib.Tactic.Scratchpad
11+
import Mathlib.Dynamics.BirkhoffSum.NormedSpace
12+
import Mathlib.Analysis.InnerProductSpace.MeanErgodic
13+
14+
open MeasureTheory Measure MeasurableSpace Filter Topology Module
15+
open scoped NNReal ENNReal
16+
17+
variable {α R M : Type*} {f : α → α} {g : α → M} {n : ℕ} [RCLike R]
18+
[MeasurableSpace α] (μ : Measure α) (hf : MeasurePreserving f μ μ)
19+
[NormedAddCommGroup M] (hg : Integrable g μ) [IsFiniteMeasure μ] [NormedSpace R M]
20+
21+
variable {μ} (R M) in
22+
abbrev koopman (p) : End R (Lp M p μ) := Lp.compMeasurePreservingₗ R f hf
23+
24+
variable (R M f) in
25+
def convergenceSet := {g : Lp M 1 μ | ∀ᵐ x ∂μ, oscillation (birkhoffAverage R f g · x) atTop = 0}
26+
27+
lemma mem_convergenceSet_of_mem_coboundary {g : Lp M 1 μ}
28+
(hg : g ∈ End.coboundaries (koopman R M hf 1)) : g ∈ convergenceSet R M f μ := by
29+
rcases hg with ⟨h, hh⟩
30+
simp at hh
31+
32+
sorry
33+
34+
lemma ENNReal.forall_pos_of_forall_mul {motive : ℝ≥0∞ → Prop} (k : ℝ≥0∞)
35+
(h : ∀ ε > 0, motive (k * ε)) (hk₀ : k ≠ 0 := by positivity) (hk : k ≠ ∞ := by finiteness) :
36+
∀ ε > 0, motive ε := fun ε hε ↦
37+
ENNReal.mul_div_cancel (a := k) (b := ε) hk₀ hk ▸ h (ε / k) (ENNReal.div_pos hε.ne_zero hk)
38+
39+
omit [IsFiniteMeasure μ] in
40+
lemma foo {f : α → ℝ≥0∞} (h : ∀ ε > 0, ∀ᵐ x ∂μ, f x ≤ ε) : ∀ᵐ x ∂μ, f x ≤ 0 := by
41+
have H : ∀ᵐ x ∂μ, ∀ n : ℕ, f x ≤ (n : ℝ≥0∞)⁻¹ :=
42+
ae_all_iff.mpr fun n ↦ h _ (ENNReal.inv_pos.mpr (by finiteness))
43+
filter_upwards [H] with x hx
44+
refine le_of_forall_pos_le_add fun ε hε => ?_
45+
obtain ⟨n, hn⟩ := ENNReal.exists_inv_nat_lt hε.ne_zero
46+
exact (hx n).trans (by simp [hn.le])
47+
48+
include hf in
49+
theorem closed_convergenceSet : IsClosed (convergenceSet R M f μ) := by
50+
refine isClosed_of_closure_subset (fun g hg ↦ ?_)
51+
rw [EMetric.mem_closure_iff] at hg
52+
simp only [convergenceSet, ← nonpos_iff_eq_zero, Set.mem_setOf_eq]
53+
apply foo
54+
refine ENNReal.forall_pos_of_forall_mul 2 fun δ hδ ↦ ?_
55+
by_cases! hδ' : δ = ∞; · bound
56+
apply ae_iff.mpr <| nonpos_iff_eq_zero.mp _
57+
push Not
58+
have (h : Lp M 1 μ) (hh : h ∈ convergenceSet R M f μ) :
59+
∀ᵐ x ∂μ, 2 * δ < oscillation (birkhoffAverage R f g · x) atTop →
60+
δ < birkhoffAverageSup f (‖(⇑g - ⇑h) ·‖) x := by
61+
filter_upwards [hh] with x hosc hx
62+
have := hx.trans_le <| oscillation_le_add_sub (f₂ := (birkhoffAverage R f h · x)) ..
63+
rw [hosc] at this
64+
grw [oscillation_le_two_mul_iSup_enorm] at this
65+
simp only [Pi.sub_apply, zero_add, ne_eq, OfNat.ofNat_ne_zero, not_false_eq_true,
66+
ENNReal.ofNat_ne_top, ENNReal.mul_lt_mul_iff_right] at this
67+
change _ < ⨆ n, ‖(birkhoffAverage R f g - _) n x‖ₑ at this
68+
rw [← birkhoffAverage_sub] at this
69+
simp_rw [← EReal.coe_ennreal_lt_coe_ennreal_iff, EReal.coe_ennreal_iSup] at this
70+
exact this.trans_le (iSup_mono fun _ ↦ EReal.coe_le_coe norm_birkhoffAverage_le)
71+
refine le_of_forall_gt fun c hc ↦ ?_
72+
rcases hg (δ * c) (by positivity) with ⟨h, hh, hh'⟩
73+
apply measure_mono_ae (this h hh) |>.trans_lt
74+
apply iSup_distribution_birkhoffAverageSup_le_norm' μ hf (by fun_prop) δ |>.trans_lt
75+
rw [Integrable.toL1_sub g h (by fun_prop) (by fun_prop), ← edist_eq_enorm_sub,
76+
Integrable.toL1_coeFn, Integrable.toL1_coeFn]
77+
apply ENNReal.mul_lt_mul_right (ENNReal.inv_ne_zero.mpr hδ') (by finiteness) hh' |>.trans_le
78+
rw [ENNReal.inv_mul_cancel_left (by positivity) hδ']

Mathlib/MeasureTheory/Function/L1Space/AEEqFun.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ end AEEqFun
101101
namespace L1
102102

103103

104+
@[fun_prop]
104105
theorem integrable_coeFn (f : α →₁[μ] β) : Integrable f μ := by
105106
rw [← memLp_one_iff_integrable]
106107
exact Lp.memLp f

0 commit comments

Comments
 (0)