# Homotopies of morphisms of arrows
```agda
module foundation.homotopies-morphisms-arrows where
```
<details><summary>Imports</summary>
```agda
open import foundation.action-on-identifications-functions
open import foundation.commuting-squares-of-identifications
open import foundation.commuting-triangles-of-identifications
open import foundation.cones-over-cospan-diagrams
open import foundation.dependent-pair-types
open import foundation.function-extensionality
open import foundation.fundamental-theorem-of-identity-types
open import foundation.homotopy-induction
open import foundation.morphisms-arrows
open import foundation.postcomposition-functions
open import foundation.structure-identity-principle
open import foundation.universe-levels
open import foundation.whiskering-homotopies-composition
open import foundation.whiskering-identifications-concatenation
open import foundation-core.commuting-squares-of-homotopies
open import foundation-core.commuting-squares-of-maps
open import foundation-core.equivalences
open import foundation-core.function-types
open import foundation-core.homotopies
open import foundation-core.identity-types
open import foundation-core.precomposition-functions
open import foundation-core.torsorial-type-families
```
</details>
## Idea
Consider two [morphisms of arrows](foundation.morphisms-arrows.md) `(i , j , H)`
and `(i' , j' , H')` from `f` to `g`, as in the diagrams
```text
i i'
A -----> X A -----> X
| | | |
f | | g f | | g
∨ ∨ ∨ ∨
B -----> Y B -----> Y.
j j'
```
A {{#concept "homotopy of morphisms of arrows"}} from `(i , j , H)` to
`(i' , j' , H')` is a triple `(I , J , K)` consisting of homotopies `I : i ~ i'`
and `J : j ~ j'` and a homotopy `K` witnessing that the
[square of homotopies](foundation.commuting-squares-of-homotopies.md)
```text
J ·r f
(j ∘ f) --------> (j' ∘ f)
| |
H | | H'
∨ ∨
(g ∘ i) --------> (g ∘ i')
g ·l I
```
commutes.
## Definitions
### Homotopies of morphisms of arrows
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y) (α : hom-arrow f g)
where
coherence-htpy-hom-arrow :
(β : hom-arrow f g)
(I : map-domain-hom-arrow f g α ~ map-domain-hom-arrow f g β)
(J : map-codomain-hom-arrow f g α ~ map-codomain-hom-arrow f g β) →
UU (l1 ⊔ l4)
coherence-htpy-hom-arrow β I J =
coherence-square-homotopies
( J ·r f)
( coh-hom-arrow f g α)
( coh-hom-arrow f g β)
( g ·l I)
htpy-hom-arrow :
(β : hom-arrow f g) → UU (l1 ⊔ l2 ⊔ l3 ⊔ l4)
htpy-hom-arrow β =
Σ ( map-domain-hom-arrow f g α ~ map-domain-hom-arrow f g β)
( λ I →
Σ ( map-codomain-hom-arrow f g α ~ map-codomain-hom-arrow f g β)
( coherence-htpy-hom-arrow β I))
module _
(β : hom-arrow f g) (η : htpy-hom-arrow β)
where
htpy-domain-htpy-hom-arrow :
map-domain-hom-arrow f g α ~ map-domain-hom-arrow f g β
htpy-domain-htpy-hom-arrow = pr1 η
htpy-codomain-htpy-hom-arrow :
map-codomain-hom-arrow f g α ~ map-codomain-hom-arrow f g β
htpy-codomain-htpy-hom-arrow = pr1 (pr2 η)
coh-htpy-hom-arrow :
coherence-square-homotopies
( htpy-codomain-htpy-hom-arrow ·r f)
( coh-hom-arrow f g α)
( coh-hom-arrow f g β)
( g ·l htpy-domain-htpy-hom-arrow)
coh-htpy-hom-arrow = pr2 (pr2 η)
```
### The reflexivity homotopy of morphisms of arrows
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y) (α : hom-arrow f g)
where
htpy-domain-refl-htpy-hom-arrow :
map-domain-hom-arrow f g α ~ map-domain-hom-arrow f g α
htpy-domain-refl-htpy-hom-arrow = refl-htpy
htpy-codomain-refl-htpy-hom-arrow :
map-codomain-hom-arrow f g α ~ map-codomain-hom-arrow f g α
htpy-codomain-refl-htpy-hom-arrow = refl-htpy
coh-refl-htpy-hom-arrow :
coherence-square-homotopies
( htpy-codomain-refl-htpy-hom-arrow ·r f)
( coh-hom-arrow f g α)
( coh-hom-arrow f g α)
( g ·l htpy-domain-refl-htpy-hom-arrow)
coh-refl-htpy-hom-arrow = right-unit-htpy
refl-htpy-hom-arrow : htpy-hom-arrow f g α α
pr1 refl-htpy-hom-arrow = htpy-domain-refl-htpy-hom-arrow
pr1 (pr2 refl-htpy-hom-arrow) = htpy-codomain-refl-htpy-hom-arrow
pr2 (pr2 refl-htpy-hom-arrow) = coh-refl-htpy-hom-arrow
```
## Operations
### Concatenation of homotopies of morphisms of arrows
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y) (α β γ : hom-arrow f g)
(H : htpy-hom-arrow f g α β) (K : htpy-hom-arrow f g β γ)
where
htpy-domain-concat-htpy-hom-arrow :
map-domain-hom-arrow f g α ~ map-domain-hom-arrow f g γ
htpy-domain-concat-htpy-hom-arrow =
htpy-domain-htpy-hom-arrow f g α β H ∙h
htpy-domain-htpy-hom-arrow f g β γ K
htpy-codomain-concat-htpy-hom-arrow :
map-codomain-hom-arrow f g α ~ map-codomain-hom-arrow f g γ
htpy-codomain-concat-htpy-hom-arrow =
htpy-codomain-htpy-hom-arrow f g α β H ∙h
htpy-codomain-htpy-hom-arrow f g β γ K
coh-concat-htpy-hom-arrow :
coherence-htpy-hom-arrow f g α γ
( htpy-domain-concat-htpy-hom-arrow)
( htpy-codomain-concat-htpy-hom-arrow)
coh-concat-htpy-hom-arrow a =
( left-whisker-concat
( coh-hom-arrow f g α a)
( ap-concat g
( htpy-domain-htpy-hom-arrow f g α β H a)
( htpy-domain-htpy-hom-arrow f g β γ K a))) ∙
( horizontal-pasting-coherence-square-identifications
( htpy-codomain-htpy-hom-arrow f g α β H (f a))
( htpy-codomain-htpy-hom-arrow f g β γ K (f a))
( coh-hom-arrow f g α a)
( coh-hom-arrow f g β a)
( coh-hom-arrow f g γ a)
( (g ·l htpy-domain-htpy-hom-arrow f g α β H) a)
( (g ·l htpy-domain-htpy-hom-arrow f g β γ K) a)
( coh-htpy-hom-arrow f g α β H a)
( coh-htpy-hom-arrow f g β γ K a))
concat-htpy-hom-arrow : htpy-hom-arrow f g α γ
pr1 concat-htpy-hom-arrow = htpy-domain-concat-htpy-hom-arrow
pr1 (pr2 concat-htpy-hom-arrow) = htpy-codomain-concat-htpy-hom-arrow
pr2 (pr2 concat-htpy-hom-arrow) = coh-concat-htpy-hom-arrow
```
### Inverses of homotopies of morphisms of arrows
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y) (α β : hom-arrow f g) (H : htpy-hom-arrow f g α β)
where
htpy-domain-inv-htpy-hom-arrow :
map-domain-hom-arrow f g β ~ map-domain-hom-arrow f g α
htpy-domain-inv-htpy-hom-arrow =
inv-htpy (htpy-domain-htpy-hom-arrow f g α β H)
htpy-codomain-inv-htpy-hom-arrow :
map-codomain-hom-arrow f g β ~ map-codomain-hom-arrow f g α
htpy-codomain-inv-htpy-hom-arrow =
inv-htpy (htpy-codomain-htpy-hom-arrow f g α β H)
coh-inv-htpy-hom-arrow :
coherence-htpy-hom-arrow f g β α
( htpy-domain-inv-htpy-hom-arrow)
( htpy-codomain-inv-htpy-hom-arrow)
coh-inv-htpy-hom-arrow a =
( left-whisker-concat
( coh-hom-arrow f g β a)
( ap-inv g (htpy-domain-htpy-hom-arrow f g α β H a))) ∙
( double-transpose-eq-concat'
( coh-hom-arrow f g α a)
( htpy-codomain-htpy-hom-arrow f g α β H (f a))
( ap g (htpy-domain-htpy-hom-arrow f g α β H a))
( coh-hom-arrow f g β a)
( inv (coh-htpy-hom-arrow f g α β H a)))
inv-htpy-hom-arrow : htpy-hom-arrow f g β α
pr1 inv-htpy-hom-arrow = htpy-domain-inv-htpy-hom-arrow
pr1 (pr2 inv-htpy-hom-arrow) = htpy-codomain-inv-htpy-hom-arrow
pr2 (pr2 inv-htpy-hom-arrow) = coh-inv-htpy-hom-arrow
```
### Whiskering of homotopies of morphisms of arrows with respect to composition
#### Left whiskering of homotopies of morphisms of arrows with respect to composition
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4} {U : UU l5} {V : UU l6}
(f : A → B) (g : X → Y) (h : U → V)
(γ : hom-arrow g h) (α β : hom-arrow f g) (H : htpy-hom-arrow f g α β)
where
htpy-domain-left-whisker-comp-hom-arrow :
map-domain-comp-hom-arrow f g h γ α ~ map-domain-comp-hom-arrow f g h γ β
htpy-domain-left-whisker-comp-hom-arrow =
map-domain-hom-arrow g h γ ·l htpy-domain-htpy-hom-arrow f g α β H
htpy-codomain-left-whisker-comp-hom-arrow :
map-codomain-comp-hom-arrow f g h γ α ~
map-codomain-comp-hom-arrow f g h γ β
htpy-codomain-left-whisker-comp-hom-arrow =
map-codomain-hom-arrow g h γ ·l htpy-codomain-htpy-hom-arrow f g α β H
coh-left-whisker-comp-hom-arrow :
coherence-htpy-hom-arrow f h
( comp-hom-arrow f g h γ α)
( comp-hom-arrow f g h γ β)
( htpy-domain-left-whisker-comp-hom-arrow)
( htpy-codomain-left-whisker-comp-hom-arrow)
coh-left-whisker-comp-hom-arrow a =
( left-whisker-concat-coherence-triangle-identifications'
( ap (map-codomain-hom-arrow g h γ) (coh-hom-arrow f g α a))
( _)
( _)
( _)
( ( ap
( coh-hom-arrow g h γ (map-domain-hom-arrow f g α a) ∙_)
( inv
( ap-comp h
( map-domain-hom-arrow g h γ)
( htpy-domain-htpy-hom-arrow f g α β H a)))) ∙
( nat-htpy
( coh-hom-arrow g h γ)
( htpy-domain-htpy-hom-arrow f g α β H a)))) ∙
( right-whisker-concat-coherence-square-identifications
( ap
( map-codomain-hom-arrow g h γ)
( htpy-codomain-htpy-hom-arrow f g α β H (f a)))
( ap (map-codomain-hom-arrow g h γ) (coh-hom-arrow f g α a))
( ap (map-codomain-hom-arrow g h γ) (coh-hom-arrow f g β a))
( ap
( map-codomain-hom-arrow g h γ ∘ g)
( htpy-domain-htpy-hom-arrow f g α β H a))
( ( ap
( ap (map-codomain-hom-arrow g h γ) (coh-hom-arrow f g α a) ∙_)
( ap-comp
( map-codomain-hom-arrow g h γ)
( g)
( htpy-domain-htpy-hom-arrow f g α β H a))) ∙
( map-coherence-square-identifications
( map-codomain-hom-arrow g h γ)
( htpy-codomain-htpy-hom-arrow f g α β H (f a))
( coh-hom-arrow f g α a)
( coh-hom-arrow f g β a)
( ap g (htpy-domain-htpy-hom-arrow f g α β H a))
( coh-htpy-hom-arrow f g α β H a)))
( coh-hom-arrow g h γ (map-domain-hom-arrow f g β a)))
left-whisker-comp-hom-arrow :
htpy-hom-arrow f h
( comp-hom-arrow f g h γ α)
( comp-hom-arrow f g h γ β)
pr1 left-whisker-comp-hom-arrow =
htpy-domain-left-whisker-comp-hom-arrow
pr1 (pr2 left-whisker-comp-hom-arrow) =
htpy-codomain-left-whisker-comp-hom-arrow
pr2 (pr2 left-whisker-comp-hom-arrow) =
coh-left-whisker-comp-hom-arrow
```
#### Right whiskering of homotopies of morphisms of arrows with respect to composition
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4} {U : UU l5} {V : UU l6}
(f : A → B) (g : X → Y) (h : U → V)
(β γ : hom-arrow g h) (H : htpy-hom-arrow g h β γ) (α : hom-arrow f g)
where
htpy-domain-right-whisker-comp-hom-arrow :
map-domain-comp-hom-arrow f g h β α ~ map-domain-comp-hom-arrow f g h γ α
htpy-domain-right-whisker-comp-hom-arrow =
htpy-domain-htpy-hom-arrow g h β γ H ·r map-domain-hom-arrow f g α
htpy-codomain-right-whisker-comp-hom-arrow :
map-codomain-comp-hom-arrow f g h β α ~
map-codomain-comp-hom-arrow f g h γ α
htpy-codomain-right-whisker-comp-hom-arrow =
htpy-codomain-htpy-hom-arrow g h β γ H ·r map-codomain-hom-arrow f g α
coh-right-whisker-comp-hom-arrow :
coherence-htpy-hom-arrow f h
( comp-hom-arrow f g h β α)
( comp-hom-arrow f g h γ α)
( htpy-domain-right-whisker-comp-hom-arrow)
( htpy-codomain-right-whisker-comp-hom-arrow)
coh-right-whisker-comp-hom-arrow a =
( left-whisker-concat-coherence-square-identifications
( ap (map-codomain-hom-arrow g h β) (coh-hom-arrow f g α a))
( htpy-codomain-htpy-hom-arrow g h β γ H
( g (map-domain-hom-arrow f g α a)))
( coh-hom-arrow g h β (map-domain-hom-arrow f g α a))
( coh-hom-arrow g h γ (map-domain-hom-arrow f g α a))
( ap h
( htpy-domain-htpy-hom-arrow g h β γ H
( map-domain-hom-arrow f g α a)))
( coh-htpy-hom-arrow g h β γ H (map-domain-hom-arrow f g α a))) ∙
( ( assoc
( ap (map-codomain-hom-arrow g h β) (coh-hom-arrow f g α a))
( htpy-codomain-htpy-hom-arrow g h β γ H
( g (map-domain-hom-arrow f g α a)))
( coh-hom-arrow g h γ (map-domain-hom-arrow f g α a))) ∙
( right-whisker-concat-coherence-square-identifications
( htpy-codomain-htpy-hom-arrow g h β γ H
( map-codomain-hom-arrow f g α (f a)))
( ap (map-codomain-hom-arrow g h β) (coh-hom-arrow f g α a))
( ap (map-codomain-hom-arrow g h γ) (coh-hom-arrow f g α a))
( htpy-codomain-htpy-hom-arrow g h β γ H
( g (map-domain-hom-arrow f g α a)))
( inv
( nat-htpy
( htpy-codomain-htpy-hom-arrow g h β γ H)
( coh-hom-arrow f g α a)))
( coh-hom-arrow g h γ (map-domain-hom-arrow f g α a))))
right-whisker-comp-hom-arrow :
htpy-hom-arrow f h
( comp-hom-arrow f g h β α)
( comp-hom-arrow f g h γ α)
pr1 right-whisker-comp-hom-arrow =
htpy-domain-right-whisker-comp-hom-arrow
pr1 (pr2 right-whisker-comp-hom-arrow) =
htpy-codomain-right-whisker-comp-hom-arrow
pr2 (pr2 right-whisker-comp-hom-arrow) =
coh-right-whisker-comp-hom-arrow
```
## Properties
### Homotopies of morphisms of arrows characterize equality of morphisms of arrows
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y) (α : hom-arrow f g)
where
is-torsorial-htpy-hom-arrow :
is-torsorial (htpy-hom-arrow f g α)
is-torsorial-htpy-hom-arrow =
is-torsorial-Eq-structure
( is-torsorial-htpy (map-domain-hom-arrow f g α))
( map-domain-hom-arrow f g α , refl-htpy)
( is-torsorial-Eq-structure
( is-torsorial-htpy (map-codomain-hom-arrow f g α))
( map-codomain-hom-arrow f g α , refl-htpy)
( is-torsorial-htpy (coh-hom-arrow f g α ∙h refl-htpy)))
htpy-eq-hom-arrow : (β : hom-arrow f g) → (α = β) → htpy-hom-arrow f g α β
htpy-eq-hom-arrow β refl = refl-htpy-hom-arrow f g α
is-equiv-htpy-eq-hom-arrow :
(β : hom-arrow f g) → is-equiv (htpy-eq-hom-arrow β)
is-equiv-htpy-eq-hom-arrow =
fundamental-theorem-id is-torsorial-htpy-hom-arrow htpy-eq-hom-arrow
extensionality-hom-arrow :
(β : hom-arrow f g) → (α = β) ≃ htpy-hom-arrow f g α β
pr1 (extensionality-hom-arrow β) = htpy-eq-hom-arrow β
pr2 (extensionality-hom-arrow β) = is-equiv-htpy-eq-hom-arrow β
eq-htpy-hom-arrow :
(β : hom-arrow f g) → htpy-hom-arrow f g α β → α = β
eq-htpy-hom-arrow β = map-inv-equiv (extensionality-hom-arrow β)
```
### Homotopies of morphisms of arrows give homotopies of their associated cones
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y)
(α β : hom-arrow f g)
where
coh-htpy-parallell-cone-htpy-hom-arrow :
(H : htpy-hom-arrow f g α β) →
coherence-htpy-parallel-cone
( htpy-codomain-htpy-hom-arrow f g α β H)
( refl-htpy' g)
( cone-hom-arrow f g α)
( cone-hom-arrow f g β)
( refl-htpy)
( htpy-domain-htpy-hom-arrow f g α β H)
coh-htpy-parallell-cone-htpy-hom-arrow H =
( ap-concat-htpy (coh-hom-arrow f g α) right-unit-htpy) ∙h
( coh-htpy-hom-arrow f g α β H)
htpy-parallell-cone-htpy-hom-arrow :
(H : htpy-hom-arrow f g α β) →
htpy-parallel-cone
( htpy-codomain-htpy-hom-arrow f g α β H)
( refl-htpy' g)
( cone-hom-arrow f g α)
( cone-hom-arrow f g β)
htpy-parallell-cone-htpy-hom-arrow H =
( refl-htpy ,
htpy-domain-htpy-hom-arrow f g α β H ,
coh-htpy-parallell-cone-htpy-hom-arrow H)
```
### Associativity of composition of morphisms of arrows
Consider a commuting diagram of the form
```text
α₀ β₀ γ₀
A -----> X -----> U -----> K
| | | |
f | α g | β h | γ | i
∨ ∨ ∨ ∨
B -----> Y -----> V -----> L
α₁ β₁ γ₁
```
Then associativity of composition of morphisms of arrows follows directly from
associativity of horizontal pasting of commutative squares of maps.
```agda
module _
{l1 l2 l3 l4 l5 l6 l7 l8 : Level}
{A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4} {U : UU l5} {V : UU l6}
{K : UU l7} {L : UU l8} (f : A → B) (g : X → Y) (h : U → V) (i : K → L)
(γ : hom-arrow h i) (β : hom-arrow g h) (α : hom-arrow f g)
where
assoc-comp-hom-arrow :
htpy-hom-arrow f i
( comp-hom-arrow f g i (comp-hom-arrow g h i γ β) α)
( comp-hom-arrow f h i γ (comp-hom-arrow f g h β α))
pr1 assoc-comp-hom-arrow = refl-htpy
pr1 (pr2 assoc-comp-hom-arrow) = refl-htpy
pr2 (pr2 assoc-comp-hom-arrow) =
( right-unit-htpy) ∙h
( inv-htpy
( assoc-pasting-horizontal-coherence-square-maps
( map-domain-hom-arrow f g α)
( map-domain-hom-arrow g h β)
( map-domain-hom-arrow h i γ)
( f)
( g)
( h)
( i)
( map-codomain-hom-arrow f g α)
( map-codomain-hom-arrow g h β)
( map-codomain-hom-arrow h i γ)
( coh-hom-arrow f g α)
( coh-hom-arrow g h β)
( coh-hom-arrow h i γ)))
inv-assoc-comp-hom-arrow :
htpy-hom-arrow f i
( comp-hom-arrow f h i γ (comp-hom-arrow f g h β α))
( comp-hom-arrow f g i (comp-hom-arrow g h i γ β) α)
pr1 inv-assoc-comp-hom-arrow = refl-htpy
pr1 (pr2 inv-assoc-comp-hom-arrow) = refl-htpy
pr2 (pr2 inv-assoc-comp-hom-arrow) =
( right-unit-htpy) ∙h
( assoc-pasting-horizontal-coherence-square-maps
( map-domain-hom-arrow f g α)
( map-domain-hom-arrow g h β)
( map-domain-hom-arrow h i γ)
( f)
( g)
( h)
( i)
( map-codomain-hom-arrow f g α)
( map-codomain-hom-arrow g h β)
( map-codomain-hom-arrow h i γ)
( coh-hom-arrow f g α)
( coh-hom-arrow g h β)
( coh-hom-arrow h i γ))
```
### The left unit law for composition of morphisms of arrows
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y) (α : hom-arrow f g)
where
left-unit-law-comp-hom-arrow :
htpy-hom-arrow f g
( comp-hom-arrow f g g id-hom-arrow α)
( α)
pr1 left-unit-law-comp-hom-arrow = refl-htpy
pr1 (pr2 left-unit-law-comp-hom-arrow) = refl-htpy
pr2 (pr2 left-unit-law-comp-hom-arrow) =
( right-unit-htpy) ∙h
( right-unit-law-pasting-horizontal-coherence-square-maps
( map-domain-hom-arrow f g α)
( f)
( g)
( map-codomain-hom-arrow f g α)
( coh-hom-arrow f g α))
```
### The right unit law for composition of morphisms of arrows
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(f : A → B) (g : X → Y) (α : hom-arrow f g)
where
right-unit-law-comp-hom-arrow :
htpy-hom-arrow f g
( comp-hom-arrow f f g α id-hom-arrow)
( α)
pr1 right-unit-law-comp-hom-arrow = refl-htpy
pr1 (pr2 right-unit-law-comp-hom-arrow) = refl-htpy
pr2 (pr2 right-unit-law-comp-hom-arrow) = right-unit-htpy
```