# Functors between set-magmoids
```agda
module category-theory.functors-set-magmoids where
```
<details><summary>Imports</summary>
```agda
open import category-theory.maps-set-magmoids
open import category-theory.set-magmoids
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-types
open import foundation.homotopies
open import foundation.identity-types
open import foundation.iterated-dependent-product-types
open import foundation.propositions
open import foundation.subtypes
open import foundation.type-arithmetic-dependent-pair-types
open import foundation.universe-levels
```
</details>
## Idea
A **functor between [set-magmoids](category-theory.set-magmoids.md)** is a
family of maps on the hom-[sets](foundation-core.sets.md) that preserve the
[composition operation](category-theory.composition-operations-on-binary-families-of-sets.md).
These objects serve as our starting point in the study of
[stucture](foundation.structure.md)-preserving maps of
[categories](category-theory.categories.md). Indeed, categories form a
[subtype](foundation-core.subtypes.md) of set-magmoids, although functors of
set-magmoids do not automatically preserve identity-morphisms.
## Definitions
### The predicate of being a functor of set-magmoids
```agda
module _
{l1 l2 l3 l4 : Level}
(A : Set-Magmoid l1 l2) (B : Set-Magmoid l3 l4)
(F₀ : obj-Set-Magmoid A → obj-Set-Magmoid B)
(F₁ :
{x y : obj-Set-Magmoid A} →
hom-Set-Magmoid A x y → hom-Set-Magmoid B (F₀ x) (F₀ y))
where
preserves-comp-hom-Set-Magmoid : UU (l1 ⊔ l2 ⊔ l4)
preserves-comp-hom-Set-Magmoid =
{x y z : obj-Set-Magmoid A}
(g : hom-Set-Magmoid A y z) (f : hom-Set-Magmoid A x y) →
F₁ (comp-hom-Set-Magmoid A g f) = comp-hom-Set-Magmoid B (F₁ g) (F₁ f)
is-prop-preserves-comp-hom-Set-Magmoid :
is-prop preserves-comp-hom-Set-Magmoid
is-prop-preserves-comp-hom-Set-Magmoid =
is-prop-iterated-implicit-Π 3
( λ x y z →
is-prop-iterated-Π 2
( λ g f →
is-set-hom-Set-Magmoid B (F₀ x) (F₀ z)
( F₁ (comp-hom-Set-Magmoid A g f))
( comp-hom-Set-Magmoid B (F₁ g) (F₁ f))))
preserves-comp-hom-prop-Set-Magmoid : Prop (l1 ⊔ l2 ⊔ l4)
pr1 preserves-comp-hom-prop-Set-Magmoid =
preserves-comp-hom-Set-Magmoid
pr2 preserves-comp-hom-prop-Set-Magmoid =
is-prop-preserves-comp-hom-Set-Magmoid
```
### The predicate on maps of set-magmoids of being a functor
```agda
module _
{l1 l2 l3 l4 : Level}
(A : Set-Magmoid l1 l2) (B : Set-Magmoid l3 l4)
(F : map-Set-Magmoid A B)
where
preserves-comp-hom-prop-map-Set-Magmoid : Prop (l1 ⊔ l2 ⊔ l4)
preserves-comp-hom-prop-map-Set-Magmoid =
preserves-comp-hom-prop-Set-Magmoid A B
( obj-map-Set-Magmoid A B F)
( hom-map-Set-Magmoid A B F)
preserves-comp-hom-map-Set-Magmoid : UU (l1 ⊔ l2 ⊔ l4)
preserves-comp-hom-map-Set-Magmoid =
type-Prop preserves-comp-hom-prop-map-Set-Magmoid
is-prop-preserves-comp-hom-map-Set-Magmoid :
is-prop preserves-comp-hom-map-Set-Magmoid
is-prop-preserves-comp-hom-map-Set-Magmoid =
is-prop-type-Prop preserves-comp-hom-prop-map-Set-Magmoid
```
### The type of functors between set-magmoids
```agda
module _
{l1 l2 l3 l4 : Level}
(A : Set-Magmoid l1 l2) (B : Set-Magmoid l3 l4)
where
functor-Set-Magmoid : UU (l1 ⊔ l2 ⊔ l3 ⊔ l4)
functor-Set-Magmoid =
Σ ( obj-Set-Magmoid A → obj-Set-Magmoid B)
( λ F₀ →
Σ ( {x y : obj-Set-Magmoid A} →
hom-Set-Magmoid A x y → hom-Set-Magmoid B (F₀ x) (F₀ y))
( preserves-comp-hom-Set-Magmoid A B F₀))
module _
{l1 l2 l3 l4 : Level}
(A : Set-Magmoid l1 l2) (B : Set-Magmoid l3 l4)
(F : functor-Set-Magmoid A B)
where
obj-functor-Set-Magmoid : obj-Set-Magmoid A → obj-Set-Magmoid B
obj-functor-Set-Magmoid = pr1 F
hom-functor-Set-Magmoid :
{x y : obj-Set-Magmoid A} →
(f : hom-Set-Magmoid A x y) →
hom-Set-Magmoid B
( obj-functor-Set-Magmoid x)
( obj-functor-Set-Magmoid y)
hom-functor-Set-Magmoid = pr1 (pr2 F)
map-functor-Set-Magmoid : map-Set-Magmoid A B
pr1 map-functor-Set-Magmoid = obj-functor-Set-Magmoid
pr2 map-functor-Set-Magmoid = hom-functor-Set-Magmoid
preserves-comp-functor-Set-Magmoid :
{x y z : obj-Set-Magmoid A}
(g : hom-Set-Magmoid A y z)
(f : hom-Set-Magmoid A x y) →
( hom-functor-Set-Magmoid
( comp-hom-Set-Magmoid A g f)) =
( comp-hom-Set-Magmoid B
( hom-functor-Set-Magmoid g)
( hom-functor-Set-Magmoid f))
preserves-comp-functor-Set-Magmoid = pr2 (pr2 F)
```
### The identity functor on a set-magmoid
```agda
module _
{l1 l2 : Level} (A : Set-Magmoid l1 l2)
where
id-functor-Set-Magmoid : functor-Set-Magmoid A A
pr1 id-functor-Set-Magmoid = id
pr1 (pr2 id-functor-Set-Magmoid) = id
pr2 (pr2 id-functor-Set-Magmoid) g f = refl
```
### Composition of functors on set-magmoids
Any two compatible functors can be composed to a new functor.
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
(A : Set-Magmoid l1 l2)
(B : Set-Magmoid l3 l4)
(C : Set-Magmoid l5 l6)
(G : functor-Set-Magmoid B C)
(F : functor-Set-Magmoid A B)
where
obj-comp-functor-Set-Magmoid : obj-Set-Magmoid A → obj-Set-Magmoid C
obj-comp-functor-Set-Magmoid =
obj-functor-Set-Magmoid B C G ∘ obj-functor-Set-Magmoid A B F
hom-comp-functor-Set-Magmoid :
{x y : obj-Set-Magmoid A} →
hom-Set-Magmoid A x y →
hom-Set-Magmoid C
( obj-comp-functor-Set-Magmoid x)
( obj-comp-functor-Set-Magmoid y)
hom-comp-functor-Set-Magmoid =
hom-functor-Set-Magmoid B C G ∘ hom-functor-Set-Magmoid A B F
map-comp-functor-Set-Magmoid : map-Set-Magmoid A C
pr1 map-comp-functor-Set-Magmoid = obj-comp-functor-Set-Magmoid
pr2 map-comp-functor-Set-Magmoid = hom-comp-functor-Set-Magmoid
preserves-comp-comp-functor-Set-Magmoid :
preserves-comp-hom-Set-Magmoid A C
obj-comp-functor-Set-Magmoid
hom-comp-functor-Set-Magmoid
preserves-comp-comp-functor-Set-Magmoid g f =
( ap
( hom-functor-Set-Magmoid B C G)
( preserves-comp-functor-Set-Magmoid A B F g f)) ∙
( preserves-comp-functor-Set-Magmoid B C G
( hom-functor-Set-Magmoid A B F g)
( hom-functor-Set-Magmoid A B F f))
comp-functor-Set-Magmoid : functor-Set-Magmoid A C
pr1 comp-functor-Set-Magmoid = obj-comp-functor-Set-Magmoid
pr1 (pr2 comp-functor-Set-Magmoid) =
hom-functor-Set-Magmoid B C G ∘ hom-functor-Set-Magmoid A B F
pr2 (pr2 comp-functor-Set-Magmoid) = preserves-comp-comp-functor-Set-Magmoid
```
## Properties
### Extensionality of functors between set-magmoids
#### Equality of functors is equality of underlying maps
```agda
module _
{l1 l2 l3 l4 : Level}
(A : Set-Magmoid l1 l2) (B : Set-Magmoid l3 l4)
(F G : functor-Set-Magmoid A B)
where
equiv-eq-map-eq-functor-Set-Magmoid :
(F = G) ≃ (map-functor-Set-Magmoid A B F = map-functor-Set-Magmoid A B G)
equiv-eq-map-eq-functor-Set-Magmoid =
equiv-ap-emb
( comp-emb
( emb-subtype
( preserves-comp-hom-prop-map-Set-Magmoid A B))
( emb-equiv
( inv-associative-Σ
( obj-Set-Magmoid A → obj-Set-Magmoid B)
( λ F₀ →
{ x y : obj-Set-Magmoid A} →
hom-Set-Magmoid A x y →
hom-Set-Magmoid B (F₀ x) (F₀ y))
( preserves-comp-hom-map-Set-Magmoid A B))))
eq-map-eq-functor-Set-Magmoid :
F = G → map-functor-Set-Magmoid A B F = map-functor-Set-Magmoid A B G
eq-map-eq-functor-Set-Magmoid = map-equiv equiv-eq-map-eq-functor-Set-Magmoid
eq-eq-map-functor-Set-Magmoid :
map-functor-Set-Magmoid A B F = map-functor-Set-Magmoid A B G → F = G
eq-eq-map-functor-Set-Magmoid =
map-inv-equiv equiv-eq-map-eq-functor-Set-Magmoid
is-section-eq-eq-map-functor-Set-Magmoid :
eq-map-eq-functor-Set-Magmoid ∘ eq-eq-map-functor-Set-Magmoid ~ id
is-section-eq-eq-map-functor-Set-Magmoid =
is-section-map-inv-equiv equiv-eq-map-eq-functor-Set-Magmoid
is-retraction-eq-eq-map-functor-Set-Magmoid :
eq-eq-map-functor-Set-Magmoid ∘ eq-map-eq-functor-Set-Magmoid ~ id
is-retraction-eq-eq-map-functor-Set-Magmoid =
is-retraction-map-inv-equiv equiv-eq-map-eq-functor-Set-Magmoid
```
### Categorical laws for functor composition
#### Unit laws for functor composition
```agda
module _
{l1 l2 l3 l4 : Level}
(A : Set-Magmoid l1 l2) (B : Set-Magmoid l3 l4)
(F : functor-Set-Magmoid A B)
where
left-unit-law-comp-functor-Set-Magmoid :
comp-functor-Set-Magmoid A B B (id-functor-Set-Magmoid B) F = F
left-unit-law-comp-functor-Set-Magmoid =
eq-eq-map-functor-Set-Magmoid A B _ _ refl
right-unit-law-comp-functor-Set-Magmoid :
comp-functor-Set-Magmoid A A B F (id-functor-Set-Magmoid A) = F
right-unit-law-comp-functor-Set-Magmoid = refl
```
#### Associativity of functor composition
```agda
module _
{l1 l1' l2 l2' l3 l3' l4 l4' : Level}
(A : Set-Magmoid l1 l1')
(B : Set-Magmoid l2 l2')
(C : Set-Magmoid l3 l3')
(D : Set-Magmoid l4 l4')
(F : functor-Set-Magmoid A B)
(G : functor-Set-Magmoid B C)
(H : functor-Set-Magmoid C D)
where
associative-comp-functor-Set-Magmoid :
comp-functor-Set-Magmoid A B D (comp-functor-Set-Magmoid B C D H G) F =
comp-functor-Set-Magmoid A C D H (comp-functor-Set-Magmoid A B C G F)
associative-comp-functor-Set-Magmoid =
eq-eq-map-functor-Set-Magmoid A D _ _ refl
```
#### Mac Lane pentagon for functor composition
```text
(I(GH))F ---- I((GH)F)
/ \
/ \
((IH)G)F I(H(GF))
\ /
\ /
(IH)(GF)
```
The proof remains to be formalized.
```text
module _
{l1 l1' l2 l2' l3 l3' l4 l4' : Level}
(A : Set-Magmoid l1 l1')
(B : Set-Magmoid l2 l2')
(C : Set-Magmoid l3 l3')
(D : Set-Magmoid l4 l4')
(E : Set-Magmoid l4 l4')
(F : functor-Set-Magmoid A B)
(G : functor-Set-Magmoid B C)
(H : functor-Set-Magmoid C D)
(I : functor-Set-Magmoid D E)
where
mac-lane-pentagon-comp-functor-Set-Magmoid :
coherence-pentagon-identifications
{ x =
comp-functor-Set-Magmoid A B E
( comp-functor-Set-Magmoid B D E I
( comp-functor-Set-Magmoid B C D H G))
( F)}
{ comp-functor-Set-Magmoid A D E I
( comp-functor-Set-Magmoid A B D
( comp-functor-Set-Magmoid B C D H G)
( F))}
{ comp-functor-Set-Magmoid A B E
( comp-functor-Set-Magmoid B C E
( comp-functor-Set-Magmoid C D E I H)
( G))
( F)}
{ comp-functor-Set-Magmoid A D E
( I)
( comp-functor-Set-Magmoid A C D
( H)
( comp-functor-Set-Magmoid A B C G F))}
{ comp-functor-Set-Magmoid A C E
( comp-functor-Set-Magmoid C D E I H)
( comp-functor-Set-Magmoid A B C G F)}
( associative-comp-functor-Set-Magmoid A B D E
( F) (comp-functor-Set-Magmoid B C D H G) (I))
( ap
( λ p → comp-functor-Set-Magmoid A B E p F)
( inv (associative-comp-functor-Set-Magmoid B C D E G H I)))
( ap
( λ p → comp-functor-Set-Magmoid A D E I p)
( associative-comp-functor-Set-Magmoid A B C D F G H))
( associative-comp-functor-Set-Magmoid A B C E
( F) (G) (comp-functor-Set-Magmoid C D E I H))
( inv
( associative-comp-functor-Set-Magmoid A C D E
(comp-functor-Set-Magmoid A B C G F) H I))
mac-lane-pentagon-comp-functor-Set-Magmoid = {!!}
```