Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit b4a2991

Browse files
committed
feat(dynamics/ergodic): define measure preserving maps (#6764)
Also prove some missing lemmas about measures.
1 parent eba4829 commit b4a2991

File tree

6 files changed

+171
-3
lines changed

6 files changed

+171
-3
lines changed

src/data/set/basic.lean

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1971,6 +1971,10 @@ lemma prod_preimage_left {f : γ → α} : (f ⁻¹' s).prod t = (λp, (f p.1, p
19711971

19721972
lemma prod_preimage_right {g : δ → β} : s.prod (g ⁻¹' t) = (λp, (p.1, g p.2)) ⁻¹' (s.prod t) := rfl
19731973

1974+
lemma preimage_prod_map_prod (f : α → β) (g : γ → δ) (s : set β) (t : set δ) :
1975+
prod.map f g ⁻¹' (s.prod t) = (f ⁻¹' s).prod (g ⁻¹' t) :=
1976+
rfl
1977+
19741978
lemma mk_preimage_prod (f : γ → α) (g : γ → β) :
19751979
(λ x, (f x, g x)) ⁻¹' s.prod t = f ⁻¹' s ∩ g ⁻¹' t := rfl
19761980

@@ -2014,7 +2018,7 @@ theorem image_swap_prod : prod.swap '' t.prod s = s.prod t :=
20142018
by rw [image_swap_eq_preimage_swap, preimage_swap_prod]
20152019

20162020
theorem prod_image_image_eq {m₁ : α → γ} {m₂ : β → δ} :
2017-
(image m₁ s).prod (image m₂ t) = image (λp:α×β, (m₁ p.1, m₂ p.2)) (s.prod t) :=
2021+
(m₁ '' s).prod (m₂ '' t) = image (λp:α×β, (m₁ p.1, m₂ p.2)) (s.prod t) :=
20182022
ext $ by simp [-exists_and_distrib_right, exists_and_distrib_right.symm, and.left_comm,
20192023
and.assoc, and.comm]
20202024

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
/-
2+
Copyright (c) 2021 Yury Kudryashov. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Yury Kudryashov
5+
-/
6+
import measure_theory.prod
7+
8+
/-!
9+
# Measure preserving maps
10+
11+
We say that `f : α → β` is a measure preserving map w.r.t. measures `μ : measure α` and
12+
`ν : measure β` if `f` is measurable and `map f μ = ν`. In this file we define the predicate
13+
`measure_theory.measure_preserving` and prove its basic properties.
14+
15+
We use the term "measure preserving" because in many applications `α = β` and `μ = ν`.
16+
17+
## References
18+
19+
Partially based on
20+
[this](https://www.isa-afp.org/browser_info/current/AFP/Ergodic_Theory/Measure_Preserving_Transformations.html)
21+
Isabelle formalization.
22+
23+
## Tags
24+
25+
measure preserving map, measure
26+
-/
27+
28+
variables {α β γ δ : Type*} [measurable_space α] [measurable_space β] [measurable_space γ]
29+
[measurable_space δ]
30+
31+
namespace measure_theory
32+
33+
open measure function set
34+
35+
variables {μa : measure α} {μb : measure β} {μc : measure γ} {μd : measure δ}
36+
37+
/-- `f` is a measure preserving map w.r.t. measures `μa` and `μb` if `f` is measurable
38+
and `map f μa = μb`. -/
39+
@[protect_proj]
40+
structure measure_preserving (f : α → β) (μa : measure α . volume_tac)
41+
(μb : measure β . volume_tac) : Prop :=
42+
(measurable : measurable f)
43+
(map_eq : map f μa = μb)
44+
45+
namespace measure_preserving
46+
47+
protected lemma id (μ : measure α) : measure_preserving id μ μ :=
48+
⟨measurable_id, map_id⟩
49+
50+
protected lemma quasi_measure_preserving {f : α → β} (hf : measure_preserving f μa μb) :
51+
quasi_measure_preserving f μa μb :=
52+
⟨hf.1, hf.2.absolutely_continuous⟩
53+
54+
lemma comp {g : β → γ} {f : α → β} (hg : measure_preserving g μb μc)
55+
(hf : measure_preserving f μa μb) :
56+
measure_preserving (g ∘ f) μa μc :=
57+
⟨hg.1.comp hf.1, by rw [← map_map hg.1 hf.1, hf.2, hg.2]⟩
58+
59+
protected lemma sigma_finite {f : α → β} (hf : measure_preserving f μa μb) [sigma_finite μb] :
60+
sigma_finite μa :=
61+
sigma_finite.of_map μa hf.1 (by rwa hf.map_eq)
62+
63+
lemma measure_preimage {f : α → β} (hf : measure_preserving f μa μb)
64+
{s : set β} (hs : measurable_set s) :
65+
μa (f ⁻¹' s) = μb s :=
66+
by rw [← hf.map_eq, map_apply hf.1 hs]
67+
68+
protected lemma iterate {f : α → α} (hf : measure_preserving f μa μa) :
69+
∀ n, measure_preserving (f^[n]) μa μa
70+
| 0 := measure_preserving.id μa
71+
| (n + 1) := (iterate n).comp hf
72+
73+
lemma skew_product [sigma_finite μb] [sigma_finite μd]
74+
{f : α → β} (hf : measure_preserving f μa μb) {g : α → γ → δ}
75+
(hgm : measurable (uncurry g)) (hg : ∀ᵐ x ∂μa, map (g x) μc = μd) :
76+
measure_preserving (λ p : α × γ, (f p.1, g p.1 p.2)) (μa.prod μc) (μb.prod μd) :=
77+
begin
78+
classical,
79+
have : measurable (λ p : α × γ, (f p.1, g p.1 p.2)) := (hf.1.comp measurable_fst).prod_mk hgm,
80+
/- if `μa = 0`, then the lemma is trivial, otherwise we can use `hg`
81+
to deduce `sigma_finite μc`. -/
82+
by_cases ha : μa = 0,
83+
{ rw [← hf.map_eq, ha, zero_prod, (map f).map_zero, zero_prod],
84+
exact ⟨this, (map _).map_zero⟩ },
85+
haveI : μa.ae.ne_bot := ae_ne_bot.2 ha,
86+
rcases hg.exists with ⟨x, hx⟩,
87+
haveI : sigma_finite μc := sigma_finite.of_map _ hgm.of_uncurry_left (by rwa hx),
88+
clear hx x,
89+
refine ⟨this, (prod_eq $ λ s t hs ht, _).symm⟩,
90+
rw [map_apply this (hs.prod ht)],
91+
refine (prod_apply (this $ hs.prod ht)).trans _,
92+
have : ∀ᵐ x ∂μa, μc ((λ y, (f x, g x y)) ⁻¹' s.prod t) = indicator (f ⁻¹' s) (λ y, μd t) x,
93+
{ refine hg.mono (λ x hx, _),
94+
simp only [mk_preimage_prod_right_fn_eq_if, indicator_apply, mem_preimage],
95+
split_ifs,
96+
{ rw [← map_apply hgm.of_uncurry_left ht, hx] },
97+
{ exact measure_empty } },
98+
simp only [preimage_preimage],
99+
rw [lintegral_congr_ae this, lintegral_indicator _ (hf.1 hs),
100+
set_lintegral_const, hf.measure_preimage hs, mul_comm]
101+
end
102+
103+
/-- If `f : α → β` sends the measure `μa` to `μb` and `g : γ → δ` sends the measure `μc` to `μd`,
104+
then `prod.map f g` sends `μa.prod μc` to `μb.prod μd`. -/
105+
lemma prod [sigma_finite μb] [sigma_finite μd] {f : α → β} {g : γ → δ}
106+
(hf : measure_preserving f μa μb) (hg : measure_preserving g μc μd) :
107+
measure_preserving (prod.map f g) (μa.prod μc) (μb.prod μd) :=
108+
have measurable (uncurry $ λ _ : α, g), from (hg.1.comp measurable_snd),
109+
hf.skew_product this $ filter.eventually_of_forall $ λ _, hg.map_eq
110+
111+
end measure_preserving
112+
113+
end measure_theory

src/measure_theory/giry_monad.lean

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ measure.of_measurable
9898
∀{s : set α}, measurable_set s → join m s = ∫⁻ μ, μ s ∂m :=
9999
measure.of_measurable_apply
100100

101+
@[simp] lemma join_zero : (0 : measure (measure α)).join = 0 :=
102+
by { ext1 s hs, simp [hs] }
103+
101104
lemma measurable_join : measurable (join : measure (measure α) → measure α) :=
102105
measurable_of_measurable_coe _ $ assume s hs,
103106
by simp only [join_apply hs]; exact measurable_lintegral (measurable_coe hs)
@@ -152,6 +155,22 @@ end
152155
functions. When the function `f` is not measurable the result is not well defined. -/
153156
def bind (m : measure α) (f : α → measure β) : measure β := join (map f m)
154157

158+
@[simp] lemma bind_zero_left (f : α → measure β) : bind 0 f = 0 :=
159+
by simp [bind]
160+
161+
@[simp] lemma bind_zero_right (m : measure α) :
162+
bind m (0 : α → measure β) = 0 :=
163+
begin
164+
ext1 s hs,
165+
simp only [bind, hs, join_apply, coe_zero, pi.zero_apply],
166+
rw [lintegral_map (measurable_coe hs) measurable_zero],
167+
simp
168+
end
169+
170+
@[simp] lemma bind_zero_right' (m : measure α) :
171+
bind m (λ _, 0 : α → measure β) = 0 :=
172+
bind_zero_right m
173+
155174
@[simp] lemma bind_apply {m : measure α} {f : α → measure β} {s : set β}
156175
(hs : measurable_set s) (hf : measurable f) :
157176
bind m f s = ∫⁻ a, f a s ∂m :=

src/measure_theory/measurable_space.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -696,6 +696,10 @@ measurable_const.prod_mk measurable_id
696696
lemma measurable_prod_mk_right {y : β} : measurable (λ x : α, (x, y)) :=
697697
measurable_id.prod_mk measurable_const
698698

699+
lemma measurable.prod_map [measurable_space δ] {f : α → β} {g : γ → δ} (hf : measurable f)
700+
(hg : measurable g) : measurable (prod.map f g) :=
701+
(hf.comp measurable_fst).prod_mk (hg.comp measurable_snd)
702+
699703
lemma measurable.of_uncurry_left {f : α → β → γ} (hf : measurable (uncurry f)) {x : α} :
700704
measurable (f x) :=
701705
hf.comp measurable_prod_mk_left

src/measure_theory/measure_space.lean

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1473,6 +1473,9 @@ open measure
14731473
@[simp] lemma ae_eq_bot : μ.ae = ⊥ ↔ μ = 0 :=
14741474
by rw [← empty_in_sets_eq_bot, mem_ae_iff, compl_empty, measure_univ_eq_zero]
14751475

1476+
@[simp] lemma ae_ne_bot : μ.ae.ne_bot ↔ μ ≠ 0 :=
1477+
ne_bot_iff.trans (not_congr ae_eq_bot)
1478+
14761479
@[simp] lemma ae_zero : (0 : measure α).ae = ⊥ := ae_eq_bot.2 rfl
14771480

14781481
@[mono] lemma ae_mono {μ ν : measure α} (h : μ ≤ ν) : μ.ae ≤ ν.ae :=
@@ -1823,7 +1826,7 @@ lemma sigma_finite_of_not_nonempty (μ : measure α) (hα : ¬ nonempty α) : si
18231826
⟨⟨⟨λ _, ∅, λ n, measurable_set.empty, λ n, by simp, by simp [eq_empty_of_not_nonempty hα univ]⟩⟩⟩
18241827

18251828
lemma sigma_finite_of_countable {S : set (set α)} (hc : countable S)
1826-
(hμ : ∀ s ∈ S, μ s < ∞) (hU : ⋃₀ S = univ) :
1829+
(hμ : ∀ s ∈ S, μ s < ∞) (hU : ⋃₀ S = univ) :
18271830
sigma_finite μ :=
18281831
begin
18291832
obtain ⟨s, hμ, hs⟩ : ∃ s : ℕ → set α, (∀ n, μ (s n) < ∞) ∧ (⋃ n, s n) = univ,
@@ -1852,7 +1855,7 @@ instance sum.sigma_finite {ι} [fintype ι] (μ : ι → measure α) [∀ i, sig
18521855
begin
18531856
haveI : encodable ι := (encodable.trunc_encodable_of_fintype ι).out,
18541857
have : ∀ n, measurable_set (⋂ (i : ι), spanning_sets (μ i) n) :=
1855-
λ n, measurable_set.Inter (λ i, measurable_spanning_sets (μ i) n),
1858+
λ n, measurable_set.Inter (λ i, measurable_spanning_sets (μ i) n),
18561859
refine ⟨⟨⟨λ n, ⋂ i, spanning_sets (μ i) n, this, λ n, _, _⟩⟩⟩,
18571860
{ rw [sum_apply _ (this n), tsum_fintype, ennreal.sum_lt_top_iff],
18581861
rintro i -,
@@ -1865,6 +1868,14 @@ instance add.sigma_finite (μ ν : measure α) [sigma_finite μ] [sigma_finite
18651868
sigma_finite (μ + ν) :=
18661869
by { rw [← sum_cond], refine @sum.sigma_finite _ _ _ _ _ (bool.rec _ _); simpa }
18671870

1871+
lemma sigma_finite.of_map (μ : measure α) {f : α → β} (hf : measurable f)
1872+
(h : sigma_finite (map f μ)) :
1873+
sigma_finite μ :=
1874+
⟨⟨⟨λ n, f ⁻¹' (spanning_sets (map f μ) n),
1875+
λ n, hf $ measurable_spanning_sets _ _,
1876+
λ n, by simp only [← map_apply hf, measurable_spanning_sets, measure_spanning_sets_lt_top],
1877+
by rw [← preimage_Union, Union_spanning_sets, preimage_univ]⟩⟩⟩
1878+
18681879
/-- A measure is called locally finite if it is finite in some neighborhood of each point. -/
18691880
class locally_finite_measure [topological_space α] (μ : measure α) : Prop :=
18701881
(finite_at_nhds : ∀ x, μ.finite_at_filter (𝓝 x))

src/measure_theory/prod.lean

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,23 @@ by { refine prod_eq (λ s t hs ht, _), simp_rw [add_apply, prod_prod hs ht, left
540540
lemma add_prod (μ' : measure α) [sigma_finite μ'] : (μ + μ').prod ν = μ.prod ν + μ'.prod ν :=
541541
by { refine prod_eq (λ s t hs ht, _), simp_rw [add_apply, prod_prod hs ht, right_distrib] }
542542

543+
@[simp] lemma zero_prod (ν : measure β) : (0 : measure α).prod ν = 0 :=
544+
by { rw measure.prod, exact bind_zero_left _ }
545+
546+
@[simp] lemma prod_zero (μ : measure α) : μ.prod (0 : measure β) = 0 :=
547+
by simp [measure.prod]
548+
549+
lemma map_prod_map {δ} [measurable_space δ] {f : α → β} {g : γ → δ}
550+
{μa : measure α} {μc : measure γ} (hfa : sigma_finite (map f μa))
551+
(hgc : sigma_finite (map g μc)) (hf : measurable f) (hg : measurable g) :
552+
(map f μa).prod (map g μc) = map (prod.map f g) (μa.prod μc) :=
553+
begin
554+
haveI := hgc.of_map μc hg,
555+
refine prod_eq (λ s t hs ht, _),
556+
rw [map_apply (hf.prod_map hg) (hs.prod ht), map_apply hf hs, map_apply hg ht],
557+
exact prod_prod (hf hs) (hg ht)
558+
end
559+
543560
end measure
544561
end measure_theory
545562

0 commit comments

Comments
 (0)