Jon Sterling, started 27th Sep 2022
Much of this file is based on the proofs from Egbert Rijke's PhD thesis.
\begin{code}
{-# OPTIONS --safe --without-K #-}
open import MLTT.Spartan
open import UF.Base
open import UF.FunExt
open import UF.Equiv
open import UF.Retracts
open import UF.Embeddings
import UF.PairFun as PairFun
import Slice.Construction as Slice
open import Modal.Subuniverse
open import Modal.Homotopy
module Modal.ReflectiveSubuniverse
(P : subuniverse 𝓤 𝓥)
(P-is-reflective : subuniverse-is-reflective P)
where
is-modal : (A : 𝓤 ̇ )→ 𝓥 ̇
is-modal = subuniverse-contains P
reflection : (A : 𝓤 ̇ )→ reflection-candidate P A
reflection A = pr₁ (P-is-reflective A)
○-packed : (A : 𝓤 ̇ )→ subuniverse-member P
○-packed A = pr₁ (reflection A)
○ : 𝓤 ̇ → 𝓤 ̇
○ A = pr₁ (○-packed A)
○-is-modal : (A : 𝓤 ̇ )→ is-modal (○ A)
○-is-modal A = pr₂ (○-packed A)
η : (A : 𝓤 ̇ )→ A → ○ A
η A = pr₂ (reflection A)
precomp-η : {𝓥 : _} (A : 𝓤 ̇ )(B : 𝓥 ̇ )→ (○ A → B) → A → B
precomp-η A B f = f ∘ η A
precomp-η-is-equiv
: {A B : 𝓤 ̇ }
→ is-modal B
→ is-equiv (precomp-η A B)
precomp-η-is-equiv =
pr₂ (P-is-reflective _) _
precomp-η-equiv
: {A B : 𝓤 ̇ }
→ is-modal B
→ (○ A → B) ≃ (A → B)
pr₁ (precomp-η-equiv B-modal) =
precomp-η _ _
pr₂ (precomp-η-equiv B-modal) =
precomp-η-is-equiv B-modal
○-rec
: (A B : 𝓤 ̇ )
→ (B-modal : is-modal B)
→ (A → B)
→ (○ A → B)
○-rec A B B-modal =
inverse _ (precomp-η-is-equiv B-modal)
○-rec-compute-pointsfree
: (A B : 𝓤 ̇ )
→ (B-modal : is-modal B)
→ (f : A → B)
→ ○-rec A B B-modal f ∘ η A = f
○-rec-compute-pointsfree A B B-modal f =
inverses-are-sections _ (precomp-η-is-equiv B-modal) f
○-rec-compute
: (A B : 𝓤 ̇ )
→ (B-modal : is-modal B)
→ (f : A → B)
→ (x : A)
→ ○-rec A B B-modal f (η A x) = f x
○-rec-compute A B B-modal f =
happly (○-rec-compute-pointsfree _ _ _ _)
○-rec-ext
: (A B : 𝓤 ̇ )
→ (B-modal : is-modal B)
→ (f g : ○ A → B)
→ (f ∘ η A) = (g ∘ η A)
→ f = g
○-rec-ext A B B-modal f g fgη =
H f ⁻¹ ∙ ap (○-rec A B B-modal) fgη ∙ H g
where
H : inverse (precomp-η A B) (precomp-η-is-equiv B-modal) ∘ precomp-η A B ∼ id
H = inverses-are-retractions _ (precomp-η-is-equiv B-modal)
○-rec-ext-beta
: (A B : 𝓤 ̇ )
→ (B-modal : is-modal B)
→ (f : ○ A → B)
→ ○-rec-ext A B B-modal f f refl = refl
○-rec-ext-beta A B B-modal f =
(H f ⁻¹ ∙ H f) =⟨ (sym-is-inverse (H f)) ⁻¹ ⟩
refl ∎
where
H : inverse (precomp-η A B) (precomp-η-is-equiv B-modal) ∘ precomp-η A B ∼ id
H = inverses-are-retractions _ (precomp-η-is-equiv B-modal)
η-is-section-gives-has-section
: (fe : funext 𝓤 𝓤)
→ (A : 𝓤 ̇ )
→ is-section (η A)
→ has-section (η A)
pr₁ (η-is-section-gives-has-section fe A η-is-section) =
pr₁ η-is-section
pr₂ (η-is-section-gives-has-section fe A η-is-section) =
happly
(○-rec-ext A (○ A) (○-is-modal A) _ _
(dfunext fe λ x →
η A (pr₁ η-is-section (η A x)) =⟨ ap (η A) (pr₂ η-is-section x) ⟩
η A x ∎))
η-is-section-gives-is-equiv
: (fe : funext 𝓤 𝓤)
→ (A : 𝓤 ̇ )
→ is-section (η A)
→ is-equiv (η A)
pr₁ (η-is-section-gives-is-equiv fe A η-is-section) =
η-is-section-gives-has-section fe A η-is-section
pr₂ (η-is-section-gives-is-equiv fe A η-is-section) =
η-is-section
η-is-equiv-gives-is-modal
: (P-is-replete : subuniverse-is-replete P)
→ (A : 𝓤 ̇ )
→ is-equiv (η A)
→ is-modal A
η-is-equiv-gives-is-modal P-is-replete A η-is-equiv =
P-is-replete _ _
(η A , η-is-equiv)
(○-is-modal A)
generic-precomp-η-is-equiv-gives-η-is-section
: (A : 𝓤 ̇ )
→ is-equiv (precomp-η A A)
→ is-section (η A)
pr₁ (generic-precomp-η-is-equiv-gives-η-is-section A h) =
inverse _ h id
pr₂ (generic-precomp-η-is-equiv-gives-η-is-section A h) =
happly (inverses-are-sections _ h id)
\end{code}
The following is Lemma 5.1.18 of Egbert Rijke's thesis.
\begin{code}
module _ (fe : funext 𝓤 𝓤) (X Y : 𝓤 ̇ )(Y-modal : is-modal Y) (f g : ○ X → Y) where
homotopy-precomp-η-is-equiv : is-equiv (homotopy-precomp f g (η _))
homotopy-precomp-η-is-equiv =
homotopy-precomp-by-embedding-is-equiv fe fe fe fe f g (η _)
(equivs-are-embeddings
(precomp-η X Y)
(precomp-η-is-equiv Y-modal))
homotopy-precomp-η-equiv : (f ∼ g) ≃ (f ∘ η _ ∼ g ∘ η _)
pr₁ (homotopy-precomp-η-equiv) = homotopy-precomp f g (η _)
pr₂ (homotopy-precomp-η-equiv) = homotopy-precomp-η-is-equiv
\end{code}
Here we prove that identity types can be constructed by pullback; this will be
useful later when we establish closure of modal types under identity types
using closure of modal types under pullbacks.
\begin{code}
module _ (A : 𝓤 ̇ )(x y : A) where
private
[x] [y] : 𝟙{𝓤} → A
[x] _ = x
[y] _ = y
id-type-as-pullback : 𝓤 ̇
id-type-as-pullback = Slice.pullback 𝓤 [x] [y]
id-type-to-pullback : x = y → id-type-as-pullback
id-type-to-pullback p = ⋆ , ⋆ , p
pullback-to-id-type : id-type-as-pullback → x = y
pullback-to-id-type (_ , _ , p) = p
id-type-to-pullback-is-equiv : is-equiv id-type-to-pullback
pr₁ id-type-to-pullback-is-equiv = pullback-to-id-type , λ _ → refl
pr₂ id-type-to-pullback-is-equiv = pullback-to-id-type , λ _ → refl
id-type-to-pullback-equiv : (x = y) ≃ id-type-as-pullback
pr₁ id-type-to-pullback-equiv = id-type-to-pullback
pr₂ id-type-to-pullback-equiv = id-type-to-pullback-is-equiv
\end{code}
\begin{code}
retract-𝟙-of-○-𝟙 : retract (𝟙 {𝓤}) of ○ 𝟙
pr₁ retract-𝟙-of-○-𝟙 _ = ⋆
pr₁ (pr₂ retract-𝟙-of-○-𝟙) _ = η _ ⋆
pr₂ (pr₂ retract-𝟙-of-○-𝟙) ⋆ = refl
\end{code}
We establish the closure conditions of modal types; every such lemma requires
both function extensionality and repleteness of the subuniverse.
\begin{code}
module _ (fe : funext 𝓤 𝓤) (P-is-replete : subuniverse-is-replete P) where
retracts-of-modal-types-are-modal
: (E B : 𝓤 ̇ )
→ retract B of E
→ is-modal E
→ is-modal B
retracts-of-modal-types-are-modal E B B-retract-of-E E-modal =
η-is-equiv-gives-is-modal P-is-replete B
(η-is-section-gives-is-equiv fe B η-is-section)
where
B-to-E : B → E
B-to-E = section B-retract-of-E
E-to-B : E → B
E-to-B = retraction B-retract-of-E
h : ○ B → E
h = ○-rec B E E-modal B-to-E
ε : ○ B → B
ε = E-to-B ∘ h
η-is-section : is-section (η B)
pr₁ η-is-section = ε
pr₂ η-is-section x =
ε (η B x) =⟨ ap E-to-B (○-rec-compute B E E-modal B-to-E x) ⟩
E-to-B (B-to-E x) =⟨ retract-condition B-retract-of-E x ⟩
x ∎
𝟙-is-modal : is-modal (𝟙 {𝓤})
𝟙-is-modal =
retracts-of-modal-types-are-modal (○ 𝟙) 𝟙
retract-𝟙-of-○-𝟙
(○-is-modal 𝟙)
products-of-modal-types-are-modal
: (A : 𝓤 ̇ )
→ (B : A → 𝓤 ̇ )
→ (B-modal : Π x ꞉ A , is-modal (B x))
→ is-modal (Π B)
products-of-modal-types-are-modal A B B-modal =
retracts-of-modal-types-are-modal _ _ ret (○-is-modal (Π B))
where
h : (x : A) → ○ (Π B) → B x
h x = ○-rec (Π B) (B x) (B-modal x) (λ - → - x)
ret : retract Π B of ○ (Π B)
pr₁ ret f x = h x f
pr₁ (pr₂ ret) = η (Π B)
pr₂ (pr₂ ret) f =
dfunext fe λ x →
○-rec-compute (Π B) (B x) (B-modal x) (λ - → - x) f
pullbacks-of-modal-types-are-modal
: (A B X : 𝓤 ̇ )
→ (A-modal : is-modal A)
→ (B-modal : is-modal B)
→ (X-modal : is-modal X)
→ (f : A → X)
→ (g : B → X)
→ is-modal (Slice.pullback 𝓤 f g)
pullbacks-of-modal-types-are-modal A B X A-modal B-modal X-modal f g =
η-is-equiv-gives-is-modal P-is-replete C
(η-is-section-gives-is-equiv fe C
(generic-precomp-η-is-equiv-gives-η-is-section C
(eqtofun-
(cone-map-equiv (○ C)
● restrict-cone-equiv
● ≃-sym (cone-map-equiv C)))))
where
C : 𝓤 ̇
C = Slice.pullback 𝓤 f g
cone : 𝓤 ̇ → 𝓤 ̇
cone Z = Slice.to-span 𝓤 f g Z
cone-map-equiv : (Z : 𝓤 ̇ )→ (Z → C) ≃ cone Z
cone-map-equiv Z = Slice.→-pullback-≃ 𝓤 f g Z fe
restrict-cone-equiv : cone (○ C) ≃ cone C
restrict-cone-equiv =
PairFun.pair-fun-equiv (precomp-η-equiv A-modal) λ hA →
PairFun.pair-fun-equiv (precomp-η-equiv B-modal) λ hB →
homotopy-precomp-η-equiv fe C X X-modal (f ∘ hA) (g ∘ hB)
id-types-of-modal-types-are-modal
: (A : 𝓤 ̇ )
→ (u v : A)
→ (A-modal : is-modal A)
→ is-modal (u = v)
id-types-of-modal-types-are-modal A u v A-modal =
P-is-replete
(u = v)
(id-type-as-pullback A u v)
(id-type-to-pullback-equiv A u v)
(pullbacks-of-modal-types-are-modal 𝟙 𝟙 A 𝟙-is-modal 𝟙-is-modal A-modal _ _)
\end{code}