# Coproducts of pullbacks ```agda module foundation.coproducts-pullbacks where ``` <details><summary>Imports</summary> ```agda open import foundation.action-on-identifications-functions open import foundation.cones-over-cospan-diagrams open import foundation.coproduct-types open import foundation.dependent-pair-types open import foundation.equality-coproduct-types open import foundation.functoriality-coproduct-types open import foundation.identity-types open import foundation.standard-pullbacks open import foundation.universe-levels open import foundation-core.commuting-triangles-of-maps open import foundation-core.equality-dependent-pair-types open import foundation-core.equivalences open import foundation-core.function-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> ## Idea Given two [commuting squares of maps](foundation-core.commuting-squares-of-maps.md), ```text C ------> B C' -----> B' | | | | | | g and | | g' ∨ ∨ ∨ ∨ A ------> X A' -----> X', f f' ``` then their coproduct ```text C + C' ----> B + B' | | | | g + g' ∨ ∨ A + A' ----> X + X' f + f' ``` is a [pullback](foundation-core.pullbacks.md) if each summand is. ## Definitions ### Coproduct cones ```agda module _ {l1 l2 l3 l4 l1' l2' l3' l4' : Level} {A : UU l1} {B : UU l2} {X : UU l3} {C : UU l4} {A' : UU l1'} {B' : UU l2'} {X' : UU l3'} {C' : UU l4'} (f : A → X) (g : B → X) (f' : A' → X') (g' : B' → X') where coproduct-cone : cone f g C → cone f' g' C' → cone (map-coproduct f f') (map-coproduct g g') (C + C') pr1 (coproduct-cone (p , q , H) (p' , q' , H')) = map-coproduct p p' pr1 (pr2 (coproduct-cone (p , q , H) (p' , q' , H'))) = map-coproduct q q' pr2 (pr2 (coproduct-cone (p , q , H) (p' , q' , H'))) = ( inv-htpy (preserves-comp-map-coproduct p f p' f')) ∙h ( htpy-map-coproduct H H') ∙h ( preserves-comp-map-coproduct q g q' g') ``` ## Properties ### Computing the standard pullback of a coproduct ```agda module _ {l1 l2 l3 l1' l2' l3' : Level} {A : UU l1} {B : UU l2} {X : UU l3} {A' : UU l1'} {B' : UU l2'} {X' : UU l3'} (f : A → X) (g : B → X) (f' : A' → X') (g' : B' → X') where inl-map-standard-pullback-coproduct : standard-pullback f g → standard-pullback (map-coproduct f f') (map-coproduct g g') pr1 (inl-map-standard-pullback-coproduct (x , y , p)) = inl x pr1 (pr2 (inl-map-standard-pullback-coproduct (x , y , p))) = inl y pr2 (pr2 (inl-map-standard-pullback-coproduct (x , y , p))) = ap inl p inr-map-standard-pullback-coproduct : standard-pullback f' g' → standard-pullback (map-coproduct f f') (map-coproduct g g') pr1 (inr-map-standard-pullback-coproduct (x , y , p)) = inr x pr1 (pr2 (inr-map-standard-pullback-coproduct (x , y , p))) = inr y pr2 (pr2 (inr-map-standard-pullback-coproduct (x , y , p))) = ap inr p map-standard-pullback-coproduct : standard-pullback f g + standard-pullback f' g' → standard-pullback (map-coproduct f f') (map-coproduct g g') map-standard-pullback-coproduct (inl v) = inl-map-standard-pullback-coproduct v map-standard-pullback-coproduct (inr u) = inr-map-standard-pullback-coproduct u map-inv-standard-pullback-coproduct : standard-pullback (map-coproduct f f') (map-coproduct g g') → standard-pullback f g + standard-pullback f' g' map-inv-standard-pullback-coproduct (inl x , inl y , p) = inl (x , y , is-injective-inl p) map-inv-standard-pullback-coproduct (inr x , inr y , p) = inr (x , y , is-injective-inr p) is-section-map-inv-standard-pullback-coproduct : is-section ( map-standard-pullback-coproduct) ( map-inv-standard-pullback-coproduct) is-section-map-inv-standard-pullback-coproduct (inl x , inl y , p) = eq-pair-eq-fiber (eq-pair-eq-fiber (is-section-is-injective-inl p)) is-section-map-inv-standard-pullback-coproduct (inr x , inr y , p) = eq-pair-eq-fiber (eq-pair-eq-fiber (is-section-is-injective-inr p)) is-retraction-map-inv-standard-pullback-coproduct : is-retraction ( map-standard-pullback-coproduct) ( map-inv-standard-pullback-coproduct) is-retraction-map-inv-standard-pullback-coproduct (inl (x , y , p)) = ap ( inl) ( eq-pair-eq-fiber (eq-pair-eq-fiber (is-retraction-is-injective-inl p))) is-retraction-map-inv-standard-pullback-coproduct (inr (x , y , p)) = ap ( inr) ( eq-pair-eq-fiber (eq-pair-eq-fiber (is-retraction-is-injective-inr p))) abstract is-equiv-map-standard-pullback-coproduct : is-equiv map-standard-pullback-coproduct is-equiv-map-standard-pullback-coproduct = is-equiv-is-invertible map-inv-standard-pullback-coproduct is-section-map-inv-standard-pullback-coproduct is-retraction-map-inv-standard-pullback-coproduct compute-standard-pullback-coproduct : standard-pullback f g + standard-pullback f' g' ≃ standard-pullback (map-coproduct f f') (map-coproduct g g') compute-standard-pullback-coproduct = map-standard-pullback-coproduct , is-equiv-map-standard-pullback-coproduct ``` ### The gap map of a coproduct computes as a coproduct of gap maps ```agda module _ {l1 l2 l3 l1' l2' l3' : Level} {A : UU l1} {B : UU l2} {X : UU l3} {A' : UU l1'} {B' : UU l2'} {X' : UU l3'} (f : A → X) (g : B → X) (f' : A' → X') (g' : B' → X') where triangle-map-standard-pullback-coproduct : {l4 l4' : Level} {C : UU l4} {C' : UU l4'} (c : cone f g C) (c' : cone f' g' C') → coherence-triangle-maps ( gap ( map-coproduct f f') ( map-coproduct g g') ( coproduct-cone f g f' g' c c')) ( map-standard-pullback-coproduct f g f' g') ( map-coproduct (gap f g c) (gap f' g' c')) triangle-map-standard-pullback-coproduct c c' (inl _) = eq-pair-eq-fiber (eq-pair-eq-fiber right-unit) triangle-map-standard-pullback-coproduct c c' (inr _) = eq-pair-eq-fiber (eq-pair-eq-fiber right-unit) ``` ### Coproducts of pullbacks are pullbacks ```agda module _ {l1 l2 l3 l4 l1' l2' l3' l4' : Level} {A : UU l1} {B : UU l2} {X : UU l3} {C : UU l4} {A' : UU l1'} {B' : UU l2'} {X' : UU l3'} {C' : UU l4'} (f : A → X) (g : B → X) (f' : A' → X') (g' : B' → X') where abstract is-pullback-coproduct-is-pullback : (c : cone f g C) (c' : cone f' g' C') → is-pullback f g c → is-pullback f' g' c' → is-pullback ( map-coproduct f f') ( map-coproduct g g') ( coproduct-cone f g f' g' c c') is-pullback-coproduct-is-pullback c c' is-pb-c is-pb-c' = is-equiv-left-map-triangle ( gap ( map-coproduct f f') ( map-coproduct g g') ( coproduct-cone f g f' g' c c')) ( map-standard-pullback-coproduct f g f' g') ( map-coproduct (gap f g c) (gap f' g' c')) ( triangle-map-standard-pullback-coproduct f g f' g' c c') ( is-equiv-map-coproduct is-pb-c is-pb-c') ( is-equiv-map-standard-pullback-coproduct f g f' g') ``` ### Coproducts of cones that satisfy the universal property of pullbacks satisfy the universal property of pullbacks ```agda module _ {l1 l2 l3 l4 l1' l2' l3' l4' : Level} {A : UU l1} {B : UU l2} {X : UU l3} {C : UU l4} {A' : UU l1'} {B' : UU l2'} {X' : UU l3'} {C' : UU l4'} (f : A → X) (g : B → X) (f' : A' → X') (g' : B' → X') where abstract universal-property-pullback-coproduct-universal-property-pullback : (c : cone f g C) (c' : cone f' g' C') → universal-property-pullback f g c → universal-property-pullback f' g' c' → universal-property-pullback ( map-coproduct f f') ( map-coproduct g g') ( coproduct-cone f g f' g' c c') universal-property-pullback-coproduct-universal-property-pullback c c' up-pb-c up-pb-c' = universal-property-pullback-is-pullback ( map-coproduct f f') ( map-coproduct g g') ( coproduct-cone f g f' g' c c') ( is-pullback-coproduct-is-pullback f g f' g' c c' ( is-pullback-universal-property-pullback f g c up-pb-c) ( is-pullback-universal-property-pullback f' g' c' up-pb-c')) ``` ## Table of files about pullbacks The following table lists files that are about pullbacks as a general concept. {{#include tables/pullbacks.md}}