# Composition algebra
```agda
module foundation.composition-algebra where
```
<details><summary>Imports</summary>
```agda
open import foundation.action-on-identifications-functions
open import foundation.function-extensionality
open import foundation.homotopy-induction
open import foundation.postcomposition-functions
open import foundation.precomposition-functions
open import foundation.universe-levels
open import foundation.whiskering-higher-homotopies-composition
open import foundation.whiskering-homotopies-composition
open import foundation-core.function-types
open import foundation-core.homotopies
open import foundation-core.identity-types
```
</details>
## Idea
Given a [homotopy of maps](foundation-core.homotopies.md) `H : f ~ g`, there are
standard witnesses
```text
htpy-precomp H S : precomp f S ~ precomp g S
```
and
```text
htpy-postcomp S H : postcomp S f ~ postcomp S g.
```
This file records their interactions with eachother and different operations on
homotopies.
## Properties
### Precomposition distributes over whiskerings of homotopies
The operation `htpy-precomp` distributes over
[whiskerings of homotopies](foundation.whiskering-homotopies-composition.md)
contravariantly. Given a homotopy `H : f ~ g` and a suitable map `h` the
homotopy constructed as the whiskering
```text
- ∘ f
-----------------> - ∘ h
(B → S) htpy-precomp H S (A → S) -----> (C → S)
----------------->
- ∘ g
```
is homotopic to the homotopy
```text
- ∘ (f ∘ h)
-------------------------->
(B → S) htpy-precomp (H ·r h) S (C → S).
-------------------------->
- ∘ (g ∘ h)
```
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {C : UU l3}
{f g : A → B}
where
inv-distributive-htpy-precomp-right-whisker :
(h : C → A) (H : f ~ g) (S : UU l4) →
precomp h S ·l htpy-precomp H S ~ htpy-precomp (H ·r h) S
inv-distributive-htpy-precomp-right-whisker h H S i =
compute-eq-htpy-ap-precomp h (i ·l H)
distributive-htpy-precomp-right-whisker :
(h : C → A) (H : f ~ g) (S : UU l4) →
htpy-precomp (H ·r h) S ~ precomp h S ·l htpy-precomp H S
distributive-htpy-precomp-right-whisker h H S =
inv-htpy (inv-distributive-htpy-precomp-right-whisker h H S)
```
Similarly, the homotopy given by the whiskering
```text
- ∘ f
- ∘ h ----------------->
(C → S) -----> (B → S) htpy-precomp H S (A → S)
----------------->
- ∘ g
```
is homotopic to the homotopy
```text
- ∘ (h ∘ f)
-------------------------->
(C → S) htpy-precomp (h · l H) S (A → S).
-------------------------->
- ∘ (h ∘ g)
```
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {C : UU l3}
{f g : A → B}
where
inv-distributive-htpy-precomp-left-whisker :
(h : B → C) (H : f ~ g) (S : UU l4) →
htpy-precomp H S ·r precomp h S ~ htpy-precomp (h ·l H) S
inv-distributive-htpy-precomp-left-whisker h H S i =
ap eq-htpy (eq-htpy (ap-comp i h ∘ H))
distributive-htpy-precomp-left-whisker :
(h : B → C) (H : f ~ g) (S : UU l4) →
htpy-precomp (h ·l H) S ~ htpy-precomp H S ·r precomp h S
distributive-htpy-precomp-left-whisker h H S =
inv-htpy (inv-distributive-htpy-precomp-left-whisker h H S)
```
### Precomposition distributes over concatenations of homotopies
```agda
module _
{l1 l2 l3 : Level} {A : UU l1} {B : UU l2}
{f g h : A → B}
where
distributive-htpy-precomp-concat-htpy :
(H : f ~ g) (K : g ~ h) (S : UU l3) →
htpy-precomp (H ∙h K) S ~ htpy-precomp H S ∙h htpy-precomp K S
distributive-htpy-precomp-concat-htpy H K S i =
( ap eq-htpy (eq-htpy (distributive-left-whisker-comp-concat i H K))) ∙
( eq-htpy-concat-htpy (i ·l H) (i ·l K))
```
### Postcomposition distributes over whiskerings of homotopies
Given a homotopy `H : f ~ g` and a suitable map `h` the homotopy given by the
whiskering
```text
f ∘ –
h ∘ - ------------------>
(S → C) -----> (S → B) htpy-postcomp S H (S → A)
------------------>
g ∘ -
```
is homotopic to the homotopy
```text
(f ∘ h) ∘ -
-------------------------->
(S → C) htpy-postcomp S (H ·r h) (S → A).
-------------------------->
(g ∘ h) ∘ -
```
In fact, they are syntactically equal.
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {C : UU l3}
{f g : A → B}
where
inv-distributive-htpy-postcomp-right-whisker :
(h : C → A) (H : f ~ g) (S : UU l4) →
htpy-postcomp S (H ·r h) ~ htpy-postcomp S H ·r postcomp S h
inv-distributive-htpy-postcomp-right-whisker h H S = refl-htpy
distributive-htpy-postcomp-right-whisker :
(h : C → A) (H : f ~ g) (S : UU l4) →
htpy-postcomp S H ·r postcomp S h ~ htpy-postcomp S (H ·r h)
distributive-htpy-postcomp-right-whisker h H S = refl-htpy
```
Similarly, the homotopy given by the whiskering
```text
f ∘ -
-----------------> h ∘ -
(S → A) htpy-postcomp S H (S → B) -----> (S → C)
----------------->
g ∘ -
```
is homotopic to the homotopy
```text
(h ∘ f) ∘ -
-------------------------->
(S → A) htpy-postcomp S (h ·l H) (S → C).
-------------------------->
(h ∘ g) ∘ -
```
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {C : UU l3}
{f g : A → B}
where
inv-distributive-htpy-postcomp-left-whisker :
(h : B → C) (H : f ~ g) (S : UU l4) →
postcomp S h ·l htpy-postcomp S H ~ htpy-postcomp S (h ·l H)
inv-distributive-htpy-postcomp-left-whisker h H S i =
compute-eq-htpy-ap-postcomp h (H ·r i)
distributive-htpy-postcomp-left-whisker :
(h : B → C) (H : f ~ g) (S : UU l4) →
htpy-postcomp S (h ·l H) ~ postcomp S h ·l htpy-postcomp S H
distributive-htpy-postcomp-left-whisker h H S =
inv-htpy (inv-distributive-htpy-postcomp-left-whisker h H S)
```
### Postcomposition distributes over concatenations of homotopies
```agda
module _
{l1 l2 l3 : Level} {A : UU l1} {B : UU l2}
{f g h : A → B}
where
distributive-htpy-postcomp-concat-htpy :
(H : f ~ g) (K : g ~ h) (S : UU l3) →
htpy-postcomp S (H ∙h K) ~ htpy-postcomp S H ∙h htpy-postcomp S K
distributive-htpy-postcomp-concat-htpy H K S i =
( ap eq-htpy (eq-htpy (distributive-right-whisker-comp-concat i H K))) ∙
( eq-htpy-concat-htpy (H ·r i) (K ·r i))
```
### The actions of precomposition and postcomposition on homotopies commute
Given homotopies `F : f ~ f'` and `G : g ~ g'`, we have a commuting square of
homotopies
```text
postcomp A g ·l htpy-precomp F X
(g ∘ - ∘ f) ---------------------------------> (g ∘ - ∘ f')
| |
| |
| |
precomp f Y ·l htpy-postcomp B G htpy-postcomp A G ·r precomp f' X
| |
| |
∨ ∨
(g' ∘ - ∘ f) --------------------------------> (g' ∘ - ∘ f').
htpy-precomp F Y ·r postcomp B g'
```
```agda
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
where
commutative-postcomp-htpy-precomp :
{f f' : A → B} (g : X → Y) (F : f ~ f') →
htpy-precomp F Y ·r postcomp B g ~ postcomp A g ·l htpy-precomp F X
commutative-postcomp-htpy-precomp {f} g =
ind-htpy f
( λ f' F →
htpy-precomp F Y ·r postcomp B g ~ postcomp A g ·l htpy-precomp F X)
( ( right-whisker-comp²
( compute-htpy-precomp-refl-htpy f Y)
( postcomp B g)) ∙h
( inv-htpy
( left-whisker-comp²
( postcomp A g)
( compute-htpy-precomp-refl-htpy f X))))
commutative-precomp-htpy-postcomp :
(f : A → B) {g g' : X → Y} (G : g ~ g') →
htpy-postcomp A G ·r precomp f X ~ precomp f Y ·l htpy-postcomp B G
commutative-precomp-htpy-postcomp f {g} =
ind-htpy g
( λ g' G →
htpy-postcomp A G ·r precomp f X ~ precomp f Y ·l htpy-postcomp B G)
( ( right-whisker-comp²
( compute-htpy-postcomp-refl-htpy A g)
( precomp f X)) ∙h
( inv-htpy
( left-whisker-comp²
( precomp f Y)
( compute-htpy-postcomp-refl-htpy B g))))
module _
{l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
{f f' : A → B} {g g' : X → Y}
where
commutative-htpy-postcomp-htpy-precomp :
(F : f ~ f') (G : g ~ g') →
( postcomp A g ·l htpy-precomp F X ∙h htpy-postcomp A G ·r precomp f' X) ~
( precomp f Y ·l htpy-postcomp B G ∙h htpy-precomp F Y ·r postcomp B g')
commutative-htpy-postcomp-htpy-precomp F =
ind-htpy g
( λ g' G →
( postcomp A g ·l htpy-precomp F X ∙h
htpy-postcomp A G ·r precomp f' X) ~
( precomp f Y ·l htpy-postcomp B G ∙h
htpy-precomp F Y ·r postcomp B g'))
( ( ap-concat-htpy
( postcomp A g ·l htpy-precomp F X)
( right-whisker-comp²
( compute-htpy-postcomp-refl-htpy A g)
( precomp f' X))) ∙h
( right-unit-htpy) ∙h
( inv-htpy (commutative-postcomp-htpy-precomp g F)) ∙h
( ap-concat-htpy'
( htpy-precomp F Y ·r postcomp B g)
( left-whisker-comp²
( precomp f Y)
( inv-htpy (compute-htpy-postcomp-refl-htpy B g)))))
```