# Natural transformations between maps between precategories

```agda
module category-theory.natural-transformations-maps-precategories where
```

<details><summary>Imports</summary>

```agda
open import category-theory.commuting-squares-of-morphisms-in-precategories
open import category-theory.maps-precategories
open import category-theory.precategories

open import foundation.action-on-identifications-functions
open import foundation.dependent-pair-types
open import foundation.embeddings
open import foundation.equivalences
open import foundation.function-extensionality
open import foundation.function-types
open import foundation.homotopies
open import foundation.identity-types
open import foundation.propositions
open import foundation.sets
open import foundation.subtypes
open import foundation.universe-levels
```

</details>

## Idea

Given [precategories](category-theory.precategories.md) `C` and `D`, a **natural
transformation** from a
[map of precategories](category-theory.maps-precategories.md) `F : C → D` to
`G : C → D` consists of :

- a family of morphisms `γ : (x : C) → hom (F x) (G x)` such that the following
  identity holds:
- `(G f) ∘ (γ x) = (γ y) ∘ (F f)`, for all `f : hom x y`.

## Definition

```agda
module _
  {l1 l2 l3 l4 : Level}
  (C : Precategory l1 l2)
  (D : Precategory l3 l4)
  (F G : map-Precategory C D)
  where

  hom-family-map-Precategory : UU (l1  l4)
  hom-family-map-Precategory =
    (x : obj-Precategory C) 
    hom-Precategory D
      ( obj-map-Precategory C D F x)
      ( obj-map-Precategory C D G x)

  naturality-hom-family-map-Precategory :
    hom-family-map-Precategory 
    {x y : obj-Precategory C} (f : hom-Precategory C x y)  UU l4
  naturality-hom-family-map-Precategory γ {x} {y} f =
    coherence-square-hom-Precategory D
      ( hom-map-Precategory C D F f)
      ( γ x)
      ( γ y)
      ( hom-map-Precategory C D G f)

  is-natural-transformation-map-Precategory :
    hom-family-map-Precategory  UU (l1  l2  l4)
  is-natural-transformation-map-Precategory γ =
    {x y : obj-Precategory C} (f : hom-Precategory C x y) 
    naturality-hom-family-map-Precategory γ f

  natural-transformation-map-Precategory : UU (l1  l2  l4)
  natural-transformation-map-Precategory =
    Σ ( hom-family-map-Precategory)
      ( is-natural-transformation-map-Precategory)

  hom-family-natural-transformation-map-Precategory :
    natural-transformation-map-Precategory  hom-family-map-Precategory
  hom-family-natural-transformation-map-Precategory = pr1

  naturality-natural-transformation-map-Precategory :
    (γ : natural-transformation-map-Precategory) 
    is-natural-transformation-map-Precategory
      ( hom-family-natural-transformation-map-Precategory γ)
  naturality-natural-transformation-map-Precategory = pr2
```

## Composition and identity of natural transformations

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

  id-natural-transformation-map-Precategory :
    (F : map-Precategory C D)  natural-transformation-map-Precategory C D F F
  pr1 (id-natural-transformation-map-Precategory F) x = id-hom-Precategory D
  pr2 (id-natural-transformation-map-Precategory F) f =
    ( right-unit-law-comp-hom-Precategory D
      ( hom-map-Precategory C D F f)) 
    ( inv
      ( left-unit-law-comp-hom-Precategory D
        ( hom-map-Precategory C D F f)))

  comp-natural-transformation-map-Precategory :
    (F G H : map-Precategory C D) 
    natural-transformation-map-Precategory C D G H 
    natural-transformation-map-Precategory C D F G 
    natural-transformation-map-Precategory C D F H
  pr1 (comp-natural-transformation-map-Precategory F G H β α) x =
    comp-hom-Precategory D
      ( hom-family-natural-transformation-map-Precategory C D G H β x)
      ( hom-family-natural-transformation-map-Precategory C D F G α x)
  pr2 (comp-natural-transformation-map-Precategory F G H β α) {X} {Y} f =
    ( inv
      ( associative-comp-hom-Precategory D
        ( hom-map-Precategory C D H f)
        ( hom-family-natural-transformation-map-Precategory C D G H β X)
        ( hom-family-natural-transformation-map-Precategory C D F G α X))) 
    ( ap
      ( comp-hom-Precategory' D
        ( hom-family-natural-transformation-map-Precategory C D F G α X))
      ( naturality-natural-transformation-map-Precategory C D G H β f)) 
    ( associative-comp-hom-Precategory D
      ( hom-family-natural-transformation-map-Precategory C D G H β Y)
      ( hom-map-Precategory C D G f)
      ( hom-family-natural-transformation-map-Precategory C D F G α X)) 
    ( ap
      ( comp-hom-Precategory D
        ( hom-family-natural-transformation-map-Precategory C D G H β Y))
      ( naturality-natural-transformation-map-Precategory C D F G α f)) 
    ( inv
      ( associative-comp-hom-Precategory D
        ( hom-family-natural-transformation-map-Precategory C D G H β Y)
        ( hom-family-natural-transformation-map-Precategory C D F G α Y)
        ( hom-map-Precategory C D F f)))
```

## Properties

### That a family of morphisms is a natural transformation is a proposition

This follows from the fact that the hom-types are
[sets](foundation-core.sets.md).

```agda
module _
  {l1 l2 l3 l4 : Level}
  (C : Precategory l1 l2)
  (D : Precategory l3 l4)
  (F G : map-Precategory C D)
  where

  is-prop-is-natural-transformation-map-Precategory :
    ( γ : hom-family-map-Precategory C D F G) 
    is-prop (is-natural-transformation-map-Precategory C D F G γ)
  is-prop-is-natural-transformation-map-Precategory γ =
    is-prop-Π'
      ( λ x 
        is-prop-Π'
          ( λ y 
            is-prop-Π
              ( λ f 
                is-set-hom-Precategory D
                  ( obj-map-Precategory C D F x)
                  ( obj-map-Precategory C D G y)
                  ( comp-hom-Precategory D
                    ( hom-map-Precategory C D G f)
                    ( γ x))
                  ( comp-hom-Precategory D
                    ( γ y)
                    ( hom-map-Precategory C D F f)))))

  is-natural-transformation-prop-map-Precategory :
    ( γ : hom-family-map-Precategory C D F G)  Prop (l1  l2  l4)
  pr1 (is-natural-transformation-prop-map-Precategory α) =
    is-natural-transformation-map-Precategory C D F G α
  pr2 (is-natural-transformation-prop-map-Precategory α) =
    is-prop-is-natural-transformation-map-Precategory α
```

### The set of natural transformations

```agda
module _
  {l1 l2 l3 l4 : Level}
  (C : Precategory l1 l2)
  (D : Precategory l3 l4)
  (F G : map-Precategory C D)
  where

  is-emb-hom-family-natural-transformation-map-Precategory :
    is-emb (hom-family-natural-transformation-map-Precategory C D F G)
  is-emb-hom-family-natural-transformation-map-Precategory =
    is-emb-inclusion-subtype
      ( is-natural-transformation-prop-map-Precategory C D F G)

  emb-hom-family-natural-transformation-map-Precategory :
    natural-transformation-map-Precategory C D F G 
    hom-family-map-Precategory C D F G
  emb-hom-family-natural-transformation-map-Precategory =
    emb-subtype (is-natural-transformation-prop-map-Precategory C D F G)

  is-set-natural-transformation-map-Precategory :
    is-set (natural-transformation-map-Precategory C D F G)
  is-set-natural-transformation-map-Precategory =
    is-set-Σ
      ( is-set-Π
        ( λ x 
          is-set-hom-Precategory D
            ( obj-map-Precategory C D F x)
            ( obj-map-Precategory C D G x)))
      ( λ α 
        is-set-type-Set
          ( set-Prop
            ( is-natural-transformation-prop-map-Precategory C D F G α)))

  natural-transformation-map-set-Precategory :
    Set (l1  l2  l4)
  pr1 (natural-transformation-map-set-Precategory) =
    natural-transformation-map-Precategory C D F G
  pr2 (natural-transformation-map-set-Precategory) =
    is-set-natural-transformation-map-Precategory

  extensionality-natural-transformation-map-Precategory :
    (α β : natural-transformation-map-Precategory C D F G) 
    ( α  β) 
    ( hom-family-natural-transformation-map-Precategory C D F G α ~
      hom-family-natural-transformation-map-Precategory C D F G β)
  extensionality-natural-transformation-map-Precategory α β =
    ( equiv-funext) ∘e
    ( equiv-ap-emb emb-hom-family-natural-transformation-map-Precategory)

  eq-htpy-hom-family-natural-transformation-map-Precategory :
    (α β : natural-transformation-map-Precategory C D F G) 
    ( hom-family-natural-transformation-map-Precategory C D F G α ~
      hom-family-natural-transformation-map-Precategory C D F G β) 
    α  β
  eq-htpy-hom-family-natural-transformation-map-Precategory α β =
    map-inv-equiv (extensionality-natural-transformation-map-Precategory α β)
```

### Categorical laws for natural transformations

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

  right-unit-law-comp-natural-transformation-map-Precategory :
    (F G : map-Precategory C D)
    (α : natural-transformation-map-Precategory C D F G) 
    comp-natural-transformation-map-Precategory C D F F G α
      ( id-natural-transformation-map-Precategory C D F)  α
  right-unit-law-comp-natural-transformation-map-Precategory F G α =
    eq-htpy-hom-family-natural-transformation-map-Precategory C D F G
      ( comp-natural-transformation-map-Precategory C D F F G α
        ( id-natural-transformation-map-Precategory C D F))
      ( α)
      ( right-unit-law-comp-hom-Precategory D 
        hom-family-natural-transformation-map-Precategory C D F G α)

  left-unit-law-comp-natural-transformation-map-Precategory :
    (F G : map-Precategory C D)
    (α : natural-transformation-map-Precategory C D F G) 
    comp-natural-transformation-map-Precategory C D F G G
      ( id-natural-transformation-map-Precategory C D G) α  α
  left-unit-law-comp-natural-transformation-map-Precategory F G α =
    eq-htpy-hom-family-natural-transformation-map-Precategory C D F G
      ( comp-natural-transformation-map-Precategory C D F G G
        ( id-natural-transformation-map-Precategory C D G) α)
      ( α)
      ( left-unit-law-comp-hom-Precategory D 
        hom-family-natural-transformation-map-Precategory C D F G α)

  associative-comp-natural-transformation-map-Precategory :
    (F G H I : map-Precategory C D)
    (α : natural-transformation-map-Precategory C D F G)
    (β : natural-transformation-map-Precategory C D G H)
    (γ : natural-transformation-map-Precategory C D H I) 
    comp-natural-transformation-map-Precategory C D F G I
      ( comp-natural-transformation-map-Precategory C D G H I γ β) α 
    comp-natural-transformation-map-Precategory C D F H I γ
      ( comp-natural-transformation-map-Precategory C D F G H β α)
  associative-comp-natural-transformation-map-Precategory F G H I α β γ =
    eq-htpy-hom-family-natural-transformation-map-Precategory C D F I _ _
    ( λ x 
      associative-comp-hom-Precategory D
        ( hom-family-natural-transformation-map-Precategory C D H I γ x)
        ( hom-family-natural-transformation-map-Precategory C D G H β x)
        ( hom-family-natural-transformation-map-Precategory C D F G α x))

  inv-associative-comp-natural-transformation-map-Precategory :
    (F G H I : map-Precategory C D)
    (α : natural-transformation-map-Precategory C D F G)
    (β : natural-transformation-map-Precategory C D G H)
    (γ : natural-transformation-map-Precategory C D H I) 
    comp-natural-transformation-map-Precategory C D F H I γ
      ( comp-natural-transformation-map-Precategory C D F G H β α) 
    comp-natural-transformation-map-Precategory C D F G I
      ( comp-natural-transformation-map-Precategory C D G H I γ β) α
  inv-associative-comp-natural-transformation-map-Precategory F G H I α β γ =
    eq-htpy-hom-family-natural-transformation-map-Precategory C D F I _ _
    ( λ x 
      inv-associative-comp-hom-Precategory D
        ( hom-family-natural-transformation-map-Precategory C D H I γ x)
        ( hom-family-natural-transformation-map-Precategory C D G H β x)
        ( hom-family-natural-transformation-map-Precategory C D F G α x))
```