# Commuting triangles of maps ```agda module foundation-core.commuting-triangles-of-maps where ``` <details><summary>Imports</summary> ```agda open import foundation.universe-levels open import foundation.whiskering-homotopies-composition open import foundation-core.function-types open import foundation-core.homotopies open import foundation-core.retractions open import foundation-core.sections ``` </details> ## Idea A triangle of maps ```text top A ----> B \ / left \ / right ∨ ∨ X ``` is said to **commute** if there is a [homotopy](foundation-core.homotopies.md) between the map on the left and the composite of the top and right maps: ```text left ~ right ∘ top. ``` ## Definitions ### Commuting triangles of maps ```agda module _ {l1 l2 l3 : Level} {X : UU l1} {A : UU l2} {B : UU l3} where coherence-triangle-maps : (left : A → X) (right : B → X) (top : A → B) → UU (l1 ⊔ l2) coherence-triangle-maps left right top = left ~ right ∘ top coherence-triangle-maps' : (left : A → X) (right : B → X) (top : A → B) → UU (l1 ⊔ l2) coherence-triangle-maps' left right top = right ∘ top ~ left ``` ### Concatenation of commuting triangles of maps ```agda module _ {l1 l2 l3 l4 : Level} {X : UU l1} {A : UU l2} {B : UU l3} {C : UU l4} (f : A → X) (g : B → X) (h : C → X) (i : A → B) (j : B → C) where concat-coherence-triangle-maps : coherence-triangle-maps f g i → coherence-triangle-maps g h j → coherence-triangle-maps f h (j ∘ i) concat-coherence-triangle-maps H K = H ∙h (K ·r i) ``` ## Properties ### If the top map has a section, then the reversed triangle with the section on top commutes If `t : B → A` is a [section](foundation-core.sections.md) of the top map `h`, then the triangle ```text t B ------> A \ / g\ /f \ / ∨ ∨ X ``` commutes. ```agda module _ {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (f : A → X) (g : B → X) (h : A → B) (H : coherence-triangle-maps f g h) (t : section h) where inv-triangle-section : coherence-triangle-maps' g f (map-section h t) inv-triangle-section = (H ·r map-section h t) ∙h (g ·l is-section-map-section h t) triangle-section : coherence-triangle-maps g f (map-section h t) triangle-section = inv-htpy inv-triangle-section ``` ### If the right map has a retraction, then the reversed triangle with the retraction on the right commutes If `r : X → B` is a retraction of the right map `g` in a triangle `f ~ g ∘ h`, then the triangle ```text f A ------> X \ / h\ /r \ / ∨ ∨ B ``` commutes. ```agda module _ {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (f : A → X) (g : B → X) (h : A → B) (H : coherence-triangle-maps f g h) (r : retraction g) where inv-triangle-retraction : coherence-triangle-maps' h (map-retraction g r) f inv-triangle-retraction = (map-retraction g r ·l H) ∙h (is-retraction-map-retraction g r ·r h) triangle-retraction : coherence-triangle-maps h (map-retraction g r) f triangle-retraction = inv-htpy inv-triangle-retraction ```