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