diff --git a/config/codespell-dictionary.txt b/config/codespell-dictionary.txt
index 42eb42d013..7ebfe3a5ca 100644
--- a/config/codespell-dictionary.txt
+++ b/config/codespell-dictionary.txt
@@ -31,6 +31,7 @@ conisistsed->consisted
conisistsing->consisting
consistsed->consisted
consistsing->consisting
+diamgram->diagram
eacy->each,easy
embeddding->embedding
embedddings->embeddings
@@ -58,6 +59,7 @@ homomorphsim->homomorphism
homomorphsims->homomorphisms
identitification->identification
identitifications->identifications
+inhanited->inhabited
isomorhpism->isomorphism
isomorhpisms->isomorphisms
isomorhpsim->isomorphism
diff --git a/docs/tables/loop-spaces-concepts.md b/docs/tables/loop-spaces-concepts.md
index 3060bb5827..b08f5be7e4 100644
--- a/docs/tables/loop-spaces-concepts.md
+++ b/docs/tables/loop-spaces-concepts.md
@@ -8,5 +8,6 @@
| Functoriality of loop spaces | [`synthetic-homotopy-theory.functoriality-loop-spaces`](synthetic-homotopy-theory.functoriality-loop-spaces.md) |
| Groups of loops in 1-types | [`synthetic-homotopy-theory.groups-of-loops-in-1-types`](synthetic-homotopy-theory.groups-of-loops-in-1-types.md) |
| Iterated loop spaces | [`synthetic-homotopy-theory.iterated-loop-spaces`](synthetic-homotopy-theory.iterated-loop-spaces.md) |
+| Multivariable loop spaces | [`synthetic-homotopy-theory.multivariable-loop-spaces`](synthetic-homotopy-theory.multivariable-loop-spaces.md) |
| Powers of loops | [`synthetic-homotopy-theory.powers-of-loops`](synthetic-homotopy-theory.powers-of-loops.md) |
| Triple loop spaces | [`synthetic-homotopy-theory.triple-loop-spaces`](synthetic-homotopy-theory.triple-loop-spaces.md) |
diff --git a/src/structured-types.lagda.md b/src/structured-types.lagda.md
index dc561cf951..678b3cb60e 100644
--- a/src/structured-types.lagda.md
+++ b/src/structured-types.lagda.md
@@ -39,6 +39,7 @@ open import structured-types.involutive-type-of-h-space-structures public
open import structured-types.involutive-types public
open import structured-types.iterated-cartesian-products-types-equipped-with-endomorphisms public
open import structured-types.iterated-pointed-cartesian-product-types public
+open import structured-types.left-invertible-magmas public
open import structured-types.magmas public
open import structured-types.medial-magmas public
open import structured-types.mere-equivalences-types-equipped-with-endomorphisms public
diff --git a/src/structured-types/left-invertible-magmas.lagda.md b/src/structured-types/left-invertible-magmas.lagda.md
new file mode 100644
index 0000000000..de0a6427b2
--- /dev/null
+++ b/src/structured-types/left-invertible-magmas.lagda.md
@@ -0,0 +1,52 @@
+# Left-invertible magmas
+
+```agda
+module structured-types.left-invertible-magmas where
+```
+
+Imports
+
+```agda
+open import foundation.dependent-pair-types
+open import foundation.equivalences
+open import foundation.propositions
+open import foundation.universe-levels
+
+open import structured-types.magmas
+```
+
+
+
+## Idea
+
+A [magma](structured-types.magmas.md) `A` is
+{{#concept "left-invertible" Disambiguation="magma" Agda=is-left-invertible-Magma}}
+if the multiplication map `μ(a,-) : A → A` is an
+[equivalence](foundation-core.equivalences.md) for every `a : A`. In other
+words, if multiplying by a fixed element on the left is always an equivalence.
+
+Left-invertibility appears as Definition 2.1(4) of {{#cite BCFR23}} in the
+context of [H-spaces](structured-types.h-spaces.md).
+
+## Definition
+
+```agda
+module _
+ {l : Level} (A : Magma l)
+ where
+
+ is-left-invertible-Magma : UU l
+ is-left-invertible-Magma = (a : type-Magma A) → is-equiv (mul-Magma A a)
+
+ is-prop-is-left-invertible-Magma : is-prop is-left-invertible-Magma
+ is-prop-is-left-invertible-Magma =
+ is-prop-Π (λ a → is-property-is-equiv (mul-Magma A a))
+
+ is-left-invertible-prop-Magma : Prop l
+ is-left-invertible-prop-Magma =
+ ( is-left-invertible-Magma , is-prop-is-left-invertible-Magma)
+```
+
+## References
+
+{{#bibliography}}
diff --git a/src/structured-types/pointed-maps.lagda.md b/src/structured-types/pointed-maps.lagda.md
index 721206c4bf..15eaa85f3d 100644
--- a/src/structured-types/pointed-maps.lagda.md
+++ b/src/structured-types/pointed-maps.lagda.md
@@ -14,6 +14,8 @@ open import foundation.dependent-pair-types
open import foundation.function-types
open import foundation.identity-types
open import foundation.transport-along-identifications
+open import foundation.truncated-types
+open import foundation.truncation-levels
open import foundation.universe-levels
open import structured-types.pointed-dependent-functions
@@ -140,6 +142,21 @@ module _
pr2 id-pointed-map = refl
```
+### Truncatedness of the type of pointed maps
+
+```agda
+module _
+ {l1 l2 : Level} {A : Pointed-Type l1} {B : Pointed-Type l2}
+ where abstract
+
+ is-trunc-pointed-function-type :
+ (k : 𝕋) → is-trunc k (type-Pointed-Type B) → is-trunc k (pointed-map A B)
+ is-trunc-pointed-function-type k H =
+ is-trunc-Σ
+ ( is-trunc-function-type k H)
+ ( λ f → is-trunc-Id H (f (point-Pointed-Type A)) (point-Pointed-Type B))
+```
+
## See also
- [Constant pointed maps](structured-types.constant-pointed-maps.md)
diff --git a/src/synthetic-homotopy-theory.lagda.md b/src/synthetic-homotopy-theory.lagda.md
index 2839f2a816..500f6ef66e 100644
--- a/src/synthetic-homotopy-theory.lagda.md
+++ b/src/synthetic-homotopy-theory.lagda.md
@@ -102,6 +102,7 @@ open import synthetic-homotopy-theory.morphisms-descent-data-circle public
open import synthetic-homotopy-theory.morphisms-descent-data-pushouts public
open import synthetic-homotopy-theory.morphisms-sequential-diagrams public
open import synthetic-homotopy-theory.multiplication-circle public
+open import synthetic-homotopy-theory.multivariable-loop-spaces public
open import synthetic-homotopy-theory.null-cocones-under-pointed-span-diagrams public
open import synthetic-homotopy-theory.plus-principle public
open import synthetic-homotopy-theory.powers-of-loops public
diff --git a/src/synthetic-homotopy-theory/cofibers-of-maps.lagda.md b/src/synthetic-homotopy-theory/cofibers-of-maps.lagda.md
index 09fde243e6..fbe2b953f5 100644
--- a/src/synthetic-homotopy-theory/cofibers-of-maps.lagda.md
+++ b/src/synthetic-homotopy-theory/cofibers-of-maps.lagda.md
@@ -68,6 +68,12 @@ module _
universal-property-pushout f (terminal-map A) cocone-cofiber
universal-property-cofiber = up-pushout f (terminal-map A)
+ equiv-up-cofiber :
+ {l : Level} (X : UU l) → (cofiber → X) ≃ cocone f (terminal-map A) X
+ equiv-up-cofiber X =
+ ( cocone-map f (terminal-map A) cocone-cofiber ,
+ universal-property-cofiber X)
+
dependent-universal-property-cofiber :
dependent-universal-property-pushout f (terminal-map A) cocone-cofiber
dependent-universal-property-cofiber = dup-pushout f (terminal-map A)
@@ -76,6 +82,11 @@ module _
{l : Level} {X : UU l} → cocone f (terminal-map A) X → cofiber → X
cogap-cofiber = cogap f (terminal-map A)
+ equiv-cogap-cofiber :
+ {l : Level} (X : UU l) → cocone f (terminal-map A) X ≃ (cofiber → X)
+ equiv-cogap-cofiber X =
+ ( cogap-cofiber , is-equiv-map-inv-is-equiv (universal-property-cofiber X))
+
dependent-cogap-cofiber :
{l : Level} {P : cofiber → UU l}
(c : dependent-cocone f (terminal-map A) (cocone-cofiber) P)
diff --git a/src/synthetic-homotopy-theory/multivariable-loop-spaces.lagda.md b/src/synthetic-homotopy-theory/multivariable-loop-spaces.lagda.md
new file mode 100644
index 0000000000..f70aa3511f
--- /dev/null
+++ b/src/synthetic-homotopy-theory/multivariable-loop-spaces.lagda.md
@@ -0,0 +1,711 @@
+# Multivariable loop spaces
+
+```agda
+module synthetic-homotopy-theory.multivariable-loop-spaces where
+```
+
+Imports
+
+```agda
+open import foundation.action-on-identifications-functions
+open import foundation.cartesian-product-types
+open import foundation.commuting-triangles-of-identifications
+open import foundation.constant-maps
+open import foundation.coproduct-types
+open import foundation.dependent-pair-types
+open import foundation.empty-types
+open import foundation.equivalences
+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.inhabited-types
+open import foundation.path-algebra
+open import foundation.propositional-truncations
+open import foundation.retractions
+open import foundation.sections
+open import foundation.structure-identity-principle
+open import foundation.torsorial-type-families
+open import foundation.truncated-types
+open import foundation.truncation-levels
+open import foundation.type-arithmetic-cartesian-product-types
+open import foundation.type-arithmetic-dependent-pair-types
+open import foundation.unit-type
+open import foundation.universal-property-empty-type
+open import foundation.universal-property-maybe
+open import foundation.universe-levels
+
+open import structured-types.h-spaces
+open import structured-types.left-invertible-magmas
+open import structured-types.magmas
+open import structured-types.pointed-equivalences
+open import structured-types.pointed-homotopies
+open import structured-types.pointed-maps
+open import structured-types.pointed-types
+
+open import synthetic-homotopy-theory.cavallos-trick
+open import synthetic-homotopy-theory.loop-spaces
+open import synthetic-homotopy-theory.suspensions-of-types
+```
+
+
+
+## Idea
+
+Given a type `I` and a [pointed type](structured-types.pointed-types.md)
+`a∗ : A`, we can form the {{#concept "`I`-ary loop space" Agda=multivar-Ω}} in
+`A` as the type `Σ (a : A), (I → (a = a∗))`. This type is canonically pointed
+at `(a∗ , refl-htpy)`. We recover the
+[standard loop space](synthetic-homotopy-theory.loop-spaces.md) `ΩA` as the
+`1+1`-ary loops, there is a unique `1`-ary loop, and we recover `A` itself as
+the `∅`-loops. The `𝕊¹`-ary loops correspond to
+[loops of loops](synthetic-homotopy-theory.double-loop-spaces.md). Observe that
+among pointed types `1+1` represents elements, and so we should interpret
+`1+1`-ary as _unary_ loops rather than binary ones, which is consistent with the
+fact that `1+1`-ary loops yields the standard loops.
+
+For every point `x` of `I` there is a coherent, associative, and invertible
+[H-space structure](structured-types.h-spaces.md) on `I`-ary loops, and moreover
+any point `x` of `I` gives a
+[pointed equivalence](structured-types.pointed-equivalences.md) between `I`-ary
+loops of `A` and `(I,x) →∗ ΩA`.
+
+## Table of files directly related to loop spaces
+
+{{#include tables/loop-spaces-concepts.md}}
+
+## Definitions
+
+### The `I`-ary loop space
+
+```agda
+module _
+ {l1 l2 : Level} (I : UU l1) (A∗ : Pointed-Type l2)
+ (let A = type-Pointed-Type A∗) (let a∗ = point-Pointed-Type A∗)
+ where
+
+ type-multivar-Ω : UU (l1 ⊔ l2)
+ type-multivar-Ω = Σ A (λ a → I → a = a∗)
+
+ refl-multivar-Ω : type-multivar-Ω
+ refl-multivar-Ω = (a∗ , refl-htpy)
+
+ multivar-Ω : Pointed-Type (l1 ⊔ l2)
+ multivar-Ω = (type-multivar-Ω , refl-multivar-Ω)
+```
+
+## Properties
+
+### Characterizing equality in `I`-ary loop spaces
+
+```agda
+module _
+ {l1 l2 : Level} {I : UU l1} {A∗ : Pointed-Type l2}
+ where
+
+ Eq-multivar-Ω : (x y : type-multivar-Ω I A∗) → UU (l1 ⊔ l2)
+ Eq-multivar-Ω (a , p) (b , q) =
+ Σ ( a = b)
+ ( λ r → (i : I) → coherence-triangle-identifications (p i) (q i) r)
+
+ refl-Eq-multivar-Ω : (x : type-multivar-Ω I A∗) → Eq-multivar-Ω x x
+ refl-Eq-multivar-Ω p = (refl , refl-htpy)
+
+ Eq-eq-multivar-Ω :
+ (x y : type-multivar-Ω I A∗) → x = y → Eq-multivar-Ω x y
+ Eq-eq-multivar-Ω x .x refl = refl-Eq-multivar-Ω x
+
+ abstract
+ is-torsorial-Eq-multivar-Ω :
+ (x : type-multivar-Ω I A∗) → is-torsorial (Eq-multivar-Ω x)
+ is-torsorial-Eq-multivar-Ω (a , p) =
+ is-torsorial-Eq-structure
+ ( is-torsorial-Id a)
+ ( a , refl)
+ ( is-torsorial-htpy p)
+
+ is-equiv-Eq-eq-multivar-Ω :
+ (x y : type-multivar-Ω I A∗) → is-equiv (Eq-eq-multivar-Ω x y)
+ is-equiv-Eq-eq-multivar-Ω x =
+ fundamental-theorem-id (is-torsorial-Eq-multivar-Ω x) (Eq-eq-multivar-Ω x)
+
+ extensionality-multivar-Ω :
+ (x y : type-multivar-Ω I A∗) → (x = y) ≃ Eq-multivar-Ω x y
+ extensionality-multivar-Ω x y =
+ ( Eq-eq-multivar-Ω x y , is-equiv-Eq-eq-multivar-Ω x y)
+
+ eq-Eq-multivar-Ω :
+ (x y : type-multivar-Ω I A∗) → Eq-multivar-Ω x y → x = y
+ eq-Eq-multivar-Ω x y =
+ map-inv-equiv (extensionality-multivar-Ω x y)
+```
+
+### Characterizing equality of equality in `I`-ary loop spaces
+
+```agda
+module _
+ {l1 l2 : Level} {I : UU l1} {A∗ : Pointed-Type l2}
+ (x y : type-multivar-Ω I A∗)
+ where
+
+ Eq²-multivar-Ω :
+ (p q : Eq-multivar-Ω x y) → UU (l1 ⊔ l2)
+ Eq²-multivar-Ω (p , H) (q , K) =
+ Σ (p = q) (λ r → (i : I) → H i ∙ ap (_∙ pr2 y i) r = K i)
+
+ refl-Eq²-multivar-Ω :
+ (p : Eq-multivar-Ω x y) → Eq²-multivar-Ω p p
+ refl-Eq²-multivar-Ω p = (refl , right-unit-htpy)
+
+ Eq²-eq-multivar-Ω :
+ (p q : Eq-multivar-Ω x y) → p = q → Eq²-multivar-Ω p q
+ Eq²-eq-multivar-Ω p .p refl = refl-Eq²-multivar-Ω p
+
+ abstract
+ is-torsorial-Eq²-multivar-Ω :
+ (p : Eq-multivar-Ω x y) → is-torsorial (Eq²-multivar-Ω p)
+ is-torsorial-Eq²-multivar-Ω (a , p) =
+ is-torsorial-Eq-structure
+ ( is-torsorial-Id a)
+ ( a , refl)
+ ( is-torsorial-htpy (p ∙h refl-htpy))
+
+ is-equiv-Eq²-eq-multivar-Ω :
+ (p q : Eq-multivar-Ω x y) → is-equiv (Eq²-eq-multivar-Ω p q)
+ is-equiv-Eq²-eq-multivar-Ω p =
+ fundamental-theorem-id
+ ( is-torsorial-Eq²-multivar-Ω p)
+ ( Eq²-eq-multivar-Ω p)
+
+ extensionality²-multivar-Ω :
+ (p q : Eq-multivar-Ω x y) → (p = q) ≃ Eq²-multivar-Ω p q
+ extensionality²-multivar-Ω p q =
+ ( Eq²-eq-multivar-Ω p q , is-equiv-Eq²-eq-multivar-Ω p q)
+
+ eq-Eq²-multivar-Ω :
+ (p q : Eq-multivar-Ω x y) → Eq²-multivar-Ω p q → p = q
+ eq-Eq²-multivar-Ω p q =
+ map-inv-equiv (extensionality²-multivar-Ω p q)
+```
+
+### The `I`-ary loops over a pointed type forms a magma
+
+```agda
+module _
+ {l1 l2 : Level} (I∗ : Pointed-Type l1) (A∗ : Pointed-Type l2)
+ (let I = type-Pointed-Type I∗) (let i∗ = point-Pointed-Type I∗)
+ (let A = type-Pointed-Type A∗) (let a∗ = point-Pointed-Type A∗)
+ where
+
+ mul-multivar-Ω :
+ type-multivar-Ω I A∗ → type-multivar-Ω I A∗ → type-multivar-Ω I A∗
+ mul-multivar-Ω (a , p) (b , q) = (a , (λ x → p x ∙ inv (q i∗) ∙ q x))
+
+ multivar-Ω-Magma : Magma (l1 ⊔ l2)
+ multivar-Ω-Magma = (type-multivar-Ω I A∗ , mul-multivar-Ω)
+```
+
+### The coherent H-space of `I`-ary loops, for pointed `I`
+
+```agda
+module _
+ {l1 l2 : Level}
+ (I∗ : Pointed-Type l1) (A∗ : Pointed-Type l2)
+ (let I = type-Pointed-Type I∗) (let i∗ = point-Pointed-Type I∗)
+ (let A = type-Pointed-Type A∗) (let a∗ = point-Pointed-Type A∗)
+ where
+
+ Eq-left-unit-law-mul-multivar-Ω :
+ (x : type-multivar-Ω I A∗) →
+ Eq-multivar-Ω (mul-multivar-Ω I∗ A∗ (refl-multivar-Ω I A∗) x) x
+ Eq-left-unit-law-mul-multivar-Ω (a , p) = (inv (p i∗) , refl-htpy)
+
+ left-unit-law-mul-multivar-Ω :
+ (x : type-multivar-Ω I A∗) →
+ mul-multivar-Ω I∗ A∗ (refl-multivar-Ω I A∗) x = x
+ left-unit-law-mul-multivar-Ω x =
+ eq-Eq-multivar-Ω
+ ( mul-multivar-Ω I∗ A∗ (refl-multivar-Ω I A∗) x)
+ ( x)
+ ( Eq-left-unit-law-mul-multivar-Ω x)
+
+ Eq-right-unit-law-mul-multivar-Ω :
+ (x : type-multivar-Ω I A∗) →
+ Eq-multivar-Ω (mul-multivar-Ω I∗ A∗ x (refl-multivar-Ω I A∗)) x
+ Eq-right-unit-law-mul-multivar-Ω x =
+ ( refl , right-unit-htpy ∙h right-unit-htpy)
+
+ right-unit-law-mul-multivar-Ω :
+ (x : type-multivar-Ω I A∗) →
+ mul-multivar-Ω I∗ A∗ x (refl-multivar-Ω I A∗) = x
+ right-unit-law-mul-multivar-Ω x =
+ eq-Eq-multivar-Ω
+ ( mul-multivar-Ω I∗ A∗ x (refl-multivar-Ω I A∗))
+ ( x)
+ ( Eq-right-unit-law-mul-multivar-Ω x)
+
+ Eq-coherence-unit-laws-mul-multivar-Ω :
+ Eq²-multivar-Ω
+ ( mul-multivar-Ω I∗ A∗ (refl-multivar-Ω I A∗) (refl-multivar-Ω I A∗))
+ ( refl-multivar-Ω I A∗)
+ ( Eq-left-unit-law-mul-multivar-Ω (refl-multivar-Ω I A∗))
+ ( Eq-right-unit-law-mul-multivar-Ω (refl-multivar-Ω I A∗))
+ Eq-coherence-unit-laws-mul-multivar-Ω =
+ ( refl , refl-htpy)
+
+ coherence-unit-laws-mul-multivar-Ω :
+ left-unit-law-mul-multivar-Ω (refl-multivar-Ω I A∗) =
+ right-unit-law-mul-multivar-Ω (refl-multivar-Ω I A∗)
+ coherence-unit-laws-mul-multivar-Ω = refl
+
+ multivar-Ω-H-Space : H-Space (l1 ⊔ l2)
+ multivar-Ω-H-Space =
+ ( multivar-Ω I A∗ ,
+ mul-multivar-Ω I∗ A∗ ,
+ left-unit-law-mul-multivar-Ω ,
+ right-unit-law-mul-multivar-Ω ,
+ coherence-unit-laws-mul-multivar-Ω)
+```
+
+### Associativity of multiplication
+
+```agda
+module _
+ {l1 l2 : Level}
+ (I∗ : Pointed-Type l1) (A∗ : Pointed-Type l2)
+ (let I = type-Pointed-Type I∗) (let i∗ = point-Pointed-Type I∗)
+ (let A = type-Pointed-Type A∗) (let a∗ = point-Pointed-Type A∗)
+ where
+
+ Eq-associative-mul-multivar-Ω :
+ (x y z : type-multivar-Ω I A∗) →
+ Eq-multivar-Ω
+ ( mul-multivar-Ω I∗ A∗ (mul-multivar-Ω I∗ A∗ x y) z)
+ ( mul-multivar-Ω I∗ A∗ x (mul-multivar-Ω I∗ A∗ y z))
+ pr1 (Eq-associative-mul-multivar-Ω (a , p) (b , q) (c , r)) = refl
+ pr2 (Eq-associative-mul-multivar-Ω (a , p) (b , q) (c , r)) x =
+ equational-reasoning
+ (((p x ∙ inv (q i∗)) ∙ q x) ∙ inv (r i∗)) ∙ r x
+ = (p x ∙ inv (q i∗)) ∙ ((q x ∙ inv (r i∗)) ∙ r x)
+ by
+ assoc²-1 (p x ∙ inv (q i∗)) (q x) (inv (r i∗)) (r x)
+ = (p x ∙ inv ((q i∗ ∙ inv (r i∗)) ∙ r i∗)) ∙ ((q x ∙ inv (r i∗)) ∙ r x)
+ by
+ ap
+ ( λ u → (p x ∙ inv u) ∙ (q x ∙ inv (r i∗) ∙ r x))
+ ( inv (is-section-inv-concat' (r i∗) (q i∗)))
+
+ associative-mul-multivar-Ω :
+ (x y z : type-multivar-Ω I A∗) →
+ mul-multivar-Ω I∗ A∗ (mul-multivar-Ω I∗ A∗ x y) z =
+ mul-multivar-Ω I∗ A∗ x (mul-multivar-Ω I∗ A∗ y z)
+ associative-mul-multivar-Ω x y z =
+ eq-Eq-multivar-Ω
+ ( mul-multivar-Ω I∗ A∗ (mul-multivar-Ω I∗ A∗ x y) z)
+ ( mul-multivar-Ω I∗ A∗ x (mul-multivar-Ω I∗ A∗ y z))
+ ( Eq-associative-mul-multivar-Ω x y z)
+```
+
+### The multiplicative inverse
+
+Given `i∗ : I` and `a∗ : A`, then any `I`-ary loop `(a , p)` has a
+multiplicative inverse given by `(a∗ , (i ↦ (p i)⁻¹ ∙ p i∗)`.
+
+```agda
+module _
+ {l1 l2 : Level}
+ (I∗ : Pointed-Type l1) (A∗ : Pointed-Type l2)
+ (let I = type-Pointed-Type I∗) (let i∗ = point-Pointed-Type I∗)
+ (let A = type-Pointed-Type A∗) (let a∗ = point-Pointed-Type A∗)
+ where
+
+ inv-multivar-Ω : type-multivar-Ω I A∗ → type-multivar-Ω I A∗
+ inv-multivar-Ω (a , p) = (a∗ , (λ i → inv (p i) ∙ p i∗))
+
+ Eq-right-inverse-law-mul-multivar-Ω :
+ (x : type-multivar-Ω I A∗) →
+ Eq-multivar-Ω
+ ( mul-multivar-Ω I∗ A∗ x (inv-multivar-Ω x))
+ ( refl-multivar-Ω I A∗)
+ pr1 (Eq-right-inverse-law-mul-multivar-Ω (a , p)) = p i∗
+ pr2 (Eq-right-inverse-law-mul-multivar-Ω (a , p)) x =
+ equational-reasoning
+ (p x ∙ inv (inv (p i∗) ∙ p i∗)) ∙ (inv (p x) ∙ p i∗)
+ = p x ∙ (inv (p x) ∙ p i∗)
+ by
+ ap
+ ( _∙ (inv (p x) ∙ p i∗))
+ ( ap (p x ∙_) (ap inv (left-inv (p i∗))) ∙ right-unit)
+ = p i∗
+ by is-section-inv-concat (p x) (p i∗)
+ = p i∗ ∙ refl
+ by inv right-unit
+
+ right-inverse-law-mul-multivar-Ω :
+ (x : type-multivar-Ω I A∗) →
+ mul-multivar-Ω I∗ A∗ x (inv-multivar-Ω x) =
+ refl-multivar-Ω I A∗
+ right-inverse-law-mul-multivar-Ω x =
+ eq-Eq-multivar-Ω
+ ( mul-multivar-Ω I∗ A∗ x (inv-multivar-Ω x))
+ ( refl-multivar-Ω I A∗)
+ ( Eq-right-inverse-law-mul-multivar-Ω x)
+
+ Eq-left-inverse-law-mul-multivar-Ω :
+ (x : type-multivar-Ω I A∗) →
+ Eq-multivar-Ω
+ ( mul-multivar-Ω I∗ A∗ (inv-multivar-Ω x) x)
+ ( refl-multivar-Ω I A∗)
+ pr1 (Eq-left-inverse-law-mul-multivar-Ω (a , p)) = refl
+ pr2 (Eq-left-inverse-law-mul-multivar-Ω (a , p)) i =
+ equational-reasoning
+ ((inv (p i) ∙ p i∗) ∙ inv (p i∗)) ∙ p i
+ = inv (p i) ∙ p i
+ by ap (_∙ p i) (is-retraction-inv-concat' (p i∗) (inv (p i)))
+ = refl by left-inv (p i)
+
+ left-inverse-law-mul-multivar-Ω :
+ (x : type-multivar-Ω I A∗) →
+ mul-multivar-Ω I∗ A∗ (inv-multivar-Ω x) x =
+ refl-multivar-Ω I A∗
+ left-inverse-law-mul-multivar-Ω x =
+ eq-Eq-multivar-Ω
+ ( mul-multivar-Ω I∗ A∗ (inv-multivar-Ω x) x)
+ ( refl-multivar-Ω I A∗)
+ ( Eq-left-inverse-law-mul-multivar-Ω x)
+```
+
+### Invertibility of left and right multiplication
+
+```agda
+module _
+ {l1 l2 : Level}
+ (I∗ : Pointed-Type l1) (A∗ : Pointed-Type l2)
+ (let I = type-Pointed-Type I∗)
+ (let A = type-Pointed-Type A∗)
+ where
+
+ left-mul-inv-multivar-Ω :
+ type-multivar-Ω I A∗ → type-multivar-Ω I A∗ → type-multivar-Ω I A∗
+ left-mul-inv-multivar-Ω a =
+ mul-multivar-Ω I∗ A∗ (inv-multivar-Ω I∗ A∗ a)
+
+ is-section-left-mul-inv-multivar-Ω :
+ (a : type-multivar-Ω I A∗) →
+ is-section (mul-multivar-Ω I∗ A∗ a) (left-mul-inv-multivar-Ω a)
+ is-section-left-mul-inv-multivar-Ω a x =
+ equational-reasoning
+ mul-multivar-Ω I∗ A∗ a (mul-multivar-Ω I∗ A∗ (inv-multivar-Ω I∗ A∗ a) x)
+ = mul-multivar-Ω I∗ A∗ (mul-multivar-Ω I∗ A∗ a (inv-multivar-Ω I∗ A∗ a)) x
+ by inv (associative-mul-multivar-Ω I∗ A∗ a (inv-multivar-Ω I∗ A∗ a) x)
+ = mul-multivar-Ω I∗ A∗ (refl-multivar-Ω I A∗) x
+ by
+ ap
+ ( λ u → mul-multivar-Ω I∗ A∗ u x)
+ ( right-inverse-law-mul-multivar-Ω I∗ A∗ a)
+ = x
+ by left-unit-law-mul-multivar-Ω I∗ A∗ x
+
+ is-retraction-left-mul-inv-multivar-Ω :
+ (a : type-multivar-Ω I A∗) →
+ is-retraction (mul-multivar-Ω I∗ A∗ a) (left-mul-inv-multivar-Ω a)
+ is-retraction-left-mul-inv-multivar-Ω a x =
+ equational-reasoning
+ mul-multivar-Ω I∗ A∗
+ ( inv-multivar-Ω I∗ A∗ a)
+ ( mul-multivar-Ω I∗ A∗ a x)
+ = mul-multivar-Ω I∗ A∗
+ ( mul-multivar-Ω I∗ A∗ (inv-multivar-Ω I∗ A∗ a) a)
+ ( x)
+ by
+ inv (associative-mul-multivar-Ω I∗ A∗ (inv-multivar-Ω I∗ A∗ a) a x)
+ = mul-multivar-Ω I∗ A∗ (refl-multivar-Ω I A∗) x
+ by
+ ap
+ ( λ u → mul-multivar-Ω I∗ A∗ u x)
+ ( left-inverse-law-mul-multivar-Ω I∗ A∗ a)
+ = x by left-unit-law-mul-multivar-Ω I∗ A∗ x
+
+ section-left-mul-multivar-Ω :
+ (a : type-multivar-Ω I A∗) → section (mul-multivar-Ω I∗ A∗ a)
+ section-left-mul-multivar-Ω a =
+ ( left-mul-inv-multivar-Ω a ,
+ is-section-left-mul-inv-multivar-Ω a)
+
+ retraction-left-mul-multivar-Ω :
+ (a : type-multivar-Ω I A∗) → retraction (mul-multivar-Ω I∗ A∗ a)
+ retraction-left-mul-multivar-Ω a =
+ ( left-mul-inv-multivar-Ω a ,
+ is-retraction-left-mul-inv-multivar-Ω a)
+
+ is-equiv-left-mul-multivar-Ω :
+ (a : type-multivar-Ω I A∗) → is-equiv (mul-multivar-Ω I∗ A∗ a)
+ is-equiv-left-mul-multivar-Ω a =
+ is-equiv-is-invertible
+ ( left-mul-inv-multivar-Ω a)
+ ( is-section-left-mul-inv-multivar-Ω a)
+ ( is-retraction-left-mul-inv-multivar-Ω a)
+
+ equiv-left-mul-multivar-Ω :
+ (a : type-multivar-Ω I A∗) → type-multivar-Ω I A∗ ≃ type-multivar-Ω I A∗
+ equiv-left-mul-multivar-Ω a =
+ ( mul-multivar-Ω I∗ A∗ a , is-equiv-left-mul-multivar-Ω a)
+
+ is-left-invertible-mul-multivar-Ω :
+ is-left-invertible-Magma (multivar-Ω-Magma I∗ A∗)
+ is-left-invertible-mul-multivar-Ω = is-equiv-left-mul-multivar-Ω
+```
+
+```agda
+module _
+ {l1 l2 : Level}
+ (I∗ : Pointed-Type l1) (A∗ : Pointed-Type l2)
+ (let I = type-Pointed-Type I∗)
+ (let A = type-Pointed-Type A∗)
+ where
+
+ right-mul-inv-multivar-Ω :
+ type-multivar-Ω I A∗ → type-multivar-Ω I A∗ → type-multivar-Ω I A∗
+ right-mul-inv-multivar-Ω a x =
+ mul-multivar-Ω I∗ A∗ x (inv-multivar-Ω I∗ A∗ a)
+
+ is-section-right-mul-inv-multivar-Ω :
+ (a : type-multivar-Ω I A∗) →
+ is-section
+ ( λ x → mul-multivar-Ω I∗ A∗ x a)
+ ( right-mul-inv-multivar-Ω a)
+ is-section-right-mul-inv-multivar-Ω a x =
+ equational-reasoning
+ mul-multivar-Ω I∗ A∗ (mul-multivar-Ω I∗ A∗ x (inv-multivar-Ω I∗ A∗ a)) a
+ = mul-multivar-Ω I∗ A∗ x (mul-multivar-Ω I∗ A∗ (inv-multivar-Ω I∗ A∗ a) a)
+ by associative-mul-multivar-Ω I∗ A∗ x (inv-multivar-Ω I∗ A∗ a) a
+ = mul-multivar-Ω I∗ A∗ x (refl-multivar-Ω I A∗)
+ by ap (mul-multivar-Ω I∗ A∗ x) (left-inverse-law-mul-multivar-Ω I∗ A∗ a)
+ = x
+ by right-unit-law-mul-multivar-Ω I∗ A∗ x
+
+ is-retraction-right-mul-inv-multivar-Ω :
+ (a : type-multivar-Ω I A∗) →
+ is-retraction
+ ( λ x → mul-multivar-Ω I∗ A∗ x a)
+ ( right-mul-inv-multivar-Ω a)
+ is-retraction-right-mul-inv-multivar-Ω a x =
+ equational-reasoning
+ mul-multivar-Ω I∗ A∗ (mul-multivar-Ω I∗ A∗ x a) (inv-multivar-Ω I∗ A∗ a)
+ = mul-multivar-Ω I∗ A∗ x (mul-multivar-Ω I∗ A∗ a (inv-multivar-Ω I∗ A∗ a))
+ by associative-mul-multivar-Ω I∗ A∗ x a (inv-multivar-Ω I∗ A∗ a)
+ = mul-multivar-Ω I∗ A∗ x (refl-multivar-Ω I A∗)
+ by
+ ap (mul-multivar-Ω I∗ A∗ x) (right-inverse-law-mul-multivar-Ω I∗ A∗ a)
+ = x
+ by right-unit-law-mul-multivar-Ω I∗ A∗ x
+
+ section-right-mul-multivar-Ω :
+ (a : type-multivar-Ω I A∗) →
+ section (λ x → mul-multivar-Ω I∗ A∗ x a)
+ section-right-mul-multivar-Ω a =
+ ( right-mul-inv-multivar-Ω a ,
+ is-section-right-mul-inv-multivar-Ω a)
+
+ retraction-right-mul-multivar-Ω :
+ (a : type-multivar-Ω I A∗) →
+ retraction (λ x → mul-multivar-Ω I∗ A∗ x a)
+ retraction-right-mul-multivar-Ω a =
+ ( right-mul-inv-multivar-Ω a ,
+ is-retraction-right-mul-inv-multivar-Ω a)
+
+ is-equiv-right-mul-multivar-Ω :
+ (a : type-multivar-Ω I A∗) →
+ is-equiv (λ x → mul-multivar-Ω I∗ A∗ x a)
+ is-equiv-right-mul-multivar-Ω a =
+ is-equiv-is-invertible
+ ( right-mul-inv-multivar-Ω a)
+ ( is-section-right-mul-inv-multivar-Ω a)
+ ( is-retraction-right-mul-inv-multivar-Ω a)
+
+ equiv-right-mul-multivar-Ω :
+ (a : type-multivar-Ω I A∗) → type-multivar-Ω I A∗ ≃ type-multivar-Ω I A∗
+ equiv-right-mul-multivar-Ω a =
+ ((λ x → mul-multivar-Ω I∗ A∗ x a) , is-equiv-right-mul-multivar-Ω a)
+```
+
+### If `I` is pointed then `I`-ary loops are pointed equivalent to pointed maps `I →∗ ΩA`
+
+First we demonstrate the equivalence directly as a composite of simple
+equivalences, then we construct the explicit map and demonstrate that it is also
+pointed.
+
+```agda
+module _
+ {l1 l2 : Level}
+ (I∗ : Pointed-Type l1) (A∗ : Pointed-Type l2)
+ (let I = type-Pointed-Type I∗) (let i∗ = point-Pointed-Type I∗)
+ (let A = type-Pointed-Type A∗) (let a∗ = point-Pointed-Type A∗)
+ where
+
+ abstract
+ compute-type-multivar-Ω-pointed' :
+ type-multivar-Ω I A∗ ≃ (I∗ →∗ Ω A∗)
+ compute-type-multivar-Ω-pointed' =
+ equivalence-reasoning
+ Σ A (λ a → I → a = a∗)
+ ≃ Σ A (λ a → Σ (I → a = a∗) (λ f → Σ (a = a∗) (f i∗ =_)))
+ by
+ equiv-tot
+ ( λ a →
+ inv-right-unit-law-Σ-is-contr (λ f → is-torsorial-Id (f i∗)))
+ ≃ Σ (Σ A (_= a∗)) (λ (a , p) → Σ (I → a = a∗) (λ a → a i∗ = p))
+ by inv-associative-Σ ∘e equiv-tot (λ a → equiv-left-swap-Σ)
+ ≃ Σ (I → a∗ = a∗) (λ f → f i∗ = refl)
+ by left-unit-law-Σ-is-contr (is-torsorial-Id' a∗) (a∗ , refl)
+
+ map-compute-multivar-Ω-pointed :
+ type-multivar-Ω I A∗ → (I∗ →∗ Ω A∗)
+ map-compute-multivar-Ω-pointed (a , p) =
+ ( (λ i → inv (p i∗) ∙ p i) , left-inv (p i∗))
+
+ map-inv-compute-multivar-Ω-pointed :
+ (I∗ →∗ Ω A∗) → type-multivar-Ω I A∗
+ map-inv-compute-multivar-Ω-pointed (f , p) = (a∗ , f)
+
+ is-section-map-inv-compute-multivar-Ω-pointed :
+ is-section map-compute-multivar-Ω-pointed map-inv-compute-multivar-Ω-pointed
+ is-section-map-inv-compute-multivar-Ω-pointed (f , p) =
+ eq-pointed-htpy _ _
+ ( cavallos-trick-H-Space' I∗ (Ω-H-Space A∗) _ _
+ ( λ x → ap (λ u → inv u ∙ f x) p))
+
+ is-retraction-map-inv-compute-multivar-Ω-pointed :
+ is-retraction
+ ( map-compute-multivar-Ω-pointed)
+ ( map-inv-compute-multivar-Ω-pointed)
+ is-retraction-map-inv-compute-multivar-Ω-pointed (a , p) =
+ eq-Eq-multivar-Ω _ _ (inv (p i∗) , refl-htpy)
+
+ preserves-point-map-compute-multivar-Ω-pointed :
+ map-compute-multivar-Ω-pointed (refl-multivar-Ω I A∗) =
+ ( const I (refl-Ω A∗) , refl)
+ preserves-point-map-compute-multivar-Ω-pointed = refl
+
+ is-equiv-map-compute-multivar-Ω-pointed :
+ is-equiv map-compute-multivar-Ω-pointed
+ is-equiv-map-compute-multivar-Ω-pointed =
+ is-equiv-is-invertible
+ ( map-inv-compute-multivar-Ω-pointed)
+ ( is-section-map-inv-compute-multivar-Ω-pointed)
+ ( is-retraction-map-inv-compute-multivar-Ω-pointed)
+
+ compute-type-multivar-Ω-pointed :
+ type-multivar-Ω I A∗ ≃ (I∗ →∗ Ω A∗)
+ compute-type-multivar-Ω-pointed =
+ ( map-compute-multivar-Ω-pointed ,
+ is-equiv-map-compute-multivar-Ω-pointed)
+
+ compute-multivar-Ω-pointed :
+ multivar-Ω I A∗ ≃∗ (I∗ →∗ Ω A∗ , (const I (refl-Ω A∗) , refl))
+ compute-multivar-Ω-pointed =
+ ( compute-type-multivar-Ω-pointed ,
+ preserves-point-map-compute-multivar-Ω-pointed)
+```
+
+### ∅-ary loops
+
+```agda
+module _
+ {l : Level} (A∗ : Pointed-Type l)
+ (let A = type-Pointed-Type A∗) (let a∗ = point-Pointed-Type A∗)
+ where
+
+ compute-type-multivar-Ω-empty : type-multivar-Ω empty A∗ ≃ A
+ compute-type-multivar-Ω-empty =
+ right-unit-law-Σ-is-contr (λ a → universal-property-empty' (a = a∗))
+
+ preserves-point-map-compute-multivar-Ω-empty :
+ map-equiv compute-type-multivar-Ω-empty (refl-multivar-Ω empty A∗) = a∗
+ preserves-point-map-compute-multivar-Ω-empty = refl
+
+ compute-multivar-Ω-empty : multivar-Ω empty A∗ ≃∗ A∗
+ pr1 compute-multivar-Ω-empty = compute-type-multivar-Ω-empty
+ pr2 compute-multivar-Ω-empty = preserves-point-map-compute-multivar-Ω-empty
+```
+
+### `I+1`-ary loops
+
+`(I + 1)`-ary loops are equivalent to families of loops `I → ΩA`, where `Ω` is
+the standard loop type.
+
+```agda
+module _
+ {l1 l2 : Level} {I : UU l1} (A∗ : Pointed-Type l2)
+ (let A = type-Pointed-Type A∗) (let a∗ = point-Pointed-Type A∗)
+ where
+
+ compute-type-multivar-Ω-isolated-point :
+ type-multivar-Ω (I + unit) A∗ ≃ (I → type-Ω A∗)
+ compute-type-multivar-Ω-isolated-point =
+ equivalence-reasoning
+ Σ A (λ a → I + unit → a = a∗)
+ ≃ Σ A (λ a → (I → a = a∗) × (a = a∗))
+ by equiv-tot (λ a → equiv-universal-property-Maybe)
+ ≃ Σ A (λ a → (a = a∗) × (I → a = a∗))
+ by equiv-tot (λ a → commutative-product)
+ ≃ Σ (Σ A (λ a → (a = a∗))) (λ u → (I → pr1 u = a∗))
+ by inv-associative-Σ
+ ≃ (I → type-Ω A∗)
+ by left-unit-law-Σ-is-contr (is-torsorial-Id' a∗) (a∗ , refl)
+```
+
+### `ΣI`-ary loops are `I`-ary loops of loops
+
+For every type $I$ we have an equivalence
+
+$$Ω_{ΣI}(A) ≃ Ω_I(Ω(A))$$
+
+where $ΣI$ denotes the
+[suspension](synthetic-homotopy-theory.suspensions-of-types.md) of $I$.
+
+```agda
+module _
+ {l1 l2 : Level} (I : UU l1) (A∗ : Pointed-Type l2)
+ (let A = type-Pointed-Type A∗) (let a∗ = point-Pointed-Type A∗)
+ where
+
+ compute-type-multivar-Ω-suspension :
+ type-multivar-Ω (suspension I) A∗ ≃ type-multivar-Ω I (Ω A∗)
+ compute-type-multivar-Ω-suspension =
+ equivalence-reasoning
+ Σ A (λ a → suspension I → a = a∗)
+ ≃ Σ A (λ a → Σ (a = a∗) (λ S → Σ (a = a∗) (λ N → I → N = S)))
+ by equiv-tot (λ a → equiv-left-swap-Σ ∘e equiv-up-suspension)
+ ≃ Σ (Σ A (λ a → a = a∗)) (λ (a , S) → Σ (a = a∗) (λ N → I → N = S))
+ by inv-associative-Σ
+ ≃ Σ (a∗ = a∗) (λ N → I → N = refl)
+ by left-unit-law-Σ-is-contr (is-torsorial-Id' a∗) (a∗ , refl-Ω A∗)
+```
+
+### Truncatedness of `I`-ary loops
+
+```agda
+module _
+ {l1 l2 : Level} (I : UU l1) (A∗ : Pointed-Type l2)
+ where abstract
+
+ is-trunc-type-multivar-Ω-has-element :
+ (k : 𝕋) → I → is-trunc (succ-𝕋 k) (type-Pointed-Type A∗) →
+ is-trunc k (type-multivar-Ω I A∗)
+ is-trunc-type-multivar-Ω-has-element k i∗ K =
+ is-trunc-equiv k ((I , i∗) →∗ Ω A∗)
+ ( compute-type-multivar-Ω-pointed (I , i∗) A∗)
+ ( is-trunc-pointed-function-type k
+ ( K (point-Pointed-Type A∗) (point-Pointed-Type A∗)))
+
+ is-trunc-type-multivar-Ω-is-inhabited :
+ (k : 𝕋) → is-inhabited I → is-trunc (succ-𝕋 k) (type-Pointed-Type A∗) →
+ is-trunc k (type-multivar-Ω I A∗)
+ is-trunc-type-multivar-Ω-is-inhabited k H K =
+ rec-trunc-Prop
+ ( is-trunc-Prop k (type-multivar-Ω I A∗))
+ ( λ i∗ → is-trunc-type-multivar-Ω-has-element k i∗ K)
+ ( H)
+```