# Presheaf categories

```agda
module category-theory.presheaf-categories where
```

<details><summary>Imports</summary>

```agda
open import category-theory.categories
open import category-theory.copresheaf-categories
open import category-theory.functors-from-small-to-large-precategories
open import category-theory.large-categories
open import category-theory.large-precategories
open import category-theory.natural-transformations-functors-from-small-to-large-precategories
open import category-theory.opposite-precategories
open import category-theory.precategories

open import foundation.category-of-sets
open import foundation.commuting-squares-of-maps
open import foundation.function-extensionality
open import foundation.function-types
open import foundation.homotopies
open import foundation.identity-types
open import foundation.sets
open import foundation.universe-levels
```

</details>

## Idea

Given a [precategory](category-theory.precategories.md) `C`, we can form its
**presheaf [category](category-theory.large-categories.md)** as the
[large category of functors](category-theory.functors-from-small-to-large-precategories.md)
from the [opposite of](category-theory.opposite-precategories.md) `C`, `Cᵒᵖ`,
into the [large category of sets](foundation.category-of-sets.md)

```text
  Cᵒᵖ → Set.
```

To this large category, there is an associated
[small category](category-theory.categories.md) of small presheaves, taking
values in small [sets](foundation-core.sets.md).

## Definitions

### The large category of presheaves on a precategory

```agda
module _
  {l1 l2 : Level} (C : Precategory l1 l2)
  where

  presheaf-large-precategory-Precategory :
    Large-Precategory  l  l1  l2  lsuc l)  l l'  l1  l2  l  l')
  presheaf-large-precategory-Precategory =
    copresheaf-large-precategory-Precategory (opposite-Precategory C)

  is-large-category-presheaf-large-category-Precategory :
    is-large-category-Large-Precategory presheaf-large-precategory-Precategory
  is-large-category-presheaf-large-category-Precategory =
    is-large-category-copresheaf-large-category-Precategory
      ( opposite-Precategory C)

  presheaf-large-category-Precategory :
    Large-Category  l  l1  l2  lsuc l)  l l'  l1  l2  l  l')
  presheaf-large-category-Precategory =
    copresheaf-large-category-Precategory (opposite-Precategory C)

  presheaf-Precategory : (l : Level)  UU (l1  l2  lsuc l)
  presheaf-Precategory =
    obj-Large-Category presheaf-large-category-Precategory

  module _
    {l3 : Level} (P : presheaf-Precategory l3)
    where

    element-set-presheaf-Precategory : obj-Precategory C  Set l3
    element-set-presheaf-Precategory =
      obj-functor-Small-Large-Precategory
        ( opposite-Precategory C)
        ( Set-Large-Precategory)
        ( P)

    element-presheaf-Precategory : obj-Precategory C  UU l3
    element-presheaf-Precategory X =
      type-Set (element-set-presheaf-Precategory X)

    action-presheaf-Precategory :
      {X Y : obj-Precategory C} 
      hom-Precategory C X Y 
      element-presheaf-Precategory Y  element-presheaf-Precategory X
    action-presheaf-Precategory =
      hom-functor-Small-Large-Precategory
        ( opposite-Precategory C)
        ( Set-Large-Precategory)
        ( P)

    preserves-id-action-presheaf-Precategory :
      {X : obj-Precategory C} 
      action-presheaf-Precategory {X} {X} (id-hom-Precategory C) ~ id
    preserves-id-action-presheaf-Precategory =
      htpy-eq
        ( preserves-id-functor-Small-Large-Precategory
          ( opposite-Precategory C)
          ( Set-Large-Precategory)
          ( P)
          ( _))

    preserves-comp-action-presheaf-Precategory :
      {X Y Z : obj-Precategory C}
      (g : hom-Precategory C Y Z) (f : hom-Precategory C X Y) 
      action-presheaf-Precategory (comp-hom-Precategory C g f) ~
      action-presheaf-Precategory f  action-presheaf-Precategory g
    preserves-comp-action-presheaf-Precategory g f =
      htpy-eq
        ( preserves-comp-functor-Small-Large-Precategory
          ( opposite-Precategory C)
          ( Set-Large-Precategory)
          ( P)
          ( f)
          ( g))

  hom-set-presheaf-Precategory :
    {l3 l4 : Level}
    (X : presheaf-Precategory l3)
    (Y : presheaf-Precategory l4)  Set (l1  l2  l3  l4)
  hom-set-presheaf-Precategory =
    hom-set-Large-Category presheaf-large-category-Precategory

  hom-presheaf-Precategory :
    {l3 l4 : Level}
    (X : presheaf-Precategory l3)
    (Y : presheaf-Precategory l4)  UU (l1  l2  l3  l4)
  hom-presheaf-Precategory =
    hom-Large-Category presheaf-large-category-Precategory

  module _
    {l3 l4 : Level}
    (P : presheaf-Precategory l3) (Q : presheaf-Precategory l4)
    (h : hom-presheaf-Precategory P Q)
    where

    map-hom-presheaf-Precategory :
      (X : obj-Precategory C) 
      element-presheaf-Precategory P X  element-presheaf-Precategory Q X
    map-hom-presheaf-Precategory =
      hom-natural-transformation-Small-Large-Precategory
        ( opposite-Precategory C)
        ( Set-Large-Precategory)
        ( P)
        ( Q)
        ( h)

    naturality-hom-presheaf-Precategory :
      {X Y : obj-Precategory C} (f : hom-Precategory C X Y) 
      coherence-square-maps
        ( action-presheaf-Precategory P f)
        ( map-hom-presheaf-Precategory Y)
        ( map-hom-presheaf-Precategory X)
        ( action-presheaf-Precategory Q f)
    naturality-hom-presheaf-Precategory f =
      htpy-eq
        ( naturality-natural-transformation-Small-Large-Precategory
          ( opposite-Precategory C)
          ( Set-Large-Precategory)
          ( P)
          ( Q)
          ( h)
          ( f))

  comp-hom-presheaf-Precategory :
    {l3 l4 l5 : Level}
    (X : presheaf-Precategory l3)
    (Y : presheaf-Precategory l4)
    (Z : presheaf-Precategory l5) 
    hom-presheaf-Precategory Y Z  hom-presheaf-Precategory X Y 
    hom-presheaf-Precategory X Z
  comp-hom-presheaf-Precategory X Y Z =
    comp-hom-Large-Category presheaf-large-category-Precategory {X = X} {Y} {Z}

  id-hom-presheaf-Precategory :
    {l3 : Level} (X : presheaf-Precategory l3) 
    hom-presheaf-Precategory X X
  id-hom-presheaf-Precategory {l3} X =
    id-hom-Large-Category presheaf-large-category-Precategory {l3} {X}

  associative-comp-hom-presheaf-Precategory :
    {l3 l4 l5 l6 : Level}
    (X : presheaf-Precategory l3)
    (Y : presheaf-Precategory l4)
    (Z : presheaf-Precategory l5)
    (W : presheaf-Precategory l6)
    (h : hom-presheaf-Precategory Z W)
    (g : hom-presheaf-Precategory Y Z)
    (f : hom-presheaf-Precategory X Y) 
    comp-hom-presheaf-Precategory X Y W
      ( comp-hom-presheaf-Precategory Y Z W h g)
      ( f) 
    comp-hom-presheaf-Precategory X Z W h
      ( comp-hom-presheaf-Precategory X Y Z g f)
  associative-comp-hom-presheaf-Precategory X Y Z W =
    associative-comp-hom-Large-Category
      ( presheaf-large-category-Precategory)
      { X = X}
      { Y}
      { Z}
      { W}

  inv-associative-comp-hom-presheaf-Precategory :
    {l3 l4 l5 l6 : Level}
    (X : presheaf-Precategory l3)
    (Y : presheaf-Precategory l4)
    (Z : presheaf-Precategory l5)
    (W : presheaf-Precategory l6)
    (h : hom-presheaf-Precategory Z W)
    (g : hom-presheaf-Precategory Y Z)
    (f : hom-presheaf-Precategory X Y) 
    comp-hom-presheaf-Precategory X Z W
      ( h)
      ( comp-hom-presheaf-Precategory X Y Z g f) 
    comp-hom-presheaf-Precategory X Y W
      ( comp-hom-presheaf-Precategory Y Z W h g)
      ( f)
  inv-associative-comp-hom-presheaf-Precategory X Y Z W =
    inv-associative-comp-hom-Large-Precategory
      ( presheaf-large-precategory-Precategory)
      { X = X} {Y} {Z} {W}

  left-unit-law-comp-hom-presheaf-Precategory :
    {l3 l4 : Level}
    (X : presheaf-Precategory l3)
    (Y : presheaf-Precategory l4)
    (f : hom-presheaf-Precategory X Y) 
    comp-hom-presheaf-Precategory X Y Y
      ( id-hom-presheaf-Precategory Y)
      ( f) 
    f
  left-unit-law-comp-hom-presheaf-Precategory X Y =
    left-unit-law-comp-hom-Large-Category
      ( presheaf-large-category-Precategory)
      { X = X}
      { Y}

  right-unit-law-comp-hom-presheaf-Precategory :
    {l3 l4 : Level}
    (X : presheaf-Precategory l3)
    (Y : presheaf-Precategory l4)
    (f : hom-presheaf-Precategory X Y) 
    comp-hom-presheaf-Precategory X X Y f
      ( id-hom-presheaf-Precategory X) 
    f
  right-unit-law-comp-hom-presheaf-Precategory X Y =
    right-unit-law-comp-hom-Large-Category
      ( presheaf-large-category-Precategory)
      { X = X}
      { Y}
```

### The category of small presheaves on a precategory

```agda
module _
  {l1 l2 : Level} (C : Precategory l1 l2) (l : Level)
  where

  presheaf-precategory-Precategory :
    Precategory (l1  l2  lsuc l) (l1  l2  l)
  presheaf-precategory-Precategory =
    precategory-Large-Category (presheaf-large-category-Precategory C) l

  presheaf-category-Precategory : Category (l1  l2  lsuc l) (l1  l2  l)
  presheaf-category-Precategory =
    category-Large-Category (presheaf-large-category-Precategory C) l
```

## See also

- [The Yoneda lemma](category-theory.yoneda-lemma-precategories.md)

## External links

- [Presheaf precategories](https://1lab.dev/Cat.Functor.Base.html#presheaf-precategories)
  at 1lab
- [category of presheaves](https://ncatlab.org/nlab/show/category+of+presheaves)
  at $n$Lab
- [presheaf](https://ncatlab.org/nlab/show/presheaf) at $n$Lab