diff --git a/references.bib b/references.bib
index d11d699b03..97b5e98597 100644
--- a/references.bib
+++ b/references.bib
@@ -461,6 +461,24 @@ @article{KECA17
keywords = {Computer Science - Logic in Computer Science ; 03B15 ; F.4.1},
}
+@inproceedings{Kraus15,
+ title = {{The General Universal Property of the Propositional Truncation}},
+ author = {Kraus, Nicolai},
+ year = 2015,
+ booktitle = {20th International Conference on Types for Proofs and Programs (TYPES 2014)},
+ publisher = {Schloss Dagstuhl -- Leibniz-Zentrum f{\"u}r Informatik},
+ address = {Dagstuhl, Germany},
+ series = {Leibniz International Proceedings in Informatics (LIPIcs)},
+ volume = 39,
+ pages = {111--145},
+ doi = {10.4230/LIPIcs.TYPES.2014.111},
+ isbn = {978-3-939897-88-0},
+ issn = {1868-8969},
+ editor = {Herbelin, Hugo and Letouzey, Pierre and Sozeau, Matthieu},
+ urn = {urn:nbn:de:0030-drops-54944},
+ annote = {Keywords: coherence conditions, propositional truncation, Reedy limits, universal property, well-behaved constancy},
+}
+
@book{Kunen11,
title = {Set theory},
author = {Kunen, Kenneth},
diff --git a/src/foundation-core/constant-maps.lagda.md b/src/foundation-core/constant-maps.lagda.md
index 46e9ad8b04..d6fa02a4c1 100644
--- a/src/foundation-core/constant-maps.lagda.md
+++ b/src/foundation-core/constant-maps.lagda.md
@@ -32,4 +32,6 @@ const A b x = b
## See also
+- [Coherently constant maps](foundation.coherently-constant-maps.md) for the
+ condition on a map of being constant
- [Constant pointed maps](structured-types.constant-pointed-maps.md)
diff --git a/src/foundation.lagda.md b/src/foundation.lagda.md
index 154bf0d8b6..fd81511d50 100644
--- a/src/foundation.lagda.md
+++ b/src/foundation.lagda.md
@@ -57,6 +57,7 @@ open import foundation.category-of-sets public
open import foundation.choice-of-representatives-equivalence-relation public
open import foundation.coalgebras-maybe public
open import foundation.codiagonal-maps-of-types public
+open import foundation.coherently-constant-maps public
open import foundation.coherently-idempotent-maps public
open import foundation.coherently-invertible-maps public
open import foundation.coinhabited-pairs-of-types public
diff --git a/src/foundation/coherently-constant-maps.lagda.md b/src/foundation/coherently-constant-maps.lagda.md
new file mode 100644
index 0000000000..3ab24ae450
--- /dev/null
+++ b/src/foundation/coherently-constant-maps.lagda.md
@@ -0,0 +1,326 @@
+# Coherently constant maps
+
+```agda
+module foundation.coherently-constant-maps where
+```
+
+Imports
+
+```agda
+open import foundation.action-on-identifications-functions
+open import foundation.commuting-triangles-of-identifications
+open import foundation.dependent-pair-types
+open import foundation.fundamental-theorem-of-identity-types
+open import foundation.homotopy-induction
+open import foundation.identity-types
+open import foundation.propositional-truncations
+open import foundation.propositions
+open import foundation.sets
+open import foundation.structure-identity-principle
+open import foundation.torsorial-type-families
+open import foundation.type-arithmetic-dependent-pair-types
+open import foundation.universe-levels
+open import foundation.weakly-constant-maps
+
+open import foundation-core.contractible-types
+open import foundation-core.equivalences
+open import foundation-core.function-types
+open import foundation-core.functoriality-dependent-pair-types
+open import foundation-core.homotopies
+```
+
+
+
+## Idea
+
+A map `f : A → B` is said to be
+{{#concept "(coherently) constant" Disambiguation="map of types" WD="constant function" WDID=Q746264 Agda=is-constant-map Agda=constant-map}}
+if there is a [partial element](foundation.partial-elements.md) of `B`,
+`b : ║A║₋₁ → B` such that for every `x : A` we have `f x = b`.
+{{#cite Kraus15}}
+
+## Definition
+
+### The type of constancy witnesses of a map
+
+```agda
+is-constant-map :
+ {l1 l2 : Level} {A : UU l1} {B : UU l2} → (A → B) → UU (l1 ⊔ l2)
+is-constant-map {A = A} {B} f =
+ Σ (║ A ║₋₁ → B) (λ b → (x : A) → f x = b (unit-trunc-Prop x))
+
+module _
+ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B} (H : is-constant-map f)
+ where
+
+ center-partial-element-is-constant-map : ║ A ║₋₁ → B
+ center-partial-element-is-constant-map = pr1 H
+
+ contraction-is-constant-map' :
+ (x : A) → f x = center-partial-element-is-constant-map (unit-trunc-Prop x)
+ contraction-is-constant-map' = pr2 H
+
+ contraction-is-constant-map :
+ (x : A) {|x| : ║ A ║₋₁} → f x = center-partial-element-is-constant-map |x|
+ contraction-is-constant-map x =
+ contraction-is-constant-map' x ∙
+ ap center-partial-element-is-constant-map (eq-type-Prop (trunc-Prop A))
+```
+
+### The type of coherently constant maps
+
+```agda
+constant-map : {l1 l2 : Level} → UU l1 → UU l2 → UU (l1 ⊔ l2)
+constant-map A B = Σ (A → B) is-constant-map
+
+module _
+ {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : constant-map A B)
+ where
+
+ map-constant-map : A → B
+ map-constant-map = pr1 f
+
+ is-constant-constant-map : is-constant-map map-constant-map
+ is-constant-constant-map = pr2 f
+
+ center-partial-element-constant-map : ║ A ║₋₁ → B
+ center-partial-element-constant-map =
+ center-partial-element-is-constant-map is-constant-constant-map
+
+ contraction-constant-map' :
+ (x : A) →
+ map-constant-map x = center-partial-element-constant-map (unit-trunc-Prop x)
+ contraction-constant-map' =
+ contraction-is-constant-map' is-constant-constant-map
+
+ contraction-constant-map :
+ (x : A) {|x| : ║ A ║₋₁} →
+ map-constant-map x = center-partial-element-constant-map |x|
+ contraction-constant-map =
+ contraction-is-constant-map is-constant-constant-map
+```
+
+## Properties
+
+### Coherently constant maps from `A` to `B` are in correspondence with partial elements of `B` over `║ A ║₋₁`
+
+```agda
+module _
+ {l1 l2 : Level} {A : UU l1} {B : UU l2}
+ where
+
+ compute-constant-map : constant-map A B ≃ (║ A ║₋₁ → B)
+ compute-constant-map =
+ equivalence-reasoning
+ Σ (A → B) (is-constant-map)
+ ≃ Σ (║ A ║₋₁ → B) (λ b → Σ (A → B) (λ f → f ~ b ∘ unit-trunc-Prop))
+ by equiv-left-swap-Σ
+ ≃ (║ A ║₋₁ → B)
+ by
+ right-unit-law-Σ-is-contr (λ b → is-torsorial-htpy' (b ∘ unit-trunc-Prop))
+```
+
+### Characterizing equality of coherently constant maps
+
+Equality of constant maps is characterized by homotopy of their centers.
+
+```agda
+module _
+ {l1 l2 : Level} {A : UU l1} {B : UU l2}
+ where
+
+ htpy-constant-map : (f g : constant-map A B) → UU (l1 ⊔ l2)
+ htpy-constant-map f g =
+ center-partial-element-constant-map f ~
+ center-partial-element-constant-map g
+
+ refl-htpy-constant-map :
+ (f : constant-map A B) → htpy-constant-map f f
+ refl-htpy-constant-map f = refl-htpy
+
+ htpy-eq-constant-map :
+ (f g : constant-map A B) → f = g → htpy-constant-map f g
+ htpy-eq-constant-map f .f refl = refl-htpy-constant-map f
+
+ is-torsorial-htpy-constant-map :
+ (f : constant-map A B) → is-torsorial (htpy-constant-map f)
+ is-torsorial-htpy-constant-map f =
+ is-contr-equiv
+ ( Σ (║ A ║₋₁ → B) (center-partial-element-constant-map f ~_))
+ ( equiv-Σ-equiv-base
+ ( center-partial-element-constant-map f ~_)
+ ( compute-constant-map))
+ ( is-torsorial-htpy (center-partial-element-constant-map f))
+
+ is-equiv-htpy-eq-constant-map :
+ (f g : constant-map A B) → is-equiv (htpy-eq-constant-map f g)
+ is-equiv-htpy-eq-constant-map f =
+ fundamental-theorem-id
+ ( is-torsorial-htpy-constant-map f)
+ ( htpy-eq-constant-map f)
+
+ extensionality-constant-map :
+ (f g : constant-map A B) → (f = g) ≃ htpy-constant-map f g
+ extensionality-constant-map f g =
+ ( htpy-eq-constant-map f g ,
+ is-equiv-htpy-eq-constant-map f g)
+
+ eq-htpy-constant-map :
+ (f g : constant-map A B) → htpy-constant-map f g → f = g
+ eq-htpy-constant-map f g =
+ map-inv-equiv (extensionality-constant-map f g)
+```
+
+### Characterizing equality of constancy witnesses
+
+Two constancy witnesses `H` and `K` are equal if there is a homotopy of centers
+`p : H₀ ~ K₀` such that for every `x : A` we have a
+[commuting triangle of identifications](foundation.commuting-triangles-of-identifications.md)
+
+```text
+ f x
+ / \
+ H₁x / \ K₁x
+ ∨ ∨
+ H₀ ----> K₀.
+ p
+```
+
+```agda
+module _
+ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B}
+ where
+
+ coherence-htpy-is-constant-map :
+ (H K : is-constant-map f)
+ (p :
+ center-partial-element-is-constant-map H ~
+ center-partial-element-is-constant-map K) →
+ UU (l1 ⊔ l2)
+ coherence-htpy-is-constant-map H K p =
+ (x : A) →
+ coherence-triangle-identifications
+ ( contraction-is-constant-map' K x)
+ ( p (unit-trunc-Prop x))
+ ( contraction-is-constant-map' H x)
+
+ htpy-is-constant-map : (H K : is-constant-map f) → UU (l1 ⊔ l2)
+ htpy-is-constant-map H K =
+ Σ ( center-partial-element-is-constant-map H ~
+ center-partial-element-is-constant-map K)
+ ( coherence-htpy-is-constant-map H K)
+
+ refl-htpy-is-constant-map :
+ (H : is-constant-map f) → htpy-is-constant-map H H
+ refl-htpy-is-constant-map H = (refl-htpy , inv-htpy-right-unit-htpy)
+
+ htpy-eq-is-constant-map :
+ (H K : is-constant-map f) → H = K → htpy-is-constant-map H K
+ htpy-eq-is-constant-map H .H refl = refl-htpy-is-constant-map H
+
+ is-torsorial-htpy-is-constant-map :
+ (H : is-constant-map f) → is-torsorial (htpy-is-constant-map H)
+ is-torsorial-htpy-is-constant-map H =
+ is-torsorial-Eq-structure
+ ( is-torsorial-htpy (center-partial-element-is-constant-map H))
+ ( center-partial-element-is-constant-map H , refl-htpy)
+ (is-torsorial-htpy' (contraction-is-constant-map' H ∙h refl-htpy))
+
+ is-equiv-htpy-eq-is-constant-map :
+ (H K : is-constant-map f) → is-equiv (htpy-eq-is-constant-map H K)
+ is-equiv-htpy-eq-is-constant-map H =
+ fundamental-theorem-id
+ ( is-torsorial-htpy-is-constant-map H)
+ ( htpy-eq-is-constant-map H)
+
+ extensionality-is-constant-map :
+ (H K : is-constant-map f) → (H = K) ≃ htpy-is-constant-map H K
+ extensionality-is-constant-map H K =
+ ( htpy-eq-is-constant-map H K , is-equiv-htpy-eq-is-constant-map H K)
+
+ eq-htpy-is-constant-map :
+ (H K : is-constant-map f) → htpy-is-constant-map H K → H = K
+ eq-htpy-is-constant-map H K =
+ map-inv-is-equiv (is-equiv-htpy-eq-is-constant-map H K)
+```
+
+### If the domain has an element then the center partial element is unique
+
+```agda
+module _
+ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B}
+ where
+
+ htpy-center-is-constant-map-has-element-domain :
+ A → (H K : is-constant-map f) →
+ center-partial-element-is-constant-map H ~
+ center-partial-element-is-constant-map K
+ htpy-center-is-constant-map-has-element-domain a H K _ =
+ inv (contraction-is-constant-map H a) ∙ contraction-is-constant-map K a
+```
+
+### If the codomain is a set then being constant is a property
+
+```agda
+module _
+ {l1 l2 : Level} {A : UU l1} {B : UU l2}
+ (is-set-B : is-set B)
+ {f : A → B}
+ where
+
+ htpy-center-is-constant-map-is-set-codomain :
+ (H K : is-constant-map f) →
+ center-partial-element-is-constant-map H ~
+ center-partial-element-is-constant-map K
+ htpy-center-is-constant-map-is-set-codomain H K |x| =
+ rec-trunc-Prop
+ ( Id-Prop
+ ( B , is-set-B)
+ ( center-partial-element-is-constant-map H |x|)
+ ( center-partial-element-is-constant-map K |x|))
+ ( λ x → htpy-center-is-constant-map-has-element-domain x H K |x|)
+ ( |x|)
+
+ all-elements-equal-is-constant-map-is-set-codomain :
+ all-elements-equal (is-constant-map f)
+ all-elements-equal-is-constant-map-is-set-codomain H K =
+ eq-htpy-is-constant-map H K
+ ( ( htpy-center-is-constant-map-is-set-codomain H K) ,
+ ( λ x →
+ eq-is-prop
+ ( is-set-B
+ ( f x)
+ ( center-partial-element-is-constant-map K (unit-trunc-Prop x)))))
+
+ is-prop-is-constant-map-is-set-codomain : is-prop (is-constant-map f)
+ is-prop-is-constant-map-is-set-codomain =
+ is-prop-all-elements-equal
+ ( all-elements-equal-is-constant-map-is-set-codomain)
+```
+
+### Coherently constant maps are weakly constant
+
+```agda
+module _
+ {l1 l2 : Level} {A : UU l1} {B : UU l2}
+ where
+
+ is-weakly-constant-map-is-constant-map :
+ {f : A → B} → is-constant-map f → is-weakly-constant-map f
+ is-weakly-constant-map-is-constant-map H x y =
+ contraction-is-constant-map' H x ∙ inv (contraction-is-constant-map H y)
+
+ is-weakly-constant-constant-map :
+ (f : constant-map A B) → is-weakly-constant-map (map-constant-map f)
+ is-weakly-constant-constant-map f =
+ is-weakly-constant-map-is-constant-map (is-constant-constant-map f)
+```
+
+## References
+
+{{#bibliography}} {{#reference Kraus15}}
+
+## See also
+
+- [Null-homotopic maps](foundation.null-homotopic-maps.md) are coherently
+ constant, and if the domain is pointed the two notions coincide.
diff --git a/src/foundation/constant-maps.lagda.md b/src/foundation/constant-maps.lagda.md
index ec686e7417..dd9b92514d 100644
--- a/src/foundation/constant-maps.lagda.md
+++ b/src/foundation/constant-maps.lagda.md
@@ -202,4 +202,6 @@ abstract
## See also
+- [Coherently constant maps](foundation.coherently-constant-maps.md) for the
+ condition on a map of being constant
- [Constant pointed maps](structured-types.constant-pointed-maps.md)
diff --git a/src/foundation/null-homotopic-maps.lagda.md b/src/foundation/null-homotopic-maps.lagda.md
index 2500c019f4..729c859fba 100644
--- a/src/foundation/null-homotopic-maps.lagda.md
+++ b/src/foundation/null-homotopic-maps.lagda.md
@@ -7,6 +7,7 @@ module foundation.null-homotopic-maps where
Imports
```agda
+open import foundation.coherently-constant-maps
open import foundation.commuting-triangles-of-identifications
open import foundation.constant-maps
open import foundation.dependent-pair-types
@@ -15,23 +16,19 @@ open import foundation.functoriality-dependent-pair-types
open import foundation.fundamental-theorem-of-identity-types
open import foundation.homotopy-induction
open import foundation.identity-types
-open import foundation.images
open import foundation.inhabited-types
-open import foundation.negation
open import foundation.propositional-truncations
open import foundation.propositions
open import foundation.sets
open import foundation.structure-identity-principle
open import foundation.torsorial-type-families
open import foundation.type-arithmetic-dependent-pair-types
-open import foundation.unit-type
open import foundation.universal-property-empty-type
open import foundation.universe-levels
open import foundation.weakly-constant-maps
open import foundation-core.contractible-types
open import foundation-core.equivalences
-open import foundation-core.function-types
open import foundation-core.homotopies
```
@@ -40,9 +37,9 @@ open import foundation-core.homotopies
## Idea
A map `f : A → B` is said to be
-{{#concept "null-homotopic" Disambiguation="map of types" Agda=is-null-homotopic}},
-or _constant_, if there is an element `y : B` such for every `x : A` we have
-`f x = y`. In other words, `f` is null-homotopic if it is
+{{#concept "null-homotopic" Disambiguation="map of types" Agda=is-null-homotopic-map}}
+if there is an element `y : B` such for every `x : A` we have `f x = y`. In
+other words, `f` is null-homotopic if it is
[homotopic](foundation-core.homotopies.md) to a
[constant](foundation-core.constant-maps.md) function.
@@ -51,23 +48,118 @@ or _constant_, if there is an element `y : B` such for every `x : A` we have
### The type of null-homotopies of a map
```agda
-is-null-homotopic :
+is-null-homotopic-map :
{l1 l2 : Level} {A : UU l1} {B : UU l2} → (A → B) → UU (l1 ⊔ l2)
-is-null-homotopic {A = A} {B} f = Σ B (λ y → (x : A) → f x = y)
+is-null-homotopic-map {A = A} {B} f = Σ B (λ y → (x : A) → f x = y)
module _
- {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B} (H : is-null-homotopic f)
+ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B}
+ (H : is-null-homotopic-map f)
+ where
+
+ center-is-null-homotopic-map : B
+ center-is-null-homotopic-map = pr1 H
+
+ contraction-is-null-homotopic-map :
+ (x : A) → f x = center-is-null-homotopic-map
+ contraction-is-null-homotopic-map = pr2 H
+```
+
+### The type of null-homotopic maps
+
+```agda
+null-homotopic-map : {l1 l2 : Level} → UU l1 → UU l2 → UU (l1 ⊔ l2)
+null-homotopic-map A B = Σ (A → B) is-null-homotopic-map
+
+module _
+ {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : null-homotopic-map A B)
where
- center-is-null-homotopic : B
- center-is-null-homotopic = pr1 H
+ map-null-homotopic-map : A → B
+ map-null-homotopic-map = pr1 f
+
+ is-null-homotopic-null-homotopic-map :
+ is-null-homotopic-map map-null-homotopic-map
+ is-null-homotopic-null-homotopic-map = pr2 f
+
+ center-null-homotopic-map : B
+ center-null-homotopic-map =
+ center-is-null-homotopic-map is-null-homotopic-null-homotopic-map
- contraction-is-null-homotopic : (x : A) → f x = center-is-null-homotopic
- contraction-is-null-homotopic = pr2 H
+ contraction-null-homotopic-map :
+ (x : A) →
+ map-null-homotopic-map x = center-null-homotopic-map
+ contraction-null-homotopic-map =
+ contraction-is-null-homotopic-map is-null-homotopic-null-homotopic-map
```
## Properties
+### Null-homotopic maps from `A` to `B` are in correspondence with elements of `B`
+
+```agda
+module _
+ {l1 l2 : Level} {A : UU l1} {B : UU l2}
+ where
+
+ compute-null-homotopic-map : null-homotopic-map A B ≃ B
+ compute-null-homotopic-map =
+ equivalence-reasoning
+ Σ (A → B) (is-null-homotopic-map)
+ ≃ Σ B (λ b → Σ (A → B) (λ f → f ~ const A b)) by equiv-left-swap-Σ
+ ≃ B by right-unit-law-Σ-is-contr (λ b → is-torsorial-htpy' (const A b))
+```
+
+### Characterizing equality of null-homotopic maps
+
+Equality of null-homotopic maps is characterized by equality of their centers.
+
+```agda
+module _
+ {l1 l2 : Level} {A : UU l1} {B : UU l2}
+ where
+
+ Eq-null-homotopic-map : (f g : null-homotopic-map A B) → UU l2
+ Eq-null-homotopic-map f g =
+ center-null-homotopic-map f = center-null-homotopic-map g
+
+ refl-Eq-null-homotopic-map :
+ (f : null-homotopic-map A B) → Eq-null-homotopic-map f f
+ refl-Eq-null-homotopic-map f = refl
+
+ Eq-eq-null-homotopic-map :
+ (f g : null-homotopic-map A B) → f = g → Eq-null-homotopic-map f g
+ Eq-eq-null-homotopic-map f .f refl = refl-Eq-null-homotopic-map f
+
+ is-torsorial-Eq-null-homotopic-map :
+ (f : null-homotopic-map A B) → is-torsorial (Eq-null-homotopic-map f)
+ is-torsorial-Eq-null-homotopic-map f =
+ is-contr-equiv
+ ( Σ B (Id (center-null-homotopic-map f)))
+ ( equiv-Σ-equiv-base
+ ( Id (center-null-homotopic-map f))
+ ( compute-null-homotopic-map))
+ ( is-torsorial-Id (center-null-homotopic-map f))
+
+ is-equiv-Eq-eq-null-homotopic-map :
+ (f g : null-homotopic-map A B) → is-equiv (Eq-eq-null-homotopic-map f g)
+ is-equiv-Eq-eq-null-homotopic-map f =
+ fundamental-theorem-id
+ ( is-torsorial-Eq-null-homotopic-map f)
+ ( Eq-eq-null-homotopic-map f)
+
+ extensionality-null-homotopic-map :
+ (f g : null-homotopic-map A B) → (f = g) ≃ Eq-null-homotopic-map f g
+ extensionality-null-homotopic-map f g =
+ ( Eq-eq-null-homotopic-map f g ,
+ is-equiv-Eq-eq-null-homotopic-map f g)
+
+ eq-Eq-null-homotopic-map :
+ (f g : null-homotopic-map A B) → Eq-null-homotopic-map f g → f = g
+ eq-Eq-null-homotopic-map f g =
+ map-inv-equiv (extensionality-null-homotopic-map f g)
+```
+
### Characterizing equality of null-homotopies
Two null-homotopies `H` and `K` are equal if there is an
@@ -89,54 +181,56 @@ module _
{l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B}
where
- coherence-htpy-is-null-homotopic :
- (H K : is-null-homotopic f)
- (p : center-is-null-homotopic H = center-is-null-homotopic K) →
+ coherence-htpy-is-null-homotopic-map :
+ (H K : is-null-homotopic-map f)
+ (p : center-is-null-homotopic-map H = center-is-null-homotopic-map K) →
UU (l1 ⊔ l2)
- coherence-htpy-is-null-homotopic H K p =
+ coherence-htpy-is-null-homotopic-map H K p =
(x : A) →
coherence-triangle-identifications
- ( contraction-is-null-homotopic K x)
+ ( contraction-is-null-homotopic-map K x)
( p)
- ( contraction-is-null-homotopic H x)
+ ( contraction-is-null-homotopic-map H x)
- htpy-is-null-homotopic : (H K : is-null-homotopic f) → UU (l1 ⊔ l2)
- htpy-is-null-homotopic H K =
- Σ ( center-is-null-homotopic H = center-is-null-homotopic K)
- ( coherence-htpy-is-null-homotopic H K)
+ htpy-is-null-homotopic-map : (H K : is-null-homotopic-map f) → UU (l1 ⊔ l2)
+ htpy-is-null-homotopic-map H K =
+ Σ ( center-is-null-homotopic-map H = center-is-null-homotopic-map K)
+ ( coherence-htpy-is-null-homotopic-map H K)
- refl-htpy-is-null-homotopic :
- (H : is-null-homotopic f) → htpy-is-null-homotopic H H
- refl-htpy-is-null-homotopic H = (refl , inv-htpy-right-unit-htpy)
+ refl-htpy-is-null-homotopic-map :
+ (H : is-null-homotopic-map f) → htpy-is-null-homotopic-map H H
+ refl-htpy-is-null-homotopic-map H = (refl , inv-htpy-right-unit-htpy)
- htpy-eq-is-null-homotopic :
- (H K : is-null-homotopic f) → H = K → htpy-is-null-homotopic H K
- htpy-eq-is-null-homotopic H .H refl = refl-htpy-is-null-homotopic H
+ htpy-eq-is-null-homotopic-map :
+ (H K : is-null-homotopic-map f) → H = K → htpy-is-null-homotopic-map H K
+ htpy-eq-is-null-homotopic-map H .H refl = refl-htpy-is-null-homotopic-map H
- is-torsorial-htpy-is-null-homotopic :
- (H : is-null-homotopic f) → is-torsorial (htpy-is-null-homotopic H)
- is-torsorial-htpy-is-null-homotopic H =
+ is-torsorial-htpy-is-null-homotopic-map :
+ (H : is-null-homotopic-map f) → is-torsorial (htpy-is-null-homotopic-map H)
+ is-torsorial-htpy-is-null-homotopic-map H =
is-torsorial-Eq-structure
- ( is-torsorial-Id (center-is-null-homotopic H))
- ( center-is-null-homotopic H , refl)
- ( is-torsorial-htpy' (contraction-is-null-homotopic H ∙h refl-htpy))
-
- is-equiv-htpy-eq-is-null-homotopic :
- (H K : is-null-homotopic f) → is-equiv (htpy-eq-is-null-homotopic H K)
- is-equiv-htpy-eq-is-null-homotopic H =
+ ( is-torsorial-Id (center-is-null-homotopic-map H))
+ ( center-is-null-homotopic-map H , refl)
+ ( is-torsorial-htpy' (contraction-is-null-homotopic-map H ∙h refl-htpy))
+
+ is-equiv-htpy-eq-is-null-homotopic-map :
+ (H K : is-null-homotopic-map f) →
+ is-equiv (htpy-eq-is-null-homotopic-map H K)
+ is-equiv-htpy-eq-is-null-homotopic-map H =
fundamental-theorem-id
- ( is-torsorial-htpy-is-null-homotopic H)
- ( htpy-eq-is-null-homotopic H)
-
- extensionality-htpy-is-null-homotopic :
- (H K : is-null-homotopic f) → (H = K) ≃ htpy-is-null-homotopic H K
- extensionality-htpy-is-null-homotopic H K =
- ( htpy-eq-is-null-homotopic H K , is-equiv-htpy-eq-is-null-homotopic H K)
-
- eq-htpy-is-null-homotopic :
- (H K : is-null-homotopic f) → htpy-is-null-homotopic H K → H = K
- eq-htpy-is-null-homotopic H K =
- map-inv-is-equiv (is-equiv-htpy-eq-is-null-homotopic H K)
+ ( is-torsorial-htpy-is-null-homotopic-map H)
+ ( htpy-eq-is-null-homotopic-map H)
+
+ extensionality-is-null-homotopic-map :
+ (H K : is-null-homotopic-map f) → (H = K) ≃ htpy-is-null-homotopic-map H K
+ extensionality-is-null-homotopic-map H K =
+ ( htpy-eq-is-null-homotopic-map H K ,
+ is-equiv-htpy-eq-is-null-homotopic-map H K)
+
+ eq-htpy-is-null-homotopic-map :
+ (H K : is-null-homotopic-map f) → htpy-is-null-homotopic-map H K → H = K
+ eq-htpy-is-null-homotopic-map H K =
+ map-inv-is-equiv (is-equiv-htpy-eq-is-null-homotopic-map H K)
```
### If the domain is empty the type of null-homotopies is equivalent to elements of `B`
@@ -146,8 +240,8 @@ module _
{l : Level} {B : UU l} {f : empty → B}
where
- compute-is-null-homotopic-empty-domain : is-null-homotopic f ≃ B
- compute-is-null-homotopic-empty-domain =
+ compute-is-null-homotopic-map-empty-domain : is-null-homotopic-map f ≃ B
+ compute-is-null-homotopic-map-empty-domain =
right-unit-law-Σ-is-contr
( λ y → dependent-universal-property-empty' (λ x → f x = y))
```
@@ -159,12 +253,13 @@ module _
{l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B}
where
- eq-center-is-null-homotopic-has-element-domain :
+ eq-center-is-null-homotopic-map-has-element-domain :
A →
- (H K : is-null-homotopic f) →
- center-is-null-homotopic H = center-is-null-homotopic K
- eq-center-is-null-homotopic-has-element-domain a H K =
- inv (contraction-is-null-homotopic H a) ∙ contraction-is-null-homotopic K a
+ (H K : is-null-homotopic-map f) →
+ center-is-null-homotopic-map H = center-is-null-homotopic-map K
+ eq-center-is-null-homotopic-map-has-element-domain a H K =
+ inv (contraction-is-null-homotopic-map H a) ∙
+ contraction-is-null-homotopic-map K a
```
### If the codomain is a set and the domain has an element then being null-homotopic is a property
@@ -176,18 +271,19 @@ module _
{f : A → B}
where
- all-elements-equal-is-null-homotopic-has-element-domain-is-set-codomain :
- all-elements-equal (is-null-homotopic f)
- all-elements-equal-is-null-homotopic-has-element-domain-is-set-codomain H K =
- eq-htpy-is-null-homotopic H K
- ( ( eq-center-is-null-homotopic-has-element-domain a H K) ,
- ( λ x → eq-is-prop (is-set-B (f x) (center-is-null-homotopic K))))
-
- is-prop-is-null-homotopic-has-element-domain-is-set-codomain :
- is-prop (is-null-homotopic f)
- is-prop-is-null-homotopic-has-element-domain-is-set-codomain =
+ all-elements-equal-is-null-homotopic-map-has-element-domain-is-set-codomain :
+ all-elements-equal (is-null-homotopic-map f)
+ all-elements-equal-is-null-homotopic-map-has-element-domain-is-set-codomain
+ H K =
+ eq-htpy-is-null-homotopic-map H K
+ ( ( eq-center-is-null-homotopic-map-has-element-domain a H K) ,
+ ( λ x → eq-is-prop (is-set-B (f x) (center-is-null-homotopic-map K))))
+
+ is-prop-is-null-homotopic-map-has-element-domain-is-set-codomain :
+ is-prop (is-null-homotopic-map f)
+ is-prop-is-null-homotopic-map-has-element-domain-is-set-codomain =
is-prop-all-elements-equal
- ( all-elements-equal-is-null-homotopic-has-element-domain-is-set-codomain)
+ ( all-elements-equal-is-null-homotopic-map-has-element-domain-is-set-codomain)
```
### If the codomain is a set and the domain is inhabited then being null-homotopic is a property
@@ -199,62 +295,78 @@ module _
{f : A → B}
where
- eq-center-is-null-homotopic-is-inhabited-domain-is-set-codomain :
- (H K : is-null-homotopic f) →
- center-is-null-homotopic H = center-is-null-homotopic K
- eq-center-is-null-homotopic-is-inhabited-domain-is-set-codomain H K =
+ eq-center-is-null-homotopic-map-is-inhabited-domain-is-set-codomain :
+ (H K : is-null-homotopic-map f) →
+ center-is-null-homotopic-map H = center-is-null-homotopic-map K
+ eq-center-is-null-homotopic-map-is-inhabited-domain-is-set-codomain H K =
rec-trunc-Prop
( Id-Prop
( B , is-set-B)
- ( center-is-null-homotopic H)
- ( center-is-null-homotopic K))
- ( λ x → eq-center-is-null-homotopic-has-element-domain x H K)
+ ( center-is-null-homotopic-map H)
+ ( center-is-null-homotopic-map K))
+ ( λ x → eq-center-is-null-homotopic-map-has-element-domain x H K)
( a)
- all-elements-equal-is-null-homotopic-is-inhabited-domain-is-set-codomain :
- all-elements-equal (is-null-homotopic f)
- all-elements-equal-is-null-homotopic-is-inhabited-domain-is-set-codomain H K =
- eq-htpy-is-null-homotopic H K
- ( ( eq-center-is-null-homotopic-is-inhabited-domain-is-set-codomain H K) ,
- ( λ x → eq-is-prop (is-set-B (f x) (center-is-null-homotopic K))))
-
- is-prop-is-null-homotopic-is-inhabited-domain-is-set-codomain :
- is-prop (is-null-homotopic f)
- is-prop-is-null-homotopic-is-inhabited-domain-is-set-codomain =
+ all-elements-equal-is-null-homotopic-map-is-inhabited-domain-is-set-codomain :
+ all-elements-equal (is-null-homotopic-map f)
+ all-elements-equal-is-null-homotopic-map-is-inhabited-domain-is-set-codomain
+ H K =
+ eq-htpy-is-null-homotopic-map H K
+ ( ( eq-center-is-null-homotopic-map-is-inhabited-domain-is-set-codomain
+ ( H)
+ ( K)) ,
+ ( λ x → eq-is-prop (is-set-B (f x) (center-is-null-homotopic-map K))))
+
+ is-prop-is-null-homotopic-map-is-inhabited-domain-is-set-codomain :
+ is-prop (is-null-homotopic-map f)
+ is-prop-is-null-homotopic-map-is-inhabited-domain-is-set-codomain =
is-prop-all-elements-equal
- ( all-elements-equal-is-null-homotopic-is-inhabited-domain-is-set-codomain)
+ ( all-elements-equal-is-null-homotopic-map-is-inhabited-domain-is-set-codomain)
```
-### Null-homotopic maps from `A` to `B` are in correspondence with elements of `B`
+### Null-homotopic maps are constant
```agda
module _
{l1 l2 : Level} {A : UU l1} {B : UU l2}
where
- compute-null-homotopic-map : Σ (A → B) (is-null-homotopic) ≃ B
- compute-null-homotopic-map =
- equivalence-reasoning
- Σ (A → B) (is-null-homotopic)
- ≃ Σ B (λ b → Σ (A → B) (λ f → f ~ const A b)) by equiv-left-swap-Σ
- ≃ B by right-unit-law-Σ-is-contr (λ b → is-torsorial-htpy' (const A b))
+ is-constant-map-is-null-homotopic-map :
+ {f : A → B} → is-null-homotopic-map f → is-constant-map f
+ is-constant-map-is-null-homotopic-map (b , H) = ((λ _ → b) , H)
+
+ is-constant-null-homotopic-map :
+ (f : null-homotopic-map A B) → is-constant-map (map-null-homotopic-map f)
+ is-constant-null-homotopic-map f =
+ is-constant-map-is-null-homotopic-map
+ ( is-null-homotopic-null-homotopic-map f)
```
### Null-homotopic maps are weakly constant
```agda
module _
- {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B}
+ {l1 l2 : Level} {A : UU l1} {B : UU l2}
where
- is-weakly-constant-is-null-homotopic :
- is-null-homotopic f → is-weakly-constant f
- is-weakly-constant-is-null-homotopic (b , H) x y = H x ∙ inv (H y)
+ is-weakly-constant-map-is-null-homotopic-map :
+ {f : A → B} → is-null-homotopic-map f → is-weakly-constant-map f
+ is-weakly-constant-map-is-null-homotopic-map (b , H) x y = H x ∙ inv (H y)
+
+ is-weakly-constant-null-homotopic-map :
+ (f : null-homotopic-map A B) →
+ is-weakly-constant-map (map-null-homotopic-map f)
+ is-weakly-constant-null-homotopic-map f =
+ is-weakly-constant-map-is-null-homotopic-map
+ ( is-null-homotopic-null-homotopic-map f)
```
## See also
-- [Weakly constant maps](foundation.weakly-constant-maps.md)
+- Null-homotopic maps are
+ [coherently constant](foundation.coherently-constant-maps.md), and if the
+ domain is pointed the two notions coincide
+- [Constant pointed maps](structured-types.constant-pointed-maps.md)
## External links
diff --git a/src/foundation/split-idempotent-maps.lagda.md b/src/foundation/split-idempotent-maps.lagda.md
index e3a320b622..6935652587 100644
--- a/src/foundation/split-idempotent-maps.lagda.md
+++ b/src/foundation/split-idempotent-maps.lagda.md
@@ -620,60 +620,60 @@ This is Theorem 3.9 of {{#cite Shu17}}.
```agda
module _
{l : Level} {A : UU l} {f : A → A}
- (H : is-idempotent f) (W : is-weakly-constant f)
+ (H : is-idempotent f) (W : is-weakly-constant-map f)
where
- splitting-type-is-split-idempotent-is-weakly-constant-is-idempotent :
+ splitting-type-is-split-idempotent-is-weakly-constant-map-is-idempotent :
UU l
- splitting-type-is-split-idempotent-is-weakly-constant-is-idempotent =
+ splitting-type-is-split-idempotent-is-weakly-constant-map-is-idempotent =
fixed-point f
- inclusion-is-split-idempotent-is-weakly-constant-is-idempotent :
- splitting-type-is-split-idempotent-is-weakly-constant-is-idempotent →
+ inclusion-is-split-idempotent-is-weakly-constant-map-is-idempotent :
+ splitting-type-is-split-idempotent-is-weakly-constant-map-is-idempotent →
A
- inclusion-is-split-idempotent-is-weakly-constant-is-idempotent = pr1
+ inclusion-is-split-idempotent-is-weakly-constant-map-is-idempotent = pr1
- map-retraction-is-split-idempotent-is-weakly-constant-is-idempotent :
+ map-retraction-is-split-idempotent-is-weakly-constant-map-is-idempotent :
A →
- splitting-type-is-split-idempotent-is-weakly-constant-is-idempotent
- map-retraction-is-split-idempotent-is-weakly-constant-is-idempotent x =
+ splitting-type-is-split-idempotent-is-weakly-constant-map-is-idempotent
+ map-retraction-is-split-idempotent-is-weakly-constant-map-is-idempotent x =
( f x , H x)
- is-retraction-map-retraction-is-split-idempotent-is-weakly-constant-is-idempotent :
+ is-retraction-map-retraction-is-split-idempotent-is-weakly-constant-map-is-idempotent :
is-retraction
- ( inclusion-is-split-idempotent-is-weakly-constant-is-idempotent)
- ( map-retraction-is-split-idempotent-is-weakly-constant-is-idempotent)
- is-retraction-map-retraction-is-split-idempotent-is-weakly-constant-is-idempotent
+ ( inclusion-is-split-idempotent-is-weakly-constant-map-is-idempotent)
+ ( map-retraction-is-split-idempotent-is-weakly-constant-map-is-idempotent)
+ is-retraction-map-retraction-is-split-idempotent-is-weakly-constant-map-is-idempotent
_ =
- eq-is-prop (is-prop-fixed-point-is-weakly-constant W)
+ eq-is-prop (is-prop-fixed-point-is-weakly-constant-map W)
- retraction-is-split-idempotent-is-weakly-constant-is-idempotent :
+ retraction-is-split-idempotent-is-weakly-constant-map-is-idempotent :
retraction
- ( inclusion-is-split-idempotent-is-weakly-constant-is-idempotent)
- retraction-is-split-idempotent-is-weakly-constant-is-idempotent =
- ( map-retraction-is-split-idempotent-is-weakly-constant-is-idempotent ,
- is-retraction-map-retraction-is-split-idempotent-is-weakly-constant-is-idempotent)
+ ( inclusion-is-split-idempotent-is-weakly-constant-map-is-idempotent)
+ retraction-is-split-idempotent-is-weakly-constant-map-is-idempotent =
+ ( map-retraction-is-split-idempotent-is-weakly-constant-map-is-idempotent ,
+ is-retraction-map-retraction-is-split-idempotent-is-weakly-constant-map-is-idempotent)
- retract-is-split-idempotent-is-weakly-constant-is-idempotent :
+ retract-is-split-idempotent-is-weakly-constant-map-is-idempotent :
retract
( A)
- ( splitting-type-is-split-idempotent-is-weakly-constant-is-idempotent)
- retract-is-split-idempotent-is-weakly-constant-is-idempotent =
- ( inclusion-is-split-idempotent-is-weakly-constant-is-idempotent ,
- retraction-is-split-idempotent-is-weakly-constant-is-idempotent)
-
- htpy-is-split-idempotent-is-weakly-constant-is-idempotent :
- inclusion-is-split-idempotent-is-weakly-constant-is-idempotent ∘
- map-retraction-is-split-idempotent-is-weakly-constant-is-idempotent ~
+ ( splitting-type-is-split-idempotent-is-weakly-constant-map-is-idempotent)
+ retract-is-split-idempotent-is-weakly-constant-map-is-idempotent =
+ ( inclusion-is-split-idempotent-is-weakly-constant-map-is-idempotent ,
+ retraction-is-split-idempotent-is-weakly-constant-map-is-idempotent)
+
+ htpy-is-split-idempotent-is-weakly-constant-map-is-idempotent :
+ inclusion-is-split-idempotent-is-weakly-constant-map-is-idempotent ∘
+ map-retraction-is-split-idempotent-is-weakly-constant-map-is-idempotent ~
f
- htpy-is-split-idempotent-is-weakly-constant-is-idempotent = refl-htpy
+ htpy-is-split-idempotent-is-weakly-constant-map-is-idempotent = refl-htpy
- is-split-idempotent-is-weakly-constant-is-idempotent :
+ is-split-idempotent-is-weakly-constant-map-is-idempotent :
is-split-idempotent l f
- is-split-idempotent-is-weakly-constant-is-idempotent =
- ( splitting-type-is-split-idempotent-is-weakly-constant-is-idempotent ,
- retract-is-split-idempotent-is-weakly-constant-is-idempotent ,
- htpy-is-split-idempotent-is-weakly-constant-is-idempotent)
+ is-split-idempotent-is-weakly-constant-map-is-idempotent =
+ ( splitting-type-is-split-idempotent-is-weakly-constant-map-is-idempotent ,
+ retract-is-split-idempotent-is-weakly-constant-map-is-idempotent ,
+ htpy-is-split-idempotent-is-weakly-constant-map-is-idempotent)
```
### Quasicoherently idempotent maps split
diff --git a/src/foundation/universal-property-propositional-truncation-into-sets.lagda.md b/src/foundation/universal-property-propositional-truncation-into-sets.lagda.md
index 124181f37d..27f1fb5de1 100644
--- a/src/foundation/universal-property-propositional-truncation-into-sets.lagda.md
+++ b/src/foundation/universal-property-propositional-truncation-into-sets.lagda.md
@@ -38,21 +38,21 @@ universal property of the propositional truncations with respect to sets.
### The precomposition map that is used to state the universal property
```agda
-is-weakly-constant-precomp-unit-trunc-Prop :
+is-weakly-constant-map-precomp-unit-trunc-Prop :
{l1 l2 : Level} {A : UU l1} {B : UU l2} (g : type-trunc-Prop A → B) →
- is-weakly-constant (g ∘ unit-trunc-Prop)
-is-weakly-constant-precomp-unit-trunc-Prop g x y =
+ is-weakly-constant-map (g ∘ unit-trunc-Prop)
+is-weakly-constant-map-precomp-unit-trunc-Prop g x y =
ap
( g)
( eq-is-prop (is-prop-type-trunc-Prop))
precomp-universal-property-set-quotient-trunc-Prop :
{l1 l2 : Level} {A : UU l1} (B : Set l2) →
- (type-trunc-Prop A → type-Set B) → Σ (A → type-Set B) is-weakly-constant
+ (type-trunc-Prop A → type-Set B) → Σ (A → type-Set B) is-weakly-constant-map
pr1 (precomp-universal-property-set-quotient-trunc-Prop B g) =
g ∘ unit-trunc-Prop
pr2 (precomp-universal-property-set-quotient-trunc-Prop B g) =
- is-weakly-constant-precomp-unit-trunc-Prop g
+ is-weakly-constant-map-precomp-unit-trunc-Prop g
```
## Properties
@@ -61,11 +61,11 @@ pr2 (precomp-universal-property-set-quotient-trunc-Prop B g) =
```agda
abstract
- all-elements-equal-image-is-weakly-constant :
+ all-elements-equal-image-is-weakly-constant-map :
{l1 l2 : Level} {A : UU l1} (B : Set l2) (f : A → type-Set B) →
- is-weakly-constant f →
+ is-weakly-constant-map f →
all-elements-equal (Σ (type-Set B) (λ b → type-trunc-Prop (fiber f b)))
- all-elements-equal-image-is-weakly-constant B f H (x , s) (y , t) =
+ all-elements-equal-image-is-weakly-constant-map B f H (x , s) (y , t) =
eq-type-subtype
( λ b → trunc-Prop (fiber f b))
( apply-universal-property-trunc-Prop s
@@ -76,21 +76,21 @@ abstract
( λ v → inv (pr2 u) ∙ H (pr1 u) (pr1 v) ∙ pr2 v)))
abstract
- is-prop-image-is-weakly-constant :
+ is-prop-image-is-weakly-constant-map :
{l1 l2 : Level} {A : UU l1} (B : Set l2) (f : A → type-Set B) →
- is-weakly-constant f →
+ is-weakly-constant-map f →
is-prop (Σ (type-Set B) (λ b → type-trunc-Prop (fiber f b)))
- is-prop-image-is-weakly-constant B f H =
+ is-prop-image-is-weakly-constant-map B f H =
is-prop-all-elements-equal
- ( all-elements-equal-image-is-weakly-constant B f H)
+ ( all-elements-equal-image-is-weakly-constant-map B f H)
image-weakly-constant-map-Prop :
{l1 l2 : Level} {A : UU l1} (B : Set l2) (f : A → type-Set B) →
- is-weakly-constant f → Prop (l1 ⊔ l2)
+ is-weakly-constant-map f → Prop (l1 ⊔ l2)
pr1 (image-weakly-constant-map-Prop B f H) =
Σ (type-Set B) (λ b → type-trunc-Prop (fiber f b))
pr2 (image-weakly-constant-map-Prop B f H) =
- is-prop-image-is-weakly-constant B f H
+ is-prop-image-is-weakly-constant-map B f H
```
### The universal property
@@ -98,7 +98,7 @@ pr2 (image-weakly-constant-map-Prop B f H) =
```agda
map-universal-property-set-quotient-trunc-Prop :
{l1 l2 : Level} {A : UU l1} (B : Set l2) (f : A → type-Set B) →
- is-weakly-constant f → type-trunc-Prop A → type-Set B
+ is-weakly-constant-map f → type-trunc-Prop A → type-Set B
map-universal-property-set-quotient-trunc-Prop B f H =
( pr1) ∘
( map-universal-property-trunc-Prop
@@ -107,20 +107,20 @@ map-universal-property-set-quotient-trunc-Prop B f H =
map-universal-property-set-quotient-trunc-Prop' :
{l1 l2 : Level} {A : UU l1} (B : Set l2) →
- Σ (A → type-Set B) is-weakly-constant → type-trunc-Prop A → type-Set B
+ Σ (A → type-Set B) is-weakly-constant-map → type-trunc-Prop A → type-Set B
map-universal-property-set-quotient-trunc-Prop' B (f , H) =
map-universal-property-set-quotient-trunc-Prop B f H
abstract
htpy-universal-property-set-quotient-trunc-Prop :
{l1 l2 : Level} {A : UU l1} (B : Set l2) (f : A → type-Set B) →
- (H : is-weakly-constant f) →
+ (H : is-weakly-constant-map f) →
map-universal-property-set-quotient-trunc-Prop B f H ∘ unit-trunc-Prop ~ f
htpy-universal-property-set-quotient-trunc-Prop B f H a =
ap
( pr1)
( eq-is-prop'
- ( is-prop-image-is-weakly-constant B f H)
+ ( is-prop-image-is-weakly-constant-map B f H)
( map-universal-property-trunc-Prop
( image-weakly-constant-map-Prop B f H)
( λ x → (f x , unit-trunc-Prop (x , refl)))
@@ -133,7 +133,7 @@ abstract
( map-universal-property-set-quotient-trunc-Prop' B)) ~ id
is-section-map-universal-property-set-quotient-trunc-Prop B (f , H) =
eq-type-subtype
- ( is-weakly-constant-prop-Set B)
+ ( is-weakly-constant-map-prop-Set B)
( eq-htpy (htpy-universal-property-set-quotient-trunc-Prop B f H))
is-retraction-map-universal-property-set-quotient-trunc-Prop :
@@ -151,7 +151,7 @@ abstract
( g x))
( htpy-universal-property-set-quotient-trunc-Prop B
( g ∘ unit-trunc-Prop)
- ( is-weakly-constant-precomp-unit-trunc-Prop g)))
+ ( is-weakly-constant-map-precomp-unit-trunc-Prop g)))
universal-property-set-quotient-trunc-Prop :
{l1 l2 : Level} {A : UU l1} (B : Set l2) →
diff --git a/src/foundation/weakly-constant-maps.lagda.md b/src/foundation/weakly-constant-maps.lagda.md
index 741e4c32c8..eb9db871f3 100644
--- a/src/foundation/weakly-constant-maps.lagda.md
+++ b/src/foundation/weakly-constant-maps.lagda.md
@@ -15,7 +15,9 @@ open import foundation.iterated-dependent-product-types
open import foundation.universe-levels
open import foundation-core.contractible-types
+open import foundation-core.function-types
open import foundation-core.functoriality-dependent-pair-types
+open import foundation-core.homotopies
open import foundation-core.propositions
open import foundation-core.sets
open import foundation-core.torsorial-type-families
@@ -26,25 +28,27 @@ open import foundation-core.torsorial-type-families
## Idea
A map `f : A → B` is said to be
-{{#concept "weakly constant" Disambiguation="map of types" Agda=is-weakly-constant}}
-if any two elements in `A` are mapped to
-[identical elements](foundation-core.identity-types.md) in `B`.
+{{#concept "weakly constant" Disambiguation="map of types" Agda=is-weakly-constant-map Agda=weakly-constant-map}},
+or **steady**, if any two elements in `A` are mapped to
+[identical elements](foundation-core.identity-types.md) in `B`. This concept is
+considered in {{#cite KECA17}} where it is in particular used to give a
+generalization of Hedberg's theorem.
## Definitions
### The structure on a map of being weakly constant
```agda
-is-weakly-constant :
+is-weakly-constant-map :
{l1 l2 : Level} {A : UU l1} {B : UU l2} → (A → B) → UU (l1 ⊔ l2)
-is-weakly-constant {A = A} f = (x y : A) → f x = f y
+is-weakly-constant-map {A = A} f = (x y : A) → f x = f y
```
### The type of weakly constant maps
```agda
weakly-constant-map : {l1 l2 : Level} (A : UU l1) (B : UU l2) → UU (l1 ⊔ l2)
-weakly-constant-map A B = Σ (A → B) (is-weakly-constant)
+weakly-constant-map A B = Σ (A → B) (is-weakly-constant-map)
module _
{l1 l2 : Level} {A : UU l1} {B : UU l2} (f : weakly-constant-map A B)
@@ -53,11 +57,27 @@ module _
map-weakly-constant-map : A → B
map-weakly-constant-map = pr1 f
- is-weakly-constant-weakly-constant-map :
- is-weakly-constant map-weakly-constant-map
- is-weakly-constant-weakly-constant-map = pr2 f
+ is-weakly-constant-map-weakly-constant-map :
+ is-weakly-constant-map map-weakly-constant-map
+ is-weakly-constant-map-weakly-constant-map = pr2 f
```
+### Factorizations through propositions
+
+```agda
+factorization-through-Prop :
+ {l1 l2 : Level} (l3 : Level) {A : UU l1} {B : UU l2} →
+ (A → B) → UU (l1 ⊔ l2 ⊔ lsuc l3)
+factorization-through-Prop l3 {A} {B} f =
+ Σ ( Prop l3)
+ ( λ P → Σ (type-Prop P → B) (λ i → Σ (A → type-Prop P) (λ j → i ∘ j ~ f)))
+```
+
+**Comment.** We need this type to state a factorization property of weakly
+constant maps, but placing it in its appropriate place
+(`orthogonal-factorization-systems.factorizations-of-maps`) leads to circular
+dependencies.
+
## Properties
### Being weakly constant is a property if the codomain is a set
@@ -68,13 +88,41 @@ module _
where
abstract
- is-prop-is-weakly-constant-Set : is-prop (is-weakly-constant f)
- is-prop-is-weakly-constant-Set =
+ is-prop-is-weakly-constant-map-Set : is-prop (is-weakly-constant-map f)
+ is-prop-is-weakly-constant-map-Set =
is-prop-iterated-Π 2 (λ x y → is-set-type-Set B (f x) (f y))
- is-weakly-constant-prop-Set : Prop (l1 ⊔ l2)
- pr1 is-weakly-constant-prop-Set = is-weakly-constant f
- pr2 is-weakly-constant-prop-Set = is-prop-is-weakly-constant-Set
+ is-weakly-constant-map-prop-Set : Prop (l1 ⊔ l2)
+ pr1 is-weakly-constant-map-prop-Set = is-weakly-constant-map f
+ pr2 is-weakly-constant-map-prop-Set = is-prop-is-weakly-constant-map-Set
+```
+
+### The type of fixed points of a weakly constant endomap is a proposition
+
+This is Lemma 4.1 of {{#cite KECA17}}. We follow the second proof, due to
+Christian Sattler.
+
+```agda
+module _
+ {l : Level} {A : UU l} {f : A → A} (W : is-weakly-constant-map f)
+ where
+
+ is-proof-irrelevant-fixed-point-is-weakly-constant-map :
+ is-proof-irrelevant (fixed-point f)
+ is-proof-irrelevant-fixed-point-is-weakly-constant-map (x , p) =
+ is-contr-equiv
+ ( Σ A (λ z → f x = z))
+ ( equiv-tot (λ z → equiv-concat (W x z) z))
+ ( is-torsorial-Id (f x))
+
+ is-prop-fixed-point-is-weakly-constant-map : is-prop (fixed-point f)
+ is-prop-fixed-point-is-weakly-constant-map =
+ is-prop-is-proof-irrelevant
+ ( is-proof-irrelevant-fixed-point-is-weakly-constant-map)
+
+ prop-fixed-point-is-weakly-constant-map : Prop l
+ prop-fixed-point-is-weakly-constant-map =
+ ( fixed-point f , is-prop-fixed-point-is-weakly-constant-map)
```
### The action on identifications of a weakly constant map is weakly constant
@@ -84,17 +132,17 @@ This is Auxiliary Lemma 4.3 of {{#cite KECA17}}.
```agda
module _
{l1 l2 : Level} {X : UU l1} {Y : UU l2} {f : X → Y}
- (W : is-weakly-constant f)
+ (W : is-weakly-constant-map f)
where
- compute-ap-is-weakly-constant :
+ compute-ap-is-weakly-constant-map :
{x y : X} (p : x = y) → inv (W x x) ∙ W x y = ap f p
- compute-ap-is-weakly-constant {x} refl = left-inv (W x x)
+ compute-ap-is-weakly-constant-map {x} refl = left-inv (W x x)
- is-weakly-constant-ap : {x y : X} → is-weakly-constant (ap f {x} {y})
- is-weakly-constant-ap {x} {y} p q =
- ( inv (compute-ap-is-weakly-constant p)) ∙
- ( compute-ap-is-weakly-constant q)
+ is-weakly-constant-map-ap : {x y : X} → is-weakly-constant-map (ap f {x} {y})
+ is-weakly-constant-map-ap {x} {y} p q =
+ ( inv (compute-ap-is-weakly-constant-map p)) ∙
+ ( compute-ap-is-weakly-constant-map q)
module _
{l1 l2 : Level} {X : UU l1} {Y : UU l2}
@@ -108,33 +156,64 @@ module _
( map-weakly-constant-map f x = map-weakly-constant-map f y)
ap-weakly-constant-map {x} {y} =
( ap (map-weakly-constant-map f) {x} {y} ,
- is-weakly-constant-ap (is-weakly-constant-weakly-constant-map f))
+ is-weakly-constant-map-ap (is-weakly-constant-map-weakly-constant-map f))
```
-### The type of fixed points of a weakly constant endomap is a proposition
-
-This is Lemma 4.1 of {{#cite KECA17}}. We follow the second proof, due to
-Christian Sattler.
+### Weakly constant maps are closed under composition with arbitrary maps
```agda
module _
- {l : Level} {A : UU l} {f : A → A} (W : is-weakly-constant f)
+ {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3}
where
- is-proof-irrelevant-fixed-point-is-weakly-constant :
- is-proof-irrelevant (fixed-point f)
- is-proof-irrelevant-fixed-point-is-weakly-constant (x , p) =
- is-contr-equiv
- ( Σ A (λ z → f x = z))
- ( equiv-tot (λ z → equiv-concat (W x z) z))
- ( is-torsorial-Id (f x))
+ is-weakly-constant-map-right-comp :
+ {f : A → B} (g : B → C) →
+ is-weakly-constant-map f → is-weakly-constant-map (g ∘ f)
+ is-weakly-constant-map-right-comp g W x y = ap g (W x y)
- is-prop-fixed-point-is-weakly-constant : is-prop (fixed-point f)
- is-prop-fixed-point-is-weakly-constant =
- is-prop-is-proof-irrelevant
- ( is-proof-irrelevant-fixed-point-is-weakly-constant)
+ is-weakly-constant-map-left-comp :
+ (f : A → B) {g : B → C} →
+ is-weakly-constant-map g → is-weakly-constant-map (g ∘ f)
+ is-weakly-constant-map-left-comp f W x y = W (f x) (f y)
+```
+
+### A map is weakly constant if and only if it factors through a proposition
+
+A map `f : A → B` is weakly constant if and only if there exists a proposition
+`P` and a commuting diagram
+
+```text
+ P
+ ∧ \
+ / \
+ / ∨
+ A --------> B
+ f
+```
+
+```agda
+module _
+ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B}
+ where
+
+ is-weakly-constant-map-factors-through-Prop :
+ {l3 : Level} → factorization-through-Prop l3 f → is-weakly-constant-map f
+ is-weakly-constant-map-factors-through-Prop (P , i , j , H) x y =
+ inv (H x) ∙ ap i (eq-type-Prop P) ∙ H y
```
+> The converse remains to be formalized.
+
## References
{{#bibliography}} {{#reference KECA17}}
+
+## See also
+
+- [Coherently constant maps](foundation.coherently-constant-maps.md)
+- [Null-homotopic maps](foundation.null-homotopic-maps.md)
+
+## External links
+
+- [weakly constant function](https://ncatlab.org/nlab/show/weakly+constant+function)
+ at $n$Lab
diff --git a/src/literature/idempotents-in-intensional-type-theory.lagda.md b/src/literature/idempotents-in-intensional-type-theory.lagda.md
index 448cd6e695..d16ea8d224 100644
--- a/src/literature/idempotents-in-intensional-type-theory.lagda.md
+++ b/src/literature/idempotents-in-intensional-type-theory.lagda.md
@@ -205,12 +205,12 @@ splitting.
```agda
open import foundation.weakly-constant-maps using
- ( is-weakly-constant -- "the type of witnesses that a map is weakly constant"
+ ( is-weakly-constant-map -- "the type of witnesses that a map is weakly constant"
; weakly-constant-map -- "the type of weakly constant maps"
)
open import foundation.split-idempotent-maps using
- ( is-split-idempotent-is-weakly-constant-is-idempotent
+ ( is-split-idempotent-is-weakly-constant-map-is-idempotent
)
```