MGS.Basic-UF
Martin Escardo 1st May 2020.
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
{-# OPTIONS --safe --without-K #-}
module MGS.Basic-UF where
open import MGS.MLTT public
is-center : (X : 𝓤 ̇ ) → X → 𝓤 ̇
is-center X c = (x : X) → c = x
is-singleton : 𝓤 ̇ → 𝓤 ̇
is-singleton X = Σ c ꞉ X , is-center X c
𝟙-is-singleton : is-singleton 𝟙
𝟙-is-singleton = ⋆ , 𝟙-induction (λ x → ⋆ = x) (refl ⋆)
center : (X : 𝓤 ̇ ) → is-singleton X → X
center X (c , φ) = c
centrality : (X : 𝓤 ̇ ) (i : is-singleton X) (x : X) → center X i = x
centrality X (c , φ) = φ
is-subsingleton : 𝓤 ̇ → 𝓤 ̇
is-subsingleton X = (x y : X) → x = y
𝟘-is-subsingleton : is-subsingleton 𝟘
𝟘-is-subsingleton x y = !𝟘 (x = y) x
singletons-are-subsingletons : (X : 𝓤 ̇ ) → is-singleton X → is-subsingleton X
singletons-are-subsingletons X (c , φ) x y = x =⟨ (φ x)⁻¹ ⟩
c =⟨ φ y ⟩
y ∎
𝟙-is-subsingleton : is-subsingleton 𝟙
𝟙-is-subsingleton = singletons-are-subsingletons 𝟙 𝟙-is-singleton
pointed-subsingletons-are-singletons : (X : 𝓤 ̇ )
→ X → is-subsingleton X → is-singleton X
pointed-subsingletons-are-singletons X x s = (x , s x)
singleton-iff-pointed-and-subsingleton : {X : 𝓤 ̇ }
→ is-singleton X ↔ (X × is-subsingleton X)
singleton-iff-pointed-and-subsingleton {𝓤} {X} = (a , b)
where
a : is-singleton X → X × is-subsingleton X
a s = center X s , singletons-are-subsingletons X s
b : X × is-subsingleton X → is-singleton X
b (x , t) = pointed-subsingletons-are-singletons X x t
is-prop is-truth-value : 𝓤 ̇ → 𝓤 ̇
is-prop = is-subsingleton
is-truth-value = is-subsingleton
is-set : 𝓤 ̇ → 𝓤 ̇
is-set X = (x y : X) → is-subsingleton (x = y)
EM EM' : ∀ 𝓤 → 𝓤 ⁺ ̇
EM 𝓤 = (X : 𝓤 ̇ ) → is-subsingleton X → X + ¬ X
EM' 𝓤 = (X : 𝓤 ̇ ) → is-subsingleton X → is-singleton X + is-empty X
EM-gives-EM' : EM 𝓤 → EM' 𝓤
EM-gives-EM' em X s = γ (em X s)
where
γ : X + ¬ X → is-singleton X + is-empty X
γ (inl x) = inl (pointed-subsingletons-are-singletons X x s)
γ (inr x) = inr x
EM'-gives-EM : EM' 𝓤 → EM 𝓤
EM'-gives-EM em' X s = γ (em' X s)
where
γ : is-singleton X + is-empty X → X + ¬ X
γ (inl i) = inl (center X i)
γ (inr x) = inr x
no-unicorns : ¬ (Σ X ꞉ 𝓤 ̇ , is-subsingleton X × ¬ (is-singleton X) × ¬ (is-empty X))
no-unicorns (X , i , f , g) = c
where
e : is-empty X
e x = f (pointed-subsingletons-are-singletons X x i)
c : 𝟘
c = g e
module magmas where
Magma : (𝓤 : Universe) → 𝓤 ⁺ ̇
Magma 𝓤 = Σ X ꞉ 𝓤 ̇ , is-set X × (X → X → X)
⟨_⟩ : Magma 𝓤 → 𝓤 ̇
⟨ X , i , _·_ ⟩ = X
magma-is-set : (M : Magma 𝓤) → is-set ⟨ M ⟩
magma-is-set (X , i , _·_) = i
magma-operation : (M : Magma 𝓤) → ⟨ M ⟩ → ⟨ M ⟩ → ⟨ M ⟩
magma-operation (X , i , _·_) = _·_
syntax magma-operation M x y = x ·⟨ M ⟩ y
is-magma-hom : (M N : Magma 𝓤) → (⟨ M ⟩ → ⟨ N ⟩) → 𝓤 ̇
is-magma-hom M N f = (x y : ⟨ M ⟩) → f (x ·⟨ M ⟩ y) = f x ·⟨ N ⟩ f y
id-is-magma-hom : (M : Magma 𝓤) → is-magma-hom M M (𝑖𝑑 ⟨ M ⟩)
id-is-magma-hom M = λ (x y : ⟨ M ⟩) → refl (x ·⟨ M ⟩ y)
is-magma-iso : (M N : Magma 𝓤) → (⟨ M ⟩ → ⟨ N ⟩) → 𝓤 ̇
is-magma-iso M N f = is-magma-hom M N f
× (Σ g ꞉ (⟨ N ⟩ → ⟨ M ⟩), is-magma-hom N M g
× (g ∘ f ∼ 𝑖𝑑 ⟨ M ⟩)
× (f ∘ g ∼ 𝑖𝑑 ⟨ N ⟩))
id-is-magma-iso : (M : Magma 𝓤) → is-magma-iso M M (𝑖𝑑 ⟨ M ⟩)
id-is-magma-iso M = id-is-magma-hom M ,
𝑖𝑑 ⟨ M ⟩ ,
id-is-magma-hom M ,
refl ,
refl
Id→iso : {M N : Magma 𝓤} → M = N → ⟨ M ⟩ → ⟨ N ⟩
Id→iso p = transport ⟨_⟩ p
Id→iso-is-iso : {M N : Magma 𝓤} (p : M = N) → is-magma-iso M N (Id→iso p)
Id→iso-is-iso (refl M) = id-is-magma-iso M
_≅ₘ_ : Magma 𝓤 → Magma 𝓤 → 𝓤 ̇
M ≅ₘ N = Σ f ꞉ (⟨ M ⟩ → ⟨ N ⟩), is-magma-iso M N f
magma-Id→iso : {M N : Magma 𝓤} → M = N → M ≅ₘ N
magma-Id→iso p = (Id→iso p , Id→iso-is-iso p)
∞-Magma : (𝓤 : Universe) → 𝓤 ⁺ ̇
∞-Magma 𝓤 = Σ X ꞉ 𝓤 ̇ , (X → X → X)
module monoids where
left-neutral : {X : 𝓤 ̇ } → X → (X → X → X) → 𝓤 ̇
left-neutral e _·_ = ∀ x → e · x = x
right-neutral : {X : 𝓤 ̇ } → X → (X → X → X) → 𝓤 ̇
right-neutral e _·_ = ∀ x → x · e = x
associative : {X : 𝓤 ̇ } → (X → X → X) → 𝓤 ̇
associative _·_ = ∀ x y z → (x · y) · z = x · (y · z)
Monoid : (𝓤 : Universe) → 𝓤 ⁺ ̇
Monoid 𝓤 = Σ X ꞉ 𝓤 ̇ , is-set X
× (Σ · ꞉ (X → X → X) , (Σ e ꞉ X , (left-neutral e ·)
× (right-neutral e ·)
× (associative ·)))
refl-left : {X : 𝓤 ̇ } {x y : X} {p : x = y} → refl x ∙ p = p
refl-left {𝓤} {X} {x} {x} {refl x} = refl (refl x)
refl-right : {X : 𝓤 ̇ } {x y : X} {p : x = y} → p ∙ refl y = p
refl-right {𝓤} {X} {x} {y} {p} = refl p
∙assoc : {X : 𝓤 ̇ } {x y z t : X} (p : x = y) (q : y = z) (r : z = t)
→ (p ∙ q) ∙ r = p ∙ (q ∙ r)
∙assoc p q (refl z) = refl (p ∙ q)
⁻¹-left∙ : {X : 𝓤 ̇ } {x y : X} (p : x = y)
→ p ⁻¹ ∙ p = refl y
⁻¹-left∙ (refl x) = refl (refl x)
⁻¹-right∙ : {X : 𝓤 ̇ } {x y : X} (p : x = y)
→ p ∙ p ⁻¹ = refl x
⁻¹-right∙ (refl x) = refl (refl x)
⁻¹-involutive : {X : 𝓤 ̇ } {x y : X} (p : x = y)
→ (p ⁻¹)⁻¹ = p
⁻¹-involutive (refl x) = refl (refl x)
ap-refl : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X → Y) (x : X)
→ ap f (refl x) = refl (f x)
ap-refl f x = refl (refl (f x))
ap-∙ : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X → Y) {x y z : X} (p : x = y) (q : y = z)
→ ap f (p ∙ q) = ap f p ∙ ap f q
ap-∙ f p (refl y) = refl (ap f p)
ap⁻¹ : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X → Y) {x y : X} (p : x = y)
→ (ap f p)⁻¹ = ap f (p ⁻¹)
ap⁻¹ f (refl x) = refl (refl (f x))
ap-id : {X : 𝓤 ̇ } {x y : X} (p : x = y)
→ ap id p = p
ap-id (refl x) = refl (refl x)
ap-∘ : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ }
(f : X → Y) (g : Y → Z) {x y : X} (p : x = y)
→ ap (g ∘ f) p = (ap g ∘ ap f) p
ap-∘ f g (refl x) = refl (refl (g (f x)))
transport∙ : {X : 𝓤 ̇ } (A : X → 𝓥 ̇ ) {x y z : X} (p : x = y) (q : y = z)
→ transport A (p ∙ q) = transport A q ∘ transport A p
transport∙ A p (refl y) = refl (transport A p)
Nat : {X : 𝓤 ̇ } → (X → 𝓥 ̇ ) → (X → 𝓦 ̇ ) → 𝓤 ⊔ 𝓥 ⊔ 𝓦 ̇
Nat A B = (x : domain A) → A x → B x
Nats-are-natural : {X : 𝓤 ̇ } (A : X → 𝓥 ̇ ) (B : X → 𝓦 ̇ ) (τ : Nat A B)
→ {x y : X} (p : x = y)
→ τ y ∘ transport A p = transport B p ∘ τ x
Nats-are-natural A B τ (refl x) = refl (τ x)
NatΣ : {X : 𝓤 ̇ } {A : X → 𝓥 ̇ } {B : X → 𝓦 ̇ } → Nat A B → Σ A → Σ B
NatΣ τ (x , a) = (x , τ x a)
transport-ap : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (A : Y → 𝓦 ̇ )
(f : X → Y) {x x' : X} (p : x = x') (a : A (f x))
→ transport (A ∘ f) p a = transport A (ap f p) a
transport-ap A f (refl x) a = refl a
apd : {X : 𝓤 ̇ } {A : X → 𝓥 ̇ } (f : (x : X) → A x) {x y : X}
(p : x = y) → transport A p (f x) = f y
apd f (refl x) = refl (f x)
to-Σ-= : {X : 𝓤 ̇ } {A : X → 𝓥 ̇ } {σ τ : Σ A}
→ (Σ p ꞉ pr₁ σ = pr₁ τ , transport A p (pr₂ σ) = pr₂ τ)
→ σ = τ
to-Σ-= (refl x , refl a) = refl (x , a)
from-Σ-= : {X : 𝓤 ̇ } {A : X → 𝓥 ̇ } {σ τ : Σ A}
→ σ = τ
→ Σ p ꞉ pr₁ σ = pr₁ τ , transport A p (pr₂ σ) = pr₂ τ
from-Σ-= (refl (x , a)) = (refl x , refl a)
to-Σ-=' : {X : 𝓤 ̇ } {A : X → 𝓥 ̇ } {x : X} {a a' : A x}
→ a = a' → Id (Σ A) (x , a) (x , a')
to-Σ-=' {𝓤} {𝓥} {X} {A} {x} = ap (λ - → (x , -))
transport-× : {X : 𝓤 ̇ } (A : X → 𝓥 ̇ ) (B : X → 𝓦 ̇ )
{x y : X} (p : x = y) {c : A x × B x}
→ transport (λ x → A x × B x) p c
= (transport A p (pr₁ c) , transport B p (pr₂ c))
transport-× A B (refl _) = refl _
transportd : {X : 𝓤 ̇ } (A : X → 𝓥 ̇ ) (B : (x : X) → A x → 𝓦 ̇ )
{x : X} (a : A x) {y : X} (p : x = y)
→ B x a → B y (transport A p a)
transportd A B a (refl x) = id
transport-Σ : {X : 𝓤 ̇ } (A : X → 𝓥 ̇ ) (B : (x : X) → A x → 𝓦 ̇ )
{x : X} (y : X) (p : x = y) (a : A x) {b : B x a}
→ transport (λ x → Σ y ꞉ A x , B x y) p (a , b)
= transport A p a , transportd A B a p b
transport-Σ A B {x} x (refl x) a {b} = refl (a , b)