# Functoriality of dependent pair types
```agda
module foundation.functoriality-dependent-pair-types where
open import foundation-core.functoriality-dependent-pair-types public
```
<details><summary>Imports</summary>
```agda
open import foundation.action-on-identifications-functions
open import foundation.dependent-homotopies
open import foundation.dependent-pair-types
open import foundation.morphisms-arrows
open import foundation.universe-levels
open import foundation-core.commuting-squares-of-maps
open import foundation-core.commuting-triangles-of-maps
open import foundation-core.contractible-maps
open import foundation-core.dependent-identifications
open import foundation-core.equality-dependent-pair-types
open import foundation-core.equivalences
open import foundation-core.fibers-of-maps
open import foundation-core.function-types
open import foundation-core.homotopies
open import foundation-core.identity-types
open import foundation-core.injective-maps
open import foundation-core.propositional-maps
open import foundation-core.transport-along-identifications
open import foundation-core.truncated-maps
open import foundation-core.truncated-types
open import foundation-core.truncation-levels
```
</details>
## Properties
### The map `htpy-map-Σ` preserves homotopies
Given a [homotopy](foundation.homotopies.md) `H : f ~ f'` and a family of
[dependent homotopies](foundation.dependent-homotopies.md) `K a : g a ~ g' a`
over `H`, expressed as
[commuting triangles](foundation.commuting-triangles-of-maps.md)
```text
g a
C a -----> D (f a)
\ /
g' a \ / tr D (H a)
∨ ∨
D (f' a) ,
```
we get a homotopy `htpy-map-Σ H K : map-Σ f g ~ map-Σ f' g'`.
This assignment itself preserves homotopies: given `H` and `K` as above,
`H' : f ~ f'` with `K' a : g a ~ g' a` over `H'`, we would like to express
coherences between the pairs `H, H'` and `K, K'` which would ensure
`htpy-map-Σ H K ~ htpy-map-Σ H' K'`. Because `H` and `H'` have the same type, we
may require a homotopy `α : H ~ H'`, but `K` and `K'` are families of dependent
homotopies over different homotopies, so their coherence is provided as a family
of
[commuting triangles of identifications](foundation.commuting-triangles-of-identifications.md)
```text
ap (λ p → tr D p (g a c)) (α a)
tr D (H a) (g a c) --------------------------------- tr D (H' a) (g a c)
\ /
\ /
\ /
K a c \ / K' a c
\ /
\ /
g' a c .
```
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {C : A → UU l3} (D : B → UU l4)
{f f' : A → B} {H H' : f ~ f'}
{g : (a : A) → C a → D (f a)}
{g' : (a : A) → C a → D (f' a)}
{K : (a : A) → dependent-homotopy (λ _ → D) (λ _ → H a) (g a) (g' a)}
{K' : (a : A) → dependent-homotopy (λ _ → D) (λ _ → H' a) (g a) (g' a)}
where
abstract
htpy-htpy-map-Σ :
(α : H ~ H') →
(β :
(a : A) (c : C a) →
K a c = ap (λ p → tr D p (g a c)) (α a) ∙ K' a c) →
htpy-map-Σ D H g K ~ htpy-map-Σ D H' g K'
htpy-htpy-map-Σ α β (a , c) =
ap
( eq-pair-Σ')
( eq-pair-Σ
( α a)
( map-compute-dependent-identification-eq-value-function
( λ p → tr D p (g a c))
( λ _ → g' a c)
( α a)
( K a c)
( K' a c)
( inv
( ( ap
( K a c ∙_)
( ap-const (g' a c) (α a))) ∙
( right-unit) ∙
( β a c)))))
```
As a corollary of the above statement, we can provide a condition which
guarantees that `htpy-map-Σ` is homotopic to the trivial homotopy.
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {C : A → UU l3} (D : B → UU l4)
{f : A → B} {H : f ~ f}
{g : (a : A) → C a → D (f a)}
{K : (a : A) → tr D (H a) ∘ g a ~ g a}
where
abstract
htpy-htpy-map-Σ-refl-htpy :
(α : H ~ refl-htpy) →
(β : (a : A) (c : C a) → K a c = ap (λ p → tr D p (g a c)) (α a)) →
htpy-map-Σ D H g K ~ refl-htpy
htpy-htpy-map-Σ-refl-htpy α β =
htpy-htpy-map-Σ D α (λ a c → β a c ∙ inv right-unit)
```
### The map on total spaces induced by a family of truncated maps is truncated
```agda
module _
{l1 l2 l3 : Level} (k : 𝕋) {A : UU l1} {B : A → UU l2} {C : A → UU l3}
{f : (x : A) → B x → C x}
where
abstract
is-trunc-map-tot : ((x : A) → is-trunc-map k (f x)) → is-trunc-map k (tot f)
is-trunc-map-tot H y =
is-trunc-equiv k
( fiber (f (pr1 y)) (pr2 y))
( compute-fiber-tot f y)
( H (pr1 y) (pr2 y))
abstract
is-trunc-map-is-trunc-map-tot :
is-trunc-map k (tot f) → ((x : A) → is-trunc-map k (f x))
is-trunc-map-is-trunc-map-tot is-trunc-tot-f x z =
is-trunc-equiv k
( fiber (tot f) (x , z))
( inv-compute-fiber-tot f (x , z))
( is-trunc-tot-f (x , z))
module _
{l1 l2 l3 : Level} {A : UU l1} {B : A → UU l2} {C : A → UU l3}
{f : (x : A) → B x → C x}
where
abstract
is-contr-map-tot :
((x : A) → is-contr-map (f x)) → is-contr-map (tot f)
is-contr-map-tot =
is-trunc-map-tot neg-two-𝕋
abstract
is-prop-map-tot : ((x : A) → is-prop-map (f x)) → is-prop-map (tot f)
is-prop-map-tot = is-trunc-map-tot neg-one-𝕋
```
### The functoriality of dependent pair types preserves truncatedness
```agda
module _
{l1 l2 l3 : Level} {A : UU l1} {B : UU l2}
where
abstract
is-trunc-map-map-Σ-map-base :
(k : 𝕋) {f : A → B} (C : B → UU l3) →
is-trunc-map k f → is-trunc-map k (map-Σ-map-base f C)
is-trunc-map-map-Σ-map-base k {f} C H y =
is-trunc-equiv' k
( fiber f (pr1 y))
( equiv-fiber-map-Σ-map-base-fiber f C y)
( H (pr1 y))
abstract
is-prop-map-map-Σ-map-base :
{f : A → B} (C : B → UU l3) →
is-prop-map f → is-prop-map (map-Σ-map-base f C)
is-prop-map-map-Σ-map-base C = is-trunc-map-map-Σ-map-base neg-one-𝕋 C
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {C : A → UU l3}
where
abstract
is-trunc-map-map-Σ :
(k : 𝕋) (D : B → UU l4) {f : A → B} {g : (x : A) → C x → D (f x)} →
is-trunc-map k f → ((x : A) → is-trunc-map k (g x)) →
is-trunc-map k (map-Σ D f g)
is-trunc-map-map-Σ k D {f} {g} H K =
is-trunc-map-left-map-triangle k
( map-Σ D f g)
( map-Σ-map-base f D)
( tot g)
( triangle-map-Σ D f g)
( is-trunc-map-map-Σ-map-base k D H)
( is-trunc-map-tot k K)
module _
(D : B → UU l4) {f : A → B} {g : (x : A) → C x → D (f x)}
where
abstract
is-contr-map-map-Σ :
is-contr-map f → ((x : A) → is-contr-map (g x)) →
is-contr-map (map-Σ D f g)
is-contr-map-map-Σ = is-trunc-map-map-Σ neg-two-𝕋 D
abstract
is-prop-map-map-Σ :
is-prop-map f → ((x : A) → is-prop-map (g x)) →
is-prop-map (map-Σ D f g)
is-prop-map-map-Σ = is-trunc-map-map-Σ neg-one-𝕋 D
```
### Commuting squares of maps on total spaces
#### Functoriality of `Σ` preserves commuting squares of maps
```agda
module _
{l1 l2 l3 l4 l5 l6 l7 l8 : Level}
{A : UU l1} {P : A → UU l2}
{B : UU l3} {Q : B → UU l4}
{C : UU l5} {R : C → UU l6}
{D : UU l7} (S : D → UU l8)
{top' : A → C} {left' : A → B} {right' : C → D} {bottom' : B → D}
(top : (a : A) → P a → R (top' a))
(left : (a : A) → P a → Q (left' a))
(right : (c : C) → R c → S (right' c))
(bottom : (b : B) → Q b → S (bottom' b))
where
coherence-square-maps-Σ :
{H' : coherence-square-maps top' left' right' bottom'} →
( (a : A) (p : P a) →
dependent-identification S
( H' a)
( bottom _ (left _ p))
( right _ (top _ p))) →
coherence-square-maps
( map-Σ R top' top)
( map-Σ Q left' left)
( map-Σ S right' right)
( map-Σ S bottom' bottom)
coherence-square-maps-Σ {H'} H (a , p) = eq-pair-Σ (H' a) (H a p)
```
#### Commuting squares of induced maps on total spaces
```agda
module _
{l1 l2 l3 l4 l5 : Level}
{A : UU l1} {P : A → UU l2} {Q : A → UU l3} {R : A → UU l4} {S : A → UU l5}
(top : (a : A) → P a → R a)
(left : (a : A) → P a → Q a)
(right : (a : A) → R a → S a)
(bottom : (a : A) → Q a → S a)
where
coherence-square-maps-tot :
((a : A) → coherence-square-maps (top a) (left a) (right a) (bottom a)) →
coherence-square-maps (tot top) (tot left) (tot right) (tot bottom)
coherence-square-maps-tot H (a , p) = eq-pair-eq-fiber (H a p)
```
#### `map-Σ-map-base` preserves commuting squares of maps
```agda
module _
{l1 l2 l3 l4 l5 : Level}
{A : UU l1} {B : UU l2} {C : UU l3} {D : UU l4} (S : D → UU l5)
(top : A → C) (left : A → B) (right : C → D) (bottom : B → D)
where
coherence-square-maps-map-Σ-map-base :
(H : coherence-square-maps top left right bottom) →
coherence-square-maps
( map-Σ (S ∘ right) top (λ a → tr S (H a)))
( map-Σ-map-base left (S ∘ bottom))
( map-Σ-map-base right S)
( map-Σ-map-base bottom S)
coherence-square-maps-map-Σ-map-base H (a , p) = eq-pair-Σ (H a) refl
```
### Commuting triangles of maps on total spaces
#### Functoriality of `Σ` preserves commuting triangles of maps
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} {P : A → UU l2}
{B : UU l3} {Q : B → UU l4}
{C : UU l5} (R : C → UU l6)
{left' : A → C} {right' : B → C} {top' : A → B}
(left : (a : A) → P a → R (left' a))
(right : (b : B) → Q b → R (right' b))
(top : (a : A) → P a → Q (top' a))
where
coherence-triangle-maps-Σ :
{H' : coherence-triangle-maps left' right' top'} →
( (a : A) (p : P a) →
dependent-identification R (H' a) (left _ p) (right _ (top _ p))) →
coherence-triangle-maps
( map-Σ R left' left)
( map-Σ R right' right)
( map-Σ Q top' top)
coherence-triangle-maps-Σ {H'} H (a , p) = eq-pair-Σ (H' a) (H a p)
```
#### `map-Σ-map-base` preserves commuting triangles of maps
```agda
module _
{l1 l2 l3 l4 : Level}
{A : UU l1} {B : UU l2} {X : UU l3} (S : X → UU l4)
(left : A → X) (right : B → X) (top : A → B)
where
coherence-triangle-maps-map-Σ-map-base :
(H : coherence-triangle-maps left right top) →
coherence-triangle-maps
( map-Σ-map-base left S)
( map-Σ-map-base right S)
( map-Σ (S ∘ right) top (λ a → tr S (H a)))
coherence-triangle-maps-map-Σ-map-base H (a , _) = eq-pair-Σ (H a) refl
```
### The action of `map-Σ-map-base` on identifications of the form `eq-pair-Σ` is given by the action on the base
```agda
module _
{ l1 l2 l3 : Level} {A : UU l1} {B : UU l2} (f : A → B) (C : B → UU l3)
where
compute-ap-map-Σ-map-base-eq-pair-Σ :
{ s s' : A} (p : s = s') {t : C (f s)} {t' : C (f s')}
( q : tr (C ∘ f) p t = t') →
ap (map-Σ-map-base f C) (eq-pair-Σ p q) =
eq-pair-Σ (ap f p) (substitution-law-tr C f p ∙ q)
compute-ap-map-Σ-map-base-eq-pair-Σ refl refl = refl
```
### The action of `ind-Σ` on identifications in fibers of dependent pair types is given by the action of the fibers of the function with the first argument fixed
```agda
module _
{l1 l2 l3 : Level}
{A : UU l1} {B : A → UU l2} {C : UU l3}
(f : (a : A) (b : B a) → C)
where
compute-ap-ind-Σ-eq-pair-eq-fiber :
{a : A} {b b' : B a} (p : b = b') →
ap (ind-Σ f) (eq-pair-eq-fiber p) = ap (f a) p
compute-ap-ind-Σ-eq-pair-eq-fiber refl = refl
```
### Computing the inverse of `equiv-tot`
```agda
module _
{l1 l2 l3 : Level} {A : UU l1} {B : A → UU l2} {C : A → UU l3}
where
compute-inv-equiv-tot :
(e : (x : A) → B x ≃ C x) →
map-inv-equiv (equiv-tot e) ~
map-equiv (equiv-tot (λ x → inv-equiv (e x)))
compute-inv-equiv-tot e (a , c) =
is-injective-equiv
( equiv-tot e)
( ( is-section-map-inv-equiv (equiv-tot e) (a , c)) ∙
( eq-pair-eq-fiber (inv (is-section-map-inv-equiv (e a) c))))
```
### Dependent sums of morphisms of arrows
```agda
module _
{l1 l2 l3 l4 l5 : Level}
{I : UU l5} {A : I → UU l1} {B : I → UU l2} {X : I → UU l3} {Y : I → UU l4}
(f : (i : I) → A i → B i) (g : (i : I) → X i → Y i)
(α : (i : I) → hom-arrow (f i) (g i))
where
tot-hom-arrow : hom-arrow (tot f) (tot g)
pr1 tot-hom-arrow =
tot (λ i → map-domain-hom-arrow (f i) (g i) (α i))
pr1 (pr2 tot-hom-arrow) =
tot (λ i → map-codomain-hom-arrow (f i) (g i) (α i))
pr2 (pr2 tot-hom-arrow) =
tot-htpy (λ i → coh-hom-arrow (f i) (g i) (α i))
```
## See also
- Arithmetical laws involving dependent pair types are recorded in
[`foundation.type-arithmetic-dependent-pair-types`](foundation.type-arithmetic-dependent-pair-types.md).
- Equality proofs in dependent pair types are characterized in
[`foundation.equality-dependent-pair-types`](foundation.equality-dependent-pair-types.md).
- The universal property of dependent pair types is treated in
[`foundation.universal-property-dependent-pair-types`](foundation.universal-property-dependent-pair-types.md).
- Functorial properties of cartesian product types are recorded in
[`foundation.functoriality-cartesian-product-types`](foundation.functoriality-cartesian-product-types.md).
- Functorial properties of dependent product types are recorded in
[`foundation.functoriality-dependent-function-types`](foundation.functoriality-dependent-function-types.md).