# Limits in precategories ```agda module category-theory.limits-precategories where ``` <details><summary>Imports</summary> ```agda open import category-theory.cones-precategories open import category-theory.constant-functors open import category-theory.functors-precategories open import category-theory.natural-transformations-functors-precategories open import category-theory.precategories open import category-theory.right-extensions-precategories open import category-theory.right-kan-extensions-precategories open import category-theory.terminal-category open import foundation.dependent-pair-types open import foundation.equivalences open import foundation.function-extensionality open import foundation.function-types open import foundation.functoriality-dependent-function-types open import foundation.functoriality-dependent-pair-types open import foundation.identity-types open import foundation.logical-equivalences open import foundation.propositions open import foundation.transport-along-identifications open import foundation.unit-type open import foundation.universe-levels ``` </details> ## Idea A {{#concept "limit" Disambiguation="of a functor of precategories" Agda=limit-Precategory}} of a [functor](category-theory.functors-precategories.md) `F` between [precategories](category-theory.precategories.md) is a limiting [cone](category-theory.cones-precategories.md) over `F`. That is, a cone `τ` such that `cone-map-Precategory C D F τ d` is an equivalence for all `d : obj-Precategory D`. Equivalently, the limit of `F` is a [right kan extension](category-theory.right-kan-extensions-precategories.md) of `F` along the terminal functor into the [terminal precategory](category-theory.terminal-category.md). We show that both definitions coincide, and we will use the definition using limiting cones as our official one. If a limit exists, we call the vertex of the limiting cone the **vertex** of the limit. ## Definition ### Limiting cones ```agda module _ {l1 l2 l3 l4 : Level} (C : Precategory l1 l2) (D : Precategory l3 l4) (F : functor-Precategory C D) where is-limiting-cone-Precategory : cone-Precategory C D F → UU (l1 ⊔ l2 ⊔ l3 ⊔ l4) is-limiting-cone-Precategory τ = (d : obj-Precategory D) → is-equiv (cone-map-Precategory C D F τ d) limit-Precategory : UU (l1 ⊔ l2 ⊔ l3 ⊔ l4) limit-Precategory = Σ ( cone-Precategory C D F) ( is-limiting-cone-Precategory) cone-limit-Precategory : limit-Precategory → cone-Precategory C D F cone-limit-Precategory = pr1 vertex-limit-Precategory : limit-Precategory → obj-Precategory D vertex-limit-Precategory τ = vertex-cone-Precategory C D F (cone-limit-Precategory τ) is-limiting-limit-Precategory : (τ : limit-Precategory) → is-limiting-cone-Precategory (cone-limit-Precategory τ) is-limiting-limit-Precategory = pr2 hom-cone-limit-Precategory : (τ : limit-Precategory) → (φ : cone-Precategory C D F) → hom-Precategory D ( vertex-cone-Precategory C D F φ) ( vertex-limit-Precategory τ) hom-cone-limit-Precategory τ φ = map-inv-is-equiv ( is-limiting-limit-Precategory τ ( vertex-cone-Precategory C D F φ)) ( natural-transformation-cone-Precategory C D F φ) ``` ### Limits through right kan extensions ```agda module _ {l1 l2 l3 l4 : Level} (C : Precategory l1 l2) (D : Precategory l3 l4) (F : functor-Precategory C D) where is-limit-right-extension-Precategory : right-extension-Precategory C terminal-Precategory D (terminal-functor-Precategory C) F → UU (l1 ⊔ l2 ⊔ l3 ⊔ l4) is-limit-right-extension-Precategory = is-right-kan-extension-Precategory C terminal-Precategory D (terminal-functor-Precategory C) F limit-Precategory' : UU (l1 ⊔ l2 ⊔ l3 ⊔ l4) limit-Precategory' = right-kan-extension-Precategory C terminal-Precategory D (terminal-functor-Precategory C) F module _ {l1 l2 l3 l4 : Level} (C : Precategory l1 l2) (D : Precategory l3 l4) (F : functor-Precategory C D) (L : limit-Precategory' C D F) where right-extension-limit-Precategory' : right-extension-Precategory C terminal-Precategory D (terminal-functor-Precategory C) F right-extension-limit-Precategory' = right-extension-right-kan-extension-Precategory C terminal-Precategory D (terminal-functor-Precategory C) F L extension-limit-Precategory' : functor-Precategory terminal-Precategory D extension-limit-Precategory' = extension-right-kan-extension-Precategory C terminal-Precategory D (terminal-functor-Precategory C) F L ``` ## Properties ### Being a limit is a property ```agda module _ {l1 l2 l3 l4 : Level} (C : Precategory l1 l2) (D : Precategory l3 l4) (F : functor-Precategory C D) where is-prop-is-limiting-cone-Precategory : (τ : cone-Precategory C D F) → is-prop (is-limiting-cone-Precategory C D F τ) is-prop-is-limiting-cone-Precategory τ = is-prop-Π λ φ → is-property-is-equiv _ is-prop-is-limit-Precategory' : ( R : right-extension-Precategory C terminal-Precategory D (terminal-functor-Precategory C) F) → is-prop (is-limit-right-extension-Precategory C D F R) is-prop-is-limit-Precategory' R = is-prop-Π λ K → is-property-is-equiv _ ``` ### Limiting cones are equivalent to limits ```agda module _ {l1 l2 l3 l4 : Level} (C : Precategory l1 l2) (D : Precategory l3 l4) (F : functor-Precategory C D) where equiv-is-right-kan-extension-is-limiting-Precategory : (τ : cone-Precategory C D F) → is-limiting-cone-Precategory C D F τ ≃ is-right-kan-extension-Precategory C terminal-Precategory D (terminal-functor-Precategory C) F (map-equiv (equiv-right-extension-cone-Precategory C D F) τ) equiv-is-right-kan-extension-is-limiting-Precategory τ = equiv-Π _ ( equiv-point-Precategory D) ( λ x → equiv-iff-is-prop ( is-property-is-equiv _) ( is-property-is-equiv _) ( λ e → is-equiv-left-factor ( induced-right-extension-map x) ( natural-transformation-constant-functor-Precategory terminal-Precategory D) ( tr is-equiv (inv (lemma τ x)) e) ( is-equiv-natural-transformation-constant-functor-Precategory D _ _)) ( λ e → tr is-equiv (lemma τ x) ( is-equiv-comp ( induced-right-extension-map x) ( natural-transformation-constant-functor-Precategory terminal-Precategory D) ( is-equiv-natural-transformation-constant-functor-Precategory D _ _) ( e)))) where induced-right-extension-map = λ x → right-extension-map-Precategory C terminal-Precategory D ( terminal-functor-Precategory C) ( F) ( map-equiv (equiv-right-extension-cone-Precategory C D F) τ) ( constant-functor-Precategory terminal-Precategory D x) lemma : ( τ : cone-Precategory C D F) ( x : obj-Precategory D) → ( right-extension-map-Precategory C terminal-Precategory D ( terminal-functor-Precategory C) F ( map-equiv (equiv-right-extension-cone-Precategory C D F) τ) ( constant-functor-Precategory terminal-Precategory D x)) ∘ ( natural-transformation-constant-functor-Precategory terminal-Precategory D) = ( cone-map-Precategory C D F τ x) lemma τ x = eq-htpy λ f → eq-htpy-hom-family-natural-transformation-Precategory C D ( comp-functor-Precategory C terminal-Precategory D ( point-Precategory D x) ( terminal-functor-Precategory C)) ( F) ( _) ( _) ( λ g → refl) equiv-limit-limit'-Precategory : limit-Precategory C D F ≃ limit-Precategory' C D F equiv-limit-limit'-Precategory = equiv-Σ ( is-right-kan-extension-Precategory C terminal-Precategory D ( terminal-functor-Precategory C) F) ( equiv-right-extension-cone-Precategory C D F) ( λ τ → equiv-is-right-kan-extension-is-limiting-Precategory τ) limit-limit'-Precategory : limit-Precategory C D F → limit-Precategory' C D F limit-limit'-Precategory = map-equiv equiv-limit-limit'-Precategory limit'-limit-Precategory : limit-Precategory' C D F → limit-Precategory C D F limit'-limit-Precategory = map-inv-equiv equiv-limit-limit'-Precategory ```