# Dependent sums of pullbacks
```agda
module foundation.dependent-sums-pullbacks where
```
<details><summary>Imports</summary>
```agda
open import foundation.cones-over-cospan-diagrams
open import foundation.dependent-pair-types
open import foundation.equivalences
open import foundation.identity-types
open import foundation.standard-pullbacks
open import foundation.transport-along-identifications
open import foundation.type-arithmetic-dependent-pair-types
open import foundation.universe-levels
open import foundation-core.equality-dependent-pair-types
open import foundation-core.families-of-equivalences
open import foundation-core.function-types
open import foundation-core.functoriality-dependent-pair-types
open import foundation-core.homotopies
open import foundation-core.pullbacks
open import foundation-core.retractions
open import foundation-core.sections
open import foundation-core.universal-property-pullbacks
```
</details>
## Properties
### Computing the standard pullback of a dependent sum
Squares of the form
```text
Σ (x : A) (Q (f x)) ----> Σ (y : B) Q
| |
| |
pr1 | | pr1
| |
∨ ∨
A -----------------------> B
f
```
are pullbacks.
```agda
module _
{l1 l2 l3 : Level} {A : UU l1} {B : UU l2} (f : A → B) (Q : B → UU l3)
where
standard-pullback-Σ : UU (l1 ⊔ l3)
standard-pullback-Σ = Σ A (λ x → Q (f x))
cone-standard-pullback-Σ : cone f pr1 standard-pullback-Σ
pr1 cone-standard-pullback-Σ = pr1
pr1 (pr2 cone-standard-pullback-Σ) = map-Σ-map-base f Q
pr2 (pr2 cone-standard-pullback-Σ) = refl-htpy
inv-gap-cone-standard-pullback-Σ :
standard-pullback f (pr1 {B = Q}) → standard-pullback-Σ
pr1 (inv-gap-cone-standard-pullback-Σ (x , _)) = x
pr2 (inv-gap-cone-standard-pullback-Σ (x , (.(f x) , q) , refl)) = q
abstract
is-section-inv-gap-cone-standard-pullback-Σ :
is-section
( gap f pr1 cone-standard-pullback-Σ)
( inv-gap-cone-standard-pullback-Σ)
is-section-inv-gap-cone-standard-pullback-Σ (x , (.(f x) , q) , refl) = refl
abstract
is-retraction-inv-gap-cone-standard-pullback-Σ :
is-retraction
( gap f pr1 cone-standard-pullback-Σ)
( inv-gap-cone-standard-pullback-Σ)
is-retraction-inv-gap-cone-standard-pullback-Σ = refl-htpy
abstract
is-pullback-cone-standard-pullback-Σ :
is-pullback f pr1 cone-standard-pullback-Σ
is-pullback-cone-standard-pullback-Σ =
is-equiv-is-invertible
inv-gap-cone-standard-pullback-Σ
is-section-inv-gap-cone-standard-pullback-Σ
is-retraction-inv-gap-cone-standard-pullback-Σ
compute-standard-pullback-Σ :
standard-pullback-Σ ≃ standard-pullback f pr1
pr1 compute-standard-pullback-Σ = gap f pr1 cone-standard-pullback-Σ
pr2 compute-standard-pullback-Σ = is-pullback-cone-standard-pullback-Σ
```
### A family of maps over a base map induces a pullback square if and only if it is a family of equivalences
Given a map `f : A → B` with a family of maps over it
`g : (x : A) → P x → Q (f x)`, then the square
```text
map-Σ f g
Σ A P ---------> Σ B Q
| |
| |
∨ ∨
A -------------> B
f
```
is a pullback if and only if `g` is a
[fiberwise equivalence](foundation-core.families-of-equivalences.md).
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {P : A → UU l3}
(Q : B → UU l4) (f : A → B) (g : (x : A) → P x → Q (f x))
where
cone-map-Σ : cone f pr1 (Σ A P)
pr1 cone-map-Σ = pr1
pr1 (pr2 cone-map-Σ) = map-Σ Q f g
pr2 (pr2 cone-map-Σ) = refl-htpy
abstract
is-pullback-is-fiberwise-equiv :
is-fiberwise-equiv g → is-pullback f pr1 cone-map-Σ
is-pullback-is-fiberwise-equiv is-equiv-g =
is-equiv-comp
( gap f pr1 (cone-standard-pullback-Σ f Q))
( tot g)
( is-equiv-tot-is-fiberwise-equiv is-equiv-g)
( is-pullback-cone-standard-pullback-Σ f Q)
abstract
universal-property-pullback-is-fiberwise-equiv :
is-fiberwise-equiv g →
universal-property-pullback f pr1 cone-map-Σ
universal-property-pullback-is-fiberwise-equiv is-equiv-g =
universal-property-pullback-is-pullback f pr1
( cone-map-Σ)
( is-pullback-is-fiberwise-equiv is-equiv-g)
abstract
is-fiberwise-equiv-is-pullback :
is-pullback f pr1 cone-map-Σ → is-fiberwise-equiv g
is-fiberwise-equiv-is-pullback is-pullback-cone-map-Σ =
is-fiberwise-equiv-is-equiv-tot
( is-equiv-right-factor
( gap f pr1 (cone-standard-pullback-Σ f Q))
( tot g)
( is-pullback-cone-standard-pullback-Σ f Q)
( is-pullback-cone-map-Σ))
abstract
is-fiberwise-equiv-universal-property-pullback :
( universal-property-pullback f pr1 cone-map-Σ) →
is-fiberwise-equiv g
is-fiberwise-equiv-universal-property-pullback up =
is-fiberwise-equiv-is-pullback
( is-pullback-universal-property-pullback f pr1 cone-map-Σ up)
```
### Pullbacks are preserved by dependent sums
#### A family of squares over a pullback square is a family of pullback squares if and only if the total square is a pullback
```agda
module _
{l1 l2 l3 l4 l5 l6 l7 l8 : Level}
{X : UU l1} {A : UU l2} {B : UU l3} {C : UU l4}
(PX : X → UU l5) {PA : A → UU l6} {PB : B → UU l7} {PC : C → UU l8}
{f : A → X} {g : B → X}
(f' : (a : A) → PA a → PX (f a)) (g' : (b : B) → PB b → PX (g b))
(c : cone f g C) (c' : cone-family PX f' g' c PC)
where
tot-cone-cone-family :
cone (map-Σ PX f f') (map-Σ PX g g') (Σ C PC)
pr1 tot-cone-cone-family =
map-Σ _ (vertical-map-cone f g c) (λ x → pr1 (c' x))
pr1 (pr2 tot-cone-cone-family) =
map-Σ _ (horizontal-map-cone f g c) (λ x → (pr1 (pr2 (c' x))))
pr2 (pr2 tot-cone-cone-family) =
htpy-map-Σ PX
( coherence-square-cone f g c)
( λ z →
( f' (vertical-map-cone f g c z)) ∘
( vertical-map-cone
( ( tr PX (coherence-square-cone f g c z)) ∘
( f' (vertical-map-cone f g c z)))
( g' (horizontal-map-cone f g c z))
( c' z)))
( λ z →
coherence-square-cone
( ( tr PX (coherence-square-cone f g c z)) ∘
( f' (vertical-map-cone f g c z)))
( g' (horizontal-map-cone f g c z))
( c' z))
map-standard-pullback-tot-cone-cone-fam-right-factor :
Σ ( standard-pullback f g)
( λ t →
standard-pullback
( tr PX (coherence-square-standard-pullback t) ∘
f' (vertical-map-standard-pullback t))
( g' (horizontal-map-standard-pullback t))) →
Σ ( Σ A PA)
( λ aa' → Σ (Σ B (λ b → f (pr1 aa') = g b))
( λ bα → Σ (PB (pr1 bα))
( λ b' → tr PX (pr2 bα) (f' (pr1 aa') (pr2 aa')) = g' (pr1 bα) b')))
map-standard-pullback-tot-cone-cone-fam-right-factor =
map-interchange-Σ-Σ
( λ a bα a' →
Σ ( PB (pr1 bα))
( λ b' → tr PX (pr2 bα) (f' a a') = g' (pr1 bα) b'))
map-standard-pullback-tot-cone-cone-fam-left-factor :
(aa' : Σ A PA) →
Σ (Σ B (λ b → f (pr1 aa') = g b))
( λ bα →
Σ ( PB (pr1 bα))
( λ b' → tr PX (pr2 bα) (f' (pr1 aa') (pr2 aa')) = g' (pr1 bα) b')) →
Σ ( Σ B PB)
( λ bb' → Σ (f (pr1 aa') = g (pr1 bb'))
( λ α → tr PX α (f' (pr1 aa') (pr2 aa')) = g' (pr1 bb') (pr2 bb')))
map-standard-pullback-tot-cone-cone-fam-left-factor aa' =
( map-interchange-Σ-Σ
( λ b α b' → tr PX α (f' (pr1 aa') (pr2 aa')) = g' b b'))
map-standard-pullback-tot-cone-cone-family :
Σ ( standard-pullback f g)
( λ t →
standard-pullback
( ( tr PX (coherence-square-standard-pullback t)) ∘
( f' (vertical-map-standard-pullback t)))
( g' (horizontal-map-standard-pullback t))) →
standard-pullback (map-Σ PX f f') (map-Σ PX g g')
map-standard-pullback-tot-cone-cone-family =
( tot
(λ aa' →
( tot (λ bb' → eq-pair-Σ')) ∘
( map-standard-pullback-tot-cone-cone-fam-left-factor aa'))) ∘
( map-standard-pullback-tot-cone-cone-fam-right-factor)
is-equiv-map-standard-pullback-tot-cone-cone-family :
is-equiv map-standard-pullback-tot-cone-cone-family
is-equiv-map-standard-pullback-tot-cone-cone-family =
is-equiv-comp
( tot
( λ aa' →
( tot (λ bb' → eq-pair-Σ')) ∘
( map-standard-pullback-tot-cone-cone-fam-left-factor aa')))
( map-standard-pullback-tot-cone-cone-fam-right-factor)
( is-equiv-map-interchange-Σ-Σ
( λ a bα a' → Σ (PB (pr1 bα))
( λ b' → tr PX (pr2 bα) (f' a a') = g' (pr1 bα) b')))
( is-equiv-tot-is-fiberwise-equiv
( λ aa' →
is-equiv-comp
( tot (λ bb' → eq-pair-Σ'))
( map-standard-pullback-tot-cone-cone-fam-left-factor aa')
( is-equiv-map-interchange-Σ-Σ _)
( is-equiv-tot-is-fiberwise-equiv
( λ bb' →
is-equiv-eq-pair-Σ
( f (pr1 aa') , f' (pr1 aa') (pr2 aa'))
( g (pr1 bb') , g' (pr1 bb') (pr2 bb'))))))
triangle-standard-pullback-tot-cone-cone-family :
( gap (map-Σ PX f f') (map-Σ PX g g') tot-cone-cone-family) ~
( ( map-standard-pullback-tot-cone-cone-family) ∘
( map-Σ _
( gap f g c)
( λ x → gap
( ( tr PX (coherence-square-cone f g c x)) ∘
( f' (vertical-map-cone f g c x)))
( g' (horizontal-map-cone f g c x))
( c' x))))
triangle-standard-pullback-tot-cone-cone-family = refl-htpy
is-pullback-family-is-pullback-tot :
is-pullback f g c →
is-pullback
(map-Σ PX f f') (map-Σ PX g g') tot-cone-cone-family →
(x : C) →
is-pullback
( ( tr PX (coherence-square-cone f g c x)) ∘
( f' (vertical-map-cone f g c x)))
( g' (horizontal-map-cone f g c x))
( c' x)
is-pullback-family-is-pullback-tot is-pb-c is-pb-tot =
is-fiberwise-equiv-is-equiv-map-Σ _
( gap f g c)
( λ x →
gap
( ( tr PX (coherence-square-cone f g c x)) ∘
( f' (vertical-map-cone f g c x)))
( g' (horizontal-map-cone f g c x))
( c' x))
( is-pb-c)
( is-equiv-top-map-triangle
( gap (map-Σ PX f f') (map-Σ PX g g') tot-cone-cone-family)
( map-standard-pullback-tot-cone-cone-family)
( map-Σ _
( gap f g c)
( λ x →
gap
( ( tr PX (coherence-square-cone f g c x)) ∘
( f' (vertical-map-cone f g c x)))
( g' (horizontal-map-cone f g c x))
( c' x)))
( triangle-standard-pullback-tot-cone-cone-family)
( is-equiv-map-standard-pullback-tot-cone-cone-family)
( is-pb-tot))
is-pullback-tot-is-pullback-family :
is-pullback f g c →
( (x : C) →
is-pullback
( ( tr PX (coherence-square-cone f g c x)) ∘
( f' (vertical-map-cone f g c x)))
( g' (horizontal-map-cone f g c x))
( c' x)) →
is-pullback
(map-Σ PX f f') (map-Σ PX g g') tot-cone-cone-family
is-pullback-tot-is-pullback-family is-pb-c is-pb-c' =
is-equiv-left-map-triangle
( gap (map-Σ PX f f') (map-Σ PX g g') tot-cone-cone-family)
( map-standard-pullback-tot-cone-cone-family)
( map-Σ _
( gap f g c)
( λ x → gap
( ( tr PX (coherence-square-cone f g c x)) ∘
( f' (vertical-map-cone f g c x)))
( g' (horizontal-map-cone f g c x))
( c' x)))
( triangle-standard-pullback-tot-cone-cone-family)
( is-equiv-map-Σ _ is-pb-c is-pb-c')
( is-equiv-map-standard-pullback-tot-cone-cone-family)
```
#### A family of squares is a family of pullback squares if and only if the total square is a pullback
As a corollary of the previous result, a dependent sum of squares over the
constant diagram is a pullback square if and only if the family is a family of
pullback squares.
```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) → B i → Y i) (g : (i : I) → X i → Y i)
(c : (i : I) → cone (f i) (g i) (A i))
where
tot-cone : cone (tot f) (tot g) (Σ I A)
pr1 tot-cone = tot (λ i → vertical-map-cone (f i) (g i) (c i))
pr1 (pr2 tot-cone) = tot (λ i → horizontal-map-cone (f i) (g i) (c i))
pr2 (pr2 tot-cone) = tot-htpy (λ i → coherence-square-cone (f i) (g i) (c i))
is-pullback-tot-is-pullback-family-id-cone :
((i : I) → is-pullback (f i) (g i) (c i)) →
is-pullback (tot f) (tot g) tot-cone
is-pullback-tot-is-pullback-family-id-cone =
is-pullback-tot-is-pullback-family Y f g
( id-cone I)
( c)
( is-pullback-is-equiv-vertical-maps id id
( id-cone I)
( is-equiv-id)
( is-equiv-id))
is-pullback-family-id-cone-is-pullback-tot :
is-pullback (tot f) (tot g) tot-cone →
(i : I) → is-pullback (f i) (g i) (c i)
is-pullback-family-id-cone-is-pullback-tot =
is-pullback-family-is-pullback-tot Y f g
( id-cone I)
( c)
( is-pullback-is-equiv-vertical-maps id id
( id-cone I)
( is-equiv-id)
( is-equiv-id))
```
## Table of files about pullbacks
The following table lists files that are about pullbacks as a general concept.
{{#include tables/pullbacks.md}}