# Equivalences of arrows
```agda
module foundation.equivalences-arrows where
```
<details><summary>Imports</summary>
```agda
open import foundation.cartesian-morphisms-arrows
open import foundation.commuting-squares-of-maps
open import foundation.dependent-pair-types
open import foundation.equivalences
open import foundation.homotopies
open import foundation.morphisms-arrows
open import foundation.span-diagrams
open import foundation.spans
open import foundation.universe-levels
open import foundation-core.propositions
```
</details>
## Idea
An {{#concept "equivalence of arrows"}} from a function `f : A → B` to a
function `g : X → Y` is a [morphism of arrows](foundation.morphisms-arrows.md)
```text
i
A -----> X
| ≃ |
f | | g
∨ ≃ ∨
B -----> Y
j
```
in which `i` and `j` are [equivalences](foundation-core.equivalences.md).
## Definitions
### The predicate of being an equivalence 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) (h : hom-arrow f g)
where
is-equiv-prop-hom-arrow : Prop (l1 ⊔ l2 ⊔ l3 ⊔ l4)
is-equiv-prop-hom-arrow =
product-Prop
( is-equiv-Prop (map-domain-hom-arrow f g h))
( is-equiv-Prop (map-codomain-hom-arrow f g h))
is-equiv-hom-arrow : UU (l1 ⊔ l2 ⊔ l3 ⊔ l4)
is-equiv-hom-arrow =
type-Prop is-equiv-prop-hom-arrow
is-prop-is-equiv-hom-arrow : is-prop is-equiv-hom-arrow
is-prop-is-equiv-hom-arrow = is-prop-type-Prop is-equiv-prop-hom-arrow
is-equiv-map-domain-is-equiv-hom-arrow :
is-equiv-hom-arrow → is-equiv (map-domain-hom-arrow f g h)
is-equiv-map-domain-is-equiv-hom-arrow = pr1
is-equiv-map-codomain-is-equiv-hom-arrow :
is-equiv-hom-arrow → is-equiv (map-codomain-hom-arrow f g h)
is-equiv-map-codomain-is-equiv-hom-arrow = pr2
```
### Equivalences 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)
where
coherence-equiv-arrow : (A ≃ X) → (B ≃ Y) → UU (l1 ⊔ l4)
coherence-equiv-arrow i j =
coherence-hom-arrow f g (map-equiv i) (map-equiv j)
equiv-arrow : UU (l1 ⊔ l2 ⊔ l3 ⊔ l4)
equiv-arrow =
Σ (A ≃ X) (λ i → Σ (B ≃ Y) (coherence-equiv-arrow i))
module _
(e : equiv-arrow)
where
equiv-domain-equiv-arrow : A ≃ X
equiv-domain-equiv-arrow = pr1 e
map-domain-equiv-arrow : A → X
map-domain-equiv-arrow = map-equiv equiv-domain-equiv-arrow
is-equiv-map-domain-equiv-arrow : is-equiv map-domain-equiv-arrow
is-equiv-map-domain-equiv-arrow =
is-equiv-map-equiv equiv-domain-equiv-arrow
equiv-codomain-equiv-arrow : B ≃ Y
equiv-codomain-equiv-arrow = pr1 (pr2 e)
map-codomain-equiv-arrow : B → Y
map-codomain-equiv-arrow = map-equiv equiv-codomain-equiv-arrow
is-equiv-map-codomain-equiv-arrow : is-equiv map-codomain-equiv-arrow
is-equiv-map-codomain-equiv-arrow =
is-equiv-map-equiv equiv-codomain-equiv-arrow
coh-equiv-arrow :
coherence-equiv-arrow
( equiv-domain-equiv-arrow)
( equiv-codomain-equiv-arrow)
coh-equiv-arrow = pr2 (pr2 e)
hom-equiv-arrow : hom-arrow f g
pr1 hom-equiv-arrow = map-domain-equiv-arrow
pr1 (pr2 hom-equiv-arrow) = map-codomain-equiv-arrow
pr2 (pr2 hom-equiv-arrow) = coh-equiv-arrow
is-equiv-equiv-arrow : is-equiv-hom-arrow f g hom-equiv-arrow
pr1 is-equiv-equiv-arrow = is-equiv-map-domain-equiv-arrow
pr2 is-equiv-equiv-arrow = is-equiv-map-codomain-equiv-arrow
span-equiv-arrow :
span l1 B X
span-equiv-arrow =
span-hom-arrow f g hom-equiv-arrow
span-diagram-equiv-arrow : span-diagram l2 l3 l1
pr1 span-diagram-equiv-arrow = B
pr1 (pr2 span-diagram-equiv-arrow) = X
pr2 (pr2 span-diagram-equiv-arrow) = span-equiv-arrow
```
### The identity equivalence of arrows
```agda
module _
{l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B}
where
id-equiv-arrow : equiv-arrow f f
pr1 id-equiv-arrow = id-equiv
pr1 (pr2 id-equiv-arrow) = id-equiv
pr2 (pr2 id-equiv-arrow) = refl-htpy
```
### Composition of equivalences of arrows
```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)
(b : equiv-arrow g h) (a : equiv-arrow f g)
where
equiv-domain-comp-equiv-arrow : A ≃ U
equiv-domain-comp-equiv-arrow =
equiv-domain-equiv-arrow g h b ∘e equiv-domain-equiv-arrow f g a
map-domain-comp-equiv-arrow : A → U
map-domain-comp-equiv-arrow = map-equiv equiv-domain-comp-equiv-arrow
equiv-codomain-comp-equiv-arrow : B ≃ V
equiv-codomain-comp-equiv-arrow =
equiv-codomain-equiv-arrow g h b ∘e equiv-codomain-equiv-arrow f g a
map-codomain-comp-equiv-arrow : B → V
map-codomain-comp-equiv-arrow = map-equiv equiv-codomain-comp-equiv-arrow
coh-comp-equiv-arrow :
coherence-equiv-arrow f h
( equiv-domain-comp-equiv-arrow)
( equiv-codomain-comp-equiv-arrow)
coh-comp-equiv-arrow =
coh-comp-hom-arrow f g h
( hom-equiv-arrow g h b)
( hom-equiv-arrow f g a)
comp-equiv-arrow : equiv-arrow f h
pr1 comp-equiv-arrow = equiv-domain-comp-equiv-arrow
pr1 (pr2 comp-equiv-arrow) = equiv-codomain-comp-equiv-arrow
pr2 (pr2 comp-equiv-arrow) = coh-comp-equiv-arrow
hom-comp-equiv-arrow : hom-arrow f h
hom-comp-equiv-arrow = hom-equiv-arrow f h comp-equiv-arrow
```
### Inverses of equivalences 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) (α : equiv-arrow f g)
where
equiv-domain-inv-equiv-arrow : X ≃ A
equiv-domain-inv-equiv-arrow = inv-equiv (equiv-domain-equiv-arrow f g α)
map-domain-inv-equiv-arrow : X → A
map-domain-inv-equiv-arrow = map-equiv equiv-domain-inv-equiv-arrow
equiv-codomain-inv-equiv-arrow : Y ≃ B
equiv-codomain-inv-equiv-arrow = inv-equiv (equiv-codomain-equiv-arrow f g α)
map-codomain-inv-equiv-arrow : Y → B
map-codomain-inv-equiv-arrow = map-equiv equiv-codomain-inv-equiv-arrow
coh-inv-equiv-arrow :
coherence-equiv-arrow g f
( equiv-domain-inv-equiv-arrow)
( equiv-codomain-inv-equiv-arrow)
coh-inv-equiv-arrow =
horizontal-inv-equiv-coherence-square-maps
( equiv-domain-equiv-arrow f g α)
( f)
( g)
( equiv-codomain-equiv-arrow f g α)
( coh-equiv-arrow f g α)
inv-equiv-arrow : equiv-arrow g f
pr1 inv-equiv-arrow = equiv-domain-inv-equiv-arrow
pr1 (pr2 inv-equiv-arrow) = equiv-codomain-inv-equiv-arrow
pr2 (pr2 inv-equiv-arrow) = coh-inv-equiv-arrow
hom-inv-equiv-arrow : hom-arrow g f
hom-inv-equiv-arrow = hom-equiv-arrow g f inv-equiv-arrow
is-equiv-inv-equiv-arrow : is-equiv-hom-arrow g f hom-inv-equiv-arrow
is-equiv-inv-equiv-arrow = is-equiv-equiv-arrow g f inv-equiv-arrow
```
### If a map is equivalent to an equivalence, then it is an equivalence
```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) (α : equiv-arrow f g)
where
is-equiv-source-is-equiv-target-equiv-arrow : is-equiv g → is-equiv f
is-equiv-source-is-equiv-target-equiv-arrow =
is-equiv-left-is-equiv-right-square
( f)
( g)
( map-domain-equiv-arrow f g α)
( map-codomain-equiv-arrow f g α)
( coh-equiv-arrow f g α)
( is-equiv-map-domain-equiv-arrow f g α)
( is-equiv-map-codomain-equiv-arrow f g α)
is-equiv-target-is-equiv-source-equiv-arrow : is-equiv f → is-equiv g
is-equiv-target-is-equiv-source-equiv-arrow =
is-equiv-right-is-equiv-left-square
( f)
( g)
( map-domain-equiv-arrow f g α)
( map-codomain-equiv-arrow f g α)
( coh-equiv-arrow f g α)
( is-equiv-map-domain-equiv-arrow f g α)
( is-equiv-map-codomain-equiv-arrow f g α)
```
### Equivalences of arrows are cartesian
```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) (α : equiv-arrow f g)
where
is-cartesian-equiv-arrow :
is-cartesian-hom-arrow f g (hom-equiv-arrow f g α)
is-cartesian-equiv-arrow =
is-pullback-is-equiv-horizontal-maps
( map-codomain-equiv-arrow f g α)
( g)
( cone-hom-arrow f g (hom-equiv-arrow f g α))
( is-equiv-map-codomain-equiv-arrow f g α)
( is-equiv-map-domain-equiv-arrow f g α)
cartesian-hom-equiv-arrow : cartesian-hom-arrow f g
pr1 cartesian-hom-equiv-arrow = hom-equiv-arrow f g α
pr2 cartesian-hom-equiv-arrow = is-cartesian-equiv-arrow
```