# Commuting triangles of identifications
```agda
module foundation.commuting-triangles-of-identifications where
```
<details><summary>Imports</summary>
```agda
open import foundation.action-on-identifications-functions
open import foundation.binary-equivalences
open import foundation.dependent-pair-types
open import foundation.identity-types
open import foundation.universe-levels
open import foundation.whiskering-identifications-concatenation
open import foundation-core.commuting-squares-of-identifications
open import foundation-core.equivalences
```
</details>
## Idea
A triangle of [identifications](foundation-core.identity-types.md)
```text
top
x ----> y
\ /
left \ / right
∨ ∨
z
```
is said to **commute** if there is an identification `p = q ∙ r`.
## Definitions
### Commuting triangles of identifications
```agda
module _
{l : Level} {A : UU l} {x y z : A}
where
coherence-triangle-identifications :
(left : x = z) (right : y = z) (top : x = y) → UU l
coherence-triangle-identifications left right top = left = top ∙ right
coherence-triangle-identifications' :
(left : x = z) (right : y = z) (top : x = y) → UU l
coherence-triangle-identifications' left right top = top ∙ right = left
```
### The horizontally constant triangle of identifications
```agda
module _
{l : Level} {A : UU l} {x y : A}
where
horizontal-refl-coherence-triangle-identifications :
(p : x = y) → coherence-triangle-identifications p p refl
horizontal-refl-coherence-triangle-identifications p = refl
```
## Properties
### Whiskering of triangles of identifications
Given a commuting triangle of identifications
```text
top
x ----> y
\ /
left \ / right
∨ ∨
z,
```
we may consider three ways of attaching new identifications to it:
1. Prepending `p : u = x` to the left gives us a commuting triangle
```text
p ∙ top
u ----> y
\ /
p ∙ left \ / right
∨ ∨
z.
```
In other words, we have a map
```text
(left = top ∙ right) → (p ∙ left = (p ∙ top) ∙ right).
```
2. Appending an identification `p : z = u` to the right gives a commuting
triangle of identifications
```text
top
x ----> y
\ /
left ∙ p \ / right ∙ p
∨ ∨
u.
```
In other words, we have a map
```text
(left = top ∙ right) → (left ∙ p = top ∙ (right ∙ p)).
```
3. Splicing an identification `p : y = u` and its inverse into the middle gives
a commuting triangle of identifications
```text
top ∙ p
x ----> u
\ /
left \ / p⁻¹ ∙ right
∨ ∨
z.
```
In other words, we have a map
```text
(left = top ∙ right) → left = (top ∙ p) ∙ (p⁻¹ ∙ right).
```
Similarly, we have a map
```text
(left = top ∙ right) → left = (top ∙ p⁻¹) ∙ (p ∙ right).
```
Because concatenation of identifications is an
[equivalence](foundation-core.equivalences.md), it follows that all of these
transformations are equivalences.
These operations are useful in proofs involving
[path algebra](foundation.path-algebra.md), because taking
`equiv-right-whisker-triangle-identifications` as an example, it provides us
with two maps: the forward direction states
`(p = q ∙ r) → (p ∙ s = q ∙ (r ∙ s))`, 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 commuting squares of identifications
There is an equivalence of commuting squares
```text
top p ∙ top
x ----> y u ----> y
\ / \ /
left \ / right ≃ p ∙ left \ / right
∨ ∨ ∨ ∨
z z
```
for any identification `p : u = x`.
```agda
module _
{l : Level} {A : UU l} {x y z u : A}
(p : u = x) (left : x = z) (right : y = z) (top : x = y)
where
equiv-left-whisker-concat-coherence-triangle-identifications :
coherence-triangle-identifications left right top ≃
coherence-triangle-identifications (p ∙ left) right (p ∙ top)
equiv-left-whisker-concat-coherence-triangle-identifications =
( equiv-inv-concat' _ (assoc p top right)) ∘e
( equiv-left-whisker-concat p)
left-whisker-concat-coherence-triangle-identifications :
coherence-triangle-identifications left right top →
coherence-triangle-identifications (p ∙ left) right (p ∙ top)
left-whisker-concat-coherence-triangle-identifications =
map-equiv equiv-left-whisker-concat-coherence-triangle-identifications
left-unwhisker-concat-coherence-triangle-identifications :
coherence-triangle-identifications (p ∙ left) right (p ∙ top) →
coherence-triangle-identifications left right top
left-unwhisker-concat-coherence-triangle-identifications =
map-inv-equiv equiv-left-whisker-concat-coherence-triangle-identifications
is-equiv-left-whisker-concat-coherence-triangle-identifications :
is-equiv
( left-whisker-concat-coherence-triangle-identifications)
is-equiv-left-whisker-concat-coherence-triangle-identifications =
is-equiv-map-equiv
equiv-left-whisker-concat-coherence-triangle-identifications
equiv-left-whisker-concat-coherence-triangle-identifications' :
coherence-triangle-identifications' left right top ≃
coherence-triangle-identifications' (p ∙ left) right (p ∙ top)
equiv-left-whisker-concat-coherence-triangle-identifications' =
( equiv-concat (assoc p top right) _) ∘e
( equiv-left-whisker-concat p)
left-whisker-concat-coherence-triangle-identifications' :
coherence-triangle-identifications' left right top →
coherence-triangle-identifications' (p ∙ left) right (p ∙ top)
left-whisker-concat-coherence-triangle-identifications' =
map-equiv equiv-left-whisker-concat-coherence-triangle-identifications'
left-unwhisker-concat-coherence-triangle-identifications' :
coherence-triangle-identifications' (p ∙ left) right (p ∙ top) →
coherence-triangle-identifications' left right top
left-unwhisker-concat-coherence-triangle-identifications' =
map-inv-equiv equiv-left-whisker-concat-coherence-triangle-identifications'
is-equiv-left-whisker-concat-coherence-triangle-identifications' :
is-equiv left-whisker-concat-coherence-triangle-identifications'
is-equiv-left-whisker-concat-coherence-triangle-identifications' =
is-equiv-map-equiv
equiv-left-whisker-concat-coherence-triangle-identifications'
```
#### Right whiskering commuting squares of identifications
There is an equivalence of commuting triangles of identifications
```text
top top
x ----> y x ----> y
\ / \ /
left \ / right ≃ left ∙ p \ / right ∙ p
∨ ∨ ∨ ∨
z u
```
for any identification `p : z = u`.
```agda
module _
{l : Level} {A : UU l} {x y z u : A}
(left : x = z) (right : y = z) (top : x = y) (p : z = u)
where
equiv-right-whisker-concat-coherence-triangle-identifications :
coherence-triangle-identifications left right top ≃
coherence-triangle-identifications (left ∙ p) (right ∙ p) top
equiv-right-whisker-concat-coherence-triangle-identifications =
( equiv-concat-assoc' (left ∙ p) top right p) ∘e
( equiv-right-whisker-concat p)
right-whisker-concat-coherence-triangle-identifications :
coherence-triangle-identifications left right top →
coherence-triangle-identifications (left ∙ p) (right ∙ p) top
right-whisker-concat-coherence-triangle-identifications =
map-equiv equiv-right-whisker-concat-coherence-triangle-identifications
right-unwhisker-concat-coherence-triangle-identifications :
coherence-triangle-identifications (left ∙ p) (right ∙ p) top →
coherence-triangle-identifications left right top
right-unwhisker-concat-coherence-triangle-identifications =
map-inv-equiv equiv-right-whisker-concat-coherence-triangle-identifications
is-equiv-right-whisker-concat-coherence-triangle-identifications :
is-equiv right-whisker-concat-coherence-triangle-identifications
is-equiv-right-whisker-concat-coherence-triangle-identifications =
is-equiv-map-equiv
equiv-right-whisker-concat-coherence-triangle-identifications
equiv-right-whisker-concat-coherence-triangle-identifications' :
coherence-triangle-identifications' left right top ≃
coherence-triangle-identifications' (left ∙ p) (right ∙ p) top
equiv-right-whisker-concat-coherence-triangle-identifications' =
( equiv-concat-assoc top right p (left ∙ p)) ∘e
( equiv-right-whisker-concat p)
right-whisker-concat-coherence-triangle-identifications' :
coherence-triangle-identifications' left right top →
coherence-triangle-identifications' (left ∙ p) (right ∙ p) top
right-whisker-concat-coherence-triangle-identifications' =
map-equiv equiv-right-whisker-concat-coherence-triangle-identifications'
right-unwhisker-concat-coherence-triangle-identifications' :
coherence-triangle-identifications' (left ∙ p) (right ∙ p) top →
coherence-triangle-identifications' left right top
right-unwhisker-concat-coherence-triangle-identifications' =
map-inv-equiv equiv-right-whisker-concat-coherence-triangle-identifications'
is-equiv-right-whisker-concat-coherence-triangle-identifications' :
is-equiv right-whisker-concat-coherence-triangle-identifications'
is-equiv-right-whisker-concat-coherence-triangle-identifications' =
is-equiv-map-equiv
equiv-right-whisker-concat-coherence-triangle-identifications'
```
#### Splicing a pair of mutual inverse identifications in a commuting triangle of identifications
Consider two identifications `p : y = u` and `q : u = y` equipped with an
identification `α : inv p = q`. Then we have an equivalence of commuting
triangles of identifications
```text
top top ∙ p
x ----> y x ----> u
\ / \ /
left \ / right ≃ left \ / q ∙ right
∨ ∨ ∨ ∨
z z.
```
Note that we have formulated the equivalence in such a way that it gives us both
equivalences
```text
(left = top ∙ right) ≃ (left = (top ∙ p) ∙ (p⁻¹ ∙ right)),
```
and
```text
(left = top ∙ right) ≃ (left = (top ∙ p⁻¹) ∙ (p ∙ right))
```
without further ado.
```agda
module _
{l : Level} {A : UU l} {x y z u : A}
where
equiv-splice-coherence-triangle-identifications :
(p : y = u) (q : u = y) (α : inv p = q) →
(left : x = z) (right : y = z) (top : x = y) →
coherence-triangle-identifications left right top ≃
coherence-triangle-identifications left (q ∙ right) (top ∙ p)
equiv-splice-coherence-triangle-identifications refl .refl refl
left right top =
equiv-concat' left (right-whisker-concat (inv right-unit) right)
splice-coherence-triangle-identifications :
(p : y = u) (q : u = y) (α : inv p = q) →
(left : x = z) (right : y = z) (top : x = y) →
coherence-triangle-identifications left right top →
coherence-triangle-identifications left (q ∙ right) (top ∙ p)
splice-coherence-triangle-identifications refl .refl refl
left right top t =
t ∙ inv (right-whisker-concat right-unit right)
unsplice-coherence-triangle-identifications :
(p : y = u) (q : u = y) (α : inv p = q) →
(left : x = z) (right : y = z) (top : x = y) →
coherence-triangle-identifications left (q ∙ right) (top ∙ p) →
coherence-triangle-identifications left right top
unsplice-coherence-triangle-identifications refl .refl refl
left right top t =
t ∙ right-whisker-concat right-unit right
equiv-splice-coherence-triangle-identifications' :
(p : y = u) (q : u = y) (α : inv p = q) →
(left : x = z) (right : y = z) (top : x = y) →
coherence-triangle-identifications' left right top ≃
coherence-triangle-identifications' left (q ∙ right) (top ∙ p)
equiv-splice-coherence-triangle-identifications' refl .refl refl
left right top =
equiv-concat (right-whisker-concat right-unit right) left
splice-coherence-triangle-identifications' :
(p : y = u) (q : u = y) (α : inv p = q) →
(left : x = z) (right : y = z) (top : x = y) →
coherence-triangle-identifications' left right top →
coherence-triangle-identifications' left (q ∙ right) (top ∙ p)
splice-coherence-triangle-identifications' refl .refl refl
left right top t =
right-whisker-concat right-unit right ∙ t
unsplice-coherence-triangle-identifications' :
(p : y = u) (q : u = y) (α : inv p = q) →
(left : x = z) (right : y = z) (top : x = y) →
coherence-triangle-identifications' left (q ∙ right) (top ∙ p) →
coherence-triangle-identifications' left right top
unsplice-coherence-triangle-identifications' refl .refl refl
left right top t =
inv (right-whisker-concat right-unit right) ∙ t
```
### The action of functions on commuting triangles of identifications
Consider a commuting triangle of identifications
```text
top
x ----> y
\ /
left \ / right
∨ ∨
z
```
in a type `A` and consider a map `f : A → B`. Then we obtain a commuting
triangle of identifications
```text
ap f top
f x ----> f y
\ /
ap f left \ / ap f right
∨ ∨
f z
```
Furthermore, in the case where the identification `right` is `refl` we obtain an
identification
```text
inv right-unit =
map-coherence-triangle-identifications p refl p (inv right-unit)
```
and in the case where the identification `top` is `refl` we obtain
```text
refl = map-coherence-triangle-identifications p p refl refl.
```
```agda
module _
{l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B)
where
map-coherence-triangle-identifications :
{x y z : A} (left : x = z) (right : y = z) (top : x = y) →
coherence-triangle-identifications left right top →
coherence-triangle-identifications (ap f left) (ap f right) (ap f top)
map-coherence-triangle-identifications .(top ∙ right) right top refl =
ap-concat f top right
compute-refl-right-map-coherence-triangle-identifications :
{x y : A} (p : x = y) →
inv right-unit =
map-coherence-triangle-identifications p refl p (inv right-unit)
compute-refl-right-map-coherence-triangle-identifications refl = refl
compute-refl-top-map-coherence-triangle-identifications :
{x y : A} (p : x = y) →
refl = map-coherence-triangle-identifications p p refl refl
compute-refl-top-map-coherence-triangle-identifications p = refl
```
### Inverting one side of a commuting triangle of identifications
```agda
module _
{l1 : Level} {A : UU l1}
where
transpose-top-coherence-triangle-identifications :
{a b c : A} (left : a = c) (right : b = c) (top : b = a)
{top' : a = b} (α : inv top = top') →
coherence-triangle-identifications right left top →
coherence-triangle-identifications left right top'
transpose-top-coherence-triangle-identifications left right top refl t =
left-transpose-eq-concat _ _ _ (inv t)
equiv-transpose-top-coherence-triangle-identifications :
{a b c : A} (left : a = c) (right : b = c) (top : b = a) →
coherence-triangle-identifications right left top ≃
coherence-triangle-identifications left right (inv top)
equiv-transpose-top-coherence-triangle-identifications left right top =
equiv-left-transpose-eq-concat _ _ _ ∘e equiv-inv _ _
equiv-higher-transpose-top-coherence-triangle-identifications :
{a b c : A} (left : a = c) (right : b = c) (top : b = a)
{left' : a = c} (p : left = left')
{top' : a = b} (α : inv top = top') →
(s : coherence-triangle-identifications right left top) →
(t : coherence-triangle-identifications right left' top) →
coherence-triangle-identifications t (left-whisker-concat top p) s ≃
coherence-triangle-identifications
( transpose-top-coherence-triangle-identifications left right top α s)
( transpose-top-coherence-triangle-identifications left' right top α t)
( p)
equiv-higher-transpose-top-coherence-triangle-identifications
left right top refl refl s t =
( equiv-ap
( equiv-transpose-top-coherence-triangle-identifications left right top)
( _)
( _)) ∘e
( equiv-inv _ _) ∘e
( equiv-concat' _ right-unit)
higher-transpose-top-coherence-triangle-identifications :
{a b c : A} (left : a = c) (right : b = c) (top : b = a) →
{left' : a = c} (p : left = left')
{top' : a = b} (q : inv top = top') →
(s : coherence-triangle-identifications right left top) →
(t : coherence-triangle-identifications right left' top) →
coherence-triangle-identifications t (left-whisker-concat top p) s →
coherence-triangle-identifications
( transpose-top-coherence-triangle-identifications left right top q s)
( transpose-top-coherence-triangle-identifications left' right top q t)
( p)
higher-transpose-top-coherence-triangle-identifications
left right top p q s t =
map-equiv
( equiv-higher-transpose-top-coherence-triangle-identifications
left right top p q s t)
transpose-right-coherence-triangle-identifications :
{a b c : A} (left : a = c) (right : c = b) (top : a = b)
{right' : b = c} (p : inv right = right') →
coherence-triangle-identifications top right left →
coherence-triangle-identifications left right' top
transpose-right-coherence-triangle-identifications left right top refl t =
right-transpose-eq-concat _ _ _ (inv t)
equiv-transpose-right-coherence-triangle-identifications :
{a b c : A} (left : a = c) (right : c = b) (top : a = b) →
coherence-triangle-identifications top right left ≃
coherence-triangle-identifications left (inv right) top
equiv-transpose-right-coherence-triangle-identifications left right top =
equiv-right-transpose-eq-concat _ _ _ ∘e equiv-inv _ _
equiv-higher-transpose-right-coherence-triangle-identifications :
{a b c : A} (left : a = c) (right : c = b) (top : a = b) →
{left' : a = c} (p : left = left')
{right' : b = c} (q : inv right = right') →
(s : coherence-triangle-identifications top right left) →
(t : coherence-triangle-identifications top right left') →
coherence-triangle-identifications t (right-whisker-concat p right) s ≃
coherence-triangle-identifications
( transpose-right-coherence-triangle-identifications left right top q s)
( transpose-right-coherence-triangle-identifications left' right top q t)
( p)
equiv-higher-transpose-right-coherence-triangle-identifications
left right top refl refl s t =
( equiv-ap
( equiv-transpose-right-coherence-triangle-identifications left right top)
( _)
( _)) ∘e
( equiv-inv _ _) ∘e
( equiv-concat' t right-unit)
higher-transpose-right-coherence-triangle-identifications :
{a b c : A} (left : a = c) (right : c = b) (top : a = b) →
{left' : a = c} (p : left = left')
{right' : b = c} (q : inv right = right') →
(s : coherence-triangle-identifications top right left) →
(t : coherence-triangle-identifications top right left') →
coherence-triangle-identifications t (right-whisker-concat p right) s →
coherence-triangle-identifications
( transpose-right-coherence-triangle-identifications left right top q s)
( transpose-right-coherence-triangle-identifications left' right top q t)
( p)
higher-transpose-right-coherence-triangle-identifications
left right top p q s t =
map-equiv
( equiv-higher-transpose-right-coherence-triangle-identifications
( left)
( right)
( top)
( p)
( q)
( s)
( t))
```
### Inverting all sides of a commuting triangle of identifications
```agda
module _
{l1 : Level} {A : UU l1} {x y z : A}
where
inv-coherence-triangle-identifications :
(left : x = z) (right : y = z) (top : x = y) →
coherence-triangle-identifications left right top →
coherence-triangle-identifications (inv left) (inv top) (inv right)
inv-coherence-triangle-identifications .(top ∙ right) right top refl =
distributive-inv-concat top right
```
### Concatenating identifications on edges with coherences of commuting triangles of identifications
```agda
module _
{l1 : Level} {A : UU l1}
where
equiv-concat-top-coherence-triangle-identifications :
{a b c : A} (left : a = c) (right : b = c) (top : a = b)
{top' : a = b} (p : top' = top) →
coherence-triangle-identifications left right top' ≃
coherence-triangle-identifications left right top
equiv-concat-top-coherence-triangle-identifications left right top p =
equiv-concat' left (right-whisker-concat p right)
concat-top-coherence-triangle-identifications :
{a b c : A} (left : a = c) (right : b = c) (top : a = b)
{top' : a = b} (p : top' = top) →
coherence-triangle-identifications left right top' →
coherence-triangle-identifications left right top
concat-top-coherence-triangle-identifications left right top p =
map-equiv
( equiv-concat-top-coherence-triangle-identifications left right top p)
equiv-concat-right-coherence-triangle-identifications :
{a b c : A} (left : a = c) (right : b = c) (top : a = b)
{right' : b = c} (p : right' = right) →
coherence-triangle-identifications left right' top ≃
coherence-triangle-identifications left right top
equiv-concat-right-coherence-triangle-identifications left right top p =
equiv-concat' left (left-whisker-concat top p)
concat-right-coherence-triangle-identifications :
{a b c : A} (left : a = c) (right : b = c) (top : a = b)
{right' : b = c} (p : right' = right) →
coherence-triangle-identifications left right' top →
coherence-triangle-identifications left right top
concat-right-coherence-triangle-identifications left right top p =
map-equiv
( equiv-concat-right-coherence-triangle-identifications left right top p)
equiv-concat-left-coherence-triangle-identifications :
{a b c : A} (left : a = c) (right : b = c) (top : a = b)
{left' : a = c} (p : left = left') →
coherence-triangle-identifications left' right top ≃
coherence-triangle-identifications left right top
equiv-concat-left-coherence-triangle-identifications left right top p =
equiv-concat p (top ∙ right)
concat-left-coherence-triangle-identifications :
{a b c : A} (left : a = c) (right : b = c) (top : a = b)
{left' : a = c} (p : left = left') →
coherence-triangle-identifications left' right top →
coherence-triangle-identifications left right top
concat-left-coherence-triangle-identifications left right top p =
map-equiv
( equiv-concat-left-coherence-triangle-identifications left right top p)
```
### Horizontal pasting of commuting triangles of identifications
Consider a commuting diagram of identifications of the form
```text
top-left top-right
a ---> b ---> c
\ | /
left \ |m / right
\ | /
∨ ∨ ∨
d
```
Then the outer triangle commutes too. Indeed, an identification
`left = top-left ∙ middle` is given. Then, an identification
```text
top-left ∙ middle = (top-left ∙ top-right) ∙ right
```
is obtained immediately by left whiskering the right triangle with the
identification `top-left`. Note that this direct construction of the coherence
of the outer commuting triangle of identifications avoids any use of
associativity.
```agda
module _
{l : Level} {A : UU l}
{a b c d : A} (left : a = d) (middle : b = d) (right : c = d)
(top-left : a = b) (top-right : b = c)
where
horizontal-pasting-coherence-triangle-identifications :
coherence-triangle-identifications left middle top-left →
coherence-triangle-identifications middle right top-right →
coherence-triangle-identifications left right (top-left ∙ top-right)
horizontal-pasting-coherence-triangle-identifications s t =
( s) ∙
( left-whisker-concat-coherence-triangle-identifications
( top-left)
( middle)
( right)
( top-right)
( t))
```
### Horizontal pasting of commuting triangles of identifications is a binary equivalence
```agda
module _
{l : Level} {A : UU l}
{a b c d : A} (left : a = d) (middle : b = d) (right : c = d)
(top-left : a = b) (top-right : b = c)
where
abstract
is-equiv-horizontal-pasting-coherence-triangle-identifications :
(s : coherence-triangle-identifications left middle top-left) →
is-equiv
( horizontal-pasting-coherence-triangle-identifications
( left)
( middle)
( right)
( top-left)
( top-right)
( s))
is-equiv-horizontal-pasting-coherence-triangle-identifications s =
is-equiv-comp _ _
( is-equiv-left-whisker-concat-coherence-triangle-identifications
( top-left)
( middle)
( right)
( top-right))
( is-equiv-concat s _)
equiv-horizontal-pasting-coherence-triangle-identifications :
(s : coherence-triangle-identifications left middle top-left) →
coherence-triangle-identifications middle right top-right ≃
coherence-triangle-identifications left right (top-left ∙ top-right)
pr1 (equiv-horizontal-pasting-coherence-triangle-identifications s) =
horizontal-pasting-coherence-triangle-identifications _ _ _ _ _ s
pr2 (equiv-horizontal-pasting-coherence-triangle-identifications s) =
is-equiv-horizontal-pasting-coherence-triangle-identifications s
abstract
is-equiv-horizontal-pasting-coherence-triangle-identifications' :
(t : coherence-triangle-identifications middle right top-right) →
is-equiv
( λ s →
horizontal-pasting-coherence-triangle-identifications
( left)
( middle)
( right)
( top-left)
( top-right)
( s)
( t))
is-equiv-horizontal-pasting-coherence-triangle-identifications' t =
is-equiv-concat' _
( left-whisker-concat-coherence-triangle-identifications
( top-left)
( middle)
( right)
( top-right)
( t))
equiv-horizontal-pasting-coherence-triangle-identifications' :
(t : coherence-triangle-identifications middle right top-right) →
coherence-triangle-identifications left middle top-left ≃
coherence-triangle-identifications left right (top-left ∙ top-right)
pr1 (equiv-horizontal-pasting-coherence-triangle-identifications' t) s =
horizontal-pasting-coherence-triangle-identifications
( left)
( middle)
( right)
( top-left)
( top-right)
( s)
( t)
pr2 (equiv-horizontal-pasting-coherence-triangle-identifications' t) =
is-equiv-horizontal-pasting-coherence-triangle-identifications' t
is-binary-equiv-horizontal-pasting-coherence-triangle-identifications :
is-binary-equiv
( horizontal-pasting-coherence-triangle-identifications
( left)
( middle)
( right)
( top-left)
( top-right))
pr1 is-binary-equiv-horizontal-pasting-coherence-triangle-identifications =
is-equiv-horizontal-pasting-coherence-triangle-identifications'
pr2 is-binary-equiv-horizontal-pasting-coherence-triangle-identifications =
is-equiv-horizontal-pasting-coherence-triangle-identifications
```
### The left unit law for horizontal pastinf of commuting triangles of identifications
Consider a commuting triangle of identifications
```text
top
a ------> b
\ /
left \ / right
\ /
∨ ∨
c
```
with `t : left = top ∙ right`. Then we have an identification
```text
horizontal-pasting left left right refl top refl t = t
```
```agda
module _
{l : Level} {A : UU l} {a b c : A}
where
left-unit-law-horizontal-pasting-coherence-triangle-identifications :
(left : a = c) (right : b = c) (top : a = b) →
(t : coherence-triangle-identifications left right top) →
horizontal-pasting-coherence-triangle-identifications
( left)
( left)
( right)
( refl)
( top)
( refl)
( t) =
t
left-unit-law-horizontal-pasting-coherence-triangle-identifications
._ right top refl =
refl
```
### The left unit law for horizontal pastinf of commuting triangles of identifications
Consider a commuting triangle of identifications
```text
top
a ------> b
\ /
left \ / right
\ /
∨ ∨
c
```
with `t : left = top ∙ right`. Then we have a commuting triangle of
identifications
```text
horizontal-pasting t refl
left ----------------------> (top ∙ refl) ∙ right
\ /
\ /
t \ / right-whisker right-unit right
\ /
\ /
∨ ∨
top ∙ right
```
```agda
module _
{l : Level} {A : UU l} {a b c : A}
where
right-unit-law-horizontal-pasting-coherence-triangle-identifications :
(left : a = c) (right : b = c) (top : a = b) →
(t : coherence-triangle-identifications left right top) →
coherence-triangle-identifications
( t)
( right-whisker-concat right-unit right)
( horizontal-pasting-coherence-triangle-identifications
( left)
( right)
( right)
( top)
( refl)
( t)
( refl))
right-unit-law-horizontal-pasting-coherence-triangle-identifications
._ right refl refl = refl
```
### Associativity of horizontal pasting of coherences of commuting triangles of identifications
```agda
module _
{l : Level} {A : UU l} {a b c d e : A}
where
associative-horizontal-pasting-coherence-triangle-identifications :
(left : a = e) (mid-left : b = e) (mid-right : c = e) (right : d = e)
(top-left : a = b) (top-middle : b = c) (top-right : c = d)
(r : coherence-triangle-identifications left mid-left top-left) →
(s : coherence-triangle-identifications mid-left mid-right top-middle) →
(t : coherence-triangle-identifications mid-right right top-right) →
coherence-triangle-identifications
( horizontal-pasting-coherence-triangle-identifications
( left)
( mid-left)
( right)
( top-left)
( top-middle ∙ top-right)
( r)
( horizontal-pasting-coherence-triangle-identifications
( mid-left)
( mid-right)
( right)
( top-middle)
( top-right)
( s)
( t)))
( right-whisker-concat (assoc top-left top-middle top-right) right)
( horizontal-pasting-coherence-triangle-identifications
( left)
( mid-right)
( right)
( top-left ∙ top-middle)
( top-right)
( horizontal-pasting-coherence-triangle-identifications
( left)
( mid-left)
( mid-right)
( top-left)
( top-middle)
( r)
( s))
( t))
associative-horizontal-pasting-coherence-triangle-identifications
refl .refl .refl .refl refl refl refl refl refl refl =
refl
```
### Left whiskering of horizontal pasting of commuting triangles of identifications
Consider two commuting triangles of identifications as in the diagram
```text
s t
a ----> b ----> c
\ | /
\ L | R /
l \ |m / r
\ | /
∨ ∨ ∨
d,
```
and consider furthermore a commuting triangle of identifications
```text
t'
b ----> c
| /
| R' /
m | / r
| /
∨ ∨
d
```
where the identifications `m : b = d` and `r : c = d` are the same as in the
previous diagram. Finally, consider an identification `p : t = t'` and an
identification `q` witnessing that the triangle
```text
R
m ------> t ∙ r
\ /
R' \ / right-whisker p r
\ /
∨ ∨
t' ∙ r
```
commutes. Then the triangle
```text
horizontal-pasting L R
l ----------------> (s ∙ t) ∙ r
\ /
\ /
horizontal-pasting L R' \ / right-whisker (left-whisker s p) r
\ /
∨ ∨
(s ∙ t') ∙ r
```
commutes.
```agda
module _
{l : Level} {A : UU l} {a b c d : A}
where
left-whisker-horizontal-pasting-coherence-triangle-identifications :
(left : a = d) (middle : b = d) (right : c = d)
(top-left : a = b) (top-right top-right' : b = c) →
(L : coherence-triangle-identifications left middle top-left)
(R : coherence-triangle-identifications middle right top-right)
(R' : coherence-triangle-identifications middle right top-right')
(p : top-right = top-right') →
coherence-triangle-identifications R' (right-whisker-concat p right) R →
coherence-triangle-identifications
( horizontal-pasting-coherence-triangle-identifications
( left)
( middle)
( right)
( top-left)
( top-right')
( L)
( R'))
( right-whisker-concat (left-whisker-concat top-left p) right)
( horizontal-pasting-coherence-triangle-identifications
( left)
( middle)
( right)
( top-left)
( top-right)
( L)
( R))
left-whisker-horizontal-pasting-coherence-triangle-identifications
._ ._ refl refl refl .refl refl refl ._ refl refl =
refl
```
### Right whiskering of horizontal pasting of commuting triangles of identifications
Consider two commuting triangles of identifications as in the diagram
```text
s t
a ----> b ----> c
\ | /
\ L | R /
l \ |m / r
\ | /
∨ ∨ ∨
d,
```
and consider furthermore a commuting triangle of identifications
```text
s'
a ----> b
\ |
\ L' |
l \ |m
\ |
∨ ∨
d,
```
where the identifications `m : b = d` and `l : a = d` are the same as in the
previous diagram. Finally, consider an identification `p : s = s'` and an
identification `q` witnessing that the triangle
```text
L
l ------> s ∙ m
\ /
L' \ / right-whisker p m
\ /
∨ ∨
s' ∙ r
```
commutes. Then the triangle
```text
horizontal-pasting L R
l ----------------> (s ∙ t) ∙ r
\ /
\ /
horizontal-pasting L R' \ / right-whisker (right-whisker p t) r
\ /
∨ ∨
(s' ∙ t) ∙ r
```
commutes.
```agda
module _
{l : Level} {A : UU l} {a b c d : A}
where
right-whisker-horizontal-pasting-coherence-triangle-identifications :
(left : a = d) (middle : b = d) (right : c = d)
(top-left top-left' : a = b) (top-right : b = c) →
(L : coherence-triangle-identifications left middle top-left)
(L' : coherence-triangle-identifications left middle top-left')
(R : coherence-triangle-identifications middle right top-right)
(p : top-left = top-left') →
coherence-triangle-identifications L' (right-whisker-concat p middle) L →
coherence-triangle-identifications
( horizontal-pasting-coherence-triangle-identifications
( left)
( middle)
( right)
( top-left')
( top-right)
( L')
( R))
( right-whisker-concat (right-whisker-concat p top-right) right)
( horizontal-pasting-coherence-triangle-identifications
( left)
( middle)
( right)
( top-left)
( top-right)
( L)
( R))
right-whisker-horizontal-pasting-coherence-triangle-identifications
refl .refl .refl refl .refl refl refl ._ refl refl refl =
refl
```
### Right pasting of commuting triangles of identifications
Consider a commuting diagram of identifications of the form
```text
top
a ------------> b
\ ⎻⎽ /
\ ⎺⎽ mid / top-right
\ ⎺⎽ ∨
left \ ⎺> c
\ /
\ / bottom-right
∨ ∨
d
```
Then the outer triangle commutes too. Indeed, an identification
`left = mid ∙ bottom-right` is given. Then, an identification
```text
mid ∙ bottom-right = top ∙ (top-right ∙ bottom-right)
```
is obtained immediately by right whiskering the upper triangle with the
identification `bottom-right`. Note that this direct construction of the
coherence of the outer commuting triangle of identifications avoids any use of
associativity.
```agda
module _
{l : Level} {A : UU l} {a b c d : A}
(left : a = d) (top-right : b = c) (bottom-right : c = d)
(middle : a = c) (top : a = b)
where
right-pasting-coherence-triangle-identifications :
(s : coherence-triangle-identifications left bottom-right middle) →
(t : coherence-triangle-identifications middle top-right top) →
coherence-triangle-identifications left (top-right ∙ bottom-right) top
right-pasting-coherence-triangle-identifications s t =
( s) ∙
( right-whisker-concat-coherence-triangle-identifications
( middle)
( top-right)
( top)
( bottom-right)
( t))
```
### Right pasting commuting triangles of identifications is a binary equivalence
```agda
module _
{l : Level} {A : UU l} {a b c d : A}
(left : a = d) (top-right : b = c) (bottom-right : c = d)
(middle : a = c) (top : a = b)
where
abstract
is-equiv-right-pasting-coherence-triangle-identifications :
(s : coherence-triangle-identifications left bottom-right middle) →
is-equiv
( right-pasting-coherence-triangle-identifications
( left)
( top-right)
( bottom-right)
( middle)
( top)
( s))
is-equiv-right-pasting-coherence-triangle-identifications s =
is-equiv-comp _ _
( is-equiv-right-whisker-concat-coherence-triangle-identifications
( middle)
( top-right)
( top)
( bottom-right))
( is-equiv-concat s _)
equiv-right-pasting-coherence-triangle-identifications :
(s : coherence-triangle-identifications left bottom-right middle) →
coherence-triangle-identifications middle top-right top ≃
coherence-triangle-identifications left (top-right ∙ bottom-right) top
pr1 (equiv-right-pasting-coherence-triangle-identifications s) =
right-pasting-coherence-triangle-identifications
( left)
( top-right)
( bottom-right)
( middle)
( top)
( s)
pr2 (equiv-right-pasting-coherence-triangle-identifications s) =
is-equiv-right-pasting-coherence-triangle-identifications s
abstract
is-equiv-right-pasting-coherence-triangle-identifications' :
(t : coherence-triangle-identifications middle top-right top) →
is-equiv
( λ (s : coherence-triangle-identifications left bottom-right middle) →
right-pasting-coherence-triangle-identifications
( left)
( top-right)
( bottom-right)
( middle)
( top)
( s)
( t))
is-equiv-right-pasting-coherence-triangle-identifications' t =
is-equiv-concat' _
( right-whisker-concat-coherence-triangle-identifications
( middle)
( top-right)
( top)
( bottom-right)
( t))
equiv-right-pasting-coherence-triangle-identifications' :
(t : coherence-triangle-identifications middle top-right top) →
coherence-triangle-identifications left bottom-right middle ≃
coherence-triangle-identifications left (top-right ∙ bottom-right) top
pr1 (equiv-right-pasting-coherence-triangle-identifications' t) s =
right-pasting-coherence-triangle-identifications
( left)
( top-right)
( bottom-right)
( middle)
( top)
( s)
( t)
pr2 (equiv-right-pasting-coherence-triangle-identifications' t) =
is-equiv-right-pasting-coherence-triangle-identifications' t
is-binary-equiv-right-pasting-coherence-triangle-identifications :
is-binary-equiv
( right-pasting-coherence-triangle-identifications
( left)
( top-right)
( bottom-right)
( middle)
( top))
pr1 is-binary-equiv-right-pasting-coherence-triangle-identifications =
is-equiv-right-pasting-coherence-triangle-identifications'
pr2 is-binary-equiv-right-pasting-coherence-triangle-identifications =
is-equiv-right-pasting-coherence-triangle-identifications
```
### Left pasting of commuting triangles of identifications
**Note.** For left pasting there are two potential constructions. One takes a
commuting diagram of identifications of the form
```text
top
a ------------> b
\ ⎽⎻ /
top-left \ m ⎽⎺ /
∨ ⎽⎺ /
c <⎺ / right
\ /
bottom-left \ /
∨ ∨
d
```
and returns an identification witnessing that the outer triangle commutes. In
this case the top triangle is an ordinary commuting triangle of identifications,
and the bottom triangle is inverted along the top edge `m`.
The other left pasting of commuting triangles of identifications takes a
commuting diagram of identifications of the form
```text
top
a ------------> b
\ ⎽-> /
top-left \ m ⎽⎺ /
∨ ⎽⎺ /
c ⎺ / right
\ /
bottom-left \ /
∨ ∨
d
```
and returns an identification witnessing that the outer rectangle commutes. In
this case the bottom triangle of identifications is an ordinary commuting
triangle of identifications, and the top triangle is inverted along the right
edge `m`.
Both constructions have yet to be formalized.
### Vertically pasting commuting squares and commuting triangles of identifications
Consider a diagram of the form
```text
top
a ------------> b
\ /
top-left \ / top-right
∨ mid ∨
c ----> d
\ /
bottom-left \ / bottom-right
∨ ∨
e
```
with `s : top-left ∙ mid = top ∙ top-right` witnessing that the square
commutes, and with `t : bottom-left = mid ∙ bottom-right` witnessing that the
triangle commutes. Then the outer triangle commutes.
```agda
module _
{l : Level} {A : UU l}
where
vertical-pasting-coherence-square-coherence-triangle-identifications :
{a b c d e : A}
(top : a = b) (top-left : a = c) (top-right : b = d) (mid : c = d)
(bottom-left : c = e) (bottom-right : d = e) →
coherence-square-identifications top top-left top-right mid →
coherence-triangle-identifications bottom-left bottom-right mid →
coherence-triangle-identifications
( top-left ∙ bottom-left)
( top-right ∙ bottom-right)
( top)
vertical-pasting-coherence-square-coherence-triangle-identifications
top top-left top-right mid bottom-left bottom-right s t =
( left-whisker-concat top-left t) ∙
( right-whisker-concat-coherence-square-identifications
( top)
( top-left)
( top-right)
( mid)
( s)
( bottom-right))
```
### Vertical pasting of horizontally constant commuting squares of identifications and commuting triangles of identifications
```agda
module _
{l : Level} {A : UU l}
where
vertical-pasting-coherence-horizontally-constant-square-coherence-triangle-identifications :
{a c e : A} (p : a = c)
(bottom-left : c = e) (bottom-right : c = e) →
(t : coherence-triangle-identifications bottom-left bottom-right refl) →
( vertical-pasting-coherence-square-coherence-triangle-identifications
( refl)
( p)
( p)
( refl)
( bottom-left)
( bottom-right)
( horizontal-refl-coherence-square-identifications p)
( t)) =
( left-whisker-concat p t)
vertical-pasting-coherence-horizontally-constant-square-coherence-triangle-identifications
refl refl .refl refl =
refl
```
### Vertical pasting of verticaly constant commuting squares of identifications and commuting triangles of identifications
```agda
module _
{l : Level} {A : UU l}
where
vertical-pasting-coherence-vertically-constant-square-coherence-triangle-identifications :
{a b c : A} (left : a = c) (right : b = c) (top : a = b) →
(t : coherence-triangle-identifications left right top) →
( vertical-pasting-coherence-square-coherence-triangle-identifications
( top)
( refl)
( refl)
( top)
( left)
( right)
( vertical-refl-coherence-square-identifications top)
( t)) =
t
vertical-pasting-coherence-vertically-constant-square-coherence-triangle-identifications
._ refl refl refl = refl
```