# Documentation

Mathlib.CategoryTheory.Quotient

# Quotient category #

Constructs the quotient of a category by an arbitrary family of relations on its hom-sets, by introducing a type synonym for the objects, and identifying homs as necessary.

This is analogous to 'the quotient of a group by the normal closure of a subset', rather than 'the quotient of a group by a normal subgroup'. When taking the quotient by a congruence relation, functor_map_eq_iff says that no unnecessary identifications have been made.

def HomRel (C : Type u_1) [] :
Sort (max (u_1 + 1) u_2)

A HomRel on C consists of a relation on every hom-set.

Instances For
instance instInhabitedHomRel (C : Type u_1) [] :
class CategoryTheory.Congruence {C : Type u_1} [] (r : ) :
• equivalence : ∀ {X Y : C},

r is an equivalence on every hom-set.

• compLeft : ∀ {X Y Z : C} (f : X Y) {g g' : Y Z}, r g g'

Precomposition with an arrow respects r.

• compRight : ∀ {X Y Z : C} {f f' : X Y} (g : Y Z), r f f'

Postcomposition with an arrow respects r.

A HomRel is a congruence when it's an equivalence on every hom-set, and it can be composed from left and right.

Instances
theorem CategoryTheory.Quotient.ext_iff {C : Type u_1} :
∀ {inst : } {r : } (x y : ), x = y x.as = y.as
theorem CategoryTheory.Quotient.ext {C : Type u_1} :
∀ {inst : } {r : } (x y : ), x.as = y.asx = y
structure CategoryTheory.Quotient {C : Type u_1} [] (r : ) :
Type u_1
• as : C

The object of C.

A type synonym for C, thought of as the objects of the quotient category.

Instances For
instance CategoryTheory.instInhabitedQuotient {C : Type u_1} [] (r : ) [] :
inductive CategoryTheory.Quotient.CompClosure {C : Type u_1} [] (r : ) ⦃s : C ⦃t : C :
(s t) → (s t) → Prop
• intro: ∀ {C : Type u_1} [inst : ] {r : } ⦃s t : C⦄ {a b : C} (f : s a) (m₁ m₂ : a b) (g : b t), r m₁ m₂

Generates the closure of a family of relations w.r.t. composition from left and right.

Instances For
theorem CategoryTheory.Quotient.CompClosure.of {C : Type u_2} [] (r : ) {a : C} {b : C} (m₁ : a b) (m₂ : a b) (h : r a b m₁ m₂) :
theorem CategoryTheory.Quotient.comp_left {C : Type u_2} [] (r : ) {a : C} {b : C} {c : C} (f : a b) (g₁ : b c) (g₂ : b c) :
theorem CategoryTheory.Quotient.comp_right {C : Type u_2} [] (r : ) {a : C} {b : C} {c : C} (g : b c) (f₁ : a b) (f₂ : a b) :
def CategoryTheory.Quotient.Hom {C : Type u_1} [] (r : ) (s : ) (t : ) :
Type u_2

Hom-sets of the quotient category.

Instances For
instance CategoryTheory.Quotient.instInhabitedHom {C : Type u_1} [] (r : ) (a : ) :
def CategoryTheory.Quotient.comp {C : Type u_1} [] (r : ) ⦃a : ⦃b : ⦃c : :

Composition in the quotient category.

Instances For
@[simp]
theorem CategoryTheory.Quotient.comp_mk {C : Type u_1} [] (r : ) {a : } {b : } {c : } (f : a.as b.as) (g : b.as c.as) :
instance CategoryTheory.Quotient.category {C : Type u_1} [] (r : ) :
def CategoryTheory.Quotient.functor {C : Type u_1} [] (r : ) :

The functor from a category to its quotient.

Instances For
noncomputable instance CategoryTheory.Quotient.fullFunctor {C : Type u_1} [] (r : ) :
theorem CategoryTheory.Quotient.induction {C : Type u_1} [] (r : ) {P : {a b : } → (a b) → Prop} (h : {x y : C} → (f : x y) → P (().obj x) (().obj y) (().map f)) {a : } {b : } (f : a b) :
P a b f
theorem CategoryTheory.Quotient.sound {C : Type u_2} [] (r : ) {a : C} {b : C} {f₁ : a b} {f₂ : a b} (h : r a b f₁ f₂) :
().map f₁ = ().map f₂
theorem CategoryTheory.Quotient.compClosure_iff_self {C : Type u_1} [] (r : ) [h : ] {X : C} {Y : C} (f : X Y) (g : X Y) :
r X Y f g
@[simp]
theorem CategoryTheory.Quotient.compClosure_eq_self {C : Type u_1} [] (r : ) [h : ] :
theorem CategoryTheory.Quotient.functor_map_eq_iff {C : Type u_1} [] (r : ) [h : ] {X : C} {Y : C} (f : X Y) (f' : X Y) :
().map f = ().map f' r X Y f f'
def CategoryTheory.Quotient.lift {C : Type u_1} [] (r : ) {D : Type u_3} [] (F : ) (H : ∀ (x y : C) (f₁ f₂ : x y), r x y f₁ f₂F.map f₁ = F.map f₂) :

The induced functor on the quotient category.

Instances For
theorem CategoryTheory.Quotient.lift_spec {C : Type u_1} [] (r : ) {D : Type u_3} [] (F : ) (H : ∀ (x y : C) (f₁ f₂ : x y), r x y f₁ f₂F.map f₁ = F.map f₂) :
theorem CategoryTheory.Quotient.lift_unique {C : Type u_3} [] (r : ) {D : Type u_4} [] (F : ) (H : ∀ (x y : C) (f₁ f₂ : x y), r x y f₁ f₂F.map f₁ = F.map f₂) (Φ : ) (hΦ : ) :
def CategoryTheory.Quotient.lift.isLift {C : Type u_1} [] (r : ) {D : Type u_3} [] (F : ) (H : ∀ (x y : C) (f₁ f₂ : x y), r x y f₁ f₂F.map f₁ = F.map f₂) :

The original functor factors through the induced functor.

Instances For
@[simp]
theorem CategoryTheory.Quotient.lift.isLift_hom {C : Type u_4} [] (r : ) {D : Type u_2} [] (F : ) (H : ∀ (x y : C) (f₁ f₂ : x y), r x y f₁ f₂F.map f₁ = F.map f₂) (X : C) :
().hom.app X = CategoryTheory.CategoryStruct.id (F.obj X)
@[simp]
theorem CategoryTheory.Quotient.lift.isLift_inv {C : Type u_4} [] (r : ) {D : Type u_2} [] (F : ) (H : ∀ (x y : C) (f₁ f₂ : x y), r x y f₁ f₂F.map f₁ = F.map f₂) (X : C) :
().inv.app X = CategoryTheory.CategoryStruct.id (F.obj X)
theorem CategoryTheory.Quotient.lift_map_functor_map {C : Type u_2} [] (r : ) {D : Type u_4} [] (F : ) (H : ∀ (x y : C) (f₁ f₂ : x y), r x y f₁ f₂F.map f₁ = F.map f₂) {X : C} {Y : C} (f : X Y) :
().map (().map f) = F.map f
theorem CategoryTheory.Quotient.natTrans_ext {C : Type u_3} [] {r : } {D : Type u_4} [] {F : } {G : } (τ₁ : F G) (τ₂ : F G) :
τ₁ = τ₂
def CategoryTheory.Quotient.natTransLift {C : Type u_1} [] (r : ) {D : Type u_3} [] {F : } {G : } :
F G

In order to define a natural transformation F ⟶ G with F G : Quotient r ⥤ D, it suffices to do so after precomposing with Quotient.functor r.

Instances For
@[simp]
theorem CategoryTheory.Quotient.natTransLift_app {C : Type u_3} [] (r : ) {D : Type u_4} [] (F : ) (G : ) (X : C) :
().app (().obj X) = τ.app X
theorem CategoryTheory.Quotient.comp_natTransLift_assoc {C : Type u_3} [] (r : ) {D : Type u_4} [] {F : } {G : } {H : } {Z : } (h : H Z) :
theorem CategoryTheory.Quotient.comp_natTransLift {C : Type u_3} [] (r : ) {D : Type u_4} [] {F : } {G : } {H : } :
@[simp]
theorem CategoryTheory.Quotient.natTransLift_id {C : Type u_3} [] (r : ) {D : Type u_4} [] (F : ) :
@[simp]
theorem CategoryTheory.Quotient.natIsoLift_hom {C : Type u_1} [] (r : ) {D : Type u_3} [] {F : } {G : } :
().hom =
@[simp]
theorem CategoryTheory.Quotient.natIsoLift_inv {C : Type u_1} [] (r : ) {D : Type u_3} [] {F : } {G : } :
().inv =
def CategoryTheory.Quotient.natIsoLift {C : Type u_1} [] (r : ) {D : Type u_3} [] {F : } {G : } :
F G

In order to define a natural isomorphism F ≅ G with F G : Quotient r ⥤ D, it suffices to do so after precomposing with Quotient.functor r.

Instances For
instance CategoryTheory.Quotient.full_whiskeringLeft_functor {C : Type u_1} [] (r : ) (D : Type u_3) [] :
instance CategoryTheory.Quotient.faithful_whiskeringLeft_functor {C : Type u_1} [] (r : ) (D : Type u_3) [] :