# 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
```