# Commuting triangles of maps
```agda
module foundation.commuting-triangles-of-maps where
open import foundation-core.commuting-triangles-of-maps public
```
<details><summary>Imports</summary>
```agda
open import foundation.action-on-identifications-functions
open import foundation.functoriality-dependent-function-types
open import foundation.homotopies
open import foundation.homotopy-algebra
open import foundation.identity-types
open import foundation.postcomposition-functions
open import foundation.precomposition-functions
open import foundation.universe-levels
open import foundation.whiskering-homotopies-composition
open import foundation-core.commuting-squares-of-maps
open import foundation-core.equivalences
open import foundation-core.function-types
open import foundation-core.whiskering-identifications-concatenation
```
</details>
## Idea
A triangle of maps
```text
A ----> B
\ /
\ /
∨ ∨
X
```
is said to **commute** if there is a [homotopy](foundation-core.homotopies.md)
between the map on the left and the composite map.
## Properties
### Top map is an equivalence
If the top map is an [equivalence](foundation-core.equivalences.md), then there
is an equivalence between the coherence triangle with the map of the equivalence
as with the inverse map of the equivalence.
```agda
module _
{l1 l2 l3 : Level} {X : UU l1} {A : UU l2} {B : UU l3}
(left : A → X) (right : B → X) (e : A ≃ B)
where
equiv-coherence-triangle-maps-inv-top' :
coherence-triangle-maps left right (map-equiv e) ≃
coherence-triangle-maps' right left (map-inv-equiv e)
equiv-coherence-triangle-maps-inv-top' =
equiv-Π
( λ b → left (map-inv-equiv e b) = right b)
( e)
( λ a →
equiv-concat
( ap left (is-retraction-map-inv-equiv e a))
( right (map-equiv e a)))
equiv-coherence-triangle-maps-inv-top :
coherence-triangle-maps left right (map-equiv e) ≃
coherence-triangle-maps right left (map-inv-equiv e)
equiv-coherence-triangle-maps-inv-top =
( equiv-inv-htpy
( left ∘ (map-inv-equiv e))
( right)) ∘e
( equiv-coherence-triangle-maps-inv-top')
coherence-triangle-maps-inv-top :
coherence-triangle-maps left right (map-equiv e) →
coherence-triangle-maps right left (map-inv-equiv e)
coherence-triangle-maps-inv-top =
map-equiv equiv-coherence-triangle-maps-inv-top
```
### Commuting triangles of maps induce commuting triangles of precomposition maps
Given a commuting triangle of maps
```text
f
A ----> B
\ ⇗ /
h \ / g
∨ ∨
X
```
there is an induced commuting triangle of
[precomposition maps](foundation-core.precomposition-functions.md)
```text
(- ∘ g)
(X → S) ----> (B → S)
\ ⇗ /
(- ∘ h) \ / (- ∘ f)
∨ ∨
(A → S).
```
Note the change of order of `f` and `g`.
```agda
module _
{ l1 l2 l3 l4 : Level} {X : UU l1} {A : UU l2} {B : UU l3}
( left : A → X) (right : B → X) (top : A → B)
where
precomp-coherence-triangle-maps :
coherence-triangle-maps left right top →
(S : UU l4) →
coherence-triangle-maps
( precomp left S)
( precomp top S)
( precomp right S)
precomp-coherence-triangle-maps = htpy-precomp
precomp-coherence-triangle-maps' :
coherence-triangle-maps' left right top →
(S : UU l4) →
coherence-triangle-maps'
( precomp left S)
( precomp top S)
( precomp right S)
precomp-coherence-triangle-maps' = htpy-precomp
```
### Commuting triangles of maps induce commuting triangles of postcomposition maps
Given a commuting triangle of maps
```text
f
A ----> B
\ ⇗ /
h \ / g
∨ ∨
X
```
there is an induced commuting triangle of
[postcomposition maps](foundation-core.postcomposition-functions.md)
```text
(f ∘ -)
(S → A) ----> (S → B)
\ ⇗ /
(h ∘ -) \ / (g ∘ -)
∨ ∨
(S → X).
```
```agda
module _
{ l1 l2 l3 l4 : Level} {X : UU l1} {A : UU l2} {B : UU l3}
( left : A → X) (right : B → X) (top : A → B)
where
postcomp-coherence-triangle-maps :
(S : UU l4) →
coherence-triangle-maps left right top →
coherence-triangle-maps
( postcomp S left)
( postcomp S right)
( postcomp S top)
postcomp-coherence-triangle-maps S = htpy-postcomp S
postcomp-coherence-triangle-maps' :
(S : UU l4) →
coherence-triangle-maps' left right top →
coherence-triangle-maps'
( postcomp S left)
( postcomp S right)
( postcomp S top)
postcomp-coherence-triangle-maps' S = htpy-postcomp S
```
### Coherences of commuting triangles of maps with fixed vertices
This or its opposite should be the coherence in the characterization of
identifications of commuting triangles of maps with fixed end vertices.
```agda
module _
{l1 l2 l3 : Level} {X : UU l1} {A : UU l2} {B : UU l3}
(left : A → X) (right : B → X) (top : A → B)
(left' : A → X) (right' : B → X) (top' : A → B)
(c : coherence-triangle-maps left right top)
(c' : coherence-triangle-maps left' right' top')
where
coherence-htpy-triangle-maps :
left ~ left' → right ~ right' → top ~ top' → UU (l1 ⊔ l2)
coherence-htpy-triangle-maps L R T =
c ∙h horizontal-concat-htpy R T ~ L ∙h c'
```
### Pasting commuting triangles into commuting squares along homotopic diagonals
Two [commuting triangles](foundation-core.commuting-triangles-of-maps.md)
```text
A A --> X
| \ \ |
| \ H L K \ |
| \ \ |
∨ ∨ ∨ ∨
B --> Y Y
```
with a [homotopic](foundation-core.homotopies.md) diagonal may be pasted into a
[commuting square](foundation-core.commuting-squares-of-maps.md)
```text
A -----> X
| |
| |
∨ ∨
B -----> Y.
```
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(top : A → X) (left : A → B) (right : X → Y) (bottom : B → Y)
where
horizontal-pasting-htpy-coherence-triangle-maps :
{diagonal-left diagonal-right : A → Y} →
diagonal-left ~ diagonal-right →
coherence-triangle-maps' diagonal-left bottom left →
coherence-triangle-maps diagonal-right right top →
coherence-square-maps top left right bottom
horizontal-pasting-htpy-coherence-triangle-maps L H K = (H ∙h L) ∙h K
horizontal-pasting-htpy-coherence-triangle-maps' :
{diagonal-left diagonal-right : A → Y} →
diagonal-left ~ diagonal-right →
coherence-triangle-maps' diagonal-left bottom left →
coherence-triangle-maps diagonal-right right top →
coherence-square-maps top left right bottom
horizontal-pasting-htpy-coherence-triangle-maps' L H K = H ∙h (L ∙h K)
horizontal-pasting-coherence-triangle-maps :
(diagonal : A → Y) →
coherence-triangle-maps' diagonal bottom left →
coherence-triangle-maps diagonal right top →
coherence-square-maps top left right bottom
horizontal-pasting-coherence-triangle-maps diagonal H K = H ∙h K
compute-refl-htpy-horizontal-pasting-coherence-triangle-maps :
(diagonal : A → Y) →
(H : coherence-triangle-maps' diagonal bottom left) →
(K : coherence-triangle-maps diagonal right top) →
horizontal-pasting-htpy-coherence-triangle-maps refl-htpy H K ~
horizontal-pasting-coherence-triangle-maps diagonal H K
compute-refl-htpy-horizontal-pasting-coherence-triangle-maps diagonal H K x =
right-whisker-concat right-unit (K x)
```
We can also consider pasting triangles of the form
```text
A --> X X
| ∧ ∧ |
| H / / |
| / / K |
∨ / / ∨
B B --> Y .
```
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
(top : A → X) (left : A → B) (right : X → Y) (bottom : B → Y)
{diagonal : B → X}
where
horizontal-pasting-up-diagonal-coherence-triangle-maps :
coherence-triangle-maps' top diagonal left →
coherence-triangle-maps bottom right diagonal →
coherence-square-maps top left right bottom
horizontal-pasting-up-diagonal-coherence-triangle-maps H K =
(K ·r left) ∙h (right ·l H)
```