# Pointed homotopies
```agda
module structured-types.pointed-homotopies where
```
<details><summary>Imports</summary>
```agda
open import foundation.action-on-higher-identifications-functions
open import foundation.action-on-identifications-binary-functions
open import foundation.action-on-identifications-functions
open import foundation.binary-equivalences
open import foundation.commuting-triangles-of-identifications
open import foundation.contractible-types
open import foundation.dependent-pair-types
open import foundation.equivalences
open import foundation.function-extensionality
open import foundation.function-types
open import foundation.functoriality-dependent-pair-types
open import foundation.fundamental-theorem-of-identity-types
open import foundation.homotopies
open import foundation.homotopy-induction
open import foundation.identity-types
open import foundation.path-algebra
open import foundation.structure-identity-principle
open import foundation.universe-levels
open import foundation.whiskering-homotopies-composition
open import foundation.whiskering-identifications-concatenation
open import foundation-core.torsorial-type-families
open import structured-types.pointed-dependent-functions
open import structured-types.pointed-families-of-types
open import structured-types.pointed-maps
open import structured-types.pointed-types
```
</details>
## Idea
A {{#concept "pointed homotopy" Agda=_~∗_}} between
[pointed dependent functions](structured-types.pointed-dependent-functions.md)
`f := (f₀ , f₁)` and `g := (g₀ , g₁)` of type `pointed-Π A B` consists of an
unpointed [homotopy](foundation-core.homotopies.md) `H₀ : f₀ ~ g₀` and an
[identification](foundation-core.identity-types.md) `H₁ : f₁ = (H₀ *) ∙ g₁`
witnessing that the triangle of identifications
```text
H₀ *
f₀ * ------> g₀ *
\ /
f₁ \ / g₁
\ /
∨ ∨
*
```
[commutes](foundation.commuting-triangles-of-identifications.md). This
identification is called the
{{#concept "base point coherence" Disambiguation="pointed homotopy" Agda=coherence-point-unpointed-htpy-pointed-Π}}
of the pointed homotopy `H := (H₀ , H₁)`.
An equivalent way of defining pointed homotopies occurs when we consider the
type family `x ↦ f₀ x = g₀ x` over the base type `A`. This is a
[pointed type family](structured-types.pointed-families-of-types.md), where the
base point is the identification
```text
f₁ ∙ inv g₁ : f₀ * = g₀ *.
```
A pointed homotopy `f ~∗ g` is therefore equivalently defined as a pointed
dependent function of the pointed type family `x ↦ f₀ x = g₀ x`. Such a pointed
dependent function consists of an unpointed homotopy `H₀ : f₀ ~ g₀` between the
underlying dependent functions and an identification witnessing that the
triangle of identifications
```text
H₀ *
f₀ * ------> g₀ *
\ ∧
f₁ \ / inv g₁
\ /
∨ /
*
```
[commutes](foundation.commuting-triangles-of-identifications.md). Notice that
the identification on the right in this triangle goes up, in the inverse
direction of the identification `g₁`.
Note that in this second definition of pointed homotopies we defined pointed
homotopies between pointed dependent functions to be certain pointed dependent
functions. This implies that the second definition is a uniform definition that
can easily be iterated in order to consider pointed higher homotopies. For this
reason, we call the second definition of pointed homotopies
[uniform pointed homotopies](structured-types.uniform-pointed-homotopies.md).
Note that the difference between our main definition of pointed homotopies and
the uniform definition of pointed homotopies is the direction of the
identification on the right in the commuting triangle
```text
H₀ *
f₀ * ------> g₀ *
\ /
f₁ \ / g₁
\ /
∨ ∨
*.
```
In the definition of uniform pointed homotopies it goes in the reverse
direction. This makes it slightly more complicated to construct an
identification witnessing that the triangle commutes in the case of uniform
pointed homotopies. Furthermore, this complication becomes more significant and
bothersome when we are trying to construct a
[pointed `2`-homotopy](structured-types.pointed-2-homotopies.md). For this
reason, our first definition where pointed homotopies are defined to consist of
unpointed homotopies and a base point coherence, is taken to be our main
definition of pointed homotopy. The only disadvantage of the nonuniform
definition of pointed homotopies is that it does not easily iterate.
We will write `f ~∗ g` for the type of (nonuniform) pointed homotopies, and we
will write `H ~²∗ K` for the nonuniform definition of pointed `2`-homotopies.
## Definitions
### Unpointed homotopies between pointed dependent functions
```agda
module _
{l1 l2 : Level} {A : Pointed-Type l1} {B : Pointed-Fam l2 A}
(f g : pointed-Π A B)
where
unpointed-htpy-pointed-Π : UU (l1 ⊔ l2)
unpointed-htpy-pointed-Π = function-pointed-Π f ~ function-pointed-Π g
```
### Unpointed homotopies between pointed maps
```agda
module _
{l1 l2 : Level} {A : Pointed-Type l1} {B : Pointed-Type l2}
(f g : A →∗ B)
where
unpointed-htpy-pointed-map : UU (l1 ⊔ l2)
unpointed-htpy-pointed-map = map-pointed-map f ~ map-pointed-map g
```
### The base point coherence of unpointed homotopies between pointed maps
The base point coherence of pointed homotopies asserts that its underlying
homotopy preserves the base point, in the sense that the triangle of
identifications
```text
H *
f * ------> g *
\ /
preserves-point f \ / preserves-point g
\ /
∨ ∨
*
```
commutes.
```agda
module _
{l1 l2 : Level} {A : Pointed-Type l1} {B : Pointed-Fam l2 A}
(f g : pointed-Π A B) (G : unpointed-htpy-pointed-Π f g)
where
coherence-point-unpointed-htpy-pointed-Π : UU l2
coherence-point-unpointed-htpy-pointed-Π =
coherence-triangle-identifications
( preserves-point-function-pointed-Π f)
( preserves-point-function-pointed-Π g)
( G (point-Pointed-Type A))
```
### Pointed homotopies
```agda
module _
{l1 l2 : Level} {A : Pointed-Type l1} {B : Pointed-Fam l2 A}
(f g : pointed-Π A B)
where
pointed-htpy : UU (l1 ⊔ l2)
pointed-htpy =
Σ ( function-pointed-Π f ~ function-pointed-Π g)
( coherence-point-unpointed-htpy-pointed-Π f g)
infix 6 _~∗_
_~∗_ : UU (l1 ⊔ l2)
_~∗_ = pointed-htpy
module _
{l1 l2 : Level} {A : Pointed-Type l1} {B : Pointed-Fam l2 A}
{f g : pointed-Π A B} (H : f ~∗ g)
where
htpy-pointed-htpy : function-pointed-Π f ~ function-pointed-Π g
htpy-pointed-htpy = pr1 H
coherence-point-pointed-htpy :
coherence-point-unpointed-htpy-pointed-Π f g htpy-pointed-htpy
coherence-point-pointed-htpy = pr2 H
```
### The reflexive pointed homotopy
```agda
module _
{l1 l2 : Level} {A : Pointed-Type l1} {B : Pointed-Fam l2 A}
(f : pointed-Π A B)
where
refl-pointed-htpy : pointed-htpy f f
pr1 refl-pointed-htpy = refl-htpy
pr2 refl-pointed-htpy = refl
```
### Concatenation of pointed homotopies
Consider three pointed dependent functions `f := (f₀ , f₁)`, `g := (g₀ , g₁)`,
and `h := (h₀ , h₁)`, and pointed homotopies `G := (G₀ , G₁)` and
`H := (H₀ , H₁)` between them as indicated in the diagram
```text
G H
f -----> g -----> h
```
The concatenation `(G ∙h H)` of `G` and `H` has underlying unpointed homotopy
```text
(G ∙h H)₀ := G₀ ∙h H₀.
```
The base point coherence `(G ∙h H)₁` of `(G ∙h H)` is obtained by horizontally
pasting the commuting triangles of identifications
```text
G₀ * H₀ *
f₀ * --> g₀ * ---> h₀ *
\ | /
\ | g₁ /
f₁ \ | / h₁
\ | /
\ | /
∨ ∨ ∨
*.
```
```agda
module _
{l1 l2 : Level} {A : Pointed-Type l1} {B : Pointed-Fam l2 A}
{f g h : pointed-Π A B} (G : f ~∗ g) (H : g ~∗ h)
where
htpy-concat-pointed-htpy : unpointed-htpy-pointed-Π f h
htpy-concat-pointed-htpy = htpy-pointed-htpy G ∙h htpy-pointed-htpy H
coherence-point-concat-pointed-htpy :
coherence-point-unpointed-htpy-pointed-Π f h htpy-concat-pointed-htpy
coherence-point-concat-pointed-htpy =
horizontal-pasting-coherence-triangle-identifications
( preserves-point-function-pointed-Π f)
( preserves-point-function-pointed-Π g)
( preserves-point-function-pointed-Π h)
( htpy-pointed-htpy G (point-Pointed-Type A))
( htpy-pointed-htpy H (point-Pointed-Type A))
( coherence-point-pointed-htpy G)
( coherence-point-pointed-htpy H)
concat-pointed-htpy : f ~∗ h
pr1 concat-pointed-htpy = htpy-concat-pointed-htpy
pr2 concat-pointed-htpy = coherence-point-concat-pointed-htpy
```
### Inverses of pointed homotopies
```agda
module _
{l1 l2 : Level} {A : Pointed-Type l1} {B : Pointed-Fam l2 A}
{f g : pointed-Π A B} (H : f ~∗ g)
where
htpy-inv-pointed-htpy : unpointed-htpy-pointed-Π g f
htpy-inv-pointed-htpy = inv-htpy (htpy-pointed-htpy H)
coherence-point-inv-pointed-htpy :
coherence-point-unpointed-htpy-pointed-Π g f htpy-inv-pointed-htpy
coherence-point-inv-pointed-htpy =
transpose-top-coherence-triangle-identifications
( preserves-point-function-pointed-Π g)
( preserves-point-function-pointed-Π f)
( htpy-pointed-htpy H (point-Pointed-Type A))
( refl)
( coherence-point-pointed-htpy H)
inv-pointed-htpy : g ~∗ f
pr1 inv-pointed-htpy = htpy-inv-pointed-htpy
pr2 inv-pointed-htpy = coherence-point-inv-pointed-htpy
```
## Properties
### Extensionality of pointed dependent function types by pointed homotopies
```agda
module _
{l1 l2 : Level} {A : Pointed-Type l1} {B : Pointed-Fam l2 A}
(f : pointed-Π A B)
where
abstract
is-torsorial-pointed-htpy :
is-torsorial (pointed-htpy f)
is-torsorial-pointed-htpy =
is-torsorial-Eq-structure
( is-torsorial-htpy _)
( function-pointed-Π f , refl-htpy)
( is-torsorial-Id _)
pointed-htpy-eq :
(g : pointed-Π A B) → f = g → f ~∗ g
pointed-htpy-eq .f refl = refl-pointed-htpy f
abstract
is-equiv-pointed-htpy-eq :
(g : pointed-Π A B) → is-equiv (pointed-htpy-eq g)
is-equiv-pointed-htpy-eq =
fundamental-theorem-id
( is-torsorial-pointed-htpy)
( pointed-htpy-eq)
extensionality-pointed-Π :
(g : pointed-Π A B) → (f = g) ≃ (f ~∗ g)
pr1 (extensionality-pointed-Π g) = pointed-htpy-eq g
pr2 (extensionality-pointed-Π g) = is-equiv-pointed-htpy-eq g
eq-pointed-htpy :
(g : pointed-Π A B) → f ~∗ g → f = g
eq-pointed-htpy g = map-inv-equiv (extensionality-pointed-Π g)
```
### Extensionality of pointed maps
```agda
module _
{l1 l2 : Level} {A : Pointed-Type l1} {B : Pointed-Type l2}
(f : A →∗ B)
where
extensionality-pointed-map :
(g : A →∗ B) → (f = g) ≃ (f ~∗ g)
extensionality-pointed-map = extensionality-pointed-Π f
```
### Associativity of composition of pointed maps
```agda
module _
{l1 l2 l3 l4 : Level}
{A : Pointed-Type l1} {B : Pointed-Type l2}
{C : Pointed-Type l3} {D : Pointed-Type l4}
(h : C →∗ D) (g : B →∗ C) (f : A →∗ B)
where
htpy-inv-associative-comp-pointed-map :
unpointed-htpy-pointed-Π (h ∘∗ (g ∘∗ f)) ((h ∘∗ g) ∘∗ f)
htpy-inv-associative-comp-pointed-map = refl-htpy
coherence-point-inv-associative-comp-pointed-map :
coherence-point-unpointed-htpy-pointed-Π
( h ∘∗ (g ∘∗ f))
( (h ∘∗ g) ∘∗ f)
( htpy-inv-associative-comp-pointed-map)
coherence-point-inv-associative-comp-pointed-map =
right-whisker-concat-coherence-triangle-identifications
( ap
( map-pointed-map h)
( ( ap
( map-pointed-map g)
( preserves-point-pointed-map f)) ∙
( preserves-point-pointed-map g)))
( ap (map-pointed-map h) _)
( ap (map-comp-pointed-map h g) (preserves-point-pointed-map f))
( preserves-point-pointed-map h)
( ( ap-concat
( map-pointed-map h)
( ap (map-pointed-map g) (preserves-point-pointed-map f))
( preserves-point-pointed-map g)) ∙
( inv
( right-whisker-concat
( ap-comp
( map-pointed-map h)
( map-pointed-map g)
( preserves-point-pointed-map f))
( ap (map-pointed-map h) (preserves-point-pointed-map g)))))
inv-associative-comp-pointed-map :
h ∘∗ (g ∘∗ f) ~∗ (h ∘∗ g) ∘∗ f
pr1 inv-associative-comp-pointed-map =
htpy-inv-associative-comp-pointed-map
pr2 inv-associative-comp-pointed-map =
coherence-point-inv-associative-comp-pointed-map
htpy-associative-comp-pointed-map :
unpointed-htpy-pointed-Π ((h ∘∗ g) ∘∗ f) (h ∘∗ (g ∘∗ f))
htpy-associative-comp-pointed-map = refl-htpy
coherence-associative-comp-pointed-map :
coherence-point-unpointed-htpy-pointed-Π
( (h ∘∗ g) ∘∗ f)
( h ∘∗ (g ∘∗ f))
( htpy-associative-comp-pointed-map)
coherence-associative-comp-pointed-map =
inv coherence-point-inv-associative-comp-pointed-map
associative-comp-pointed-map :
(h ∘∗ g) ∘∗ f ~∗ h ∘∗ (g ∘∗ f)
pr1 associative-comp-pointed-map =
htpy-associative-comp-pointed-map
pr2 associative-comp-pointed-map =
coherence-associative-comp-pointed-map
```
### The left unit law for composition of pointed maps
```agda
module _
{l1 l2 : Level} {A : Pointed-Type l1} {B : Pointed-Type l2} (f : A →∗ B)
where
htpy-left-unit-law-comp-pointed-map :
id ∘ map-pointed-map f ~ map-pointed-map f
htpy-left-unit-law-comp-pointed-map = refl-htpy
coherence-left-unit-law-comp-pointed-map :
coherence-point-unpointed-htpy-pointed-Π
( id-pointed-map ∘∗ f)
( f)
( htpy-left-unit-law-comp-pointed-map)
coherence-left-unit-law-comp-pointed-map =
right-unit ∙ ap-id (preserves-point-pointed-map f)
left-unit-law-comp-pointed-map : id-pointed-map ∘∗ f ~∗ f
pr1 left-unit-law-comp-pointed-map = htpy-left-unit-law-comp-pointed-map
pr2 left-unit-law-comp-pointed-map = coherence-left-unit-law-comp-pointed-map
htpy-inv-left-unit-law-comp-pointed-map :
map-pointed-map f ~ id ∘ map-pointed-map f
htpy-inv-left-unit-law-comp-pointed-map = refl-htpy
coherence-point-inv-left-unit-law-comp-pointed-map :
coherence-point-unpointed-htpy-pointed-Π
( f)
( id-pointed-map ∘∗ f)
( htpy-inv-left-unit-law-comp-pointed-map)
coherence-point-inv-left-unit-law-comp-pointed-map =
inv coherence-left-unit-law-comp-pointed-map
inv-left-unit-law-comp-pointed-map : f ~∗ id-pointed-map ∘∗ f
pr1 inv-left-unit-law-comp-pointed-map =
htpy-inv-left-unit-law-comp-pointed-map
pr2 inv-left-unit-law-comp-pointed-map =
coherence-point-inv-left-unit-law-comp-pointed-map
```
### The right unit law for composition of pointed maps
```agda
module _
{l1 l2 : Level} {A : Pointed-Type l1} {B : Pointed-Type l2} (f : A →∗ B)
where
htpy-right-unit-law-comp-pointed-map :
map-pointed-map f ∘ id ~ map-pointed-map f
htpy-right-unit-law-comp-pointed-map = refl-htpy
coherence-right-unit-law-comp-pointed-map :
coherence-point-unpointed-htpy-pointed-Π
( f ∘∗ id-pointed-map)
( f)
( htpy-right-unit-law-comp-pointed-map)
coherence-right-unit-law-comp-pointed-map = refl
right-unit-law-comp-pointed-map : f ∘∗ id-pointed-map ~∗ f
pr1 right-unit-law-comp-pointed-map =
htpy-right-unit-law-comp-pointed-map
pr2 right-unit-law-comp-pointed-map =
coherence-right-unit-law-comp-pointed-map
```
### Concatenation of pointed homotopies is a binary equivalence
```agda
module _
{l1 l2 : Level} {A : Pointed-Type l1} {B : Pointed-Fam l2 A}
{f g h : pointed-Π A B}
where
abstract
is-equiv-concat-pointed-htpy :
(G : f ~∗ g) → is-equiv (λ (H : g ~∗ h) → concat-pointed-htpy G H)
is-equiv-concat-pointed-htpy G =
is-equiv-map-Σ _
( is-equiv-concat-htpy (htpy-pointed-htpy G) _)
( λ H →
is-equiv-horizontal-pasting-coherence-triangle-identifications
( preserves-point-function-pointed-Π f)
( preserves-point-function-pointed-Π g)
( preserves-point-function-pointed-Π h)
( htpy-pointed-htpy G _)
( H _)
( coherence-point-pointed-htpy G))
equiv-concat-pointed-htpy : f ~∗ g → (g ~∗ h) ≃ (f ~∗ h)
pr1 (equiv-concat-pointed-htpy G) = concat-pointed-htpy G
pr2 (equiv-concat-pointed-htpy G) = is-equiv-concat-pointed-htpy G
abstract
is-equiv-concat-pointed-htpy' :
(H : g ~∗ h) → is-equiv (λ (G : f ~∗ g) → concat-pointed-htpy G H)
is-equiv-concat-pointed-htpy' H =
is-equiv-map-Σ _
( is-equiv-concat-htpy' _ (htpy-pointed-htpy H))
( λ G →
is-equiv-horizontal-pasting-coherence-triangle-identifications'
( preserves-point-function-pointed-Π f)
( preserves-point-function-pointed-Π g)
( preserves-point-function-pointed-Π h)
( G _)
( htpy-pointed-htpy H _)
( coherence-point-pointed-htpy H))
equiv-concat-pointed-htpy' : g ~∗ h → (f ~∗ g) ≃ (f ~∗ h)
pr1 (equiv-concat-pointed-htpy' H) G = concat-pointed-htpy G H
pr2 (equiv-concat-pointed-htpy' H) = is-equiv-concat-pointed-htpy' H
is-binary-equiv-concat-pointed-htpy :
is-binary-equiv (λ (G : f ~∗ g) (H : g ~∗ h) → concat-pointed-htpy G H)
pr1 is-binary-equiv-concat-pointed-htpy = is-equiv-concat-pointed-htpy'
pr2 is-binary-equiv-concat-pointed-htpy = is-equiv-concat-pointed-htpy
```
## See also
- [Pointed 2-homotopies](structured-types.pointed-2-homotopies.md)
- [Uniform pointed homotopies](structured-types.uniform-pointed-homotopies.md)