Martin Escardo, 20th June 2019 onwards. The Cantor type of infinite binary sequences. \begin{code} {-# OPTIONS --safe --without-K #-} open import Apartness.Definition open import MLTT.Spartan open import MLTT.Two-Properties open import Naturals.Order open import Naturals.ExitTruncation open import Notation.Order open import NotionsOfDecidability.Decidable open import UF.DiscreteAndSeparated hiding (_♯_) open import UF.Equiv open import UF.FunExt open import UF.PropTrunc open import UF.Subsingletons open import UF.Subsingletons-FunExt module TypeTopology.Cantor where Cantor = ℕ → 𝟚 \end{code} We let α,β,γ range over the Cantor type. The constant sequences: \begin{code} 𝟎 : Cantor 𝟎 = (i ↦ ₀) 𝟏 : Cantor 𝟏 = (i ↦ ₁) \end{code} Cons, head and tail. \begin{code} head : Cantor → 𝟚 head α = α 0 tail : Cantor → Cantor tail α = α ∘ succ cons : 𝟚 → Cantor → Cantor cons n α 0 = n cons n α (succ i) = α i _∷_ : 𝟚 → Cantor → Cantor _∷_ = cons cons-∼ : {x : 𝟚} {α β : Cantor} → α ∼ β → x ∷ α ∼ x ∷ β cons-∼ h 0 = refl cons-∼ h (succ i) = h i ∼-cons : {x y : 𝟚} {α : Cantor} → x = y → x ∷ α ∼ y ∷ α ∼-cons refl = ∼-refl head-cons : (n : 𝟚) (α : Cantor) → head (cons n α) = n head-cons n α = refl tail-cons : (n : 𝟚) (α : Cantor) → tail (cons n α) = α tail-cons n α = refl tail-cons' : (n : 𝟚) (α : Cantor) → tail (cons n α) ∼ α tail-cons' n α i = refl cons-head-tail : (α : Cantor) → α ∼ cons (head α) (tail α) cons-head-tail α 0 = refl cons-head-tail α (succ i) = refl \end{code} Agreement of two binary sequences α and β at the first n positions, written α =⟦ n ⟧ β. \begin{code} _=⟦_⟧_ : Cantor → ℕ → Cantor → 𝓤₀ ̇ α =⟦ 0 ⟧ β = 𝟙 α =⟦ succ n ⟧ β = (head α = head β) × (tail α =⟦ n ⟧ tail β) =⟦⟧-refl : (α : Cantor) (k : ℕ) → α =⟦ k ⟧ α =⟦⟧-refl α 0 = ⋆ =⟦⟧-refl α (succ k) = refl , =⟦⟧-refl (tail α) k =⟦⟧-trans : (α β γ : Cantor) (k : ℕ) → α =⟦ k ⟧ β → β =⟦ k ⟧ γ → α =⟦ k ⟧ γ =⟦⟧-trans α β γ 0 d e = ⋆ =⟦⟧-trans α β γ (succ k) (h , t) (h' , t') = (h ∙ h') , =⟦⟧-trans (tail α) (tail β) (tail γ) k t t' =⟦⟧-sym : (α β : Cantor) (k : ℕ) → α =⟦ k ⟧ β → β =⟦ k ⟧ α =⟦⟧-sym α β 0 ⋆ = ⋆ =⟦⟧-sym α β (succ k) (h , t) = (h ⁻¹) , =⟦⟧-sym (tail α) (tail β) k t =⟦⟧-is-decidable : (α β : Cantor) (k : ℕ) → is-decidable (α =⟦ k ⟧ β) =⟦⟧-is-decidable α β 0 = inl ⋆ =⟦⟧-is-decidable α β (succ k) = Cases (𝟚-is-discrete (head α) (head β)) (λ (h : head α = head β) → map-decidable (λ (t : tail α =⟦ k ⟧ tail β) → h , t) (λ (_ , t) → t) (=⟦⟧-is-decidable (tail α) (tail β) k)) (λ (ν : head α ≠ head β) → inr (λ (h , _) → ν h)) \end{code} We have that (α =⟦ n ⟧ β) iff α k = β k for all k < n: \begin{code} agreement→ : (α β : Cantor) (n : ℕ) → (α =⟦ n ⟧ β) → ((k : ℕ) → k < n → α k = β k) agreement→ α β 0 * k l = 𝟘-elim l agreement→ α β (succ n) (p , e) 0 l = p agreement→ α β (succ n) (p , e) (succ k) l = IH k l where IH : (k : ℕ) → k < n → α (succ k) = β (succ k) IH = agreement→ (tail α) (tail β) n e agreement← : (α β : Cantor) (n : ℕ) → ((k : ℕ) → k < n → α k = β k) → (α =⟦ n ⟧ β) agreement← α β 0 ϕ = ⋆ agreement← α β (succ n) ϕ = ϕ 0 ⋆ , agreement← (tail α) (tail β) n (ϕ ∘ succ) \end{code} A function Cantor → 𝟚 is uniformly continuous if it has a modulus of continuity: \begin{code} _is-a-modulus-of-uniform-continuity-of_ : ℕ → (Cantor → 𝟚) → 𝓤₀ ̇ m is-a-modulus-of-uniform-continuity-of p = ∀ α β → α =⟦ m ⟧ β → p α = p β uniformly-continuous : (Cantor → 𝟚) → 𝓤₀ ̇ uniformly-continuous p = Σ m ꞉ ℕ , m is-a-modulus-of-uniform-continuity-of p uniform-continuity-data = uniformly-continuous \end{code} Uniform continuity as defined above is data rather than property. This is because any number bigger than a modulus of uniform continuity is also a modulus. TODO. Show that (Σ p ꞉ (Cantor → 𝟚) , uniformly-continuous p) ≃ (Σ n ꞉ ℕ , Fin (2 ^ n) → 𝟚) If we define uniform continuity with ∃ rather than Σ, this is no longer the case. \begin{code} continuous : (Cantor → 𝟚) → 𝓤₀ ̇ continuous p = ∀ α → Σ m ꞉ ℕ , (∀ β → α =⟦ m ⟧ β → p α = p β) continuity-data = continuous \end{code} \begin{code} module notions-of-continuity (pt : propositional-truncations-exist) where open PropositionalTruncation pt is-uniformly-continuous : (Cantor → 𝟚) → 𝓤₀ ̇ is-uniformly-continuous p = ∃ m ꞉ ℕ , m is-a-modulus-of-uniform-continuity-of p is-continuous : (Cantor → 𝟚) → 𝓤₀ ̇ is-continuous p = ∀ α → ∃ m ꞉ ℕ , (∀ β → α =⟦ m ⟧ β → p α = p β) \end{code} We now define the canonical apartness relation _♯_ for points of the Cantor type. Two sequences are apart if they differ at some index. To make apartness into a proposition, which is crucial for our purposes, we consider the minimal index at which they differ. This allows us to avoid the assumption that propositional truncations exist. But we still need function extensionality, so that the proof is not in the realm of pure Martin-Löf type theory. \begin{code} open Apartness _♯_ : Cantor → Cantor → 𝓤₀ ̇ α ♯ β = Σ n ꞉ ℕ , (α n ≠ β n) × ((i : ℕ) → α i ≠ β i → n ≤ i) \end{code} We use δ to range over the type α n ≠ β n, and μ to range over the minimality condition (i : ℕ) → α i ≠ β i → n ≤ i, for α, β and n suitably specialized according to the situation we are considering. We also use the letter "a" to range over the apartness type α ♯ β. \begin{code} apartness-criterion : (α β : Cantor) → (Σ n ꞉ ℕ , α n ≠ β n) → α ♯ β apartness-criterion α β = minimal-witness (λ n → α n ≠ β n) (λ n → ¬-preserves-decidability (𝟚-is-discrete (α n) (β n))) apartness-criterion-converse : (α β : Cantor) → α ♯ β → (Σ n ꞉ ℕ , α n ≠ β n) apartness-criterion-converse α β (n , δ , _) = (n , δ) \end{code} Hence, in view of the following, the type α ♯ β has the universal property of the propositional truncation of the type Σ n ꞉ ℕ , α n ≠ β n. \begin{code} ♯-is-prop-valued : Fun-Ext → is-prop-valued _♯_ ♯-is-prop-valued fe α β (n , δ , μ) (n' , δ' , μ') = III where I : (n : ℕ) → is-prop ((α n ≠ β n) × ((i : ℕ) → α i ≠ β i → n ≤ i)) I n = ×-is-prop (negations-are-props fe) (Π₂-is-prop fe λ i _ → ≤-is-prop-valued n i) II : n = n' II = ≤-anti n n' (μ n' δ') (μ' n δ) III : (n , δ , μ) =[ α ♯ β ] (n' , δ' , μ') III = to-subtype-= I II \end{code} The apartness axioms are satisfied, and, moreover, the apartness is tight. \begin{code} ♯-is-irreflexive : is-irreflexive _♯_ ♯-is-irreflexive α (n , δ , μ) = ≠-is-irrefl (α n) δ ♯-is-symmetric : is-symmetric _♯_ ♯-is-symmetric α β (n , δ , μ) = n , (λ e → δ (e ⁻¹)) , λ i d → μ i (≠-sym d) ♯-strongly-cotransitive : is-strongly-cotransitive _♯_ ♯-strongly-cotransitive α β γ (n , δ , μ) = III where I : (α n ≠ γ n) + (β n ≠ γ n) I = discrete-types-are-cotransitive' 𝟚-is-discrete {α n} {β n} {γ n} δ II : type-of I → (α ♯ γ) + (β ♯ γ) II (inl d) = inl (apartness-criterion α γ (n , d)) II (inr d) = inr (apartness-criterion β γ (n , d)) III : (α ♯ γ) + (β ♯ γ) III = II I ♯-is-tight : Fun-Ext → is-tight _♯_ ♯-is-tight fe α β ν = dfunext fe I where I : (n : ℕ) → α n = β n I n = 𝟚-is-¬¬-separated (α n) (β n) (λ (d : α n ≠ β n) → ν (apartness-criterion α β (n , d))) \end{code} If two sequences α and β are apart, they agree before the apartness index n. \begin{code} ♯-agreement : (α β : Cantor) ((n , δ , μ) : α ♯ β) (i : ℕ) → i < n → α i = β i ♯-agreement α β (n , _ , μ) i ℓ = IV where I : α i ≠ β i → n ≤ i I = μ i II : ¬ (n ≤ i) → ¬ (α i ≠ β i) II = contrapositive I III : ¬ (n ≤ i) III = less-not-bigger-or-equal i n ℓ IV : α i = β i IV = 𝟚-is-¬¬-separated (α i) (β i) (II III) \end{code} The Cantor type is homogeneous. \begin{code} module _ (fe : funext₀) (α β : Cantor) where Cantor-swap : Cantor → Cantor Cantor-swap γ i = (β i ⊕ α i) ⊕ γ i Cantor-swap-involutive : Cantor-swap ∘ Cantor-swap ∼ id Cantor-swap-involutive γ = dfunext fe (λ i → ⊕-involutive {β i ⊕ α i} {γ i}) Cantor-swap-swaps∼ : Cantor-swap α ∼ β Cantor-swap-swaps∼ i = Cantor-swap α i =⟨ refl ⟩ (β i ⊕ α i) ⊕ α i =⟨ ⊕-assoc {β i} {α i} {α i} ⟩ β i ⊕ (α i ⊕ α i) =⟨ ap (β i ⊕_) (Lemma[b⊕b=₀] {α i}) ⟩ β i ⊕ ₀ =⟨ ⊕-₀-right-neutral ⟩ β i ∎ Cantor-swap-swaps : Cantor-swap α = β Cantor-swap-swaps = dfunext fe Cantor-swap-swaps∼ Cantor-swap-swaps' : Cantor-swap β = α Cantor-swap-swaps' = involution-swap Cantor-swap Cantor-swap-involutive Cantor-swap-swaps Cantor-swap-≃ : Cantor ≃ Cantor Cantor-swap-≃ = Cantor-swap , involutions-are-equivs Cantor-swap Cantor-swap-involutive Cantor-homogeneous : funext₀ → (α β : Cantor) → Σ f ꞉ Cantor ≃ Cantor , (⌜ f ⌝ α = β) Cantor-homogeneous fe α β = Cantor-swap-≃ fe α β , Cantor-swap-swaps fe α β \end{code}