# Whiskering homotopies with respect to composition

```agda
module foundation.whiskering-homotopies-composition where
```

<details><summary>Imports</summary>

```agda
open import foundation.action-on-identifications-functions
open import foundation.universe-levels

open import foundation-core.function-types
open import foundation-core.homotopies
open import foundation-core.identity-types
```

</details>

## Idea

There are two
{{#concept "whiskering operations" Disambiguation="homotopies with respect to compostion"}}
on [homotopies](foundation-core.homotopies.md) with respect to composition. The
{{#concept "left whiskering" Disambiguation="homotopies with respect to composition" Agda=left-whisker-comp}}
operation of homotopies with respect to composition assumes a diagram of maps of
the form

```text
      f
    ----->     h
  A -----> B -----> C
      g
```

and is defined to be the function `H ↦ h ·l H : (f ~ g) → (h ∘ f ~ h ∘ g)`. The
{{#concept "right whiskering" Disambiguation="homotopies with respect to composition" Agda=right-whisker-comp}}
operation of homotopies with respect to composition assumes a diagram of maps
the form

```text
               g
      f      ----->
  A -----> B -----> C
               h
```

and is defined to be the function `H ↦ H ·r f : (g ~ h) → (g ∘ f ~ h ∘ f)`.

**Note.** The infix whiskering operators `_·l_` and `_·r_` use the
[middle dot](https://codepoints.net/U+00B7) `·` (agda-input: `\cdot`
`\centerdot`), as opposed to the infix homotopy concatenation operator `_∙h_`
which uses the [bullet operator](https://codepoints.net/U+2219) `∙` (agda-input:
`\.`). If these look the same in your editor, we suggest that you change your
font. For more details, see [How to install](HOWTO-INSTALL.md).

**Note.** We will define the whiskering operations with respect to function
composition for dependent functions. The definition of `whiskering-operations`
in [whiskering operations](foundation.whiskering-operations.md) does not support
this level of generality, so we will not be able to use it here.

## Definitions

### Left whiskering of homotopies

```agda
module _
  {l1 l2 l3 : Level} {A : UU l1} {B : A  UU l2} {C : A  UU l3}
  where

  left-whisker-comp :
    (h : {x : A}  B x  C x)
    {f g : (x : A)  B x}  f ~ g  h  f ~ h  g
  left-whisker-comp h H x = ap h (H x)

  infixr 17 _·l_
  _·l_ = left-whisker-comp
```

### Right whiskering of homotopies

```agda
module _
  {l1 l2 l3 : Level} {A : UU l1} {B : A  UU l2} {C : (x : A)  B x  UU l3}
  where

  right-whisker-comp :
    {g h : {x : A} (y : B x)  C x y}
    (H : {x : A}  g {x} ~ h {x})
    (f : (x : A)  B x)  g  f ~ h  f
  right-whisker-comp H f x = H (f x)

  infixl 16 _·r_
  _·r_ = right-whisker-comp
```

### Double whiskering of homotopies

```agda
module _
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : A  UU l2}
  {C : (x : A)  B x  UU l3} {D : (x : A)  B x  UU l4}
  where

  double-whisker-comp :
    (left : {x : A} {y : B x}  C x y  D x y)
    {g h : {x : A} (y : B x)  C x y}
    (H : {x : A}  g {x} ~ h {x})
    (right : (x : A)  B x)  left  g  right ~ left  h  right
  double-whisker-comp left H right = left ·l H ·r right
```

## Properties

### The left and right whiskering operations commute

We have the coherence

```text
  (h ·l H) ·r h' ~ h ·l (H ·r h')
```

definitionally.

```agda
module _
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : A  UU l2}
  {C : {x : A}  B x  UU l3} {D : {x : A}  B x  UU l4}
  {f g : {x : A} (y : B x)  C y}
  where

  coherence-double-whisker-comp :
    (h : {x : A} {y : B x}  C y  D y)
    (H : {x : A}  f {x} ~ g {x})
    (h' : (x : A)  B x) 
    (h ·l H) ·r h' ~ h ·l (H ·r h')
  coherence-double-whisker-comp h H h' = refl-htpy
```

### Unit laws and absorption laws for whiskering homotopies

The identity map is a _unit element_ for whiskerings from the function side, and
the reflexivity homotopy is an _absorbing element_ on the homotopy side for
whiskerings.

```agda
module _
  {l1 l2 : Level} {A : UU l1} {B : A  UU l2}
  where

  left-unit-law-left-whisker-comp :
    {f f' : (x : A)  B x} (H : f ~ f')  id ·l H ~ H
  left-unit-law-left-whisker-comp H x = ap-id (H x)

module _
  {l1 l2 l3 : Level} {A : UU l1} {B : A  UU l2} {C : A  UU l3}
  where

  right-absorption-law-left-whisker-comp :
    {f : (x : A)  B x} (g : {x : A}  B x  C x) 
    g ·l refl-htpy {f = f} ~ refl-htpy
  right-absorption-law-left-whisker-comp g = refl-htpy

module _
  {l1 l2 l3 : Level} {A : UU l1} {B : A  UU l2} {C : (x : A)  B x  UU l3}
  where

  left-absorption-law-right-whisker-comp :
    {g : {x : A} (y : B x)  C x y} (f : (x : A)  B x) 
    refl-htpy {f = g} ·r f ~ refl-htpy
  left-absorption-law-right-whisker-comp f = refl-htpy

module _
  {l1 l2 : Level} {A : UU l1} {B : A  UU l2}
  where

  right-unit-law-right-whisker-comp :
    {f f' : (x : A)  B x} (H : f ~ f')  H ·r id ~ H
  right-unit-law-right-whisker-comp H = refl-htpy
```

### Laws for whiskering an inverted homotopy

```agda
module _
  {l1 l2 l3 : Level} {A : UU l1} {B : A  UU l2} {C : A  UU l3}
  {f f' : (x : A)  B x} (g : {x : A}  B x  C x) (H : f ~ f')
  where

  left-whisker-inv-htpy : g ·l (inv-htpy H) ~ inv-htpy (g ·l H)
  left-whisker-inv-htpy x = ap-inv g (H x)

module _
  {l1 l2 l3 : Level} {A : UU l1} {B : A  UU l2} {C : (x : A)  B x  UU l3}
  {g g' : {x : A} (y : B x)  C x y} (H : {x : A}  g {x} ~ g' {x})
  (f : (x : A)  B x)
  where

  right-whisker-inv-htpy : inv-htpy H ·r f ~ inv-htpy (H ·r f)
  right-whisker-inv-htpy = refl-htpy
```

### Inverse laws for whiskered homotopies

```agda
module _
  {l1 l2 l3 : Level} {A : UU l1} {B : A  UU l2} {C : A  UU l3}
  {f f' : (x : A)  B x} (g : {x : A}  B x  C x) (H : f ~ f')
  where

  left-inv-htpy-left-whisker : g ·l (inv-htpy H) ∙h g ·l H ~ refl-htpy
  left-inv-htpy-left-whisker =
    ( ap-concat-htpy' (g ·l H) (left-whisker-inv-htpy g H)) ∙h
    ( left-inv-htpy (g ·l H))

  right-inv-htpy-left-whisker : g ·l H ∙h g ·l (inv-htpy H) ~ refl-htpy
  right-inv-htpy-left-whisker =
    ( ap-concat-htpy (g ·l H) (left-whisker-inv-htpy g H)) ∙h
    ( right-inv-htpy (g ·l H))

module _
  {l1 l2 l3 : Level} {A : UU l1} {B : A  UU l2} {C : (x : A)  B x  UU l3}
  {g g' : {x : A} (y : B x)  C x y} (H : {x : A}  g {x} ~ g' {x})
  (f : (x : A)  B x)
  where

  left-inv-htpy-right-whisker : (inv-htpy H) ·r f ∙h H ·r f ~ refl-htpy
  left-inv-htpy-right-whisker = left-inv-htpy (H ·r f)

  right-inv-htpy-right-whisker : H ·r f ∙h (inv-htpy H) ·r f ~ refl-htpy
  right-inv-htpy-right-whisker = right-inv-htpy (H ·r f)
```

### Distributivity of whiskering over concatenation of homotopies

```agda
module _
  {l1 l2 l3 : Level} {A : UU l1} {B : A  UU l2} {C : A  UU l3}
  where

  distributive-left-whisker-comp-concat :
    { f g h : (x : A)  B x} (k : {x : A}  B x  C x) 
    ( H : f ~ g) (K : g ~ h) 
    k ·l (H ∙h K) ~ (k ·l H) ∙h (k ·l K)
  distributive-left-whisker-comp-concat k H K a =
    ap-concat k (H a) (K a)

module _
  {l1 l2 l3 : Level} {A : UU l1} {B : A  UU l2} {C : (x : A)  B x  UU l3}
  (k : (x : A)  B x) {f g h : {x : A} (y : B x)  C x y}
  (H : {x : A}  f {x} ~ g {x}) (K : {x : A}  g {x} ~ h {x})
  where

  distributive-right-whisker-comp-concat :
    (H ∙h K) ·r k ~ (H ·r k) ∙h (K ·r k)
  distributive-right-whisker-comp-concat = refl-htpy
```

### Whiskering preserves function composition

In other words, whiskering is an action of functions on homotopies.

```agda
module _
  {l1 l2 l3 l4 : Level}
  {A : UU l1} {B : A  UU l2} {C : A  UU l3} {D : A  UU l4}
  where

  inv-preserves-comp-left-whisker-comp :
    ( k : {x : A}  C x  D x) (h : {x : A}  B x  C x) {f g : (x : A)  B x}
    ( H : f ~ g) 
    (k  h) ·l H ~ k ·l (h ·l H)
  inv-preserves-comp-left-whisker-comp k h H x = ap-comp k h (H x)

  preserves-comp-left-whisker-comp :
    ( k : {x : A}  C x  D x) (h : {x : A}  B x  C x) {f g : (x : A)  B x}
    ( H : f ~ g) 
    k ·l (h ·l H) ~ (k  h) ·l H
  preserves-comp-left-whisker-comp k h H =
    inv-htpy (inv-preserves-comp-left-whisker-comp k h H)

module _
  { l1 l2 l3 l4 : Level}
  { A : UU l1} {B : A  UU l2} {C : (x : A)  B x  UU l3}
  { D : (x : A) (y : B x) (z : C x y)  UU l4}
  { f g : {x : A} {y : B x} (z : C x y)  D x y z}
  ( h : {x : A} (y : B x)  C x y) (k : (x : A)  B x)
  ( H : {x : A} {y : B x}  f {x} {y} ~ g {x} {y})
  where

  preserves-comp-right-whisker-comp : (H ·r h) ·r k ~ H ·r (h  k)
  preserves-comp-right-whisker-comp = refl-htpy
```

### A coherence for homotopies to the identity function

Consider a function `f : A → A` and let `H : f ~ id` be a homotopy to the
identity function. Then we have a homotopy

```text
  H ·r f ~ f ·l H.
```

```agda
module _
  {l : Level} {A : UU l} {f : A  A} (H : f ~ id)
  where

  coh-htpy-id : H ·r f ~ f ·l H
  coh-htpy-id x = is-injective-concat' (H x) (nat-htpy-id H (H x))

  inv-coh-htpy-id : f ·l H ~ H ·r f
  inv-coh-htpy-id = inv-htpy coh-htpy-id
```

## See also

- For interactions between whiskering and exponentiation, see
  [`foundation.composition-algebra`](foundation.composition-algebra.md).