# Products of pullbacks ```agda module foundation.products-pullbacks where ``` <details><summary>Imports</summary> ```agda open import foundation.cones-over-cospan-diagrams open import foundation.dependent-pair-types open import foundation.equality-cartesian-product-types open import foundation.functoriality-cartesian-product-types open import foundation.inhabited-types open import foundation.propositional-truncations open import foundation.pullbacks open import foundation.standard-pullbacks open import foundation.type-arithmetic-dependent-pair-types open import foundation.universe-levels open import foundation-core.cartesian-product-types open import foundation-core.equivalences open import foundation-core.function-types open import foundation-core.functoriality-dependent-pair-types open import foundation-core.homotopies open import foundation-core.identity-types 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 product ```text C × C' ----> B × B' | | | | g × g' ∨ ∨ A × A' ----> X × X' f × f' ``` is a [pullback](foundation-core.pullbacks.md) if each factor is. Conversely, if the product is a pullback and the standard pullback of each factor is inhabited, then each factor is also a pullback. ## Definitions ### Product 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 product-cone : cone f g C → cone f' g' C' → cone (map-product f f') (map-product g g') (C × C') pr1 (product-cone (p , q , H) (p' , q' , H')) = map-product p p' pr1 (pr2 (product-cone (p , q , H) (p' , q' , H'))) = map-product q q' pr2 (pr2 (product-cone (p , q , H) (p' , q' , H'))) = htpy-map-product H H' ``` ## Properties ### Computing the standard pullback of a product ```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 map-product-cone-standard-pullback : (standard-pullback f g) × (standard-pullback f' g') → standard-pullback (map-product f f') (map-product g g') map-product-cone-standard-pullback = ( tot ( λ t → ( tot (λ s → eq-pair')) ∘ ( map-interchange-Σ-Σ (λ y p y' → f' (pr2 t) = g' y')))) ∘ ( map-interchange-Σ-Σ (λ x t x' → Σ B' (λ y' → f' x' = g' y'))) abstract is-equiv-map-product-cone-standard-pullback : is-equiv map-product-cone-standard-pullback is-equiv-map-product-cone-standard-pullback = is-equiv-comp ( tot (λ t → tot (λ s → eq-pair') ∘ map-interchange-Σ-Σ _)) ( map-interchange-Σ-Σ _) ( is-equiv-map-interchange-Σ-Σ _) ( is-equiv-tot-is-fiberwise-equiv ( λ t → is-equiv-comp ( tot (λ s → eq-pair')) ( map-interchange-Σ-Σ (λ y p y' → f' (pr2 t) = g' y')) ( is-equiv-map-interchange-Σ-Σ _) ( is-equiv-tot-is-fiberwise-equiv ( λ s → is-equiv-eq-pair (map-product f f' t) (map-product g g' s))))) compute-product-standard-pullback : (standard-pullback f g) × (standard-pullback f' g') ≃ standard-pullback (map-product f f') (map-product g g') compute-product-standard-pullback = ( map-product-cone-standard-pullback , is-equiv-map-product-cone-standard-pullback) ``` ### The gap map of the standard pullback of a product computes as a product of gap maps ```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 triangle-map-product-cone-standard-pullback : (c : cone f g C) (c' : cone f' g' C') → ( gap (map-product f f') (map-product g g') (product-cone f g f' g' c c')) ~ ( ( map-product-cone-standard-pullback f g f' g') ∘ ( map-product (gap f g c) (gap f' g' c'))) triangle-map-product-cone-standard-pullback c c' = refl-htpy ``` ### Products 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-product-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-product f f') ( map-product g g') ( product-cone f g f' g' c c') is-pullback-product-is-pullback c c' is-pb-c is-pb-c' = is-equiv-left-map-triangle ( gap ( map-product f f') ( map-product g g') ( product-cone f g f' g' c c')) ( map-product-cone-standard-pullback f g f' g') ( map-product (gap f g c) (gap f' g' c')) ( triangle-map-product-cone-standard-pullback f g f' g' c c') ( is-equiv-map-product (gap f g c) (gap f' g' c') is-pb-c is-pb-c') ( is-equiv-map-product-cone-standard-pullback f g f' g') ``` ### Products of cones satisfying 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) (c : cone f g C) (f' : A' → X') (g' : B' → X') (c' : cone f' g' C') where universal-property-pullback-product-universal-property-pullback : universal-property-pullback f g c → universal-property-pullback f' g' c' → universal-property-pullback ( map-product f f') ( map-product g g') ( product-cone f g f' g' c c') universal-property-pullback-product-universal-property-pullback H H' = universal-property-pullback-is-pullback ( map-product f f') ( map-product g g') ( product-cone f g f' g' c c') ( is-pullback-product-is-pullback f g f' g' c c' ( is-pullback-universal-property-pullback f g c H) ( is-pullback-universal-property-pullback f' g' c' H')) ``` ### If the product is a pullback and the standard pullback of each factor is inhabited then both factors 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') (c : cone f g C) (c' : cone f' g' C') where abstract is-pullback-left-factor-is-inhabited-standard-pullback-right-factor-is-pullback-product' : is-pullback ( map-product f f') ( map-product g g') ( product-cone f g f' g' c c') → standard-pullback f' g' → is-pullback f g c is-pullback-left-factor-is-inhabited-standard-pullback-right-factor-is-pullback-product' H t = is-equiv-left-factor-is-equiv-map-product' ( gap f g c) ( gap f' g' c') ( t) ( is-equiv-top-map-triangle ( gap ( map-product f f') ( map-product g g') ( product-cone f g f' g' c c')) ( map-product-cone-standard-pullback f g f' g') ( map-product (gap f g c) (gap f' g' c')) ( triangle-map-product-cone-standard-pullback f g f' g' c c') ( is-equiv-map-product-cone-standard-pullback f g f' g') ( H)) abstract is-pullback-left-factor-is-inhabited-standard-pullback-right-factor-is-pullback-product : is-pullback ( map-product f f') ( map-product g g') ( product-cone f g f' g' c c') → is-inhabited (standard-pullback f' g') → is-pullback f g c is-pullback-left-factor-is-inhabited-standard-pullback-right-factor-is-pullback-product H = rec-trunc-Prop ( is-pullback-Prop f g c) ( is-pullback-left-factor-is-inhabited-standard-pullback-right-factor-is-pullback-product' ( H)) is-pullback-left-factor-is-inhabited-right-factor-is-pullback-product' : is-pullback ( map-product f f') ( map-product g g') ( product-cone f g f' g' c c') → C' → is-pullback f g c is-pullback-left-factor-is-inhabited-right-factor-is-pullback-product' H t = is-pullback-left-factor-is-inhabited-standard-pullback-right-factor-is-pullback-product' ( H) ( gap f' g' c' t) is-pullback-left-factor-is-inhabited-right-factor-is-pullback-product : is-pullback ( map-product f f') ( map-product g g') ( product-cone f g f' g' c c') → is-inhabited C' → is-pullback f g c is-pullback-left-factor-is-inhabited-right-factor-is-pullback-product H = rec-trunc-Prop ( is-pullback-Prop f g c) ( is-pullback-left-factor-is-inhabited-right-factor-is-pullback-product' ( H)) abstract is-pullback-right-factor-is-inhabited-standard-pullback-left-factor-is-pullback-product' : is-pullback ( map-product f f') ( map-product g g') ( product-cone f g f' g' c c') → standard-pullback f g → is-pullback f' g' c' is-pullback-right-factor-is-inhabited-standard-pullback-left-factor-is-pullback-product' H t = is-equiv-right-factor-is-equiv-map-product' ( gap f g c) ( gap f' g' c') ( t) ( is-equiv-top-map-triangle ( gap ( map-product f f') ( map-product g g') ( product-cone f g f' g' c c')) ( map-product-cone-standard-pullback f g f' g') ( map-product (gap f g c) (gap f' g' c')) ( triangle-map-product-cone-standard-pullback f g f' g' c c') ( is-equiv-map-product-cone-standard-pullback f g f' g') ( H)) abstract is-pullback-right-factor-is-inhabited-standard-pullback-left-factor-is-pullback-product : is-pullback ( map-product f f') ( map-product g g') ( product-cone f g f' g' c c') → is-inhabited (standard-pullback f g) → is-pullback f' g' c' is-pullback-right-factor-is-inhabited-standard-pullback-left-factor-is-pullback-product H = rec-trunc-Prop ( is-pullback-Prop f' g' c') ( is-pullback-right-factor-is-inhabited-standard-pullback-left-factor-is-pullback-product' ( H)) is-pullback-right-factor-is-inhabited-left-factor-is-pullback-product' : is-pullback ( map-product f f') ( map-product g g') ( product-cone f g f' g' c c') → C → is-pullback f' g' c' is-pullback-right-factor-is-inhabited-left-factor-is-pullback-product' H t = is-pullback-right-factor-is-inhabited-standard-pullback-left-factor-is-pullback-product' ( H) ( gap f g c t) is-pullback-right-factor-is-inhabited-left-factor-is-pullback-product : is-pullback ( map-product f f') ( map-product g g') ( product-cone f g f' g' c c') → is-inhabited C → is-pullback f' g' c' is-pullback-right-factor-is-inhabited-left-factor-is-pullback-product H = rec-trunc-Prop ( is-pullback-Prop f' g' c') ( is-pullback-right-factor-is-inhabited-left-factor-is-pullback-product' ( H)) ``` ## Table of files about pullbacks The following table lists files that are about pullbacks as a general concept. {{#include tables/pullbacks.md}}