ProCGroups.Categorical.AlgebraicPullbacks

49 Theorem | 16 Definition | 1 Abbreviation

This module studies algebraic pullbacks for pro cgroups. Concrete pullback subgroup of \(\beta_1\) and \(\beta_2\). Concrete pullback attached to \(\beta_1\) and \(\beta_2\).

import
  • Mathlib.Algebra.Category.Grp.Limits
  • Mathlib.GroupTheory.QuotientGroup.Basic
Imported by

Declarations

def FiberProduct.subgroup (β₁ : H₁ →* H) (β₂ : H₂ →* H) : Subgroup (H₁ × H₂) where
  carrier := { x | β₁ x.1 = β₂ x.2 }
  one_mem' := by simp only [Set.mem_setOf_eq, Prod.fst_one, map_one, Prod.snd_one]
  mul_mem' := by
    intro x y hx hy
    change β₁ x.1 = β₂ x.2 at hx
    change β₁ y.1 = β₂ y.2 at hy
    simpa [map_mul] using congrArg₂ (· * ·) hx hy
  inv_mem' := by
    intro x hx
    simpa [map_inv, hx]

Concrete pullback subgroup of \(\beta_1\) and \(\beta_2\).

abbrev FiberProduct.carrier (β₁ : H₁ →* H) (β₂ : H₂ →* H) :=
  ↥(FiberProduct.subgroup β₁ β₂)

Concrete pullback attached to \(\beta_1\) and \(\beta_2\).

@[simp] theorem mem_pullbackSubgroup_iff {β₁ : H₁ →* H} {β₂ : H₂ →* H}
    {x : H₁ × H₂} :
    x ∈ FiberProduct.subgroup β₁ β₂ ↔ β₁ x.1 = β₂ x.2

Membership in the pullback subgroup is equivalent to the displayed coordinate condition.

Show proof
def FiberProduct.fst (β₁ : H₁ →* H) (β₂ : H₂ →* H) : FiberProduct.carrier β₁ β₂ →* H₁ where
  toFun := fun x => x.1.1
  map_one' := rfl
  map_mul' := by
    intro x y
    rfl

The first projection from the concrete pullback.

def FiberProduct.snd (β₁ : H₁ →* H) (β₂ : H₂ →* H) : FiberProduct.carrier β₁ β₂ →* H₂ where
  toFun := fun x => x.1.2
  map_one' := rfl
  map_mul' := by
    intro x y
    rfl

The second projection from the concrete pullback.

def FiberProduct.lift (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (h : ∀ k, β₁ (φ₁ k) = β₂ (φ₂ k)) : K →* FiberProduct.carrier β₁ β₂ where
  toFun := fun k => ⟨(φ₁ k, φ₂ k), h k⟩
  map_one' := by
    apply Subtype.ext
    simp only [map_one, OneMemClass.coe_one, Prod.mk_eq_one, and_self]
  map_mul' := by
    intro x y
    apply Subtype.ext
    simp only [map_mul, Subgroup.coe_mul, Prod.mk_mul_mk]

The canonical homomorphism into the concrete pullback.

@[simp] theorem pullbackLift_apply (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (h : ∀ k, β₁ (φ₁ k) = β₂ (φ₂ k)) (k : K) :
    FiberProduct.lift β₁ β₂ φ₁ φ₂ h k = ⟨(φ₁ k, φ₂ k), h k⟩

The canonical lift into a concrete pullback evaluates to the pair of the two coordinate maps.

Show proof
@[simp] theorem pullbackFst_pullbackLift_apply (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (h : ∀ k, β₁ (φ₁ k) = β₂ (φ₂ k)) (k : K) :
    FiberProduct.fst β₁ β₂ (FiberProduct.lift β₁ β₂ φ₁ φ₂ h k) = φ₁ k

The pullback map is evaluated by applying the two coordinate maps.

Show proof
@[simp] theorem pullbackSnd_pullbackLift_apply (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (h : ∀ k, β₁ (φ₁ k) = β₂ (φ₂ k)) (k : K) :
    FiberProduct.snd β₁ β₂ (FiberProduct.lift β₁ β₂ φ₁ φ₂ h k) = φ₂ k

The pullback map is evaluated by applying the two coordinate maps.

Show proof
def FiberProduct.cone (β₁ : H₁ →* H) (β₂ : H₂ →* H) :
    PullbackCone (GrpCat.ofHom β₁) (GrpCat.ofHom β₂) :=
  PullbackCone.mk
    (GrpCat.ofHom (FiberProduct.fst β₁ β₂))
    (GrpCat.ofHom (FiberProduct.snd β₁ β₂))
    (by
      apply GrpCat.hom_ext
      ext x
      exact x.2)

The concrete group pullback as a categorical pullback cone in GrpCat.

def FiberProduct.isLimitCone (β₁ : H₁ →* H) (β₂ : H₂ →* H) :
    IsLimit (FiberProduct.cone β₁ β₂) := by
  refine PullbackCone.IsLimit.mk (by
    apply GrpCat.hom_ext
    ext x
    exact x.2) ?lift ?fac_left ?fac_right ?uniq
  · intro s
    exact GrpCat.ofHom <|
      FiberProduct.lift β₁ β₂ s.fst.hom s.snd.hom (fun x => by
        have hcondition :
            (s.fst ≫ GrpCat.ofHom β₁).hom =
              (s.snd ≫ GrpCat.ofHom β₂).hom :=
          congrArg (fun f : s.pt ⟶ GrpCat.of H => f.hom) s.condition
        exact DFunLike.congr_fun hcondition x)
  · intro s
    apply GrpCat.hom_ext
    rfl
  · intro s
    apply GrpCat.hom_ext
    rfl
  · intro s m hfst hsnd
    apply GrpCat.hom_ext
    ext x
    · have hfst' :
          (m ≫ GrpCat.ofHom (FiberProduct.fst β₁ β₂)).hom = s.fst.hom :=
        congrArg (fun f : s.pt ⟶ GrpCat.of H₁ => f.hom) hfst
      exact DFunLike.congr_fun hfst' x
    · have hsnd' :
          (m ≫ GrpCat.ofHom (FiberProduct.snd β₁ β₂)).hom = s.snd.hom :=
        congrArg (fun f : s.pt ⟶ GrpCat.of H₂ => f.hom) hsnd
      exact DFunLike.congr_fun hsnd' x

The concrete group pullback cone is a limit cone in GrpCat.

@[simp] theorem ker_pullbackLift (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (h : ∀ k, β₁ (φ₁ k) = β₂ (φ₂ k)) :
    (FiberProduct.lift β₁ β₂ φ₁ φ₂ h).ker = φ₁.ker ⊓ φ₂.ker

The kernel of the canonical map into a concrete pullback is the intersection of the two coordinate kernels.

Show proof
theorem pullbackLift_injective_iff (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (h : ∀ k, β₁ (φ₁ k) = β₂ (φ₂ k)) :
    Function.Injective (FiberProduct.lift β₁ β₂ φ₁ φ₂ h) ↔ φ₁.ker ⊓ φ₂.ker = ⊥

The canonical map into a concrete pullback is injective iff the two coordinate kernels intersect trivially.

Show proof
theorem ker_sup_le_ker_comp_of_comp_eq
    (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (hcomp : β₁.comp φ₁ = β₂.comp φ₂) :
    φ₁.ker ⊔ φ₂.ker ≤ (β₁.comp φ₁).ker

The supremum of the two kernels is contained in the kernel of the composite when the composites agree.

Show proof
def HasPullbackKernelCriterion
    (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂) : Prop :=
  β₁.comp φ₁ = β₂.comp φ₂ ∧ (β₁.comp φ₁).ker = φ₁.ker ⊔ φ₂.ker

The standard kernel condition for surjectivity onto a pullback.

theorem HasPullbackKernelCriterion.comp_eq
    {β₁ : H₁ →* H} {β₂ : H₂ →* H}
    {φ₁ : K →* H₁} {φ₂ : K →* H₂}
    (h : HasPullbackKernelCriterion β₁ β₂ φ₁ φ₂) :
    β₁.comp φ₁ = β₂.comp φ₂

In the pullback kernel criterion, the two composites agree.

Show proof
theorem HasPullbackKernelCriterion.ker_eq
    {β₁ : H₁ →* H} {β₂ : H₂ →* H}
    {φ₁ : K →* H₁} {φ₂ : K →* H₂}
    (h : HasPullbackKernelCriterion β₁ β₂ φ₁ φ₂) :
    (β₁.comp φ₁).ker = φ₁.ker ⊔ φ₂.ker

In the pullback kernel criterion, the required kernel equality holds.

Show proof
theorem pullbackLift_surjective_iff_ker_comp_le_sup_ker
    (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (hφ₁ : Function.Surjective φ₁) (hφ₂ : Function.Surjective φ₂)
    (hcomp : β₁.comp φ₁ = β₂.comp φ₂) :
    Function.Surjective (FiberProduct.lift β₁ β₂ φ₁ φ₂
        (fun k => DFunLike.congr_fun hcomp k)) ↔
      (β₁.comp φ₁).ker ≤ φ₁.ker ⊔ φ₂.ker

Surjectivity of the algebraic pullback lift is equivalent to the required kernel equality.

Show proof
theorem pullbackLift_surjective_iff_ker_eq
    (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (hφ₁ : Function.Surjective φ₁) (hφ₂ : Function.Surjective φ₂)
    (hcomp : β₁.comp φ₁ = β₂.comp φ₂) :
    Function.Surjective (FiberProduct.lift β₁ β₂ φ₁ φ₂
        (fun k => DFunLike.congr_fun hcomp k)) ↔
      (β₁.comp φ₁).ker = φ₁.ker ⊔ φ₂.ker

Surjectivity of the algebraic pullback lift is equivalent to the required kernel equality.

Show proof
theorem pullbackLift_surjective_of_hasPullbackKernelCriterion
    (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (hφ₁ : Function.Surjective φ₁) (hφ₂ : Function.Surjective φ₂)
    (hcrit : HasPullbackKernelCriterion β₁ β₂ φ₁ φ₂) :
    Function.Surjective (FiberProduct.lift β₁ β₂ φ₁ φ₂
        (fun k => DFunLike.congr_fun hcrit.comp_eq k))

Surjectivity of the algebraic pullback lift is equivalent to the required kernel equality.

Show proof
@[simp] theorem pullbackFst_pullbackLift (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (h : ∀ k, β₁ (φ₁ k) = β₂ (φ₂ k)) :
    (FiberProduct.fst β₁ β₂).comp (FiberProduct.lift β₁ β₂ φ₁ φ₂ h) = φ₁

Composing the first projection with the canonical pullback lift gives \(\varphi_1\).

Show proof
@[simp] theorem pullbackSnd_pullbackLift (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (h : ∀ k, β₁ (φ₁ k) = β₂ (φ₂ k)) :
    (FiberProduct.snd β₁ β₂).comp (FiberProduct.lift β₁ β₂ φ₁ φ₂ h) = φ₂

Composing the second projection with the canonical pullback lift gives \(\varphi_2\).

Show proof
theorem pullbackLift_injective_of_left_injective (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (h : ∀ k, β₁ (φ₁ k) = β₂ (φ₂ k))
    (hφ₁ : Function.Injective φ₁) :
    Function.Injective (FiberProduct.lift β₁ β₂ φ₁ φ₂ h)

If \(\varphi_1\) is injective, then the canonical map into the concrete pullback is injective.

Show proof
theorem pullbackLift_injective_of_right_injective (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (h : ∀ k, β₁ (φ₁ k) = β₂ (φ₂ k))
    (hφ₂ : Function.Injective φ₂) :
    Function.Injective (FiberProduct.lift β₁ β₂ φ₁ φ₂ h)

If \(\varphi_2\) is injective, then the canonical map into the concrete pullback is injective.

Show proof
def IsPullbackSquare (α₁ : G →* H₁) (α₂ : G →* H₂)
    (β₁ : H₁ →* H) (β₂ : H₂ →* H) : Prop :=
  β₁.comp α₁ = β₂.comp α₂ ∧
    ∀ ⦃K : Type v⦄ [Group K] (φ₁ : K →* H₁) (φ₂ : K →* H₂),
      β₁.comp φ₁ = β₂.comp φ₂ →
      ∃! φ : K →* G, α₁.comp φ = φ₁ ∧ α₂.comp φ = φ₂

The carrier of the fiber product forms a pullback square in the category of groups.

def groupPullbackSquareCone (α₁ : G →* H₁) (α₂ : G →* H₂)
    (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (hcomm : β₁.comp α₁ = β₂.comp α₂) :
    PullbackCone (GrpCat.ofHom β₁) (GrpCat.ofHom β₂) :=
  PullbackCone.mk (GrpCat.ofHom α₁) (GrpCat.ofHom α₂) (by
    apply GrpCat.hom_ext
    exact hcomm)

A commutative square of groups as a categorical pullback cone in GrpCat.

noncomputable def IsPullbackSquare.desc
    {α₁ : G →* H₁} {α₂ : G →* H₂}
    {β₁ : H₁ →* H} {β₂ : H₂ →* H}
    {K : Type v} [Group K]
    (hpb : IsPullbackSquare α₁ α₂ β₁ β₂)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (hφ : β₁.comp φ₁ = β₂.comp φ₂) : K →* G :=
  Classical.choose (ExistsUnique.exists (hpb.2 φ₁ φ₂ hφ))

The pullback universal property supplies the induced morphism.

theorem IsPullbackSquare.desc_spec
    {α₁ : G →* H₁} {α₂ : G →* H₂}
    {β₁ : H₁ →* H} {β₂ : H₂ →* H}
    {K : Type v} [Group K]
    (hpb : IsPullbackSquare α₁ α₂ β₁ β₂)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (hφ : β₁.comp φ₁ = β₂.comp φ₂) :
    α₁.comp (IsPullbackSquare.desc hpb φ₁ φ₂ hφ) = φ₁ ∧
      α₂.comp (IsPullbackSquare.desc hpb φ₁ φ₂ hφ) = φ₂

Specification of the chosen pullback descent map.

Show proof
@[simp 900] theorem IsPullbackSquare.desc_left
    {α₁ : G →* H₁} {α₂ : G →* H₂}
    {β₁ : H₁ →* H} {β₂ : H₂ →* H}
    {K : Type v} [Group K]
    (hpb : IsPullbackSquare α₁ α₂ β₁ β₂)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (hφ : β₁.comp φ₁ = β₂.comp φ₂) :
    α₁.comp (IsPullbackSquare.desc hpb φ₁ φ₂ hφ) = φ₁

The left composite of the chosen pullback descent map is the prescribed left leg.

Show proof
@[simp 900] theorem IsPullbackSquare.desc_right
    {α₁ : G →* H₁} {α₂ : G →* H₂}
    {β₁ : H₁ →* H} {β₂ : H₂ →* H}
    {K : Type v} [Group K]
    (hpb : IsPullbackSquare α₁ α₂ β₁ β₂)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (hφ : β₁.comp φ₁ = β₂.comp φ₂) :
    α₂.comp (IsPullbackSquare.desc hpb φ₁ φ₂ hφ) = φ₂

The right composite of the chosen pullback descent map is the prescribed right leg.

Show proof
theorem IsPullbackSquare.desc_uniq
    {α₁ : G →* H₁} {α₂ : G →* H₂}
    {β₁ : H₁ →* H} {β₂ : H₂ →* H}
    {K : Type v} [Group K]
    (hpb : IsPullbackSquare α₁ α₂ β₁ β₂)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (hφ : β₁.comp φ₁ = β₂.comp φ₂)
    {ψ : K →* G}
    (hψ : α₁.comp ψ = φ₁ ∧ α₂.comp ψ = φ₂) :
    ψ = IsPullbackSquare.desc hpb φ₁ φ₂ hφ

Uniqueness of the chosen pullback descent map.

Show proof
noncomputable def isLimit_groupPullbackSquareCone_of_isPullbackSquare
    {α₁ : G →* H₁} {α₂ : G →* H₂}
    {β₁ : H₁ →* H} {β₂ : H₂ →* H}
    (hpb : IsPullbackSquare.{u, u} α₁ α₂ β₁ β₂) :
    IsLimit (groupPullbackSquareCone α₁ α₂ β₁ β₂ hpb.1) := by
  refine PullbackCone.IsLimit.mk (by
    apply GrpCat.hom_ext
    exact hpb.1) ?lift ?fac_left ?fac_right ?uniq
  · intro s
    exact GrpCat.ofHom <|
      IsPullbackSquare.desc hpb s.fst.hom s.snd.hom (by
        exact congrArg (fun f : s.pt ⟶ GrpCat.of H => f.hom) s.condition)
  · intro s
    apply GrpCat.hom_ext
    exact IsPullbackSquare.desc_left hpb s.fst.hom s.snd.hom
      (by exact congrArg (fun f : s.pt ⟶ GrpCat.of H => f.hom) s.condition)
  · intro s
    apply GrpCat.hom_ext
    exact IsPullbackSquare.desc_right hpb s.fst.hom s.snd.hom
      (by exact congrArg (fun f : s.pt ⟶ GrpCat.of H => f.hom) s.condition)
  · intro s m hfst hsnd
    apply GrpCat.hom_ext
    apply IsPullbackSquare.desc_uniq hpb s.fst.hom s.snd.hom
      (by exact congrArg (fun f : s.pt ⟶ GrpCat.of H => f.hom) s.condition)
    constructor
    · exact congrArg (fun f : s.pt ⟶ GrpCat.of H₁ => f.hom) hfst
    · exact congrArg (fun f : s.pt ⟶ GrpCat.of H₂ => f.hom) hsnd

The hand-written group pullback property gives a categorical IsLimit cone in GrpCat.

noncomputable def isPullbackSquare_of_isLimit_groupPullbackSquareCone
    {α₁ : G →* H₁} {α₂ : G →* H₂}
    {β₁ : H₁ →* H} {β₂ : H₂ →* H}
    (hcomm : β₁.comp α₁ = β₂.comp α₂)
    (hlim : IsLimit (groupPullbackSquareCone α₁ α₂ β₁ β₂ hcomm)) :
    IsPullbackSquare.{u, u} α₁ α₂ β₁ β₂ := by
  refine ⟨hcomm, ?_⟩
  intro K _ φ₁ φ₂ hφ
  let s : PullbackCone (GrpCat.ofHom β₁) (GrpCat.ofHom β₂) :=
    PullbackCone.mk (GrpCat.ofHom φ₁) (GrpCat.ofHom φ₂) (by
      apply GrpCat.hom_ext
      exact hφ)
  let φ : K →* G := (PullbackCone.IsLimit.lift hlim (GrpCat.ofHom φ₁)
    (GrpCat.ofHom φ₂) (by
      apply GrpCat.hom_ext
      exact hφ)).hom
  refine ⟨φ, ?_, ?_⟩
  · constructor
    · exact congrArg (fun f : GrpCat.of K ⟶ GrpCat.of H₁ => f.hom)
        (PullbackCone.IsLimit.lift_fst hlim (GrpCat.ofHom φ₁) (GrpCat.ofHom φ₂) (by
          apply GrpCat.hom_ext
          exact hφ))
    · exact congrArg (fun f : GrpCat.of K ⟶ GrpCat.of H₂ => f.hom)
        (PullbackCone.IsLimit.lift_snd hlim (GrpCat.ofHom φ₁) (GrpCat.ofHom φ₂) (by
          apply GrpCat.hom_ext
          exact hφ))
  · intro ψ hψ
    exact congrArg (fun f : GrpCat.of K ⟶ GrpCat.of G => f.hom) <| by
      change GrpCat.ofHom ψ =
        PullbackCone.IsLimit.lift hlim (GrpCat.ofHom φ₁) (GrpCat.ofHom φ₂) (by
          apply GrpCat.hom_ext
          exact hφ)
      apply PullbackCone.IsLimit.hom_ext hlim
      · apply GrpCat.hom_ext
        calc
          (GrpCat.ofHom ψ ≫ (groupPullbackSquareCone α₁ α₂ β₁ β₂ hcomm).fst).hom =
              α₁.comp ψ := rfl
          _ = φ₁ := hψ.1
          _ = (GrpCat.ofHom φ₁).hom := rfl
          _ =
              (PullbackCone.IsLimit.lift hlim (GrpCat.ofHom φ₁) (GrpCat.ofHom φ₂) (by
                    apply GrpCat.hom_ext
                    exact hφ) ≫
                  (groupPullbackSquareCone α₁ α₂ β₁ β₂ hcomm).fst).hom := by
                symm
                exact congrArg (fun f : GrpCat.of K ⟶ GrpCat.of H₁ => f.hom)
                  (PullbackCone.IsLimit.lift_fst hlim (GrpCat.ofHom φ₁) (GrpCat.ofHom φ₂)
                    (by
                      apply GrpCat.hom_ext
                      exact hφ))
      · apply GrpCat.hom_ext
        calc
          (GrpCat.ofHom ψ ≫ (groupPullbackSquareCone α₁ α₂ β₁ β₂ hcomm).snd).hom =
              α₂.comp ψ := rfl
          _ = φ₂ := hψ.2
          _ = (GrpCat.ofHom φ₂).hom := rfl
          _ =
              (PullbackCone.IsLimit.lift hlim (GrpCat.ofHom φ₁) (GrpCat.ofHom φ₂) (by
                    apply GrpCat.hom_ext
                    exact hφ) ≫
                  (groupPullbackSquareCone α₁ α₂ β₁ β₂ hcomm).snd).hom := by
                symm
                exact congrArg (fun f : GrpCat.of K ⟶ GrpCat.of H₂ => f.hom)
                  (PullbackCone.IsLimit.lift_snd hlim (GrpCat.ofHom φ₁) (GrpCat.ofHom φ₂)
                    (by
                      apply GrpCat.hom_ext
                      exact hφ))

A categorical IsLimit cone in GrpCat gives the hand-written group pullback property.

theorem isPullbackSquare_iff_nonempty_isLimit_groupPullbackSquareCone
    {α₁ : G →* H₁} {α₂ : G →* H₂}
    {β₁ : H₁ →* H} {β₂ : H₂ →* H}
    (hcomm : β₁.comp α₁ = β₂.comp α₂) :
    IsPullbackSquare.{u, u} α₁ α₂ β₁ β₂ ↔
      Nonempty (IsLimit (groupPullbackSquareCone α₁ α₂ β₁ β₂ hcomm))

Same-universe hand-written group pullback squares are exactly categorical limit cones in GrpCat, up to the choice of IsLimit data.

Show proof
theorem FiberProduct.hom_ext {β₁ : H₁ →* H} {β₂ : H₂ →* H}
    {K : Type v} [Group K]
    {ψ ψ' : K →* FiberProduct.carrier β₁ β₂}
    (h₁ : ∀ k, FiberProduct.fst β₁ β₂ (ψ k) = FiberProduct.fst β₁ β₂ (ψ' k))
    (h₂ : ∀ k, FiberProduct.snd β₁ β₂ (ψ k) = FiberProduct.snd β₁ β₂ (ψ' k)) :
    ψ = ψ'

Two homomorphisms into the concrete pullback are equal once both coordinates agree.

Show proof
def congr {β₁ β₁' : H₁ →* H} {β₂ β₂' : H₂ →* H}
    (h₁ : β₁ = β₁') (h₂ : β₂ = β₂') :
    carrier β₁ β₂ ≃* carrier β₁' β₂' := by
  subst β₁'
  subst β₂'
  exact MulEquiv.refl _

Transport a concrete fiber product across equal cospan maps.

@[simp 900] theorem fst_lift (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (h : ∀ k, β₁ (φ₁ k) = β₂ (φ₂ k)) :
    (fst β₁ β₂).comp (lift β₁ β₂ φ₁ φ₂ h) = φ₁

Composing the first projection with a fiber-product lift gives the left map.

Show proof
@[simp 900] theorem snd_lift (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (h : ∀ k, β₁ (φ₁ k) = β₂ (φ₂ k)) :
    (snd β₁ β₂).comp (lift β₁ β₂ φ₁ φ₂ h) = φ₂

Composing the second projection with a fiber-product lift gives the right map.

Show proof
@[simp 900] theorem fst_lift_apply (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (h : ∀ k, β₁ (φ₁ k) = β₂ (φ₂ k)) (k : K) :
    fst β₁ β₂ (lift β₁ β₂ φ₁ φ₂ h k) = φ₁ k

The map is evaluated on an element by its defining coordinate formula.

Show proof
@[simp 900] theorem snd_lift_apply (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (h : ∀ k, β₁ (φ₁ k) = β₂ (φ₂ k)) (k : K) :
    snd β₁ β₂ (lift β₁ β₂ φ₁ φ₂ h k) = φ₂ k

The map is evaluated on an element by its defining coordinate formula.

Show proof
@[simp 900] theorem pullbackLift_eta {β₁ : H₁ →* H} {β₂ : H₂ →* H}
    {K : Type v} [Group K]
    (ψ : K →* FiberProduct.carrier β₁ β₂) :
    FiberProduct.lift β₁ β₂
      ((FiberProduct.fst β₁ β₂).comp ψ)
      ((FiberProduct.snd β₁ β₂).comp ψ)
      (fun k => by exact (ψ k).2) = ψ

The concrete pullback is reconstructed from its two projections by the canonical lift.

Show proof
theorem pullback_isPullback (β₁ : H₁ →* H) (β₂ : H₂ →* H) :
    IsPullbackSquare (FiberProduct.fst β₁ β₂) (FiberProduct.snd β₁ β₂) β₁ β₂

The concrete pullback satisfies the pullback universal property.

Show proof
def pullbackSwap (β₁ : H₁ →* H) (β₂ : H₂ →* H) :
    FiberProduct.carrier β₁ β₂ ≃* FiberProduct.carrier β₂ β₁ where
  toFun := fun x => ⟨(x.1.2, x.1.1), x.2.symm⟩
  invFun := fun x => ⟨(x.1.2, x.1.1), x.2.symm⟩
  left_inv := by
    intro x
    apply Subtype.ext
    rfl
  right_inv := by
    intro x
    apply Subtype.ext
    rfl
  map_mul' := by
    intro x y
    apply Subtype.ext
    rfl

Symmetry of the concrete pullback.

@[simp] theorem pullbackFst_pullbackSwap (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (x : FiberProduct.carrier β₁ β₂) :
    FiberProduct.fst β₂ β₁ (pullbackSwap β₁ β₂ x) = FiberProduct.snd β₁ β₂ x

The first projection after swapping equals the original second projection.

Show proof
@[simp] theorem pullbackSnd_pullbackSwap (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (x : FiberProduct.carrier β₁ β₂) :
    FiberProduct.snd β₂ β₁ (pullbackSwap β₁ β₂ x) = FiberProduct.fst β₁ β₂ x

The second projection after swapping equals the original first projection.

Show proof
@[simp] theorem pullbackSwap_symm (β₁ : H₁ →* H) (β₂ : H₂ →* H) :
    (pullbackSwap β₁ β₂).symm = pullbackSwap β₂ β₁

The symmetry map for the algebraic pullback is inverse to the corresponding swapped pullback comparison.

Show proof
theorem pullbackFst_surjective_of_right_surjective
    (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (hβ₂ : Function.Surjective β₂) :
    Function.Surjective (FiberProduct.fst β₁ β₂)

Surjectivity of the algebraic pullback lift is equivalent to the required kernel equality.

Show proof
theorem pullbackSnd_surjective_of_left_surjective
    (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (hβ₁ : Function.Surjective β₁) :
    Function.Surjective (FiberProduct.snd β₁ β₂)

Surjectivity of the algebraic pullback lift is equivalent to the required kernel equality.

Show proof
theorem pullbackFst_injective_of_right_injective
    (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (hβ₂ : Function.Injective β₂) :
    Function.Injective (FiberProduct.fst β₁ β₂)

If \(\beta_2\) is injective, then the first pullback projection is injective.

Show proof
theorem pullbackSnd_injective_of_left_injective
    (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (hβ₁ : Function.Injective β₁) :
    Function.Injective (FiberProduct.snd β₁ β₂)

If \(\beta_1\) is injective, then the second pullback projection is injective.

Show proof
theorem isPullbackSquare_of_bijective_toConcretePullback
    (α₁ : G →* H₁) (α₂ : G →* H₂) (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (τ : G →* FiberProduct.carrier β₁ β₂)
    (hτ : Function.Bijective τ)
    (h₁ : (FiberProduct.fst β₁ β₂).comp τ = α₁)
    (h₂ : (FiberProduct.snd β₁ β₂).comp τ = α₂) :
    IsPullbackSquare α₁ α₂ β₁ β₂

A square with a bijective comparison map to the concrete pullback is a pullback square.

Show proof
def IsPullbackSquare.toConcretePullback
    (α₁ : G →* H₁) (α₂ : G →* H₂) (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (hpb : IsPullbackSquare α₁ α₂ β₁ β₂) :
    G →* FiberProduct.carrier β₁ β₂ :=
  FiberProduct.lift β₁ β₂ α₁ α₂ (fun g => by
    exact DFunLike.congr_fun hpb.1 g)

The canonical map from an abstract pullback square into the concrete subgroup pullback.

@[simp 900] theorem IsPullbackSquare.toConcretePullback_self
    (β₁ : H₁ →* H) (β₂ : H₂ →* H) :
    IsPullbackSquare.toConcretePullback (FiberProduct.fst β₁ β₂) (FiberProduct.snd β₁ β₂) β₁ β₂
        (pullback_isPullback.{u, u} β₁ β₂) =
      MonoidHom.id (FiberProduct.carrier β₁ β₂)

The canonical comparison map from the concrete pullback to itself is the identity.

Show proof
@[simp 900] theorem IsPullbackSquare.fst_toConcretePullback
    (α₁ : G →* H₁) (α₂ : G →* H₂) (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (hpb : IsPullbackSquare α₁ α₂ β₁ β₂) :
    (FiberProduct.fst β₁ β₂).comp (IsPullbackSquare.toConcretePullback α₁ α₂ β₁ β₂ hpb) = α₁

The first coordinate of the canonical comparison map recovers \(\alpha_1\).

Show proof
@[simp 900] theorem IsPullbackSquare.snd_toConcretePullback
    (α₁ : G →* H₁) (α₂ : G →* H₂) (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (hpb : IsPullbackSquare α₁ α₂ β₁ β₂) :
    (FiberProduct.snd β₁ β₂).comp (IsPullbackSquare.toConcretePullback α₁ α₂ β₁ β₂ hpb) = α₂

The second coordinate of the canonical comparison map recovers \(\alpha_2\).

Show proof
theorem IsPullbackSquare.bijective_toConcretePullback
    (α₁ : G →* H₁) (α₂ : G →* H₂) (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (hpb : IsPullbackSquare.{u, u} α₁ α₂ β₁ β₂) :
    Function.Bijective (IsPullbackSquare.toConcretePullback α₁ α₂ β₁ β₂ hpb)

Any abstract pullback square is canonically bijective to the concrete pullback.

Show proof
noncomputable def IsPullbackSquare.concretePullbackEquiv
    (α₁ : G →* H₁) (α₂ : G →* H₂) (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (hpb : IsPullbackSquare.{u, u} α₁ α₂ β₁ β₂) :
    G ≃* FiberProduct.carrier β₁ β₂ :=
  MulEquiv.ofBijective
    (IsPullbackSquare.toConcretePullback α₁ α₂ β₁ β₂ hpb)
    (IsPullbackSquare.bijective_toConcretePullback α₁ α₂ β₁ β₂ hpb)

Any abstract pullback square is canonically isomorphic to the concrete pullback.

@[simp] theorem IsPullbackSquare.concretePullbackEquiv_fst
    (α₁ : G →* H₁) (α₂ : G →* H₂) (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (hpb : IsPullbackSquare.{u, u} α₁ α₂ β₁ β₂) :
    (FiberProduct.fst β₁ β₂).comp (IsPullbackSquare.concretePullbackEquiv α₁ α₂ β₁ β₂ hpb).toMonoidHom = α₁

The first coordinate of the pullback comparison equivalence is \(\alpha_1\).

Show proof
@[simp] theorem IsPullbackSquare.concretePullbackEquiv_snd
    (α₁ : G →* H₁) (α₂ : G →* H₂) (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (hpb : IsPullbackSquare.{u, u} α₁ α₂ β₁ β₂) :
    (FiberProduct.snd β₁ β₂).comp (IsPullbackSquare.concretePullbackEquiv α₁ α₂ β₁ β₂ hpb).toMonoidHom = α₂

The second coordinate of the pullback comparison equivalence is \(\alpha_2\).

Show proof
theorem isPullbackSquare_iff_bijective_toConcretePullback
    {α₁ : G →* H₁} {α₂ : G →* H₂} {β₁ : H₁ →* H} {β₂ : H₂ →* H}
    (hcomm : β₁.comp α₁ = β₂.comp α₂) :
    IsPullbackSquare.{u, u} α₁ α₂ β₁ β₂ ↔
      Function.Bijective (FiberProduct.lift β₁ β₂ α₁ α₂ (fun g => by
        exact DFunLike.congr_fun hcomm g))

A square is a pullback if and only if its canonical map to the concrete pullback is bijective.

Show proof
@[simp 900] theorem IsPullbackSquare.toConcretePullback_comp_desc
    (α₁ : G →* H₁) (α₂ : G →* H₂)
    (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (hpb : IsPullbackSquare α₁ α₂ β₁ β₂)
    (φ₁ : K →* H₁) (φ₂ : K →* H₂)
    (hφ : β₁.comp φ₁ = β₂.comp φ₂) :
    (IsPullbackSquare.toConcretePullback α₁ α₂ β₁ β₂ hpb).comp (IsPullbackSquare.desc hpb φ₁ φ₂ hφ) =
      FiberProduct.lift β₁ β₂ φ₁ φ₂ (fun k => DFunLike.congr_fun hφ k)

The canonical comparison map sends the chosen pullback descent map to the concrete pullback lift.

Show proof
theorem IsPullbackSquare.surjective_desc_iff_surjective_lift
    (α₁ : G →* H₁) (α₂ : G →* H₂)
    (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (hpb : IsPullbackSquare.{u, u} α₁ α₂ β₁ β₂)
    (φ₁ : A →* H₁) (φ₂ : A →* H₂)
    (hcomp : β₁.comp φ₁ = β₂.comp φ₂) :
    Function.Surjective (IsPullbackSquare.desc hpb φ₁ φ₂ hcomp) ↔
      Function.Surjective (FiberProduct.lift β₁ β₂ φ₁ φ₂
        (fun a => DFunLike.congr_fun hcomp a))

Surjectivity of the algebraic pullback lift is equivalent to the required kernel equality.

Show proof
theorem IsPullbackSquare.surjective_desc_of_ker_eq
    (α₁ : G →* H₁) (α₂ : G →* H₂)
    (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (hpb : IsPullbackSquare.{u, u} α₁ α₂ β₁ β₂)
    (φ₁ : A →* H₁) (φ₂ : A →* H₂)
    (hφ₁ : Function.Surjective φ₁) (hφ₂ : Function.Surjective φ₂)
    (hcomp : β₁.comp φ₁ = β₂.comp φ₂)
    (hker : (β₁.comp φ₁).ker = φ₁.ker ⊔ φ₂.ker) :
    Function.Surjective (IsPullbackSquare.desc hpb φ₁ φ₂ hcomp)

Surjectivity of the algebraic pullback lift is equivalent to the required kernel equality.

Show proof
theorem surjective_pullbackLift_of_ker_eq
    (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : A →* H₁) (φ₂ : A →* H₂)
    (hφ₁ : Function.Surjective φ₁) (hφ₂ : Function.Surjective φ₂)
    (hcomp : β₁.comp φ₁ = β₂.comp φ₂)
    (hker : (β₁.comp φ₁).ker = φ₁.ker ⊔ φ₂.ker) :
    Function.Surjective (FiberProduct.lift β₁ β₂ φ₁ φ₂ (fun a => by
      exact DFunLike.congr_fun hcomp a))

Surjectivity of the algebraic pullback lift is equivalent to the required kernel equality.

Show proof
theorem bijective_pullbackLift_of_left_injective_of_ker_eq
    (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : A →* H₁) (φ₂ : A →* H₂)
    (hφ₁surj : Function.Surjective φ₁) (hφ₂surj : Function.Surjective φ₂)
    (hcomp : β₁.comp φ₁ = β₂.comp φ₂)
    (hker : (β₁.comp φ₁).ker = φ₁.ker ⊔ φ₂.ker)
    (hφ₁inj : Function.Injective φ₁) :
    Function.Bijective (FiberProduct.lift β₁ β₂ φ₁ φ₂ (fun a => by
      exact DFunLike.congr_fun hcomp a))

The algebraic pullback lift is bijective when the left map is injective and the required kernel equality holds.

Show proof
theorem bijective_pullbackLift_of_right_injective_of_ker_eq
    (β₁ : H₁ →* H) (β₂ : H₂ →* H)
    (φ₁ : A →* H₁) (φ₂ : A →* H₂)
    (hφ₁surj : Function.Surjective φ₁) (hφ₂surj : Function.Surjective φ₂)
    (hcomp : β₁.comp φ₁ = β₂.comp φ₂)
    (hker : (β₁.comp φ₁).ker = φ₁.ker ⊔ φ₂.ker)
    (hφ₂inj : Function.Injective φ₂) :
    Function.Bijective (FiberProduct.lift β₁ β₂ φ₁ φ₂ (fun a => by
      exact DFunLike.congr_fun hcomp a))

The algebraic pullback lift is bijective when the right map is injective and the required kernel equality holds.

Show proof