# Documentation

Mathlib.MeasureTheory.Measure.Haar.Basic

# Haar measure #

In this file we prove the existence and uniqueness (up to scalar multiples) of Haar measure for a locally compact Hausdorff topological group.

For the construction, we follow the write-up by Jonathan Gleason, Existence and Uniqueness of Haar Measure. This is essentially the same argument as in https://en.wikipedia.org/wiki/Haar_measure#A_construction_using_compact_subsets.

We construct the Haar measure first on compact sets. For this we define (K : U) as the (smallest) number of left-translates of U that are needed to cover K (index in the formalization). Then we define a function h on compact sets as lim_U (K : U) / (K₀ : U), where U becomes a smaller and smaller open neighborhood of 1, and K₀ is a fixed compact set with nonempty interior. This function is chaar in the formalization, and we define the limit formally using Tychonoff's theorem.

This function h forms a content, which we can extend to an outer measure and then a measure (haarMeasure). We normalize the Haar measure so that the measure of K₀ is 1. We show that for second countable spaces any left invariant Borel measure is a scalar multiple of the Haar measure.

Note that μ need not coincide with h on compact sets, according to [halmos1950measure, ch. X, §53 p.233]. However, we know that h(K) lies between μ(Kᵒ) and μ(K), where ᵒ denotes the interior.

## Main Declarations #

• haarMeasure: the Haar measure on a locally compact Hausdorff group. This is a left invariant regular measure. It takes as argument a compact set of the group (with non-empty interior), and is normalized so that the measure of the given set is 1.
• haarMeasure_self: the Haar measure is normalized.
• isMulLeftInvariant_haarMeasure: the Haar measure is left invariant.
• regular_haarMeasure: the Haar measure is a regular measure.
• isHaarMeasure_haarMeasure: the Haar measure satisfies the IsHaarMeasure typeclass, i.e., it is invariant and gives finite mass to compact sets and positive mass to nonempty open sets.
• haar : some choice of a Haar measure, on a locally compact Hausdorff group, constructed as haarMeasure K where K is some arbitrary choice of a compact set with nonempty interior.
• haarMeasure_unique: Every σ-finite left invariant measure on a locally compact Hausdorff group is a scalar multiple of the Haar measure.

## References #

• Paul Halmos (1950), Measure Theory, §53
• Jonathan Gleason, Existence and Uniqueness of Haar Measure
• Note: step 9, page 8 contains a mistake: the last defined μ does not extend the μ on compact sets, see Halmos (1950) p. 233, bottom of the page. This makes some other steps (like step 11) invalid.
• https://en.wikipedia.org/wiki/Haar_measure

We put the internal functions in the construction of the Haar measure in a namespace, so that the chosen names don't clash with other declarations. We first define a couple of the functions before proving the properties (that require that G is a topological group).

noncomputable def MeasureTheory.Measure.haar.addIndex {G : Type u_1} [] (K : Set G) (V : Set G) :

additive version of MeasureTheory.Measure.haar.index

Instances For
noncomputable def MeasureTheory.Measure.haar.index {G : Type u_1} [] (K : Set G) (V : Set G) :

The index or Haar covering number or ratio of K w.r.t. V, denoted (K : V): it is the smallest number of (left) translates of V that is necessary to cover K. It is defined to be 0 if no finite number of translates cover K.

Instances For
noncomputable def MeasureTheory.Measure.haar.addPrehaar {G : Type u_1} [] [] (K₀ : Set G) (U : Set G) (K : ) :

additive version of MeasureTheory.Measure.haar.prehaar

Instances For
noncomputable def MeasureTheory.Measure.haar.prehaar {G : Type u_1} [] [] (K₀ : Set G) (U : Set G) (K : ) :

prehaar K₀ U K is a weighted version of the index, defined as (K : U)/(K₀ : U). In the applications K₀ is compact with non-empty interior, U is open containing 1, and K is any compact set. The argument K is a (bundled) compact set, so that we can consider prehaar K₀ U as an element of haarProduct (below).

Instances For
theorem MeasureTheory.Measure.haar.addPrehaar_empty {G : Type u_1} [] [] {U : Set G} :
= 0
theorem MeasureTheory.Measure.haar.prehaar_empty {G : Type u_1} [] [] {U : Set G} :
= 0
theorem MeasureTheory.Measure.haar.addPrehaar_nonneg {G : Type u_1} [] [] {U : Set G} (K : ) :
0
theorem MeasureTheory.Measure.haar.prehaar_nonneg {G : Type u_1} [] [] {U : Set G} (K : ) :
0
def MeasureTheory.Measure.haar.addHaarProduct {G : Type u_1} [] [] (K₀ : Set G) :

additive version of MeasureTheory.Measure.haar.haarProduct

Instances For
def MeasureTheory.Measure.haar.haarProduct {G : Type u_1} [] [] (K₀ : Set G) :

haarProduct K₀ is the product of intervals [0, (K : K₀)], for all compact sets K. For all U, we can show that prehaar K₀ U ∈ haarProduct K₀.

Instances For
@[simp]
theorem MeasureTheory.Measure.haar.mem_addPrehaar_empty {G : Type u_1} [] [] {K₀ : Set G} {f : } :
∀ (K : ), f K Set.Icc 0 ↑()
@[simp]
theorem MeasureTheory.Measure.haar.mem_prehaar_empty {G : Type u_1} [] [] {K₀ : Set G} {f : } :
∀ (K : ), f K Set.Icc 0 ↑()
def MeasureTheory.Measure.haar.clAddPrehaar {G : Type u_1} [] [] (K₀ : Set G) (V : ) :

additive version of MeasureTheory.Measure.haar.clPrehaar

Instances For
def MeasureTheory.Measure.haar.clPrehaar {G : Type u_1} [] [] (K₀ : Set G) (V : ) :

The closure of the collection of elements of the form prehaar K₀ U, for U open neighbourhoods of 1, contained in V. The closure is taken in the space compacts G → ℝ, with the topology of pointwise convergence. We show that the intersection of all these sets is nonempty, and the Haar measure on compact sets is defined to be an element in the closure of this intersection.

Instances For

### Lemmas about index#

theorem MeasureTheory.Measure.haar.addIndex_defined {G : Type u_1} [] [] {K : Set G} {V : Set G} (hK : ) (hV : ) :
n, n Finset.card '' {t | K ⋃ (g : G) (_ : g t), (fun h => g + h) ⁻¹' V}

If K is compact and V has nonempty interior, then the index (K : V) is well-defined, there is a finite set t satisfying the desired properties.

theorem MeasureTheory.Measure.haar.index_defined {G : Type u_1} [] [] [] {K : Set G} {V : Set G} (hK : ) (hV : ) :
n, n Finset.card '' {t | K ⋃ (g : G) (_ : g t), (fun h => g * h) ⁻¹' V}

If K is compact and V has nonempty interior, then the index (K : V) is well-defined, there is a finite set t satisfying the desired properties.

theorem MeasureTheory.Measure.haar.addIndex_elim {G : Type u_1} [] [] {K : Set G} {V : Set G} (hK : ) (hV : ) :
t, K ⋃ (g : G) (_ : g t), (fun h => g + h) ⁻¹' V
theorem MeasureTheory.Measure.haar.index_elim {G : Type u_1} [] [] [] {K : Set G} {V : Set G} (hK : ) (hV : ) :
t, K ⋃ (g : G) (_ : g t), (fun h => g * h) ⁻¹' V
theorem MeasureTheory.Measure.haar.le_addIndex_mul {G : Type u_1} [] [] (K : ) {V : Set G} (hV : ) :
theorem MeasureTheory.Measure.haar.le_index_mul {G : Type u_1} [] [] [] (K : ) {V : Set G} (hV : ) :
theorem MeasureTheory.Measure.haar.addIndex_pos {G : Type u_1} [] [] {V : Set G} (hV : ) :
theorem MeasureTheory.Measure.haar.index_pos {G : Type u_1} [] [] [] {V : Set G} (hV : ) :
theorem MeasureTheory.Measure.haar.addIndex_mono {G : Type u_1} [] [] {K : Set G} {K' : Set G} {V : Set G} (hK' : ) (h : K K') (hV : ) :
theorem MeasureTheory.Measure.haar.index_mono {G : Type u_1} [] [] [] {K : Set G} {K' : Set G} {V : Set G} (hK' : ) (h : K K') (hV : ) :
theorem MeasureTheory.Measure.haar.addIndex_union_le {G : Type u_1} [] [] (K₁ : ) (K₂ : ) {V : Set G} (hV : ) :
theorem MeasureTheory.Measure.haar.index_union_le {G : Type u_1} [] [] [] (K₁ : ) (K₂ : ) {V : Set G} (hV : ) :
theorem MeasureTheory.Measure.haar.addIndex_union_eq {G : Type u_1} [] [] (K₁ : ) (K₂ : ) {V : Set G} (hV : ) (h : Disjoint (K₁.carrier + -V) (K₂.carrier + -V)) :
theorem MeasureTheory.Measure.haar.index_union_eq {G : Type u_1} [] [] [] (K₁ : ) (K₂ : ) {V : Set G} (hV : ) (h : Disjoint (K₁.carrier * V⁻¹) (K₂.carrier * V⁻¹)) :
theorem MeasureTheory.Measure.haar.add_left_addIndex_le {G : Type u_1} [] [] {K : Set G} (hK : ) {V : Set G} (hV : ) (g : G) :
theorem MeasureTheory.Measure.haar.mul_left_index_le {G : Type u_1} [] [] [] {K : Set G} (hK : ) {V : Set G} (hV : ) (g : G) :
theorem MeasureTheory.Measure.haar.is_left_invariant_addIndex {G : Type u_1} [] [] {K : Set G} (hK : ) (g : G) {V : Set G} (hV : ) :
theorem MeasureTheory.Measure.haar.is_left_invariant_index {G : Type u_1} [] [] [] {K : Set G} (hK : ) (g : G) {V : Set G} (hV : ) :
MeasureTheory.Measure.haar.index ((fun h => g * h) '' K) V =

### Lemmas about prehaar#

theorem MeasureTheory.Measure.haar.add_prehaar_le_addIndex {G : Type u_1} [] [] {U : Set G} (K : ) (hU : ) :
↑()
theorem MeasureTheory.Measure.haar.prehaar_le_index {G : Type u_1} [] [] [] {U : Set G} (K : ) (hU : ) :
↑()
theorem MeasureTheory.Measure.haar.addPrehaar_pos {G : Type u_1} [] [] {U : Set G} (hU : ) {K : Set G} (h1K : ) (h2K : ) :
0 < MeasureTheory.Measure.haar.addPrehaar (K₀) U { carrier := K, isCompact' := h1K }
theorem MeasureTheory.Measure.haar.prehaar_pos {G : Type u_1} [] [] [] {U : Set G} (hU : ) {K : Set G} (h1K : ) (h2K : ) :
0 < MeasureTheory.Measure.haar.prehaar (K₀) U { carrier := K, isCompact' := h1K }
theorem MeasureTheory.Measure.haar.addPrehaar_mono {G : Type u_1} [] [] {U : Set G} (hU : ) {K₁ : } {K₂ : } (h : K₁ K₂.carrier) :
theorem MeasureTheory.Measure.haar.prehaar_mono {G : Type u_1} [] [] [] {U : Set G} (hU : ) {K₁ : } {K₂ : } (h : K₁ K₂.carrier) :
theorem MeasureTheory.Measure.haar.addPrehaar_self {G : Type u_1} [] [] {U : Set G} (hU : ) :
MeasureTheory.Measure.haar.addPrehaar (K₀) U K₀.toCompacts = 1
theorem MeasureTheory.Measure.haar.prehaar_self {G : Type u_1} [] [] [] {U : Set G} (hU : ) :
MeasureTheory.Measure.haar.prehaar (K₀) U K₀.toCompacts = 1
theorem MeasureTheory.Measure.haar.addPrehaar_sup_le {G : Type u_1} [] [] {U : Set G} (K₁ : ) (K₂ : ) (hU : ) :
theorem MeasureTheory.Measure.haar.prehaar_sup_le {G : Type u_1} [] [] [] {U : Set G} (K₁ : ) (K₂ : ) (hU : ) :
MeasureTheory.Measure.haar.prehaar (K₀) U (K₁ K₂) +
theorem MeasureTheory.Measure.haar.addPrehaar_sup_eq {G : Type u_1} [] [] {U : Set G} {K₁ : } {K₂ : } (hU : ) (h : Disjoint (K₁.carrier + -U) (K₂.carrier + -U)) :
MeasureTheory.Measure.haar.addPrehaar (K₀) U (K₁ K₂) = +
theorem MeasureTheory.Measure.haar.prehaar_sup_eq {G : Type u_1} [] [] [] {U : Set G} {K₁ : } {K₂ : } (hU : ) (h : Disjoint (K₁.carrier * U⁻¹) (K₂.carrier * U⁻¹)) :
MeasureTheory.Measure.haar.prehaar (K₀) U (K₁ K₂) = +
theorem MeasureTheory.Measure.haar.is_left_invariant_addPrehaar {G : Type u_1} [] [] {U : Set G} (hU : ) (g : G) (K : ) :
MeasureTheory.Measure.haar.addPrehaar (K₀) U (TopologicalSpace.Compacts.map (fun b => g + b) (_ : Continuous fun b => g + b) K) =
theorem MeasureTheory.Measure.haar.is_left_invariant_prehaar {G : Type u_1} [] [] [] {U : Set G} (hU : ) (g : G) (K : ) :
MeasureTheory.Measure.haar.prehaar (K₀) U (TopologicalSpace.Compacts.map (fun b => g * b) (_ : Continuous fun b => g * b) K) =

### Lemmas about haarProduct#

theorem MeasureTheory.Measure.haar.prehaar_mem_haarProduct {G : Type u_1} [] [] [] {U : Set G} (hU : ) :

### Lemmas about chaar#

noncomputable def MeasureTheory.Measure.haar.addCHaar {G : Type u_1} [] [] (K : ) :

additive version of MeasureTheory.Measure.haar.chaar

Instances For
noncomputable def MeasureTheory.Measure.haar.chaar {G : Type u_1} [] [] [] (K : ) :

This is the "limit" of prehaar K₀ U K as U becomes a smaller and smaller open neighborhood of (1 : G). More precisely, it is defined to be an arbitrary element in the intersection of all the sets clPrehaar K₀ V in haarProduct K₀. This is roughly equal to the Haar measure on compact sets, but it can differ slightly. We do know that haarMeasure K₀ (interior K) ≤ chaar K₀ K ≤ haarMeasure K₀ K.

Instances For
theorem MeasureTheory.Measure.haar.chaar_nonneg {G : Type u_1} [] [] [] (K : ) :
theorem MeasureTheory.Measure.haar.chaar_self {G : Type u_1} [] [] [] :
MeasureTheory.Measure.haar.chaar K₀ K₀.toCompacts = 1
theorem MeasureTheory.Measure.haar.addCHaar_mono {G : Type u_1} [] [] {K₁ : } {K₂ : } (h : K₁ K₂) :
theorem MeasureTheory.Measure.haar.chaar_mono {G : Type u_1} [] [] [] {K₁ : } {K₂ : } (h : K₁ K₂) :
theorem MeasureTheory.Measure.haar.addCHaar_sup_le {G : Type u_1} [] [] (K₁ : ) (K₂ : ) :
theorem MeasureTheory.Measure.haar.chaar_sup_le {G : Type u_1} [] [] [] (K₁ : ) (K₂ : ) :
theorem MeasureTheory.Measure.haar.addCHaar_sup_eq {G : Type u_1} [] [] [] {K₁ : } {K₂ : } (h : Disjoint K₁.carrier K₂.carrier) :
theorem MeasureTheory.Measure.haar.chaar_sup_eq {G : Type u_1} [] [] [] [] {K₁ : } {K₂ : } (h : Disjoint K₁.carrier K₂.carrier) :
theorem MeasureTheory.Measure.haar.is_left_invariant_chaar {G : Type u_1} [] [] [] (g : G) (K : ) :
theorem MeasureTheory.Measure.haar.addHaarContent.proof_3 {G : Type u_1} [] [] (K₁ : ) (K₂ : ) :
(fun K => { val := , property := (_ : ) }) (K₁ K₂) (fun K => { val := , property := (_ : ) }) K₁ + (fun K => { val := , property := (_ : ) }) K₂
theorem MeasureTheory.Measure.haar.addHaarContent.proof_2 {G : Type u_1} [] [] [] (K₁ : ) (K₂ : ) (h : Disjoint K₁ K₂) :
(fun K => { val := , property := (_ : ) }) (K₁ K₂) = (fun K => { val := , property := (_ : ) }) K₁ + (fun K => { val := , property := (_ : ) }) K₂
theorem MeasureTheory.Measure.haar.addHaarContent.proof_1 {G : Type u_1} [] [] (K₁ : ) (K₂ : ) (h : K₁ K₂) :
{ val := , property := (_ : ) } { val := , property := (_ : ) }
noncomputable def MeasureTheory.Measure.haar.addHaarContent {G : Type u_1} [] [] [] :

additive version of MeasureTheory.Measure.haar.haarContent

Instances For
noncomputable def MeasureTheory.Measure.haar.haarContent {G : Type u_1} [] [] [] [] :

The function chaar interpreted in ℝ≥0, as a content

Instances For

We only prove the properties for haarContent that we use at least twice below.

theorem MeasureTheory.Measure.haar.addHaarContent_apply {G : Type u_1} [] [] [] (K : ) :
(fun s => ) K = ↑(let_fun this := { val := , property := (_ : ) }; this)
theorem MeasureTheory.Measure.haar.haarContent_apply {G : Type u_1} [] [] [] [] (K : ) :
(fun s => ) K = ↑(let_fun this := { val := , property := (_ : ) }; this)
theorem MeasureTheory.Measure.haar.addHaarContent_self {G : Type u_1} [] [] [] :
(fun s => ) K₀.toCompacts = 1

The variant of addCHaar_self for addHaarContent.

theorem MeasureTheory.Measure.haar.haarContent_self {G : Type u_1} [] [] [] [] :
(fun s => ) K₀.toCompacts = 1

The variant of chaar_self for haarContent

theorem MeasureTheory.Measure.haar.is_left_invariant_addHaarContent {G : Type u_1} [] [] [] (g : G) (K : ) :
(fun s => ) (TopologicalSpace.Compacts.map (fun b => g + b) (_ : Continuous fun b => g + b) K) = (fun s => ) K

The variant of is_left_invariant_addCHaar for addHaarContent

theorem MeasureTheory.Measure.haar.is_left_invariant_haarContent {G : Type u_1} [] [] [] [] (g : G) (K : ) :
(fun s => ) (TopologicalSpace.Compacts.map (fun b => g * b) (_ : Continuous fun b => g * b) K) = (fun s => ) K

The variant of is_left_invariant_chaar for haarContent

### The Haar measure #

noncomputable def MeasureTheory.Measure.addHaarMeasure {G : Type u_1} [] [] [] [] [] :

The Haar measure on the locally compact additive group G, scaled so that addHaarMeasure K₀ K₀ = 1.

Instances For
noncomputable def MeasureTheory.Measure.haarMeasure {G : Type u_1} [] [] [] [] [] [] :

The Haar measure on the locally compact group G, scaled so that haarMeasure K₀ K₀ = 1.

Instances For
theorem MeasureTheory.Measure.addHaarMeasure_apply {G : Type u_1} [] [] [] [] [] {s : Set G} (hs : ) :
theorem MeasureTheory.Measure.haarMeasure_apply {G : Type u_1} [] [] [] [] [] [] {s : Set G} (hs : ) :
theorem MeasureTheory.Measure.addHaarMeasure_self {G : Type u_1} [] [] [] [] [] :
K₀ = 1
theorem MeasureTheory.Measure.haarMeasure_self {G : Type u_1} [] [] [] [] [] [] :
K₀ = 1
instance MeasureTheory.Measure.regular_addHaarMeasure {G : Type u_1} [] [] [] [] [] :

The additive Haar measure is regular.

instance MeasureTheory.Measure.regular_haarMeasure {G : Type u_1} [] [] [] [] [] [] :

The Haar measure is regular.

The additive Haar measure is sigma-finite in a second countable group.

The Haar measure is sigma-finite in a second countable group.

The additive Haar measure is an additive Haar measure, i.e., it is invariant and gives finite mass to compact sets and positive mass to nonempty open sets.

instance MeasureTheory.Measure.isHaarMeasure_haarMeasure {G : Type u_1} [] [] [] [] [] [] :

The Haar measure is a Haar measure, i.e., it is invariant and gives finite mass to compact sets and positive mass to nonempty open sets.

@[reducible]
noncomputable def MeasureTheory.Measure.addHaar {G : Type u_1} [] [] [] [] [] :

addHaar is some choice of a Haar measure, on a locally compact additive group.

Instances For
@[reducible]
noncomputable def MeasureTheory.Measure.haar {G : Type u_1} [] [] [] [] [] [] :

haar is some choice of a Haar measure, on a locally compact group.

Instances For
theorem MeasureTheory.Measure.addHaarMeasure_unique {G : Type u_1} [] [] [] [] [] (μ : ) :
μ = μ K₀

The additive Haar measure is unique up to scaling. More precisely: every σ-finite left invariant measure is a scalar multiple of the additive Haar measure. This is slightly weaker than assuming that μ is an additive Haar measure (in particular we don't require μ ≠ 0).

theorem MeasureTheory.Measure.haarMeasure_unique {G : Type u_1} [] [] [] [] [] [] (μ : ) :
μ = μ K₀

The Haar measure is unique up to scaling. More precisely: every σ-finite left invariant measure is a scalar multiple of the Haar measure. This is slightly weaker than assuming that μ is a Haar measure (in particular we don't require μ ≠ 0).

theorem MeasureTheory.Measure.addHaarMeasure_eq_iff {G : Type u_1} [] [] [] [] [] (μ : ) :
μ K₀ = 1
theorem MeasureTheory.Measure.haarMeasure_eq_iff {G : Type u_1} [] [] [] [] [] [] (μ : ) :
μ K₀ = 1

Let μ be a σ-finite left invariant measure on G. Then μ is equal to the Haar measure defined by K₀ iff μ K₀ = 1.

theorem MeasureTheory.Measure.regular_of_isAddLeftInvariant {G : Type u_1} [] [] [] [] [] {μ : } {K : Set G} (hK : ) (h2K : ) (hμK : μ K ) :

To show that an invariant σ-finite measure is regular it is sufficient to show that it is finite on some compact set with non-empty interior.

theorem MeasureTheory.Measure.regular_of_isMulLeftInvariant {G : Type u_1} [] [] [] [] [] [] {μ : } {K : Set G} (hK : ) (h2K : ) (hμK : μ K ) :

To show that an invariant σ-finite measure is regular it is sufficient to show that it is finite on some compact set with non-empty interior.

theorem MeasureTheory.Measure.isAddHaarMeasure_eq_smul_isAddHaarMeasure {G : Type u_1} [] [] [] [] [] (μ : ) (ν : ) :
c, c 0 c μ = c ν
theorem MeasureTheory.Measure.isHaarMeasure_eq_smul_isHaarMeasure {G : Type u_1} [] [] [] [] [] [] (μ : ) (ν : ) :
c, c 0 c μ = c ν

An invariant measure is absolutely continuous with respect to an additive Haar measure.

An invariant measure is absolutely continuous with respect to a Haar measure.

theorem MeasureTheory.Measure.sub_mem_nhds_zero_of_addHaar_pos {G : Type u_1} [] [] [] [] [] (μ : ) (E : Set G) (hE : ) (hEpos : 0 < μ E) :
E - E nhds 0

Steinhaus Theorem In any locally compact group G with a haar measure μ, for any measurable set E of positive measure, the set E - E is a neighbourhood of 0.

theorem MeasureTheory.Measure.div_mem_nhds_one_of_haar_pos {G : Type u_1} [] [] [] [] [] [] (μ : ) (E : Set G) (hE : ) (hEpos : 0 < μ E) :
E / E nhds 1

Steinhaus Theorem In any locally compact group G with a haar measure μ, for any measurable set E of positive measure, the set E / E is a neighbourhood of 1.

Any additive Haar measure is invariant under negation in an abelian group.

Any Haar measure is invariant under inversion in an abelian group.

theorem MeasureTheory.Measure.measurePreserving_zsmul {G : Type u_1} [] [] [] [] [] (μ : ) [] [] {n : } (hn : n 0) :
theorem MeasureTheory.Measure.measurePreserving_zpow {G : Type u_1} [] [] [] [] [] [] (μ : ) [] [] {n : } (hn : n 0) :
theorem MeasureTheory.Measure.MeasurePreserving.zsmul {G : Type u_1} [] [] [] [] [] (μ : ) [] [] {n : } (hn : n 0) {X : Type u_2} [] {μ' : } {f : XG} (hf : ) :
theorem MeasureTheory.Measure.MeasurePreserving.zpow {G : Type u_1} [] [] [] [] [] [] (μ : ) [] [] {n : } (hn : n 0) {X : Type u_2} [] {μ' : } {f : XG} (hf : ) :