mathlib documentation

category_theory.​concrete_category.​basic

category_theory.​concrete_category.​basic

Concrete categories

A concrete category is a category C with a fixed faithful functor forget : C ⥤ Type*. We define concrete categories using class concrete_category. In particular, we impose no restrictions on the carrier type C, so Type is a concrete category with the identity forgetful functor.

Each concrete category C comes with a canonical faithful functor forget C : C ⥤ Type*. We say that a concrete category C admits a forgetful functor to a concrete category D, if it has a functor forget₂ C D : C ⥤ D such that (forget₂ C D) ⋙ (forget D) = forget C, see class has_forget₂. Due to faithful.div_comp, it suffices to verify that forget₂.obj and forget₂.map agree with the equality above; then forget₂ will satisfy the functor laws automatically, see has_forget₂.mk'.

Two classes helping construct concrete categories in the two most common cases are provided in the files bundled_hom and unbundled_hom, see their documentation for details.

References

See [Ahrens and Lumsdaine, Displayed Categories][ahrens2017] for related work.

@[class]
structure category_theory.​concrete_category (C : Type (u+1)) [category_theory.large_category C] :
Type (u+1)

A concrete category is a category C with a fixed faithful functor forget : C ⥤ Type.

Instances

The forgetful functor from a concrete category to Type u.

Equations

Provide a coercion to Type u for a concrete category. This is not marked as an instance as it could potentially apply to every type, and so is too expensive in typeclass search.

You can use it on particular examples as:

instance : has_coe_to_sort X := concrete_category.has_coe_to_sort X
Equations

Usually a bundled hom structure already has a coercion to function that works with different universes. So we don't use this as a global instance.

Equations
theorem category_theory.​concrete_category.​hom_ext {C : Type (u+1)} [category_theory.large_category C] [category_theory.concrete_category C] {X Y : C} (f g : X Y) :
(∀ (x : X), f x = g x)f = g

In any concrete category, we can test equality of morphisms by pointwise evaluations.

@[simp]
theorem category_theory.​coe_id {C : Type (u+1)} [category_theory.large_category C] [category_theory.concrete_category C] {X : C} (x : X) :
(𝟙 X) x = x

@[simp]
theorem category_theory.​coe_comp {C : Type (u+1)} [category_theory.large_category C] [category_theory.concrete_category C] {X Y Z : C} (f : X Y) (g : Y Z) (x : X) :
(f g) x = g (f x)

@[simp]
theorem category_theory.​coe_hom_inv_id {C : Type (u+1)} [category_theory.large_category C] [category_theory.concrete_category C] {X Y : C} (f : X Y) (x : X) :
(f.inv) ((f.hom) x) = x

@[simp]
theorem category_theory.​coe_inv_hom_id {C : Type (u+1)} [category_theory.large_category C] [category_theory.concrete_category C] {X Y : C} (f : X Y) (y : Y) :
(f.hom) ((f.inv) y) = y

In any concrete category, injective morphisms are monomorphisms.

In any concrete category, surjective morphisms are epimorphisms.

@[class]

has_forget₂ C D, where C and D are both concrete categories, provides a functor forget₂ C D : C ⥤ D and a proof that forget₂ ⋙ (forget D) = forget C.

Instances

The forgetful functor C ⥤ D between concrete categories for which we have an instance has_forget₂ C.

Equations
def category_theory.​has_forget₂.​mk' {C D : Type (u+1)} [category_theory.large_category C] [category_theory.concrete_category C] [category_theory.large_category D] [category_theory.concrete_category D] (obj : C → D) (h_obj : ∀ (X : C), (category_theory.forget D).obj (obj X) = (category_theory.forget C).obj X) (map : Π {X Y : C}, (X Y)(obj X obj Y)) :
(∀ {X Y : C} {f : X Y}, (category_theory.forget D).map (map f) == (category_theory.forget C).map f)category_theory.has_forget₂ C D

In order to construct a “partially forgetting” functor, we do not need to verify functor laws; it suffices to ensure that compositions agree with forget₂ C D ⋙ forget D = forget C.

Equations