# Equivalences of descent data for pushouts
```agda
module synthetic-homotopy-theory.equivalences-descent-data-pushouts where
```
<details><summary>Imports</summary>
```agda
open import foundation.commuting-squares-of-maps
open import foundation.dependent-pair-types
open import foundation.equality-dependent-function-types
open import foundation.equivalence-extensionality
open import foundation.equivalences
open import foundation.fundamental-theorem-of-identity-types
open import foundation.homotopies
open import foundation.homotopy-induction
open import foundation.identity-types
open import foundation.span-diagrams
open import foundation.structure-identity-principle
open import foundation.torsorial-type-families
open import foundation.univalence
open import foundation.universe-levels
open import synthetic-homotopy-theory.descent-data-pushouts
open import synthetic-homotopy-theory.morphisms-descent-data-pushouts
```
</details>
## Idea
Given [descent data](synthetic-homotopy-theory.descent-data-pushouts.md) for
[pushouts](synthetic-homotopy-theory.pushouts.md) `(PA, PB, PS)` and
`(QA, QB, QS)`, an
{{#concept "equivalence" Disambiguation="descent data for pushouts" Agda=equiv-descent-data-pushout}}
between them is a pair of fiberwise equivalences
```text
eA : (a : A) → PA a ≃ QA a
eB : (b : B) → PB b ≃ QB b
```
equipped with a family of [homotopies](foundation-core.homotopies.md) making
```text
eA(fs)
PA(fs) --------> QA(fs)
| |
PS s | | QS s
| |
∨ ∨
PB(gs) --------> QB(gs)
eB(gs)
```
[commute](foundation-core.commuting-squares-of-maps.md) for every `s : S`.
We show that equivalences characterize the
[identity types](foundation-core.identity-types.md) of descent data for
pushouts.
By forgetting that the fiberwise maps are equivalences, we get the underlying
[morphism of descent data](synthetic-homotopy-theory.morphisms-descent-data-pushouts.md).
We define homotopies of equivalences of descent data to be homotopies of the
underlying morphisms, and show that homotopies characterize the identity type of
equivalences of descent data.
## Definitions
### Equivalences of descent data for pushouts
Note that the descent data arguments cannot be inferred when calling
`left-equiv-equiv-descent-data-pushout` and the like, since Agda cannot infer
the proofs of `is-equiv` of their gluing maps.
```agda
module _
{l1 l2 l3 l4 l5 : Level} {𝒮 : span-diagram l1 l2 l3}
(P : descent-data-pushout 𝒮 l4)
(Q : descent-data-pushout 𝒮 l5)
where
equiv-descent-data-pushout : UU (l1 ⊔ l2 ⊔ l3 ⊔ l4 ⊔ l5)
equiv-descent-data-pushout =
Σ ( (a : domain-span-diagram 𝒮) →
left-family-descent-data-pushout P a ≃
left-family-descent-data-pushout Q a)
( λ eA →
Σ ( (b : codomain-span-diagram 𝒮) →
right-family-descent-data-pushout P b ≃
right-family-descent-data-pushout Q b)
( λ eB →
(s : spanning-type-span-diagram 𝒮) →
coherence-square-maps
( map-equiv (eA (left-map-span-diagram 𝒮 s)))
( map-family-descent-data-pushout P s)
( map-family-descent-data-pushout Q s)
( map-equiv (eB (right-map-span-diagram 𝒮 s)))))
module _
(e : equiv-descent-data-pushout)
where
left-equiv-equiv-descent-data-pushout :
(a : domain-span-diagram 𝒮) →
left-family-descent-data-pushout P a ≃
left-family-descent-data-pushout Q a
left-equiv-equiv-descent-data-pushout = pr1 e
left-map-equiv-descent-data-pushout :
(a : domain-span-diagram 𝒮) →
left-family-descent-data-pushout P a →
left-family-descent-data-pushout Q a
left-map-equiv-descent-data-pushout a =
map-equiv (left-equiv-equiv-descent-data-pushout a)
is-equiv-left-map-equiv-descent-data-pushout :
(a : domain-span-diagram 𝒮) →
is-equiv (left-map-equiv-descent-data-pushout a)
is-equiv-left-map-equiv-descent-data-pushout a =
is-equiv-map-equiv (left-equiv-equiv-descent-data-pushout a)
inv-left-map-equiv-descent-data-pushout :
(a : domain-span-diagram 𝒮) →
left-family-descent-data-pushout Q a →
left-family-descent-data-pushout P a
inv-left-map-equiv-descent-data-pushout a =
map-inv-equiv (left-equiv-equiv-descent-data-pushout a)
right-equiv-equiv-descent-data-pushout :
(b : codomain-span-diagram 𝒮) →
right-family-descent-data-pushout P b ≃
right-family-descent-data-pushout Q b
right-equiv-equiv-descent-data-pushout = pr1 (pr2 e)
right-map-equiv-descent-data-pushout :
(b : codomain-span-diagram 𝒮) →
right-family-descent-data-pushout P b →
right-family-descent-data-pushout Q b
right-map-equiv-descent-data-pushout b =
map-equiv (right-equiv-equiv-descent-data-pushout b)
is-equiv-right-map-equiv-descent-data-pushout :
(b : codomain-span-diagram 𝒮) →
is-equiv (right-map-equiv-descent-data-pushout b)
is-equiv-right-map-equiv-descent-data-pushout b =
is-equiv-map-equiv (right-equiv-equiv-descent-data-pushout b)
inv-right-map-equiv-descent-data-pushout :
(b : codomain-span-diagram 𝒮) →
right-family-descent-data-pushout Q b →
right-family-descent-data-pushout P b
inv-right-map-equiv-descent-data-pushout b =
map-inv-equiv (right-equiv-equiv-descent-data-pushout b)
coherence-equiv-descent-data-pushout :
(s : spanning-type-span-diagram 𝒮) →
coherence-square-maps
( left-map-equiv-descent-data-pushout (left-map-span-diagram 𝒮 s))
( map-family-descent-data-pushout P s)
( map-family-descent-data-pushout Q s)
( right-map-equiv-descent-data-pushout (right-map-span-diagram 𝒮 s))
coherence-equiv-descent-data-pushout = pr2 (pr2 e)
hom-equiv-descent-data-pushout : hom-descent-data-pushout P Q
pr1 hom-equiv-descent-data-pushout =
left-map-equiv-descent-data-pushout
pr1 (pr2 hom-equiv-descent-data-pushout) =
right-map-equiv-descent-data-pushout
pr2 (pr2 hom-equiv-descent-data-pushout) =
coherence-equiv-descent-data-pushout
```
### The identity equivalence of descent data for pushouts
```agda
module _
{l1 l2 l3 l4 : Level} {𝒮 : span-diagram l1 l2 l3}
(P : descent-data-pushout 𝒮 l4)
where
id-equiv-descent-data-pushout : equiv-descent-data-pushout P P
pr1 id-equiv-descent-data-pushout a = id-equiv
pr1 (pr2 id-equiv-descent-data-pushout) b = id-equiv
pr2 (pr2 id-equiv-descent-data-pushout) s = refl-htpy
```
### Inverses of equivalences of descent data for pushouts
Taking an inverse of an equivalence `(eA, eB, eS)` of descent data amounts to
taking the inverses of the fiberwise maps
```text
a : A ⊢ eA(a)⁻¹ : QA a ≃ PA a
b : B ⊢ eB(b)⁻¹ : QB b ≃ PB b
```
and mirroring the coherence squares vertically to get
```text
eA(a)⁻¹
QA(fs) --------> PA(fs)
| |
QS s | | PS s
| |
∨ ∨
QB(gs) --------> PB(gs).
eB(a)⁻¹
```
```agda
module _
{l1 l2 l3 l4 l5 : Level} {𝒮 : span-diagram l1 l2 l3}
(P : descent-data-pushout 𝒮 l4)
(Q : descent-data-pushout 𝒮 l5)
where
inv-equiv-descent-data-pushout :
equiv-descent-data-pushout P Q → equiv-descent-data-pushout Q P
pr1 (inv-equiv-descent-data-pushout e) a =
inv-equiv (left-equiv-equiv-descent-data-pushout P Q e a)
pr1 (pr2 (inv-equiv-descent-data-pushout e)) b =
inv-equiv (right-equiv-equiv-descent-data-pushout P Q e b)
pr2 (pr2 (inv-equiv-descent-data-pushout e)) s =
horizontal-inv-equiv-coherence-square-maps
( left-equiv-equiv-descent-data-pushout P Q e (left-map-span-diagram 𝒮 s))
( map-family-descent-data-pushout P s)
( map-family-descent-data-pushout Q s)
( right-equiv-equiv-descent-data-pushout P Q e
( right-map-span-diagram 𝒮 s))
( coherence-equiv-descent-data-pushout P Q e s)
```
### Homotopies of equivalences of descent data for pushouts
```agda
module _
{l1 l2 l3 l4 l5 : Level} {𝒮 : span-diagram l1 l2 l3}
(P : descent-data-pushout 𝒮 l4)
(Q : descent-data-pushout 𝒮 l5)
where
htpy-equiv-descent-data-pushout :
(e f : equiv-descent-data-pushout P Q) → UU (l1 ⊔ l2 ⊔ l3 ⊔ l4 ⊔ l5)
htpy-equiv-descent-data-pushout e f =
htpy-hom-descent-data-pushout P Q
( hom-equiv-descent-data-pushout P Q e)
( hom-equiv-descent-data-pushout P Q f)
```
## Properties
### Characterization of identity types of descent data for pushouts
```agda
module _
{l1 l2 l3 l4 : Level} {𝒮 : span-diagram l1 l2 l3}
(P : descent-data-pushout 𝒮 l4)
where
equiv-eq-descent-data-pushout :
(Q : descent-data-pushout 𝒮 l4) →
P = Q → equiv-descent-data-pushout P Q
equiv-eq-descent-data-pushout .P refl = id-equiv-descent-data-pushout P
abstract
is-torsorial-equiv-descent-data-pushout :
is-torsorial (equiv-descent-data-pushout {l5 = l4} P)
is-torsorial-equiv-descent-data-pushout =
is-torsorial-Eq-structure
( is-torsorial-Eq-Π
( λ a → is-torsorial-equiv (left-family-descent-data-pushout P a)))
( left-family-descent-data-pushout P , λ a → id-equiv)
( is-torsorial-Eq-structure
( is-torsorial-Eq-Π
( λ b → is-torsorial-equiv (right-family-descent-data-pushout P b)))
( right-family-descent-data-pushout P , λ b → id-equiv)
( is-torsorial-Eq-Π
( λ s →
is-torsorial-htpy-equiv (equiv-family-descent-data-pushout P s))))
is-equiv-equiv-eq-descent-data-pushout :
(Q : descent-data-pushout 𝒮 l4) →
is-equiv (equiv-eq-descent-data-pushout Q)
is-equiv-equiv-eq-descent-data-pushout =
fundamental-theorem-id
( is-torsorial-equiv-descent-data-pushout)
( equiv-eq-descent-data-pushout)
extensionality-descent-data-pushout :
(Q : descent-data-pushout 𝒮 l4) →
(P = Q) ≃ equiv-descent-data-pushout P Q
pr1 (extensionality-descent-data-pushout Q) =
equiv-eq-descent-data-pushout Q
pr2 (extensionality-descent-data-pushout Q) =
is-equiv-equiv-eq-descent-data-pushout Q
eq-equiv-descent-data-pushout :
(Q : descent-data-pushout 𝒮 l4) →
equiv-descent-data-pushout P Q → P = Q
eq-equiv-descent-data-pushout Q =
map-inv-equiv (extensionality-descent-data-pushout Q)
```
### Characterization of identity types of equivalences of descent data of pushouts
```agda
module _
{l1 l2 l3 l4 l5 : Level} {𝒮 : span-diagram l1 l2 l3}
{P : descent-data-pushout 𝒮 l4}
{Q : descent-data-pushout 𝒮 l5}
(e : equiv-descent-data-pushout P Q)
where
htpy-eq-equiv-descent-data-pushout :
(f : equiv-descent-data-pushout P Q) →
(e = f) → htpy-equiv-descent-data-pushout P Q e f
htpy-eq-equiv-descent-data-pushout .e refl =
refl-htpy-hom-descent-data-pushout P Q
( hom-equiv-descent-data-pushout P Q e)
abstract
is-torsorial-htpy-equiv-descent-data-pushout :
is-torsorial (htpy-equiv-descent-data-pushout P Q e)
is-torsorial-htpy-equiv-descent-data-pushout =
is-torsorial-Eq-structure
( is-torsorial-Eq-Π
( λ a →
is-torsorial-htpy-equiv
( left-equiv-equiv-descent-data-pushout P Q e a)))
( left-equiv-equiv-descent-data-pushout P Q e , λ a → refl-htpy)
( is-torsorial-Eq-structure
( is-torsorial-Eq-Π
( λ b →
is-torsorial-htpy-equiv
( right-equiv-equiv-descent-data-pushout P Q e b)))
( right-equiv-equiv-descent-data-pushout P Q e , λ b → refl-htpy)
( is-torsorial-Eq-Π
( λ s →
is-torsorial-htpy
( coherence-equiv-descent-data-pushout P Q e s ∙h refl-htpy))))
is-equiv-htpy-eq-equiv-descent-data-pushout :
(f : equiv-descent-data-pushout P Q) →
is-equiv (htpy-eq-equiv-descent-data-pushout f)
is-equiv-htpy-eq-equiv-descent-data-pushout =
fundamental-theorem-id
( is-torsorial-htpy-equiv-descent-data-pushout)
( htpy-eq-equiv-descent-data-pushout)
extensionality-equiv-descent-data-pushout :
(f : equiv-descent-data-pushout P Q) →
(e = f) ≃
htpy-hom-descent-data-pushout P Q
( hom-equiv-descent-data-pushout P Q e)
( hom-equiv-descent-data-pushout P Q f)
pr1 (extensionality-equiv-descent-data-pushout f) =
htpy-eq-equiv-descent-data-pushout f
pr2 (extensionality-equiv-descent-data-pushout f) =
is-equiv-htpy-eq-equiv-descent-data-pushout f
```