This is ported from the Midlands Graduate School 2019 lecture notes
https://www.cs.bham.ac.uk/~mhe/HoTT-UF.in-Agda-Lecture-Notes/HoTT-UF-Agda.html
https://github.com/martinescardo/HoTT-UF.Agda-Lecture-Notes
\begin{code}
{-# OPTIONS --safe --without-K #-}
module MGS.More-Exercise-Solutions where
open import MGS.Classifiers public
open import MGS.Subsingleton-Truncation public
module ℕ-order-exercise-solution where
_≤'_ : ℕ → ℕ → 𝓤₀ ̇
_≤'_ = ℕ-iteration (ℕ → 𝓤₀ ̇ ) (λ y → 𝟙)
(λ f → ℕ-recursion (𝓤₀ ̇ ) 𝟘 (λ y P → f y))
open ℕ-order
≤-and-≤'-coincide : (x y : ℕ) → (x ≤ y) = (x ≤' y)
≤-and-≤'-coincide 0 y = refl _
≤-and-≤'-coincide (succ x) 0 = refl _
≤-and-≤'-coincide (succ x) (succ y) = ≤-and-≤'-coincide x y
module ℕ-more where
open Arithmetic renaming (_+_ to _∔_)
open basic-arithmetic-and-order
≤-prop-valued : (x y : ℕ) → is-subsingleton (x ≤ y)
≤-prop-valued 0 y = 𝟙-is-subsingleton
≤-prop-valued (succ x) zero = 𝟘-is-subsingleton
≤-prop-valued (succ x) (succ y) = ≤-prop-valued x y
≼-prop-valued : (x y : ℕ) → is-subsingleton (x ≼ y)
≼-prop-valued x y (z , p) (z' , p') = γ
where
q : z = z'
q = +-lc x z z' (x ∔ z =⟨ p ⟩
y =⟨ p' ⁻¹ ⟩
x ∔ z' ∎)
γ : z , p = z' , p'
γ = to-subtype-= (λ z → ℕ-is-set (x ∔ z) y) q
≤-charac : propext 𝓤₀ → (x y : ℕ) → (x ≤ y) = (x ≼ y)
≤-charac pe x y = pe (≤-prop-valued x y) (≼-prop-valued x y)
(≤-gives-≼ x y) (≼-gives-≤ x y)
the-subsingletons-are-the-subtypes-of-a-singleton : (X : 𝓤 ̇ )
→ is-subsingleton X ↔ (X ↪ 𝟙)
the-subsingletons-are-the-subtypes-of-a-singleton X = φ , ψ
where
i : is-subsingleton X → is-embedding (!𝟙' X)
i s ⋆ (x , refl ⋆) (y , refl ⋆) = ap (λ - → - , refl ⋆) (s x y)
φ : is-subsingleton X → X ↪ 𝟙
φ s = !𝟙 , i s
ψ : X ↪ 𝟙 → is-subsingleton X
ψ (f , e) x y = d
where
a : x = y → f x = f y
a = ap f {x} {y}
b : is-equiv a
b = embedding-gives-ap-is-equiv f e x y
c : f x = f y
c = 𝟙-is-subsingleton (f x) (f y)
d : x = y
d = inverse a b c
the-subsingletons-are-the-subtypes-of-a-singleton' : propext 𝓤 → global-dfunext
→ (X : 𝓤 ̇ )
→ is-subsingleton X = (X ↪ 𝟙)
the-subsingletons-are-the-subtypes-of-a-singleton' pe fe X = γ
where
a : is-subsingleton X ↔ (X ↪ 𝟙)
a = the-subsingletons-are-the-subtypes-of-a-singleton X
b : is-subsingleton (X ↪ 𝟙)
b (f , e) (f' , e') = to-subtype-=
(being-embedding-is-subsingleton fe)
(fe (λ x → 𝟙-is-subsingleton (f x) (f' x)))
γ : is-subsingleton X = (X ↪ 𝟙)
γ = pe (being-subsingleton-is-subsingleton fe) b (pr₁ a) (pr₂ a)
G↑-≃-equation : (ua : is-univalent (𝓤 ⊔ 𝓥))
→ (X : 𝓤 ̇ )
→ (A : (Σ Y ꞉ 𝓤 ⊔ 𝓥 ̇ , X ≃ Y) → 𝓦 ̇ )
→ (a : A (Lift 𝓥 X , ≃-Lift X))
→ G↑-≃ ua X A a (Lift 𝓥 X) (≃-Lift X) = a
G↑-≃-equation {𝓤} {𝓥} {𝓦} ua X A a =
G↑-≃ ua X A a (Lift 𝓥 X) (≃-Lift X) =⟨ refl (transport A p a) ⟩
transport A p a =⟨ ap (λ - → transport A - a) q ⟩
transport A (refl t) a =⟨ refl a ⟩
a ∎
where
t : (Σ Y ꞉ 𝓤 ⊔ 𝓥 ̇ , X ≃ Y)
t = (Lift 𝓥 X , ≃-Lift X)
p : t = t
p = univalence→'' {𝓤} {𝓤 ⊔ 𝓥} ua X t t
q : p = refl t
q = subsingletons-are-sets (Σ Y ꞉ 𝓤 ⊔ 𝓥 ̇ , X ≃ Y)
(univalence→'' {𝓤} {𝓤 ⊔ 𝓥} ua X) t t p (refl t)
H↑-≃-equation : (ua : is-univalent (𝓤 ⊔ 𝓥))
→ (X : 𝓤 ̇ )
→ (A : (Y : 𝓤 ⊔ 𝓥 ̇ ) → X ≃ Y → 𝓦 ̇ )
→ (a : A (Lift 𝓥 X) (≃-Lift X))
→ H↑-≃ ua X A a (Lift 𝓥 X) (≃-Lift X) = a
H↑-≃-equation ua X A = G↑-≃-equation ua X (Σ-induction A)
has-section-charac : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X → Y)
→ ((y : Y) → Σ x ꞉ X , f x = y) ≃ has-section f
has-section-charac f = ΠΣ-distr-≃
retractions-into : 𝓤 ̇ → 𝓤 ⁺ ̇
retractions-into {𝓤} Y = Σ X ꞉ 𝓤 ̇ , Y ◁ X
pointed-types : (𝓤 : Universe) → 𝓤 ⁺ ̇
pointed-types 𝓤 = Σ X ꞉ 𝓤 ̇ , X
retraction-classifier : Univalence
→ (Y : 𝓤 ̇ ) → retractions-into Y ≃ (Y → pointed-types 𝓤)
retraction-classifier {𝓤} ua Y =
retractions-into Y ≃⟨ i ⟩
(Σ X ꞉ 𝓤 ̇ , Σ f ꞉ (X → Y) , ((y : Y) → Σ x ꞉ X , f x = y)) ≃⟨ id-≃ _ ⟩
((𝓤 /[ id ] Y)) ≃⟨ ii ⟩
(Y → pointed-types 𝓤) ■
where
i = ≃-sym (Σ-cong (λ X → Σ-cong (λ f → ΠΣ-distr-≃)))
ii = special-map-classifier (ua 𝓤)
(univalence-gives-dfunext' (ua 𝓤) (ua (𝓤 ⁺)))
id Y
module surjection-classifier
(pt : subsingleton-truncations-exist)
(ua : Univalence)
where
hfe : global-hfunext
hfe = univalence-gives-global-hfunext ua
open basic-truncation-development pt hfe public
_↠_ : 𝓤 ̇ → 𝓥 ̇ → 𝓤 ⊔ 𝓥 ̇
X ↠ Y = Σ f ꞉ (X → Y), is-surjection f
surjections-into : 𝓤 ̇ → 𝓤 ⁺ ̇
surjections-into {𝓤} Y = Σ X ꞉ 𝓤 ̇ , X ↠ Y
inhabited-types : (𝓤 : Universe) → 𝓤 ⁺ ̇
inhabited-types 𝓤 = Σ X ꞉ 𝓤 ̇ , ∥ X ∥
surjection-classifier : Univalence
→ (Y : 𝓤 ̇ )
→ surjections-into Y ≃ (Y → inhabited-types 𝓤)
surjection-classifier {𝓤} ua = special-map-classifier (ua 𝓤)
(univalence-gives-dfunext' (ua 𝓤) (ua (𝓤 ⁺)))
∥_∥
positive-cantors-diagonal : (e : ℕ → (ℕ → ℕ)) → Σ α ꞉ (ℕ → ℕ), ((n : ℕ) → α ≠ e n)
cantors-diagonal : ¬ (Σ e ꞉ (ℕ → (ℕ → ℕ)) , ((α : ℕ → ℕ) → Σ n ꞉ ℕ , α = e n))
𝟚-has-𝟚-automorphisms : dfunext 𝓤₀ 𝓤₀ → (𝟚 ≃ 𝟚) ≃ 𝟚
lifttwo : is-univalent 𝓤₀ → is-univalent 𝓤₁ → (𝟚 = 𝟚) = Lift 𝓤₁ 𝟚
DNE : ∀ 𝓤 → 𝓤 ⁺ ̇
DNE 𝓤 = (P : 𝓤 ̇ ) → is-subsingleton P → ¬¬ P → P
ne : (X : 𝓤 ̇ ) → ¬¬ (X + ¬ X)
DNE-gives-EM : dfunext 𝓤 𝓤₀ → DNE 𝓤 → EM 𝓤
EM-gives-DNE : EM 𝓤 → DNE 𝓤
SN : ∀ 𝓤 → 𝓤 ⁺ ̇
SN 𝓤 = (P : 𝓤 ̇ ) → is-subsingleton P → Σ X ꞉ 𝓤 ̇ , P ↔ ¬ X
SN-gives-DNE : SN 𝓤 → DNE 𝓤
DNE-gives-SN : DNE 𝓤 → SN 𝓤
succ-no-fixed-point : (n : ℕ) → succ n ≠ n
succ-no-fixed-point 0 = positive-not-zero 0
succ-no-fixed-point (succ n) = γ
where
IH : succ n ≠ n
IH = succ-no-fixed-point n
γ : succ (succ n) ≠ succ n
γ p = IH (succ-lc p)
positive-cantors-diagonal = sol
where
sol : (e : ℕ → (ℕ → ℕ)) → Σ α ꞉ (ℕ → ℕ), ((n : ℕ) → α ≠ e n)
sol e = (α , φ)
where
α : ℕ → ℕ
α n = succ (e n n)
φ : (n : ℕ) → α ≠ e n
φ n p = succ-no-fixed-point (e n n) q
where
q = succ (e n n) =⟨ refl (α n) ⟩
α n =⟨ ap (λ - → - n) p ⟩
e n n ∎
cantors-diagonal = sol
where
sol : ¬ (Σ e ꞉ (ℕ → (ℕ → ℕ)) , ((α : ℕ → ℕ) → Σ n ꞉ ℕ , α = e n))
sol (e , γ) = c
where
α : ℕ → ℕ
α = pr₁ (positive-cantors-diagonal e)
φ : (n : ℕ) → α ≠ e n
φ = pr₂ (positive-cantors-diagonal e)
b : Σ n ꞉ ℕ , α = e n
b = γ α
c : 𝟘
c = φ (pr₁ b) (pr₂ b)
𝟚-has-𝟚-automorphisms = sol
where
sol : dfunext 𝓤₀ 𝓤₀ → (𝟚 ≃ 𝟚) ≃ 𝟚
sol fe = invertibility-gives-≃ f (g , η , ε)
where
f : (𝟚 ≃ 𝟚) → 𝟚
f (h , e) = h ₀
g : 𝟚 → (𝟚 ≃ 𝟚)
g ₀ = id , id-is-equiv 𝟚
g ₁ = swap₂ , swap₂-is-equiv
η : (e : 𝟚 ≃ 𝟚) → g (f e) = e
η (h , e) = γ (h ₀) (h ₁) (refl (h ₀)) (refl (h ₁))
where
γ : (m n : 𝟚) → h ₀ = m → h ₁ = n → g (h ₀) = (h , e)
γ ₀ ₀ p q = !𝟘 (g (h ₀) = (h , e))
(₁-is-not-₀ (equivs-are-lc h e (h ₁ =⟨ q ⟩
₀ =⟨ p ⁻¹ ⟩
h ₀ ∎)))
γ ₀ ₁ p q = to-subtype-=
(being-equiv-is-subsingleton fe fe)
(fe (𝟚-induction (λ n → pr₁ (g (h ₀)) n = h n)
(pr₁ (g (h ₀)) ₀ =⟨ ap (λ - → pr₁ (g -) ₀) p ⟩
pr₁ (g ₀) ₀ =⟨ refl ₀ ⟩
₀ =⟨ p ⁻¹ ⟩
h ₀ ∎)
(pr₁ (g (h ₀)) ₁ =⟨ ap (λ - → pr₁ (g -) ₁) p ⟩
pr₁ (g ₀) ₁ =⟨ refl ₁ ⟩
₁ =⟨ q ⁻¹ ⟩
h ₁ ∎)))
γ ₁ ₀ p q = to-subtype-=
(being-equiv-is-subsingleton fe fe)
(fe (𝟚-induction (λ n → pr₁ (g (h ₀)) n = h n)
(pr₁ (g (h ₀)) ₀ =⟨ ap (λ - → pr₁ (g -) ₀) p ⟩
pr₁ (g ₁) ₀ =⟨ refl ₁ ⟩
₁ =⟨ p ⁻¹ ⟩
h ₀ ∎)
(pr₁ (g (h ₀)) ₁ =⟨ ap (λ - → pr₁ (g -) ₁) p ⟩
pr₁ (g ₁) ₁ =⟨ refl ₀ ⟩
₀ =⟨ q ⁻¹ ⟩
h ₁ ∎)))
γ ₁ ₁ p q = !𝟘 (g (h ₀) = (h , e))
(₁-is-not-₀ (equivs-are-lc h e (h ₁ =⟨ q ⟩
₁ =⟨ p ⁻¹ ⟩
h ₀ ∎)))
ε : (n : 𝟚) → f (g n) = n
ε ₀ = refl ₀
ε ₁ = refl ₁
lifttwo = sol
where
sol : is-univalent 𝓤₀ → is-univalent 𝓤₁ → (𝟚 = 𝟚) = Lift 𝓤₁ 𝟚
sol ua₀ ua₁ = Eq→Id ua₁ (𝟚 = 𝟚) (Lift 𝓤₁ 𝟚) e
where
e = (𝟚 = 𝟚) ≃⟨ Id→Eq 𝟚 𝟚 , ua₀ 𝟚 𝟚 ⟩
(𝟚 ≃ 𝟚) ≃⟨ 𝟚-has-𝟚-automorphisms (univalence-gives-dfunext ua₀) ⟩
𝟚 ≃⟨ ≃-sym (Lift-≃ 𝟚) ⟩
Lift 𝓤₁ 𝟚 ■
hde-is-subsingleton : dfunext 𝓤 𝓤₀
→ dfunext 𝓤 𝓤
→ (X : 𝓤 ̇ )
→ is-subsingleton (has-decidable-equality X)
hde-is-subsingleton fe₀ fe X h h' = c h h'
where
a : (x y : X) → is-subsingleton (decidable (x = y))
a x y = +-is-subsingleton' fe₀ b
where
b : is-subsingleton (x = y)
b = hedberg h x y
c : is-subsingleton (has-decidable-equality X)
c = Π-is-subsingleton fe (λ x → Π-is-subsingleton fe (a x))
ne = sol
where
sol : (X : 𝓤 ̇ ) → ¬¬ (X + ¬ X)
sol X = λ (f : ¬ (X + ¬ X)) → f (inr (λ (x : X) → f (inl x)))
DNE-gives-EM = sol
where
sol : dfunext 𝓤 𝓤₀ → DNE 𝓤 → EM 𝓤
sol fe dne P i = dne (P + ¬ P) (+-is-subsingleton' fe i) (ne P)
EM-gives-DNE = sol
where
sol : EM 𝓤 → DNE 𝓤
sol em P i = γ (em P i)
where
γ : P + ¬ P → ¬¬ P → P
γ (inl p) φ = p
γ (inr n) φ = !𝟘 P (φ n)
SN-gives-DNE = sol
where
sol : SN 𝓤 → DNE 𝓤
sol {𝓤} sn P i = h
where
X : 𝓤 ̇
X = pr₁ (sn P i)
f : P → ¬ X
f = pr₁ (pr₂ (sn P i))
g : ¬ X → P
g = pr₂ (pr₂ (sn P i))
f' : ¬¬ P → ¬ (¬¬ X)
f' = contrapositive (contrapositive f)
h : ¬¬ P → P
h = g ∘ tno X ∘ f'
h' : ¬¬ P → P
h' φ = g (λ (x : X) → φ (λ (p : P) → f p x))
DNE-gives-SN = sol
where
sol : DNE 𝓤 → SN 𝓤
sol dne P i = ¬ P , dni P , dne P i
\end{code}