# Quasicoherently idempotent maps
```agda
module foundation.quasicoherently-idempotent-maps where
```
<details><summary>Imports</summary>
```agda
open import foundation.1-types
open import foundation.action-on-identifications-functions
open import foundation.commuting-squares-of-homotopies
open import foundation.dependent-pair-types
open import foundation.equality-dependent-pair-types
open import foundation.fundamental-theorem-of-identity-types
open import foundation.homotopy-algebra
open import foundation.homotopy-induction
open import foundation.idempotent-maps
open import foundation.identity-types
open import foundation.negated-equality
open import foundation.negation
open import foundation.structure-identity-principle
open import foundation.torsorial-type-families
open import foundation.transport-along-identifications
open import foundation.universe-levels
open import foundation.whiskering-higher-homotopies-composition
open import foundation.whiskering-homotopies-composition
open import foundation-core.equivalences
open import foundation-core.function-types
open import foundation-core.homotopies
open import foundation-core.propositions
open import foundation-core.retractions
open import foundation-core.sets
open import synthetic-homotopy-theory.circle
open import synthetic-homotopy-theory.loop-homotopy-circle
```
</details>
## Idea
A
{{#concept "quasicoherently idempotent map" Disambiguation="on a type" Agda=is-quasicoherently-idempotent}}
is a map `f : A → A` [equipped](foundation.structure.md) with a
[homotopy](foundation-core.homotopies.md) `I : f ∘ f ~ f` witnessing that `f` is
[idempotent](foundation.idempotent-maps.md), and a coherence
```text
f ·l I ~ I ·r f.
```
While this data is not enough to capture a fully coherent idempotent map, it is
sufficient for showing that `f` can be made to be fully coherent. This is in
contrast to [idempotent maps](foundation.idempotent-maps.md), which may in
general fail to be coherent.
**Terminology.** Our definition of a _quasicoherently idempotent map_
corresponds to the definition of a _quasiidempotent map_ in {{#cite Shu17}} and
{{#cite Shu14SplittingIdempotents}}.
## Definitions
### The structure of quasicoherent idempotence on maps
```agda
quasicoherence-is-idempotent :
{l : Level} {A : UU l} (f : A → A) → f ∘ f ~ f → UU l
quasicoherence-is-idempotent f I = f ·l I ~ I ·r f
is-quasicoherently-idempotent : {l : Level} {A : UU l} → (A → A) → UU l
is-quasicoherently-idempotent f =
Σ (f ∘ f ~ f) (quasicoherence-is-idempotent f)
module _
{l : Level} {A : UU l} {f : A → A} (H : is-quasicoherently-idempotent f)
where
is-idempotent-is-quasicoherently-idempotent : is-idempotent f
is-idempotent-is-quasicoherently-idempotent = pr1 H
coh-is-quasicoherently-idempotent :
quasicoherence-is-idempotent f
( is-idempotent-is-quasicoherently-idempotent)
coh-is-quasicoherently-idempotent = pr2 H
```
### The type of quasicoherently idempotent maps
```agda
quasicoherently-idempotent-map : {l : Level} (A : UU l) → UU l
quasicoherently-idempotent-map A = Σ (A → A) (is-quasicoherently-idempotent)
module _
{l : Level} {A : UU l} (H : quasicoherently-idempotent-map A)
where
map-quasicoherently-idempotent-map : A → A
map-quasicoherently-idempotent-map = pr1 H
is-quasicoherently-idempotent-quasicoherently-idempotent-map :
is-quasicoherently-idempotent map-quasicoherently-idempotent-map
is-quasicoherently-idempotent-quasicoherently-idempotent-map = pr2 H
is-idempotent-quasicoherently-idempotent-map :
is-idempotent map-quasicoherently-idempotent-map
is-idempotent-quasicoherently-idempotent-map =
is-idempotent-is-quasicoherently-idempotent
( is-quasicoherently-idempotent-quasicoherently-idempotent-map)
coh-quasicoherently-idempotent-map :
quasicoherence-is-idempotent
( map-quasicoherently-idempotent-map)
( is-idempotent-quasicoherently-idempotent-map)
coh-quasicoherently-idempotent-map =
coh-is-quasicoherently-idempotent
( is-quasicoherently-idempotent-quasicoherently-idempotent-map)
idempotent-map-quasicoherently-idempotent-map : idempotent-map A
idempotent-map-quasicoherently-idempotent-map =
( map-quasicoherently-idempotent-map ,
is-idempotent-quasicoherently-idempotent-map)
```
## Properties
### The identity function is quasicoherently idempotent
In fact, any idempotence witness of the identity function is quasicoherent.
```agda
module _
{l : Level} {A : UU l} (H : is-idempotent (id {A = A}))
where
quasicoherence-is-idempotent-id :
quasicoherence-is-idempotent id H
quasicoherence-is-idempotent-id = left-unit-law-left-whisker-comp H
is-quasicoherently-idempotent-is-idempotent-id :
is-quasicoherently-idempotent (id {A = A})
is-quasicoherently-idempotent-is-idempotent-id =
( H , quasicoherence-is-idempotent-id)
module _
{l : Level} {A : UU l}
where
is-quasicoherently-idempotent-id :
is-quasicoherently-idempotent (id {A = A})
is-quasicoherently-idempotent-id =
is-quasicoherently-idempotent-is-idempotent-id refl-htpy
```
### Being quasicoherently idempotent on a set is a property
```agda
module _
{l : Level} {A : UU l} (is-set-A : is-set A) (f : A → A)
where
is-prop-quasicoherence-is-idempotent-is-set :
(I : f ∘ f ~ f) → is-prop (quasicoherence-is-idempotent f I)
is-prop-quasicoherence-is-idempotent-is-set I =
is-prop-Π
( λ x →
is-set-is-prop
( is-set-A ((f ∘ f ∘ f) x) ((f ∘ f) x))
( (f ·l I) x)
( (I ·r f) x))
is-prop-is-quasicoherently-idempotent-is-set :
is-prop (is-quasicoherently-idempotent f)
is-prop-is-quasicoherently-idempotent-is-set =
is-prop-Σ
( is-prop-is-idempotent-is-set is-set-A f)
( is-prop-quasicoherence-is-idempotent-is-set)
is-quasicoherently-idempotent-is-set-Prop : Prop l
is-quasicoherently-idempotent-is-set-Prop =
( is-quasicoherently-idempotent f ,
is-prop-is-quasicoherently-idempotent-is-set)
module _
{l : Level} (A : Set l) (f : type-Set A → type-Set A)
where
is-prop-is-quasicoherently-idempotent-Set :
is-prop (is-quasicoherently-idempotent f)
is-prop-is-quasicoherently-idempotent-Set =
is-prop-is-quasicoherently-idempotent-is-set (is-set-type-Set A) f
is-quasicoherently-idempotent-prop-Set : Prop l
is-quasicoherently-idempotent-prop-Set =
( is-quasicoherently-idempotent f ,
is-prop-is-quasicoherently-idempotent-Set)
```
### Being quasicoherently idempotent is generally not a property
Not even for [1-types](foundation.1-types.md): consider the identity function on
the [circle](synthetic-homotopy-theory.circle.md)
```text
id : 𝕊¹ → 𝕊¹.
```
Two distinct witnesses that it is idempotent are given by `t ↦ refl` and
`t ↦ loop`. Both of these are quasicoherent, because
```text
quasicoherence-is-idempotent id I ≐ (id ·l I ~ I ·r id) ≃ (I ~ I).
```
```agda
is-not-prop-is-quasicoherently-idempotent-id-𝕊¹ :
¬ (is-prop (is-quasicoherently-idempotent (id {A = 𝕊¹})))
is-not-prop-is-quasicoherently-idempotent-id-𝕊¹ H =
nonequal-Π
( loop-htpy-𝕊¹)
( refl-htpy)
( base-𝕊¹)
( is-not-refl-ev-base-loop-htpy-𝕊¹)
( ap pr1
( eq-is-prop H
{ is-quasicoherently-idempotent-is-idempotent-id loop-htpy-𝕊¹}
{ is-quasicoherently-idempotent-is-idempotent-id refl-htpy}))
```
### Idempotent maps on sets are quasicoherently idempotent
```agda
module _
{l : Level} {A : UU l} (is-set-A : is-set A) {f : A → A}
where
is-quasicoherently-idempotent-is-idempotent-is-set :
is-idempotent f → is-quasicoherently-idempotent f
pr1 (is-quasicoherently-idempotent-is-idempotent-is-set I) = I
pr2 (is-quasicoherently-idempotent-is-idempotent-is-set I) x =
eq-is-prop (is-set-A ((f ∘ f ∘ f) x) ((f ∘ f) x))
```
### If `i` and `r` form an inclusion-retraction pair, then `i ∘ r` is quasicoherently idempotent
This statement can be found as part of the proof of Lemma 3.6 in
{{#cite Shu17}}.
```agda
module _
{l1 l2 : Level} {A : UU l1} {B : UU l2}
(i : B → A) (r : A → B) (H : is-retraction i r)
where
quasicoherence-is-idempotent-inclusion-retraction :
quasicoherence-is-idempotent
( i ∘ r)
( is-idempotent-inclusion-retraction i r H)
quasicoherence-is-idempotent-inclusion-retraction =
( inv-preserves-comp-left-whisker-comp i r (i ·l H ·r r)) ∙h
( double-whisker-comp²
( i)
( preserves-comp-left-whisker-comp r i H ∙h inv-coh-htpy-id H)
( r))
is-quasicoherently-idempotent-inclusion-retraction :
is-quasicoherently-idempotent (i ∘ r)
is-quasicoherently-idempotent-inclusion-retraction =
( is-idempotent-inclusion-retraction i r H ,
quasicoherence-is-idempotent-inclusion-retraction)
```
### Quasicoherent idempotence is preserved by homotopies
This fact does not explicitly appear in {{#cite Shu17}} although it is
implicitly used in Lemma 3.6.
```agda
module _
{l : Level} {A : UU l} {f g : A → A} (F : is-quasicoherently-idempotent f)
where
abstract
quasicoherence-is-idempotent-htpy :
(H : g ~ f) →
quasicoherence-is-idempotent g
( is-idempotent-htpy
( is-idempotent-is-quasicoherently-idempotent F)
( H))
quasicoherence-is-idempotent-htpy H =
homotopy-reasoning
( g ·l is-idempotent-htpy I H)
~ ( H ·r (g ∘ g)) ∙h
( f ·l (g ·l H ∙h H ·r f ∙h I ∙h inv-htpy H)) ∙h
( inv-htpy (H ·r g))
by
( right-transpose-htpy-concat
( g ·l is-idempotent-htpy I H)
( H ·r g)
( H ·r (g ∘ g) ∙h (f ·l (g ·l H ∙h H ·r f ∙h I ∙h inv-htpy H)))
( inv-htpy (nat-htpy H ∘ (g ·l H ∙h H ·r f ∙h I ∙h inv-htpy H))))
~ g ·l H ·r g ∙h H ·r (f ∘ g) ∙h I ·r g ∙h inv-htpy (H ·r g)
by
( ap-concat-htpy'
( inv-htpy (H ·r g))
( ( ap-concat-htpy
( H ·r ((g ∘ g)))
( ( distributive-left-whisker-comp-concat f
( g ·l H ∙h H ·r f ∙h I)
( inv-htpy H)) ∙h
( ap-concat-htpy'
( f ·l inv-htpy H)
( ( distributive-left-whisker-comp-concat f
( g ·l H ∙h H ·r f)
( I)) ∙h
( ap-binary-concat-htpy
( distributive-left-whisker-comp-concat f (g ·l H) (H ·r f))
( coh-is-quasicoherently-idempotent F)))) ∙h
( assoc-htpy
( f ·l g ·l H ∙h f ·l H ·r f)
( I ·r f)
( f ·l inv-htpy H)) ∙h
( ap-concat-htpy
( f ·l g ·l H ∙h f ·l H ·r f)
( nat-htpy I ∘ inv-htpy H)) ∙h
( inv-htpy
( assoc-htpy
( f ·l g ·l H ∙h f ·l H ·r f)
( (f ∘ f) ·l inv-htpy H)
( I ·r g))))) ∙h
( inv-htpy
( assoc-htpy
( H ·r (g ∘ g))
( f ·l g ·l H ∙h f ·l H ·r f ∙h (f ∘ f) ·l inv-htpy H)
( I ·r g))) ∙h
( ap-concat-htpy'
( I ·r g)
( ( ap-concat-htpy
( H ·r (g ∘ g))
( ap-concat-htpy'
( (f ∘ f) ·l inv-htpy H)
( ( ap-concat-htpy'
( f ·l H ·r f)
( preserves-comp-left-whisker-comp f g H)) ∙h
( inv-htpy (nat-htpy (f ·l H) ∘ H))) ∙h
( ap-concat-htpy
( f ·l H ·r g ∙h (f ∘ f) ·l H)
( left-whisker-inv-htpy (f ∘ f) H)) ∙h
( is-retraction-inv-concat-htpy'
( (f ∘ f) ·l H)
( f ·l H ·r g)))) ∙h
( nat-htpy H ∘ (H ·r g))))))
where
I : is-idempotent f
I = is-idempotent-is-quasicoherently-idempotent F
is-quasicoherently-idempotent-htpy :
g ~ f → is-quasicoherently-idempotent g
pr1 (is-quasicoherently-idempotent-htpy H) =
is-idempotent-htpy
( is-idempotent-is-quasicoherently-idempotent F)
( H)
pr2 (is-quasicoherently-idempotent-htpy H) =
quasicoherence-is-idempotent-htpy H
is-quasicoherently-idempotent-inv-htpy :
f ~ g → is-quasicoherently-idempotent g
pr1 (is-quasicoherently-idempotent-inv-htpy H) =
is-idempotent-htpy
( is-idempotent-is-quasicoherently-idempotent F)
( inv-htpy H)
pr2 (is-quasicoherently-idempotent-inv-htpy H) =
quasicoherence-is-idempotent-htpy (inv-htpy H)
```
### Realigning the coherence of a quasicoherent idempotence proof
Given a quasicoherently idempotent map `f`, any other idempotence homotopy
`I : f ∘ f ~ f` that is homotopic to the coherent one is also coherent.
```agda
module _
{l : Level} {A : UU l} {f : A → A}
(F : is-quasicoherently-idempotent f)
(I : f ∘ f ~ f)
where
quasicoherence-is-idempotent-is-idempotent-htpy :
is-idempotent-is-quasicoherently-idempotent F ~ I →
quasicoherence-is-idempotent f I
quasicoherence-is-idempotent-is-idempotent-htpy α =
( left-whisker-comp² f (inv-htpy α)) ∙h
( coh-is-quasicoherently-idempotent F) ∙h
( right-whisker-comp² α f)
quasicoherence-is-idempotent-is-idempotent-inv-htpy :
I ~ is-idempotent-is-quasicoherently-idempotent F →
quasicoherence-is-idempotent f I
quasicoherence-is-idempotent-is-idempotent-inv-htpy α =
( left-whisker-comp² f α) ∙h
( coh-is-quasicoherently-idempotent F) ∙h
( right-whisker-comp² (inv-htpy α) f)
is-quasicoherently-idempotent-is-idempotent-htpy :
is-idempotent-is-quasicoherently-idempotent F ~ I →
is-quasicoherently-idempotent f
is-quasicoherently-idempotent-is-idempotent-htpy α =
( I , quasicoherence-is-idempotent-is-idempotent-htpy α)
is-quasicoherently-idempotent-is-idempotent-inv-htpy :
I ~ is-idempotent-is-quasicoherently-idempotent F →
is-quasicoherently-idempotent f
is-quasicoherently-idempotent-is-idempotent-inv-htpy α =
( I , quasicoherence-is-idempotent-is-idempotent-inv-htpy α)
```
### Not every idempotent map is quasicoherently idempotent
To be clear, what we are asking for is an idempotent map `f`, such that _no_
idempotence homotopy `f ∘ f ~ f` is quasicoherent. A counterexample can be
constructed using the [cantor space](set-theory.cantor-space.md), see Section 4
of {{#cite Shu17}} for more details.
### Characterization of identity of quasicoherently idempotent maps
A homotopy of quasicoherent idempotence witnesses `(I, Q) ~ (J, R)` consists of
a homotopy of the underlying idempotence witnesses `H : I ~ J` and a
[coherence](foundation-core.commuting-squares-of-homotopies.md)
```text
fH
f ·l I -------- f ·l J
| |
Q | | R
| |
I ·r f -------– J ·r f.
Hf
```
```agda
module _
{l : Level} {A : UU l} {f : A → A}
where
coherence-htpy-is-quasicoherently-idempotent :
(p q : is-quasicoherently-idempotent f) →
( is-idempotent-is-quasicoherently-idempotent p ~
is-idempotent-is-quasicoherently-idempotent q) →
UU l
coherence-htpy-is-quasicoherently-idempotent (I , Q) (J , R) H =
coherence-square-homotopies
( left-whisker-comp² f H)
( Q)
( R)
( right-whisker-comp² H f)
htpy-is-quasicoherently-idempotent :
(p q : is-quasicoherently-idempotent f) → UU l
htpy-is-quasicoherently-idempotent p q =
Σ ( is-idempotent-is-quasicoherently-idempotent p ~
is-idempotent-is-quasicoherently-idempotent q)
( coherence-htpy-is-quasicoherently-idempotent p q)
refl-htpy-is-quasicoherently-idempotent :
(p : is-quasicoherently-idempotent f) →
htpy-is-quasicoherently-idempotent p p
refl-htpy-is-quasicoherently-idempotent p = (refl-htpy , right-unit-htpy)
htpy-eq-is-quasicoherently-idempotent :
(p q : is-quasicoherently-idempotent f) →
p = q → htpy-is-quasicoherently-idempotent p q
htpy-eq-is-quasicoherently-idempotent p .p refl =
refl-htpy-is-quasicoherently-idempotent p
is-torsorial-htpy-is-quasicoherently-idempotent :
(p : is-quasicoherently-idempotent f) →
is-torsorial (htpy-is-quasicoherently-idempotent p)
is-torsorial-htpy-is-quasicoherently-idempotent p =
is-torsorial-Eq-structure
( is-torsorial-htpy (is-idempotent-is-quasicoherently-idempotent p))
( is-idempotent-is-quasicoherently-idempotent p , refl-htpy)
( is-torsorial-htpy (coh-is-quasicoherently-idempotent p ∙h refl-htpy))
is-equiv-htpy-eq-is-quasicoherently-idempotent :
(p q : is-quasicoherently-idempotent f) →
is-equiv (htpy-eq-is-quasicoherently-idempotent p q)
is-equiv-htpy-eq-is-quasicoherently-idempotent p =
fundamental-theorem-id
( is-torsorial-htpy-is-quasicoherently-idempotent p)
( htpy-eq-is-quasicoherently-idempotent p)
extensionality-is-quasicoherently-idempotent :
(p q : is-quasicoherently-idempotent f) →
(p = q) ≃ (htpy-is-quasicoherently-idempotent p q)
extensionality-is-quasicoherently-idempotent p q =
( htpy-eq-is-quasicoherently-idempotent p q ,
is-equiv-htpy-eq-is-quasicoherently-idempotent p q)
eq-htpy-is-quasicoherently-idempotent :
(p q : is-quasicoherently-idempotent f) →
htpy-is-quasicoherently-idempotent p q → p = q
eq-htpy-is-quasicoherently-idempotent p q =
map-inv-is-equiv (is-equiv-htpy-eq-is-quasicoherently-idempotent p q)
```
## See also
- In [`foundation.split-idempotent-maps`](foundation.split-idempotent-maps.md)
we show that every quasicoherently idempotent map splits. Moreover, it is true
that split idempotent maps are a retract of quasicoherent idempotent maps.
## References
{{#bibliography}} {{#reference Shu17}} {{#reference Shu14SplittingIdempotents}}