diff --git a/src/foundation-core/binary-relations.lagda.md b/src/foundation-core/binary-relations.lagda.md new file mode 100644 index 0000000000..a9f319735f --- /dev/null +++ b/src/foundation-core/binary-relations.lagda.md @@ -0,0 +1,220 @@ +# Binary relations + +```agda +module foundation-core.binary-relations where +``` + +
Imports + +```agda +open import foundation.cartesian-product-types +open import foundation.dependent-pair-types +open import foundation.iterated-dependent-product-types +open import foundation.universe-levels + +open import foundation-core.identity-types +open import foundation-core.negation +open import foundation-core.propositions +``` + +
+ +## Idea + +A {{#concept "binary relation" Agda=Relation}} on a type `A` is a family of types `R x y` depending on +two variables `x y : A`. In the special case where each `R x y` is a +[proposition](foundation-core.propositions.md), we say that the relation is +valued in propositions. Thus, we take a general relation to mean a +_proof-relevant_ relation. + +## Definition + +### Relations valued in types + +```agda +Relation : {l1 : Level} (l : Level) (A : UU l1) → UU (l1 ⊔ lsuc l) +Relation l A = A → A → UU l + +total-space-Relation : + {l1 l : Level} {A : UU l1} → Relation l A → UU (l1 ⊔ l) +total-space-Relation {A = A} R = Σ (A × A) λ (a , a') → R a a' +``` + +### Relations valued in propositions + +```agda +Relation-Prop : + (l : Level) {l1 : Level} (A : UU l1) → UU (lsuc l ⊔ l1) +Relation-Prop l A = A → A → Prop l + +type-Relation-Prop : + {l1 l2 : Level} {A : UU l1} → Relation-Prop l2 A → Relation l2 A +type-Relation-Prop R x y = pr1 (R x y) + +is-prop-type-Relation-Prop : + {l1 l2 : Level} {A : UU l1} (R : Relation-Prop l2 A) → + (x y : A) → is-prop (type-Relation-Prop R x y) +is-prop-type-Relation-Prop R x y = pr2 (R x y) + +total-space-Relation-Prop : + {l : Level} {l1 : Level} {A : UU l1} → Relation-Prop l A → UU (l ⊔ l1) +total-space-Relation-Prop {A = A} R = + Σ (A × A) λ (a , a') → type-Relation-Prop R a a' +``` + +### The predicate of being a reflexive relation + +A relation `R` on a type `A` is said to be **reflexive** if it comes equipped +with a function `(x : A) → R x x`. + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (R : Relation l2 A) + where + + is-reflexive : UU (l1 ⊔ l2) + is-reflexive = (x : A) → R x x +``` + +### The predicate of being a reflexive relation valued in propositions + +A relation `R` on a type `A` valued in propositions is said to be **reflexive** +if its underlying relation is reflexive + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (R : Relation-Prop l2 A) + where + + is-reflexive-Relation-Prop : UU (l1 ⊔ l2) + is-reflexive-Relation-Prop = is-reflexive (type-Relation-Prop R) + + is-prop-is-reflexive-Relation-Prop : is-prop is-reflexive-Relation-Prop + is-prop-is-reflexive-Relation-Prop = + is-prop-Π (λ x → is-prop-type-Relation-Prop R x x) +``` + +### The predicate of being a symmetric relation + +A relation `R` on a type `A` is said to be **symmetric** if it comes equipped +with a function `(x y : A) → R x y → R y x`. + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (R : Relation l2 A) + where + + is-symmetric : UU (l1 ⊔ l2) + is-symmetric = (x y : A) → R x y → R y x +``` + +### The predicate of being a symmetric relation valued in propositions + +A relation `R` on a type `A` valued in propositions is said to be **symmetric** +if its underlying relation is symmetric. + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (R : Relation-Prop l2 A) + where + + is-symmetric-Relation-Prop : UU (l1 ⊔ l2) + is-symmetric-Relation-Prop = is-symmetric (type-Relation-Prop R) + + is-prop-is-symmetric-Relation-Prop : is-prop is-symmetric-Relation-Prop + is-prop-is-symmetric-Relation-Prop = + is-prop-iterated-Π 3 + ( λ x y r → is-prop-type-Relation-Prop R y x) +``` + +### The predicate of being a transitive relation + +A relation `R` on a type `A` is said to be **transitive** if it comes equipped +with a function `(x y z : A) → R y z → R x y → R x z`. + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (R : Relation l2 A) + where + + is-transitive : UU (l1 ⊔ l2) + is-transitive = (x y z : A) → R y z → R x y → R x z +``` + +### The predicate of being a transitive relation valued in propositions + +A relation `R` on a type `A` valued in propositions is said to be **transitive** +if its underlying relation is transitive. + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (R : Relation-Prop l2 A) + where + + is-transitive-Relation-Prop : UU (l1 ⊔ l2) + is-transitive-Relation-Prop = is-transitive (type-Relation-Prop R) + + is-prop-is-transitive-Relation-Prop : is-prop is-transitive-Relation-Prop + is-prop-is-transitive-Relation-Prop = + is-prop-iterated-Π 3 + ( λ x y z → + is-prop-function-type + ( is-prop-function-type (is-prop-type-Relation-Prop R x z))) +``` + +### The predicate of being an irreflexive relation + +A relation `R` on a type `A` is said to be **irreflexive** if it comes equipped +with a function `(x : A) → ¬ (R x y)`. + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (R : Relation l2 A) + where + + is-irreflexive : UU (l1 ⊔ l2) + is-irreflexive = (x : A) → ¬ (R x x) +``` + +### The predicate of being an asymmetric relation + +A relation `R` on a type `A` is said to be **asymmetric** if it comes equipped +with a function `(x y : A) → R x y → ¬ (R y x)`. + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (R : Relation l2 A) + where + + is-asymmetric : UU (l1 ⊔ l2) + is-asymmetric = (x y : A) → R x y → ¬ (R y x) +``` + +### The predicate of being an antisymmetric relation + +A relation `R` on a type `A` is said to be **antisymmetric** if it comes +equipped with a function `(x y : A) → R x y → R y x → x = y`. + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (R : Relation l2 A) + where + + is-antisymmetric : UU (l1 ⊔ l2) + is-antisymmetric = (x y : A) → R x y → R y x → x = y +``` + +### The predicate of being an antisymmetric relation valued in propositions + +A relation `R` on a type `A` valued in propositions is said to be +**antisymmetric** if its underlying relation is antisymmetric. + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (R : Relation-Prop l2 A) + where + + is-antisymmetric-Relation-Prop : UU (l1 ⊔ l2) + is-antisymmetric-Relation-Prop = is-antisymmetric (type-Relation-Prop R) +``` + diff --git a/src/foundation-core/commuting-squares-of-homotopies.lagda.md b/src/foundation-core/commuting-squares-of-homotopies.lagda.md index 6ae7b583b4..17213f26df 100644 --- a/src/foundation-core/commuting-squares-of-homotopies.lagda.md +++ b/src/foundation-core/commuting-squares-of-homotopies.lagda.md @@ -840,12 +840,12 @@ module _ ( coh x) ( H x) - right-unwhisker-cohernece-square-homotopies : + right-unwhisker-concat-coherence-square-homotopies : {u : (x : A) → B x} (H : i ~ u) → coherence-square-homotopies top left (right ∙h H) (bottom ∙h H) → coherence-square-homotopies top left right bottom - right-unwhisker-cohernece-square-homotopies H coh x = - right-unwhisker-cohernece-square-identifications + right-unwhisker-concat-coherence-square-homotopies H coh x = + right-unwhisker-concat-coherence-square-identifications ( top x) ( left x) ( right x) diff --git a/src/foundation-core/commuting-squares-of-identifications.lagda.md b/src/foundation-core/commuting-squares-of-identifications.lagda.md index 3c4058de82..f6924903a6 100644 --- a/src/foundation-core/commuting-squares-of-identifications.lagda.md +++ b/src/foundation-core/commuting-squares-of-identifications.lagda.md @@ -788,11 +788,11 @@ module _ ( inv right-unit) ( s)) - right-unwhisker-cohernece-square-identifications : + right-unwhisker-concat-coherence-square-identifications : {u : A} (p : w = u) → coherence-square-identifications top left (right ∙ p) (bottom ∙ p) → coherence-square-identifications top left right bottom - right-unwhisker-cohernece-square-identifications refl = + right-unwhisker-concat-coherence-square-identifications refl = ( inv-concat-right-identification-coherence-square-identifications ( top) ( left) diff --git a/src/foundation-core/mere-equality.lagda.md b/src/foundation-core/mere-equality.lagda.md new file mode 100644 index 0000000000..6cda68fc0a --- /dev/null +++ b/src/foundation-core/mere-equality.lagda.md @@ -0,0 +1,74 @@ +# Mere equality + +```agda +module foundation-core.mere-equality where +``` + +
Imports + +```agda +open import foundation-core.binary-relations +open import foundation.functoriality-propositional-truncation +open import foundation.propositional-truncations +open import foundation.universe-levels + +open import foundation-core.identity-types +open import foundation-core.propositions +``` + +
+ +## Idea + +Two elements in a type are said to be {{#concept "merely equal" Agda=mere-eq}} if there is an element of the +[propositionally truncated](foundation.propositional-truncations.md) [identity type](foundation-core.identity-types.md) between them. + +## Definitions + +### Mere equality + +```agda +module _ + {l : Level} {A : UU l} + where + + mere-eq-Prop : A → A → Prop l + mere-eq-Prop x y = trunc-Prop (x = y) + + mere-eq : A → A → UU l + mere-eq x y = type-Prop (mere-eq-Prop x y) + + is-prop-mere-eq : (x y : A) → is-prop (mere-eq x y) + is-prop-mere-eq x y = is-prop-type-trunc-Prop +``` + +## Properties + +### Reflexivity + +```agda +refl-mere-eq : + {l : Level} {A : UU l} → is-reflexive (mere-eq {l} {A}) +refl-mere-eq _ = unit-trunc-Prop refl +``` + +### Symmetry + +```agda +abstract + symmetric-mere-eq : + {l : Level} {A : UU l} → is-symmetric (mere-eq {l} {A}) + symmetric-mere-eq _ _ = map-trunc-Prop inv +``` + +### Transitivity + +```agda +abstract + transitive-mere-eq : + {l : Level} {A : UU l} → is-transitive (mere-eq {l} {A}) + transitive-mere-eq x y z p q = + apply-universal-property-trunc-Prop q + ( mere-eq-Prop x z) + ( λ p' → map-trunc-Prop (p' ∙_) p) +``` diff --git a/src/foundation.lagda.md b/src/foundation.lagda.md index 760a6dda04..f107768667 100644 --- a/src/foundation.lagda.md +++ b/src/foundation.lagda.md @@ -257,6 +257,8 @@ open import foundation.mere-embeddings public open import foundation.mere-equality public open import foundation.mere-equivalences public open import foundation.mere-functions public +open import foundation.mere-homotopies public +open import foundation.mere-identity-endomorphisms public open import foundation.mere-logical-equivalences public open import foundation.mere-path-cosplit-maps public open import foundation.monomorphisms public diff --git a/src/foundation/0-connected-types.lagda.md b/src/foundation/0-connected-types.lagda.md index d2bdc9203d..71c3cbfde8 100644 --- a/src/foundation/0-connected-types.lagda.md +++ b/src/foundation/0-connected-types.lagda.md @@ -19,6 +19,7 @@ open import foundation.mere-equality open import foundation.propositional-truncations open import foundation.set-truncations open import foundation.sets +open import foundation.subtypes open import foundation.surjective-maps open import foundation.unit-type open import foundation.universal-property-contractible-types @@ -41,19 +42,83 @@ open import foundation-core.truncation-levels ## Idea -A type is said to be connected if its type of connected components, i.e., its -set truncation, is contractible. +A type is said to be {{#concept "0-connected" Agda=is-0-connected}} if its type +of connected components, i.e., its +[set truncation](foundation.set-truncations.md), is +[contractible](foundation-core.contractible-types.md). Sometimes we simply say +that a type is connected instead of saying that it is 0-connected. + +## Definitions + +### The predicate of being a `0`-connected type + +```agda +module _ + {l : Level} (A : UU l) + where + + is-0-connected-Prop : Prop l + is-0-connected-Prop = is-contr-Prop (type-trunc-Set A) + + is-0-connected : UU l + is-0-connected = type-Prop is-0-connected-Prop + + is-prop-is-0-connected : is-prop is-0-connected + is-prop-is-0-connected = is-prop-type-Prop is-0-connected-Prop +``` + +### The dependent universal property of pointed `0`-connected types + +The +{{#concept "dependent universal property of `0`-connected types" Agda=dependent-universal-property-0-connected-type}} +asserts that for any element `a` in a type `A` and any +[subtype](foundation.subtypes.md) `P` of `A`, the evaluation map + +```text + ((x : A) → P x) → P a +``` + +is an equivalence. In other words, a type `A` with a given element `a` is +`0`-connected precisely when any subtype contains all elements if and only if it +contains the given element `a`. + +```agda +module _ + {l1 : Level} {A : UU l1} (a : A) + where + + ev-point-subtype : + {l2 : Level} (P : subtype l2 A) → + ((x : A) → is-in-subtype P x) → is-in-subtype P a + ev-point-subtype P f = f a + + dependent-universal-property-0-connected-type : UUω + dependent-universal-property-0-connected-type = + {l : Level} (P : subtype l A) → is-equiv (ev-point-subtype P) +``` + +### The universal property of `0`-connected types + +The +{{#concept "universal property of `0`-connected types" Agda=universal-property-0-connected-type}} +asserts that maps from a type `A` equipped with a given element `a : A` into a +[set](foundation-core.sets.md) `S` are uniquely determined by an element of `S`. ```agda -is-0-connected-Prop : {l : Level} → UU l → Prop l -is-0-connected-Prop A = is-contr-Prop (type-trunc-Set A) +module _ + {l1 : Level} {A : UU l1} (a : A) + where + + universal-property-0-connected-type : UUω + universal-property-0-connected-type = + {l : Level} (S : Set l) → is-equiv (ev-point' a {type-Set S}) +``` -is-0-connected : {l : Level} → UU l → UU l -is-0-connected A = type-Prop (is-0-connected-Prop A) +## Properties -is-prop-is-0-connected : {l : Level} (A : UU l) → is-prop (is-0-connected A) -is-prop-is-0-connected A = is-prop-type-Prop (is-0-connected-Prop A) +### `0`-connected types are inhabited +```agda abstract is-inhabited-is-0-connected : {l : Level} {A : UU l} → is-0-connected A → is-inhabited A @@ -62,24 +127,36 @@ abstract ( center C) ( set-Prop (trunc-Prop A)) ( unit-trunc-Prop) +``` +### Any two elements in a `0`-connected type are merely equal + +```agda abstract mere-eq-is-0-connected : {l : Level} {A : UU l} → is-0-connected A → (x y : A) → mere-eq x y mere-eq-is-0-connected {A = A} H x y = apply-effectiveness-unit-trunc-Set (eq-is-contr H) +``` + +### A pointed type in which every element is merely equal to the base point is `0`-connected +```agda abstract is-0-connected-mere-eq : {l : Level} {A : UU l} (a : A) → ((x : A) → mere-eq a x) → is-0-connected A - is-0-connected-mere-eq {l} {A} a e = - pair - ( unit-trunc-Set a) - ( apply-dependent-universal-property-trunc-Set' - ( λ x → set-Prop (Id-Prop (trunc-Set A) (unit-trunc-Set a) x)) - ( λ x → apply-effectiveness-unit-trunc-Set' (e x))) + pr1 (is-0-connected-mere-eq {l} {A} a e) = + unit-trunc-Set a + pr2 (is-0-connected-mere-eq {l} {A} a e) = + apply-dependent-universal-property-trunc-Set' + ( λ x → set-Prop (Id-Prop (trunc-Set A) (unit-trunc-Set a) x)) + ( λ x → apply-effectiveness-unit-trunc-Set' (e x)) +``` +### An inhabited type in which any two elements are merely equal is `0`-connected + +```agda abstract is-0-connected-mere-eq-is-inhabited : {l : Level} {A : UU l} → @@ -88,17 +165,22 @@ abstract apply-universal-property-trunc-Prop H ( is-0-connected-Prop _) ( λ a → is-0-connected-mere-eq a (K a)) +``` + +### The point inclusion of a given element of a type is surjective if and only if the type is `0`-connected -is-0-connected-is-surjective-point : - {l1 : Level} {A : UU l1} (a : A) → - is-surjective (point a) → is-0-connected A -is-0-connected-is-surjective-point a H = - is-0-connected-mere-eq a - ( λ x → - apply-universal-property-trunc-Prop - ( H x) - ( mere-eq-Prop a x) - ( λ u → unit-trunc-Prop (pr2 u))) +```agda +abstract + is-0-connected-is-surjective-point : + {l1 : Level} {A : UU l1} (a : A) → + is-surjective (point a) → is-0-connected A + is-0-connected-is-surjective-point a H = + is-0-connected-mere-eq a + ( λ x → + apply-universal-property-trunc-Prop + ( H x) + ( mere-eq-Prop a x) + ( λ u → unit-trunc-Prop (pr2 u))) abstract is-surjective-point-is-0-connected : @@ -109,38 +191,75 @@ abstract ( mere-eq-is-0-connected H a x) ( trunc-Prop (fiber (point a) x)) ( λ where refl → unit-trunc-Prop (star , refl)) +``` -is-trunc-map-ev-point-is-connected : - {l1 l2 : Level} (k : 𝕋) {A : UU l1} {B : UU l2} (a : A) → - is-0-connected A → is-trunc (succ-𝕋 k) B → - is-trunc-map k (ev-point' a {B}) -is-trunc-map-ev-point-is-connected k {A} {B} a H K = - is-trunc-map-comp k - ( ev-point' star {B}) - ( precomp (point a) B) - ( is-trunc-map-is-equiv k - ( universal-property-contr-is-contr star is-contr-unit B)) - ( is-trunc-map-precomp-Π-is-surjective k +### A pointed connected type `A` is `k + 1`-truncated if and only if the base point inclusion is `k`-truncated + +```agda +abstract + is-trunc-map-ev-point-is-connected : + {l1 l2 : Level} (k : 𝕋) {A : UU l1} {B : UU l2} (a : A) → + is-0-connected A → is-trunc (succ-𝕋 k) B → + is-trunc-map k (ev-point' a {B}) + is-trunc-map-ev-point-is-connected k {A} {B} a H K = + is-trunc-map-comp k + ( ev-point' star {B}) + ( precomp (point a) B) + ( is-trunc-map-is-equiv k + ( universal-property-contr-is-contr star is-contr-unit B)) + ( is-trunc-map-precomp-Π-is-surjective k + ( is-surjective-point-is-0-connected a H) + ( λ _ → (B , K))) +``` + +### The dependent universal property of `0`-connected types + +```agda +module _ + {l1 : Level} {A : UU l1} (a : A) + where + + abstract + is-0-connected-dependent-universal-property-0-connected-type : + dependent-universal-property-0-connected-type a → + is-0-connected A + is-0-connected-dependent-universal-property-0-connected-type H = + is-0-connected-mere-eq a + ( map-inv-is-equiv (H (mere-eq-Prop a)) (refl-mere-eq a)) + + abstract + dependent-universal-property-0-connected-type-is-0-connected : + is-0-connected A → dependent-universal-property-0-connected-type a + dependent-universal-property-0-connected-type-is-0-connected H P = + is-equiv-comp _ _ + ( dependent-universal-property-surjection-is-surjective + ( point a) + ( is-surjective-point-is-0-connected a H) + ( P)) + ( universal-property-unit (type-Prop (P a))) + + equiv-dependent-universal-property-0-connected-type : + is-0-connected A → + ( {l : Level} (P : subtype l A) → + ((x : A) → is-in-subtype P x) ≃ is-in-subtype P a) + equiv-dependent-universal-property-0-connected-type H P = + ( equiv-universal-property-unit (type-Prop (P a))) ∘e + ( equiv-dependent-universal-property-surjection-is-surjective + ( point a) ( is-surjective-point-is-0-connected a H) - ( λ _ → (B , K))) - -equiv-dependent-universal-property-is-0-connected : - {l1 : Level} {A : UU l1} (a : A) → is-0-connected A → - ( {l : Level} (P : A → Prop l) → - ((x : A) → type-Prop (P x)) ≃ type-Prop (P a)) -equiv-dependent-universal-property-is-0-connected a H P = - ( equiv-universal-property-unit (type-Prop (P a))) ∘e - ( equiv-dependent-universal-property-surjection-is-surjective - ( point a) - ( is-surjective-point-is-0-connected a H) - ( P)) - -apply-dependent-universal-property-is-0-connected : - {l1 : Level} {A : UU l1} (a : A) → is-0-connected A → - {l : Level} (P : A → Prop l) → type-Prop (P a) → (x : A) → type-Prop (P x) -apply-dependent-universal-property-is-0-connected a H P = - map-inv-equiv (equiv-dependent-universal-property-is-0-connected a H P) + ( P)) + + abstract + apply-dependent-universal-property-0-connected-type : + {l2 : Level} → is-0-connected A → (P : subtype l2 A) → + is-in-subtype P a → (x : A) → is-in-subtype P x + apply-dependent-universal-property-0-connected-type H P = + map-inv-equiv (equiv-dependent-universal-property-0-connected-type H P) +``` + +### A pointed type is connected if and only if the fiber inclusion is surjective for any type family over it +```agda abstract is-surjective-fiber-inclusion : {l1 l2 : Level} {A : UU l1} {B : A → UU l2} → @@ -169,16 +288,22 @@ abstract is-0-connected A is-0-connected-is-surjective-fiber-inclusion a H = is-0-connected-mere-eq a (mere-eq-is-surjective-fiber-inclusion a H) +``` -is-0-connected-equiv : - {l1 l2 : Level} {A : UU l1} {B : UU l2} → - (A ≃ B) → is-0-connected B → is-0-connected A -is-0-connected-equiv e = is-contr-equiv _ (equiv-trunc-Set e) +### `0`-connected types are closed under equivalences -is-0-connected-equiv' : - {l1 l2 : Level} {A : UU l1} {B : UU l2} → - (A ≃ B) → is-0-connected A → is-0-connected B -is-0-connected-equiv' e = is-0-connected-equiv (inv-equiv e) +```agda +abstract + is-0-connected-equiv : + {l1 l2 : Level} {A : UU l1} {B : UU l2} → + (A ≃ B) → is-0-connected B → is-0-connected A + is-0-connected-equiv e = is-contr-equiv _ (equiv-trunc-Set e) + +abstract + is-0-connected-equiv' : + {l1 l2 : Level} {A : UU l1} {B : UU l2} → + (A ≃ B) → is-0-connected A → is-0-connected B + is-0-connected-equiv' e = is-0-connected-equiv (inv-equiv e) ``` ### `0`-connected types are closed under cartesian products @@ -209,11 +334,14 @@ abstract ### A contractible type is `0`-connected ```agda -is-0-connected-is-contr : - {l : Level} (X : UU l) → - is-contr X → is-0-connected X -is-0-connected-is-contr X p = - is-contr-equiv X (inv-equiv (equiv-unit-trunc-Set (X , is-set-is-contr p))) p +abstract + is-0-connected-is-contr : + {l : Level} (X : UU l) → + is-contr X → is-0-connected X + is-0-connected-is-contr X p = + is-contr-equiv X + ( inv-equiv (equiv-unit-trunc-Set (X , is-set-is-contr p))) + ( p) ``` ### The image of a function with a `0`-connected domain is `0`-connected diff --git a/src/foundation/binary-relations.lagda.md b/src/foundation/binary-relations.lagda.md index 0fc607dc0b..f61d9977e5 100644 --- a/src/foundation/binary-relations.lagda.md +++ b/src/foundation/binary-relations.lagda.md @@ -2,6 +2,8 @@ ```agda module foundation.binary-relations where + +open import foundation-core.binary-relations public ```
Imports @@ -28,203 +30,12 @@ open import foundation-core.torsorial-type-families ## Idea -A **binary relation** on a type `A` is a family of types `R x y` depending on +A {{#concept "binary relation" Agda=Relation}} on a type `A` is a family of types `R x y` depending on two variables `x y : A`. In the special case where each `R x y` is a [proposition](foundation-core.propositions.md), we say that the relation is valued in propositions. Thus, we take a general relation to mean a _proof-relevant_ relation. -## Definition - -### Relations valued in types - -```agda -Relation : {l1 : Level} (l : Level) (A : UU l1) → UU (l1 ⊔ lsuc l) -Relation l A = A → A → UU l - -total-space-Relation : - {l1 l : Level} {A : UU l1} → Relation l A → UU (l1 ⊔ l) -total-space-Relation {A = A} R = Σ (A × A) λ (a , a') → R a a' -``` - -### Relations valued in propositions - -```agda -Relation-Prop : - (l : Level) {l1 : Level} (A : UU l1) → UU (lsuc l ⊔ l1) -Relation-Prop l A = A → A → Prop l - -type-Relation-Prop : - {l1 l2 : Level} {A : UU l1} → Relation-Prop l2 A → Relation l2 A -type-Relation-Prop R x y = pr1 (R x y) - -is-prop-type-Relation-Prop : - {l1 l2 : Level} {A : UU l1} (R : Relation-Prop l2 A) → - (x y : A) → is-prop (type-Relation-Prop R x y) -is-prop-type-Relation-Prop R x y = pr2 (R x y) - -total-space-Relation-Prop : - {l : Level} {l1 : Level} {A : UU l1} → Relation-Prop l A → UU (l ⊔ l1) -total-space-Relation-Prop {A = A} R = - Σ (A × A) λ (a , a') → type-Relation-Prop R a a' -``` - -### The predicate of being a reflexive relation - -A relation `R` on a type `A` is said to be **reflexive** if it comes equipped -with a function `(x : A) → R x x`. - -```agda -module _ - {l1 l2 : Level} {A : UU l1} (R : Relation l2 A) - where - - is-reflexive : UU (l1 ⊔ l2) - is-reflexive = (x : A) → R x x -``` - -### The predicate of being a reflexive relation valued in propositions - -A relation `R` on a type `A` valued in propositions is said to be **reflexive** -if its underlying relation is reflexive - -```agda -module _ - {l1 l2 : Level} {A : UU l1} (R : Relation-Prop l2 A) - where - - is-reflexive-Relation-Prop : UU (l1 ⊔ l2) - is-reflexive-Relation-Prop = is-reflexive (type-Relation-Prop R) - - is-prop-is-reflexive-Relation-Prop : is-prop is-reflexive-Relation-Prop - is-prop-is-reflexive-Relation-Prop = - is-prop-Π (λ x → is-prop-type-Relation-Prop R x x) -``` - -### The predicate of being a symmetric relation - -A relation `R` on a type `A` is said to be **symmetric** if it comes equipped -with a function `(x y : A) → R x y → R y x`. - -```agda -module _ - {l1 l2 : Level} {A : UU l1} (R : Relation l2 A) - where - - is-symmetric : UU (l1 ⊔ l2) - is-symmetric = (x y : A) → R x y → R y x -``` - -### The predicate of being a symmetric relation valued in propositions - -A relation `R` on a type `A` valued in propositions is said to be **symmetric** -if its underlying relation is symmetric. - -```agda -module _ - {l1 l2 : Level} {A : UU l1} (R : Relation-Prop l2 A) - where - - is-symmetric-Relation-Prop : UU (l1 ⊔ l2) - is-symmetric-Relation-Prop = is-symmetric (type-Relation-Prop R) - - is-prop-is-symmetric-Relation-Prop : is-prop is-symmetric-Relation-Prop - is-prop-is-symmetric-Relation-Prop = - is-prop-iterated-Π 3 - ( λ x y r → is-prop-type-Relation-Prop R y x) -``` - -### The predicate of being a transitive relation - -A relation `R` on a type `A` is said to be **transitive** if it comes equipped -with a function `(x y z : A) → R y z → R x y → R x z`. - -```agda -module _ - {l1 l2 : Level} {A : UU l1} (R : Relation l2 A) - where - - is-transitive : UU (l1 ⊔ l2) - is-transitive = (x y z : A) → R y z → R x y → R x z -``` - -### The predicate of being a transitive relation valued in propositions - -A relation `R` on a type `A` valued in propositions is said to be **transitive** -if its underlying relation is transitive. - -```agda -module _ - {l1 l2 : Level} {A : UU l1} (R : Relation-Prop l2 A) - where - - is-transitive-Relation-Prop : UU (l1 ⊔ l2) - is-transitive-Relation-Prop = is-transitive (type-Relation-Prop R) - - is-prop-is-transitive-Relation-Prop : is-prop is-transitive-Relation-Prop - is-prop-is-transitive-Relation-Prop = - is-prop-iterated-Π 3 - ( λ x y z → - is-prop-function-type - ( is-prop-function-type (is-prop-type-Relation-Prop R x z))) -``` - -### The predicate of being an irreflexive relation - -A relation `R` on a type `A` is said to be **irreflexive** if it comes equipped -with a function `(x : A) → ¬ (R x y)`. - -```agda -module _ - {l1 l2 : Level} {A : UU l1} (R : Relation l2 A) - where - - is-irreflexive : UU (l1 ⊔ l2) - is-irreflexive = (x : A) → ¬ (R x x) -``` - -### The predicate of being an asymmetric relation - -A relation `R` on a type `A` is said to be **asymmetric** if it comes equipped -with a function `(x y : A) → R x y → ¬ (R y x)`. - -```agda -module _ - {l1 l2 : Level} {A : UU l1} (R : Relation l2 A) - where - - is-asymmetric : UU (l1 ⊔ l2) - is-asymmetric = (x y : A) → R x y → ¬ (R y x) -``` - -### The predicate of being an antisymmetric relation - -A relation `R` on a type `A` is said to be **antisymmetric** if it comes -equipped with a function `(x y : A) → R x y → R y x → x = y`. - -```agda -module _ - {l1 l2 : Level} {A : UU l1} (R : Relation l2 A) - where - - is-antisymmetric : UU (l1 ⊔ l2) - is-antisymmetric = (x y : A) → R x y → R y x → x = y -``` - -### The predicate of being an antisymmetric relation valued in propositions - -A relation `R` on a type `A` valued in propositions is said to be -**antisymmetric** if its underlying relation is antisymmetric. - -```agda -module _ - {l1 l2 : Level} {A : UU l1} (R : Relation-Prop l2 A) - where - - is-antisymmetric-Relation-Prop : UU (l1 ⊔ l2) - is-antisymmetric-Relation-Prop = is-antisymmetric (type-Relation-Prop R) -``` - ## Properties ### Characterization of equality of binary relations diff --git a/src/foundation/connected-components.lagda.md b/src/foundation/connected-components.lagda.md index c719f53bf2..d99aa4ae94 100644 --- a/src/foundation/connected-components.lagda.md +++ b/src/foundation/connected-components.lagda.md @@ -10,6 +10,7 @@ module foundation.connected-components where open import foundation.0-connected-types open import foundation.dependent-pair-types open import foundation.logical-equivalences +open import foundation-core.mere-equality open import foundation.propositional-truncations open import foundation.propositions open import foundation.universe-levels @@ -60,7 +61,7 @@ module _ connected-component : UU l connected-component = - Σ A (λ x → type-trunc-Prop (x = a)) + Σ A (mere-eq a) point-connected-component : connected-component pr1 point-connected-component = a @@ -77,7 +78,7 @@ module _ abstract mere-equality-connected-component : (X : connected-component) → - type-trunc-Prop (value-connected-component X = a) + mere-eq a (value-connected-component X) mere-equality-connected-component X = pr2 X ``` @@ -96,11 +97,11 @@ abstract ( λ (x , p) → apply-universal-property-trunc-Prop ( p) - ( trunc-Prop ((a , unit-trunc-Prop refl) = (x , p))) + ( mere-eq-Prop (a , unit-trunc-Prop refl) (x , p)) ( λ p' → unit-trunc-Prop ( eq-pair-Σ - ( inv p') + ( p') ( all-elements-equal-type-trunc-Prop _ p)))) connected-component-∞-Group : diff --git a/src/foundation/endomorphisms.lagda.md b/src/foundation/endomorphisms.lagda.md index 178d2f3786..e3ed8337db 100644 --- a/src/foundation/endomorphisms.lagda.md +++ b/src/foundation/endomorphisms.lagda.md @@ -20,6 +20,7 @@ open import foundation-core.sets open import group-theory.monoids open import group-theory.semigroups +open import structured-types.h-spaces open import structured-types.wild-monoids ``` @@ -27,11 +28,32 @@ open import structured-types.wild-monoids ## Idea -An **endomorphism** on a type `A` is a map `A → A`. +An {{#concept "endomorphism"}} on a type `A` is a function `A → A`. The type of +endomorphisms on `A` is an [H-space](structured-types.h-spaces.md). Note that the +unit laws for function composition hold judgmentally, so +[function extensionality](foundation.function-extensionality.md) is not required +to establish the H-space structure on the type of endomorphisms `A → A`. +Furthermore, since function composition is strictly associative, the type of +endomorphisms `A → A` is also a [wild monoid](structured-types.wild-monoids.md). ## Properties -### Endomorphisms form a monoid +### The type of endomorphisms on any type is an H-space + +```agda +module _ + {l : Level} (A : UU l) + where + + endo-H-Space : H-Space l + pr1 endo-H-Space = endo-Pointed-Type A + pr1 (pr2 endo-H-Space) g f = g ∘ f + pr1 (pr2 (pr2 endo-H-Space)) f = refl + pr1 (pr2 (pr2 (pr2 endo-H-Space))) f = refl + pr2 (pr2 (pr2 (pr2 endo-H-Space))) = refl +``` + +### The type of endomorphisms form a wild monoid ```agda endo-Wild-Monoid : {l : Level} → UU l → Wild-Monoid l @@ -45,12 +67,20 @@ pr1 (pr2 (pr2 (endo-Wild-Monoid A))) g f = refl pr1 (pr2 (pr2 (pr2 (endo-Wild-Monoid A)))) g f = refl pr1 (pr2 (pr2 (pr2 (pr2 (endo-Wild-Monoid A))))) g f = refl pr2 (pr2 (pr2 (pr2 (pr2 (endo-Wild-Monoid A))))) = star +``` +### The type of endomorphisms on a set form a semigroup + +```agda endo-Semigroup : {l : Level} → Set l → Semigroup l pr1 (endo-Semigroup A) = endo-Set A pr1 (pr2 (endo-Semigroup A)) g f = g ∘ f pr2 (pr2 (endo-Semigroup A)) h g f = refl +``` +### The type of endomorphisms on a set form a monoid + +```agda endo-Monoid : {l : Level} → Set l → Monoid l pr1 (endo-Monoid A) = endo-Semigroup A pr1 (pr2 (endo-Monoid A)) = id @@ -62,3 +92,4 @@ pr2 (pr2 (pr2 (endo-Monoid A))) f = refl - For endomorphisms in a category see [`category-theory.endomorphisms-in-categories`](category-theory.endomorphisms-in-categories.md). +- [Mere identity endomorphisms](foundation.mere-identity-endomorphisms.md) diff --git a/src/foundation/mere-equality.lagda.md b/src/foundation/mere-equality.lagda.md index c36b3c92e0..8af884dd22 100644 --- a/src/foundation/mere-equality.lagda.md +++ b/src/foundation/mere-equality.lagda.md @@ -2,6 +2,8 @@ ```agda module foundation.mere-equality where + +open import foundation-core.mere-equality public ```
Imports @@ -17,7 +19,6 @@ open import foundation.universe-levels open import foundation-core.equivalence-relations open import foundation-core.identity-types -open import foundation-core.propositions open import foundation-core.sets ``` @@ -25,58 +26,11 @@ open import foundation-core.sets ## Idea -Two elements in a type are said to be merely equal if there is an element of the -propositionally truncated identity type between them. - -## Definition - -```agda -module _ - {l : Level} {A : UU l} - where - - mere-eq-Prop : A → A → Prop l - mere-eq-Prop x y = trunc-Prop (x = y) - - mere-eq : A → A → UU l - mere-eq x y = type-Prop (mere-eq-Prop x y) - - is-prop-mere-eq : (x y : A) → is-prop (mere-eq x y) - is-prop-mere-eq x y = is-prop-type-trunc-Prop -``` +Two elements in a type are said to be {{#concept "merely equal" Agda=mere-eq}} if there is an element of the +[propositionally truncated](foundation.propositional-truncations.md) [identity type](foundation-core.identity-types.md) between them. ## Properties -### Reflexivity - -```agda -abstract - refl-mere-eq : - {l : Level} {A : UU l} → is-reflexive (mere-eq {l} {A}) - refl-mere-eq _ = unit-trunc-Prop refl -``` - -### Symmetry - -```agda -abstract - symmetric-mere-eq : - {l : Level} {A : UU l} → is-symmetric (mere-eq {l} {A}) - symmetric-mere-eq _ _ = map-trunc-Prop inv -``` - -### Transitivity - -```agda -abstract - transitive-mere-eq : - {l : Level} {A : UU l} → is-transitive (mere-eq {l} {A}) - transitive-mere-eq x y z p q = - apply-universal-property-trunc-Prop q - ( mere-eq-Prop x z) - ( λ p' → map-trunc-Prop (p' ∙_) p) -``` - ### Mere equality is an equivalence relation ```agda @@ -109,15 +63,3 @@ module _ pr1 reflecting-map-mere-eq = f pr2 reflecting-map-mere-eq = reflects-mere-eq ``` - -### If mere equality maps into the identity type of `A`, then `A` is a set - -```agda -is-set-mere-eq-in-id : - {l : Level} {A : UU l} → ((x y : A) → mere-eq x y → x = y) → is-set A -is-set-mere-eq-in-id = - is-set-prop-in-id - ( mere-eq) - ( is-prop-mere-eq) - ( refl-mere-eq) -``` diff --git a/src/foundation/mere-equivalences.lagda.md b/src/foundation/mere-equivalences.lagda.md index 663c8f4d24..d9d317631b 100644 --- a/src/foundation/mere-equivalences.lagda.md +++ b/src/foundation/mere-equivalences.lagda.md @@ -10,7 +10,7 @@ module foundation.mere-equivalences where open import foundation.binary-relations open import foundation.decidable-equality open import foundation.functoriality-propositional-truncation -open import foundation.mere-equality +open import foundation-core.mere-equality open import foundation.propositional-truncations open import foundation.univalence open import foundation.universe-levels diff --git a/src/foundation/mere-homotopies.lagda.md b/src/foundation/mere-homotopies.lagda.md new file mode 100644 index 0000000000..c338b98e82 --- /dev/null +++ b/src/foundation/mere-homotopies.lagda.md @@ -0,0 +1,185 @@ +# Mere homotopies + +```agda +module foundation.mere-homotopies where +``` + +
Imports + +```agda +open import foundation.0-connected-types +open import foundation.binary-relations +open import foundation.dependent-pair-types +open import foundation.equivalence-relations +open import foundation.equivalences +open import foundation.function-extensionality +open import foundation.functoriality-propositional-truncation +open import foundation.homotopies +open import foundation-core.mere-equality +open import foundation.propositional-truncations +open import foundation.propositions +open import foundation.universe-levels +``` + +
+ +## Idea + +A {{#concept "mere homotopy" Agda=mere-htpy}} between two dependent functions +`f g : (a : A) → B a` is an element of the +[propositional truncation](foundation.propositional-truncations.md) + +```text + ║ f ~ g ║₋₁ +``` + +of the type of [homotopies](foundation-core.homotopies.md) between `f` and `g`. + +## Definitions + +### Mere homotopies + +```agda +module _ + {l1 l2 : Level} {A : UU l1} {B : A → UU l2} (f g : (x : A) → B x) + where + + mere-htpy-Prop : Prop (l1 ⊔ l2) + mere-htpy-Prop = trunc-Prop (f ~ g) + + mere-htpy : UU (l1 ⊔ l2) + mere-htpy = type-trunc-Prop (f ~ g) + + is-prop-mere-htpy : is-prop mere-htpy + is-prop-mere-htpy = is-prop-type-trunc-Prop +``` + +### The mere homotopy component of a function type + +```agda +module _ + {l1 l2 : Level} {A : UU l1} {B : A → UU l2} (f : (x : A) → B x) + where + + mere-htpy-component : UU (l1 ⊔ l2) + mere-htpy-component = Σ ((x : A) → B x) (mere-htpy f) + +module _ + {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {f : (x : A) → B x} + (g : mere-htpy-component f) + where + + map-mere-htpy-component : (x : A) → B x + map-mere-htpy-component = pr1 g + + mere-htpy-base-function-mere-htpy-component : + mere-htpy f map-mere-htpy-component + mere-htpy-base-function-mere-htpy-component = pr2 g +``` + +## Properties + +### The mere homotopy relation is an equivalence relation + +```agda +module _ + {l1 l2 : Level} {A : UU l1} {B : A → UU l2} + where + + abstract + refl-mere-htpy : (f : (x : A) → B x) → mere-htpy f f + refl-mere-htpy f = unit-trunc-Prop refl-htpy + + abstract + transitive-mere-htpy : + is-transitive (mere-htpy {B = B}) + transitive-mere-htpy f g h r s = + apply-twice-universal-property-trunc-Prop r s + ( mere-htpy-Prop f h) + ( λ H K → unit-trunc-Prop (K ∙h H)) + + abstract + symmetric-mere-htpy : is-symmetric (mere-htpy {B = B}) + symmetric-mere-htpy f g r = + apply-universal-property-trunc-Prop r + ( mere-htpy-Prop g f) + ( λ H → unit-trunc-Prop (inv-htpy H)) + + mere-htpy-Equivalence-Relation : + equivalence-relation (l1 ⊔ l2) ((x : A) → B x) + pr1 mere-htpy-Equivalence-Relation = mere-htpy-Prop + pr1 (pr2 mere-htpy-Equivalence-Relation) = refl-mere-htpy + pr1 (pr2 (pr2 mere-htpy-Equivalence-Relation)) = symmetric-mere-htpy + pr2 (pr2 (pr2 mere-htpy-Equivalence-Relation)) = transitive-mere-htpy +``` + +### Two functions are merely homotopic if and only if they are merely equal + +```agda +module _ + {l1 l2 : Level} {A : UU l1} {B : A → UU l2} (f g : (x : A) → B x) + where + + abstract + mere-eq-mere-htpy : mere-htpy f g → mere-eq f g + mere-eq-mere-htpy = map-trunc-Prop eq-htpy + + abstract + mere-htpy-mere-eq : mere-eq f g → mere-htpy f g + mere-htpy-mere-eq = map-trunc-Prop htpy-eq + + equiv-mere-htpy-mere-eq : mere-eq f g ≃ mere-htpy f g + equiv-mere-htpy-mere-eq = equiv-trunc-Prop equiv-funext +``` + +### The base function of a mere homotopy component + +```agda +module _ + {l1 l2 : Level} {A : UU l1} {B : A → UU l2} (f : (x : A) → B x) + where + + base-function-mere-htpy-component : mere-htpy-component f + pr1 base-function-mere-htpy-component = f + pr2 base-function-mere-htpy-component = refl-mere-htpy f +``` + +### Any two elements functions in a mere homotopy component are merely homotopy + +```agda +module _ + {l1 l2 : Level} {A : UU l1} {B : A → UU l2} (f : (x : A) → B x) + where + + abstract + mere-htpy-mere-htpy-component : + (g h : mere-htpy-component f) → + mere-htpy (map-mere-htpy-component g) (map-mere-htpy-component h) + mere-htpy-mere-htpy-component g h = + transitive-mere-htpy + ( map-mere-htpy-component g) + ( f) + ( map-mere-htpy-component h) + ( mere-htpy-base-function-mere-htpy-component h) + ( symmetric-mere-htpy f + ( map-mere-htpy-component g) + ( mere-htpy-base-function-mere-htpy-component g)) +``` + +### The mere homotopy component of any function is connected + +```agda +module _ + {l1 l2 : Level} {A : UU l1} {B : A → UU l2} (f : (x : A) → B x) + where + + abstract + is-0-connected-mere-htpy-component : is-0-connected (mere-htpy-component f) + is-0-connected-mere-htpy-component = + is-0-connected-mere-eq + ( base-function-mere-htpy-component f) + ( λ (g , H) → + {!!}) +``` + +### The mere homotopy component of a function is an ∞-group diff --git a/src/foundation/mere-identity-endomorphisms.lagda.md b/src/foundation/mere-identity-endomorphisms.lagda.md new file mode 100644 index 0000000000..44fb40576a --- /dev/null +++ b/src/foundation/mere-identity-endomorphisms.lagda.md @@ -0,0 +1,114 @@ +# Mere identity endomorphisms + +```agda +module foundation.mere-identity-endomorphisms where +``` + +
Imports + +```agda +open import foundation.dependent-pair-types +open import foundation.function-types +open import foundation.mere-homotopies +open import foundation.propositions +open import foundation.universe-levels + +open import foundation-core.equivalences +``` + +
+ +## Idea + +An [endomorphism](foundation-core.endomorphisms.md) `f : A → A` on a type `A` is +said to be a +{{#concept "mere identity endomorphism" Agda=mere-identity-endomorphism}} if it +is [merely homotopic](foundation.mere-homotopies.md) to the +[identity function](foundation-core.function-types.md). + +## Definitions + +### The predicate of being a mere identity endomorphism + +```agda +module _ + {l1 : Level} {A : UU l1} (f : A → A) + where + + is-mere-identity-endomorphism-Prop : Prop l1 + is-mere-identity-endomorphism-Prop = mere-htpy-Prop id f + + is-mere-identity-endomorphism : UU l1 + is-mere-identity-endomorphism = mere-htpy id f + + is-prop-is-mere-identity-endomorphism : + is-prop is-mere-identity-endomorphism + is-prop-is-mere-identity-endomorphism = is-prop-mere-htpy id f +``` + +### Mere identity endomorphisms + +```agda +module _ + {l1 : Level} (A : UU l1) + where + + mere-identity-endomorphism : UU l1 + mere-identity-endomorphism = Σ (A → A) is-mere-identity-endomorphism + + module _ + {e : mere-identity-endomorphism} + where + + endomorphism-mere-identity-endomorphism : A → A + endomorphism-mere-identity-endomorphism = pr1 e + + is-mere-identity-mere-identity-endomorphism : + is-mere-identity-endomorphism endomorphism-mere-identity-endomorphism + is-mere-identity-mere-identity-endomorphism = pr2 e +``` + +### The predicate of being a mere identity automorphism + +```agda +module _ + {l1 : Level} {A : UU l1} (e : A ≃ A) + where + + is-mere-identity-automorphism-Prop : Prop l1 + is-mere-identity-automorphism-Prop = mere-htpy-Prop id (map-equiv e) + + is-mere-identity-automorphism : UU l1 + is-mere-identity-automorphism = mere-htpy id (map-equiv e) + + is-prop-is-mere-identity-automorphism : + is-prop is-mere-identity-automorphism + is-prop-is-mere-identity-automorphism = is-prop-mere-htpy id (map-equiv e) +``` + +### Mere identity automorphisms + +```agda +module _ + {l1 : Level} (A : UU l1) + where + + mere-identity-automorphism : UU l1 + mere-identity-automorphism = Σ (A ≃ A) is-mere-identity-automorphism + + module _ + {e : mere-identity-automorphism} + where + + automorphism-mere-identity-automorphism : A ≃ A + automorphism-mere-identity-automorphism = pr1 e + + is-mere-identity-mere-identity-automorphism : + is-mere-identity-automorphism automorphism-mere-identity-automorphism + is-mere-identity-mere-identity-automorphism = pr2 e +``` + +## Properties + +### The type of mere identity endomorphisms is connected + diff --git a/src/foundation/mere-identity-systems.lagda.md b/src/foundation/mere-identity-systems.lagda.md new file mode 100644 index 0000000000..4d2e06c066 --- /dev/null +++ b/src/foundation/mere-identity-systems.lagda.md @@ -0,0 +1,275 @@ +# Mere identity systems + +```agda +module foundation.mere-identity-systems where +``` + +
Imports + +```agda +open import foundation.0-connected-types +open import foundation.binary-relations +open import foundation.contractible-types +open import foundation.dependent-pair-types +open import foundation.equivalences +open import foundation.functoriality-dependent-pair-types +open import foundation.fundamental-theorem-of-identity-types +open import foundation.identity-systems +open import foundation-core.identity-types +open import foundation.logical-equivalences +open import foundation-core.mere-equality +open import foundation.propositional-truncations +open import foundation.propositions +open import foundation.set-truncations +open import foundation.subtypes +open import foundation.torsorial-type-families +open import foundation.universal-property-dependent-pair-types +open import foundation.universe-levels +``` + +
+ +## Idea + +There are two kinds of mere identity systems: unary and binary mere identity systems. + +### Unary mere identity systems + +A [subtype](foundation.subtypes.md) `P : A → Prop` containing an element `a : A` is said to be a unary {{#concept "mere identity system" Disambiguation="unary"}} if for every `Q : (x : A) → P x → Prop` the evaluation map at the witness `ρ : P a` + +```text + ((x : A) (p : P x) → Q x p) → Q a ρ +``` + +is an [equivalence](foundation-core.equivalences.md). The following conditions are equivalent to being a unary mere identity system + +1. The underlying type of `P` is [`0`-connected](foundation.0-connected-types.md). +2. The subtype `P` contains the same elements as the subtype of all elements [merely equal](foundation.mere-equality.md) to `a`. +3. The evaluation map + + ```text + ((x : A) → P x → Q x) → Q a + ``` + + is an equivalence for every subtype `Q : A → Prop`. In this case we say that `P` is the {{#concept "least subtype containing a given element"}} `a`. + +### Binary mere identity systems + +A reflexive [binary relation](foundation.binary-relations.md) `R : A → A → Prop` valued in [foundation-core.propositions.md) is said to be a binary {{#concept "mere identity system" Disambiguation="binary"}} if for every `S : (x y : A) → R x y → Prop` the evaluation map at the reflexivity element `ρ` + +```text + ((x y : A) (r : R x y) → S x y r) → S a a (ρ a) +``` + +is an [equivalence](foundation-core.equivalences.md) for every element `a : A`. The following conditions are equivalent to being a binary mere identity system + +1. The [total space](foundation.dependent-pair-types.md) `Σ A (R a)` is [`0`-connected](foundation.0-connected-types.md) for every element `a : A`. +2. The relation `R` relates the same elements as the [mere equality relation](foundation.mere-equality.md). +3. The evaluation map + + ```text + ((x y : A) → R x y → S x y) → S a a + ``` + + is an equivalence for every binary relation `S : A → A → Prop`. +4. The subtype `R a : A → Prop` is a unary mere identitity system for every `a : A`. + +## Definitions + +### The predicate of being a unary mere identity system + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (P : subtype l2 A) {a : A} (ρ : is-in-subtype P a) + where + + ev-element-subtype : + {l : Level} (Q : (x : A) → is-in-subtype P x → Prop l) → + ((x : A) (p : is-in-subtype P x) → is-in-subtype (Q x) p) → + is-in-subtype (Q a) ρ + ev-element-subtype Q f = f a ρ + + is-mere-identity-system-subtype : UUω + is-mere-identity-system-subtype = + {l : Level} (Q : (x : A) → is-in-subtype P x → Prop l) → + is-equiv (ev-element-subtype Q) + + ind-mere-identity-system-subtype : + is-mere-identity-system-subtype → + {l : Level} (Q : (x : A) → is-in-subtype P x → Prop l) → + type-Prop (Q a ρ) → (x : A) (p : is-in-subtype P x) → type-Prop (Q x p) + ind-mere-identity-system-subtype H Q = + map-inv-is-equiv (H Q) + + rec-mere-identity-system-subtype : + is-mere-identity-system-subtype → + {l : Level} (Q : subtype l A) → + is-in-subtype Q a → (x : A) → is-in-subtype P x → is-in-subtype Q x + rec-mere-identity-system-subtype H Q = + ind-mere-identity-system-subtype H (λ x _ → Q x) +``` + +### The predicate of being a `0`-connected subtype + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (P : subtype l2 A) + where + + is-0-connected-prop-subtype : Prop (l1 ⊔ l2) + is-0-connected-prop-subtype = is-0-connected-Prop (type-subtype P) + + is-0-connected-subtype : UU (l1 ⊔ l2) + is-0-connected-subtype = type-Prop is-0-connected-prop-subtype + + is-prop-is-0-connected-subtype : is-prop is-0-connected-subtype + is-prop-is-0-connected-subtype = is-prop-type-Prop is-0-connected-prop-subtype +``` + +### The predicate of being the least subtype containing an element + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (P : subtype l2 A) {a : A} (ρ : is-in-subtype P a) + where + + is-least-subtype-containing-element : UUω + is-least-subtype-containing-element = + {l : Level} (Q : subtype l A) → + is-equiv (ev-element-subtype P ρ (λ x _ → Q x)) +``` + +### The predicate of being a binary mere identity system + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (R : Relation-Prop l2 A) + (ρ : is-reflexive-Relation-Prop R) + where + + ev-refl-Reflexive-Relation-Prop : + {l : Level} (S : (x y : A) → subtype l (type-Relation-Prop R x y)) → + ((x y : A) (r : type-Relation-Prop R x y) → is-in-subtype (S x y) r) → + (x : A) → is-in-subtype (S x x) (ρ x) + ev-refl-Reflexive-Relation-Prop S f x = f x x (ρ x) + + is-mere-identity-system-Reflexive-Relation-Prop : UUω + is-mere-identity-system-Reflexive-Relation-Prop = + {l : Level} (S : (x y : A) → subtype l (type-Relation-Prop R x y)) → + is-equiv (ev-refl-Reflexive-Relation-Prop S) +``` + +### The predicate of being the least reflexive relation + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (R : Relation-Prop l2 A) + (ρ : is-reflexive-Relation-Prop R) + where + + is-least-Reflexive-Relation-Prop : UUω + is-least-Reflexive-Relation-Prop = + {l : Level} (S : Relation-Prop l A) → + is-equiv (ev-refl-Reflexive-Relation-Prop R ρ (λ x y _ → S x y)) +``` + +## Properties + +### Any unary identity system is a `0`-connected subtype + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (P : subtype l2 A) {a : A} (ρ : is-in-subtype P a) + where + + is-0-connected-is-mere-identity-system-subtype : + is-mere-identity-system-subtype P ρ → is-0-connected-subtype P + is-0-connected-is-mere-identity-system-subtype H = + is-0-connected-dependent-universal-property-0-connected-type + ( a , ρ) + ( λ Q → is-equiv-comp _ _ is-equiv-ev-pair (H (λ x y → Q (x , y)))) +``` + +### The extension of a unary mere identity system to the set truncation is an identity system + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (P : subtype l2 A) {a : A} (ρ : is-in-subtype P a) + (H : is-mere-identity-system-subtype P ρ) + where + + abstract + is-torsorial-extension-trunc-set-subtype-is-mere-identity-system : + is-torsorial (is-in-extension-trunc-set-subtype P) + is-torsorial-extension-trunc-set-subtype-is-mere-identity-system = + is-contr-equiv' + ( type-trunc-Set (type-subtype P)) + ( compute-type-extension-trunc-set-subtype P) + ( is-0-connected-is-mere-identity-system-subtype P ρ H) + + abstract + is-identity-system-extension-trunc-set-subtype-is-mere-identity-system : + is-identity-system + ( is-in-extension-trunc-set-subtype P) + ( unit-trunc-Set a) + ( is-in-extension-trunc-set-is-in-subtype P a ρ) + is-identity-system-extension-trunc-set-subtype-is-mere-identity-system = + is-identity-system-is-torsorial + ( unit-trunc-Set a) + ( is-in-extension-trunc-set-is-in-subtype P a ρ) + ( is-torsorial-extension-trunc-set-subtype-is-mere-identity-system) +``` + +### Mere equality is a mere identity system + +```agda +module _ + {l1 : Level} {A : UU l1} (a : A) + where + + abstract + is-mere-identity-system-mere-eq : + is-mere-identity-system-subtype (mere-eq-Prop a) (refl-mere-eq a) + is-mere-identity-system-mere-eq P = + is-equiv-has-converse-is-prop + ( is-prop-Π (λ x → is-prop-Π (is-prop-is-in-subtype (P x)))) + ( is-prop-is-in-subtype (P a) (refl-mere-eq a)) + ( λ p x → ind-trunc-Prop (P x) (λ where refl → p)) + + abstract + ind-mere-identity-system-mere-eq : + {l : Level} (P : (x : A) → mere-eq a x → Prop l) → + (p : type-Prop (P a (refl-mere-eq a))) → + (x : A) (r : mere-eq a x) → type-Prop (P x r) + ind-mere-identity-system-mere-eq = + ind-mere-identity-system-subtype + ( mere-eq-Prop a) + ( refl-mere-eq a) + ( is-mere-identity-system-mere-eq) + + abstract + rec-mere-identity-system-mere-eq : + {l : Level} (P : subtype l A) → + (p : is-in-subtype P a) (x : A) (r : mere-eq a x) → is-in-subtype P x + rec-mere-identity-system-mere-eq = + rec-mere-identity-system-subtype + ( mere-eq-Prop a) + ( refl-mere-eq a) + ( is-mere-identity-system-mere-eq) +``` + +### Any unary mere identity system has the same elements as the subtype of elements merely equal to the base point + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (P : subtype l2 A) {a : A} (ρ : is-in-subtype P a) + (H : is-mere-identity-system-subtype P ρ) + where + + has-same-elements-mere-eq-is-mere-identity-system-subtype : + has-same-elements-subtype (mere-eq-Prop a) P + pr1 (has-same-elements-mere-eq-is-mere-identity-system-subtype x) = + rec-mere-identity-system-mere-eq a P ρ x + pr2 (has-same-elements-mere-eq-is-mere-identity-system-subtype x) = + rec-mere-identity-system-subtype P ρ H (mere-eq-Prop a) (refl-mere-eq a) x +``` diff --git a/src/foundation/set-truncations.lagda.md b/src/foundation/set-truncations.lagda.md index 154cc2d2b5..59215c0e2e 100644 --- a/src/foundation/set-truncations.lagda.md +++ b/src/foundation/set-truncations.lagda.md @@ -9,16 +9,23 @@ module foundation.set-truncations where
Imports ```agda +open import foundation.action-on-identifications-functions open import foundation.dependent-pair-types open import foundation.effective-maps-equivalence-relations open import foundation.equality-coproduct-types +open import foundation.function-extensionality open import foundation.functoriality-cartesian-product-types open import foundation.functoriality-coproduct-types +open import foundation.logical-equivalences open import foundation.mere-equality open import foundation.postcomposition-functions +open import foundation.propositional-extensionality open import foundation.reflecting-maps-equivalence-relations +open import foundation.retractions +open import foundation.sections open import foundation.sets open import foundation.slice +open import foundation.subtypes open import foundation.surjective-maps open import foundation.truncations open import foundation.uniqueness-set-truncations @@ -567,3 +574,169 @@ module _ triangle-distributive-trunc-product-Set = pr2 (center distributive-trunc-product-Set) ``` + +### Extending subtypes to set truncations + +Any subtype `P` of `A` extends to a subtype `P̃` of the set truncation of `A`. Futhermore, the underlying type of the extension of `P` to the set truncation of `A` is the set truncation of the underlying type of `P`. + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (P : subtype l2 A) + where + + extension-trunc-set-subtype : subtype l2 (type-trunc-Set A) + extension-trunc-set-subtype = + map-universal-property-trunc-Set (Prop-Set l2) P + + is-in-extension-trunc-set-subtype : type-trunc-Set A → UU l2 + is-in-extension-trunc-set-subtype = + is-in-subtype extension-trunc-set-subtype + + abstract + compute-extension-trunc-set-subtype : + has-same-elements-subtype P (extension-trunc-set-subtype ∘ unit-trunc-Set) + compute-extension-trunc-set-subtype x = + iff-eq (inv (triangle-universal-property-trunc-Set (Prop-Set l2) P x)) + + abstract + is-in-extension-trunc-set-is-in-subtype : + P ⊆ extension-trunc-set-subtype ∘ unit-trunc-Set + is-in-extension-trunc-set-is-in-subtype x = + forward-implication (compute-extension-trunc-set-subtype x) + + abstract + is-in-subtype-is-in-extension-trunc-set-subtype : + extension-trunc-set-subtype ∘ unit-trunc-Set ⊆ P + is-in-subtype-is-in-extension-trunc-set-subtype x = + backward-implication (compute-extension-trunc-set-subtype x) + + map-compute-type-extension-trunc-set-subtype : + type-trunc-Set (type-subtype P) → type-subtype extension-trunc-set-subtype + map-compute-type-extension-trunc-set-subtype = + map-universal-property-trunc-Set + ( set-subset (trunc-Set A) extension-trunc-set-subtype) + ( map-Σ + ( is-in-extension-trunc-set-subtype) + ( unit-trunc-Set) + ( is-in-extension-trunc-set-is-in-subtype)) + + abstract + triangle-map-compute-type-extension-trunc-set-subtype : + map-compute-type-extension-trunc-set-subtype ∘ unit-trunc-Set ~ + map-Σ + ( is-in-extension-trunc-set-subtype) + ( unit-trunc-Set) + ( is-in-extension-trunc-set-is-in-subtype) + triangle-map-compute-type-extension-trunc-set-subtype = + triangle-universal-property-trunc-Set + ( set-subset (trunc-Set A) extension-trunc-set-subtype) + ( map-Σ + ( is-in-extension-trunc-set-subtype) + ( unit-trunc-Set) + ( is-in-extension-trunc-set-is-in-subtype)) + + map-inv-compute-type-extension-trunc-set-subtype : + type-subtype extension-trunc-set-subtype → type-trunc-Set (type-subtype P) + map-inv-compute-type-extension-trunc-set-subtype (x , p) = + function-dependent-universal-property-trunc-Set + ( λ y → + function-Set + ( is-in-extension-trunc-set-subtype y) + ( trunc-Set (type-subtype P))) + ( λ y q → + unit-trunc-Set + ( y , is-in-subtype-is-in-extension-trunc-set-subtype y q)) + ( x) + ( p) + + abstract + triangle-map-inv-compute-type-extension-trunc-set-subtype : + ( x : A) → + ev-pair + ( map-inv-compute-type-extension-trunc-set-subtype) + ( unit-trunc-Set x) ~ + ( λ q → + unit-trunc-Set + ( x , is-in-subtype-is-in-extension-trunc-set-subtype x q)) + triangle-map-inv-compute-type-extension-trunc-set-subtype x = + htpy-eq + ( compute-dependent-universal-property-trunc-Set + ( λ y → + function-Set + ( is-in-extension-trunc-set-subtype y) + ( trunc-Set (type-subtype P))) + ( λ y q → + unit-trunc-Set + ( y , is-in-subtype-is-in-extension-trunc-set-subtype y q)) + ( x)) + + abstract + is-section-map-inv-compute-type-extension-trunc-set-subtype : + is-section + ( map-compute-type-extension-trunc-set-subtype) + ( map-inv-compute-type-extension-trunc-set-subtype) + is-section-map-inv-compute-type-extension-trunc-set-subtype (x , p) = + function-dependent-universal-property-trunc-Set + ( λ y → + Π-Set' + ( is-in-extension-trunc-set-subtype y) + ( λ q → + set-Prop + ( Id-Prop + ( set-subset (trunc-Set A) extension-trunc-set-subtype) + ( map-compute-type-extension-trunc-set-subtype + ( map-inv-compute-type-extension-trunc-set-subtype + ( y , q))) + ( y , q)))) + ( λ y q → + eq-type-subtype + ( extension-trunc-set-subtype) + ( ap + ( inclusion-subtype extension-trunc-set-subtype) + ( ( ap + ( map-compute-type-extension-trunc-set-subtype) + ( triangle-map-inv-compute-type-extension-trunc-set-subtype + y q)) ∙ + ( triangle-map-compute-type-extension-trunc-set-subtype + ( y , is-in-subtype-is-in-extension-trunc-set-subtype y q))))) + ( x) + ( p) + + abstract + is-retraction-map-inv-compute-type-extension-trunc-set-subtype : + is-retraction + ( map-compute-type-extension-trunc-set-subtype) + ( map-inv-compute-type-extension-trunc-set-subtype) + is-retraction-map-inv-compute-type-extension-trunc-set-subtype = + apply-dependent-universal-property-trunc-Set' + ( λ y → + set-Prop + ( Id-Prop + ( trunc-Set (type-subtype P)) + ( map-inv-compute-type-extension-trunc-set-subtype + ( map-compute-type-extension-trunc-set-subtype y)) + ( y))) + ( λ (y , q) → + ( ap + ( map-inv-compute-type-extension-trunc-set-subtype) + ( triangle-map-compute-type-extension-trunc-set-subtype (y , q))) ∙ + ( ( triangle-map-inv-compute-type-extension-trunc-set-subtype y + ( is-in-extension-trunc-set-is-in-subtype y q)) ∙ + ( ap unit-trunc-Set (eq-type-subtype P refl)))) + + abstract + is-equiv-map-compute-type-extension-trunc-set-subtype : + is-equiv map-compute-type-extension-trunc-set-subtype + is-equiv-map-compute-type-extension-trunc-set-subtype = + is-equiv-is-invertible + ( map-inv-compute-type-extension-trunc-set-subtype) + ( is-section-map-inv-compute-type-extension-trunc-set-subtype) + ( is-retraction-map-inv-compute-type-extension-trunc-set-subtype) + + compute-type-extension-trunc-set-subtype : + type-trunc-Set (type-subtype P) ≃ type-subtype extension-trunc-set-subtype + pr1 compute-type-extension-trunc-set-subtype = + map-compute-type-extension-trunc-set-subtype + pr2 compute-type-extension-trunc-set-subtype = + is-equiv-map-compute-type-extension-trunc-set-subtype +``` diff --git a/src/foundation/sets.lagda.md b/src/foundation/sets.lagda.md index 32edfb667b..015741d33d 100644 --- a/src/foundation/sets.lagda.md +++ b/src/foundation/sets.lagda.md @@ -23,6 +23,7 @@ open import foundation-core.embeddings open import foundation-core.equivalences open import foundation-core.identity-types open import foundation-core.injective-maps +open import foundation-core.mere-equality open import foundation-core.precomposition-functions open import foundation-core.propositional-maps open import foundation-core.propositions @@ -219,6 +220,18 @@ abstract is-set-emb = is-trunc-emb neg-one-𝕋 ``` +### If mere equality maps into the identity type of `A`, then `A` is a set + +```agda +is-set-mere-eq-in-id : + {l : Level} {A : UU l} → ((x y : A) → mere-eq x y → x = y) → is-set A +is-set-mere-eq-in-id = + is-set-prop-in-id + ( mere-eq) + ( is-prop-mere-eq) + ( refl-mere-eq) +``` + ### Any function from a proposition into a set is an embedding ```agda diff --git a/src/foundation/subtypes.lagda.md b/src/foundation/subtypes.lagda.md index b181a9a10d..754b54ab55 100644 --- a/src/foundation/subtypes.lagda.md +++ b/src/foundation/subtypes.lagda.md @@ -23,6 +23,7 @@ open import foundation-core.function-types open import foundation-core.homotopies open import foundation-core.identity-types open import foundation-core.injective-maps +open import foundation-core.mere-equality open import foundation-core.propositions open import foundation-core.sets open import foundation-core.torsorial-type-families diff --git a/src/group-theory/homomorphisms-concrete-group-actions.lagda.md b/src/group-theory/homomorphisms-concrete-group-actions.lagda.md index 62057b8e87..f3e3c4d3e7 100644 --- a/src/group-theory/homomorphisms-concrete-group-actions.lagda.md +++ b/src/group-theory/homomorphisms-concrete-group-actions.lagda.md @@ -81,7 +81,7 @@ module _ (g : hom-action-Concrete-Group G X Y) → (f = g) ≃ htpy-hom-action-Concrete-Group g extensionality-hom-action-Concrete-Group g = - ( equiv-dependent-universal-property-is-0-connected + ( equiv-dependent-universal-property-0-connected-type ( shape-Concrete-Group G) ( is-0-connected-classifying-type-Concrete-Group G) ( λ u → diff --git a/src/group-theory/symmetric-concrete-groups.lagda.md b/src/group-theory/symmetric-concrete-groups.lagda.md index 006ef44e03..6d6ef57b1f 100644 --- a/src/group-theory/symmetric-concrete-groups.lagda.md +++ b/src/group-theory/symmetric-concrete-groups.lagda.md @@ -70,7 +70,7 @@ module _ (X = Y) ≃ equiv-classifying-type-symmetric-Concrete-Group X Y extensionality-classifying-type-symmetric-Concrete-Group X = extensionality-type-subtype - ( λ Y → mere-eq-Prop Y A) + ( mere-eq-Prop A) ( pr2 X) ( id-equiv) ( extensionality-Set (pr1 X)) diff --git a/src/higher-group-theory/cartesian-products-higher-groups.lagda.md b/src/higher-group-theory/cartesian-products-higher-groups.lagda.md index 2183bb2862..7f4ebf570e 100644 --- a/src/higher-group-theory/cartesian-products-higher-groups.lagda.md +++ b/src/higher-group-theory/cartesian-products-higher-groups.lagda.md @@ -77,7 +77,7 @@ module _ type-Prop (P shape-product-∞-Group) → ((X : classifying-type-product-∞-Group) → type-Prop (P X)) elim-prop-classifying-type-product-∞-Group = - apply-dependent-universal-property-is-0-connected + apply-dependent-universal-property-0-connected-type shape-product-∞-Group is-0-connected-classifying-type-product-∞-Group diff --git a/src/higher-group-theory/higher-groups.lagda.md b/src/higher-group-theory/higher-groups.lagda.md index 6102d85536..658430400e 100644 --- a/src/higher-group-theory/higher-groups.lagda.md +++ b/src/higher-group-theory/higher-groups.lagda.md @@ -92,7 +92,7 @@ module _ type-Prop (P shape-∞-Group) → ((X : classifying-type-∞-Group) → type-Prop (P X)) elim-prop-classifying-type-∞-Group = - apply-dependent-universal-property-is-0-connected + apply-dependent-universal-property-0-connected-type shape-∞-Group is-0-connected-classifying-type-∞-Group diff --git a/src/higher-group-theory/iterated-cartesian-products-higher-groups.lagda.md b/src/higher-group-theory/iterated-cartesian-products-higher-groups.lagda.md index e9a5b7aaab..53a99878eb 100644 --- a/src/higher-group-theory/iterated-cartesian-products-higher-groups.lagda.md +++ b/src/higher-group-theory/iterated-cartesian-products-higher-groups.lagda.md @@ -92,7 +92,7 @@ module _ ((X : classifying-type-iterated-product-∞-Group) → type-Prop (P X)) elim-prop-classifying-type-iterated-product-∞-Group = - apply-dependent-universal-property-is-0-connected + apply-dependent-universal-property-0-connected-type shape-iterated-product-∞-Group is-0-connected-classifying-type-iterated-product-∞-Group diff --git a/src/structured-types.lagda.md b/src/structured-types.lagda.md index 6e6a4705ee..770dcb507c 100644 --- a/src/structured-types.lagda.md +++ b/src/structured-types.lagda.md @@ -15,6 +15,7 @@ open import structured-types.commuting-squares-of-pointed-homotopies public open import structured-types.commuting-squares-of-pointed-maps public open import structured-types.commuting-triangles-of-pointed-maps public open import structured-types.conjugation-pointed-types public +open import structured-types.connected-h-spaces public open import structured-types.constant-pointed-maps public open import structured-types.contractible-pointed-types public open import structured-types.cyclic-types public @@ -47,6 +48,7 @@ open import structured-types.magmas public open import structured-types.maps-globular-types public open import structured-types.maps-large-globular-types public open import structured-types.mere-equivalences-types-equipped-with-endomorphisms public +open import structured-types.mere-units-h-spaces public open import structured-types.morphisms-h-spaces public open import structured-types.morphisms-magmas public open import structured-types.morphisms-pointed-arrows public diff --git a/src/structured-types/central-h-spaces.lagda.md b/src/structured-types/central-h-spaces.lagda.md index c0ea967513..eb956e8b0b 100644 --- a/src/structured-types/central-h-spaces.lagda.md +++ b/src/structured-types/central-h-spaces.lagda.md @@ -7,9 +7,21 @@ module structured-types.central-h-spaces where
Imports ```agda +open import foundation.0-connected-types +open import foundation.cartesian-product-types +open import foundation.connected-components +open import foundation.dependent-pair-types +open import foundation.endomorphisms open import foundation.equivalences +open import foundation.function-types +open import foundation.identity-types +open import foundation.mere-identity-endomorphisms +open import foundation.sets open import foundation.universe-levels +open import structured-types.connected-h-spaces +open import structured-types.h-spaces +open import structured-types.pointed-maps open import structured-types.pointed-types ``` @@ -22,23 +34,172 @@ type of H-space structures on a [pointed type](structured-types.pointed-types.md) `A` is equivalently described as the type of [pointed sections](structured-types.pointed-types.md) of the pointed evaluation map `(A → A) →∗ A`. If the type `A` is -[connected](foundation.connected-types.md), then the section maps to the +[0-connected](foundation.0-connected-types.md), then the section maps to the [connected component](foundation.connected-components.md) of `(A ≃ A)` at the -identity [equivalence](foundation-core.equivalences.md). An **evaluative -H-space** is a pointed type such that the map `ev_pt : (A ≃ A)_{(id)} → A` is an -equivalence. +identity [equivalence](foundation-core.equivalences.md). Now the question arises +for which H-spaces this evaluation map `(A → A) →∗ A` is an equivalence. This +leads to the concept of _central H-space_. -## Definition +A {{#concept "central pointed type" agda=Central-Pointed-Type}} is a +[pointed type](structured-types.pointed-types.md) such that the map +`ev_pt : (A → A)_{(id)} → A` from the connected component of the identity +function is an equivalence. Note that every type of [mere identity endomorphisms](foundation.mere-identity-endomorphisms.md) is an H-space, and therefore it follows that every central pointed type is also an H-space. + +## Definitions + +### The predicate of being a central pointed type ```agda -is-central-h-space : +is-central-Pointed-Type : {l : Level} (A : Pointed-Type l) → UU l -is-central-h-space A = +is-central-Pointed-Type A = is-equiv - { A = type-Pointed-Type A → type-Pointed-Type A} - ( ev-point-Pointed-Type A) + { A = mere-identity-endomorphism (type-Pointed-Type A)} + ( ev-point-Pointed-Type A ∘ pr1) ``` -## References +### Central pointed types + +```agda +Central-Pointed-Type : (l : Level) → UU (lsuc l) +Central-Pointed-Type l = Σ (Pointed-Type l) is-central-Pointed-Type + +module _ + {l : Level} (A : Central-Pointed-Type l) + where + + pointed-type-Central-Pointed-Type : Pointed-Type l + pointed-type-Central-Pointed-Type = pr1 A + + type-Central-Pointed-Type : UU l + type-Central-Pointed-Type = + type-Pointed-Type pointed-type-Central-Pointed-Type + + point-Central-Pointed-Type : type-Central-Pointed-Type + point-Central-Pointed-Type = + point-Pointed-Type pointed-type-Central-Pointed-Type + + is-central-Central-Pointed-Type : + is-central-Pointed-Type pointed-type-Central-Pointed-Type + is-central-Central-Pointed-Type = pr2 A + + ev-point-Central-Pointed-Type : + mere-identity-endomorphism type-Central-Pointed-Type → + type-Central-Pointed-Type + ev-point-Central-Pointed-Type = + ev-point-Pointed-Type pointed-type-Central-Pointed-Type ∘ pr1 + + ev-point-equiv-Central-Pointed-Type : + mere-identity-endomorphism type-Central-Pointed-Type ≃ + type-Central-Pointed-Type + pr1 ev-point-equiv-Central-Pointed-Type = ev-point-Central-Pointed-Type + pr2 ev-point-equiv-Central-Pointed-Type = is-central-Central-Pointed-Type +``` + +### The predicate of being a central H-space + +```agda +module _ + {l : Level} (A : H-Space l) + where + + is-central-H-Space : UU l + is-central-H-Space = + is-0-connected-H-Space A × + is-set (pointed-type-H-Space A →∗ pointed-type-H-Space A) + + is-0-connected-is-central-H-Space : + is-central-H-Space → is-0-connected-H-Space A + is-0-connected-is-central-H-Space = pr1 + + is-set-pointed-endomap-is-central-H-Space : + is-central-H-Space → + is-set (pointed-type-H-Space A →∗ pointed-type-H-Space A) + is-set-pointed-endomap-is-central-H-Space = pr2 +``` + +### Central H-spaces + +```agda +Central-H-Space : + (l : Level) → UU (lsuc l) +Central-H-Space l = Σ (H-Space l) is-central-H-Space + +module _ + {l : Level} (A : Central-H-Space l) + where + + h-space-Central-H-Space : H-Space l + h-space-Central-H-Space = pr1 A + + pointed-type-Central-H-Space : Pointed-Type l + pointed-type-Central-H-Space = + pointed-type-H-Space h-space-Central-H-Space + + type-Central-H-Space : UU l + type-Central-H-Space = type-H-Space h-space-Central-H-Space + + unit-Central-H-Space : type-Central-H-Space + unit-Central-H-Space = unit-H-Space h-space-Central-H-Space + + mul-Central-H-Space : + (x y : type-Central-H-Space) → type-Central-H-Space + mul-Central-H-Space = mul-H-Space h-space-Central-H-Space + + left-unit-law-mul-Central-H-Space : + (x : type-Central-H-Space) → + mul-Central-H-Space unit-Central-H-Space x = x + left-unit-law-mul-Central-H-Space = + left-unit-law-mul-H-Space h-space-Central-H-Space + + right-unit-law-mul-Central-H-Space : + (x : type-Central-H-Space) → + mul-Central-H-Space x unit-Central-H-Space = x + right-unit-law-mul-Central-H-Space = + right-unit-law-mul-H-Space h-space-Central-H-Space + + coh-unit-laws-mul-Central-H-Space : + left-unit-law-mul-Central-H-Space unit-Central-H-Space = + right-unit-law-mul-Central-H-Space unit-Central-H-Space + coh-unit-laws-mul-Central-H-Space = + coh-unit-laws-mul-H-Space h-space-Central-H-Space + + is-central-Central-H-Space : + is-central-H-Space h-space-Central-H-Space + is-central-Central-H-Space = pr2 A + + is-0-connected-Central-H-Space : + is-0-connected-H-Space h-space-Central-H-Space + is-0-connected-Central-H-Space = + is-0-connected-is-central-H-Space + ( h-space-Central-H-Space) + ( is-central-Central-H-Space) + + is-set-pointed-endomap-Central-H-Space : + is-set (pointed-type-Central-H-Space →∗ pointed-type-Central-H-Space) + is-set-pointed-endomap-Central-H-Space = + is-set-pointed-endomap-is-central-H-Space + ( h-space-Central-H-Space) + ( is-central-Central-H-Space) +``` + +## Properties + +### Central pointed types are connected + +```agda +module _ + {l1 : Level} (A : Central-Pointed-Type l1) + where + + is-0-connected-Central-Pointed-Type : + is-0-connected (type-Central-Pointed-Type A) + is-0-connected-Central-Pointed-Type = + is-0-connected-equiv' + ( ev-point-equiv-Central-Pointed-Type A) + ( is-0-connected-connected-component + ( type-Central-Pointed-Type A → type-Central-Pointed-Type A) + ( id)) +``` {{#bibliography}} {{#reference BCFR23}} diff --git a/src/structured-types/connected-h-spaces.lagda.md b/src/structured-types/connected-h-spaces.lagda.md new file mode 100644 index 0000000000..6dc3dcd03c --- /dev/null +++ b/src/structured-types/connected-h-spaces.lagda.md @@ -0,0 +1,232 @@ +# Connected H-spaces + +```agda +module structured-types.connected-h-spaces where +``` + +
Imports + +```agda +open import foundation.0-connected-types +open import foundation.binary-equivalences +open import foundation.connected-types +open import foundation.dependent-pair-types +open import foundation.equivalences +open import foundation.function-types +open import foundation.identity-types +open import foundation.propositional-truncations +open import foundation.propositions +open import foundation.truncation-levels +open import foundation.universe-levels + +open import structured-types.h-spaces +open import structured-types.pointed-types +``` + +
+ +## Idea + +A {{#concept "connected H-space" Agda=Connected-H-Space}} is an +[H-space](structured-types.h-spaces.md) of which the underlying type is +[0-connected](foundation.0-connected-types.md). The binary operation +`μ : A → A → A` of any connected H-space `A` is a +[binary equivalence](foundation.binary-equivalences.md). This means that the +maps + +```text + x ↦ μ x y : A → A and y ↦ μ x y : A → A +``` + +are [equivalences](foundation-core.equivalences.md) for any `x` and `y` in `A`. +Furthermore, the [connected component](foundation.connected-components.md) of +the unit element of an H-space is always a connected H-space. We will prove this +fact in the file about [mere units](structured-types.mere-units-h-spaces.md). + +## Definitions + +### The predicate of being a connected H-space + +```agda +module _ + {l1 : Level} (k : 𝕋) (A : H-Space l1) + where + + is-connected-prop-H-Space : Prop l1 + is-connected-prop-H-Space = is-connected-Prop k (type-H-Space A) + + is-connected-H-Space : UU l1 + is-connected-H-Space = is-connected k (type-H-Space A) + + is-prop-is-connected-H-Space : is-prop is-connected-H-Space + is-prop-is-connected-H-Space = is-prop-is-connected k (type-H-Space A) +``` + +### The predicate of being a 0-connected H-space + +```agda +module _ + {l1 : Level} (A : H-Space l1) + where + + is-0-connected-prop-H-Space : Prop l1 + is-0-connected-prop-H-Space = is-0-connected-Prop (type-H-Space A) + + is-0-connected-H-Space : UU l1 + is-0-connected-H-Space = is-0-connected (type-H-Space A) + + is-prop-is-0-connected-H-Space : is-prop is-0-connected-H-Space + is-prop-is-0-connected-H-Space = is-prop-is-0-connected (type-H-Space A) +``` + +### The type of connected H-spaces + +```agda +Connected-H-Space : (l : Level) (k : 𝕋) → UU (lsuc l) +Connected-H-Space l k = Σ (H-Space l) (is-connected-H-Space k) + +module _ + {l : Level} {k : 𝕋} (A : Connected-H-Space l k) + where + + h-space-Connected-H-Space : H-Space l + h-space-Connected-H-Space = pr1 A + + pointed-type-Connected-H-Space : Pointed-Type l + pointed-type-Connected-H-Space = + pointed-type-H-Space h-space-Connected-H-Space + + type-Connected-H-Space : UU l + type-Connected-H-Space = type-H-Space h-space-Connected-H-Space + + unit-Connected-H-Space : type-Connected-H-Space + unit-Connected-H-Space = unit-H-Space h-space-Connected-H-Space + + mul-Connected-H-Space : + (x y : type-Connected-H-Space) → type-Connected-H-Space + mul-Connected-H-Space = mul-H-Space h-space-Connected-H-Space + + left-unit-law-mul-Connected-H-Space : + (x : type-Connected-H-Space) → + mul-Connected-H-Space unit-Connected-H-Space x = x + left-unit-law-mul-Connected-H-Space = + left-unit-law-mul-H-Space h-space-Connected-H-Space + + right-unit-law-mul-Connected-H-Space : + (x : type-Connected-H-Space) → + mul-Connected-H-Space x unit-Connected-H-Space = x + right-unit-law-mul-Connected-H-Space = + right-unit-law-mul-H-Space h-space-Connected-H-Space + + coh-unit-laws-mul-Connected-H-Space : + left-unit-law-mul-Connected-H-Space unit-Connected-H-Space = + right-unit-law-mul-Connected-H-Space unit-Connected-H-Space + coh-unit-laws-mul-Connected-H-Space = + coh-unit-laws-mul-H-Space h-space-Connected-H-Space + + is-connected-Connected-H-Space : + is-connected-H-Space k h-space-Connected-H-Space + is-connected-Connected-H-Space = pr2 A +``` + +### The type of 0-connected H-spaces + +```agda +0-Connected-H-Space : (l : Level) → UU (lsuc l) +0-Connected-H-Space l = Σ (H-Space l) is-0-connected-H-Space + +module _ + {l : Level} (A : 0-Connected-H-Space l) + where + + h-space-0-Connected-H-Space : H-Space l + h-space-0-Connected-H-Space = pr1 A + + pointed-type-0-Connected-H-Space : Pointed-Type l + pointed-type-0-Connected-H-Space = + pointed-type-H-Space h-space-0-Connected-H-Space + + type-0-Connected-H-Space : UU l + type-0-Connected-H-Space = type-H-Space h-space-0-Connected-H-Space + + unit-0-Connected-H-Space : type-0-Connected-H-Space + unit-0-Connected-H-Space = unit-H-Space h-space-0-Connected-H-Space + + mul-0-Connected-H-Space : + (x y : type-0-Connected-H-Space) → type-0-Connected-H-Space + mul-0-Connected-H-Space = mul-H-Space h-space-0-Connected-H-Space + + left-unit-law-mul-0-Connected-H-Space : + (x : type-0-Connected-H-Space) → + mul-0-Connected-H-Space unit-0-Connected-H-Space x = x + left-unit-law-mul-0-Connected-H-Space = + left-unit-law-mul-H-Space h-space-0-Connected-H-Space + + right-unit-law-mul-0-Connected-H-Space : + (x : type-0-Connected-H-Space) → + mul-0-Connected-H-Space x unit-0-Connected-H-Space = x + right-unit-law-mul-0-Connected-H-Space = + right-unit-law-mul-H-Space h-space-0-Connected-H-Space + + coh-unit-laws-mul-0-Connected-H-Space : + left-unit-law-mul-0-Connected-H-Space unit-0-Connected-H-Space = + right-unit-law-mul-0-Connected-H-Space unit-0-Connected-H-Space + coh-unit-laws-mul-0-Connected-H-Space = + coh-unit-laws-mul-H-Space h-space-0-Connected-H-Space + + is-0-connected-0-Connected-H-Space : + is-0-connected-H-Space h-space-0-Connected-H-Space + is-0-connected-0-Connected-H-Space = pr2 A +``` + +## Properties + +### The binary operation of any 0-connected H-space is a binary equivalence + +```agda +module _ + {l : Level} (A : 0-Connected-H-Space l) + where + + abstract + is-equiv-left-mul-0-Connected-H-Space : + (x : type-0-Connected-H-Space A) → + is-equiv (λ y → mul-0-Connected-H-Space A x y) + is-equiv-left-mul-0-Connected-H-Space x = + apply-universal-property-trunc-Prop + ( mere-eq-is-0-connected + ( is-0-connected-0-Connected-H-Space A) + ( unit-0-Connected-H-Space A) + ( x)) + ( is-equiv-Prop (mul-0-Connected-H-Space A x)) + ( λ where + refl → + is-equiv-htpy id + ( left-unit-law-mul-0-Connected-H-Space A) + ( is-equiv-id)) + + abstract + is-equiv-right-mul-0-Connected-H-Space : + (y : type-0-Connected-H-Space A) → + is-equiv (λ x → mul-0-Connected-H-Space A x y) + is-equiv-right-mul-0-Connected-H-Space y = + apply-universal-property-trunc-Prop + ( mere-eq-is-0-connected + ( is-0-connected-0-Connected-H-Space A) + ( unit-0-Connected-H-Space A) + ( y)) + ( is-equiv-Prop (λ x → mul-0-Connected-H-Space A x y)) + ( λ where + refl → + is-equiv-htpy id + ( right-unit-law-mul-0-Connected-H-Space A) + ( is-equiv-id)) + + abstract + is-binary-equiv-mul-0-Connected-H-Space : + is-binary-equiv (mul-0-Connected-H-Space A) + pr1 is-binary-equiv-mul-0-Connected-H-Space = + is-equiv-right-mul-0-Connected-H-Space + pr2 is-binary-equiv-mul-0-Connected-H-Space = + is-equiv-left-mul-0-Connected-H-Space +``` diff --git a/src/structured-types/h-spaces.lagda.md b/src/structured-types/h-spaces.lagda.md index be217b8539..56971caaeb 100644 --- a/src/structured-types/h-spaces.lagda.md +++ b/src/structured-types/h-spaces.lagda.md @@ -9,13 +9,18 @@ module structured-types.h-spaces where ```agda open import foundation.action-on-identifications-binary-functions open import foundation.action-on-identifications-functions +open import foundation.commuting-squares-of-identifications +open import foundation.commuting-triangles-of-identifications open import foundation.dependent-pair-types open import foundation.equivalences open import foundation.evaluation-functions open import foundation.function-extensionality open import foundation.function-types open import foundation.functoriality-dependent-pair-types +open import foundation.homotopies open import foundation.identity-types +open import foundation.injective-maps +open import foundation.path-algebra open import foundation.type-arithmetic-dependent-pair-types open import foundation.unital-binary-operations open import foundation.universe-levels @@ -196,3 +201,120 @@ module _ equiv-tot (λ _ → inv-equiv (equiv-right-whisker-concat refl))))) ∘e ( associative-Σ _ _ _) ``` + +### Every type equivalent to an H-space is an H-space + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (B : H-Space l2) (e : A ≃ type-H-Space B) + where + + unit-equiv-H-Space : A + unit-equiv-H-Space = map-inv-equiv e (unit-H-Space B) + + compute-unit-equiv-H-Space : map-equiv e unit-equiv-H-Space = unit-H-Space B + compute-unit-equiv-H-Space = is-section-map-inv-equiv e (unit-H-Space B) + + mul-equiv-H-Space : A → A → A + mul-equiv-H-Space x y = + map-inv-equiv e (mul-H-Space B (map-equiv e x) (map-equiv e y)) + + compute-mul-equiv-H-Space : + (x y : A) → + map-equiv e (mul-equiv-H-Space x y) = + mul-H-Space B (map-equiv e x) (map-equiv e y) + compute-mul-equiv-H-Space x y = + is-section-map-inv-equiv e _ + + left-unit-law-mul-equiv-H-Space : + (x : A) → mul-equiv-H-Space unit-equiv-H-Space x = x + left-unit-law-mul-equiv-H-Space x = + map-inv-is-equiv + ( is-emb-equiv e _ _) + ( ( compute-mul-equiv-H-Space _ _) ∙ + ( ( ap (λ t → mul-H-Space B t _) compute-unit-equiv-H-Space) ∙ + ( left-unit-law-mul-H-Space B _))) + + compute-left-unit-law-mul-equiv-H-Space : + (x : A) → + ap (map-equiv e) (left-unit-law-mul-equiv-H-Space x) = + ( ( compute-mul-equiv-H-Space unit-equiv-H-Space x) ∙ + ( ( ap (λ t → mul-H-Space B t _) (compute-unit-equiv-H-Space)) ∙ + ( left-unit-law-mul-H-Space B (map-equiv e x)))) + compute-left-unit-law-mul-equiv-H-Space x = + is-section-map-inv-is-equiv (is-emb-equiv e _ _) _ + + right-unit-law-mul-equiv-H-Space : + (x : A) → mul-equiv-H-Space x unit-equiv-H-Space = x + right-unit-law-mul-equiv-H-Space x = + map-inv-is-equiv + ( is-emb-equiv e _ _) + ( ( compute-mul-equiv-H-Space _ _) ∙ + ( ( ap (mul-H-Space B _) compute-unit-equiv-H-Space) ∙ + ( right-unit-law-mul-H-Space B _))) + + compute-right-unit-law-mul-equiv-H-Space : + (x : A) → + ( ap (map-equiv e) (right-unit-law-mul-equiv-H-Space x)) = + ( ( compute-mul-equiv-H-Space x unit-equiv-H-Space) ∙ + ( ( ap (mul-H-Space B _) (compute-unit-equiv-H-Space)) ∙ + ( right-unit-law-mul-H-Space B (map-equiv e x)))) + compute-right-unit-law-mul-equiv-H-Space x = + is-section-map-inv-is-equiv (is-emb-equiv e _ _) _ + + coh-unit-laws-mul-equiv-H-Space : + left-unit-law-mul-equiv-H-Space unit-equiv-H-Space = + right-unit-law-mul-equiv-H-Space unit-equiv-H-Space + coh-unit-laws-mul-equiv-H-Space = + is-injective-is-equiv + ( is-emb-equiv e _ _) + ( ( compute-left-unit-law-mul-equiv-H-Space _) ∙ + ( ( left-whisker-concat + ( compute-mul-equiv-H-Space _ _) + ( right-unwhisker-concat-coherence-square-identifications + ( ap (mul-H-Space B _) compute-unit-equiv-H-Space) + ( ap + ( λ t → mul-H-Space B t (map-equiv e unit-equiv-H-Space)) + ( compute-unit-equiv-H-Space)) + ( right-unit-law-mul-H-Space B _) + ( left-unit-law-mul-H-Space B _) + ( compute-unit-equiv-H-Space) + ( ( left-whisker-concat + ( ap (λ t → mul-H-Space B t _) compute-unit-equiv-H-Space) + ( nat-htpy-id + ( left-unit-law-mul-H-Space B) + ( compute-unit-equiv-H-Space))) ∙ + ( inv + ( assoc + ( ap (λ t → mul-H-Space B t _) compute-unit-equiv-H-Space) + ( ap (mul-H-Space B _) compute-unit-equiv-H-Space) + ( left-unit-law-mul-H-Space B (unit-H-Space B)))) ∙ + ( horizontal-concat-Id² + ( triangle-ap-binary' + ( mul-H-Space B) + ( is-section-map-inv-equiv e _) + ( is-section-map-inv-equiv e _)) + ( coh-unit-laws-mul-H-Space B)) ∙ + ( assoc + ( ap (mul-H-Space B _) compute-unit-equiv-H-Space) + ( ap (λ t → mul-H-Space B t _) compute-unit-equiv-H-Space) + ( right-unit-law-mul-H-Space B (unit-H-Space B))) ∙ + ( inv + ( left-whisker-concat + ( ap (mul-H-Space B _) compute-unit-equiv-H-Space) + ( nat-htpy-id + ( right-unit-law-mul-H-Space B) + ( compute-unit-equiv-H-Space))))))) ∙ + ( inv (compute-right-unit-law-mul-equiv-H-Space _)))) + + pointed-type-equiv-H-Space : Pointed-Type l1 + pr1 pointed-type-equiv-H-Space = A + pr2 pointed-type-equiv-H-Space = unit-equiv-H-Space + + h-space-equiv-H-Space : H-Space l1 + pr1 h-space-equiv-H-Space = pointed-type-equiv-H-Space + pr1 (pr2 h-space-equiv-H-Space) = mul-equiv-H-Space + pr1 (pr2 (pr2 h-space-equiv-H-Space)) = left-unit-law-mul-equiv-H-Space + pr1 (pr2 (pr2 (pr2 h-space-equiv-H-Space))) = right-unit-law-mul-equiv-H-Space + pr2 (pr2 (pr2 (pr2 h-space-equiv-H-Space))) = coh-unit-laws-mul-equiv-H-Space +``` diff --git a/src/structured-types/mere-units-h-spaces.lagda.md b/src/structured-types/mere-units-h-spaces.lagda.md new file mode 100644 index 0000000000..e49a1e03cb --- /dev/null +++ b/src/structured-types/mere-units-h-spaces.lagda.md @@ -0,0 +1,212 @@ +# Mere units of H-spaces + +```agda +module structured-types.mere-units-h-spaces where +``` + +
Imports + +```agda +open import foundation.0-connected-types +open import foundation.action-on-identifications-functions +open import foundation.binary-equivalences +open import foundation.connected-components +open import foundation.dependent-pair-types +open import foundation.identity-types +open import foundation.mere-equality +open import foundation.propositional-truncations +open import foundation.propositions +open import foundation.subtypes +open import foundation.universe-levels + +open import structured-types.connected-h-spaces +open import structured-types.h-spaces +open import structured-types.pointed-types +``` + +
+ +## Idea + +A {{#concept "mere unit" Disambiguation="H-space"}} in an +[H-space](structured-types.h-spaces.md) `A` is an element `x` that is +[merely equal](foundation.mere-equality.md) to the unit element of `A`. The type +of mere units of an H-space always forms a +[connected H-space](structured-types.connected-h-spaces.md). In particular, +since the multiplicative operation of a connected H-space is always a +[binary equivalence](foundation.binary-equivalences.md), it follows that the +binary operation restricted to the mere units of an H-space is a binary +equivalence. + +## Definitions + +### The predicate of being a mere unit of an H-space + +```agda +module _ + {l1 : Level} (A : H-Space l1) + where + + is-mere-unit-prop-H-Space : type-H-Space A → Prop l1 + is-mere-unit-prop-H-Space x = mere-eq-Prop (unit-H-Space A) x + + is-mere-unit-H-Space : type-H-Space A → UU l1 + is-mere-unit-H-Space x = mere-eq (unit-H-Space A) x + + is-prop-is-mere-unit-H-Space : + (x : type-H-Space A) → is-prop (is-mere-unit-H-Space x) + is-prop-is-mere-unit-H-Space x = + is-prop-mere-eq (unit-H-Space A) x +``` + +### The type of mere units of an H-space + +```agda +module _ + {l1 : Level} (A : H-Space l1) + where + + mere-unit-H-Space : UU l1 + mere-unit-H-Space = Σ (type-H-Space A) (is-mere-unit-H-Space A) +``` + +### The connected component of the unit of an H-Space + +```agda +module _ + {l1 : Level} (A : H-Space l1) + where + + connected-component-unit-H-Space : UU l1 + connected-component-unit-H-Space = + connected-component (type-H-Space A) (unit-H-Space A) + + is-0-connected-connected-component-unit-H-Space : + is-0-connected connected-component-unit-H-Space + is-0-connected-connected-component-unit-H-Space = + is-0-connected-connected-component (type-H-Space A) (unit-H-Space A) + + inclusion-connected-component-unit-H-Space : + connected-component-unit-H-Space → type-H-Space A + inclusion-connected-component-unit-H-Space = pr1 +``` + +## Properties + +### The unit of an H-space is a mere unit + +```agda +module _ + {l1 : Level} (A : H-Space l1) + where + + is-mere-unit-unit-H-Space : is-mere-unit-H-Space A (unit-H-Space A) + is-mere-unit-unit-H-Space = refl-mere-eq _ +``` + +### The multiplicative operation of an H-space preserves mere units + +```agda +module _ + {l1 : Level} (A : H-Space l1) + where + + abstract + preserves-mere-unit-mul-H-Space : + {x y : type-H-Space A} → + is-mere-unit-H-Space A x → is-mere-unit-H-Space A y → + is-mere-unit-H-Space A (mul-H-Space A x y) + preserves-mere-unit-mul-H-Space H K = + apply-twice-universal-property-trunc-Prop H K + ( is-mere-unit-prop-H-Space A _) + ( λ where + refl refl → + unit-trunc-Prop (inv (left-unit-law-mul-H-Space A _))) +``` + +### The connected component of the unit of an H-space is a connected H-space + +```agda +module _ + {l1 : Level} (A : H-Space l1) + where + + unit-connected-component-unit-H-Space : connected-component-unit-H-Space A + pr1 unit-connected-component-unit-H-Space = unit-H-Space A + pr2 unit-connected-component-unit-H-Space = is-mere-unit-unit-H-Space A + + connected-component-unit-pointed-type-H-Space : Pointed-Type l1 + pr1 connected-component-unit-pointed-type-H-Space = + connected-component-unit-H-Space A + pr2 connected-component-unit-pointed-type-H-Space = + unit-connected-component-unit-H-Space + + mul-connected-component-unit-H-Space : + (x y : connected-component-unit-H-Space A) → + connected-component-unit-H-Space A + pr1 (mul-connected-component-unit-H-Space x y) = + mul-H-Space A + ( inclusion-connected-component-unit-H-Space A x) + ( inclusion-connected-component-unit-H-Space A y) + pr2 (mul-connected-component-unit-H-Space x y) = + preserves-mere-unit-mul-H-Space A (pr2 x) (pr2 y) + + left-unit-law-mul-connected-component-unit-H-Space : + (x : connected-component-unit-H-Space A) → + mul-connected-component-unit-H-Space + ( unit-connected-component-unit-H-Space) + ( x) = + x + left-unit-law-mul-connected-component-unit-H-Space x = + eq-type-subtype + ( is-mere-unit-prop-H-Space A) + ( left-unit-law-mul-H-Space A + ( inclusion-connected-component-unit-H-Space A x)) + + right-unit-law-mul-connected-component-unit-H-Space : + (x : connected-component-unit-H-Space A) → + mul-connected-component-unit-H-Space + ( x) + ( unit-connected-component-unit-H-Space) = + x + right-unit-law-mul-connected-component-unit-H-Space x = + eq-type-subtype + ( is-mere-unit-prop-H-Space A) + ( right-unit-law-mul-H-Space A + ( inclusion-connected-component-unit-H-Space A x)) + + coh-unit-laws-mul-connected-component-unit-H-Space : + left-unit-law-mul-connected-component-unit-H-Space + ( unit-connected-component-unit-H-Space) = + right-unit-law-mul-connected-component-unit-H-Space + ( unit-connected-component-unit-H-Space) + coh-unit-laws-mul-connected-component-unit-H-Space = + ap + ( eq-type-subtype (is-mere-unit-prop-H-Space A)) + ( coh-unit-laws-mul-H-Space A) + + connected-component-unit-h-space-H-Space : H-Space l1 + pr1 connected-component-unit-h-space-H-Space = + connected-component-unit-pointed-type-H-Space + pr1 (pr2 connected-component-unit-h-space-H-Space) = + mul-connected-component-unit-H-Space + pr1 (pr2 (pr2 connected-component-unit-h-space-H-Space)) = + left-unit-law-mul-connected-component-unit-H-Space + pr1 (pr2 (pr2 (pr2 connected-component-unit-h-space-H-Space))) = + right-unit-law-mul-connected-component-unit-H-Space + pr2 (pr2 (pr2 (pr2 connected-component-unit-h-space-H-Space))) = + coh-unit-laws-mul-connected-component-unit-H-Space + + connected-component-unit-connected-h-space-H-Space : + 0-Connected-H-Space l1 + pr1 connected-component-unit-connected-h-space-H-Space = + connected-component-unit-h-space-H-Space + pr2 connected-component-unit-connected-h-space-H-Space = + is-0-connected-connected-component-unit-H-Space A + + is-binary-equiv-mul-connected-component-unit-H-Space : + is-binary-equiv mul-connected-component-unit-H-Space + is-binary-equiv-mul-connected-component-unit-H-Space = + is-binary-equiv-mul-0-Connected-H-Space + ( connected-component-unit-connected-h-space-H-Space) +```