# Higher homotopies of morphisms of arrows
```agda
module foundation.higher-homotopies-morphisms-arrows where
```
<details><summary>Imports</summary>
```agda
open import foundation.action-on-identifications-functions
open import foundation.commuting-squares-of-homotopies
open import foundation.commuting-squares-of-identifications
open import foundation.dependent-pair-types
open import foundation.fundamental-theorem-of-identity-types
open import foundation.homotopies-morphisms-arrows
open import foundation.homotopy-induction
open import foundation.morphisms-arrows
open import foundation.path-algebra
open import foundation.structure-identity-principle
open import foundation.torsorial-type-families
open import foundation.universe-levels
open import foundation.whiskering-higher-homotopies-composition
open import foundation.whiskering-homotopies-concatenation
open import foundation.whiskering-identifications-concatenation
open import foundation-core.equivalences
open import foundation-core.homotopies
open import foundation-core.identity-types
```
</details>
## Idea
Consider two [morphisms of arrows](foundation.morphisms-arrows.md)
`α := (i , j , H)` and `α' := (i' , j' , H')` and two
[homotopies of morphisms of arrows](foundation.homotopies-morphisms-arrows.md)
`β := (I , J , K)` and `β' : (I' , J' , K')` between them. A
{{#concept "`2`-homotopy of morphisms of arrows" Agda=htpy-htpy-hom-arrow}} is a
triple `(γ₀, γ₁ , γ₂)` consisting of [homotopies](foundation-core.homotopies.md)
```text
γ₀ : I ~ I'
γ₁ : J ~ J'
```
and a homotopy witnessing that the square of homotopies
```text
left-whisker-concat-htpy H (g · γ₀)
H ∙ (g ·l I) ---------------------------------------> H ∙ (g · I')
| |
K | | K'
∨ ∨
(J · f) ∙ H' ---------------------------------------> (J' · f) ∙ H'
right-whisker-concat-htpy (γ₁ · f) H'
```
[commutes](foundation.commuting-squares-of-homotopies.md).
## Definitions
### Homotopies of homotopies 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)
(β β' : htpy-hom-arrow f g α α')
where
coherence-htpy-htpy-hom-arrow :
htpy-domain-htpy-hom-arrow f g α α' β ~
htpy-domain-htpy-hom-arrow f g α α' β' →
htpy-codomain-htpy-hom-arrow f g α α' β ~
htpy-codomain-htpy-hom-arrow f g α α' β' → UU (l1 ⊔ l4)
coherence-htpy-htpy-hom-arrow γ₀ γ₁ =
coherence-square-homotopies
( left-whisker-concat-htpy
( coh-hom-arrow f g α)
( left-whisker-comp² g γ₀))
( coh-htpy-hom-arrow f g α α' β)
( coh-htpy-hom-arrow f g α α' β')
( right-whisker-concat-htpy
( right-whisker-comp² γ₁ f)
( coh-hom-arrow f g α'))
htpy-htpy-hom-arrow : UU (l1 ⊔ l2 ⊔ l3 ⊔ l4)
htpy-htpy-hom-arrow =
Σ ( htpy-domain-htpy-hom-arrow f g α α' β ~
htpy-domain-htpy-hom-arrow f g α α' β')
( λ γ₀ →
Σ ( htpy-codomain-htpy-hom-arrow f g α α' β ~
htpy-codomain-htpy-hom-arrow f g α α' β')
( coherence-htpy-htpy-hom-arrow γ₀))
module _
(γ : htpy-htpy-hom-arrow)
where
htpy-domain-htpy-htpy-hom-arrow :
htpy-domain-htpy-hom-arrow f g α α' β ~
htpy-domain-htpy-hom-arrow f g α α' β'
htpy-domain-htpy-htpy-hom-arrow = pr1 γ
htpy-codomain-htpy-htpy-hom-arrow :
htpy-codomain-htpy-hom-arrow f g α α' β ~
htpy-codomain-htpy-hom-arrow f g α α' β'
htpy-codomain-htpy-htpy-hom-arrow = pr1 (pr2 γ)
coh-htpy-htpy-hom-arrow :
coherence-htpy-htpy-hom-arrow
( htpy-domain-htpy-htpy-hom-arrow)
( htpy-codomain-htpy-htpy-hom-arrow)
coh-htpy-htpy-hom-arrow = pr2 (pr2 γ)
```
### The reflexivity homotopy 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)
(β : htpy-hom-arrow f g α α')
where
htpy-domain-refl-htpy-htpy-hom-arrow :
htpy-domain-htpy-hom-arrow f g α α' β ~
htpy-domain-htpy-hom-arrow f g α α' β
htpy-domain-refl-htpy-htpy-hom-arrow = refl-htpy
htpy-codomain-refl-htpy-htpy-hom-arrow :
htpy-codomain-htpy-hom-arrow f g α α' β ~
htpy-codomain-htpy-hom-arrow f g α α' β
htpy-codomain-refl-htpy-htpy-hom-arrow = refl-htpy
coh-refl-htpy-htpy-hom-arrow :
coherence-htpy-htpy-hom-arrow f g α α' β β
( htpy-domain-refl-htpy-htpy-hom-arrow)
( htpy-codomain-refl-htpy-htpy-hom-arrow)
coh-refl-htpy-htpy-hom-arrow = right-unit-htpy
refl-htpy-htpy-hom-arrow : htpy-htpy-hom-arrow f g α α' β β
pr1 refl-htpy-htpy-hom-arrow = htpy-domain-refl-htpy-htpy-hom-arrow
pr1 (pr2 refl-htpy-htpy-hom-arrow) = htpy-codomain-refl-htpy-htpy-hom-arrow
pr2 (pr2 refl-htpy-htpy-hom-arrow) = coh-refl-htpy-htpy-hom-arrow
```
## Properties
### Homotopies of homotopies of morphisms of arrows characterize equality 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)
(β : htpy-hom-arrow f g α α')
where
htpy-eq-htpy-hom-arrow :
(β' : htpy-hom-arrow f g α α') → β = β' → htpy-htpy-hom-arrow f g α α' β β'
htpy-eq-htpy-hom-arrow .β refl = refl-htpy-htpy-hom-arrow f g α α' β
is-torsorial-htpy-htpy-hom-arrow :
is-torsorial (htpy-htpy-hom-arrow f g α α' β)
is-torsorial-htpy-htpy-hom-arrow =
is-torsorial-Eq-structure
( is-torsorial-htpy _)
( htpy-domain-htpy-hom-arrow f g α α' β , refl-htpy)
( is-torsorial-Eq-structure
( is-torsorial-htpy _)
( htpy-codomain-htpy-hom-arrow f g α α' β , refl-htpy)
( is-torsorial-htpy _))
is-equiv-htpy-eq-htpy-hom-arrow :
(β' : htpy-hom-arrow f g α α') → is-equiv (htpy-eq-htpy-hom-arrow β')
is-equiv-htpy-eq-htpy-hom-arrow =
fundamental-theorem-id
( is-torsorial-htpy-htpy-hom-arrow)
( htpy-eq-htpy-hom-arrow)
extensionality-htpy-hom-arrow :
(β' : htpy-hom-arrow f g α α') →
(β = β') ≃ htpy-htpy-hom-arrow f g α α' β β'
pr1 (extensionality-htpy-hom-arrow β') = htpy-eq-htpy-hom-arrow β'
pr2 (extensionality-htpy-hom-arrow β') = is-equiv-htpy-eq-htpy-hom-arrow β'
eq-htpy-htpy-hom-arrow :
(β' : htpy-hom-arrow f g α α') →
htpy-htpy-hom-arrow f g α α' β β' → β = β'
eq-htpy-htpy-hom-arrow β' = map-inv-equiv (extensionality-htpy-hom-arrow β')
```
### The left unit law for 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)
(β : htpy-hom-arrow f g α α')
where
htpy-domain-left-unit-law-concat-htpy-hom-arrow :
htpy-domain-concat-htpy-hom-arrow f g α α α' (refl-htpy-hom-arrow f g α) β ~
htpy-domain-htpy-hom-arrow f g α α' β
htpy-domain-left-unit-law-concat-htpy-hom-arrow = refl-htpy
htpy-codomain-left-unit-law-concat-htpy-hom-arrow :
htpy-codomain-concat-htpy-hom-arrow f g α α α'
( refl-htpy-hom-arrow f g α)
( β) ~
htpy-codomain-htpy-hom-arrow f g α α' β
htpy-codomain-left-unit-law-concat-htpy-hom-arrow = refl-htpy
coh-left-unit-law-concat-htpy-hom-arrow :
coherence-htpy-htpy-hom-arrow f g α α'
( concat-htpy-hom-arrow f g α α α' (refl-htpy-hom-arrow f g α) β)
( β)
( htpy-domain-left-unit-law-concat-htpy-hom-arrow)
( htpy-codomain-left-unit-law-concat-htpy-hom-arrow)
coh-left-unit-law-concat-htpy-hom-arrow a =
( right-unit) ∙
( right-whisker-concat
( right-whisker-concat-horizontal-refl-coherence-square-identifications
( coh-hom-arrow f g α a)
( ap g (htpy-domain-htpy-hom-arrow f g α α' β a)))
( coh-htpy-hom-arrow f g α α' β a))
left-unit-law-concat-htpy-hom-arrow :
htpy-htpy-hom-arrow f g α α'
( concat-htpy-hom-arrow f g α α α' (refl-htpy-hom-arrow f g α) β)
( β)
pr1 left-unit-law-concat-htpy-hom-arrow =
htpy-domain-left-unit-law-concat-htpy-hom-arrow
pr1 (pr2 left-unit-law-concat-htpy-hom-arrow) =
htpy-codomain-left-unit-law-concat-htpy-hom-arrow
pr2 (pr2 left-unit-law-concat-htpy-hom-arrow) =
coh-left-unit-law-concat-htpy-hom-arrow
```
### The right unit law for concatenation 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)
(β : htpy-hom-arrow f g α α')
where
htpy-domain-right-unit-law-concat-htpy-hom-arrow :
htpy-domain-concat-htpy-hom-arrow f g α α' α' β
( refl-htpy-hom-arrow f g α') ~
htpy-domain-htpy-hom-arrow f g α α' β
htpy-domain-right-unit-law-concat-htpy-hom-arrow = right-unit-htpy
htpy-codomain-right-unit-law-concat-htpy-hom-arrow :
htpy-codomain-concat-htpy-hom-arrow f g α α' α' β
( refl-htpy-hom-arrow f g α') ~
htpy-codomain-htpy-hom-arrow f g α α' β
htpy-codomain-right-unit-law-concat-htpy-hom-arrow = right-unit-htpy
coh-right-unit-law-concat-htpy-hom-arrow :
coherence-htpy-htpy-hom-arrow f g α α'
( concat-htpy-hom-arrow f g α α' α' β (refl-htpy-hom-arrow f g α'))
( β)
( htpy-domain-right-unit-law-concat-htpy-hom-arrow)
( htpy-codomain-right-unit-law-concat-htpy-hom-arrow)
coh-right-unit-law-concat-htpy-hom-arrow a =
( assoc
( left-whisker-concat (coh-hom-arrow f g α a) (ap-concat g _ refl))
( _)
( right-whisker-concat right-unit (coh-hom-arrow f g α' a))) ∙
( horizontal-concat-Id²
( ( ap
( left-whisker-concat (coh-hom-arrow f g α a))
( compute-right-refl-ap-concat g
( htpy-domain-htpy-hom-arrow f g α α' β a))) ∙
( distributive-left-whisker-concat-concat
( coh-hom-arrow f g α a)
( ap (ap g) right-unit)
( inv right-unit)))
( right-unit-law-horizontal-pasting-coherence-square-identifications
( htpy-codomain-htpy-hom-arrow f g α α' β (f a))
( coh-hom-arrow f g α a)
( coh-hom-arrow f g α' a)
( ap g (htpy-domain-htpy-hom-arrow f g α α' β a))
( coh-htpy-hom-arrow f g α α' β a)) ∙
( unsplice-concat'
( left-whisker-concat (coh-hom-arrow f g α a) (ap (ap g) right-unit))
( compute-inv-left-whisker-concat (coh-hom-arrow f g α a) right-unit)
( coh-htpy-hom-arrow f g α α' β a)))
right-unit-law-concat-htpy-hom-arrow :
htpy-htpy-hom-arrow f g α α'
( concat-htpy-hom-arrow f g α α' α' β (refl-htpy-hom-arrow f g α'))
( β)
pr1 right-unit-law-concat-htpy-hom-arrow =
htpy-domain-right-unit-law-concat-htpy-hom-arrow
pr1 (pr2 right-unit-law-concat-htpy-hom-arrow) =
htpy-codomain-right-unit-law-concat-htpy-hom-arrow
pr2 (pr2 right-unit-law-concat-htpy-hom-arrow) =
coh-right-unit-law-concat-htpy-hom-arrow
```