Skip to content

Commit fd5e537

Browse files
committed
feat: use measurability as auto-param in MeasurableEquiv (leanprover-community#34457)
... and remove as many explicit proofs as possible.
1 parent 7599a67 commit fd5e537

8 files changed

Lines changed: 10 additions & 85 deletions

File tree

Mathlib/MeasureTheory/Constructions/BorelSpace/Basic.lean

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -551,8 +551,6 @@ protected theorem Homeomorph.measurable (h : α ≃ₜ γ) : Measurable h :=
551551

552552
/-- A homeomorphism between two Borel spaces is a measurable equivalence. -/
553553
def Homeomorph.toMeasurableEquiv (h : γ ≃ₜ γ₂) : γ ≃ᵐ γ₂ where
554-
measurable_toFun := h.measurable
555-
measurable_invFun := h.symm.measurable
556554
toEquiv := h.toEquiv
557555

558556
lemma Homeomorph.measurableEmbedding (h : γ ≃ₜ γ₂) : MeasurableEmbedding h :=

Mathlib/MeasureTheory/Constructions/UnitInterval.lean

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ def symmMeasurableEquiv : I ≃ᵐ I where
5656
invFun := σ
5757
left_inv := symm_symm
5858
right_inv := symm_symm
59-
measurable_toFun := measurable_symm
60-
measurable_invFun := measurable_symm
6159

6260
@[simp]
6361
lemma symm_symmMeasurableEquiv : symmMeasurableEquiv.symm = symmMeasurableEquiv := rfl

Mathlib/MeasureTheory/Group/MeasurableEquiv.lean

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,6 @@ measurable automorphism of `G`. -/
116116
on the right is a measurable automorphism of `G`. -/]
117117
def mulRight (g : G) : G ≃ᵐ G where
118118
toEquiv := Equiv.mulRight g
119-
measurable_toFun := measurable_mul_const g
120-
measurable_invFun := measurable_mul_const g⁻¹
121119

122120
@[to_additive]
123121
theorem _root_.measurableEmbedding_mulRight (g : G) : MeasurableEmbedding fun x => x * g :=
@@ -159,8 +157,6 @@ theorem toEquiv_mulLeft₀ {g : G₀} (hg : g ≠ 0) : (mulLeft₀ g hg).toEquiv
159157
nonzero element `g : G₀` is a measurable automorphism of `G₀`. -/
160158
def mulRight₀ (g : G₀) (hg : g ≠ 0) : G₀ ≃ᵐ G₀ where
161159
toEquiv := Equiv.mulRight₀ g hg
162-
measurable_toFun := measurable_mul_const g
163-
measurable_invFun := measurable_mul_const g⁻¹
164160

165161
theorem _root_.measurableEmbedding_mulRight₀ {g : G₀} (hg : g ≠ 0) :
166162
MeasurableEmbedding fun x => x * g :=
@@ -186,8 +182,6 @@ end Mul
186182
/-- Negation as a measurable automorphism of an additive group. -/]
187183
def inv (G) [MeasurableSpace G] [InvolutiveInv G] [MeasurableInv G] : G ≃ᵐ G where
188184
toEquiv := Equiv.inv G
189-
measurable_toFun := measurable_inv
190-
measurable_invFun := measurable_inv
191185

192186
@[to_additive (attr := simp)]
193187
theorem symm_inv {G} [MeasurableSpace G] [InvolutiveInv G] [MeasurableInv G] :

Mathlib/MeasureTheory/Group/Prod.lean

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,18 +58,14 @@ variable (μ ν : Measure G) [SFinite ν] [SFinite μ] {s : Set G}
5858

5959
/-- The map `(x, y) ↦ (x, xy)` as a `MeasurableEquiv`. -/
6060
@[to_additive /-- The map `(x, y) ↦ (x, x + y)` as a `MeasurableEquiv`. -/]
61-
protected def MeasurableEquiv.shearMulRight [MeasurableInv G] : G × G ≃ᵐ G × G :=
62-
{ Equiv.prodShear (Equiv.refl _) Equiv.mulLeft with
63-
measurable_toFun := measurable_fst.prodMk measurable_mul
64-
measurable_invFun := measurable_fst.prodMk <| measurable_fst.inv.mul measurable_snd }
61+
protected def MeasurableEquiv.shearMulRight [MeasurableInv G] : G × G ≃ᵐ G × G where
62+
toEquiv := .prodShear (.refl _) .mulLeft
6563

6664
/-- The map `(x, y) ↦ (x, y / x)` as a `MeasurableEquiv` with inverse `(x, y) ↦ (x, yx)` -/
6765
@[to_additive
6866
/-- The map `(x, y) ↦ (x, y - x)` as a `MeasurableEquiv` with inverse `(x, y) ↦ (x, y + x)`. -/]
69-
protected def MeasurableEquiv.shearDivRight [MeasurableInv G] : G × G ≃ᵐ G × G :=
70-
{ Equiv.prodShear (Equiv.refl _) Equiv.divRight with
71-
measurable_toFun := measurable_fst.prodMk <| measurable_snd.div measurable_fst
72-
measurable_invFun := measurable_fst.prodMk <| measurable_snd.mul measurable_fst }
67+
protected def MeasurableEquiv.shearDivRight [MeasurableInv G] : G × G ≃ᵐ G × G where
68+
toEquiv := .prodShear (.refl _) .divRight
7369

7470
variable {G}
7571

Mathlib/MeasureTheory/MeasurableSpace/Embedding.lean

Lines changed: 2 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,9 @@ theorem MeasurableSet.exists_measurable_proj {_ : MeasurableSpace α}
168168
statements along measurable equivalences. -/
169169
structure MeasurableEquiv (α β : Type*) [MeasurableSpace α] [MeasurableSpace β] extends α ≃ β where
170170
/-- The forward function of a measurable equivalence is measurable. -/
171-
measurable_toFun : Measurable toEquiv
171+
measurable_toFun : Measurable toEquiv := by measurability
172172
/-- The inverse function of a measurable equivalence is measurable. -/
173-
measurable_invFun : Measurable toEquiv.symm
173+
measurable_invFun : Measurable toEquiv.symm := by measurability
174174

175175
@[inherit_doc]
176176
infixl:25 " ≃ᵐ " => MeasurableEquiv
@@ -206,8 +206,6 @@ theorem coe_mk (e : α ≃ β) (h1 : Measurable e) (h2 : Measurable e.symm) :
206206
/-- Any measurable space is equivalent to itself. -/
207207
def refl (α : Type*) [MeasurableSpace α] : α ≃ᵐ α where
208208
toEquiv := Equiv.refl α
209-
measurable_toFun := measurable_id
210-
measurable_invFun := measurable_id
211209

212210
instance instInhabited : Inhabited (α ≃ᵐ α) := ⟨refl α⟩
213211

@@ -223,7 +221,6 @@ theorem coe_trans (ab : α ≃ᵐ β) (bc : β ≃ᵐ γ) : ⇑(ab.trans bc) = b
223221
def symm (ab : α ≃ᵐ β) : β ≃ᵐ α where
224222
toEquiv := ab.toEquiv.symm
225223
measurable_toFun := ab.measurable_invFun
226-
measurable_invFun := ab.measurable_toFun
227224

228225
@[simp]
229226
theorem coe_toEquiv_symm (e : α ≃ᵐ β) : (e.toEquiv.symm : β → α) = e.symm :=
@@ -338,14 +335,6 @@ protected theorem measurableEmbedding (e : α ≃ᵐ β) : MeasurableEmbedding e
338335
protected def cast {α β} [i₁ : MeasurableSpace α] [i₂ : MeasurableSpace β] (h : α = β)
339336
(hi : i₁ ≍ i₂) : α ≃ᵐ β where
340337
toEquiv := Equiv.cast h
341-
measurable_toFun := by
342-
subst h
343-
subst hi
344-
exact measurable_id
345-
measurable_invFun := by
346-
subst h
347-
subst hi
348-
exact measurable_id
349338

350339
/-- Measurable equivalence between `ULift α` and `α`. -/
351340
def ulift.{u, v} {α : Type u} [MeasurableSpace α] : ULift.{v, u} α ≃ᵐ α :=
@@ -363,43 +352,29 @@ protected theorem measurable_comp_iff {f : β → γ} (e : α ≃ᵐ β) :
363352
def ofUniqueOfUnique (α β : Type*) [MeasurableSpace α] [MeasurableSpace β] [Unique α] [Unique β] :
364353
α ≃ᵐ β where
365354
toEquiv := ofUnique α β
366-
measurable_toFun := Subsingleton.measurable
367-
measurable_invFun := Subsingleton.measurable
368355

369356
variable [MeasurableSpace δ] in
370357
/-- Products of equivalent measurable spaces are equivalent. -/
371358
def prodCongr (ab : α ≃ᵐ β) (cd : γ ≃ᵐ δ) : α × γ ≃ᵐ β × δ where
372359
toEquiv := .prodCongr ab.toEquiv cd.toEquiv
373-
measurable_toFun :=
374-
(ab.measurable_toFun.comp measurable_id.fst).prodMk
375-
(cd.measurable_toFun.comp measurable_id.snd)
376-
measurable_invFun :=
377-
(ab.measurable_invFun.comp measurable_id.fst).prodMk
378-
(cd.measurable_invFun.comp measurable_id.snd)
379360

380361
/-- Products of measurable spaces are symmetric. -/
381362
def prodComm : α × β ≃ᵐ β × α where
382363
toEquiv := .prodComm α β
383-
measurable_toFun := measurable_id.snd.prodMk measurable_id.fst
384-
measurable_invFun := measurable_id.snd.prodMk measurable_id.fst
385364

386365
/-- Products of measurable spaces are associative. -/
387366
def prodAssoc : (α × β) × γ ≃ᵐ α × β × γ where
388367
toEquiv := .prodAssoc α β γ
389-
measurable_toFun := measurable_fst.fst.prodMk <| measurable_fst.snd.prodMk measurable_snd
390-
measurable_invFun := (measurable_fst.prodMk measurable_snd.fst).prodMk measurable_snd.snd
391368

392369
/-- `PUnit` is a left identity for product of measurable spaces up to a measurable equivalence. -/
393370
def punitProd : PUnit × α ≃ᵐ α where
394371
toEquiv := Equiv.punitProd α
395372
measurable_toFun := measurable_snd
396-
measurable_invFun := measurable_prodMk_left
397373

398374
/-- `PUnit` is a right identity for product of measurable spaces up to a measurable equivalence. -/
399375
def prodPUnit : α × PUnit ≃ᵐ α where
400376
toEquiv := Equiv.prodPUnit α
401377
measurable_toFun := measurable_fst
402-
measurable_invFun := measurable_prodMk_right
403378

404379
variable [MeasurableSpace δ] in
405380
/-- Sums of measurable spaces are symmetric. -/
@@ -411,8 +386,6 @@ def sumCongr (ab : α ≃ᵐ β) (cd : γ ≃ᵐ δ) : α ⊕ γ ≃ᵐ β ⊕
411386
/-- `s ×ˢ t ≃ (s × t)` as measurable spaces. -/
412387
def Set.prod (s : Set α) (t : Set β) : ↥(s ×ˢ t) ≃ᵐ s × t where
413388
toEquiv := Equiv.Set.prod s t
414-
measurable_toFun :=
415-
measurable_id.subtype_val.fst.subtype_mk.prodMk measurable_id.subtype_val.snd.subtype_mk
416389
measurable_invFun :=
417390
Measurable.subtype_mk <| measurable_id.fst.subtype_val.prodMk measurable_id.snd.subtype_val
418391

@@ -425,8 +398,6 @@ def Set.univ (α : Type*) [MeasurableSpace α] : (univ : Set α) ≃ᵐ α where
425398
/-- `{a} ≃ Unit` as measurable spaces. -/
426399
def Set.singleton (a : α) : ({a} : Set α) ≃ᵐ Unit where
427400
toEquiv := Equiv.Set.singleton a
428-
measurable_toFun := measurable_const
429-
measurable_invFun := measurable_const
430401

431402
/-- `α` is equivalent to its image in `α ⊕ β` as measurable spaces. -/
432403
def Set.rangeInl : (range Sum.inl : Set (α ⊕ β)) ≃ᵐ α where
@@ -489,7 +460,6 @@ variable (π) in
489460
/-- Moving a dependent type along an equivalence of coordinates, as a measurable equivalence. -/
490461
def piCongrLeft (f : δ ≃ δ') : (∀ b, π (f b)) ≃ᵐ ∀ a, π a where
491462
__ := Equiv.piCongrLeft π f
492-
measurable_toFun := measurable_piCongrLeft f
493463
measurable_invFun := by
494464
rw [measurable_pi_iff]
495465
exact fun i => measurable_pi_apply (f i)
@@ -538,8 +508,6 @@ variable (π) in
538508
@[simps! -fullyApplied]
539509
def piUnique [Unique δ'] : (∀ i, π i) ≃ᵐ π default where
540510
toEquiv := Equiv.piUnique π
541-
measurable_toFun := measurable_pi_apply _
542-
measurable_invFun := measurable_uniqueElim
543511

544512
/-- If `α` has a unique term, then the type of function `α → β` is measurably equivalent to `β`. -/
545513
@[simps! -fullyApplied]
@@ -550,7 +518,6 @@ def funUnique (α β : Type*) [Unique α] [MeasurableSpace β] : (α → β) ≃
550518
@[simps! -fullyApplied]
551519
def piFinTwo (α : Fin 2Type*) [∀ i, MeasurableSpace (α i)] : (∀ i, α i) ≃ᵐ α 0 × α 1 where
552520
toEquiv := piFinTwoEquiv α
553-
measurable_toFun := Measurable.prod (measurable_pi_apply _) (measurable_pi_apply _)
554521
measurable_invFun := measurable_pi_iff.2 <| Fin.forall_fin_two.2 ⟨measurable_fst, measurable_snd⟩
555522

556523
/-- The space `Fin 2 → α` is measurably equivalent to `α × α`. -/
@@ -579,16 +546,12 @@ variable (π)
579546
def piEquivPiSubtypeProd (p : δ' → Prop) [DecidablePred p] :
580547
(∀ i, π i) ≃ᵐ (∀ i : Subtype p, π i) × ∀ i : { i // ¬p i }, π i where
581548
toEquiv := .piEquivPiSubtypeProd p π
582-
measurable_toFun := measurable_piEquivPiSubtypeProd π p
583-
measurable_invFun := measurable_piEquivPiSubtypeProd_symm π p
584549

585550
/-- The measurable equivalence between the pi type over a sum type and a product of pi-types.
586551
This is similar to `MeasurableEquiv.piEquivPiSubtypeProd`. -/
587552
def sumPiEquivProdPi (α : δ ⊕ δ' → Type*) [∀ i, MeasurableSpace (α i)] :
588553
(∀ i, α i) ≃ᵐ (∀ i, α (.inl i)) × ∀ i', α (.inr i') where
589554
__ := Equiv.sumPiEquivProdPi α
590-
measurable_toFun := by
591-
apply Measurable.prod <;> rw [measurable_pi_iff] <;> rintro i <;> apply measurable_pi_apply
592555
measurable_invFun := by
593556
rw [measurable_pi_iff]; rintro (i | i)
594557
· exact measurable_pi_iff.1 measurable_fst _
@@ -637,8 +600,6 @@ def sumCompl {s : Set α} [DecidablePred (· ∈ s)] (hs : MeasurableSet s) :
637600
@[simps toEquiv]
638601
def ofInvolutive (f : α → α) (hf : Involutive f) (hf' : Measurable f) : α ≃ᵐ α where
639602
toEquiv := hf.toPerm
640-
measurable_toFun := hf'
641-
measurable_invFun := hf'
642603

643604
@[simp] theorem ofInvolutive_apply (f : α → α) (hf : Involutive f) (hf' : Measurable f) (a : α) :
644605
ofInvolutive f hf hf' a = f a := rfl
@@ -651,8 +612,6 @@ def ofInvolutive (f : α → α) (hf : Involutive f) (hf' : Measurable f) : α
651612
protected def setOf {α : Type*} : (α → Prop) ≃ᵐ Set α where
652613
toFun p := {a | p a}
653614
invFun s a := a ∈ s
654-
measurable_toFun := measurable_id
655-
measurable_invFun := measurable_id
656615

657616
@[simp, norm_cast] lemma coe_setOf {α : Type*} : ⇑MeasurableEquiv.setOf = setOf (α := α) := rfl
658617

@@ -812,8 +771,6 @@ def piCurry {ι : Type*} {κ : ι → Type*} (X : (i : ι) → κ i → Type*)
812771
[∀ i j, MeasurableSpace (X i j)] :
813772
((p : (i : ι) × κ i) → X p.1 p.2) ≃ᵐ ((i : ι) → (j : κ i) → X i j) where
814773
toEquiv := Equiv.piCurry X
815-
measurable_toFun := by fun_prop
816-
measurable_invFun := by fun_prop
817774

818775
lemma coe_piCurry {ι : Type*} {κ : ι → Type*} (X : (i : ι) → κ i → Type*)
819776
[∀ i j, MeasurableSpace (X i j)] : ⇑(piCurry X) = Sigma.curry := rfl
@@ -826,8 +783,6 @@ See `MeasurableEquiv.piCurry` for the dependent version. -/
826783
@[simps!]
827784
def curry (ι κ X : Type*) [MeasurableSpace X] : (ι × κ → X) ≃ᵐ (ι → κ → X) where
828785
toEquiv := Equiv.curry ι κ X
829-
measurable_toFun := by fun_prop
830-
measurable_invFun := by fun_prop
831786

832787
lemma coe_curry (ι κ X : Type*) [MeasurableSpace X] : ⇑(curry ι κ X) = Function.curry := rfl
833788

Mathlib/MeasureTheory/Measure/Haar/InnerProductSpace.lean

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,7 @@ namespace LinearIsometryEquiv
3434
variable (f : E ≃ₗᵢ[ℝ] F)
3535

3636
/-- Every linear isometry equivalence is a measurable equivalence. -/
37-
def toMeasurableEquiv : E ≃ᵐ F where
38-
toEquiv := f
39-
measurable_toFun := f.continuous.measurable
40-
measurable_invFun := f.symm.continuous.measurable
37+
def toMeasurableEquiv : E ≃ᵐ F := f.toHomeomorph.toMeasurableEquiv
4138

4239
@[simp] theorem coe_toMeasurableEquiv : (f.toMeasurableEquiv : E → F) = f := rfl
4340

Mathlib/MeasureTheory/Measure/HasOuterApproxClosedProd.lean

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -212,9 +212,7 @@ lemma ext_of_integral_prod_mul_boundedContinuousFunction {μ ν : Measure ((Π i
212212
{ toFun p := ⟨fun i ↦ p.1 i, fun _ ↦ p.2
213213
invFun p := ⟨fun i ↦ p.1 i, p.2 ()⟩
214214
left_inv p := by simp
215-
right_inv p := by simp
216-
measurable_toFun := by simp; fun_prop
217-
measurable_invFun := by simp; fun_prop }
215+
right_inv p := by simp }
218216
rw [← e.map_measurableEquiv_injective.eq_iff]
219217
refine ext_of_integral_prod_mul_prod_boundedContinuousFunction fun f g ↦ ?_
220218
rw [integral_map_equiv, integral_map_equiv]
@@ -233,10 +231,7 @@ lemma ext_of_integral_mul_prod_boundedContinuousFunction {μ ν : Measure (Z ×
233231
(h : ∀ (f : Z →ᵇ ℝ) (g : (j : κ) → Y j →ᵇ ℝ),
234232
∫ p, f p.1 * ∏ j, g j (p.2 j) ∂μ = ∫ p, f p.1 * ∏ j, g j (p.2 j) ∂ν) :
235233
μ = ν := by
236-
let e : (Z × (Π i, Y i)) ≃ᵐ ((Π i, Y i) × Z) :=
237-
{ toEquiv := Equiv.prodComm _ _
238-
measurable_toFun := measurable_swap
239-
measurable_invFun := measurable_swap }
234+
let e : (Z × (Π i, Y i)) ≃ᵐ ((Π i, Y i) × Z) := .prodComm
240235
rw [← e.map_measurableEquiv_injective.eq_iff]
241236
refine ext_of_integral_prod_mul_boundedContinuousFunction fun f g ↦ ?_
242237
rw [integral_map_equiv, integral_map_equiv]
@@ -258,12 +253,7 @@ lemma ext_of_integral_mul_boundedContinuousFunction {μ ν : Measure (Z × T)}
258253
(h : ∀ (f : Z →ᵇ ℝ) (g : T →ᵇ ℝ), ∫ p, f p.1 * g p.2 ∂μ = ∫ p, f p.1 * g p.2 ∂ν) :
259254
μ = ν := by
260255
let e : (Z × T) ≃ᵐ ((Unit → Z) × (Unit → T)) :=
261-
{ toFun p := ⟨fun _ ↦ p.1, fun _ ↦ p.2
262-
invFun p := ⟨p.1 (), p.2 ()⟩
263-
left_inv p := by simp
264-
right_inv p := by simp
265-
measurable_toFun := by simp; fun_prop
266-
measurable_invFun := by simp; fun_prop }
256+
.symm <| .prodCongr (.funUnique ..) (.funUnique ..)
267257
rw [← e.map_measurableEquiv_injective.eq_iff]
268258
refine ext_of_integral_prod_mul_prod_boundedContinuousFunction fun f g ↦ ?_
269259
rw [integral_map_equiv, integral_map_equiv]

Mathlib/Probability/Kernel/IonescuTulcea/Maps.lean

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ def IicProdIoc {a b : ι} (hab : a ≤ b) :
107107
by_cases h : x ≤ a
108108
· simpa [h] using measurable_fst.eval
109109
· simpa [h] using measurable_snd.eval
110-
measurable_invFun := by dsimp; fun_prop
111110

112111
lemma coe_IicProdIoc {a b : ι} (hab : a ≤ b) :
113112
⇑(IicProdIoc (X := X) hab) = _root_.IicProdIoc a b := rfl
@@ -134,7 +133,6 @@ def IicProdIoi (a : ι) :
134133
by_cases hi : i ≤ a <;> simp only [Equiv.coe_fn_mk, hi, ↓reduceDIte]
135134
· exact measurable_fst.eval
136135
· exact measurable_snd.eval
137-
measurable_invFun := Measurable.prodMk (measurable_restrict _) (Set.measurable_restrict _)
138136

139137
end MeasurableEquiv
140138

@@ -154,7 +152,6 @@ def MeasurableEquiv.piSingleton (a : ℕ) : X (a + 1) ≃ᵐ Π i : Ioc a (a + 1
154152
simp_rw [eqRec_eq_cast]
155153
refine measurable_pi_lambda _ (fun i ↦ (MeasurableEquiv.cast _ ?_).measurable)
156154
cases Nat.mem_Ioc_succ' i; rfl
157-
measurable_invFun := measurable_pi_apply _
158155

159156
end Nat
160157

0 commit comments

Comments
 (0)