# Dependent products of pullbacks ```agda module foundation.dependent-products-pullbacks where ``` <details><summary>Imports</summary> ```agda open import foundation.cones-over-cospan-diagrams open import foundation.dependent-pair-types open import foundation.function-extensionality open import foundation.functoriality-dependent-function-types open import foundation.identity-types open import foundation.standard-pullbacks open import foundation.universe-levels 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 a family of pullback squares ```text Cᵢ -----> Bᵢ | ⌟ | | | gᵢ ∨ ∨ Aᵢ -----> Xᵢ fᵢ ``` indexed by `i : I`, their dependent product ```text Πᵢ Cᵢ -----> Πᵢ Bᵢ | ⌟ | | | Πᵢ gᵢ ∨ ∨ Πᵢ Aᵢ -----> Πᵢ Xᵢ Πᵢ fᵢ ``` is again a pullback square. ## Definitions ### Dependent products of cones ```agda module _ {l1 l2 l3 l4 l5 : Level} {I : UU l1} {A : I → UU l2} {B : I → UU l3} {X : I → UU l4} {C : I → UU l5} (f : (i : I) → A i → X i) (g : (i : I) → B i → X i) (c : (i : I) → cone (f i) (g i) (C i)) where cone-Π : cone (map-Π f) (map-Π g) ((i : I) → C i) pr1 cone-Π = map-Π (λ i → pr1 (c i)) pr1 (pr2 cone-Π) = map-Π (λ i → pr1 (pr2 (c i))) pr2 (pr2 cone-Π) = htpy-map-Π (λ i → pr2 (pr2 (c i))) ``` ## Properties ### Computing the standard pullback of a dependent product ```agda module _ {l1 l2 l3 l4 : Level} {I : UU l1} {A : I → UU l2} {B : I → UU l3} {X : I → UU l4} (f : (i : I) → A i → X i) (g : (i : I) → B i → X i) where map-standard-pullback-Π : standard-pullback (map-Π f) (map-Π g) → (i : I) → standard-pullback (f i) (g i) pr1 (map-standard-pullback-Π (α , β , γ) i) = α i pr1 (pr2 (map-standard-pullback-Π (α , β , γ) i)) = β i pr2 (pr2 (map-standard-pullback-Π (α , β , γ) i)) = htpy-eq γ i map-inv-standard-pullback-Π : ((i : I) → standard-pullback (f i) (g i)) → standard-pullback (map-Π f) (map-Π g) pr1 (map-inv-standard-pullback-Π h) i = pr1 (h i) pr1 (pr2 (map-inv-standard-pullback-Π h)) i = pr1 (pr2 (h i)) pr2 (pr2 (map-inv-standard-pullback-Π h)) = eq-htpy (λ i → pr2 (pr2 (h i))) abstract is-section-map-inv-standard-pullback-Π : is-section (map-standard-pullback-Π) (map-inv-standard-pullback-Π) is-section-map-inv-standard-pullback-Π h = eq-htpy ( λ i → map-extensionality-standard-pullback (f i) (g i) refl refl ( inv ( ( right-unit) ∙ ( htpy-eq (is-section-eq-htpy (λ i → pr2 (pr2 (h i)))) i)))) abstract is-retraction-map-inv-standard-pullback-Π : is-retraction (map-standard-pullback-Π) (map-inv-standard-pullback-Π) is-retraction-map-inv-standard-pullback-Π (α , β , γ) = map-extensionality-standard-pullback ( map-Π f) ( map-Π g) ( refl) ( refl) ( inv (right-unit ∙ is-retraction-eq-htpy γ)) abstract is-equiv-map-standard-pullback-Π : is-equiv (map-standard-pullback-Π) is-equiv-map-standard-pullback-Π = is-equiv-is-invertible ( map-inv-standard-pullback-Π) ( is-section-map-inv-standard-pullback-Π) ( is-retraction-map-inv-standard-pullback-Π) compute-standard-pullback-Π : ( standard-pullback (map-Π f) (map-Π g)) ≃ ( (i : I) → standard-pullback (f i) (g i)) compute-standard-pullback-Π = map-standard-pullback-Π , is-equiv-map-standard-pullback-Π ``` ### A dependent product of gap maps computes as the gap map of the dependent product ```agda module _ {l1 l2 l3 l4 l5 : Level} {I : UU l1} {A : I → UU l2} {B : I → UU l3} {X : I → UU l4} {C : I → UU l5} (f : (i : I) → A i → X i) (g : (i : I) → B i → X i) (c : (i : I) → cone (f i) (g i) (C i)) where triangle-map-standard-pullback-Π : map-Π (λ i → gap (f i) (g i) (c i)) ~ map-standard-pullback-Π f g ∘ gap (map-Π f) (map-Π g) (cone-Π f g c) triangle-map-standard-pullback-Π h = eq-htpy ( λ i → map-extensionality-standard-pullback ( f i) ( g i) ( refl) ( refl) ( htpy-eq (is-section-eq-htpy _) i ∙ inv right-unit)) ``` ### Dependent products of pullbacks are pullbacks ```agda module _ {l1 l2 l3 l4 l5 : Level} {I : UU l1} {A : I → UU l2} {B : I → UU l3} {X : I → UU l4} {C : I → UU l5} (f : (i : I) → A i → X i) (g : (i : I) → B i → X i) (c : (i : I) → cone (f i) (g i) (C i)) where abstract is-pullback-Π : ((i : I) → is-pullback (f i) (g i) (c i)) → is-pullback (map-Π f) (map-Π g) (cone-Π f g c) is-pullback-Π is-pb-c = is-equiv-top-map-triangle ( map-Π (λ i → gap (f i) (g i) (c i))) ( map-standard-pullback-Π f g) ( gap (map-Π f) (map-Π g) (cone-Π f g c)) ( triangle-map-standard-pullback-Π f g c) ( is-equiv-map-standard-pullback-Π f g) ( is-equiv-map-Π-is-fiberwise-equiv is-pb-c) ``` ### Cones satisfying the universal property of pullbacks are closed under dependent products ```agda module _ {l1 l2 l3 l4 l5 : Level} {I : UU l1} {A : I → UU l2} {B : I → UU l3} {X : I → UU l4} (f : (i : I) → A i → X i) (g : (i : I) → B i → X i) {C : I → UU l5} (c : (i : I) → cone (f i) (g i) (C i)) where universal-property-pullback-Π : ((i : I) → universal-property-pullback (f i) (g i) (c i)) → universal-property-pullback (map-Π f) (map-Π g) (cone-Π f g c) universal-property-pullback-Π H = universal-property-pullback-is-pullback ( map-Π f) ( map-Π g) ( cone-Π f g c) ( is-pullback-Π f g c ( λ i → is-pullback-universal-property-pullback (f i) (g i) (c i) (H i))) ``` ## Table of files about pullbacks The following table lists files that are about pullbacks as a general concept. {{#include tables/pullbacks.md}}