ProCGroups.FreeProducts.UniversalProperty

71 Theorem | 20 Definition | 7 Structure

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 IsFreeProduct (ι₁ : G₁ →* F) (ι₂ : G₂ →* F) : Prop where
  existsUnique_lift :
    ∀ {K : Type u} [Group K] (φ₁ : G₁ →* K) (φ₂ : G₂ →* K),
      ∃! φ : F →* K, φ.comp ι₁ = φ₁ ∧ φ.comp ι₂ = φ₂

Binary free products, expressed through the usual universal property.

noncomputable def lift (hF : IsFreeProduct ι₁ ι₂)
    {K : Type u} [Group K] (φ₁ : G₁ →* K) (φ₂ : G₂ →* K) : F →* K :=
  Classical.choose (ExistsUnique.exists (hF.existsUnique_lift φ₁ φ₂))

The universal property selects a descent morphism from a binary free product object.

theorem lift_spec (hF : IsFreeProduct ι₁ ι₂)
    {K : Type u} [Group K] (φ₁ : G₁ →* K) (φ₂ : G₂ →* K) :
    (hF.lift φ₁ φ₂).comp ι₁ = φ₁ ∧ (hF.lift φ₁ φ₂).comp ι₂ = φ₂

The chosen free-product descent morphism has the prescribed composites.

Show proof
@[simp] theorem lift_left (hF : IsFreeProduct ι₁ ι₂)
    {K : Type u} [Group K] (φ₁ : G₁ →* K) (φ₂ : G₂ →* K) :
    (hF.lift φ₁ φ₂).comp ι₁ = φ₁

The left composite of the chosen free-product descent morphism is the prescribed left leg.

Show proof
@[simp] theorem lift_right (hF : IsFreeProduct ι₁ ι₂)
    {K : Type u} [Group K] (φ₁ : G₁ →* K) (φ₂ : G₂ →* K) :
    (hF.lift φ₁ φ₂).comp ι₂ = φ₂

The right composite of the chosen free-product descent morphism is the prescribed right leg.

Show proof
theorem lift_unique (hF : IsFreeProduct ι₁ ι₂)
    {K : Type u} [Group K] (φ₁ : G₁ →* K) (φ₂ : G₂ →* K)
    {ψ : F →* K} (hψ : ψ.comp ι₁ = φ₁ ∧ ψ.comp ι₂ = φ₂) :
    ψ = hF.lift φ₁ φ₂

Uniqueness of the chosen free-product descent morphism.

Show proof
@[simp] theorem lift_self (hF : IsFreeProduct ι₁ ι₂) :
    hF.lift ι₁ ι₂ = MonoidHom.id F

The distinguished descent map from a free product object to itself is the identity.

Show proof
theorem hom_ext (hF : IsFreeProduct ι₁ ι₂)
    {K : Type u} [Group K] {ψ ψ' : F →* K}
    (h₁ : ψ.comp ι₁ = ψ'.comp ι₁) (h₂ : ψ.comp ι₂ = ψ'.comp ι₂) :
    ψ = ψ'

Homomorphisms out of a free-product object are equal when they agree on the canonical factors.

Show proof
noncomputable def compare (hF : IsFreeProduct ι₁ ι₂) : F →* F' :=
  hF.lift ι₁' ι₂'

The canonical comparison morphism between two free product objects on the same pair of factors.

@[simp 900] theorem compare_left (hF : IsFreeProduct ι₁ ι₂) :
    (hF.compare (ι₁' := ι₁') (ι₂' := ι₂')).comp ι₁ = ι₁'

The left composite of the canonical comparison map between free product objects is the prescribed left leg.

Show proof
@[simp 900] theorem compare_right (hF : IsFreeProduct ι₁ ι₂) :
    (hF.compare (ι₁' := ι₁') (ι₂' := ι₂')).comp ι₂ = ι₂'

The right composite of the canonical comparison map between free product objects is the prescribed right leg.

Show proof
@[simp 900] theorem compare_self (hF : IsFreeProduct ι₁ ι₂) :
    hF.compare (ι₁' := ι₁) (ι₂' := ι₂) = MonoidHom.id F

The canonical comparison map from a free product object to itself is the identity.

Show proof
theorem compare_comp (hF : IsFreeProduct ι₁ ι₂)
    (hF' : IsFreeProduct ι₁' ι₂') :
    (hF'.compare (ι₁' := ι₁'') (ι₂' := ι₂'') : F' →* F'').comp
        (hF.compare (ι₁' := ι₁') (ι₂' := ι₂') : F →* F') =
      (hF.compare (ι₁' := ι₁'') (ι₂' := ι₂'') : F →* F'')

Composition of free-product comparison maps is the expected direct comparison map.

Show proof
noncomputable def equiv (hF : IsFreeProduct ι₁ ι₂) (hF' : IsFreeProduct ι₁' ι₂') :
    F ≃* F' :=
  MonoidHom.toMulEquiv
    (hF.compare (ι₁' := ι₁') (ι₂' := ι₂') : F →* F')
    (hF'.compare (ι₁' := ι₁) (ι₂' := ι₂) : F' →* F)
    (by
      calc
        (hF'.compare (ι₁' := ι₁) (ι₂' := ι₂) : F' →* F).comp
            (hF.compare (ι₁' := ι₁') (ι₂' := ι₂') : F →* F') =
            (hF.compare (ι₁' := ι₁) (ι₂' := ι₂) : F →* F) := by
          simpa using hF.compare_comp (ι₁'' := ι₁) (ι₂'' := ι₂) hF'
        _ = MonoidHom.id F := hF.compare_self)
    (by
      calc
        (hF.compare (ι₁' := ι₁') (ι₂' := ι₂') : F →* F').comp
            (hF'.compare (ι₁' := ι₁) (ι₂' := ι₂) : F' →* F) =
            (hF'.compare (ι₁' := ι₁') (ι₂' := ι₂') : F' →* F') := by
          simpa using hF'.compare_comp (ι₁'' := ι₁') (ι₂'' := ι₂') hF
        _ = MonoidHom.id F' := hF'.compare_self)

Any two binary free product objects on the same factors are canonically isomorphic.

@[simp] theorem equiv_left (hF : IsFreeProduct ι₁ ι₂) (hF' : IsFreeProduct ι₁' ι₂') :
    (hF.equiv hF').toMonoidHom.comp ι₁ = ι₁'

The left composite of the canonical equivalence between free-product objects is the canonical left map.

Show proof
@[simp] theorem equiv_right (hF : IsFreeProduct ι₁ ι₂) (hF' : IsFreeProduct ι₁' ι₂') :
    (hF.equiv hF').toMonoidHom.comp ι₂ = ι₂'

The right composite of the canonical equivalence between free product objects is the prescribed right leg.

Show proof
theorem equiv_symm_left (hF : IsFreeProduct ι₁ ι₂) (hF' : IsFreeProduct ι₁' ι₂') :
    (hF.equiv hF').symm.toMonoidHom.comp ι₁' = ι₁

Left-leg formula for the inverse canonical free-product equivalence.

Show proof
theorem equiv_symm_right (hF : IsFreeProduct ι₁ ι₂) (hF' : IsFreeProduct ι₁' ι₂') :
    (hF.equiv hF').symm.toMonoidHom.comp ι₂' = ι₂

Right-leg formula for the inverse canonical free-product equivalence.

Show proof
theorem isPushoutSquare (hF : IsFreeProduct ι₁ ι₂) :
    ProCGroups.Categorical.IsPushoutSquare
      (1 : ULift.{u, 0} Unit →* G₁) (1 : ULift.{u, 0} Unit →* G₂) ι₁ ι₂

A binary free product is a pushout over the trivial group.

Show proof
theorem of_isPushoutSquare
    (hpo : ProCGroups.Categorical.IsPushoutSquare
      (1 : ULift.{u, 0} Unit →* G₁) (1 : ULift.{u, 0} Unit →* G₂) ι₁ ι₂) :
    IsFreeProduct ι₁ ι₂

A pushout over the trivial group satisfies the binary free-product universal property.

Show proof
theorem coprod_isFreeProduct (G₁ : Type u) (G₂ : Type u) [Group G₁] [Group G₂] :
    IsFreeProduct
      (Monoid.Coprod.inl : G₁ →* G₁ ∗ G₂)
      (Monoid.Coprod.inr : G₂ →* G₁ ∗ G₂)

The concrete coproduct model satisfies the universal property of the free product in the category of profinite or pro-\(C\) groups.

Show proof
theorem coprod_isPushoutSquare (G₁ : Type u) (G₂ : Type u) [Group G₁] [Group G₂] :
    ProCGroups.Categorical.IsPushoutSquare
      (1 : ULift.{u, 0} Unit →* G₁) (1 : ULift.{u, 0} Unit →* G₂)
      (Monoid.Coprod.inl : G₁ →* G₁ ∗ G₂)
      (Monoid.Coprod.inr : G₂ →* G₁ ∗ G₂)

The concrete coproduct model is a pushout over the trivial group.

Show proof
theorem isFreeProduct_iff_isPushoutSquare {ι₁ : G₁ →* F} {ι₂ : G₂ →* F} :
    IsFreeProduct ι₁ ι₂ ↔
      ProCGroups.Categorical.IsPushoutSquare
        (1 : ULift.{u, 0} Unit →* G₁) (1 : ULift.{u, 0} Unit →* G₂) ι₁ ι₂

Binary free products are exactly pushouts over the trivial group.

Show proof
structure IsFreeProductFamily {A : Type u} (G : A → Type u) [∀ a, Group (G a)]
    {F : Type u} [Group F] (ι : ∀ a, G a →* F) : Prop where
  existsUnique_lift :
    ∀ {K : Type u} [Group K] (φ : ∀ a, G a →* K),
      ∃! ψ : F →* K, ∀ a, ψ.comp (ι a) = φ a

Indexed free products, expressed through the usual universal property.

noncomputable def lift (hF : IsFreeProductFamily G ι)
    {K : Type u} [Group K] (φ : ∀ a, G a →* K) : F →* K :=
  Classical.choose (ExistsUnique.exists (hF.existsUnique_lift φ))

The universal property selects a descent morphism from a family free-product object.

@[simp] theorem lift_ι (hF : IsFreeProductFamily G ι)
    {K : Type u} [Group K] (φ : ∀ a, G a →* K) (a : A) :
    (hF.lift φ).comp (ι a) = φ a

The universal lift from a free product family restricts to the prescribed component map.

Show proof
theorem lift_unique (hF : IsFreeProductFamily G ι)
    {K : Type u} [Group K] (φ : ∀ a, G a →* K)
    {ψ : F →* K} (hψ : ∀ a, ψ.comp (ι a) = φ a) :
    ψ = hF.lift φ

Uniqueness of the chosen family free-product descent morphism.

Show proof
@[simp] theorem lift_self (hF : IsFreeProductFamily G ι) :
    hF.lift ι = MonoidHom.id F

The distinguished descent map from a family free-product object to itself is the identity.

Show proof
theorem hom_ext (hF : IsFreeProductFamily G ι)
    {K : Type u} [Group K] {ψ ψ' : F →* K}
    (h : ∀ a, ψ.comp (ι a) = ψ'.comp (ι a)) :
    ψ = ψ'

Homomorphisms out of a family free-product object are equal when they agree on every canonical factor.

Show proof
noncomputable def compare (hF : IsFreeProductFamily G ι) : F →* F' :=
  hF.lift ι'

The canonical comparison morphism between two family free-product objects on the same factors.

@[simp 900] theorem compare_ι (hF : IsFreeProductFamily G ι) (a : A) :
    (hF.compare (ι' := ι')).comp (ι a) = ι' a

The abstract free product comparison map preserves the canonical inclusion maps.

Show proof
@[simp 900] theorem compare_self (hF : IsFreeProductFamily G ι) :
    hF.compare (ι' := ι) = MonoidHom.id F

The canonical comparison map from a family free-product object to itself is the identity.

Show proof
theorem compare_comp (hF : IsFreeProductFamily G ι)
    (hF' : IsFreeProductFamily G ι') :
    (hF'.compare (ι' := ι'') : F' →* F'').comp
        (hF.compare (ι' := ι') : F →* F') =
      (hF.compare (ι' := ι'') : F →* F'')

Composition of family free-product comparison maps is the expected direct comparison map.

Show proof
noncomputable def equiv (hF : IsFreeProductFamily G ι) (hF' : IsFreeProductFamily G ι') :
    F ≃* F' :=
  MonoidHom.toMulEquiv
    (hF.compare (ι' := ι') : F →* F') (hF'.compare (ι' := ι) : F' →* F)
    (by
      calc
        (hF'.compare (ι' := ι) : F' →* F).comp (hF.compare (ι' := ι') : F →* F') =
            (hF.compare (ι' := ι) : F →* F) := by
          simpa using hF.compare_comp (ι'' := ι) hF'
        _ = MonoidHom.id F := hF.compare_self)
    (by
      calc
        (hF.compare (ι' := ι') : F →* F').comp (hF'.compare (ι' := ι) : F' →* F) =
            (hF'.compare (ι' := ι') : F' →* F') := by
          simpa using hF'.compare_comp (ι'' := ι') hF
        _ = MonoidHom.id F' := hF'.compare_self)

Any two family free-product objects on the same factors are canonically isomorphic.

@[simp] theorem equiv_ι (hF : IsFreeProductFamily G ι) (hF' : IsFreeProductFamily G ι')
    (a : A) :
    (hF.equiv hF').toMonoidHom.comp (ι a) = ι' a

The comparison equivalence respects the \(\iota\)-component of the free product family.

Show proof
theorem equiv_symm_ι (hF : IsFreeProductFamily G ι) (hF' : IsFreeProductFamily G ι')
    (a : A) :
    (hF.equiv hF').symm.toMonoidHom.comp (ι' a) = ι a

The inverse comparison equivalence respects the \(\iota\)-component of the free product family.

Show proof
structure IsTopologicalFreeProduct (ι₁ : G₁ →ₜ* F) (ι₂ : G₂ →ₜ* F) : Prop where
  isFreeProduct : IsFreeProduct ι₁.toMonoidHom ι₂.toMonoidHom
  lift_continuous :
    ∀ {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K],
      ∀ (φ₁ : G₁ →ₜ* K) (φ₂ : G₂ →ₜ* K),
        Continuous (isFreeProduct.lift φ₁.toMonoidHom φ₂.toMonoidHom)

A topology on an abstract binary free product compatible with the usual continuous universal property. This is the interface needed to turn a pro-\(C\) completion of the topological free product into a free pro-\(C\) product.

noncomputable def lift (hF : IsTopologicalFreeProduct ι₁ ι₂)
    {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K]
    (φ₁ : G₁ →ₜ* K) (φ₂ : G₂ →ₜ* K) : F →ₜ* K where
  toMonoidHom := hF.isFreeProduct.lift φ₁.toMonoidHom φ₂.toMonoidHom
  continuous_toFun := hF.lift_continuous φ₁ φ₂

The universal property selects a descent morphism from a binary free product object.

@[simp] theorem lift_left (hF : IsTopologicalFreeProduct ι₁ ι₂)
    {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K]
    (φ₁ : G₁ →ₜ* K) (φ₂ : G₂ →ₜ* K) :
    (hF.lift φ₁ φ₂).comp ι₁ = φ₁

The left composite of the chosen free-product descent morphism is the prescribed left leg.

Show proof
@[simp 900] theorem lift_right (hF : IsTopologicalFreeProduct ι₁ ι₂)
    {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K]
    (φ₁ : G₁ →ₜ* K) (φ₂ : G₂ →ₜ* K) :
    (hF.lift φ₁ φ₂).comp ι₂ = φ₂

The right composite of the chosen free-product descent morphism is the prescribed right leg.

Show proof
structure IsFreeProCProduct (ι₁ : G₁ →ₜ* F) (ι₂ : G₂ →ₜ* F) : Prop where
  isProC : ProC (G := F)
  existsUnique_lift :
    ∀ {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K],
      ProC (G := K) →
      ∀ (φ₁ : G₁ →ₜ* K) (φ₂ : G₂ →ₜ* K),
        ∃! φ : F →ₜ* K, φ.comp ι₁ = φ₁ ∧ φ.comp ι₂ = φ₂

Binary free pro-\(C\) products via the strengthened universal property used elsewhere in the project: every pair of continuous homomorphisms into a pro-\(C\) target extends uniquely.

def HasFreeProCProductMappingProperty (ι₁ : G₁ →ₜ* F) (ι₂ : G₂ →ₜ* F) : Prop :=
  ∀ {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K],
    ProC (G := K) →
    ∀ (φ₁ : G₁ →ₜ* K) (φ₂ : G₂ →ₜ* K),
      ∃! φ : F →ₜ* K, φ.comp ι₁ = φ₁ ∧ φ.comp ι₂ = φ₂

The mapping property part of a binary free pro-\(C\) product.

structure IsFreeProCProductOfProCObjects
    [IsTopologicalGroup G₁] [IsTopologicalGroup G₂]
    (ι₁ : G₁ →ₜ* F) (ι₂ : G₂ →ₜ* F) : Prop where
  left_isProC : ProC (G := G₁)
  right_isProC : ProC (G := G₂)
  product_isProC : ProC (G := F)
  property : HasFreeProCProductMappingProperty (ProC := ProC) ι₁ ι₂

A stricter free pro-\(C\) product statement in which the factors are also pro-\(C\) objects.

noncomputable def lift (hF : IsFreeProCProduct (ProC := ProC) ι₁ ι₂)
    {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K]
    (hK : ProC (G := K))
    (φ₁ : G₁ →ₜ* K) (φ₂ : G₂ →ₜ* K) : F →ₜ* K :=
  Classical.choose (ExistsUnique.exists (hF.existsUnique_lift hK φ₁ φ₂))

The universal property selects a descent morphism from a binary free product object.

theorem lift_spec (hF : IsFreeProCProduct (ProC := ProC) ι₁ ι₂)
    {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K]
    (hK : ProC (G := K))
    (φ₁ : G₁ →ₜ* K) (φ₂ : G₂ →ₜ* K) :
    (hF.lift hK φ₁ φ₂).comp ι₁ = φ₁ ∧ (hF.lift hK φ₁ φ₂).comp ι₂ = φ₂

The chosen free-product descent morphism has the prescribed composites.

Show proof
@[simp] theorem lift_left (hF : IsFreeProCProduct (ProC := ProC) ι₁ ι₂)
    {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K]
    (hK : ProC (G := K))
    (φ₁ : G₁ →ₜ* K) (φ₂ : G₂ →ₜ* K) :
    (hF.lift hK φ₁ φ₂).comp ι₁ = φ₁

The left composite of the chosen free-product descent morphism is the prescribed left leg.

Show proof
@[simp] theorem lift_right (hF : IsFreeProCProduct (ProC := ProC) ι₁ ι₂)
    {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K]
    (hK : ProC (G := K))
    (φ₁ : G₁ →ₜ* K) (φ₂ : G₂ →ₜ* K) :
    (hF.lift hK φ₁ φ₂).comp ι₂ = φ₂

The right composite of the chosen free-product descent morphism is the prescribed right leg.

Show proof
theorem lift_unique (hF : IsFreeProCProduct (ProC := ProC) ι₁ ι₂)
    {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K]
    (hK : ProC (G := K))
    (φ₁ : G₁ →ₜ* K) (φ₂ : G₂ →ₜ* K)
    {ψ : F →ₜ* K} (hψ : ψ.comp ι₁ = φ₁ ∧ ψ.comp ι₂ = φ₂) :
    ψ = hF.lift hK φ₁ φ₂

Uniqueness of the chosen free-product descent morphism.

Show proof
@[simp] theorem lift_self (hF : IsFreeProCProduct (ProC := ProC) ι₁ ι₂) :
    hF.lift hF.isProC ι₁ ι₂ = ContinuousMonoidHom.id F

The distinguished descent map from a free product object to itself is the identity.

Show proof
theorem hom_ext (hF : IsFreeProCProduct (ProC := ProC) ι₁ ι₂)
    {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K]
    (hK : ProC (G := K))
    {ψ ψ' : F →ₜ* K}
    (h₁ : ψ.comp ι₁ = ψ'.comp ι₁) (h₂ : ψ.comp ι₂ = ψ'.comp ι₂) :
    ψ = ψ'

Homomorphisms out of a free-product object are equal when they agree on the canonical factors.

Show proof
noncomputable def compare (hF : IsFreeProCProduct (ProC := ProC) ι₁ ι₂)
    (hF' : IsFreeProCProduct (ProC := ProC) ι₁' ι₂') :
    F →ₜ* F' :=
  hF.lift hF'.isProC ι₁' ι₂'

The canonical comparison morphism between two free product objects on the same pair of factors.

@[simp 900] theorem compare_left (hF : IsFreeProCProduct (ProC := ProC) ι₁ ι₂)
    (hF' : IsFreeProCProduct (ProC := ProC) ι₁' ι₂') :
    (hF.compare hF').comp ι₁ = ι₁'

The left composite of the canonical comparison map between free product objects is the prescribed left leg.

Show proof
@[simp 900] theorem compare_right (hF : IsFreeProCProduct (ProC := ProC) ι₁ ι₂)
    (hF' : IsFreeProCProduct (ProC := ProC) ι₁' ι₂') :
    (hF.compare hF').comp ι₂ = ι₂'

The right composite of the canonical comparison map between free product objects is the prescribed right leg.

Show proof
@[simp 900] theorem compare_self (hF : IsFreeProCProduct (ProC := ProC) ι₁ ι₂) :
    hF.compare hF = ContinuousMonoidHom.id F

The canonical comparison map from a free product object to itself is the identity.

Show proof
theorem compare_comp (hF : IsFreeProCProduct (ProC := ProC) ι₁ ι₂)
    (hF' : IsFreeProCProduct (ProC := ProC) ι₁' ι₂')
    (hF'' : IsFreeProCProduct (ProC := ProC) ι₁'' ι₂'') :
    (hF'.compare hF'').comp (hF.compare hF') = hF.compare hF''

Composition of free-product comparison maps is the expected direct comparison map.

Show proof
noncomputable def equiv (hF : IsFreeProCProduct (ProC := ProC) ι₁ ι₂)
    (hF' : IsFreeProCProduct (ProC := ProC) ι₁' ι₂') :
    F ≃ₜ* F' := by
  let φ : F →ₜ* F' := hF.compare hF'
  let ψ : F' →ₜ* F := hF'.compare hF
  have hleft : ψ.comp φ = ContinuousMonoidHom.id F := by
    calc
      ψ.comp φ = hF.compare hF := by
        simpa [φ, ψ] using hF.compare_comp hF' hF
      _ = ContinuousMonoidHom.id F := hF.compare_self
  have hright : φ.comp ψ = ContinuousMonoidHom.id F' := by
    calc
      φ.comp ψ = hF'.compare hF' := by
        simpa [φ, ψ] using hF'.compare_comp hF hF'
      _ = ContinuousMonoidHom.id F' := hF'.compare_self
  refine ContinuousMulEquiv.mk'
    (Homeomorph.mk
      (MonoidHom.toMulEquiv φ.toMonoidHom ψ.toMonoidHom
        (by simpa using congrArg ContinuousMonoidHom.toMonoidHom hleft)
        (by simpa using congrArg ContinuousMonoidHom.toMonoidHom hright))
      φ.continuous_toFun ψ.continuous_toFun)
    ?_
  intro x y
  exact φ.map_mul x y

Any two binary free product objects on the same factors are canonically isomorphic.

@[simp] theorem equiv_left (hF : IsFreeProCProduct (ProC := ProC) ι₁ ι₂)
    (hF' : IsFreeProCProduct (ProC := ProC) ι₁' ι₂') :
    ((hF.equiv hF' : F →ₜ* F').comp ι₁) = ι₁'

The left composite of the canonical equivalence between free-product objects is the canonical left map.

Show proof
@[simp] theorem equiv_right (hF : IsFreeProCProduct (ProC := ProC) ι₁ ι₂)
    (hF' : IsFreeProCProduct (ProC := ProC) ι₁' ι₂') :
    ((hF.equiv hF' : F →ₜ* F').comp ι₂) = ι₂'

The right composite of the canonical equivalence between free product objects is the prescribed right leg.

Show proof
theorem equiv_symm_left (hF : IsFreeProCProduct (ProC := ProC) ι₁ ι₂)
    (hF' : IsFreeProCProduct (ProC := ProC) ι₁' ι₂') :
    (((hF.equiv hF').symm : F' →ₜ* F).comp ι₁') = ι₁

Left-leg formula for the inverse canonical free-product equivalence.

Show proof
theorem equiv_symm_right (hF : IsFreeProCProduct (ProC := ProC) ι₁ ι₂)
    (hF' : IsFreeProCProduct (ProC := ProC) ι₁' ι₂') :
    (((hF.equiv hF').symm : F' →ₜ* F).comp ι₂') = ι₂

Right-leg formula for the inverse canonical free-product equivalence.

Show proof
def completionInl
    (_hη : ProCGroups.Completion.IsProCCompletion ProC F₀ Fhat η)
    (j₁ : G₁ →ₜ* F₀) : G₁ →ₜ* Fhat :=
  η.comp j₁

The canonical left factor map into a pro-\(C\) completion of the topological free product model.

def completionInr
    (_hη : ProCGroups.Completion.IsProCCompletion ProC F₀ Fhat η)
    (j₂ : G₂ →ₜ* F₀) : G₂ →ₜ* Fhat :=
  η.comp j₂

The right factor map into a pro-\(C\) completion of a topological free product model.

@[simp 900] theorem completionInl_apply
    (hη : ProCGroups.Completion.IsProCCompletion ProC F₀ Fhat η)
    (j₁ : G₁ →ₜ* F₀) (x : G₁) :
    completionInl (ProC := ProC) hη j₁ x = η (j₁ x)

The completed left inclusion evaluates as \(\eta(j_1 x)\) in the pro-\(C\) completion.

Show proof
@[simp 900] theorem completionInr_apply
    (hη : ProCGroups.Completion.IsProCCompletion ProC F₀ Fhat η)
    (j₂ : G₂ →ₜ* F₀) (x : G₂) :
    completionInr (ProC := ProC) hη j₂ x = η (j₂ x)

The completed right inclusion evaluates as \(\eta(j_2 x)\) in the pro-\(C\) completion.

Show proof
theorem isFreeProCProduct_of_completion
    (hF₀ : IsTopologicalFreeProduct j₁ j₂)
    (hη : ProCGroups.Completion.IsProCCompletion ProC F₀ Fhat η) :
    IsFreeProCProduct (ProC := ProC)
      (completionInl (ProC := ProC) hη j₁)
      (completionInr (ProC := ProC) hη j₂)

A pro-\(C\) completion of a topological free product model is a free pro-\(C\) product. This is the construction theorem separating the topological-free-product model from the pro-\(C\) reflection/completion step.

Show proof
theorem exists_isFreeProCProduct_of_completion
    (hF₀ : IsTopologicalFreeProduct j₁ j₂)
    (hη : ProCGroups.Completion.IsProCCompletion ProC F₀ Fhat η) :
    ∃ (ι₁hat : G₁ →ₜ* Fhat) (ι₂hat : G₂ →ₜ* Fhat),
      IsFreeProCProduct (ProC := ProC) ι₁hat ι₂hat

Existence form of \(isFreeProCProduct_of_completion\), exposing the completed factor maps as the constructed coproduct legs.

Show proof
theorem isProfiniteGroup
    (hF : IsFreeProCProduct (ProC := ProCGroups.ProC.allFiniteProC) ι₁ ι₂) :
    IsProfiniteGroup F

The underlying profiniteness of a free profinite product object.

Show proof
theorem hasProfiniteTestPushoutProperty
    (hF : IsFreeProCProduct (ProC := ProCGroups.ProC.allFiniteProC) ι₁ ι₂) :
    ProCGroups.Categorical.HasProfiniteTestPushoutProperty
      (1 : ULift.{u, 0} Unit →ₜ* G₁) (1 : ULift.{u, 0} Unit →ₜ* G₂) ι₁ ι₂

A binary free profinite product is a pushout over the trivial profinite group.

Show proof
theorem of_hasProfiniteTestPushoutProperty (hF : IsProfiniteGroup F)
    (hpo : ProCGroups.Categorical.HasProfiniteTestPushoutProperty
      (1 : ULift.{u, 0} Unit →ₜ* G₁) (1 : ULift.{u, 0} Unit →ₜ* G₂) ι₁ ι₂) :
    IsFreeProCProduct (ProC := ProCGroups.ProC.allFiniteProC) ι₁ ι₂

A profinite pushout over the trivial group satisfies the binary free profinite-product universal property.

Show proof
theorem iff_hasProfiniteTestPushoutProperty (hF : IsProfiniteGroup F) :
    IsFreeProCProduct (ProC := ProCGroups.ProC.allFiniteProC) ι₁ ι₂ ↔
      ProCGroups.Categorical.HasProfiniteTestPushoutProperty
        (1 : ULift.{u, 0} Unit →ₜ* G₁) (1 : ULift.{u, 0} Unit →ₜ* G₂) ι₁ ι₂

Binary free profinite products are exactly profinite pushouts over the trivial group.

Show proof
structure IsFreeProCProductFamily {A : Type u} (G : A → Type u)
    [∀ a, Group (G a)] [∀ a, TopologicalSpace (G a)] [∀ a, IsTopologicalGroup (G a)]
    {F : Type u} [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    (ι : ∀ a, G a →ₜ* F) : Prop where
  isProC : ProC (G := F)
  existsUnique_lift :
    ∀ {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K],
      ProC (G := K) →
      ∀ (φ : ∀ a, G a →ₜ* K),
        ∃! ψ : F →ₜ* K, ∀ a, ψ.comp (ι a) = φ a

Indexed free pro-\(C\) products satisfy the strengthened universal property used for Kurosh-type decompositions.

noncomputable def lift (hF : IsFreeProCProductFamily (ProC := ProC) G ι)
    {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K]
    (hK : ProC (G := K))
    (φ : ∀ a, G a →ₜ* K) : F →ₜ* K :=
  Classical.choose (ExistsUnique.exists (hF.existsUnique_lift hK φ))

The universal property of a free pro-\(C\) product family supplies the descent morphism for the prescribed component maps.

@[simp] theorem lift_ι (hF : IsFreeProCProductFamily (ProC := ProC) G ι)
    {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K]
    (hK : ProC (G := K))
    (φ : ∀ a, G a →ₜ* K) (a : A) :
    (hF.lift hK φ).comp (ι a) = φ a

The universal lift from a free pro-\(C\) product family restricts to the prescribed component map.

Show proof
theorem lift_unique (hF : IsFreeProCProductFamily (ProC := ProC) G ι)
    {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K]
    (hK : ProC (G := K))
    (φ : ∀ a, G a →ₜ* K)
    {ψ : F →ₜ* K} (hψ : ∀ a, ψ.comp (ι a) = φ a) :
    ψ = hF.lift hK φ

Uniqueness of the chosen free-product descent morphism.

Show proof
@[simp] theorem lift_self (hF : IsFreeProCProductFamily (ProC := ProC) G ι) :
    hF.lift hF.isProC ι = ContinuousMonoidHom.id F

The distinguished descent map from a free product object to itself is the identity.

Show proof
theorem hom_ext (hF : IsFreeProCProductFamily (ProC := ProC) G ι)
    {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K]
    (hK : ProC (G := K))
    {ψ ψ' : F →ₜ* K}
    (h : ∀ a, ψ.comp (ι a) = ψ'.comp (ι a)) :
    ψ = ψ'

Homomorphisms out of a free-product object are equal when they agree on the canonical factors.

Show proof
noncomputable def compare
    (hF : IsFreeProCProductFamily (ProC := ProC) G ι)
    (hF' : IsFreeProCProductFamily (ProC := ProC) G ι') :
    F →ₜ* F' :=
  hF.lift hF'.isProC ι'

The canonical comparison morphism between two free product objects on the same pair of factors.

@[simp 900] theorem compare_ι
    (hF : IsFreeProCProductFamily (ProC := ProC) G ι)
    (hF' : IsFreeProCProductFamily (ProC := ProC) G ι') (a : A) :
    (hF.compare hF').comp (ι a) = ι' a

The free pro-\(C\) product comparison map preserves the canonical inclusion maps.

Show proof
@[simp 900] theorem compare_self (hF : IsFreeProCProductFamily (ProC := ProC) G ι) :
    hF.compare hF = ContinuousMonoidHom.id F

The canonical comparison map from a free product object to itself is the identity.

Show proof
theorem compare_comp
    (hF : IsFreeProCProductFamily (ProC := ProC) G ι)
    (hF' : IsFreeProCProductFamily (ProC := ProC) G ι')
    (hF'' : IsFreeProCProductFamily (ProC := ProC) G ι'') :
    (hF'.compare hF'').comp (hF.compare hF') = hF.compare hF''

Composition of free-product comparison maps is the expected direct comparison map.

Show proof
noncomputable def equiv
    (hF : IsFreeProCProductFamily (ProC := ProC) G ι)
    (hF' : IsFreeProCProductFamily (ProC := ProC) G ι') :
    F ≃ₜ* F' := by
  let φ : F →ₜ* F' := hF.compare hF'
  let ψ : F' →ₜ* F := hF'.compare hF
  have hleft : ψ.comp φ = ContinuousMonoidHom.id F := by
    calc
      ψ.comp φ = hF.compare hF := by
        simpa [φ, ψ] using hF.compare_comp hF' hF
      _ = ContinuousMonoidHom.id F := hF.compare_self
  have hright : φ.comp ψ = ContinuousMonoidHom.id F' := by
    calc
      φ.comp ψ = hF'.compare hF' := by
        simpa [φ, ψ] using hF'.compare_comp hF hF'
      _ = ContinuousMonoidHom.id F' := hF'.compare_self
  refine ContinuousMulEquiv.mk'
    (Homeomorph.mk
      (MonoidHom.toMulEquiv φ.toMonoidHom ψ.toMonoidHom
        (by simpa using congrArg ContinuousMonoidHom.toMonoidHom hleft)
        (by simpa using congrArg ContinuousMonoidHom.toMonoidHom hright))
      φ.continuous_toFun ψ.continuous_toFun)
    ?_
  intro x y
  exact φ.map_mul x y

Any two indexed-family free pro-\(C\) product objects on the same family of factors are canonically isomorphic.

@[simp] theorem equiv_ι
    (hF : IsFreeProCProductFamily (ProC := ProC) G ι)
    (hF' : IsFreeProCProductFamily (ProC := ProC) G ι') (a : A) :
    ((hF.equiv hF' : F →ₜ* F').comp (ι a)) = ι' a

The comparison equivalence respects the \(\iota\)-component of the free pro-\(C\) product family.

Show proof
theorem equiv_symm_ι
    (hF : IsFreeProCProductFamily (ProC := ProC) G ι)
    (hF' : IsFreeProCProductFamily (ProC := ProC) G ι') (a : A) :
    (((hF.equiv hF').symm : F' →ₜ* F).comp (ι' a)) = ι a

The inverse comparison equivalence respects the \(\iota\)-component of the free pro-\(C\) product family.

Show proof
def ContinuousHomFamilyConvergesToOne {A : Type u} (G : A → Type u)
    [∀ a, Group (G a)] [∀ a, TopologicalSpace (G a)]
    {K : Type u} [Group K] [TopologicalSpace K]
    (φ : ∀ a, G a →ₜ* K) : Prop :=
  ∀ U : OpenSubgroup K, {a | ¬ (φ a).toMonoidHom.range ≤ (U : Subgroup K)}.Finite

A family of continuous homomorphisms converges to \(1\) if every open subgroup of the target contains the image of all but finitely many components. This is the convergence hypothesis used in the indexed-family free pro-\(C\) product universal property.

theorem comp (hφ : ContinuousHomFamilyConvergesToOne G φ) (ψ : K →ₜ* L) :
    ContinuousHomFamilyConvergesToOne G (fun a => ψ.comp (φ a))

Postcomposing a convergent family of homomorphisms with a continuous homomorphism preserves convergence to \(1\).

Show proof
structure IsIndexedFreeProCProductFamily {A : Type u} (G : A → Type u)
    [∀ a, Group (G a)] [∀ a, TopologicalSpace (G a)] [∀ a, IsTopologicalGroup (G a)]
    {F : Type u} [Group F] [TopologicalSpace F] [IsTopologicalGroup F]
    (ι : ∀ a, G a →ₜ* F) : Prop where
  isProC : ProC (G := F)
  inclusionsConverge : ContinuousHomFamilyConvergesToOne G ι
  existsUnique_lift :
    ∀ {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K],
      ProC (G := K) →
      ∀ (φ : ∀ a, G a →ₜ* K),
        ContinuousHomFamilyConvergesToOne G φ →
          ∃! ψ : F →ₜ* K, ∀ a, ψ.comp (ι a) = φ a

Indexed free pro-\(C\) products in the infinite indexed-family form: the universal property is tested only against families of maps converging to \(1\), and the distinguished inclusions themselves converge to \(1\).

noncomputable def lift (hF : IsIndexedFreeProCProductFamily (ProC := ProC) G ι)
    {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K]
    (hK : ProC (G := K))
    (φ : ∀ a, G a →ₜ* K)
    (hφ : ContinuousHomFamilyConvergesToOne G φ) : F →ₜ* K :=
  Classical.choose (ExistsUnique.exists (hF.existsUnique_lift hK φ hφ))

The universal property selects a descent morphism from an indexed free-product family object.

@[simp] theorem lift_ι (hF : IsIndexedFreeProCProductFamily (ProC := ProC) G ι)
    {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K]
    (hK : ProC (G := K))
    (φ : ∀ a, G a →ₜ* K)
    (hφ : ContinuousHomFamilyConvergesToOne G φ) (a : A) :
    (hF.lift hK φ hφ).comp (ι a) = φ a

The indexed universal lift from a free pro-\(C\) product family restricts to the prescribed component map.

Show proof
theorem lift_unique (hF : IsIndexedFreeProCProductFamily (ProC := ProC) G ι)
    {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K]
    (hK : ProC (G := K))
    (φ : ∀ a, G a →ₜ* K)
    (hφ : ContinuousHomFamilyConvergesToOne G φ)
    {ψ : F →ₜ* K} (hψ : ∀ a, ψ.comp (ι a) = φ a) :
    ψ = hF.lift hK φ hφ

Uniqueness of the chosen free-product descent morphism.

Show proof
@[simp] theorem lift_self (hF : IsIndexedFreeProCProductFamily (ProC := ProC) G ι) :
    hF.lift hF.isProC ι hF.inclusionsConverge = ContinuousMonoidHom.id F

The distinguished descent map from a free product object to itself is the identity.

Show proof
theorem hom_ext (hF : IsIndexedFreeProCProductFamily (ProC := ProC) G ι)
    {K : Type u} [Group K] [TopologicalSpace K] [IsTopologicalGroup K]
    (hK : ProC (G := K))
    {ψ ψ' : F →ₜ* K}
    (h : ∀ a, ψ.comp (ι a) = ψ'.comp (ι a)) :
    ψ = ψ'

Homomorphisms out of a free-product object are equal when they agree on the canonical factors.

Show proof
noncomputable def compare
    (hF : IsIndexedFreeProCProductFamily (ProC := ProC) G ι)
    (hF' : IsIndexedFreeProCProductFamily (ProC := ProC) G ι') :
    F →ₜ* F' :=
  hF.lift hF'.isProC ι' hF'.inclusionsConverge

The canonical comparison morphism between two free product objects on the same pair of factors.

@[simp 900] theorem compare_ι
    (hF : IsIndexedFreeProCProductFamily (ProC := ProC) G ι)
    (hF' : IsIndexedFreeProCProductFamily (ProC := ProC) G ι') (a : A) :
    (hF.compare hF').comp (ι a) = ι' a

The indexed free pro-\(C\) product comparison map preserves the canonical inclusion maps.

Show proof
@[simp 900] theorem compare_self (hF : IsIndexedFreeProCProductFamily (ProC := ProC) G ι) :
    hF.compare hF = ContinuousMonoidHom.id F

The canonical comparison map from a free product object to itself is the identity.

Show proof
theorem compare_comp
    (hF : IsIndexedFreeProCProductFamily (ProC := ProC) G ι)
    (hF' : IsIndexedFreeProCProductFamily (ProC := ProC) G ι')
    (hF'' : IsIndexedFreeProCProductFamily (ProC := ProC) G ι'') :
    (hF'.compare hF'').comp (hF.compare hF') = hF.compare hF''

Composition of free-product comparison maps is the expected direct comparison map.

Show proof
noncomputable def equiv
    (hF : IsIndexedFreeProCProductFamily (ProC := ProC) G ι)
    (hF' : IsIndexedFreeProCProductFamily (ProC := ProC) G ι') :
    F ≃ₜ* F' := by
  let φ : F →ₜ* F' := hF.compare hF'
  let ψ : F' →ₜ* F := hF'.compare hF
  have hleft : ψ.comp φ = ContinuousMonoidHom.id F := by
    calc
      ψ.comp φ = hF.compare hF := by
        simpa [φ, ψ] using hF.compare_comp hF' hF
      _ = ContinuousMonoidHom.id F := hF.compare_self
  have hright : φ.comp ψ = ContinuousMonoidHom.id F' := by
    calc
      φ.comp ψ = hF'.compare hF' := by
        simpa [φ, ψ] using hF'.compare_comp hF hF'
      _ = ContinuousMonoidHom.id F' := hF'.compare_self
  refine ContinuousMulEquiv.mk'
    (Homeomorph.mk
      (MonoidHom.toMulEquiv φ.toMonoidHom ψ.toMonoidHom
        (by simpa using congrArg ContinuousMonoidHom.toMonoidHom hleft)
        (by simpa using congrArg ContinuousMonoidHom.toMonoidHom hright))
      φ.continuous_toFun ψ.continuous_toFun)
    ?_
  intro x y
  exact φ.map_mul x y

Any two indexed free pro-\(C\) product objects on the same indexed family of factors are canonically isomorphic.

@[simp] theorem equiv_ι
    (hF : IsIndexedFreeProCProductFamily (ProC := ProC) G ι)
    (hF' : IsIndexedFreeProCProductFamily (ProC := ProC) G ι') (a : A) :
    ((hF.equiv hF' : F →ₜ* F').comp (ι a)) = ι' a

The indexed comparison equivalence respects the \(\iota\)-component of the free pro-\(C\) product family.

Show proof
theorem equiv_symm_ι
    (hF : IsIndexedFreeProCProductFamily (ProC := ProC) G ι)
    (hF' : IsIndexedFreeProCProductFamily (ProC := ProC) G ι') (a : A) :
    (((hF.equiv hF').symm : F' →ₜ* F).comp (ι' a)) = ι a

The inverse indexed comparison equivalence respects the \(\iota\)-component of the free pro-\(C\) product family.

Show proof