mathlib documentation

category_theory.limits.shapes.kernel_pair

Kernel pairs #

This file defines what it means for a parallel pair of morphisms a b : R ⟶ X to be the kernel pair for a morphism f. Some properties of kernel pairs are given, namely allowing one to transfer between the kernel pair of f₁ ≫ f₂ to the kernel pair of f₁. It is also proved that if f is a coequalizer of some pair, and a,b is a kernel pair for f then it is a coequalizer of a,b.

Implementation #

The definition is essentially just a wrapper for is_limit (pullback_cone.mk _ _ _), but the constructions given here are useful, yet awkward to present in that language, so a basic API is developed here.

TODO #

structure category_theory.is_kernel_pair {C : Type u} [category_theory.category C] {R X Y : C} (f : X Y) (a b : R X) :
Type (max u v)

is_kernel_pair f a b expresses that (a, b) is a kernel pair for f, i.e. a ≫ f = b ≫ f and the square R → X ↓ ↓ X → Y is a pullback square. This is essentially just a convenience wrapper over is_limit (pullback_cone.mk _ _ _).

Instances for category_theory.is_kernel_pair
theorem category_theory.is_kernel_pair.comm_assoc {C : Type u} [category_theory.category C] {R X Y : C} {f : X Y} {a b : R X} (self : category_theory.is_kernel_pair f a b) {X' : C} (f' : Y X') :
a f f' = b f f'
@[protected, instance]

The data expressing that (a, b) is a kernel pair is subsingleton.

If f is a monomorphism, then (𝟙 _, 𝟙 _) is a kernel pair for f.

Equations
def category_theory.is_kernel_pair.lift' {C : Type u} [category_theory.category C] {R X Y : C} {f : X Y} {a b : R X} {S : C} (k : category_theory.is_kernel_pair f a b) (p q : S X) (w : p f = q f) :
{t // t a = p t b = q}

Given a pair of morphisms p, q to X which factor through f, they factor through any kernel pair of f.

Equations
def category_theory.is_kernel_pair.cancel_right {C : Type u} [category_theory.category C] {R X Y Z : C} {a b : R X} {f₁ : X Y} {f₂ : Y Z} (comm : a f₁ = b f₁) (big_k : category_theory.is_kernel_pair (f₁ f₂) a b) :

If (a,b) is a kernel pair for f₁ ≫ f₂ and a ≫ f₁ = b ≫ f₁, then (a,b) is a kernel pair for just f₁. That is, to show that (a,b) is a kernel pair for f₁ it suffices to only show the square commutes, rather than to additionally show it's a pullback.

Equations
def category_theory.is_kernel_pair.cancel_right_of_mono {C : Type u} [category_theory.category C] {R X Y Z : C} {a b : R X} {f₁ : X Y} {f₂ : Y Z} [category_theory.mono f₂] (big_k : category_theory.is_kernel_pair (f₁ f₂) a b) :

If (a,b) is a kernel pair for f₁ ≫ f₂ and f₂ is mono, then (a,b) is a kernel pair for just f₁. The converse of comp_of_mono.

Equations
def category_theory.is_kernel_pair.comp_of_mono {C : Type u} [category_theory.category C] {R X Y Z : C} {a b : R X} {f₁ : X Y} {f₂ : Y Z} [category_theory.mono f₂] (small_k : category_theory.is_kernel_pair f₁ a b) :

If (a,b) is a kernel pair for f₁ and f₂ is mono, then (a,b) is a kernel pair for f₁ ≫ f₂. The converse of cancel_right_of_mono.

Equations
@[protected]
noncomputable def category_theory.is_kernel_pair.pullback {C : Type u} [category_theory.category C] {X Y Z A : C} {g : Y Z} {a₁ a₂ : A Y} (h : category_theory.is_kernel_pair g a₁ a₂) (f : X Z) [category_theory.limits.has_pullback f g] [category_theory.limits.has_pullback f (a₁ g)] :
category_theory.is_kernel_pair category_theory.limits.pullback.fst (category_theory.limits.pullback.map f (a₁ g) f g (𝟙 X) a₁ (𝟙 Z) _ category_theory.is_kernel_pair.pullback._proof_2) (category_theory.limits.pullback.map f (a₁ g) f g (𝟙 X) a₂ (𝟙 Z) _ _)

If a₁ a₂ : A ⟶ Y is a kernel pair for g : Y ⟶ Z, then a₁ ×[Z] X and a₂ ×[Z] X (A ×[Z] X ⟶ Y ×[Z] X) is a kernel pair for Y ×[Z] X ⟶ X.

Equations