# Commuting squares of homotopies ```agda module foundation.commuting-squares-of-homotopies where open import foundation-core.commuting-squares-of-homotopies public ``` <details><summary>Imports</summary> ```agda open import foundation.commuting-squares-of-identifications open import foundation.dependent-pair-types open import foundation.homotopies open import foundation.universe-levels open import foundation-core.equivalences open import foundation-core.functoriality-dependent-function-types ``` </details> ## Idea A square of [homotopies](foundation-core.identity-types.md) ```text top f -------> g | | left | | right ∨ ∨ h -------> i bottom ``` is said to be a {{#concept "commuting square" Disambiguation="homotopies" Agda=coherence-square-homotopies}} if there is a homotopy `left ∙h bottom ~ top ∙h right`. Such a homotopy is called a {{#concept "coherence" Disambiguation="commuting square of homotopies" Agda=coherence-square-homotopies}} of the square. ### Concatenating homotopies of edges and coherences of commuting squares of homotopies Consider a commuting square of homotopies and a homotopy of one of the four sides with another homotopy, as for example in the diagram below: ```text top a ---------> b | | | left | right |~| right' ∨ ∨ ∨ c ---------> d. bottom ``` Then any homotopy witnessing that the square commutes can be concatenated with the homotopy on the side, to obtain a new commuting square of homotopies. #### Concatenating homotopies of the top edge with a coherence of a commuting square of homotopies Consider a commuting diagram of homotopies ```text top' -------> f -------> g | top | left | | right ∨ ∨ h -------> i. bottom ``` with a homotopy `top ~ top'`. Then we get an equivalence ```text top top' f -------> g f -------> g | | | | left | | right ≃ left | | right ∨ ∨ ∨ ∨ h -------> i h -------> i. bottom bottom ``` ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g h i : (x : A) → B x} (top : f ~ g) (left : f ~ h) (right : g ~ i) (bottom : h ~ i) {top' : f ~ g} (s : top ~ top') where abstract is-equiv-concat-top-homotopy-coherence-square-homotopies : is-equiv ( concat-top-homotopy-coherence-square-homotopies top left right bottom s) is-equiv-concat-top-homotopy-coherence-square-homotopies = is-equiv-map-Π-is-fiberwise-equiv ( λ x → is-equiv-concat-top-identification-coherence-square-identifications ( top x) (left x) (right x) (bottom x) (s x)) equiv-concat-top-homotopy-coherence-square-homotopies : coherence-square-homotopies top left right bottom ≃ coherence-square-homotopies top' left right bottom pr1 equiv-concat-top-homotopy-coherence-square-homotopies = concat-top-homotopy-coherence-square-homotopies top left right bottom s pr2 equiv-concat-top-homotopy-coherence-square-homotopies = is-equiv-concat-top-homotopy-coherence-square-homotopies ``` #### Concatenating homotopies of the left edge with a coherence of a commuting square of homotopies Consider a commuting diagram of homotopies ```text top f -------> g | | | left' | | left | right ∨ ∨ ∨ h -------> i. bottom ``` with a homotopy `left ~ left'`. Then we get an equivalence ```text top top f -------> g f -------> g | | | | left | | right ≃ left' | | right ∨ ∨ ∨ ∨ h -------> i h -------> i. bottom bottom ``` ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g h i : (x : A) → B x} (top : f ~ g) (left : f ~ h) (right : g ~ i) (bottom : h ~ i) {left' : f ~ h} (s : left ~ left') where abstract is-equiv-concat-left-homotopy-coherence-square-homotopies : is-equiv ( concat-left-homotopy-coherence-square-homotopies top left right bottom s) is-equiv-concat-left-homotopy-coherence-square-homotopies = is-equiv-map-Π-is-fiberwise-equiv ( λ x → is-equiv-concat-left-identification-coherence-square-identifications ( top x) (left x) (right x) (bottom x) (s x)) equiv-concat-left-homotopy-coherence-square-homotopies : coherence-square-homotopies top left right bottom ≃ coherence-square-homotopies top left' right bottom pr1 equiv-concat-left-homotopy-coherence-square-homotopies = concat-left-homotopy-coherence-square-homotopies top left right bottom s pr2 equiv-concat-left-homotopy-coherence-square-homotopies = is-equiv-concat-left-homotopy-coherence-square-homotopies ``` #### Concatenating homotopies of the right edge with a coherence of a commuting square of homotopies Consider a commuting diagram of homotopies ```text top f -------> g | | | left | right | | right' ∨ ∨ ∨ h -------> i. bottom ``` with a homotopy `right ~ right'`. Then we get an equivalence ```text top top f -------> g f -------> g | | | | left | | right ≃ left | | right' ∨ ∨ ∨ ∨ h -------> i h -------> i. bottom bottom ``` ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g h i : (x : A) → B x} (top : f ~ g) (left : f ~ h) (right : g ~ i) (bottom : h ~ i) {right' : g ~ i} (s : right ~ right') where abstract is-equiv-concat-right-homotopy-coherence-square-homotopies : is-equiv ( concat-right-homotopy-coherence-square-homotopies top left right bottom s) is-equiv-concat-right-homotopy-coherence-square-homotopies = is-equiv-map-Π-is-fiberwise-equiv ( λ x → is-equiv-concat-right-identification-coherence-square-identifications ( top x) (left x) (right x) (bottom x) (s x)) equiv-concat-right-homotopy-coherence-square-homotopies : coherence-square-homotopies top left right bottom ≃ coherence-square-homotopies top left right' bottom pr1 equiv-concat-right-homotopy-coherence-square-homotopies = concat-right-homotopy-coherence-square-homotopies top left right bottom s pr2 equiv-concat-right-homotopy-coherence-square-homotopies = is-equiv-concat-right-homotopy-coherence-square-homotopies ``` #### Concatenating homotopies of the bottom edge with a coherence of a commuting square of homotopies Consider a commuting diagram of homotopies ```text top f -------> g | | left | | right ∨ bottom ∨ h -------> i. -------> bottom' ``` with a homotopy `bottom ~ bottom'`. Then we get an equivalence ```text top top f -------> g f -------> g | | | | left | | right ≃ left | | right ∨ ∨ ∨ ∨ h -------> i h -------> i. bottom bottom' ``` ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g h i : (x : A) → B x} (top : f ~ g) (left : f ~ h) (right : g ~ i) (bottom : h ~ i) {bottom' : h ~ i} (s : bottom ~ bottom') where is-equiv-concat-bottom-homotopy-coherence-square-homotopies : is-equiv ( concat-bottom-homotopy-coherence-square-homotopies top left right bottom s) is-equiv-concat-bottom-homotopy-coherence-square-homotopies = is-equiv-map-Π-is-fiberwise-equiv ( λ x → is-equiv-concat-bottom-identification-coherence-square-identifications ( top x) (left x) (right x) (bottom x) (s x)) equiv-concat-bottom-homotopy-coherence-square-homotopies : coherence-square-homotopies top left right bottom ≃ coherence-square-homotopies top left right bottom' pr1 equiv-concat-bottom-homotopy-coherence-square-homotopies = concat-bottom-homotopy-coherence-square-homotopies top left right bottom s pr2 equiv-concat-bottom-homotopy-coherence-square-homotopies = is-equiv-concat-bottom-homotopy-coherence-square-homotopies ``` ### Whiskering and splicing coherences of commuting squares of homotopies Given a commuting square of homotopies ```text top f -------> g | | left | | right ∨ ∨ h -------> i, bottom ``` we may consider four ways of attaching new homotopies to it: 1. Prepending `p : u ~ f` to the left gives us a commuting square ```text p ∙h top u -------> g | | p ∙h left | | right ∨ ∨ h -------> i. bottom ``` More precisely, we have an equivalence ```text (left ∙h bottom ~ top ∙h right) ≃ ((p ∙h left) ∙h bottom ~ (p ∙h top) ∙h right). ``` 2. Appending a homotopy `p : i ~ u` to the right gives a commuting square of homotopies ```text top f ------------> g | | left | | right ∙h p ∨ ∨ h ------------> u. bottom ∙h p ``` More precisely, we have an equivalence ```text (left ∙h bottom ~ top ∙h right) ≃ (left ∙h (bottom ∙h p) ~ top ∙h (right ∙h p)). ``` 3. Splicing a homotopy `p : h ~ u` and its inverse into the middle gives a commuting square of homotopies ```text top f --------------> g | | left ∙h p | | right ∨ ∨ u --------------> i. p⁻¹ ∙h bottom ``` More precisely, we have an equivalence ```text (left ∙h bottom ~ top ∙h right) ≃ ((left ∙h p) ∙h (p⁻¹ ∙h bottom) ~ top ∙h right). ``` Similarly, we have an equivalence ```text (left ∙h bottom ~ top ∙h right) ≃ ((left ∙h p⁻¹) ∙h (p ∙h bottom) ~ top ∙h right). ``` 4. Splicing a homotopy `p : g ~ u` and its inverse into the middle gives a commuting square of homotopies ```text top ∙h p f --------> u | | left | | p⁻¹ ∙h right ∨ ∨ h --------> i. bottom ``` More precisely, we have an equivalence ```text (left ∙h bottom ~ top ∙h right) ≃ (left ∙h bottom ~ (top ∙h p) ∙h (p⁻¹ ∙h right)). ``` Similarly, we have an equivalence ```text (left ∙h bottom ~ top ∙h right) ≃ (left ∙h bottom ~ (top ∙h p⁻¹) ∙h (p ∙h right)). ``` These operations are useful in proofs involving homotopy algebra, because taking `equiv-right-whisker-concat-coherence-square-homotopies` as an example, it provides us with two maps: the forward direction states `(p ∙h r ~ q ∙h s) → (p ∙h (r ∙h t)) ~ q ∙h (s ∙h t))`, which allows one to append a homotopy without needing to reassociate on the right, and the backwards direction conversely allows one to cancel out a homotopy in parentheses. #### Left whiskering coherences of commuting squares of homotopies For any homotopy `p : u ~ f` we obtain an equivalence ```text top p ∙h top f -------> g u -------> g | | | | left | | right ≃ p ∙h left | | right ∨ ∨ ∨ ∨ h -------> i h -------> i bottom bottom ``` of coherences of commuting squares of homotopies. ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g h i u : (x : A) → B x} where equiv-left-whisker-concat-coherence-square-homotopies : (p : u ~ f) (top : f ~ g) (left : f ~ h) (right : g ~ i) (bottom : h ~ i) → coherence-square-homotopies top left right bottom ≃ coherence-square-homotopies (p ∙h top) (p ∙h left) right bottom equiv-left-whisker-concat-coherence-square-homotopies p top left right bottom = equiv-Π-equiv-family ( λ x → equiv-left-whisker-concat-coherence-square-identifications ( p x) (top x) (left x) (right x) (bottom x)) ``` #### Right whiskering coherences of commuting squares of homotopies For any homotopy `p : i ~ u` we obtain an equivalence ```text top top f -------> g f ------------> g | | | | left | | right ≃ left | | right ∙h p ∨ ∨ ∨ ∨ h -------> i h ------------> i bottom bottom ∙h p ``` of coherences of commuting squares of homotopies. ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g h i : (x : A) → B x} (top : f ~ g) (left : f ~ h) (right : g ~ i) (bottom : h ~ i) where equiv-right-whisker-concat-coherence-square-homotopies : {u : (x : A) → B x} (p : i ~ u) → coherence-square-homotopies top left right bottom ≃ coherence-square-homotopies top left (right ∙h p) (bottom ∙h p) equiv-right-whisker-concat-coherence-square-homotopies p = equiv-Π-equiv-family ( λ x → equiv-right-whisker-concat-coherence-square-identifications ( top x) (left x) (right x) (bottom x) (p x)) ``` #### Left splicing coherences of commuting squares of homotopies For any inverse pair of homotopies `p : g ~ u` and `q : u ~ g` equipped with `α : inv-htpy p ~ q` we obtain an equivalence ```text top top f -------> g f -----------> g | | | | left | | right ≃ left ∙h p | | right ∨ ∨ ∨ ∨ h -------> i u -----------> i bottom q ∙h bottom ``` of coherences of commuting squares of homotopies. ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g h i : (x : A) → B x} (top : f ~ g) (left : f ~ h) (right : g ~ i) (bottom : h ~ i) where equiv-left-splice-coherence-square-homotopies : {u : (x : A) → B x} (p : h ~ u) (q : u ~ h) (α : inv-htpy p ~ q) → coherence-square-homotopies top left right bottom ≃ coherence-square-homotopies top (left ∙h p) right (q ∙h bottom) equiv-left-splice-coherence-square-homotopies p q α = equiv-Π-equiv-family ( λ x → equiv-left-splice-coherence-square-identifications ( top x) (left x) (right x) (bottom x) (p x) (q x) (α x)) ``` #### Right splicing coherences of commuting squares of homotopies For any inverse pair of homotopies `p : g ~ u` and `q : u ~ g` equipped with `α : inv-htpy p ~ q` we obtain an equivalence ```text top top ∙h p f -------> g f --------> u | | | | left | | right ≃ left | | q ∙h right ∨ ∨ ∨ ∨ h -------> i h --------> i bottom bottom ``` of coherences of commuting squares of homotopies. ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g h i : (x : A) → B x} (top : f ~ g) (left : f ~ h) (right : g ~ i) (bottom : h ~ i) where equiv-right-splice-coherence-square-homotopies : {u : (x : A) → B x} (p : g ~ u) (q : u ~ g) (α : inv-htpy p ~ q) → coherence-square-homotopies top left right bottom ≃ coherence-square-homotopies (top ∙h p) left (inv-htpy p ∙h right) bottom equiv-right-splice-coherence-square-homotopies p q α = equiv-Π-equiv-family ( λ x → equiv-right-splice-coherence-square-identifications ( top x) (left x) (right x) (bottom x) (p x) (q x) (α x)) ``` ### Double whiskering of commuting squares of homotopies ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g h u v i : (x : A) → B x} where equiv-double-whisker-coherence-square-homotopies : (p : f ~ g) (top : g ~ u) (left : g ~ h) (right : u ~ v) (bottom : h ~ v) (s : v ~ i) → coherence-square-homotopies top left right bottom ≃ coherence-square-homotopies ( p ∙h top) ( p ∙h left) ( right ∙h s) ( bottom ∙h s) equiv-double-whisker-coherence-square-homotopies p top left right bottom q = equiv-Π-equiv-family ( λ x → equiv-double-whisker-coherence-square-identifications ( p x) (top x) (left x) (right x) (bottom x) (q x)) ``` ### Computing the pasting of two squares with `refl-htpy` on opposite sides Consider two squares of homotopies as in the diagram ```text refl-htpy a ----------> a | | top-left | | top-right ∨ refl-htpy ∨ b ----------> b | | bottom-left | | bottom-right ∨ ∨ c ----------> c refl-htpy ``` The result of vertically pasting these squares can be computed in terms of the horizontal concatenation of homotopies. ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {a b c : (x : A) → B x} (top-left : a ~ b) (top-right : a ~ b) (bottom-left : b ~ c) (bottom-right : b ~ c) where vertical-pasting-coherence-square-homotopies-horizontal-refl : (H : top-left ~ top-right) (K : bottom-left ~ bottom-right) → ( inv-coherence-square-homotopies-horizontal-refl ( top-left ∙h bottom-left) ( top-right ∙h bottom-right) ( vertical-pasting-coherence-square-homotopies ( refl-htpy) ( top-left) ( top-right) ( refl-htpy) ( bottom-left) ( bottom-right) ( refl-htpy) ( coherence-square-homotopies-horizontal-refl ( top-left) ( top-right) ( H)) ( coherence-square-homotopies-horizontal-refl ( bottom-left) ( bottom-right) ( K)))) ~ ( horizontal-concat-htpy² H K) vertical-pasting-coherence-square-homotopies-horizontal-refl H K x = vertical-pasting-coherence-square-identifications-horizontal-refl ( top-left x) ( top-right x) ( bottom-left x) ( bottom-right x) ( H x) ( K x) vertical-pasting-inv-coherence-square-homotopies-horizontal-refl : (H : coherence-square-homotopies ( refl-htpy) ( top-left) ( top-right) ( refl-htpy)) (K : coherence-square-homotopies ( refl-htpy) ( bottom-left) ( bottom-right) ( refl-htpy)) → ( inv-coherence-square-homotopies-horizontal-refl ( top-left ∙h bottom-left) ( top-right ∙h bottom-right) ( vertical-pasting-coherence-square-homotopies ( refl-htpy) ( top-left) ( top-right) ( refl-htpy) ( bottom-left) ( bottom-right) ( refl-htpy) ( H) ( K))) ~ ( horizontal-concat-htpy² ( inv-coherence-square-homotopies-horizontal-refl ( top-left) ( top-right) ( H)) ( inv-coherence-square-homotopies-horizontal-refl ( bottom-left) ( bottom-right) ( K))) vertical-pasting-inv-coherence-square-homotopies-horizontal-refl H K x = vertical-pasting-inv-coherence-square-identifications-horizontal-refl ( top-left x) ( top-right x) ( bottom-left x) ( bottom-right x) ( H x) ( K x) ```