# Equivalences of double arrows
```agda
module foundation.equivalences-double-arrows where
```
<details><summary>Imports</summary>
```agda
open import foundation.cartesian-product-types
open import foundation.commuting-squares-of-maps
open import foundation.dependent-pair-types
open import foundation.double-arrows
open import foundation.equivalences
open import foundation.equivalences-arrows
open import foundation.homotopies
open import foundation.morphisms-double-arrows
open import foundation.universe-levels
```
</details>
## Idea
An
{{#concept "equivalence of double arrows" Disambiguation="between types" Agda=equiv-double-arrow}}
from a [double arrow](foundation.double-arrows.md) `f, g : A → B` to a double
arrow `h, k : X → Y` is a pair of
[equivalences](foundation-core.equivalences.md) `i : A ≃ X` and `j : B ≃ Y`,
such that the squares
```text
i i
A --------> X A --------> X
| ≃ | | ≃ |
f | | h g | | k
| | | |
∨ ≃ ∨ ∨ ≃ ∨
B --------> Y B --------> Y
j j
```
[commute](foundation-core.commuting-squares-of-maps.md). The equivalence `i` is
referred to as the _domain equivalence_, and the `j` as the _codomain
equivalence_.
Alternatively, an equivalence of double arrows is a pair of
[equivalences of arrows](foundation.equivalences-arrows.md) `f ≃ h` and `g ≃ k`
that share the underlying maps.
## Definitions
### Equivalences of double arrows
```agda
module _
{l1 l2 l3 l4 : Level}
(a : double-arrow l1 l2) (a' : double-arrow l3 l4)
where
left-coherence-equiv-double-arrow :
(domain-double-arrow a ≃ domain-double-arrow a') →
(codomain-double-arrow a ≃ codomain-double-arrow a') →
UU (l1 ⊔ l4)
left-coherence-equiv-double-arrow eA eB =
left-coherence-hom-double-arrow a a' (map-equiv eA) (map-equiv eB)
right-coherence-equiv-double-arrow :
(domain-double-arrow a ≃ domain-double-arrow a') →
(codomain-double-arrow a ≃ codomain-double-arrow a') →
UU (l1 ⊔ l4)
right-coherence-equiv-double-arrow eA eB =
right-coherence-hom-double-arrow a a' (map-equiv eA) (map-equiv eB)
equiv-double-arrow :
UU (l1 ⊔ l2 ⊔ l3 ⊔ l4)
equiv-double-arrow =
Σ ( domain-double-arrow a ≃ domain-double-arrow a')
( λ eA →
Σ ( codomain-double-arrow a ≃ codomain-double-arrow a')
( λ eB →
left-coherence-equiv-double-arrow eA eB ×
right-coherence-equiv-double-arrow eA eB))
```
### Components of an equivalence of double arrows
```agda
module _
{l1 l2 l3 l4 : Level}
(a : double-arrow l1 l2) (a' : double-arrow l3 l4)
(e : equiv-double-arrow a a')
where
domain-equiv-equiv-double-arrow :
domain-double-arrow a ≃ domain-double-arrow a'
domain-equiv-equiv-double-arrow = pr1 e
domain-map-equiv-double-arrow :
domain-double-arrow a → domain-double-arrow a'
domain-map-equiv-double-arrow = map-equiv domain-equiv-equiv-double-arrow
is-equiv-domain-map-equiv-double-arrow :
is-equiv domain-map-equiv-double-arrow
is-equiv-domain-map-equiv-double-arrow =
is-equiv-map-equiv domain-equiv-equiv-double-arrow
codomain-equiv-equiv-double-arrow :
codomain-double-arrow a ≃ codomain-double-arrow a'
codomain-equiv-equiv-double-arrow = pr1 (pr2 e)
codomain-map-equiv-double-arrow :
codomain-double-arrow a → codomain-double-arrow a'
codomain-map-equiv-double-arrow = map-equiv codomain-equiv-equiv-double-arrow
is-equiv-codomain-map-equiv-double-arrow :
is-equiv codomain-map-equiv-double-arrow
is-equiv-codomain-map-equiv-double-arrow =
is-equiv-map-equiv codomain-equiv-equiv-double-arrow
left-square-equiv-double-arrow :
left-coherence-equiv-double-arrow a a'
( domain-equiv-equiv-double-arrow)
( codomain-equiv-equiv-double-arrow)
left-square-equiv-double-arrow = pr1 (pr2 (pr2 e))
left-equiv-arrow-equiv-double-arrow :
equiv-arrow (left-map-double-arrow a) (left-map-double-arrow a')
pr1 left-equiv-arrow-equiv-double-arrow =
domain-equiv-equiv-double-arrow
pr1 (pr2 left-equiv-arrow-equiv-double-arrow) =
codomain-equiv-equiv-double-arrow
pr2 (pr2 left-equiv-arrow-equiv-double-arrow) =
left-square-equiv-double-arrow
right-square-equiv-double-arrow :
right-coherence-equiv-double-arrow a a'
( domain-equiv-equiv-double-arrow)
( codomain-equiv-equiv-double-arrow)
right-square-equiv-double-arrow = pr2 (pr2 (pr2 e))
right-equiv-arrow-equiv-double-arrow :
equiv-arrow (right-map-double-arrow a) (right-map-double-arrow a')
pr1 right-equiv-arrow-equiv-double-arrow =
domain-equiv-equiv-double-arrow
pr1 (pr2 right-equiv-arrow-equiv-double-arrow) =
codomain-equiv-equiv-double-arrow
pr2 (pr2 right-equiv-arrow-equiv-double-arrow) =
right-square-equiv-double-arrow
hom-equiv-double-arrow : hom-double-arrow a a'
pr1 hom-equiv-double-arrow =
domain-map-equiv-double-arrow
pr1 (pr2 hom-equiv-double-arrow) =
codomain-map-equiv-double-arrow
pr1 (pr2 (pr2 hom-equiv-double-arrow)) =
left-square-equiv-double-arrow
pr2 (pr2 (pr2 hom-equiv-double-arrow)) =
right-square-equiv-double-arrow
```
### Equivalences of double arrows induced by morphisms of double arrows whose maps are equivalences
Given a [morphism of double arrows](foundation.morphisms-double-arrows.md)
```text
i i
A --------> X A --------> X
| | | |
f | | h g | | k
| | | |
∨ ∨ ∨ ∨
B --------> Y B --------> Y ,
j j
```
it suffices to show that `i` and `j` are equivalences to obtain an equivalence
of double arrows.
```agda
module _
{l1 l2 l3 l4 : Level}
(a : double-arrow l1 l2) (a' : double-arrow l3 l4)
where
equiv-hom-double-arrow :
(h : hom-double-arrow a a') →
is-equiv (domain-map-hom-double-arrow a a' h) →
is-equiv (codomain-map-hom-double-arrow a a' h) →
equiv-double-arrow a a'
pr1 (equiv-hom-double-arrow h is-equiv-dom _) =
(domain-map-hom-double-arrow a a' h , is-equiv-dom)
pr1 (pr2 (equiv-hom-double-arrow h _ is-equiv-cod)) =
codomain-map-hom-double-arrow a a' h , is-equiv-cod
pr2 (pr2 (equiv-hom-double-arrow h _ _)) =
(left-square-hom-double-arrow a a' h , right-square-hom-double-arrow a a' h)
```
### The identity equivalence of double arrows
```agda
module _
{l1 l2 : Level} (a : double-arrow l1 l2)
where
id-equiv-double-arrow : equiv-double-arrow a a
pr1 id-equiv-double-arrow = id-equiv
pr1 (pr2 id-equiv-double-arrow) = id-equiv
pr2 (pr2 id-equiv-double-arrow) = (refl-htpy , refl-htpy)
```
### Composition of equivalences of double arrows
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
(a : double-arrow l1 l2) (b : double-arrow l3 l4) (c : double-arrow l5 l6)
(f : equiv-double-arrow b c) (e : equiv-double-arrow a b)
where
comp-equiv-double-arrow : equiv-double-arrow a c
comp-equiv-double-arrow =
equiv-hom-double-arrow a c
( comp-hom-double-arrow a b c
( hom-equiv-double-arrow b c f)
( hom-equiv-double-arrow a b e))
( is-equiv-comp _ _
( is-equiv-domain-map-equiv-double-arrow a b e)
( is-equiv-domain-map-equiv-double-arrow b c f))
( is-equiv-comp _ _
( is-equiv-codomain-map-equiv-double-arrow a b e)
( is-equiv-codomain-map-equiv-double-arrow b c f))
domain-equiv-comp-equiv-double-arrow :
domain-double-arrow a ≃ domain-double-arrow c
domain-equiv-comp-equiv-double-arrow =
domain-equiv-equiv-double-arrow a c comp-equiv-double-arrow
codomain-equiv-comp-equiv-double-arrow :
codomain-double-arrow a ≃ codomain-double-arrow c
codomain-equiv-comp-equiv-double-arrow =
codomain-equiv-equiv-double-arrow a c comp-equiv-double-arrow
left-square-comp-equiv-double-arrow :
left-coherence-equiv-double-arrow a c
( domain-equiv-comp-equiv-double-arrow)
( codomain-equiv-comp-equiv-double-arrow)
left-square-comp-equiv-double-arrow =
left-square-equiv-double-arrow a c comp-equiv-double-arrow
right-square-comp-equiv-double-arrow :
right-coherence-equiv-double-arrow a c
( domain-equiv-comp-equiv-double-arrow)
( codomain-equiv-comp-equiv-double-arrow)
right-square-comp-equiv-double-arrow =
right-square-equiv-double-arrow a c comp-equiv-double-arrow
```