# Multivariable homotopies
```agda
module foundation.multivariable-homotopies where
open import foundation.telescopes public
```
<details><summary>Imports</summary>
```agda
open import elementary-number-theory.natural-numbers
open import foundation.dependent-pair-types
open import foundation.equality-dependent-function-types
open import foundation.function-extensionality
open import foundation.implicit-function-types
open import foundation.iterated-dependent-product-types
open import foundation.universe-levels
open import foundation-core.contractible-types
open import foundation-core.equivalences
open import foundation-core.functoriality-dependent-function-types
open import foundation-core.functoriality-dependent-pair-types
open import foundation-core.identity-types
open import foundation-core.torsorial-type-families
```
</details>
## Idea
Given an
[iterated dependent product](foundation.iterated-dependent-product-types.md) we
can consider [homotopies](foundation-core.homotopies.md) of its elements. By
[function extensionality](foundation.function-extensionality.md),
**multivariable homotopies** are [equivalent](foundation-core.equivalences.md)
to [identifications](foundation-core.identity-types.md).
## Definitions
### Multivariable homotopies
```agda
multivariable-htpy :
{l : Level} {n : ℕ} {{A : telescope l n}} (f g : iterated-Π A) → UU l
multivariable-htpy {{base-telescope A}} f g = f = g
multivariable-htpy {{cons-telescope {X = X} A}} f g =
(x : X) → multivariable-htpy {{A x}} (f x) (g x)
```
### Multivariable homotopies between implicit functions
```agda
multivariable-htpy-implicit :
{l : Level} {n : ℕ} {{A : telescope l n}} (f g : iterated-implicit-Π A) → UU l
multivariable-htpy-implicit {{base-telescope A}} f g = f = g
multivariable-htpy-implicit {{cons-telescope {X = X} A}} f g =
(x : X) → multivariable-htpy-implicit {{A x}} (f {x}) (g {x})
```
### Multivariable implicit homotopies between functions
```agda
multivariable-implicit-htpy :
{l : Level} {n : ℕ} {{A : telescope l n}} (f g : iterated-Π A) → UU l
multivariable-implicit-htpy {{base-telescope A}} f g = f = g
multivariable-implicit-htpy {{cons-telescope {X = X} A}} f g =
{x : X} → multivariable-implicit-htpy {{A x}} (f x) (g x)
```
### Multivariable implicit homotopies between implicit functions
```agda
multivariable-implicit-htpy-implicit :
{l : Level} {n : ℕ} {{A : telescope l n}} (f g : iterated-implicit-Π A) → UU l
multivariable-implicit-htpy-implicit {{base-telescope A}} f g = f = g
multivariable-implicit-htpy-implicit {{cons-telescope {X = X} A}} f g =
{x : X} → multivariable-implicit-htpy-implicit {{A x}} (f {x}) (g {x})
```
### Implicit multivariable homotopies are equivalent to explicit multivariable homotopies
```agda
equiv-multivariable-explicit-implicit-htpy :
{l : Level} (n : ℕ) {{A : telescope l n}} {f g : iterated-Π A} →
multivariable-implicit-htpy {{A}} f g ≃ multivariable-htpy {{A}} f g
equiv-multivariable-explicit-implicit-htpy .0 {{base-telescope A}} = id-equiv
equiv-multivariable-explicit-implicit-htpy ._ {{cons-telescope A}} =
( equiv-Π-equiv-family
( λ x → equiv-multivariable-explicit-implicit-htpy _ {{A x}})) ∘e
( equiv-explicit-implicit-Π)
equiv-multivariable-implicit-explicit-htpy :
{l : Level} (n : ℕ) {{A : telescope l n}} {f g : iterated-Π A} →
multivariable-htpy {{A}} f g ≃ multivariable-implicit-htpy {{A}} f g
equiv-multivariable-implicit-explicit-htpy n {{A}} =
inv-equiv (equiv-multivariable-explicit-implicit-htpy n {{A}})
equiv-multivariable-explicit-implicit-htpy-implicit :
{l : Level} (n : ℕ) {{A : telescope l n}} {f g : iterated-implicit-Π A} →
( multivariable-implicit-htpy-implicit {{A}} f g) ≃
( multivariable-htpy-implicit {{A}} f g)
equiv-multivariable-explicit-implicit-htpy-implicit .0 {{base-telescope A}} =
id-equiv
equiv-multivariable-explicit-implicit-htpy-implicit ._ {{cons-telescope A}} =
( equiv-Π-equiv-family
( λ x → equiv-multivariable-explicit-implicit-htpy-implicit _ {{A x}})) ∘e
( equiv-explicit-implicit-Π)
equiv-multivariable-implicit-explicit-htpy-implicit :
{l : Level} (n : ℕ) {{A : telescope l n}} {f g : iterated-implicit-Π A} →
( multivariable-htpy-implicit {{A}} f g) ≃
( multivariable-implicit-htpy-implicit {{A}} f g)
equiv-multivariable-implicit-explicit-htpy-implicit n {{A}} =
inv-equiv (equiv-multivariable-explicit-implicit-htpy-implicit n {{A}})
```
### Iterated function extensionality
```agda
refl-multivariable-htpy :
{l : Level} (n : ℕ) {{A : telescope l n}}
{f : iterated-Π A} → multivariable-htpy {{A}} f f
refl-multivariable-htpy .0 {{base-telescope A}} = refl
refl-multivariable-htpy ._ {{cons-telescope A}} x =
refl-multivariable-htpy _ {{A x}}
multivariable-htpy-eq :
{l : Level} (n : ℕ) {{A : telescope l n}}
{f g : iterated-Π A} → f = g → multivariable-htpy {{A}} f g
multivariable-htpy-eq .0 {{base-telescope A}} p = p
multivariable-htpy-eq ._ {{cons-telescope A}} p x =
multivariable-htpy-eq _ {{A x}} (htpy-eq p x)
eq-multivariable-htpy :
{l : Level} (n : ℕ) {{A : telescope l n}}
{f g : iterated-Π A} → multivariable-htpy {{A}} f g → f = g
eq-multivariable-htpy .0 {{base-telescope A}} H = H
eq-multivariable-htpy ._ {{cons-telescope A}} H =
eq-htpy (λ x → eq-multivariable-htpy _ {{A x}} (H x))
equiv-iterated-funext :
{l : Level} (n : ℕ) {{A : telescope l n}}
{f g : iterated-Π A} → (f = g) ≃ multivariable-htpy {{A}} f g
equiv-iterated-funext .0 {{base-telescope A}} = id-equiv
equiv-iterated-funext ._ {{cons-telescope A}} =
equiv-Π-equiv-family (λ x → equiv-iterated-funext _ {{A x}}) ∘e equiv-funext
equiv-eq-multivariable-htpy :
{l : Level} (n : ℕ) {{A : telescope l n}}
{f g : iterated-Π A} → multivariable-htpy {{A}} f g ≃ (f = g)
equiv-eq-multivariable-htpy n {{A}} {f} {g} =
inv-equiv (equiv-iterated-funext n {{A}} {f} {g})
```
### Iterated function extensionality for implicit functions
```agda
refl-multivariable-htpy-implicit :
{l : Level} (n : ℕ) {{A : telescope l n}} {f : iterated-implicit-Π A} →
multivariable-htpy-implicit {{A}} f f
refl-multivariable-htpy-implicit .0 {{base-telescope A}} = refl
refl-multivariable-htpy-implicit ._ {{cons-telescope A}} x =
refl-multivariable-htpy-implicit _ {{A x}}
multivariable-htpy-eq-implicit :
{l : Level} (n : ℕ) {{A : telescope l n}} {f g : iterated-implicit-Π A} →
Id {A = iterated-implicit-Π A} f g → multivariable-htpy-implicit {{A}} f g
multivariable-htpy-eq-implicit .0 {{base-telescope A}} p = p
multivariable-htpy-eq-implicit ._ {{cons-telescope A}} p x =
multivariable-htpy-eq-implicit _ {{A x}} (htpy-eq-implicit p x)
eq-multivariable-htpy-implicit :
{l : Level} (n : ℕ) {{A : telescope l n}} {f g : iterated-implicit-Π A} →
multivariable-htpy-implicit {{A}} f g → Id {A = iterated-implicit-Π A} f g
eq-multivariable-htpy-implicit .0 {{base-telescope A}} H = H
eq-multivariable-htpy-implicit ._ {{cons-telescope A}} H =
eq-htpy-implicit (λ x → eq-multivariable-htpy-implicit _ {{A x}} (H x))
equiv-iterated-funext-implicit :
{l : Level} (n : ℕ) {{A : telescope l n}} {f g : iterated-implicit-Π A} →
(Id {A = iterated-implicit-Π A} f g) ≃ multivariable-htpy-implicit {{A}} f g
equiv-iterated-funext-implicit .0 {{base-telescope A}} = id-equiv
equiv-iterated-funext-implicit ._ {{cons-telescope A}} =
( equiv-Π-equiv-family (λ x → equiv-iterated-funext-implicit _ {{A x}})) ∘e
( equiv-funext-implicit)
```
### Torsoriality of multivariable homotopies
```agda
abstract
is-torsorial-multivariable-htpy :
{l : Level} (n : ℕ) {{A : telescope l n}} (f : iterated-Π A) →
is-torsorial (multivariable-htpy {{A}} f)
is-torsorial-multivariable-htpy .0 {{base-telescope A}} = is-torsorial-Id
is-torsorial-multivariable-htpy ._ {{cons-telescope A}} f =
is-torsorial-Eq-Π (λ x → is-torsorial-multivariable-htpy _ {{A x}} (f x))
abstract
is-torsorial-multivariable-htpy-implicit :
{l : Level} (n : ℕ) {{A : telescope l n}} (f : iterated-implicit-Π A) →
is-torsorial (multivariable-htpy-implicit {{A}} f)
is-torsorial-multivariable-htpy-implicit ._ {{A}} f =
is-contr-equiv'
( Σ (iterated-implicit-Π A) (Id {A = iterated-implicit-Π A} f))
( equiv-tot (λ _ → equiv-iterated-funext-implicit _ {{A}}))
( is-torsorial-Id {A = iterated-implicit-Π A} f)
abstract
is-torsorial-multivariable-implicit-htpy :
{l : Level} (n : ℕ) {{A : telescope l n}} (f : iterated-Π A) →
is-torsorial (multivariable-implicit-htpy {{A}} f)
is-torsorial-multivariable-implicit-htpy n {{A}} f =
is-contr-equiv
( Σ (iterated-Π A) (multivariable-htpy {{A}} f))
( equiv-tot (λ _ → equiv-multivariable-explicit-implicit-htpy n {{A}}))
( is-torsorial-multivariable-htpy n {{A}} f)
abstract
is-torsorial-multivariable-implicit-htpy-implicit :
{l : Level} (n : ℕ) {{A : telescope l n}} (f : iterated-implicit-Π A) →
is-torsorial (multivariable-implicit-htpy-implicit {{A}} f)
is-torsorial-multivariable-implicit-htpy-implicit n {{A}} f =
is-contr-equiv
( Σ (iterated-implicit-Π A) (multivariable-htpy-implicit {{A}} f))
( equiv-tot
( λ _ → equiv-multivariable-explicit-implicit-htpy-implicit n {{A}}))
( is-torsorial-multivariable-htpy-implicit n {{A}} f)
```
## See also
- [Binary homotopies](foundation.binary-homotopies.md) for once-iterated
homotopies.