ProCGroups.FreeProC.Basic

94 Theorem | 28 Definition | 1 Abbreviation | 4 Structure | 3 Class | 1 Instance

This module proves the universal-property part of the construction. It packages finite-stage data into completed maps and shows the required extension and uniqueness statements.

import
Imported by

Declarations

structure IsFreeProCGroup
    {X : Type u} [TopologicalSpace X]
    {F : Type u} [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    (ι : X → F) : Prop where
  isProC : ProC (G := F)
  continuous_ι : Continuous ι
  generates_range : Generation.TopologicallyGenerates (G := F) (Set.range ι)
  existsUnique_lift :
    ∀ {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G],
      ProC (G := G) →
      ∀ (φ : X → G), Continuous φ →
        ∃! f : F →* G, Continuous f ∧ ∀ x, f (ι x) = φ x

Free pro-\(C\) groups via a strengthened universal property. The lifting property quantifies over all continuous maps into pro-\(C\) groups, rather than only maps whose image generates the target.

def IsFreeProCGroupOfRank
    (ProC : ProCGroups.ProC.ProCGroupPredicate.{u})
    (F : Type u) [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    (κ : Cardinal.{u}) : Prop :=
  ∃ X : Type u, ∃ _ : TopologicalSpace X,
    Cardinal.mk X = κ ∧
      ∃ ι : X → F, IsFreeProCGroup (ProC := ProC) ι

A free pro-\(C\) group of rank \(\kappa\), formulated with the existing universal-property interface.

def IsFreeProCGroupOfClassRank
    (C : ProCGroups.FiniteGroupClass.{u})
    (F : Type u) [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    (κ : Cardinal.{u}) : Prop :=
  IsFreeProCGroupOfRank
    (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) F κ

Concrete finite-class specialization of IsFreeProCGroupOfRank.

noncomputable def lift (hι : IsFreeProCGroup (ProC := ProC) ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G)) (φ : X → G)
    (hφ : Continuous φ) : F →* G :=
  Classical.choose (ExistsUnique.exists (hι.existsUnique_lift hG φ hφ))

A map from the chosen generators into a pro-\(C\) target extends to the corresponding continuous homomorphism from the free pro-\(C\) group.

theorem lift_spec (hι : IsFreeProCGroup (ProC := ProC) ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G)) (φ : X → G)
    (hφ : Continuous φ) :
    Continuous (hι.lift hG φ hφ) ∧ ∀ x, hι.lift hG φ hφ (ι x) = φ x

The universal-property lift has the prescribed values on the chosen generators.

Show proof
theorem lift_unique (hι : IsFreeProCGroup (ProC := ProC) ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G)) (φ : X → G)
    (hφ : Continuous φ)
    {f : F →* G} (hf : Continuous f) (hfac : ∀ x, f (ι x) = φ x) :
    f = hι.lift hG φ hφ

The universal-property lift is unique among continuous maps with the prescribed values.

Show proof
noncomputable def liftHom (hι : IsFreeProCGroup (ProC := ProC) ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G)) (φ : X → G)
    (hφ : Continuous φ) : F →ₜ* G where
  toMonoidHom := hι.lift hG φ hφ
  continuous_toFun := (hι.lift_spec hG φ hφ).1

The universal-property lift bundled as a continuous monoid homomorphism.

@[simp] theorem liftHom_toMonoidHom (hι : IsFreeProCGroup (ProC := ProC) ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G)) (φ : X → G)
    (hφ : Continuous φ) :
    (hι.liftHom hG φ hφ).toMonoidHom = hι.lift hG φ hφ

Forgetting continuity from liftHom gives the underlying universal-property lift.

Show proof
@[simp] theorem liftHom_apply (hι : IsFreeProCGroup (ProC := ProC) ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G)) (φ : X → G)
    (hφ : Continuous φ) (x : X) :
    hι.liftHom hG φ hφ (ι x) = φ x

The lift homomorphism from a free pro-\(C\) group evaluates according to the chosen generator map.

Show proof
theorem liftHom_unique (hι : IsFreeProCGroup (ProC := ProC) ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G)) (φ : X → G)
    (hφ : Continuous φ)
    {f : F →ₜ* G} (hfac : ∀ x, f (ι x) = φ x) :
    f = hι.liftHom hG φ hφ

The lift homomorphism is uniquely determined by its values on the generators.

Show proof
theorem hom_ext (hι : IsFreeProCGroup (ProC := ProC) ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G))
    {f g : F →* G} (hf : Continuous f) (hg : Continuous g)
    (hfg : ∀ x, f (ι x) = g (ι x)) :
    f = g

Continuous homomorphisms out of a free pro-\(C\) group are determined by their values on the chosen generators.

Show proof
theorem lift_eq_of_forall (hι : IsFreeProCGroup (ProC := ProC) ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G))
    {φ ψ : X → G} (hφ : Continuous φ) (hψ : Continuous ψ)
    (h : ∀ x, φ x = ψ x) :
    hι.lift hG φ hφ = hι.lift hG ψ hψ

Two universal-property lifts are equal when they agree on all generators.

Show proof
@[simp] theorem lift_id (hι : IsFreeProCGroup (ProC := ProC) ι) :
    hι.lift hι.isProC ι hι.continuous_ι = MonoidHom.id F

The lift of the canonical generator map to the same free pro-\(C\) group is the identity.

Show proof
theorem endomorphism_eq_id (hι : IsFreeProCGroup (ProC := ProC) ι)
    {f : F →* F} (hf : Continuous f) (hfac : ∀ x, f (ι x) = ι x) :
    f = MonoidHom.id F

An endomorphism of a free pro-\(C\) group fixing the generators is the identity.

Show proof
theorem lift_comp (hι : IsFreeProCGroup (ProC := ProC) ι)
    {G H : Type u}
    [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    [Group H] [TopologicalSpace H] [IsTopologicalGroup H]
    (hG : ProC (G := G))
    (hH : ProC (G := H))
    (φ : X → G) (hφ : Continuous φ)
    (ψ : G →* H) (hψ : Continuous ψ) :
    ψ.comp (hι.lift hG φ hφ) =
      hι.lift hH (fun x => ψ (φ x)) (hψ.comp hφ)

Composition of free pro-\(C\) lifts is again the lift of the composed generator map.

Show proof
noncomputable def liftMorphism (hι : IsFreeProCGroup (ProC := ProC) ι)
    [ProCGroups.ProC.ProCGroup ProC F]
    (G : ProCGrp ProC) (φ : X → G) (hφ : Continuous φ) :
    ProCGrp.of ProC F ⟶ G :=
  CategoryTheory.ConcreteCategory.ofHom
    (C := ProCGrp ProC)
    (hι.liftHom (inferInstanceAs (ProCGroups.ProC.ProCGroup ProC G)).isProC φ hφ)

The lift as a morphism in the bundled category ProCGrp.

@[simp] theorem liftMorphism_apply (hι : IsFreeProCGroup (ProC := ProC) ι)
    [ProCGroups.ProC.ProCGroup ProC F]
    (G : ProCGrp ProC) (φ : X → G) (hφ : Continuous φ) (x : X) :
    hι.liftMorphism G φ hφ (ι x) = φ x

The universal lift evaluates on generators according to the prescribed generating map.

Show proof
theorem liftMorphism_unique (hι : IsFreeProCGroup (ProC := ProC) ι)
    [ProCGroups.ProC.ProCGroup ProC F]
    (G : ProCGrp ProC) (φ : X → G) (hφ : Continuous φ)
    {f : ProCGrp.of ProC F ⟶ G} (hfac : ∀ x, f (ι x) = φ x) :
    f = hι.liftMorphism G φ hφ

The categorical lift morphism is uniquely determined by its values on the generators.

Show proof
theorem morphism_ext (hι : IsFreeProCGroup (ProC := ProC) ι)
    [ProCGroups.ProC.ProCGroup ProC F]
    {G : ProCGrp ProC} {f g : ProCGrp.of ProC F ⟶ G}
    (hfg : ∀ x, f (ι x) = g (ι x)) :
    f = g

Extensionality for morphisms out of a free pro-\(C\) group by checking generators.

Show proof
theorem precompHomeomorph
    {X' : Type u} [TopologicalSpace X']
    (hι : IsFreeProCGroup (ProC := ProC) ι) (e : X' ≃ₜ X) :
    IsFreeProCGroup (ProC := ProC) (fun x : X' => ι (e x))

Precomposing the basis by a homeomorphism preserves the free pro-\(C\) universal property.

Show proof
noncomputable def continuousMulEquivOfSameBasis
    {F' : Type u} [Group F'] [TopologicalSpace F'] [IsTopologicalGroup F']
    {κ : X → F'}
    (hι : IsFreeProCGroup (ProC := ProC) ι)
    (hκ : IsFreeProCGroup (ProC := ProC) κ) :
    F ≃ₜ* F' :=
  let f : F →* F' := hι.lift hκ.isProC κ hκ.continuous_ι
  let g : F' →* F := hκ.lift hι.isProC ι hι.continuous_ι
  let hf : Continuous f := (hι.lift_spec hκ.isProC κ hκ.continuous_ι).1
  let hg : Continuous g := (hκ.lift_spec hι.isProC ι hι.continuous_ι).1
  { toMulEquiv :=
      { toFun := f
        invFun := g
        left_inv := by
          intro y
          have hgf : g.comp f = MonoidHom.id F := by
            apply hι.endomorphism_eq_id (hg.comp hf)
            intro x
            dsimp [f, g]
            rw [(hι.lift_spec hκ.isProC κ hκ.continuous_ι).2 x]
            exact (hκ.lift_spec hι.isProC ι hι.continuous_ι).2 x
          exact congrArg (fun h : F →* F => h y) hgf
        right_inv := by
          intro y
          have hfg : f.comp g = MonoidHom.id F' := by
            apply hκ.endomorphism_eq_id (hf.comp hg)
            intro x
            dsimp [f, g]
            rw [(hκ.lift_spec hι.isProC ι hι.continuous_ι).2 x]
            exact (hι.lift_spec hκ.isProC κ hκ.continuous_ι).2 x
          exact congrArg (fun h : F' →* F' => h y) hfg
        map_mul' := f.map_mul }
    continuous_toFun := hf
    continuous_invFun := hg }

The canonical multiplicative homeomorphism between two free pro-\(C\) groups on the same basis.

@[simp 900] theorem continuousMulEquivOfSameBasis_apply
    {F' : Type u} [Group F'] [TopologicalSpace F'] [IsTopologicalGroup F']
    {κ : X → F'}
    (hι : IsFreeProCGroup (ProC := ProC) ι)
    (hκ : IsFreeProCGroup (ProC := ProC) κ) (x : X) :
    hι.continuousMulEquivOfSameBasis hκ (ι x) = κ x

The same-basis continuous equivalence evaluates as the identity on the chosen basis values.

Show proof
@[simp 900] theorem continuousMulEquivOfSameBasis_symm_apply
    {F' : Type u} [Group F'] [TopologicalSpace F'] [IsTopologicalGroup F']
    {κ : X → F'}
    (hι : IsFreeProCGroup (ProC := ProC) ι)
    (hκ : IsFreeProCGroup (ProC := ProC) κ) (x : X) :
    (hι.continuousMulEquivOfSameBasis hκ).symm (κ x) = ι x

The inverse comparison equivalence is evaluated by the same coordinate data, read in the opposite direction.

Show proof
noncomputable def continuousMulEquivOfBasisHomeomorph
    (hι : IsFreeProCGroup (ProC := ProC) ι) (e : X ≃ₜ X) :
    F ≃ₜ* F :=
  hι.continuousMulEquivOfSameBasis (hι.precompHomeomorph e)

A homeomorphism of the basis extends to a continuous multiplicative automorphism of the free pro-\(C\) group. This is the homeomorphism-valued core used in Ribes--Zalesskii, Exercise 5.6.2(d).

@[simp 900] theorem continuousMulEquivOfBasisHomeomorph_apply
    (hι : IsFreeProCGroup (ProC := ProC) ι) (e : X ≃ₜ X) (x : X) :
    hι.continuousMulEquivOfBasisHomeomorph e (ι x) = ι (e x)

The basis-homeomorphism equivalence is evaluated by applying the homeomorphism to basis values.

Show proof
@[simp 900] theorem continuousMulEquivOfBasisHomeomorph_symm_apply
    (hι : IsFreeProCGroup (ProC := ProC) ι) (e : X ≃ₜ X) (x : X) :
    (hι.continuousMulEquivOfBasisHomeomorph e).symm (ι x) = ι (e.symm x)

The inverse comparison equivalence is evaluated by the same coordinate data, read in the opposite direction.

Show proof
def mulActionHomeomorph
    (A : Type v) (X : Type u) [Group A] [TopologicalSpace A] [TopologicalSpace X]
    [MulAction A X] [ContinuousSMul A X] (a : A) : X ≃ₜ X where
  toEquiv :=
    { toFun := fun x => a • x
      invFun := fun x => a⁻¹ • x
      left_inv := by
        intro x
        calc
          a⁻¹ • (a • x) = (a⁻¹ * a) • x := by rw [mul_smul]
          _ = x := by simp only [inv_mul_cancel, one_smul]
      right_inv := by
        intro x
        calc
          a • (a⁻¹ • x) = (a * a⁻¹) • x := by rw [mul_smul]
          _ = x := by simp only [mul_inv_cancel, one_smul]}
  continuous_toFun := (continuous_const : Continuous fun _ : X => a).smul continuous_id
  continuous_invFun := (continuous_const : Continuous fun _ : X => a⁻¹).smul continuous_id

The homeomorphism of a topological \(A\)-space induced by one group element.

@[simp 900] theorem mulActionHomeomorph_apply
    (A : Type v) (X : Type u) [Group A] [TopologicalSpace A] [TopologicalSpace X]
    [MulAction A X] [ContinuousSMul A X] (a : A) (x : X) :
    mulActionHomeomorph A X a x = a • x

The homeomorphism induced by the multiplication action is evaluated by applying the corresponding action map.

Show proof
@[simp 900] theorem mulActionHomeomorph_symm_apply
    (A : Type v) (X : Type u) [Group A] [TopologicalSpace A] [TopologicalSpace X]
    [MulAction A X] [ContinuousSMul A X] (a : A) (x : X) :
    (mulActionHomeomorph A X a).symm x = a⁻¹ • x

The inverse pro-\(C\) homeomorphism is evaluated by the inverse coordinate transformation on finite quotients.

Show proof
noncomputable def basisActionContinuousMulEquiv
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    (hι : IsFreeProCGroup (ProC := ProC) ι) (a : A) :
    F ≃ₜ* F :=
  hι.continuousMulEquivOfBasisHomeomorph (mulActionHomeomorph A X a)

A continuous action on the basis extends elementwise to continuous multiplicative automorphisms of the free pro-\(C\) group. This packages the automorphism-valued part of Ribes--Zalesskii, Exercise 5.6.2(d); the joint continuity of the resulting action is a separate finite-quotient argument.

@[simp 900] theorem basisActionContinuousMulEquiv_apply
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    (hι : IsFreeProCGroup (ProC := ProC) ι) (a : A) (x : X) :
    hι.basisActionContinuousMulEquiv a (ι x) = ι (a • x)

The basis-action equivalence is evaluated by transporting each basis generator to its prescribed image.

Show proof
@[simp 900] theorem basisActionContinuousMulEquiv_symm_apply
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    (hι : IsFreeProCGroup (ProC := ProC) ι) (a : A) (x : X) :
    (hι.basisActionContinuousMulEquiv a).symm (ι x) = ι (a⁻¹ • x)

The inverse comparison equivalence is evaluated by the same coordinate data, read in the opposite direction.

Show proof
noncomputable def basisActionMulAutHom
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    (hι : IsFreeProCGroup (ProC := ProC) ι) :
    A →* MulAut F where
  toFun a := (hι.basisActionContinuousMulEquiv a).toMulEquiv
  map_one' := by
    ext y
    have hhom :
        (hι.basisActionContinuousMulEquiv (1 : A)).toMulEquiv.toMonoidHom =
          MonoidHom.id F := by
      apply hι.hom_ext hι.isProC
        (hι.basisActionContinuousMulEquiv (1 : A)).continuous_toFun
        continuous_id
      intro x
      simp only [mulActionHomeomorph_apply, one_smul, lift_id, MonoidHom.id_apply]
    exact congrArg (fun f : F →* F => f y) hhom
  map_mul' := by
    intro a b
    ext y
    have hcontComp :
        Continuous fun y : F =>
          hι.basisActionContinuousMulEquiv a (hι.basisActionContinuousMulEquiv b y) :=
      (hι.basisActionContinuousMulEquiv a).continuous_toFun.comp
        (hι.basisActionContinuousMulEquiv b).continuous_toFun
    have hhom :
        (hι.basisActionContinuousMulEquiv (a * b)).toMulEquiv.toMonoidHom =
          ((hι.basisActionContinuousMulEquiv a).toMulEquiv.toMonoidHom).comp
            ((hι.basisActionContinuousMulEquiv b).toMulEquiv.toMonoidHom) := by
      apply hι.hom_ext hι.isProC
        (hι.basisActionContinuousMulEquiv (a * b)).continuous_toFun
        hcontComp
      intro x
      calc
        hι.basisActionContinuousMulEquiv (a * b) (ι x) = ι ((a * b) • x) :=
          hι.basisActionContinuousMulEquiv_apply (a * b) x
        _ = ι (a • b • x) := by rw [mul_smul]
        _ = hι.basisActionContinuousMulEquiv a (ι (b • x)) := by
          exact (hι.basisActionContinuousMulEquiv_apply a (b • x)).symm
        _ = hι.basisActionContinuousMulEquiv a
            (hι.basisActionContinuousMulEquiv b (ι x)) := by
          rw [hι.basisActionContinuousMulEquiv_apply b x]
    exact congrArg (fun f : F →* F => f y) hhom

The automorphism-valued homomorphism extending a continuous action on the basis of a free pro-\(C\) group.

@[simp 900] theorem basisActionMulAutHom_apply
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    (hι : IsFreeProCGroup (ProC := ProC) ι) (a : A) (x : X) :
    hι.basisActionMulAutHom a (ι x) = ι (a • x)

The basis action automorphism associated to a free pro-\(C\) group is evaluated by applying the chosen action to a generator.

Show proof
noncomputable def basisMulDistribMulAction
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    (hι : IsFreeProCGroup (ProC := ProC) ι) :
    MulDistribMulAction A F where
  smul a y := hι.basisActionMulAutHom a y
  one_smul y := by
    change hι.basisActionMulAutHom (1 : A) y = y
    simp only [map_one, MulAut.one_apply]
  mul_smul a b y := by
    change hι.basisActionMulAutHom (a * b) y =
      hι.basisActionMulAutHom a (hι.basisActionMulAutHom b y)
    simp only [map_mul, MulAut.mul_apply]
  smul_one a := by
    exact map_one (hι.basisActionMulAutHom a)
  smul_mul a y z := by
    exact map_mul (hι.basisActionMulAutHom a) y z

The algebraic action on a free pro-\(C\) group induced by a continuous action on its basis.

@[simp 900] theorem basisMulDistribMulAction_smul_generator
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    (hι : IsFreeProCGroup (ProC := ProC) ι) (a : A) (x : X) :
    letI : MulDistribMulAction A F

The extended basis action sends each generator according to the prescribed action on the basis.

Show proof
theorem basisActionContinuousMulEquiv_eventually_eq_of_discreteTarget
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    [CompactSpace X]
    {Q : Type u} [Group Q] [TopologicalSpace Q] [IsTopologicalGroup Q] [DiscreteTopology Q]
    (hι : IsFreeProCGroup (ProC := ProC) ι)
    (hQ : ProC (G := Q)) (φ : F →* Q) (hφ : Continuous φ) (a₀ : A) :
    ∃ U : Set A, IsOpen U ∧ a₀ ∈ U ∧
      ∀ a ∈ U,
        φ.comp (hι.basisActionContinuousMulEquiv a).toMulEquiv.toMonoidHom =
          φ.comp (hι.basisActionContinuousMulEquiv a₀).toMulEquiv.toMonoidHom

Tube-lemma form of the continuity input for Exercise 5.6.2(d): after composing with any discrete pro-\(C\) target, the automorphisms induced by nearby basis-action parameters agree on a neighborhood of the chosen parameter.

Show proof
theorem continuous_discreteTarget_comp_basisActionContinuousMulEquiv
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    [CompactSpace X]
    {Q : Type u} [Group Q] [TopologicalSpace Q] [IsTopologicalGroup Q] [DiscreteTopology Q]
    (hι : IsFreeProCGroup (ProC := ProC) ι)
    (hQ : ProC (G := Q)) (φ : F →* Q) (hφ : Continuous φ) :
    Continuous fun p : A × F => φ (hι.basisActionContinuousMulEquiv p.1 p.2)

Composing the induced basis action on a free pro-\(C\) group with a discrete pro-\(C\) target is jointly continuous. This is the finite-coordinate continuity statement used to prove the full joint-continuity part of Exercise 5.6.2(d).

Show proof
theorem basisMulDistribMulAction_continuousSMul_of_finiteGroupClass
    (C : ProCGroups.FiniteGroupClass.{u}) (hForm : ProCGroups.FiniteGroupClass.Formation C)
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    [CompactSpace X]
    (hι : IsFreeProCGroup
      (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) ι) :
    letI : MulDistribMulAction A F

Exercise 5.6.2(d), concrete finite-class form: a continuous action on the profinite basis of a free pro-\(C\) group extends to a jointly continuous action on the free group. The proof checks continuity on the open-normal finite quotients and then uses the inverse-limit presentation of the pro-\(C\) group.

Show proof
structure IsPointedFreeProCGroup
    {X : Type u} [TopologicalSpace X] (x0 : X)
    {F : Type u} [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    (ι : X → F) : Prop where
  isProC : ProC (G := F)
  continuous_ι : Continuous ι
  map_base : ι x0 = 1
  generates_range : Generation.TopologicallyGenerates (G := F) (Set.range ι)
  existsUnique_lift :
    ∀ {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G],
      ProC (G := G) →
      ∀ (φ : X → G), Continuous φ →
        φ x0 = 1 →
        ∃! f : F →* G, Continuous f ∧ ∀ x, f (ι x) = φ x

A pointed free pro-\(C\) group is characterized by the strengthened universal property with prescribed basis values.

noncomputable def lift (hι : IsPointedFreeProCGroup (ProC := ProC) x0 ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G)) (φ : X → G)
    (hφ : Continuous φ)
    (hφ0 : φ x0 = 1) :
    F →* G :=
  Classical.choose (ExistsUnique.exists (hι.existsUnique_lift hG φ hφ hφ0))

A pointed generator map into a pro-\(C\) target extends to the corresponding continuous homomorphism from the pointed free pro-\(C\) group.

theorem lift_spec (hι : IsPointedFreeProCGroup (ProC := ProC) x0 ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G)) (φ : X → G)
    (hφ : Continuous φ)
    (hφ0 : φ x0 = 1) :
    Continuous (hι.lift hG φ hφ hφ0) ∧ ∀ x, hι.lift hG φ hφ hφ0 (ι x) = φ x

The universal-property lift has the prescribed values on the chosen generators.

Show proof
theorem lift_unique (hι : IsPointedFreeProCGroup (ProC := ProC) x0 ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G)) (φ : X → G)
    (hφ : Continuous φ)
    (hφ0 : φ x0 = 1)
    {f : F →* G} (hf : Continuous f) (hfac : ∀ x, f (ι x) = φ x) :
    f = hι.lift hG φ hφ hφ0

The universal-property lift is unique among continuous maps with the prescribed values.

Show proof
noncomputable def liftHom (hι : IsPointedFreeProCGroup (ProC := ProC) x0 ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G)) (φ : X → G)
    (hφ : Continuous φ)
    (hφ0 : φ x0 = 1) :
    F →ₜ* G where
  toMonoidHom := hι.lift hG φ hφ hφ0
  continuous_toFun := (hι.lift_spec hG φ hφ hφ0).1

The pointed universal-property lift, including the basepoint condition, is bundled as a continuous monoid homomorphism.

@[simp] theorem liftHom_apply (hι : IsPointedFreeProCGroup (ProC := ProC) x0 ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G)) (φ : X → G)
    (hφ : Continuous φ)
    (hφ0 : φ x0 = 1) (x : X) :
    hι.liftHom hG φ hφ hφ0 (ι x) = φ x

The pointed free pro-\(C\) lift homomorphism evaluates according to the chosen generator map.

Show proof
theorem hom_ext (hι : IsPointedFreeProCGroup (ProC := ProC) x0 ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G))
    {f g : F →* G} (hf : Continuous f) (hg : Continuous g)
    (hfg : ∀ x, f (ι x) = g (ι x)) :
    f = g

Continuous homomorphisms out of a pointed free pro-\(C\) group are determined by their values on the pointed generators.

Show proof
@[simp] theorem lift_id (hι : IsPointedFreeProCGroup (ProC := ProC) x0 ι) :
    hι.lift hι.isProC ι hι.continuous_ι hι.map_base = MonoidHom.id F

The lift of the canonical generator map to the same free pro-\(C\) group is the identity.

Show proof
theorem endomorphism_eq_id (hι : IsPointedFreeProCGroup (ProC := ProC) x0 ι)
    {f : F →* F} (hf : Continuous f) (hfac : ∀ x, f (ι x) = ι x) :
    f = MonoidHom.id F

An endomorphism of a free pro-\(C\) group fixing the generators is the identity.

Show proof
theorem lift_comp (hι : IsPointedFreeProCGroup (ProC := ProC) x0 ι)
    {G H : Type u}
    [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    [Group H] [TopologicalSpace H] [IsTopologicalGroup H]
    (hG : ProC (G := G))
    (hH : ProC (G := H))
    (φ : X → G) (hφ : Continuous φ) (hφ0 : φ x0 = 1)
    (ψ : G →* H) (hψ : Continuous ψ) :
    ψ.comp (hι.lift hG φ hφ hφ0) =
      hι.lift hH (fun x => ψ (φ x)) (hψ.comp hφ) (by simp only [hφ0, map_one])

Composition of free pro-\(C\) lifts is again the lift of the composed generator map.

Show proof
noncomputable def basisActionContinuousMulEquiv
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    (hι : IsPointedFreeProCGroup (ProC := ProC) x0 ι)
    (hbase : ∀ a : A, a • x0 = x0) (a : A) :
    F ≃ₜ* F := by
  let φ : X → F := fun x => ι (a • x)
  have hφ : Continuous φ := hι.continuous_ι.comp
    ((continuous_const : Continuous fun _ : X => a).smul continuous_id)
  have hφ0 : φ x0 = 1 := by
    dsimp [φ]
    rw [hbase a, hι.map_base]
  let ψ : X → F := fun x => ι (a⁻¹ • x)
  have hψ : Continuous ψ := hι.continuous_ι.comp
    ((continuous_const : Continuous fun _ : X => a⁻¹).smul continuous_id)
  have hψ0 : ψ x0 = 1 := by
    dsimp [ψ]
    rw [hbase a⁻¹, hι.map_base]
  let f : F →* F := hι.lift hι.isProC φ hφ hφ0
  let g : F →* F := hι.lift hι.isProC ψ hψ hψ0
  have hfcont : Continuous f := (hι.lift_spec hι.isProC φ hφ hφ0).1
  have hgcont : Continuous g := (hι.lift_spec hι.isProC ψ hψ hψ0).1
  have hfg : g.comp f = MonoidHom.id F := by
    refine hι.hom_ext hι.isProC (f := g.comp f) (g := MonoidHom.id F)
      (hgcont.comp hfcont) continuous_id ?_
    intro x
    calc
      (g.comp f) (ι x) = g (f (ι x)) := rfl
      _ = g (ι (a • x)) := by
        rw [(hι.lift_spec hι.isProC φ hφ hφ0).2 x]
      _ = ι (a⁻¹ • (a • x)) := by
        rw [(hι.lift_spec hι.isProC ψ hψ hψ0).2 (a • x)]
      _ = ι x := by
        rw [inv_smul_smul]
      _ = MonoidHom.id F (ι x) := rfl
  have hgf : f.comp g = MonoidHom.id F := by
    refine hι.hom_ext hι.isProC (f := f.comp g) (g := MonoidHom.id F)
      (hfcont.comp hgcont) continuous_id ?_
    intro x
    calc
      (f.comp g) (ι x) = f (g (ι x)) := rfl
      _ = f (ι (a⁻¹ • x)) := by
        rw [(hι.lift_spec hι.isProC ψ hψ hψ0).2 x]
      _ = ι (a • (a⁻¹ • x)) := by
        rw [(hι.lift_spec hι.isProC φ hφ hφ0).2 (a⁻¹ • x)]
      _ = ι x := by
        rw [smul_inv_smul]
      _ = MonoidHom.id F (ι x) := rfl
  exact
    { toMulEquiv :=
        { toFun := f
          invFun := g
          left_inv := by
            intro y
            exact congrArg (fun h : F →* F => h y) hfg
          right_inv := by
            intro y
            exact congrArg (fun h : F →* F => h y) hgf
          map_mul' := f.map_mul }
      continuous_toFun := hfcont
      continuous_invFun := hgcont }

A basepoint-preserving continuous action on the pointed basis extends elementwise to continuous multiplicative automorphisms of the pointed free pro-\(C\) group.

@[simp 900] theorem basisActionContinuousMulEquiv_apply
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    (hι : IsPointedFreeProCGroup (ProC := ProC) x0 ι)
    (hbase : ∀ a : A, a • x0 = x0) (a : A) (x : X) :
    hι.basisActionContinuousMulEquiv hbase a (ι x) = ι (a • x)

The basis-action equivalence is evaluated by transporting each basis generator to its prescribed image.

Show proof
@[simp 900] theorem basisActionContinuousMulEquiv_symm_apply
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    (hι : IsPointedFreeProCGroup (ProC := ProC) x0 ι)
    (hbase : ∀ a : A, a • x0 = x0) (a : A) (x : X) :
    (hι.basisActionContinuousMulEquiv hbase a).symm (ι x) = ι (a⁻¹ • x)

The inverse comparison equivalence is evaluated by the same coordinate data, read in the opposite direction.

Show proof
noncomputable def basisActionMulAutHom
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    (hι : IsPointedFreeProCGroup (ProC := ProC) x0 ι)
    (hbase : ∀ a : A, a • x0 = x0) :
    A →* MulAut F where
  toFun a := (hι.basisActionContinuousMulEquiv hbase a).toMulEquiv
  map_one' := by
    ext y
    have hhom :
        (hι.basisActionContinuousMulEquiv hbase (1 : A)).toMulEquiv.toMonoidHom =
          MonoidHom.id F := by
      refine hι.hom_ext hι.isProC
        (f := (hι.basisActionContinuousMulEquiv hbase (1 : A)).toMulEquiv.toMonoidHom)
        (g := MonoidHom.id F)
        (hι.basisActionContinuousMulEquiv hbase (1 : A)).continuous_toFun
        continuous_id ?_
      intro x
      change hι.basisActionContinuousMulEquiv hbase (1 : A) (ι x) =
        MonoidHom.id F (ι x)
      rw [hι.basisActionContinuousMulEquiv_apply hbase (1 : A) x, one_smul]
      rfl
    exact congrArg (fun f : F →* F => f y) hhom
  map_mul' := by
    intro a b
    ext y
    have hcontComp :
        Continuous fun y : F =>
          hι.basisActionContinuousMulEquiv hbase a
            (hι.basisActionContinuousMulEquiv hbase b y) :=
      (hι.basisActionContinuousMulEquiv hbase a).continuous_toFun.comp
        (hι.basisActionContinuousMulEquiv hbase b).continuous_toFun
    have hhom :
        (hι.basisActionContinuousMulEquiv hbase (a * b)).toMulEquiv.toMonoidHom =
          ((hι.basisActionContinuousMulEquiv hbase a).toMulEquiv.toMonoidHom).comp
            ((hι.basisActionContinuousMulEquiv hbase b).toMulEquiv.toMonoidHom) := by
      refine hι.hom_ext hι.isProC
        (f := (hι.basisActionContinuousMulEquiv hbase (a * b)).toMulEquiv.toMonoidHom)
        (g :=
          ((hι.basisActionContinuousMulEquiv hbase a).toMulEquiv.toMonoidHom).comp
            ((hι.basisActionContinuousMulEquiv hbase b).toMulEquiv.toMonoidHom))
        (hι.basisActionContinuousMulEquiv hbase (a * b)).continuous_toFun
        hcontComp ?_
      intro x
      calc
        hι.basisActionContinuousMulEquiv hbase (a * b) (ι x) = ι ((a * b) • x) :=
          hι.basisActionContinuousMulEquiv_apply hbase (a * b) x
        _ = ι (a • b • x) := by rw [mul_smul]
        _ = hι.basisActionContinuousMulEquiv hbase a (ι (b • x)) := by
          exact (hι.basisActionContinuousMulEquiv_apply hbase a (b • x)).symm
        _ = hι.basisActionContinuousMulEquiv hbase a
            (hι.basisActionContinuousMulEquiv hbase b (ι x)) := by
          rw [hι.basisActionContinuousMulEquiv_apply hbase b x]
    exact congrArg (fun f : F →* F => f y) hhom

The automorphism-valued homomorphism extending a basepoint-preserving action on the pointed basis of a free pro-\(C\) group.

@[simp 900] theorem basisActionMulAutHom_apply
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    (hι : IsPointedFreeProCGroup (ProC := ProC) x0 ι)
    (hbase : ∀ a : A, a • x0 = x0) (a : A) (x : X) :
    hι.basisActionMulAutHom hbase a (ι x) = ι (a • x)

The pointed basis action automorphism is evaluated by applying the chosen action to a generator.

Show proof
noncomputable def basisMulDistribMulAction
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    (hι : IsPointedFreeProCGroup (ProC := ProC) x0 ι)
    (hbase : ∀ a : A, a • x0 = x0) :
    MulDistribMulAction A F where
  smul a y := hι.basisActionMulAutHom hbase a y
  one_smul y := by
    change hι.basisActionMulAutHom hbase (1 : A) y = y
    simp only [map_one, MulAut.one_apply]
  mul_smul a b y := by
    change hι.basisActionMulAutHom hbase (a * b) y =
      hι.basisActionMulAutHom hbase a (hι.basisActionMulAutHom hbase b y)
    simp only [map_mul, MulAut.mul_apply]
  smul_one a := by
    exact map_one (hι.basisActionMulAutHom hbase a)
  smul_mul a y z := by
    exact map_mul (hι.basisActionMulAutHom hbase a) y z

The algebraic action on a pointed free pro-\(C\) group induced by a basepoint-preserving continuous action on its pointed basis.

@[simp 900] theorem basisMulDistribMulAction_smul_generator
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    (hι : IsPointedFreeProCGroup (ProC := ProC) x0 ι)
    (hbase : ∀ a : A, a • x0 = x0) (a : A) (x : X) :
    letI : MulDistribMulAction A F

The pointed extended basis action sends each generator according to the prescribed action on the pointed basis.

Show proof
theorem basisActionContinuousMulEquiv_eventually_eq_of_discreteTarget
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    [CompactSpace X]
    {Q : Type u} [Group Q] [TopologicalSpace Q] [IsTopologicalGroup Q] [DiscreteTopology Q]
    (hι : IsPointedFreeProCGroup (ProC := ProC) x0 ι)
    (hbase : ∀ a : A, a • x0 = x0)
    (hQ : ProC (G := Q)) (φ : F →* Q) (hφ : Continuous φ) (a₀ : A) :
    ∃ U : Set A, IsOpen U ∧ a₀ ∈ U ∧
      ∀ a ∈ U,
        φ.comp (hι.basisActionContinuousMulEquiv hbase a).toMulEquiv.toMonoidHom =
          φ.comp (hι.basisActionContinuousMulEquiv hbase a₀).toMulEquiv.toMonoidHom

This lemma supplies the pointed tube-lemma continuity input for Exercise 5.6.2(d).

Show proof
theorem continuous_discreteTarget_comp_basisActionContinuousMulEquiv
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    [CompactSpace X]
    {Q : Type u} [Group Q] [TopologicalSpace Q] [IsTopologicalGroup Q] [DiscreteTopology Q]
    (hι : IsPointedFreeProCGroup (ProC := ProC) x0 ι)
    (hbase : ∀ a : A, a • x0 = x0)
    (hQ : ProC (G := Q)) (φ : F →* Q) (hφ : Continuous φ) :
    Continuous fun p : A × F => φ (hι.basisActionContinuousMulEquiv hbase p.1 p.2)

Composing the pointed induced basis action with a discrete pro-\(C\) target is jointly continuous.

Show proof
theorem basisMulDistribMulAction_continuousSMul_of_finiteGroupClass
    (C : ProCGroups.FiniteGroupClass.{u}) (hForm : ProCGroups.FiniteGroupClass.Formation C)
    {A : Type v} [Group A] [TopologicalSpace A] [MulAction A X] [ContinuousSMul A X]
    [CompactSpace X]
    (hι : IsPointedFreeProCGroup
      (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) x0 ι)
    (hbase : ∀ a : A, a • x0 = x0) :
    letI : MulDistribMulAction A F

This is the pointed form of Exercise 5.6.2(d) for a finite-group class: a basepoint-preserving continuous action on the pointed profinite basis extends to a jointly continuous action on the pointed free pro-\(C\) group.

Show proof
def FamilyConvergesToOne
    {X : Type v}
    {G : Type u} [Group G] [TopologicalSpace G]
    (μ : X → G) : Prop :=
  ∀ U : OpenSubgroup G, {x : X | μ x ∉ (U : Set G)}.Finite

A family in a topological group converges to \(1\) when every open subgroup contains all but finitely many indexed terms.

theorem range {μ : X → G} (hμ : FamilyConvergesToOne (G := G) μ) :
    Generation.ConvergesToOne (G := G) (Set.range μ)

A family converging to \(1\) has range converging to \(1\) as a set.

Show proof
theorem comp
    {H : Type*} [TopologicalSpace H] [Group H]
    {μ : X → G}
    (hμ : FamilyConvergesToOne (G := G) μ) (f : G →ₜ* H) :
    FamilyConvergesToOne (G := H) (fun x => f (μ x))

Convergence to \(1\) is preserved by a continuous homomorphism.

Show proof
theorem of_set_of_injective {μ : X → G}
    (hμ : Generation.ConvergesToOne (G := G) (Set.range μ))
    (hinj : Function.Injective μ) :
    FamilyConvergesToOne (G := G) μ

For an injectively indexed family, convergence of its range to \(1\) implies convergence of the family to \(1\).

Show proof
theorem of_finite_domain [Finite X] (μ : X → G) :
    FamilyConvergesToOne (G := G) μ

Families indexed by a finite type converge to \(1\).

Show proof
structure ConvergingGeneratingMap
    (X : Type v)
    (G : Type u) [Group G] [TopologicalSpace G] [IsTopologicalGroup G] where
  toFun : X → G
  convergesToOne : FamilyConvergesToOne (G := G) toFun
  generates : Generation.TopologicallyGenerates (G := G) (Set.range toFun)

A family which both converges to \(1\) and topologically generates the target.

instance instCoeFunConvergingGeneratingMap :
    CoeFun (ConvergingGeneratingMap X G) (fun _ => X → G) where
  coe φ := φ.toFun

A converging generating map coerces to its underlying function.

@[simp] theorem toFun_eq_coe (φ : ConvergingGeneratingMap X G) :
    φ.toFun = (φ : X → G)

The underlying function of the bundled map is its coercion as a function.

Show proof
def reindex (φ : ConvergingGeneratingMap X G) (e : Y ≃ X) :
    ConvergingGeneratingMap Y G where
  toFun := fun y => φ (e y)
  convergesToOne := by
    intro U
    have hsubset :
        {y : Y | φ (e y) ∉ (U : Set G)} ⊆
          e.symm '' {x : X | φ x ∉ (U : Set G)} := by
      intro y hy
      exact ⟨e y, hy, by simp only [Equiv.symm_apply_apply]⟩
    exact (φ.convergesToOne U).image e.symm |>.subset hsubset
  generates := by
    have hrange : Set.range (fun y : Y => φ (e y)) = Set.range (φ : X → G) := by
      ext z
      constructor
      · rintro ⟨y, rflexact ⟨e y, rfl⟩
      · rintro ⟨x, rflexact ⟨e.symm x, by simp only [Equiv.apply_symm_apply]⟩
    simpa [hrange] using φ.generates

Reindexing along an equivalence preserves family convergence and generation.

theorem generatesAndConvergesToOne (φ : ConvergingGeneratingMap X G) :
    Generation.GeneratesAndConvergesToOne (G := G) (Set.range (φ : X → G))

The bundled converging generating map both generates topologically and converges to \(1\).

Show proof
class HasGeneratingTargetExtensionProperty
    (X : Type u) [TopologicalSpace X]
    (F : Type u) [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    (ι : X → F) : Prop where
  isProC : ProC (G := F)
  continuous_ι : Continuous ι
  generates_range : Generation.TopologicallyGenerates (G := F) (Set.range ι)
  existsUnique_lift :
    ∀ {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G],
      ProC (G := G) →
      ∀ (φ : X → G), Continuous φ →
        Generation.TopologicallyGenerates (G := G) (Set.range φ) →
          ∃! f : F →* G, Continuous f ∧ ∀ x, f (ι x) = φ x

Generated-target extension property for a pro-\(C\) group on a topological space. This is weaker than the free pro-\(C\) universal property: it only asks for extensions to targets generated by the chosen map.

theorem generatingTargetExtensionProperty_of_free
    {X : Type u} [TopologicalSpace X]
    {F : Type u} [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    {ι : X → F}
    (hι : IsFreeProCGroup (ProC := ProC) ι) :
    HasGeneratingTargetExtensionProperty (ProC := ProC) X F ι

The true free pro-\(C\) universal property implies the generated-target extension property.

Show proof
theorem toFreeProperty
    (hι : HasGeneratingTargetExtensionProperty (ProC := ProC) X F ι)
    (hClosedSubgroups :
      ∀ {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G],
        ProC (G := G) → (H : ClosedSubgroup G) →
          ProC (G := ↥(H : Subgroup G))) :
    IsFreeProCGroup (ProC := ProC) ι

Recover the usual free pro-\(C\) universal property from the older generated-target interface, provided the pro-\(C\) predicate is stable under closed subgroups. The proof corestricts an arbitrary target map to the closed subgroup it topologically generates, uses the generated-target extension property there, and then composes with the inclusion.

Show proof
theorem free_of_generatingTargetExtensionProperty_of_closedSubgroups
    {X : Type u} [TopologicalSpace X]
    {F : Type u} [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    {ι : X → F}
    (hι : HasGeneratingTargetExtensionProperty (ProC := ProC) X F ι)
    (hClosedSubgroups :
      ∀ {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G],
        ProC (G := G) → (H : ClosedSubgroup G) →
          ProC (G := ↥(H : Subgroup G))) :
    IsFreeProCGroup (ProC := ProC) ι

The generated-target extension property is the true free pro-\(C\) universal property when the class of pro-\(C\) groups is stable under closed subgroups.

Show proof
class IsPointedFreeProCGroupOn
    (X : Type u) [TopologicalSpace X] (x0 : X)
    (F : Type u) [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    (ι : X → F) : Prop where
  isProC : ProC (G := F)
  continuous_ι : Continuous ι
  map_base : ι x0 = 1
  generates_range : Generation.TopologicallyGenerates (G := F) (Set.range ι)
  existsUnique_lift :
    ∀ {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G],
      ProC (G := G) →
      ∀ (φ : X → G), Continuous φ → φ x0 = 1 →
        Generation.TopologicallyGenerates (G := G) (Set.range φ) →
          ∃! f : F →* G, Continuous f ∧ ∀ x, f (ι x) = φ x

This predicate says that a pro-\(C\) group is pointed free on a pointed topological space.

class IsFreeProCGroupOnConvergingSet
    (X : Type v)
    (F : Type u) [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    (ι : X → F) : Prop where
  isProC : ProC (G := F)
  convergesToOne : FamilyConvergesToOne (G := F) ι
  generates_range : Generation.TopologicallyGenerates (G := F) (Set.range ι)
  existsUnique_lift :
    ∀ {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G],
      ProC (G := G) →
      ∀ (φ : X → G), FamilyConvergesToOne (G := G) φ →
        Generation.TopologicallyGenerates (G := G) (Set.range φ) →
          ∃! f : F →* G, Continuous f ∧ ∀ x, f (ι x) = φ x

Free pro-\(C\) group on a set converging to \(1\).

theorem freeProCGroupOn_injective
    {X : Type u} [TopologicalSpace X]
    {F : Type u} [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    {ι : X → F}
    (hι : IsFreeProCGroup (ProC := ProC) ι)
    (hsep :
      ∀ ⦃x y : X⦄, x ≠ y →
        ∃ (A : Type u) (_ : Group A) (_ : TopologicalSpace A) (_ : IsTopologicalGroup A),
          ProC (G := A) ∧
            ∃ φ : X → A, Continuous φ ∧
              Generation.TopologicallyGenerates (G := A) (Set.range φ) ∧ φ x ≠ φ y) :
    Function.Injective ι

The canonical map of a free pro-\(C\) group on a topological space is injective whenever the predicate supplies enough separating pro-\(C\) targets.

Show proof
theorem one_not_mem_range_of_freeProCGroupOn
    {X : Type u} [TopologicalSpace X] [Nonempty X]
    {F : Type u} [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    {ι : X → F}
    (hι : IsFreeProCGroup (ProC := ProC) ι)
    (hnontrivial :
      ∃ (A : Type u) (_ : Group A) (_ : TopologicalSpace A) (_ : IsTopologicalGroup A),
        ProC (G := A) ∧ ∃ a : A, a ≠ 1 ∧
          Generation.TopologicallyGenerates (G := A) ({a} : Set A)) :
    (1 : F) ∉ Set.range ι

Under an explicit nontrivial cyclic pro-\(C\) target hypothesis, the identity does not lie in the image of the topological basis of a free pro-\(C\) group.

Show proof
theorem one_not_mem_range_of_freeProCGroupOnConvergingSet
    {X : Type u}
    {F : Type u} [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    {ι : X → F}
    (hι : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι)
    (hnontrivial :
      ∃ (A : Type u) (_ : Group A) (_ : TopologicalSpace A) (_ : IsTopologicalGroup A),
        ProC (G := A) ∧ ∃ a : A, a ≠ 1 ∧
          Generation.TopologicallyGenerates (G := A) ({a} : Set A)) :
    (1 : F) ∉ Set.range ι

Under an explicit nontrivial cyclic pro-\(C\) target hypothesis, the identity does not lie in a basis converging to \(1\).

Show proof
theorem freeProCGroupOnConvergingSet_injective
    {X : Type u}
    {F : Type u} [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    {ι : X → F}
    (hι : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι)
    (hnontrivial :
      ∃ (A : Type u) (_ : Group A) (_ : TopologicalSpace A) (_ : IsTopologicalGroup A),
        ProC (G := A) ∧ ∃ a : A, a ≠ 1 ∧
          Generation.TopologicallyGenerates (G := A) ({a} : Set A)) :
    Function.Injective ι

Under the same nontrivial cyclic-target hypothesis, the basis map for a free pro-\(C\) group on a set converging to \(1\) is injective.

Show proof
theorem exists_nontrivial_singleton_topologicalGenerator
    {A : Type u} [Group A] [TopologicalSpace A] [IsTopologicalGroup A]
    [IsCyclic A] [Nontrivial A] :
    ∃ a : A, a ≠ 1 ∧ Generation.TopologicallyGenerates (G := A) ({a} : Set A)

A nontrivial cyclic topological group has a nontrivial singleton topological generator.

Show proof
theorem exists_nontrivial_topologicallyCyclic_proC_of_finiteGroupClass
    (C : ProCGroups.FiniteGroupClass.{u})
    (hquot : ProCGroups.FiniteGroupClass.QuotientClosed C)
    (hcyc :
      ∃ (A : Type u) (_ : Group A) (_ : Finite A),
        C A ∧ IsCyclic A ∧ Nontrivial A) :
    ∃ (A : Type u) (_ : Group A) (_ : TopologicalSpace A) (_ : IsTopologicalGroup A),
      (ProCGroups.ProC.finiteGroupClassProCPredicate C) (G := A) ∧
        ∃ a : A, a ≠ 1 ∧ Generation.TopologicallyGenerates (G := A) ({a} : Set A)

A concrete finite-group class containing a nontrivial finite cyclic group admits a nontrivial topologically cyclic pro-\(C\) model.

Show proof
theorem finite_generatingFamily_is_basis
    {X : Type u} {Y : Type u}
    [Finite X] [Finite Y]
    {F : Type u} [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    {ι : X → F} {μ : Y → F}
    (hF : ProCGroups.IsProfiniteGroup F)
    (hι : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι)
    (hcard : Cardinal.mk X = Cardinal.mk Y)
    (hgen : Generation.TopologicallyGenerates (G := F) (Set.range μ)) :
    IsFreeProCGroupOnConvergingSet (ProC := ProC) Y F μ

For a finite-rank free pro-\(C\) group, any generating family with the same finite cardinality is again a converging-set basis.

Show proof
theorem finite_generatingFamily_is_basis_of_finiteGroupClass
    (C : ProCGroups.FiniteGroupClass.{u})
    {X : Type u} {Y : Type u}
    [Finite X] [Finite Y]
    {F : Type u} [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    {ι : X → F} {μ : Y → F}
    (hι :
      IsFreeProCGroupOnConvergingSet
        (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
    (hcard : Cardinal.mk X = Cardinal.mk Y)
    (hgen : Generation.TopologicallyGenerates (G := F) (Set.range μ)) :
    IsFreeProCGroupOnConvergingSet
      (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) Y F μ

Concrete finite-group-class specialization: a finite generating family is a basis.

Show proof
theorem finite_generatingFamily_is_basis_of_finiteGroupClass_cyclic
    (C : ProCGroups.FiniteGroupClass.{u})
    (hquot : ProCGroups.FiniteGroupClass.QuotientClosed C)
    (hcyc :
      ∃ (A : Type u) (_ : Group A) (_ : Finite A),
        C A ∧ IsCyclic A ∧ Nontrivial A)
    {X : Type u} {Y : Type u}
    [Finite X] [Finite Y]
    {F : Type u} [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    {ι : X → F} {μ : Y → F}
    (hι :
      IsFreeProCGroupOnConvergingSet
        (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
    (hcard : Cardinal.mk X = Cardinal.mk Y)
    (hgen : Generation.TopologicallyGenerates (G := F) (Set.range μ)) :
    IsFreeProCGroupOnConvergingSet
      (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) Y F μ

Concrete finite-group-class specialization when a nontrivial cyclic target is available.

Show proof
theorem surjective_hom_of_rangeContainsGeneratingSet
    {X : Type u}
    {F : Type u} [Group F] [TopologicalSpace F]
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hF : ProCGroups.IsProfiniteGroup F)
    (hG : ProCGroups.IsProfiniteGroup G)
    {ι : X → G}
    (hgen : Generation.TopologicallyGenerates (G := G) (Set.range ι))
    {σ : F →* G} (hσ : Continuous σ)
    (hsub : Set.range ι ⊆ (σ.range : Set G)) :
    Function.Surjective σ

If a continuous homomorphism has range containing a topological generating set, then it is surjective between profinite groups.

Show proof
theorem finite_of_topologicallyFinitelyGenerated_freeProCGroupOnConvergingSet
    {X : Type u}
    {F : Type u} [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    {ι : X → F}
    (hFprof : ProCGroups.IsProfiniteGroup F)
    (hfg : FiniteGeneration.TopologicallyFinitelyGenerated F)
    (hι : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι)
    (hnontrivial :
      ∃ (A : Type u) (_ : Group A) (_ : TopologicalSpace A) (_ : IsTopologicalGroup A),
        ProC (G := A) ∧ ∃ a : A, a ≠ 1 ∧
          Generation.TopologicallyGenerates (G := A) ({a} : Set A)) :
    Finite X

A topologically finitely generated free pro-\(C\) group on a converging set has finite basis, provided C admits a nontrivial cyclic pro-\(C\) target.

Show proof
theorem exists_freeProCGroupOnConvergingSet_surjecting
    {X : Type u}
    {F : Type u} [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    {ι : X → F}
    (hF : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι)
    (hFprof : ProCGroups.IsProfiniteGroup F)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G))
    (hGprof : ProCGroups.IsProfiniteGroup G)
    (φ : X → G)
    (hφ : FamilyConvergesToOne (G := G) φ)
    (hgen : Generation.TopologicallyGenerates (G := G) (Set.range φ)) :
    ∃ ψ : F →* G, Continuous ψ ∧ Function.Surjective ψ ∧ ∀ x, ψ (ι x) = φ x

A fixed free pro-\(C\) group on a set converging to \(1\) admits a continuous epimorphism onto any profinite pro-\(C\) target generated by the image of its basis.

Show proof
theorem proCCompletionOfAbstractFreeGroup_is_free
    {X : Type u} [Finite X]
    [TopologicalSpace (FreeGroup X)] [IsTopologicalGroup (FreeGroup X)]
    [DiscreteTopology (FreeGroup X)]
    {Fhat : Type u} [Group Fhat] [TopologicalSpace Fhat] [IsTopologicalGroup Fhat]
    {ι : FreeGroup X →ₜ* Fhat}
    (hι : ProCGroups.Completion.IsProCCompletion ProC (FreeGroup X) Fhat ι) :
    IsFreeProCGroupOnConvergingSet (ProC := ProC) X Fhat
      (fun x => ι (FreeGroup.of x))

The pro-\(C\) completion of the abstract free group on a finite basis is free pro-\(C\) on that basis.

Show proof
noncomputable def lift
    (hι : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G)) (φ : X → G)
    (hφ : FamilyConvergesToOne (G := G) φ)
    (hgen : Generation.TopologicallyGenerates (G := G) (Set.range φ)) :
    F →* G :=
  Classical.choose (ExistsUnique.exists (hι.existsUnique_lift hG φ hφ hgen))

A convergent generator map into a pro-\(C\) target extends to the corresponding continuous homomorphism from the free pro-\(C\) group on the converging set.

theorem lift_spec
    (hι : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G)) (φ : X → G)
    (hφ : FamilyConvergesToOne (G := G) φ)
    (hgen : Generation.TopologicallyGenerates (G := G) (Set.range φ)) :
    Continuous (hι.lift hG φ hφ hgen) ∧
      ∀ x, hι.lift hG φ hφ hgen (ι x) = φ x

The universal-property lift is continuous and agrees with the prescribed converging generator map.

Show proof
theorem lift_unique
    (hι : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G)) (φ : X → G)
    (hφ : FamilyConvergesToOne (G := G) φ)
    (hgen : Generation.TopologicallyGenerates (G := G) (Set.range φ))
    {f : F →* G} (hf : Continuous f) (hfac : ∀ x, f (ι x) = φ x) :
    f = hι.lift hG φ hφ hgen

The universal-property lift is uniquely determined by its values on the converging generators.

Show proof
theorem existsUnique_lift_of_convergesToOne_of_finiteGroupClass
    (C : ProCGroups.FiniteGroupClass.{u})
    (hIso : ProCGroups.FiniteGroupClass.IsomClosed C)
    (hSub : ProCGroups.FiniteGroupClass.SubgroupClosed C)
    (hQuot : ProCGroups.FiniteGroupClass.QuotientClosed C)
    (hι :
      IsFreeProCGroupOnConvergingSet
        (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : (ProCGroups.ProC.finiteGroupClassProCPredicate C) (G := G))
    (φ : X → G) (hφ : FamilyConvergesToOne (G := G) φ) :
    ∃! f : F →* G, Continuous f ∧ ∀ x, f (ι x) = φ x

For a concrete finite-group class, the generated-target universal property of a free pro-\(C\) group on a converging set extends any target map that converges to \(1\). The proof corestricts the target map to the closed subgroup it topologically generates. This is the form needed for retractions that collapse all but finitely many basis elements.

Show proof
theorem existsUnique_liftHom_of_convergesToOne_of_finiteGroupClass
    (C : ProCGroups.FiniteGroupClass.{u})
    (hIso : ProCGroups.FiniteGroupClass.IsomClosed C)
    (hSub : ProCGroups.FiniteGroupClass.SubgroupClosed C)
    (hQuot : ProCGroups.FiniteGroupClass.QuotientClosed C)
    (hι :
      IsFreeProCGroupOnConvergingSet
        (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : (ProCGroups.ProC.finiteGroupClassProCPredicate C) (G := G))
    (φ : X → G) (hφ : FamilyConvergesToOne (G := G) φ) :
    ∃! f : F →ₜ* G, ∀ x, f (ι x) = φ x

The free pro-\(C\) lifting property gives a unique continuous homomorphism extending a convergent generator map into any finite group from the class.

Show proof
theorem generator_pow_ne_one_of_sigma
    {σ : Set ℕ} (hσ : ∃ p, p ∈ σ ∧ Nat.Prime p)
    (hι :
      IsFreeProCGroupOnConvergingSet
        (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate
          (ProCGroups.FiniteGroupClass.sigmaGroup σ)) X F ι)
    (i : X) (N : ℕ) (hN : 0 < N) :
    (ι i) ^ N ≠ 1

In a free pro-\(\Sigma\) group with nonempty \(\Sigma\), a free generator has no positive torsion.

Show proof
theorem generator_zpow_ne_one_of_sigma
    {σ : Set ℕ} (hσ : ∃ p, p ∈ σ ∧ Nat.Prime p)
    (hι :
      IsFreeProCGroupOnConvergingSet
        (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate
          (ProCGroups.FiniteGroupClass.sigmaGroup σ)) X F ι)
    (i : X) (n : ℤ) (hn : n ≠ 0) :
    (ι i) ^ n ≠ 1

The specified power of a generator is nontrivial under the \(\sigma\)-group separation hypothesis.

Show proof
noncomputable def liftHom
    (hι : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G)) (φ : X → G)
    (hφ : FamilyConvergesToOne (G := G) φ)
    (hgen : Generation.TopologicallyGenerates (G := G) (Set.range φ)) :
    F →ₜ* G where
  toMonoidHom := hι.lift hG φ hφ hgen
  continuous_toFun := (hι.lift_spec hG φ hφ hgen).1

The universal-property lift from a converging generating set, bundled as a continuous monoid homomorphism.

noncomputable def liftConvergingGeneratingMap
    (hι : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G)) (φ : ConvergingGeneratingMap X G) :
    F →ₜ* G :=
  hι.liftHom hG φ φ.convergesToOne φ.generates

A bundled version of liftHom, with the converging generating map supplied as a single argument.

@[simp] theorem liftConvergingGeneratingMap_apply
    (hι : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G)) (φ : ConvergingGeneratingMap X G) (x : X) :
    hι.liftConvergingGeneratingMap hG φ (ι x) = φ x

The universal lift evaluates on generators according to the prescribed generating map.

Show proof
@[simp] theorem liftHom_apply
    (hι : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι)
    {G : Type u} [Group G] [TopologicalSpace G] [IsTopologicalGroup G]
    (hG : ProC (G := G)) (φ : X → G)
    (hφ : FamilyConvergesToOne (G := G) φ)
    (hgen : Generation.TopologicallyGenerates (G := G) (Set.range φ)) (x : X) :
    hι.liftHom hG φ hφ hgen (ι x) = φ x

The lift homomorphism from a free pro-\(C\) group on a converging set evaluates according to the chosen continuous generator map.

Show proof
theorem existsUnique_collapseToFinset_of_finiteGroupClass
    (hι :
      IsFreeProCGroupOnConvergingSet
        (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
    (S : Finset X) :
    ∃! φ : F →ₜ* F, ∀ x, φ (ι x) = if x ∈ S then ι x else 1

The unique continuous endomorphism of a free pro-\(C\) group that keeps the finite set S of basis elements and sends the remaining basis elements to \(1\).

Show proof
noncomputable def collapseToFinset
    (hι :
      IsFreeProCGroupOnConvergingSet
        (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
    (S : Finset X) :
    F →ₜ* F :=
  Classical.choose (ExistsUnique.exists (hι.existsUnique_collapseToFinset_of_finiteGroupClass S))

The finite-support retraction of a free pro-\(C\) group onto the closed subgroup generated by a finite set of basis elements.

@[simp] theorem collapseToFinset_apply_mem
    (hι :
      IsFreeProCGroupOnConvergingSet
        (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
    {S : Finset X} {x : X} (hx : x ∈ S) :
    hι.collapseToFinset S (ι x) = ι x

The finite-support transition used for a converging generating set has the stated value.

Show proof
@[simp] theorem collapseToFinset_apply_not_mem
    (hι :
      IsFreeProCGroupOnConvergingSet
        (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
    {S : Finset X} {x : X} (hx : x ∉ S) :
    hι.collapseToFinset S (ι x) = 1

The finite-support transition used for a converging generating set has the stated value.

Show proof
@[simp] theorem collapseToFinset_idempotent
    (hι :
      IsFreeProCGroupOnConvergingSet
        (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
    (S : Finset X) :
    (hι.collapseToFinset S).comp (hι.collapseToFinset S) =
      hι.collapseToFinset S

Collapsing a converging generating map to the same finite support set is idempotent.

Show proof
theorem comp_collapseToFinset_eq_of_eq_one_outside
    (hι :
      IsFreeProCGroupOnConvergingSet
        (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
    {G : Type w} [Group G] [TopologicalSpace G] [IsTopologicalGroup G] [T2Space G]
    (φ : F →ₜ* G) (S : Finset X)
    (hφ : ∀ x, x ∉ S → φ (ι x) = 1) :
    φ.comp (hι.collapseToFinset S) = φ

A homomorphism that kills every basis element outside S is unchanged after precomposition with the finite-support retraction.

Show proof
noncomputable def collapseToFinsetRange
    (hι :
      IsFreeProCGroupOnConvergingSet
        (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
    (S : Finset X) :
    F →ₜ* ↥((hι.collapseToFinset S : F →* F).range) :=
  { toMonoidHom := (hι.collapseToFinset S : F →* F).rangeRestrict
    continuous_toFun :=
      (hι.collapseToFinset S).continuous.subtype_mk (fun x => ⟨x, rfl⟩) }

The map from the free pro-\(C\) group onto the range of its finite-support retraction.

noncomputable def collapseToFinsetInclusion
    (hι :
      IsFreeProCGroupOnConvergingSet
        (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
    (S : Finset X) :
    ↥((hι.collapseToFinset S : F →* F).range) →ₜ* F :=
  { toMonoidHom := ((hι.collapseToFinset S : F →* F).range).subtype
    continuous_toFun := continuous_subtype_val }

The inclusion of the range of a finite-support retraction back into the ambient free group.

abbrev FinsetSupportRetract
    (hι :
      IsFreeProCGroupOnConvergingSet
        (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
    (S : Finset X) : Type u :=
  ↥((hι.collapseToFinset S : F →* F).range)

The range of the finite-support retraction is viewed as the finite-basis retract.

noncomputable def finsetSupportBasis
    (hι :
      IsFreeProCGroupOnConvergingSet
        (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
    (S : Finset X) :
    S → hι.FinsetSupportRetract S := by
  intro x
  refine ⟨ι x.1, ?_⟩
  exact ⟨ι x.1, hι.collapseToFinset_apply_mem x.2⟩

The finite basis of the finite-support retract.

theorem isClosed_range_collapseToFinset
    (hι :
      IsFreeProCGroupOnConvergingSet
        (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
    (S : Finset X) :
    IsClosed (((hι.collapseToFinset S : F →* F).range : Set F))

The range of the finite-support retraction is closed.

Show proof
theorem isProCGroup_finsetSupportRetract
    (hι :
      IsFreeProCGroupOnConvergingSet
        (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
    (S : Finset X) :
    (ProCGroups.ProC.finiteGroupClassProCPredicate C)
      (G := hι.FinsetSupportRetract S)

The finite-support retract is again a pro-\(C\) group.

Show proof
theorem isFreeProCGroupOnConvergingSet_finsetSupportBasis
    (hι :
      IsFreeProCGroupOnConvergingSet
        (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
    (S : Finset X) :
    IsFreeProCGroupOnConvergingSet
      (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C)
      S (hι.FinsetSupportRetract S) (hι.finsetSupportBasis S)

The finite-support retract is free pro-\(C\) on its retained finite basis.

Show proof
  theorem collapseToFinset_small_comp_large_of_subset
      (hι :
        IsFreeProCGroupOnConvergingSet
          (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
      {S T : Finset X} (hST : S ⊆ T) :
      (hι.collapseToFinset S).comp (hι.collapseToFinset T) =
        hι.collapseToFinset S

If S \(\subseteq\) T, then collapsing first to T and then to S is the same as collapsing directly to S. This is the basic compatibility relation for the finite-basis projections.

Show proof
  theorem collapseToFinset_large_comp_small_of_subset
      (hι :
        IsFreeProCGroupOnConvergingSet
          (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
      {S T : Finset X} (hST : S ⊆ T) :
      (hι.collapseToFinset T).comp (hι.collapseToFinset S) =
        hι.collapseToFinset S

If S \(\subseteq\) T, then collapsing to S and then to T is again the collapse to S. Equivalently, the finite-support image for S is fixed by every larger finite-support projection.

Show proof
  noncomputable def finsetSupportTransition
      (hι :
        IsFreeProCGroupOnConvergingSet
          (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
      {S T : Finset X} (_hST : S ⊆ T) :
      hι.FinsetSupportRetract T →ₜ* hι.FinsetSupportRetract S :=
    { toMonoidHom := (hι.collapseToFinsetRange S).toMonoidHom.comp
        (hι.collapseToFinsetInclusion T).toMonoidHom
      continuous_toFun :=
        (hι.collapseToFinsetRange S).continuous.comp
          (hι.collapseToFinsetInclusion T).continuous }

The transition map from the finite-support retract for T to the one for S, for S \(\subseteq\) T. It is the projection obtained by including the T-retract into the ambient free pro-\(C\) group and then collapsing to S.

  @[simp] theorem finsetSupportTransition_apply_basis
      (hι :
        IsFreeProCGroupOnConvergingSet
          (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
      {S T : Finset X} (hST : S ⊆ T) (x : S) :
      hι.finsetSupportTransition hST
          (hι.finsetSupportBasis T ⟨x.1, hST x.2⟩) =
        hι.finsetSupportBasis S x

The finite-support transition used for a converging generating set has the stated value.

Show proof
  theorem finsetSupportTransition_comp_collapseToFinsetRange
      (hι :
        IsFreeProCGroupOnConvergingSet
          (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C) X F ι)
      {S T : Finset X} (hST : S ⊆ T) :
      (hι.finsetSupportTransition hST).comp (hι.collapseToFinsetRange T) =
        hι.collapseToFinsetRange S

Compatibility of the ambient projection \(F \to R_T\) with the transition \(R_T \to R_S\).

Show proof
theorem hom_ext
    (hι : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι)
    {G : Type u} [Group G] [TopologicalSpace G] [T2Space G]
    {f g : F →ₜ* G} (hfg : ∀ x, f (ι x) = g (ι x)) :
    f = g

Continuous homomorphisms out of a free pro-\(C\) group on a converging generating set are determined by their values on the chosen generators.

Show proof
@[simp 900] theorem lift_id
    (hι : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι) :
    hι.lift hι.isProC ι hι.convergesToOne hι.generates_range = MonoidHom.id F

The lift of the canonical generator map to the same free pro-\(C\) group is the identity.

Show proof
theorem precompEquiv
    {X' : Type w}
    (hι : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι) (e : X' ≃ X) :
    IsFreeProCGroupOnConvergingSet (ProC := ProC) X' F (fun x : X' => ι (e x))

Precomposing the converging generating set by an equivalence preserves the free pro-\(C\) universal property.

Show proof
theorem endomorphism_eq_id
    (hι : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι)
    {f : F →* F} (hf : Continuous f) (hfac : ∀ x, f (ι x) = ι x) :
    f = MonoidHom.id F

An endomorphism of a free pro-\(C\) group fixing the generators is the identity.

Show proof
noncomputable def continuousMulEquivOfSameBasis
    (hι : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι)
    {F' : Type u} [Group F'] [TopologicalSpace F'] [IsTopologicalGroup F']
    {κ : X → F'}
    (hκ : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F' κ) :
    F ≃ₜ* F' :=
  let f : F →* F' := hι.lift hκ.isProC κ hκ.convergesToOne hκ.generates_range
  let g : F' →* F := hκ.lift hι.isProC ι hι.convergesToOne hι.generates_range
  let hf : Continuous f := (hι.lift_spec hκ.isProC κ hκ.convergesToOne hκ.generates_range).1
  let hg : Continuous g := (hκ.lift_spec hι.isProC ι hι.convergesToOne hι.generates_range).1
  { toMulEquiv :=
      { toFun := f
        invFun := g
        left_inv := by
          intro y
          have hgf : g.comp f = MonoidHom.id F := by
            apply hι.endomorphism_eq_id (hg.comp hf)
            intro x
            dsimp [f, g]
            rw [(hι.lift_spec hκ.isProC κ hκ.convergesToOne hκ.generates_range).2 x]
            exact (hκ.lift_spec hι.isProC ι hι.convergesToOne hι.generates_range).2 x
          exact congrArg (fun h : F →* F => h y) hgf
        right_inv := by
          intro y
          have hfg : f.comp g = MonoidHom.id F' := by
            apply hκ.endomorphism_eq_id (hf.comp hg)
            intro x
            dsimp [f, g]
            rw [(hκ.lift_spec hι.isProC ι hι.convergesToOne hι.generates_range).2 x]
            exact (hι.lift_spec hκ.isProC κ hκ.convergesToOne hκ.generates_range).2 x
          exact congrArg (fun h : F' →* F' => h y) hfg
        map_mul' := f.map_mul }
    continuous_toFun := hf
    continuous_invFun := hg }

The canonical multiplicative homeomorphism between two free pro-\(C\) groups on the same basis.

@[simp 900] theorem continuousMulEquivOfSameBasis_apply
    (hι : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι)
    {F' : Type u} [Group F'] [TopologicalSpace F'] [IsTopologicalGroup F']
    {κ : X → F'}
    (hκ : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F' κ) (x : X) :
    hι.continuousMulEquivOfSameBasis hκ (ι x) = κ x

The same-basis continuous equivalence evaluates as the identity on the chosen basis values.

Show proof
@[simp 900] theorem continuousMulEquivOfSameBasis_symm_apply
    (hι : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι)
    {F' : Type u} [Group F'] [TopologicalSpace F'] [IsTopologicalGroup F']
    {κ : X → F'}
    (hκ : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F' κ) (x : X) :
    (hι.continuousMulEquivOfSameBasis hκ).symm (κ x) = ι x

The inverse comparison equivalence is evaluated by the same coordinate data, read in the opposite direction.

Show proof
theorem ofContinuousMulEquiv
    (hι : IsFreeProCGroupOnConvergingSet (ProC := ProC) X F ι)
    (e : F ≃ₜ* F')
    (hF' : ProC (G := F')) :
    IsFreeProCGroupOnConvergingSet (ProC := ProC) X F' (fun x => e (ι x))

Transport the free pro-\(C\) structure on a converging set across a continuous multiplicative equivalence of ambient groups.

Show proof
structure FreeProCGroupOnConvergingSetData
    (ProC : ProCGroups.ProC.ProCGroupPredicate) where
  basis : Type u
  carrier : Type u
  instGroup : Group carrier
  instTopologicalSpace : TopologicalSpace carrier
  instIsTopologicalGroup : IsTopologicalGroup carrier
  inclusion : basis → carrier
  isFree : IsFreeProCGroupOnConvergingSet (ProC := ProC) basis carrier inclusion

Packaged carrier for a free pro-\(C\) group on a set converging to \(1\).

theorem basisCard_eq_topologicalRank_of_finiteBasis
    (C : ProCGroups.FiniteGroupClass.{u})
    (hquot : ProCGroups.FiniteGroupClass.QuotientClosed C)
    (hcyc :
      ∃ (A : Type u) (_ : Group A) (_ : Finite A),
        C A ∧ IsCyclic A ∧ Nontrivial A)
    (Fdata : FreeProCGroupOnConvergingSetData
      (ProC := ProCGroups.ProC.finiteGroupClassProCPredicate C))
    [Finite Fdata.basis] :
    Cardinal.mk Fdata.basis = Generation.topologicalRank Fdata.carrier

The cardinality of a finite converging-set basis is the topological rank of the free pro-\(C\) group, provided the finite class has a nontrivial cyclic quotient witness.

Show proof
def PointedToConvergingSetBasisBridge
    (ProC : ProCGroups.ProC.ProCGroupPredicate.{u}) : Prop :=
  ∀ {X : Type u} [TopologicalSpace X] {x0 : X}
    {F : Type u} [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    {ι : X → F},
      IsPointedFreeProCGroupOn (ProC := ProC) X x0 F ι →
        ∃ Fdata : FreeProCGroupOnConvergingSetData (ProC := ProC),
          Nonempty (Fdata.carrier ≃ₜ* F)

A pointed free pro-\(C\) object can be replaced by a free pro-\(C\) model on a set converging to \(1\). This is the explicit bridge between pointed hypotheses and a Reidemeister--Schreier basis output phrased as a converging-set basis model.

theorem freeOnPointedSpace_has_convergingSetBasis_of_bridge
    (hBridge : PointedToConvergingSetBasisBridge ProC)
    {X : Type u} [TopologicalSpace X] {x0 : X}
    {F : Type u} [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    {ι : X → F}
    (hι : IsPointedFreeProCGroupOn (ProC := ProC) X x0 F ι) :
    ∃ Fdata : FreeProCGroupOnConvergingSetData (ProC := ProC),
      Nonempty (Fdata.carrier ≃ₜ* F)

Apply a PointedToConvergingSetBasisBridge to a pointed free pro-\(C\) object.

Show proof
theorem freeOnFinitePointedDiscreteSpace_has_convergingSetBasis
    {X : Type u} [TopologicalSpace X] [DiscreteTopology X] [Finite X] {x0 : X}
    {F : Type u} [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    {ι : X → F}
    (hι : IsPointedFreeProCGroupOn (ProC := ProC) X x0 F ι) :
    IsFreeProCGroupOnConvergingSet
      (ProC := ProC) {x : X // x ≠ x0} F (fun x => ι x)

For a finite discrete pointed space, removing the basepoint from the pointed generating family gives a converging-set basis.

Show proof
theorem freeOnFinitePointedDiscreteSpace_has_finiteConvergingSetBasis
    {X : Type u} [TopologicalSpace X] [DiscreteTopology X] [Finite X] {x0 : X}
    {F : Type u} [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    {ι : X → F}
    (hι : IsPointedFreeProCGroupOn (ProC := ProC) X x0 F ι) :
    ∃ Fdata : FreeProCGroupOnConvergingSetData (ProC := ProC),
      Nonempty (Fdata.carrier ≃ₜ* F) ∧ Finite Fdata.basis

For a finite discrete pointed space, the resulting converging-set basis is finite.

Show proof