Todd Waugh Ambridge, January 2024 # Examples of uniformly continuous searchable closeness spaces \begin{code} {-# OPTIONS --without-K --safe #-} open import MLTT.Spartan open import UF.FunExt open import NotionsOfDecidability.Complemented open import UF.Subsingletons open import UF.Equiv open import UF.SubtypeClassifier open import UF.DiscreteAndSeparated open import Fin.Bishop open import TWA.Thesis.Chapter2.Finite open import TWA.Thesis.Chapter2.Sequences module TWA.Thesis.Chapter3.SearchableTypes-Examples (fe : FunExt) (pe : PropExt) where open import TWA.Thesis.Chapter3.SearchableTypes fe open import TWA.Thesis.Chapter3.ClosenessSpaces fe hiding (decidable-predicate;decidable-uc-predicate) open import TWA.Thesis.Chapter3.ClosenessSpaces-Examples fe open import TWA.Thesis.Chapter3.PredicateEquality fe pe \end{code} ## Finite uniformly continuously searchable spaces \begin{code} finite-csearchable : (X : ClosenessSpace 𝓤) → (f : finite-linear-order ⟨ X ⟩) → pointed ⟨ X ⟩ → csearchable 𝓦 X finite-csearchable X f x = searchable→csearchable X (finite-searchable f x) \end{code} ## Disjoint union of uniformly continuously searchable spaces \begin{code} +-csearchable : (X : ClosenessSpace 𝓤) (Y : ClosenessSpace 𝓥) → csearchable 𝓦 X → csearchable 𝓦 Y → csearchable 𝓦 (+-ClosenessSpace X Y) +-csearchable {𝓤} {𝓥} {𝓦} X Y Sx Sy ((p , d) , δ , ϕ) = xy₀ (d (inl x₀)) , γ (d (inl x₀)) where px : decidable-uc-predicate 𝓦 X px = (p ∘ inl , d ∘ inl) , δ , λ x₁ x₂ → ϕ (inl x₁) (inl x₂) py : decidable-uc-predicate 𝓦 Y py = (p ∘ inr , d ∘ inr) , δ , λ x₁ x₂ → ϕ (inr x₁) (inr x₂) x₀ : ⟨ X ⟩ x₀ = pr₁ (Sx px) γx : (Σ x ꞉ ⟨ X ⟩ , (p (inl x) holds)) → p (inl x₀) holds γx = pr₂ (Sx px) y₀ : ⟨ Y ⟩ y₀ = pr₁ (Sy py) γy : (Σ y ꞉ ⟨ Y ⟩ , (p (inr y) holds)) → p (inr y₀) holds γy = pr₂ (Sy py) xy₀ : is-decidable (p (inl x₀) holds) → ⟨ X ⟩ + ⟨ Y ⟩ xy₀ (inl _) = inl x₀ xy₀ (inr _) = inr y₀ γ : (dpx₀ : is-decidable (p (inl x₀) holds)) → ((_ , pxy) : Σ xy ꞉ ⟨ X ⟩ + ⟨ Y ⟩ , p xy holds) → p (xy₀ dpx₀) holds γ (inl px₀) _ = px₀ γ (inr ¬px₀) (inl x , px) = 𝟘-elim (¬px₀ (γx (x , px))) γ (inr ¬px₀) (inr y , py) = γy (y , py) \end{code} ## Binary product of uniformly continuously searchable spaces \begin{code} ×-pred-left : (X : ClosenessSpace 𝓤) (Y : ClosenessSpace 𝓥) → decidable-uc-predicate 𝓦 (×-ClosenessSpace X Y) → ⟨ Y ⟩ → decidable-uc-predicate 𝓦 X ×-pred-left X Y ((p , d) , δ , ϕ) y = ((p ∘ (_, y)) , (d ∘ (_, y))) , δ , λ x₁ x₂ Cδx₁x₂ → ϕ (x₁ , y) (x₂ , y) (×-C-combine X Y x₁ x₂ y y δ Cδx₁x₂ (C-refl Y δ y)) ×-pred-right : (X : ClosenessSpace 𝓤) (Y : ClosenessSpace 𝓥) → decidable-uc-predicate 𝓦 (×-ClosenessSpace X Y) → ⟨ X ⟩ → decidable-uc-predicate 𝓦 Y ×-pred-right X Y ((p , d) , δ , ϕ) x = ((p ∘ (x ,_)) , (d ∘ (x ,_))) , δ , λ y₁ y₂ Cδy₁y₂ → ϕ (x , y₁) (x , y₂) (×-C-combine X Y x x y₁ y₂ δ (C-refl X δ x) Cδy₁y₂) ×-csearchable : (X : ClosenessSpace 𝓤) (Y : ClosenessSpace 𝓥) → csearchable 𝓦 X → csearchable 𝓦 Y → csearchable 𝓦 (×-ClosenessSpace X Y) ×-csearchable {𝓤} {𝓥} {𝓦} X Y Sx Sy ((p , d) , δ , ϕ) = xy₀ , γ where py→ : ⟨ X ⟩ → decidable-uc-predicate 𝓦 Y py→ x = (p ∘ (x ,_) , d ∘ (x ,_)) , δ , λ y₁ y₂ Cδy₁y₂ → ϕ (x , y₁) (x , y₂) (×-C-combine X Y x x y₁ y₂ δ (C-refl X δ x) Cδy₁y₂) y₀ : ⟨ X ⟩ → ⟨ Y ⟩ y₀ x = pr₁ (Sy (py→ x)) γy : (x : ⟨ X ⟩) → (Σ y ꞉ ⟨ Y ⟩ , (p (x , y) holds)) → p (x , y₀ x) holds γy x = pr₂ (Sy (py→ x)) pyϕ : (x₁ x₂ : ⟨ X ⟩) → C X δ x₁ x₂ → (y : ⟨ Y ⟩) → p (x₁ , y) holds ↔ p (x₂ , y) holds pyϕ x₁ x₂ Cδx₁x₂ y = ϕ (x₁ , y) (x₂ , y) (×-C-combine X Y x₁ x₂ y y δ Cδx₁x₂ (C-refl Y δ y)) , ϕ (x₂ , y) (x₁ , y) (×-C-combine X Y x₂ x₁ y y δ (C-sym X δ x₁ x₂ Cδx₁x₂) (C-refl Y δ y)) px : decidable-uc-predicate 𝓦 X px = ((λ x → p (x , y₀ x)) , λ x → d (x , y₀ x)) , δ , λ x₁ x₂ Cδx₁x₂ → ϕ (x₁ , y₀ x₁) (x₂ , y₀ x₂) (×-C-combine X Y x₁ x₂ (y₀ x₁) (y₀ x₂) δ Cδx₁x₂ (transport (λ - → C Y δ (y₀ x₁) (pr₁ (Sy -))) (decidable-uc-predicate-= Y (py→ x₁) (py→ x₂) refl (pyϕ x₁ x₂ Cδx₁x₂)) (C-refl Y δ (y₀ x₁)))) x₀ : ⟨ X ⟩ x₀ = pr₁ (Sx px) γx : (Σ x ꞉ ⟨ X ⟩ , (p (x , y₀ x) holds)) → p (x₀ , y₀ x₀) holds γx = pr₂ (Sx px) xy₀ : ⟨ X ⟩ × ⟨ Y ⟩ xy₀ = x₀ , y₀ x₀ γ : (Σ xy ꞉ ⟨ X ⟩ × ⟨ Y ⟩ , (p xy holds)) → p xy₀ holds γ ((x , y) , pxy) = γx (x , γy x (y , pxy)) \end{code} ## Equivalent uniformly continuously searchable spaces \begin{code} ≃-csearchable : {X : 𝓤 ̇} (Y : ClosenessSpace 𝓥) → (e : X ≃ ⟨ Y ⟩) → csearchable 𝓦 Y → csearchable 𝓦 (≃-ClosenessSpace Y e) ≃-csearchable {𝓤} {𝓥} {𝓦} {X} Y e@(f , (g , η) , (h , μ)) S ((p' , d') , δ , ϕ') = x₀ , γ where p : ⟨ Y ⟩ → Ω 𝓦 p y = p' (g y) d : is-complemented (λ x → p x holds) d y = d' (g y) ϕ : p-ucontinuous-with-mod Y p δ ϕ y₁ y₂ Cδy₁y₂ = ϕ' (g y₁) (g y₂) (C-trans Y δ (f (g y₁)) y₁ (f (g y₂)) (C-id Y δ (f (g y₁)) y₁ (η y₁)) (C-trans Y δ y₁ y₂ (f (g y₂)) Cδy₁y₂ (C-id Y δ y₂ (f (g y₂)) (η y₂ ⁻¹)))) x₀ : X x₀ = g (pr₁ (S ((p , d) , δ , ϕ))) γ : Sigma ⟨ ≃-ClosenessSpace Y e ⟩ (λ x → p' x holds) → p' x₀ holds γ (x , phx) = pr₂ (S ((p , d) , δ , ϕ)) (f x , transport (λ - → p' - holds) (μ x ⁻¹ ∙ (ap h (η (f x) ⁻¹) ∙ μ (g (f x)))) phx) \end{code} ## Finite-sequence uniformly continuously searchable spaces \begin{code} tail-predicate : {X : ℕ → 𝓤 ̇ } → (f : (n : ℕ) → finite-linear-order (X n)) → (ds : (n : ℕ) → is-discrete (X n)) → (δ : ℕ) → (x : X 0) → decidable-uc-predicate-with-mod 𝓦 (ΠD-ClosenessSpace ds) (succ δ) → decidable-uc-predicate-with-mod 𝓦 (ΠD-ClosenessSpace (ds ∘ succ)) δ tail-predicate {𝓤} {𝓦} {X} f ds δ x ((p' , d') , ϕ') = (p , d) , ϕ where p : Π (X ∘ succ) → Ω 𝓦 p xs = p' (x ∷ xs) d : is-complemented (λ - → p - holds) d xs = d' (x ∷ xs) ϕ : p-ucontinuous-with-mod (ΠD-ClosenessSpace (ds ∘ succ)) p δ ϕ x₁ x₂ Cδx₁x₂ = ϕ' (x ∷ x₁) (x ∷ x₂) (∼ⁿ-to-C' ds (x ∷ x₁) (x ∷ x₂) (succ δ) γ) where γ : ((x ∷ x₁) ∼ⁿ (x ∷ x₂)) (succ δ) γ zero i<sδ = refl γ (succ i) i<sδ = C-to-∼ⁿ' (ds ∘ succ) x₁ x₂ δ Cδx₁x₂ i i<sδ dep-discrete-finite-seq-csearchable' : {X : ℕ → 𝓤 ̇ } → Π X → (f : (n : ℕ) → finite-linear-order (X n)) → (ds : (n : ℕ) → is-discrete (X n)) → (δ : ℕ) → (((p , _) , _) : decidable-uc-predicate-with-mod 𝓦 (ΠD-ClosenessSpace ds) δ) → Σ xs₀ ꞉ Π X , ((Σ xs ꞉ Π X , p xs holds) → p xs₀ holds) head-predicate : {X : ℕ → 𝓤 ̇ } → Π X → (f : (n : ℕ) → finite-linear-order (X n)) → (ds : (n : ℕ) → is-discrete (X n)) → (δ : ℕ) → decidable-uc-predicate-with-mod 𝓦 (ΠD-ClosenessSpace ds) (succ δ) → decidable-predicate 𝓦 (X 0) head-predicate {𝓤} {𝓦} {X} α f ds δ ((p , d) , ϕ) = p ∘ xs→ , d ∘ xs→ where xs→ : X 0 → Π X xs→ x = x ∷ pr₁ (dep-discrete-finite-seq-csearchable' (α ∘ succ) (f ∘ succ) (ds ∘ succ) δ (tail-predicate f ds δ x ((p , d) , ϕ))) dep-discrete-finite-seq-csearchable' α f ds 0 ((p , d) , ϕ) = α , λ (y , py) → ϕ y α (λ _ ()) py dep-discrete-finite-seq-csearchable' {𝓤} {𝓦} {X} α f ds (succ δ) ((p , d) , ϕ) = xs₀ , γ where pₕ = head-predicate α f ds δ ((p , d) , ϕ) x₀ : X 0 x₀ = pr₁ (finite-searchable (f 0) (α 0) pₕ) γₕ : Σ x ꞉ X 0 , pr₁ pₕ x holds → pr₁ pₕ x₀ holds γₕ = pr₂ (finite-searchable (f 0) (α 0) pₕ) pₜ→ = λ x → tail-predicate f ds δ x ((p , d) , ϕ) xs→ : (x : X 0) → Σ xs₀ ꞉ Π (X ∘ succ) , ((Σ xs ꞉ Π (X ∘ succ) , (pr₁ ∘ pr₁) (pₜ→ x) xs holds) → (pr₁ ∘ pr₁) (pₜ→ x) xs₀ holds) xs→ x = dep-discrete-finite-seq-csearchable' (α ∘ succ) (f ∘ succ) (ds ∘ succ) δ (pₜ→ x) xs₀ : Π X xs₀ = x₀ ∷ pr₁ (xs→ x₀) γ : Σ xs ꞉ Π X , (p xs holds) → p xs₀ holds γ (y , py) = γₕ (y 0 , pr₂ (xs→ (y 0)) (y ∘ succ , ϕ y (y 0 ∷ (y ∘ succ)) (λ n _ → decidable-𝟚₁ (∼ⁿ-decidable ds _ _ _) λ i _ → ζ i) py)) where ζ : y ∼ (y 0 ∷ (λ x₁ → y (succ x₁))) ζ zero = refl ζ (succ i) = refl dep-discrete-finite-seq-csearchable : {X : ℕ → 𝓤 ̇ } → Π X → (f : (n : ℕ) → finite-linear-order (X n)) → (ds : (n : ℕ) → is-discrete (X n)) → csearchable 𝓦 (ΠD-ClosenessSpace ds) dep-discrete-finite-seq-csearchable α f ds ((p , d) , (δ , ϕ)) = dep-discrete-finite-seq-csearchable' α f ds δ ((p , d) , ϕ) discrete-finite-seq-csearchable : {X : 𝓤 ̇ } → X → (f : finite-linear-order X) → (ds : is-discrete X) → csearchable 𝓦 (ℕ→D-ClosenessSpace ds) discrete-finite-seq-csearchable x₀ f ds = dep-discrete-finite-seq-csearchable (λ _ → x₀) (λ _ → f) (λ _ → ds) \end{code} ## Tychonoff theorem \begin{code} tail-predicate-tych : (T : ℕ → ClosenessSpace 𝓤) → (δ : ℕ) → (x : ⟨ T 0 ⟩) → decidable-uc-predicate-with-mod 𝓦 (Π-ClosenessSpace T) (succ δ) → decidable-uc-predicate-with-mod 𝓦 (Π-ClosenessSpace (tail T)) δ tail-predicate-tych {𝓤} {𝓦} T δ x₀ ((p' , d') , ϕ') = (p , d) , ϕ where p : Π (⟨_⟩ ∘ T ∘ succ) → Ω 𝓦 p xs = p' (x₀ ∷ xs) d : is-complemented (λ x → p x holds) d xs = d' (x₀ ∷ xs) ϕ : p-ucontinuous-with-mod (Π-ClosenessSpace (T ∘ succ)) p δ ϕ xs ys Cδxsys = ϕ' (x₀ ∷ xs) (x₀ ∷ ys) (Π-C-combine T x₀ x₀ xs ys δ (C-refl (T 0) (succ δ) x₀) Cδxsys) tychonoff' : (T : ℕ → ClosenessSpace 𝓤) → ((n : ℕ) → csearchable 𝓦 (T n)) → (δ : ℕ) → (((p , _) , _) : decidable-uc-predicate-with-mod 𝓦 (Π-ClosenessSpace T) δ) → Σ xs₀ ꞉ Π (⟨_⟩ ∘ T) , ((Σ xs ꞉ Π (⟨_⟩ ∘ T) , p xs holds) → p xs₀ holds) head-predicate-tych : (T : ℕ → ClosenessSpace 𝓤) → ((n : ℕ) → csearchable 𝓦 (T n)) → (δ : ℕ) → decidable-uc-predicate-with-mod 𝓦 (Π-ClosenessSpace T) (succ δ) → decidable-uc-predicate 𝓦 (T 0) head-predicate-tych {𝓤} {𝓦} T S δ ((p , d) , ϕ) = ((p ∘ xs→) , d ∘ xs→) , succ δ , γ where xs→ : ⟨ T 0 ⟩ → Π (⟨_⟩ ∘ T) xs→ x = x ∷ pr₁ (tychonoff' (T ∘ succ) (S ∘ succ) δ (tail-predicate-tych T δ x ((p , d) , ϕ))) γ : p-ucontinuous-with-mod (T 0) (λ x → p (xs→ x)) (succ δ) γ x₁ x₂ Csδx₁x₂ = ϕ (xs→ x₁) (xs→ x₂) (Π-C-combine T x₁ x₂ (xs→ x₁ ∘ succ) (xs→ x₂ ∘ succ) δ Csδx₁x₂ ζₛ) where χ : (xs : Π (⟨_⟩ ∘ T ∘ succ)) → (pr₁ (pr₁ (tail-predicate-tych T δ x₁ ((p , d) , ϕ))) xs holds) ↔ (pr₁ (pr₁ (tail-predicate-tych T δ x₂ ((p , d) , ϕ))) xs holds) χ xs = ϕ (x₁ ∷ xs) (x₂ ∷ xs) (Π-C-combine T x₁ x₂ xs xs δ Csδx₁x₂ (C-refl (Π-ClosenessSpace (T ∘ succ)) δ xs)) , ϕ (x₂ ∷ xs) (x₁ ∷ xs) (Π-C-combine T x₂ x₁ xs xs δ (C-sym (T 0) (succ δ) x₁ x₂ Csδx₁x₂) (C-refl (Π-ClosenessSpace (T ∘ succ)) δ xs)) ζₛ : C (Π-ClosenessSpace (T ∘ succ)) δ (xs→ x₁ ∘ succ) (xs→ x₂ ∘ succ) ζₛ = transport (λ - → C (Π-ClosenessSpace (T ∘ succ)) δ (xs→ x₁ ∘ succ) (pr₁ (tychonoff' (T ∘ succ) (S ∘ succ) δ -))) (decidable-uc-predicate-with-mod-= (Π-ClosenessSpace (T ∘ succ)) δ (tail-predicate-tych T δ x₁ ((p , d) , ϕ)) (tail-predicate-tych T δ x₂ ((p , d) , ϕ)) χ) (C-refl (Π-ClosenessSpace (T ∘ succ)) δ (xs→ x₁ ∘ succ)) tychonoff' T S 0 ((p , d) , ϕ) = (λ n → pr₁ (S n (((λ _ → ⊤) , (λ _ → inl ⋆)) , (0 , (λ x₁ x₂ _ _ → ⋆)))) ) , (λ (α , pα) → ϕ α _ (λ _ ()) pα) tychonoff' T S (succ δ) ((p , d) , ϕ) = (x ∷ pr₁ (xs→ x)) , γ where pₜ→ = λ x → tail-predicate-tych T δ x ((p , d) , ϕ) pₕ = head-predicate-tych T S δ ((p , d) , ϕ) xs→ : (x : ⟨ T 0 ⟩) → Σ xs₀ ꞉ Π (⟨_⟩ ∘ T ∘ succ) , ((Σ xs ꞉ Π (⟨_⟩ ∘ T ∘ succ) , (pr₁ ∘ pr₁) (pₜ→ x) xs holds) → (pr₁ ∘ pr₁) (pₜ→ x) xs₀ holds) xs→ x = tychonoff' (T ∘ succ) (S ∘ succ) δ (pₜ→ x) x : ⟨ T 0 ⟩ x = pr₁ (S 0 pₕ) γₕ : _ γₕ = pr₂ (S 0 pₕ) γ : _ γ (y , py) = γₕ (y 0 , pr₂ (xs→ (y 0)) (y ∘ succ , ϕ y (y 0 ∷ (y ∘ succ)) (Π-C-eta T y (succ δ)) py)) tychonoff : (T : ℕ → ClosenessSpace 𝓤) → ((n : ℕ) → csearchable 𝓦 (T n)) → csearchable 𝓦 (Π-ClosenessSpace T) tychonoff T S ((p , d) , δ , ϕ) = tychonoff' T S δ ((p , d) , ϕ) \end{code}