# Commuting squares of homotopies ```agda module foundation-core.commuting-squares-of-homotopies where ``` <details><summary>Imports</summary> ```agda open import foundation.universe-levels open import foundation.whiskering-homotopies-composition open import foundation-core.commuting-squares-of-identifications open import foundation-core.homotopies open import foundation-core.whiskering-homotopies-concatenation ``` </details> ## Idea A square of [homotopies](foundation-core.homotopies.md) ```text top f ------> g | | left | | right ∨ ∨ h ------> i bottom ``` is said to be a {{#concept "commuting square" Disambiguation="homotopies"}} of 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. ## Definitions ### 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 coherence-square-homotopies : UU (l1 ⊔ l2) coherence-square-homotopies = left ∙h bottom ~ top ∙h right coherence-square-homotopies' : UU (l1 ⊔ l2) coherence-square-homotopies' = top ∙h right ~ left ∙h bottom ``` ### Horizontally constant squares {{#concept "Horizontally constant squares" Disambiguation="homotopies" Agda=horizontal-refl-coherence-square-homotopies}} are commuting squares of homotopies of the form ```text refl-htpy f ----------> f | | H | | H ∨ ∨ g ----------> g. refl-htpy ``` ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g : (x : A) → B x} (H : f ~ g) where horizontal-refl-coherence-square-homotopies : coherence-square-homotopies refl-htpy H H refl-htpy horizontal-refl-coherence-square-homotopies x = horizontal-refl-coherence-square-identifications (H x) ``` ### Vertically constant squares {{#concept "Vertically constant squares" Disambiguation="homotopies" Agda=vertical-refl-coherence-square-homotopies}} are commuting squares of homotopies of the form ```text H f -----> g | | refl-htpy | | refl-htpy ∨ ∨ f -----> g. H ``` ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g : (x : A) → B x} (H : f ~ g) where vertical-refl-coherence-square-homotopies : coherence-square-homotopies H refl-htpy refl-htpy H vertical-refl-coherence-square-homotopies x = vertical-refl-coherence-square-identifications (H x) ``` ### Squares with refl on the top and bottom Given a homotopy `H ~ H'`, we can obtain a coherence square with `refl-htpy` on the top and bottom. ```text refl-htpy f ----------> f | | H | | H' ∨ ∨ g ----------> g refl-htpy ``` ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g : (x : A) → B x} (H H' : f ~ g) where coherence-square-homotopies-horizontal-refl : H ~ H' → coherence-square-homotopies ( refl-htpy) ( H) ( H') ( refl-htpy) coherence-square-homotopies-horizontal-refl K = right-unit-htpy ∙h K ``` Conversely, given a coherence square as above, we can obtain a homotopy `H ~ H'`. ```agda inv-coherence-square-homotopies-horizontal-refl : coherence-square-homotopies ( refl-htpy) ( H) ( H') ( refl-htpy) → H ~ H' inv-coherence-square-homotopies-horizontal-refl K = inv-htpy-right-unit-htpy ∙h K ``` ### Squares with `refl-htpy` on the left and right Given a homotopy `H ~ H'`, we can obtain a coherence square with `refl-htpy` on the left and right. ```text H' f ------> g | | refl-htpy | | refl-htpy ∨ ∨ f ------> g H ``` ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g : (x : A) → B x} (H H' : f ~ g) where coherence-square-homotopies-vertical-refl : H ~ H' → coherence-square-homotopies ( H') ( refl-htpy) ( refl-htpy) ( H) coherence-square-homotopies-vertical-refl K = K ∙h inv-htpy right-unit-htpy ``` Conversely, given a coherence square as above, we can obtain a homotopy `H ~ H'`. ```agda inv-coherence-square-homotopies-vertical-refl : coherence-square-homotopies ( H') ( refl-htpy) ( refl-htpy) ( H) → H ~ H' inv-coherence-square-homotopies-vertical-refl K = K ∙h right-unit-htpy ``` ## Operations ### Inverting squares of homotopies horizontally Given a commuting square of homotopies ```text top f -------> g | | left | | right ∨ ∨ h -------> i, bottom ``` the square of homotopies ```text top⁻¹ g ------------> f | | right | | left ∨ ∨ i ------------> h bottom⁻¹ ``` commutes. ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g h i : (x : A) → B x} where horizontal-inv-coherence-square-homotopies : (top : f ~ g) (left : f ~ h) (right : g ~ i) (bottom : h ~ i) → coherence-square-homotopies top left right bottom → coherence-square-homotopies (inv-htpy top) right left (inv-htpy bottom) horizontal-inv-coherence-square-homotopies top left right bottom H x = horizontal-inv-coherence-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( H x) ``` ### Inverting squares of homotopies vertically Given a commuting square of homotopies ```text top f -------> g | | left | | right ∨ ∨ h -------> i, bottom ``` the square of homotopies ```text bottom h -------> i | | left⁻¹ | | right⁻¹ ∨ ∨ f -------> g top ``` commutes. ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g h i : (x : A) → B x} where vertical-inv-coherence-square-homotopies : (top : f ~ g) (left : f ~ h) (right : g ~ i) (bottom : h ~ i) → coherence-square-homotopies top left right bottom → coherence-square-homotopies bottom (inv-htpy left) (inv-htpy right) top vertical-inv-coherence-square-homotopies top left right bottom H x = vertical-inv-coherence-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( H x) ``` ### Functions acting on squares of homotopies Given a commuting square of homotopies ```text top f -------> g | | left | | right ∨ ∨ h -------> i bottom ``` in `(x : A) → B x`, and given a dependent map `F : {x : A} → B x → C x`, the square of homotopies ```text F ·l top f f -----------> f g | | F ·l left | | F ·l right ∨ ∨ h -------------> i F ·l bottom ``` commutes. ```agda module _ {l1 l2 l3 : Level} {A : UU l1} {B : A → UU l2} {C : A → UU l3} {f g h i : (x : A) → B x} (F : {x : A} → B x → C x) where map-coherence-square-homotopies : (top : f ~ g) (left : f ~ h) (right : g ~ i) (bottom : h ~ i) → coherence-square-homotopies top left right bottom → coherence-square-homotopies ( F ·l top) ( F ·l left) ( F ·l right) ( F ·l bottom) map-coherence-square-homotopies top left right bottom H x = map-coherence-square-identifications ( F) ( top x) ( left x) ( right x) ( bottom x) ( H x) ``` Similarly we may whisker it on the right. ```agda module _ {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : B → UU l3} {f g h i : (y : B) → C y} where right-whisker-comp-coherence-square-homotopies : (top : f ~ g) (left : f ~ h) (right : g ~ i) (bottom : h ~ i) → (F : A → B) → coherence-square-homotopies top left right bottom → coherence-square-homotopies ( top ·r F) ( left ·r F) ( right ·r F) ( bottom ·r F) right-whisker-comp-coherence-square-homotopies top left right bottom F α = α ·r F ``` ### 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. **Note.** To avoid cyclic module dependencies we will give direct proofs that concatenating homotopies of edges of a square with the coherence of its commutativity is an equivalence. #### 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 maps back and forth ```text top top' f -------> g f -------> g | | | | left | | right ↔ left | | right ∨ ∨ ∨ ∨ h -------> i h -------> i. bottom bottom ``` We record that this construction is an equivalence in [`foundation.commuting-squares-of-homotopies`](foundation.commuting-squares-of-homotopies.md). ```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 concat-top-homotopy-coherence-square-homotopies : coherence-square-homotopies top left right bottom → coherence-square-homotopies top' left right bottom concat-top-homotopy-coherence-square-homotopies H x = concat-top-identification-coherence-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( s x) ( H x) inv-concat-top-homotopy-coherence-square-homotopies : coherence-square-homotopies top' left right bottom → coherence-square-homotopies top left right bottom inv-concat-top-homotopy-coherence-square-homotopies H x = inv-concat-top-identification-coherence-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( s x) ( H x) ``` #### 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 maps back and forth ```text top top f -------> g f -------> g | | | | left | | right ↔ left' | | right ∨ ∨ ∨ ∨ h -------> i h -------> i. bottom bottom ``` We record that this construction is an equivalence in [`foundation.commuting-squares-of-homotopies`](foundation.commuting-squares-of-homotopies.md). ```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 concat-left-homotopy-coherence-square-homotopies : coherence-square-homotopies top left right bottom → coherence-square-homotopies top left' right bottom concat-left-homotopy-coherence-square-homotopies H x = concat-left-identification-coherence-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( s x) ( H x) inv-concat-left-homotopy-coherence-square-homotopies : coherence-square-homotopies top left' right bottom → coherence-square-homotopies top left right bottom inv-concat-left-homotopy-coherence-square-homotopies H x = inv-concat-left-identification-coherence-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( s x) ( H x) ``` #### 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 maps back and forth ```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 concat-right-homotopy-coherence-square-homotopies : coherence-square-homotopies top left right bottom → coherence-square-homotopies top left right' bottom concat-right-homotopy-coherence-square-homotopies H x = concat-right-identification-coherence-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( s x) ( H x) inv-concat-right-homotopy-coherence-square-homotopies : coherence-square-homotopies top left right' bottom → coherence-square-homotopies top left right bottom inv-concat-right-homotopy-coherence-square-homotopies H x = inv-concat-right-identification-coherence-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( s x) ( H x) ``` We record that this construction is an equivalence in [`foundation.commuting-squares-of-homotopies`](foundation.commuting-squares-of-homotopies.md). #### 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 maps back and forth ```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 concat-bottom-homotopy-coherence-square-homotopies : coherence-square-homotopies top left right bottom → coherence-square-homotopies top left right bottom' concat-bottom-homotopy-coherence-square-homotopies H x = concat-bottom-identification-coherence-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( s x) ( H x) inv-concat-bottom-homotopy-coherence-square-homotopies : coherence-square-homotopies top left right bottom' → coherence-square-homotopies top left right bottom inv-concat-bottom-homotopy-coherence-square-homotopies H x = inv-concat-bottom-identification-coherence-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( s x) ( H x) ``` We record that this construction is an equivalence in [`foundation.commuting-squares-of-homotopies`](foundation.commuting-squares-of-homotopies.md). ### Whiskering and splicing coherences of commuting squares of homotopies with respect to concatenation 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 `H : u ~ f` to the left gives us a commuting square ```text H ∙h top u -------> g | | H ∙h left | | right ∨ ∨ h -------> i. bottom ``` More precisely, we have an equivalence ```text (left ∙h bottom ~ top ∙h right) ≃ ((H ∙h left) ∙h bottom ~ (H ∙h top) ∙h right). ``` 2. Appending a homotopy `H : i ~ u` to the right gives a commuting square of homotopies ```text top f ------------> g | | left | | right ∙h H ∨ ∨ h ------------> u. bottom ∙h H ``` More precisely, we have an equivalence ```text (left ∙h bottom ~ top ∙h right) ≃ (left ∙h (bottom ∙h H) ~ top ∙h (right ∙h H)). ``` 3. Splicing a homotopy `H : h ~ u` and its inverse into the middle gives a commuting square of homotopies ```text top f --------------> g | | left ∙h H | | right ∨ ∨ u --------------> i. H⁻¹ ∙h bottom ``` More precisely, we have an equivalence ```text (left ∙h bottom ~ top ∙h right) ≃ ((left ∙h H) ∙h (H⁻¹ ∙h bottom) ~ top ∙h right). ``` Similarly, we have an equivalence ```text (left ∙h bottom ~ top ∙h right) ≃ ((left ∙h H⁻¹) ∙h (H ∙h bottom) ~ top ∙h right). ``` 4. Splicing a homotopy `H : g ~ u` and its inverse into the middle gives a commuting square of homotopies ```text top ∙h H f --------> u | | left | | H⁻¹ ∙h right ∨ ∨ h --------> i. bottom ``` More precisely, we have an equivalence ```text (left ∙h bottom ~ top ∙h right) ≃ (left ∙h bottom ~ (top ∙h H) ∙h (H⁻¹ ∙h right)). ``` Similarly, we have an equivalence ```text (left ∙h bottom ~ top ∙h right) ≃ (left ∙h bottom ~ (top ∙h H⁻¹) ∙h (H ∙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 `(H ∙h r ~ K ∙h s) → (H ∙h (r ∙h t)) ~ K ∙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 `H : u ~ f` we obtain maps back and forth ```text top H ∙h top f -------> g u -------> g | | | | left | | right ↔ H ∙h left | | right ∨ ∨ ∨ ∨ h -------> i h -------> i bottom bottom ``` of coherences of commuting squares of homotopies. We show in [`foundation.commuting-squares-of-homotopies`](foundation.commuting-squares-of-homotopies.md) that these maps are equivalences. ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g h i : (x : A) → B x} where left-whisker-concat-coherence-square-homotopies : {u : (x : A) → B x} (H : u ~ f) (top : f ~ g) (left : f ~ h) (right : g ~ i) (bottom : h ~ i) → coherence-square-homotopies top left right bottom → coherence-square-homotopies (H ∙h top) (H ∙h left) right bottom left-whisker-concat-coherence-square-homotopies H top left right bottom coh x = left-whisker-concat-coherence-square-identifications ( H x) ( top x) ( left x) ( right x) ( bottom x) ( coh x) left-unwhisker-concat-coherence-square-homotopies : {u : (x : A) → B x} (H : u ~ f) (top : f ~ g) (left : f ~ h) (right : g ~ i) (bottom : h ~ i) → coherence-square-homotopies (H ∙h top) (H ∙h left) right bottom → coherence-square-homotopies top left right bottom left-unwhisker-concat-coherence-square-homotopies H top left right bottom coh x = left-unwhisker-concat-coherence-square-identifications ( H x) ( top x) ( left x) ( right x) ( bottom x) ( coh x) ``` #### Right whiskering coherences of commuting squares of homotopies For any homotopy `H : i ~ u` we obtain maps back and forth ```text top top f -------> g f ------------> g | | | | left | | right ↔ left | | right ∙h H ∨ ∨ ∨ ∨ h -------> i h ------------> i bottom bottom ∙h H ``` of coherences of commuting squares of homotopies. We show in [`foundation.commuting-squares-of-homotopies`](foundation.commuting-squares-of-homotopies.md) that these maps are equivalences. ```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 right-whisker-concat-coherence-square-homotopies : coherence-square-homotopies top left right bottom → {u : (x : A) → B x} (H : i ~ u) → coherence-square-homotopies top left (right ∙h H) (bottom ∙h H) right-whisker-concat-coherence-square-homotopies coh H x = right-whisker-concat-coherence-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( coh x) ( H x) right-unwhisker-cohernece-square-homotopies : {u : (x : A) → B x} (H : i ~ u) → coherence-square-homotopies top left (right ∙h H) (bottom ∙h H) → coherence-square-homotopies top left right bottom right-unwhisker-cohernece-square-homotopies H coh x = right-unwhisker-cohernece-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( H x) ( coh 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 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) double-whisker-coherence-square-homotopies p top left right bottom q H = left-whisker-concat-coherence-square-homotopies p top left ( right ∙h q) ( bottom ∙h q) ( right-whisker-concat-coherence-square-homotopies ( top) ( left) ( right) ( bottom) ( H) ( q)) ``` #### Left splicing coherences of commuting squares of homotopies For any inverse pair of homotopies `H : g ~ u` and `K : u ~ g` equipped with `α : inv-htpy H ~ K` we obtain maps back and forth ```text top top f -------> g f -----------> g | | | | left | | right ↔ left ∙h H | | right ∨ ∨ ∨ ∨ h -------> i u -----------> i bottom K ∙h bottom ``` of coherences of commuting squares of homotopies. We show in [`foundation.commuting-squares-of-homotopies`](foundation.commuting-squares-of-homotopies.md) that these maps are equivalences. ```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 left-splice-coherence-square-homotopies : {u : (x : A) → B x} (H : h ~ u) (K : u ~ h) (α : inv-htpy H ~ K) → coherence-square-homotopies top left right bottom → coherence-square-homotopies top (left ∙h H) right (K ∙h bottom) left-splice-coherence-square-homotopies H K α coh x = left-splice-coherence-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( H x) ( K x) ( α x) ( coh x) left-unsplice-coherence-square-homotopies : {u : (x : A) → B x} (H : h ~ u) (K : u ~ h) (α : inv-htpy H ~ K) → coherence-square-homotopies top (left ∙h H) right (K ∙h bottom) → coherence-square-homotopies top left right bottom left-unsplice-coherence-square-homotopies H K α coh x = left-unsplice-coherence-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( H x) ( K x) ( α x) ( coh x) ``` #### Right splicing coherences of commuting squares of homotopies For any inverse pair of homotopies `H : g ~ u` and `K : u ~ g` equipped with `α : inv-htpy H ~ K` we obtain maps back and forth ```text top top ∙h H f -------> g f --------> u | | | | left | | right ↔ left | | K ∙h right ∨ ∨ ∨ ∨ h -------> i h --------> i bottom bottom ``` of coherences of commuting squares of homotopies. We show in [`foundation.commuting-squares-of-homotopies`](foundation.commuting-squares-of-homotopies.md) that these maps are equivalences. ```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 right-splice-coherence-square-homotopies : {u : (x : A) → B x} (H : g ~ u) (K : u ~ g) (α : inv-htpy H ~ K) → coherence-square-homotopies top left right bottom → coherence-square-homotopies (top ∙h H) left (inv-htpy H ∙h right) bottom right-splice-coherence-square-homotopies H K α coh x = right-splice-coherence-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( H x) ( K x) ( α x) ( coh x) right-unsplice-coherence-square-homotopies : {u : (x : A) → B x} (H : g ~ u) (K : u ~ g) (α : inv-htpy H ~ K) → coherence-square-homotopies (top ∙h H) left (inv-htpy H ∙h right) bottom → coherence-square-homotopies top left right bottom right-unsplice-coherence-square-homotopies H K α coh x = right-unsplice-coherence-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( H x) ( K x) ( α x) ( coh x) ``` ### Horizontally pasting squares of homotopies Consider two squares of homotopies as in the diagram ```text top-left top-right a -------------> b -------------> c | | | left | | middle | right ∨ ∨ ∨ d -------------> e -------------> f bottom-left bottom-right ``` with `H : left ∙h bottom-left ~ top-left ∙h middle` and `K : middle ∙h bottom-right ~ top-right ∙h right`. Then the outer square commutes. ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {a b c d e f : (x : A) → B x} (top-left : a ~ b) (top-right : b ~ c) (left : a ~ d) (middle : b ~ e) (right : c ~ f) (bottom-left : d ~ e) (bottom-right : e ~ f) where horizontal-pasting-coherence-square-homotopies : coherence-square-homotopies top-left left middle bottom-left → coherence-square-homotopies top-right middle right bottom-right → coherence-square-homotopies (top-left ∙h top-right) left right (bottom-left ∙h bottom-right) horizontal-pasting-coherence-square-homotopies H K x = horizontal-pasting-coherence-square-identifications ( top-left x) ( top-right x) ( left x) ( middle x) ( right x) ( bottom-left x) ( bottom-right x) ( H x) ( K x) ``` ### Vertically pasting squares of homotopies Consider two squares of homotopies as in the diagram ```text top a --------> b | | top-left | | top-right ∨ middle ∨ c --------> d | | bottom-left | | bottom-right ∨ ∨ e --------> f bottom ``` with `H : top-left ∙h middle ~ top ∙h top-right` and `K : bottom-left ∙h bottom ~ middle ∙h bottom-right`. Then the outer square commutes. ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {a b c d e f : (x : A) → B x} (top : a ~ b) (top-left : a ~ c) (top-right : b ~ d) (middle : c ~ d) (bottom-left : c ~ e) (bottom-right : d ~ f) (bottom : e ~ f) where vertical-pasting-coherence-square-homotopies : coherence-square-homotopies top top-left top-right middle → coherence-square-homotopies middle bottom-left bottom-right bottom → coherence-square-homotopies top (top-left ∙h bottom-left) (top-right ∙h bottom-right) bottom vertical-pasting-coherence-square-homotopies H K x = vertical-pasting-coherence-square-identifications ( top x) ( top-left x) ( top-right x) ( middle x) ( bottom-left x) ( bottom-right x) ( bottom x) ( H x) ( K x) ``` ## Properties ### Left unit law for horizontal pasting 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} where left-unit-law-horizontal-pasting-coherence-square-homotopies : (top : f ~ g) (left : f ~ h) (right : g ~ i) (bottom : h ~ i) → (H : coherence-square-homotopies top left right bottom) → horizontal-pasting-coherence-square-homotopies ( refl-htpy) ( top) ( left) ( left) ( right) ( refl-htpy) ( bottom) ( horizontal-refl-coherence-square-homotopies left) ( H) ~ H left-unit-law-horizontal-pasting-coherence-square-homotopies top left right bottom H x = left-unit-law-horizontal-pasting-coherence-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( H x) ``` ### Right unit law for horizontal pasting 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} where right-unit-law-horizontal-pasting-coherence-square-homotopies : (top : f ~ g) (left : f ~ h) (right : g ~ i) (bottom : h ~ i) → (H : coherence-square-homotopies top left right bottom) → horizontal-pasting-coherence-square-homotopies ( top) ( refl-htpy) ( left) ( right) ( right) ( bottom) ( refl-htpy) ( H) ( horizontal-refl-coherence-square-homotopies right) ∙h right-whisker-concat-htpy right-unit-htpy right ~ left-whisker-concat-htpy left right-unit-htpy ∙h H right-unit-law-horizontal-pasting-coherence-square-homotopies top left right bottom H x = right-unit-law-horizontal-pasting-coherence-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( H x) ``` ### Left unit law for vertical pasting 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} where left-unit-law-vertical-pasting-coherence-square-homotopies : (top : f ~ g) (left : f ~ h) (right : g ~ i) (bottom : h ~ i) → (H : coherence-square-homotopies top left right bottom) → vertical-pasting-coherence-square-homotopies ( top) ( refl-htpy) ( refl-htpy) ( top) ( left) ( right) ( bottom) ( vertical-refl-coherence-square-homotopies top) ( H) ~ H left-unit-law-vertical-pasting-coherence-square-homotopies top left right bottom H x = left-unit-law-vertical-pasting-coherence-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( H x) ``` ### Right unit law for vertical pasting 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} where right-unit-law-vertical-pasting-coherence-square-homotopies : (top : f ~ g) (left : f ~ h) (right : g ~ i) (bottom : h ~ i) → (H : coherence-square-homotopies top left right bottom) → vertical-pasting-coherence-square-homotopies ( top) ( left) ( right) ( bottom) ( refl-htpy) ( refl-htpy) ( bottom) ( H) ( vertical-refl-coherence-square-homotopies bottom) ∙h left-whisker-concat-htpy top right-unit-htpy ~ right-whisker-concat-htpy right-unit-htpy bottom ∙h H right-unit-law-vertical-pasting-coherence-square-homotopies top left right bottom H x = right-unit-law-vertical-pasting-coherence-square-identifications ( top x) ( left x) ( right x) ( bottom x) ( H x) ``` ### Computing the right whiskering of a vertically constant square with a homotopy Consider the vertically constant square of homotopies ```text H f -----> g | | refl | | refl ∨ ∨ f -----> g H ``` at a homotopy `H : f ~ g`, and consider a homotopy `K : g ~ h`. Then the right whiskering of the above square with `K` is the commuting square of homotopies ```text H f -------> g | | refl | refl | K ∨ ∨ f -------> h H ∙h K ``` ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g h : (x : A) → B x} where right-whisker-concat-vertical-refl-coherence-square-homotopies : (H : f ~ g) (K : g ~ h) → right-whisker-concat-coherence-square-homotopies H refl-htpy refl-htpy H ( vertical-refl-coherence-square-homotopies H) ( K) ~ refl-htpy right-whisker-concat-vertical-refl-coherence-square-homotopies H K x = right-whisker-concat-vertical-refl-coherence-square-identifications ( H x) ( K x) ``` ### Computing the right whiskering of a horizontally constant square with a homotopy Consider a horizontally constant commuting square of homotopies ```text refl-htpy f ----------> f | | H | | H ∨ ∨ g ----------> g refl-htpy ``` at a homotopy `H` and consider a homotopy `K : g ~ h`. Then the right whiskering of the above square with `K` is the square ```text refl-htpy f ----------> f | | H | refl-htpy | H ∙h K ∨ ∨ g ----------> h. K ``` ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g h : (x : A) → B x} where right-whisker-concat-horizontal-refl-coherence-square-homotopies : (H : f ~ g) (K : g ~ h) → right-whisker-concat-coherence-square-homotopies refl-htpy H H refl-htpy ( horizontal-refl-coherence-square-homotopies H) ( K) ~ refl-htpy right-whisker-concat-horizontal-refl-coherence-square-homotopies H K x = right-whisker-concat-horizontal-refl-coherence-square-identifications ( H x) ( K x) ``` ### Computing the left whiskering of a horizontally constant square with a homotopy Consider a homotopy `H : f ~ g` and a horizontally constant commuting square of homotopies ```text refl-htpy g ----------> g | | K | | K ∨ ∨ h ----------> h refl-htpy ``` at a homotopy `K : g ~ h`. The the left whiskering of the above square with `H` is the commuting square ```text K ∙h refl-htpy f -----------------------------------------------------------------> g | | K ∙h H | right-unit-htpy ∙h (right-whisker-concat-htpy right-unit-htpy H)⁻¹ | H ∨ ∨ h -----------------------------------------------------------------> h. refl-htpy ``` ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g h : (x : A) → B x} where left-whisker-concat-horizontal-refl-coherence-square-homotopies : (H : f ~ g) (K : g ~ h) → left-whisker-concat-coherence-square-homotopies H refl-htpy K K refl-htpy ( horizontal-refl-coherence-square-homotopies K) ∙h right-whisker-concat-htpy right-unit-htpy K ~ right-unit-htpy left-whisker-concat-horizontal-refl-coherence-square-homotopies H K x = left-whisker-concat-horizontal-refl-coherence-square-identifications ( H x) ( K x) left-whisker-concat-horizontal-refl-coherence-square-homotopies' : (H : f ~ g) (K : g ~ h) → left-whisker-concat-coherence-square-homotopies H refl-htpy K K refl-htpy ( horizontal-refl-coherence-square-homotopies K) ~ right-unit-htpy ∙h inv-htpy (right-whisker-concat-htpy right-unit-htpy K) left-whisker-concat-horizontal-refl-coherence-square-homotopies' H K x = left-whisker-concat-horizontal-refl-coherence-square-identifications' ( H x) ( K x) ``` ### Computing the left whiskering of a vertically constant square with a homotopy Consider the vertically constant square of homotopies ```text K g -----> h | | refl-htpy | | refl-htpy ∨ ∨ g -----> h K ``` at a homotopy `K : g ~ h` and consider a homotopy `H : f ~ g`. Then the left whiskering of the above square with `H` is the square ```text H ∙h K f ----------------------------------------------------------> h | | H ∙h refl-htpy | right-whisker-concat-htpy right-unit-htpy K ∙h right-unit⁻¹ | refl-htpy ∨ ∨ g ----------------------------------------------------------> h. K ``` ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f g h : (x : A) → B x} where left-whisker-concat-vertical-refl-coherence-square-homotopies : (H : f ~ g) (K : g ~ h) → left-whisker-concat-coherence-square-homotopies H K refl-htpy refl-htpy K ( vertical-refl-coherence-square-homotopies K) ∙h right-unit-htpy ~ right-whisker-concat-htpy right-unit-htpy K left-whisker-concat-vertical-refl-coherence-square-homotopies H K x = left-whisker-concat-vertical-refl-coherence-square-identifications ( H x) ( K x) left-whisker-concat-vertical-refl-coherence-square-homotopies' : (H : f ~ g) (K : g ~ h) → left-whisker-concat-coherence-square-homotopies H K refl-htpy refl-htpy K ( vertical-refl-coherence-square-homotopies K) ~ right-whisker-concat-htpy right-unit-htpy K ∙h inv-htpy right-unit-htpy left-whisker-concat-vertical-refl-coherence-square-homotopies' H K x = left-whisker-concat-vertical-refl-coherence-square-identifications' ( H x) ( K x) ``` ### Left whiskering horizontal concatenations of squares with homotopies Consider a commuting diagram of homotopies of the form ```text top-left top-right a -------------> c -------------> e | | | left | | middle | right ∨ ∨ ∨ b -------------> d -------------> f bottom-left bottom-right ``` and consider a homotopy `H : f ~ a`. Then the left whiskering of `H` and the horizontal concatenation of coherences of commuting squares is up to associativity the horizontal concatenation of the squares ```text H ∙h top-left top-right u -------------> c -------------> e | | | H ∙h left | | middle | right ∨ ∨ ∨ b -------------> d -------------> f bottom-left bottom-right ``` where the left square is the left whiskering of `H` and the original left square. ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} where left-whisker-concat-horizontal-pasting-coherence-square-homotopies : {u a b c d e f : (x : A) → B x} (H : u ~ a) (top-left : a ~ c) (top-right : c ~ e) (left : a ~ b) (middle : c ~ d) (right : e ~ f) (bottom-left : b ~ d) (bottom-right : d ~ f) (l : coherence-square-homotopies top-left left middle bottom-left) (r : coherence-square-homotopies top-right middle right bottom-right) → left-whisker-concat-coherence-square-homotopies H ( top-left ∙h top-right) ( left) ( right) ( bottom-left ∙h bottom-right) ( horizontal-pasting-coherence-square-homotopies ( top-left) ( top-right) ( left) ( middle) ( right) ( bottom-left) ( bottom-right) ( l) ( r)) ~ horizontal-pasting-coherence-square-homotopies ( H ∙h top-left) ( top-right) ( H ∙h left) ( middle) ( right) ( bottom-left) ( bottom-right) ( left-whisker-concat-coherence-square-homotopies H ( top-left) ( left) ( middle) ( bottom-left) ( l)) ( r) ∙h right-whisker-concat-htpy ( assoc-htpy H top-left top-right) ( right) left-whisker-concat-horizontal-pasting-coherence-square-homotopies H top-left top-right left middle right bottom-left bottom-right l r x = left-whisker-concat-horizontal-pasting-coherence-square-identifications ( H x) ( top-left x) ( top-right x) ( left x) ( middle x) ( right x) ( bottom-left x) ( bottom-right x) ( l x) ( r x) ``` ### Left whiskering vertical concatenations of squares with homotopies Consider two squares of homotopies as in the diagram ```text top a --------> b | | top-left | | top-right ∨ middle ∨ c --------> d | | bottom-left | | bottom-right ∨ ∨ e --------> f bottom ``` and consider a homotopy `H : f ~ a`. Then the left whiskering of `H` with the vertical pasting of the two squares above is up to associativity the vertical pasting of the squares ```text H ∙h top u --------> b | | H ∙h top-left | | top-right ∨ middle ∨ c --------> d | | bottom-left | | bottom-right ∨ ∨ e --------> f. bottom ``` ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} where left-whisker-concat-vertical-concat-coherence-square-homotopies : {u a b c d e f : (x : A) → B x} (H : u ~ a) → (top : a ~ b) (top-left : a ~ c) (top-right : b ~ d) (middle : c ~ d) (bottom-left : c ~ e) (bottom-right : d ~ f) (bottom : e ~ f) (t : coherence-square-homotopies top top-left top-right middle) → (b : coherence-square-homotopies middle bottom-left bottom-right bottom) → right-whisker-concat-htpy (assoc-htpy H top-left bottom-left) bottom ∙h left-whisker-concat-coherence-square-homotopies H ( top) ( top-left ∙h bottom-left) ( top-right ∙h bottom-right) ( bottom) ( vertical-pasting-coherence-square-homotopies ( top) ( top-left) ( top-right) ( middle) ( bottom-left) ( bottom-right) ( bottom) ( t) ( b)) ~ vertical-pasting-coherence-square-homotopies ( H ∙h top) ( H ∙h top-left) ( top-right) ( middle) ( bottom-left) ( bottom-right) ( bottom) ( left-whisker-concat-coherence-square-homotopies H ( top) ( top-left) ( top-right) ( middle) ( t)) ( b) left-whisker-concat-vertical-concat-coherence-square-homotopies H top top-left top-right middle bottom-left bottom-right bottom t b x = left-whisker-concat-vertical-concat-coherence-square-identifications ( H x) ( top x) ( top-left x) ( top-right x) ( middle x) ( bottom-left x) ( bottom-right x) ( bottom x) ( t x) ( b x) ``` ### Right whiskering horizontal pastings of commuting squares of homotopies Consider a commuting diagram of homotopies of the form ```text top-left top-right a -------------> c -------------> e | | | left | | middle | right ∨ ∨ ∨ b -------------> d -------------> f bottom-left bottom-right ``` and consider a homotopy `K : f ~ g`. Then the right whiskering of the horizontal pasting of the squares above is up to associativity the horizontal pasting of the squares ```text top-left top-right a -------------> c ------------------> e | | | left | | middle | right ∙h K ∨ ∨ ∨ b -------------> d ------------------> g bottom-left bottom-right ∙h K ``` ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} where right-whisker-concat-horizontal-pasting-coherence-square-homotopies : {a b c d e f g : (x : A) → B x} (top-left : a ~ c) (top-right : c ~ e) (left : a ~ b) (middle : c ~ d) (right : e ~ f) (bottom-left : b ~ d) (bottom-right : d ~ f) (l : coherence-square-homotopies top-left left middle bottom-left) → (r : coherence-square-homotopies top-right middle right bottom-right) → (K : f ~ g) → right-whisker-concat-coherence-square-homotopies ( top-left ∙h top-right) ( left) ( right) ( bottom-left ∙h bottom-right) ( horizontal-pasting-coherence-square-homotopies ( top-left) ( top-right) ( left) ( middle) ( right) ( bottom-left) ( bottom-right) ( l) ( r)) ( K) ~ left-whisker-concat-htpy left (assoc-htpy bottom-left bottom-right K) ∙h horizontal-pasting-coherence-square-homotopies ( top-left) ( top-right) ( left) ( middle) ( right ∙h K) ( bottom-left) ( bottom-right ∙h K) ( l) ( right-whisker-concat-coherence-square-homotopies ( top-right) ( middle) ( right) ( bottom-right) ( r) ( K)) right-whisker-concat-horizontal-pasting-coherence-square-homotopies top-left top-right left middle right bottom-left bottom-right l r K x = right-whisker-concat-horizontal-pasting-coherence-square-identifications ( top-left x) ( top-right x) ( left x) ( middle x) ( right x) ( bottom-left x) ( bottom-right x) ( l x) ( r x) ( K x) ``` ### Right whiskering vertical concatenations of squares with homotopies Consider two squares of homotopies as in the diagram ```text top a --------> b | | top-left | | top-right ∨ middle ∨ c --------> d | | bottom-left | | bottom-right ∨ ∨ e --------> f bottom ``` and consider a homotopy `K : f ~ g`. Then the right whiskering of the vertical pasting of the two squares above with `K` is up to associativity the vertical pasting of the squares ```text top a ------------> b | | top-left | | top-right ∨ middle ∨ c ------------> d | | bottom-left | | bottom-right ∙h K ∨ ∨ e ------------> g. bottom ∙h K ``` ```agda module _ {l1 l2 : Level} {A : UU l1} {B : A → UU l2} where right-whisker-concat-vertical-pasting-coherence-square-homotopies : {a b c d e f g : (x : A) → B x} (top : a ~ b) (top-left : a ~ c) (top-right : b ~ d) (middle : c ~ d) (bottom-left : c ~ e) (bottom-right : d ~ f) (bottom : e ~ f) (t : coherence-square-homotopies top top-left top-right middle) → (b : coherence-square-homotopies middle bottom-left bottom-right bottom) → (K : f ~ g) → right-whisker-concat-coherence-square-homotopies ( top) ( top-left ∙h bottom-left) ( top-right ∙h bottom-right) ( bottom) ( vertical-pasting-coherence-square-homotopies ( top) ( top-left) ( top-right) ( middle) ( bottom-left) ( bottom-right) ( bottom) ( t) ( b)) ( K) ∙h left-whisker-concat-htpy top (assoc-htpy top-right bottom-right K) ~ vertical-pasting-coherence-square-homotopies ( top) ( top-left) ( top-right) ( middle) ( bottom-left) ( bottom-right ∙h K) ( bottom ∙h K) ( t) ( right-whisker-concat-coherence-square-homotopies ( middle) ( bottom-left) ( bottom-right) ( bottom) ( b) ( K)) right-whisker-concat-vertical-pasting-coherence-square-homotopies top top-left top-right middle bottom-left bottom-right bottom t b K x = right-whisker-concat-vertical-pasting-coherence-square-identifications ( top x) ( top-left x) ( top-right x) ( middle x) ( bottom-left x) ( bottom-right x) ( bottom x) ( t x) ( b x) ( K x) ```