# Pullbacks
```agda
module foundation-core.pullbacks where
```
<details><summary>Imports</summary>
```agda
open import foundation.action-on-identifications-functions
open import foundation.cones-over-cospan-diagrams
open import foundation.dependent-pair-types
open import foundation.functoriality-cartesian-product-types
open import foundation.functoriality-fibers-of-maps
open import foundation.identity-types
open import foundation.morphisms-arrows
open import foundation.standard-pullbacks
open import foundation.universe-levels
open import foundation-core.commuting-triangles-of-maps
open import foundation-core.diagonal-maps-cartesian-products-of-types
open import foundation-core.equality-dependent-pair-types
open import foundation-core.equivalences
open import foundation-core.families-of-equivalences
open import foundation-core.fibers-of-maps
open import foundation-core.function-types
open import foundation-core.functoriality-dependent-pair-types
open import foundation-core.homotopies
open import foundation-core.universal-property-pullbacks
```
</details>
## Idea
Consider a [cone](foundation.cones-over-cospan-diagrams.md) over a
[cospan diagram of types](foundation.cospan-diagrams.md) `f : A -> X <- B : g,`
```text
C ------> B
| |
| | g
∨ ∨
A ------> X.
f
```
we want to pose the question of whether this cone is a
{{#concept "pullback cone" Disambiguation="types" Agda=is-pullback}}. Although
this concept is captured by
[the universal property of the pullback](foundation-core.universal-property-pullbacks.md),
that is a large proposition, which is not suitable for all purposes. Therefore,
as our main definition of a pullback cone we consider the
{{#concept "small predicate of being a pullback" Agda=is-pullback}}: given the
existence of the [standard pullback type](foundation.standard-pullbacks.md)
`A ×_X B`, a cone is a _pullback_ if the gap map into the standard pullback is
an [equivalence](foundation-core.equivalences.md).
## Definitions
### The small property of being a pullback
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {C : UU l4}
(f : A → X) (g : B → X)
where
is-pullback : cone f g C → UU (l1 ⊔ l2 ⊔ l3 ⊔ l4)
is-pullback c = is-equiv (gap f g c)
```
### A cone is a pullback if and only if it satisfies the universal property
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {C : UU l4}
(f : A → X) (g : B → X)
where
abstract
is-pullback-universal-property-pullback :
(c : cone f g C) → universal-property-pullback f g c → is-pullback f g c
is-pullback-universal-property-pullback c =
is-equiv-up-pullback-up-pullback
( cone-standard-pullback f g)
( c)
( gap f g c)
( htpy-cone-up-pullback-standard-pullback f g c)
( universal-property-standard-pullback f g)
abstract
universal-property-pullback-is-pullback :
(c : cone f g C) → is-pullback f g c →
universal-property-pullback f g c
universal-property-pullback-is-pullback c is-pullback-c =
up-pullback-up-pullback-is-equiv
( cone-standard-pullback f g)
( c)
( gap f g c)
( htpy-cone-up-pullback-standard-pullback f g c)
( is-pullback-c)
( universal-property-standard-pullback f g)
```
### The gap map into a pullback
The
{{#concept "gap map" Disambiguation="cone over a cospan" Agda=gap-is-pullback}}
of a [commuting square](foundation-core.commuting-squares-of-maps.md) is the map
from the domain of the cone into the pullback.
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {C : UU l4}
(f : A → X) (g : B → X) (c : cone f g C) (H : is-pullback f g c)
where
gap-is-pullback : {l5 : Level} {C' : UU l5} → cone f g C' → C' → C
gap-is-pullback =
map-universal-property-pullback f g c
( universal-property-pullback-is-pullback f g c H)
compute-gap-is-pullback :
{l5 : Level} {C' : UU l5} (c' : cone f g C') →
cone-map f g c (gap-is-pullback c') = c'
compute-gap-is-pullback =
compute-map-universal-property-pullback f g c
( universal-property-pullback-is-pullback f g c H)
```
### The homotopy of cones obtained from the universal property of pullbacks
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
(f : A → X) (g : B → X) {C : UU l4}
(c : cone f g C) (up : is-pullback f g c)
{l5 : Level} {C' : UU l5} (c' : cone f g C')
where
htpy-cone-gap-is-pullback :
htpy-cone f g
( cone-map f g c (gap-is-pullback f g c up c'))
( c')
htpy-cone-gap-is-pullback =
htpy-eq-cone f g
( cone-map f g c (gap-is-pullback f g c up c'))
( c')
( compute-gap-is-pullback f g c up c')
htpy-vertical-map-gap-is-pullback :
vertical-map-cone f g
( cone-map f g c (gap-is-pullback f g c up c')) ~
vertical-map-cone f g c'
htpy-vertical-map-gap-is-pullback =
htpy-vertical-map-htpy-cone f g
( cone-map f g c (gap-is-pullback f g c up c'))
( c')
( htpy-cone-gap-is-pullback)
htpy-horizontal-map-gap-is-pullback :
horizontal-map-cone f g
( cone-map f g c (gap-is-pullback f g c up c')) ~
horizontal-map-cone f g c'
htpy-horizontal-map-gap-is-pullback =
htpy-horizontal-map-htpy-cone f g
( cone-map f g c (gap-is-pullback f g c up c'))
( c')
( htpy-cone-gap-is-pullback)
coh-htpy-cone-gap-is-pullback :
coherence-htpy-cone f g
( cone-map f g c (gap-is-pullback f g c up c'))
( c')
( htpy-vertical-map-gap-is-pullback)
( htpy-horizontal-map-gap-is-pullback)
coh-htpy-cone-gap-is-pullback =
coh-htpy-cone f g
( cone-map f g c (gap-is-pullback f g c up c'))
( c')
( htpy-cone-gap-is-pullback)
```
## Properties
### The standard pullbacks are pullbacks
```agda
module _
{l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
(f : A → X) (g : B → X)
where
is-pullback-standard-pullback : is-pullback f g (cone-standard-pullback f g)
is-pullback-standard-pullback = is-equiv-id
```
### Pullbacks are preserved under homotopies of parallel cones
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {C : UU l4}
{f f' : A → X} (Hf : f ~ f') {g g' : B → X} (Hg : g ~ g')
where
triangle-is-pullback-htpy :
{c : cone f g C} {c' : cone f' g' C} (Hc : htpy-parallel-cone Hf Hg c c') →
gap f g c ~ map-equiv-standard-pullback-htpy Hf Hg ∘ gap f' g' c'
triangle-is-pullback-htpy {p , q , H} {p' , q' , H'} (Hp , Hq , HH) z =
map-extensionality-standard-pullback f g
( Hp z)
( Hq z)
( ( inv (assoc (ap f (Hp z)) (Hf (p' z) ∙ H' z) (inv (Hg (q' z))))) ∙
( inv
( right-transpose-eq-concat
( H z ∙ ap g (Hq z))
( Hg (q' z))
( ap f (Hp z) ∙ (Hf (p' z) ∙ H' z))
( ( assoc (H z) (ap g (Hq z)) (Hg (q' z))) ∙
( HH z) ∙
( assoc (ap f (Hp z)) (Hf (p' z)) (H' z))))))
abstract
is-pullback-htpy :
{c : cone f g C} (c' : cone f' g' C)
(Hc : htpy-parallel-cone Hf Hg c c') →
is-pullback f' g' c' → is-pullback f g c
is-pullback-htpy {c} c' H pb-c' =
is-equiv-left-map-triangle
( gap f g c)
( map-equiv-standard-pullback-htpy Hf Hg)
( gap f' g' c')
( triangle-is-pullback-htpy H)
( pb-c')
( is-equiv-map-equiv-standard-pullback-htpy Hf Hg)
abstract
is-pullback-htpy' :
(c : cone f g C) {c' : cone f' g' C}
(Hc : htpy-parallel-cone Hf Hg c c') →
is-pullback f g c → is-pullback f' g' c'
is-pullback-htpy' c {c'} H =
is-equiv-top-map-triangle
( gap f g c)
( map-equiv-standard-pullback-htpy Hf Hg)
( gap f' g' c')
( triangle-is-pullback-htpy H)
( is-equiv-map-equiv-standard-pullback-htpy Hf Hg)
```
### Pullbacks are symmetric
The pullback of `f : A → X ← B : g` is also the pullback of `g : B → X ← A : f`.
```agda
abstract
is-pullback-swap-cone :
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {C : UU l4}
(f : A → X) (g : B → X) (c : cone f g C) →
is-pullback f g c → is-pullback g f (swap-cone f g c)
is-pullback-swap-cone f g c pb-c =
is-equiv-left-map-triangle
( gap g f (swap-cone f g c))
( map-commutative-standard-pullback f g)
( gap f g c)
( triangle-map-commutative-standard-pullback f g c)
( pb-c)
( is-equiv-map-commutative-standard-pullback f g)
abstract
is-pullback-swap-cone' :
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {C : UU l4}
(f : A → X) (g : B → X) (c : cone f g C) →
is-pullback g f (swap-cone f g c) → is-pullback f g c
is-pullback-swap-cone' f g c =
is-equiv-top-map-triangle
( gap g f (swap-cone f g c))
( map-commutative-standard-pullback f g)
( gap f g c)
( triangle-map-commutative-standard-pullback f g c)
( is-equiv-map-commutative-standard-pullback f g)
```
### A cone is a pullback if and only if it induces a family of equivalences between the fibers of the vertical maps
A cone is a pullback if and only if the induced family of maps on fibers between
the vertical maps is a family of equivalences
```text
fiber i a --> fiber g (f a)
| |
| |
∨ ∨
C ------------> B
| |
i | | g
∨ ∨
a ∈ A ------------> X.
f
```
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {C : UU l3} {X : UU l4}
(f : A → X) (g : B → X) (c : cone f g C)
where
square-tot-map-fiber-vertical-map-cone :
gap f g c ∘ map-equiv-total-fiber (vertical-map-cone f g c) ~
tot (λ _ → tot (λ _ → inv)) ∘ tot (map-fiber-vertical-map-cone f g c)
square-tot-map-fiber-vertical-map-cone
(.(vertical-map-cone f g c x) , x , refl) =
eq-pair-eq-fiber
( eq-pair-eq-fiber
( inv (ap inv right-unit ∙ inv-inv (coherence-square-cone f g c x))))
abstract
is-fiberwise-equiv-map-fiber-vertical-map-cone-is-pullback :
is-pullback f g c → is-fiberwise-equiv (map-fiber-vertical-map-cone f g c)
is-fiberwise-equiv-map-fiber-vertical-map-cone-is-pullback pb =
is-fiberwise-equiv-is-equiv-tot
( is-equiv-top-is-equiv-bottom-square
( map-equiv-total-fiber (vertical-map-cone f g c))
( tot (λ _ → tot (λ _ → inv)))
( tot (map-fiber-vertical-map-cone f g c))
( gap f g c)
( square-tot-map-fiber-vertical-map-cone)
( is-equiv-map-equiv-total-fiber (vertical-map-cone f g c))
( is-equiv-tot-is-fiberwise-equiv
( λ x →
is-equiv-tot-is-fiberwise-equiv (λ y → is-equiv-inv (g y) (f x))))
( pb))
abstract
is-pullback-is-fiberwise-equiv-map-fiber-vertical-map-cone :
is-fiberwise-equiv (map-fiber-vertical-map-cone f g c) → is-pullback f g c
is-pullback-is-fiberwise-equiv-map-fiber-vertical-map-cone is-equiv-fsq =
is-equiv-bottom-is-equiv-top-square
( map-equiv-total-fiber (vertical-map-cone f g c))
( tot (λ _ → tot (λ _ → inv)))
( tot (map-fiber-vertical-map-cone f g c))
( gap f g c)
( square-tot-map-fiber-vertical-map-cone)
( is-equiv-map-equiv-total-fiber (vertical-map-cone f g c))
( is-equiv-tot-is-fiberwise-equiv
( λ x →
is-equiv-tot-is-fiberwise-equiv (λ y → is-equiv-inv (g y) (f x))))
( is-equiv-tot-is-fiberwise-equiv is-equiv-fsq)
```
### A cone is a pullback if and only if it induces a family of equivalences between the fibers of the horizontal maps
A cone is a pullback if and only if the induced family of maps on fibers between
the horizontal maps is a family of equivalences
```text
j
fiber j b ----> C --------> B ∋ b
| | |
| | | g
∨ ∨ ∨
fiber f (g b) --> A --------> X.
f
```
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {C : UU l3} {X : UU l4}
(f : A → X) (g : B → X) (c : cone f g C)
where
square-tot-map-fiber-horizontal-map-cone :
( gap g f (swap-cone f g c) ∘
map-equiv-total-fiber (horizontal-map-cone f g c)) ~
( tot (λ _ → tot (λ _ → inv)) ∘
tot (map-fiber-horizontal-map-cone f g c))
square-tot-map-fiber-horizontal-map-cone
(.(horizontal-map-cone f g c x) , x , refl) =
eq-pair-eq-fiber
( eq-pair-eq-fiber
( ap
( inv)
( inv (right-unit ∙ inv-inv (coherence-square-cone f g c x)))))
square-tot-map-fiber-horizontal-map-cone' :
( ( λ x →
( horizontal-map-cone f g c x ,
vertical-map-cone f g c x ,
coherence-square-cone f g c x)) ∘
map-equiv-total-fiber (horizontal-map-cone f g c)) ~
tot (map-fiber-horizontal-map-cone f g c)
square-tot-map-fiber-horizontal-map-cone'
(.(horizontal-map-cone f g c x) , x , refl) =
eq-pair-eq-fiber
( eq-pair-eq-fiber
( inv (right-unit ∙ inv-inv (coherence-square-cone f g c x))))
abstract
is-fiberwise-equiv-map-fiber-horizontal-map-cone-is-pullback :
is-pullback f g c →
is-fiberwise-equiv (map-fiber-horizontal-map-cone f g c)
is-fiberwise-equiv-map-fiber-horizontal-map-cone-is-pullback pb =
is-fiberwise-equiv-map-fiber-vertical-map-cone-is-pullback g f
( swap-cone f g c)
( is-pullback-swap-cone f g c pb)
abstract
is-pullback-is-fiberwise-equiv-map-fiber-horizontal-map-cone :
is-fiberwise-equiv (map-fiber-horizontal-map-cone f g c) →
is-pullback f g c
is-pullback-is-fiberwise-equiv-map-fiber-horizontal-map-cone is-equiv-fsq =
is-pullback-swap-cone' f g c
( is-pullback-is-fiberwise-equiv-map-fiber-vertical-map-cone g f
( swap-cone f g c)
( is-equiv-fsq))
```
### The horizontal pullback pasting property
Given a diagram as follows where the right-hand square is a pullback
```text
∙ -------> ∙ -------> ∙
| | ⌟ |
| | |
∨ ∨ ∨
∙ -------> ∙ -------> ∙,
```
then the left-hand square is a pullback if and only if the composite square is.
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} {B : UU l2} {C : UU l3} {X : UU l4} {Y : UU l5} {Z : UU l6}
(i : X → Y) (j : Y → Z) (h : C → Z)
(c : cone j h B) (d : cone i (vertical-map-cone j h c) A)
where
abstract
is-pullback-rectangle-is-pullback-left-square :
is-pullback j h c → is-pullback i (vertical-map-cone j h c) d →
is-pullback (j ∘ i) h (pasting-horizontal-cone i j h c d)
is-pullback-rectangle-is-pullback-left-square pb-c pb-d =
is-pullback-is-fiberwise-equiv-map-fiber-vertical-map-cone (j ∘ i) h
( pasting-horizontal-cone i j h c d)
( λ x →
is-equiv-left-map-triangle
( map-fiber-vertical-map-cone
( j ∘ i) h (pasting-horizontal-cone i j h c d) x)
( map-fiber-vertical-map-cone j h c (i x))
( map-fiber-vertical-map-cone i (vertical-map-cone j h c) d x)
( preserves-pasting-horizontal-map-fiber-vertical-map-cone
( i)
( j)
( h)
( c)
( d)
( x))
( is-fiberwise-equiv-map-fiber-vertical-map-cone-is-pullback
( i)
( vertical-map-cone j h c)
( d)
( pb-d)
( x))
( is-fiberwise-equiv-map-fiber-vertical-map-cone-is-pullback
( j)
( h)
( c)
( pb-c)
( i x)))
abstract
is-pullback-left-square-is-pullback-rectangle :
is-pullback j h c →
is-pullback (j ∘ i) h (pasting-horizontal-cone i j h c d) →
is-pullback i (vertical-map-cone j h c) d
is-pullback-left-square-is-pullback-rectangle pb-c pb-rect =
is-pullback-is-fiberwise-equiv-map-fiber-vertical-map-cone i
( vertical-map-cone j h c)
( d)
( λ x →
is-equiv-top-map-triangle
( map-fiber-vertical-map-cone
( j ∘ i) h (pasting-horizontal-cone i j h c d) x)
( map-fiber-vertical-map-cone j h c (i x))
( map-fiber-vertical-map-cone i (vertical-map-cone j h c) d x)
( preserves-pasting-horizontal-map-fiber-vertical-map-cone
( i)
( j)
( h)
( c)
( d)
( x))
( is-fiberwise-equiv-map-fiber-vertical-map-cone-is-pullback
( j)
( h)
( c)
( pb-c)
( i x))
( is-fiberwise-equiv-map-fiber-vertical-map-cone-is-pullback
( j ∘ i)
( h)
( pasting-horizontal-cone i j h c d)
( pb-rect)
( x)))
```
### The vertical pullback pasting property
Given a diagram as follows where the lower square is a pullback
```text
∙ -------> ∙
| |
| |
∨ ∨
∙ -------> ∙
| ⌟ |
| |
∨ ∨
∙ -------> ∙,
```
then the upper square is a pullback if and only if the composite square is.
```agda
module _
{l1 l2 l3 l4 l5 l6 : Level}
{A : UU l1} {B : UU l2} {C : UU l3} {X : UU l4} {Y : UU l5} {Z : UU l6}
(f : C → Z) (g : Y → Z) (h : X → Y)
(c : cone f g B) (d : cone (horizontal-map-cone f g c) h A)
where
abstract
is-pullback-top-square-is-pullback-rectangle :
is-pullback f g c →
is-pullback f (g ∘ h) (pasting-vertical-cone f g h c d) →
is-pullback (horizontal-map-cone f g c) h d
is-pullback-top-square-is-pullback-rectangle pb-c pb-dc =
is-pullback-is-fiberwise-equiv-map-fiber-vertical-map-cone
( horizontal-map-cone f g c)
( h)
( d)
( λ x →
is-fiberwise-equiv-is-equiv-map-Σ
( λ t → fiber h (pr1 t))
( map-fiber-vertical-map-cone f g c (vertical-map-cone f g c x))
( λ t →
map-fiber-vertical-map-cone
( horizontal-map-cone f g c)
( h)
( d)
( pr1 t))
( is-fiberwise-equiv-map-fiber-vertical-map-cone-is-pullback
( f)
( g)
( c)
( pb-c)
( vertical-map-cone f g c x))
( is-equiv-top-is-equiv-bottom-square
( map-inv-compute-fiber-comp
( vertical-map-cone f g c)
( vertical-map-cone (horizontal-map-cone f g c) h d)
( vertical-map-cone f g c x))
( map-inv-compute-fiber-comp g h (f (vertical-map-cone f g c x)))
( map-Σ
( λ t → fiber h (pr1 t))
( map-fiber-vertical-map-cone f g c (vertical-map-cone f g c x))
( λ t →
map-fiber-vertical-map-cone
( horizontal-map-cone f g c) h d (pr1 t)))
( map-fiber-vertical-map-cone f
( g ∘ h)
( pasting-vertical-cone f g h c d)
( vertical-map-cone f g c x))
( preserves-pasting-vertical-map-fiber-vertical-map-cone f g h c d
( vertical-map-cone f g c x))
( is-equiv-map-inv-compute-fiber-comp
( vertical-map-cone f g c)
( vertical-map-cone (horizontal-map-cone f g c) h d)
( vertical-map-cone f g c x))
( is-equiv-map-inv-compute-fiber-comp g h
( f (vertical-map-cone f g c x)))
( is-fiberwise-equiv-map-fiber-vertical-map-cone-is-pullback f
( g ∘ h)
( pasting-vertical-cone f g h c d)
( pb-dc)
( vertical-map-cone f g c x)))
( x , refl))
abstract
is-pullback-rectangle-is-pullback-top-square :
is-pullback f g c →
is-pullback (horizontal-map-cone f g c) h d →
is-pullback f (g ∘ h) (pasting-vertical-cone f g h c d)
is-pullback-rectangle-is-pullback-top-square pb-c pb-d =
is-pullback-is-fiberwise-equiv-map-fiber-vertical-map-cone
( f)
( g ∘ h)
( pasting-vertical-cone f g h c d)
( λ x →
is-equiv-bottom-is-equiv-top-square
( map-inv-compute-fiber-comp
( vertical-map-cone f g c)
( vertical-map-cone (horizontal-map-cone f g c) h d)
( x))
( map-inv-compute-fiber-comp g h (f x))
( map-Σ
( λ t → fiber h (pr1 t))
( map-fiber-vertical-map-cone f g c x)
( λ t →
map-fiber-vertical-map-cone
( horizontal-map-cone f g c)
( h)
( d)
( pr1 t)))
( map-fiber-vertical-map-cone
( f)
( g ∘ h)
( pasting-vertical-cone f g h c d)
( x))
( preserves-pasting-vertical-map-fiber-vertical-map-cone
( f)
( g)
( h)
( c)
( d)
( x))
( is-equiv-map-inv-compute-fiber-comp
( vertical-map-cone f g c)
( vertical-map-cone (horizontal-map-cone f g c) h d)
( x))
( is-equiv-map-inv-compute-fiber-comp g h (f x))
( is-equiv-map-Σ
( λ t → fiber h (pr1 t))
( is-fiberwise-equiv-map-fiber-vertical-map-cone-is-pullback
( f)
( g)
( c)
( pb-c)
( x))
( λ t →
is-fiberwise-equiv-map-fiber-vertical-map-cone-is-pullback
( horizontal-map-cone f g c)
( h)
( d)
( pb-d)
( pr1 t))))
```
### Pullbacks are associative
Consider two cospans with a shared vertex `B`:
```text
f g h i
A ----> X <---- B ----> Y <---- C,
```
and with pullback cones `α` and `β` respectively. Moreover, consider a cone `γ`
over the pullbacks as in the following diagram
```text
∙ ------------> ∙ ------------> C
| | ⌟ |
| γ | β | i
∨ ∨ ∨
∙ ------------> B ------------> Y
| ⌟ | h
| α | g
∨ ∨
A ------------> X.
f
```
Then the pasting `γ □ α` is a pullback if and only if `γ` is if and only if the
pasting `γ □ β` is. And, in particular, we have the equivalence
$$
(A ×_X B) ×_Y C ≃ A ×_X (B ×_Y C).
$$
```agda
module _
{l1 l2 l3 l4 l5 l6 l7 l8 : Level}
{X : UU l1} {Y : UU l2} {A : UU l3} {B : UU l4} {C : UU l5}
(f : A → X) (g : B → X) (h : B → Y) (i : C → Y)
{S : UU l6} {T : UU l7} {U : UU l8}
(α : cone f g S) (β : cone h i T)
(γ : cone (horizontal-map-cone f g α) (vertical-map-cone h i β) U)
(is-pullback-α : is-pullback f g α)
(is-pullback-β : is-pullback h i β)
where
is-pullback-associative :
is-pullback
( f)
( g ∘ vertical-map-cone h i β)
( pasting-vertical-cone f g (vertical-map-cone h i β) α γ) →
is-pullback
( h ∘ horizontal-map-cone f g α)
( i)
( pasting-horizontal-cone (horizontal-map-cone f g α) h i β γ)
is-pullback-associative H =
is-pullback-rectangle-is-pullback-left-square
( horizontal-map-cone f g α)
( h)
( i)
( β)
( γ)
( is-pullback-β)
( is-pullback-top-square-is-pullback-rectangle
( f)
( g)
( vertical-map-cone h i β)
( α)
( γ)
( is-pullback-α)
( H))
is-pullback-inv-associative :
is-pullback
( h ∘ horizontal-map-cone f g α)
( i)
( pasting-horizontal-cone (horizontal-map-cone f g α) h i β γ) →
is-pullback
( f)
( g ∘ vertical-map-cone h i β)
( pasting-vertical-cone f g (vertical-map-cone h i β) α γ)
is-pullback-inv-associative H =
is-pullback-rectangle-is-pullback-top-square
( f)
( g)
( vertical-map-cone h i β)
( α)
( γ)
( is-pullback-α)
( is-pullback-left-square-is-pullback-rectangle
( horizontal-map-cone f g α)
( h)
( i)
( β)
( γ)
( is-pullback-β)
( H))
```
### Pullbacks can be "folded"
Given a pullback square
```text
f'
C -------> B
| ⌟ |
g'| | g
∨ ∨
A -------> X
f
```
we can "fold" the vertical edge onto the horizontal one and get a new pullback
square
```text
C ---------> X
| ⌟ |
(f' , g') | |
∨ ∨
A × B -----> X × X,
f × g
```
moreover, this folded square is a pullback if and only if the original one is.
```agda
module _
{l1 l2 l3 : Level}
{A : UU l1} {B : UU l2} {X : UU l3}
(f : A → X) (g : B → X)
where
abstract
is-pullback-fold-cone-is-pullback :
{l4 : Level} {C : UU l4} (c : cone f g C) →
is-pullback f g c →
is-pullback (map-product f g) (diagonal-product X) (fold-cone f g c)
is-pullback-fold-cone-is-pullback c pb-c =
is-equiv-left-map-triangle
( gap (map-product f g) (diagonal-product X) (fold-cone f g c))
( map-fold-cone-standard-pullback f g)
( gap f g c)
( triangle-map-fold-cone-standard-pullback f g c)
( pb-c)
( is-equiv-map-fold-cone-standard-pullback f g)
abstract
is-pullback-is-pullback-fold-cone :
{l4 : Level} {C : UU l4} (c : cone f g C) →
is-pullback (map-product f g) (diagonal-product X) (fold-cone f g c) →
is-pullback f g c
is-pullback-is-pullback-fold-cone c =
is-equiv-top-map-triangle
( gap (map-product f g) (diagonal-product X) (fold-cone f g c))
( map-fold-cone-standard-pullback f g)
( gap f g c)
( triangle-map-fold-cone-standard-pullback f g c)
( is-equiv-map-fold-cone-standard-pullback f g)
```
## Table of files about pullbacks
The following table lists files that are about pullbacks as a general concept.
{{#include tables/pullbacks.md}}