Todd Waugh Ambridge, January 2024
# Uniformly continuously searchable closeness spaces
\begin{code}
{-# OPTIONS --without-K --safe #-}
open import MLTT.Spartan
open import UF.FunExt
open import NotionsOfDecidability.Complemented
open import UF.SubtypeClassifier
open import UF.Equiv
open import UF.DiscreteAndSeparated
open import MLTT.Two-Properties
open import Fin.Type
open import Fin.Bishop
module TWA.Thesis.Chapter3.SearchableTypes (fe : FunExt) where
open import TWA.Thesis.Chapter3.ClosenessSpaces fe
hiding (decidable-predicate;decidable-uc-predicate)
open import TWA.Thesis.Chapter3.ClosenessSpaces-Examples fe
using (decidable-𝟚; decidable-𝟚₁; 𝟚-decidable₁)
\end{code}
## Searchable types
\begin{code}
decidable-predicate : (𝓦 : Universe) → 𝓤 ̇ → 𝓤 ⊔ 𝓦 ⁺ ̇
decidable-predicate 𝓦 X
= Σ p ꞉ (X → Ω 𝓦) , is-complemented (λ x → (p x) holds)
searchable𝓔 : (𝓦 : Universe) → 𝓤 ̇ → 𝓤 ⊔ (𝓦 ⁺) ̇
searchable𝓔 𝓦 X = Σ 𝓔 ꞉ (decidable-predicate 𝓦 X → X)
, (((p , d) : decidable-predicate 𝓦 X)
→ (Σ x ꞉ X , (p x holds)) → p (𝓔 (p , d)) holds)
searchable : (𝓦 : Universe) → 𝓤 ̇ → 𝓤 ⊔ (𝓦 ⁺) ̇
searchable 𝓦 X
= ((p , d) : decidable-predicate 𝓦 X)
→ Σ x₀ ꞉ X , ((Σ x ꞉ X , (p x holds)) → p x₀ holds)
searchable-pointed
: (𝓦 : Universe) → (X : 𝓤 ̇ ) → searchable 𝓦 X → X
searchable-pointed 𝓦 X Sx = pr₁ (Sx ((λ _ → ⊤) , (λ _ → inl ⋆)))
𝟙-searchable : searchable 𝓦 (𝟙 {𝓤})
𝟙-searchable {𝓦} {𝓤} (p , d) = ⋆ , S
where
S : (Σ x ꞉ 𝟙 , p x holds) → p ⋆ holds
S (⋆ , p⋆) = p⋆
𝟘+-searchable
: {X : 𝓤 ̇ } → searchable 𝓦 X → searchable 𝓦 (𝟘 {𝓥} + X)
𝟘+-searchable {𝓤} {𝓦} {𝓥} {X} Sx (p , d)
= inr x₀ , γ
where
px : decidable-predicate 𝓦 X
px = p ∘ inr , d ∘ inr
x₀ : X
x₀ = pr₁ (Sx px)
γx : (Σ x ꞉ X , (pr₁ px x holds)) → pr₁ px x₀ holds
γx = pr₂ (Sx px)
γ : (Σ x ꞉ 𝟘 + X , (p x holds)) → pr₁ px x₀ holds
γ (inr x , pix) = γx (x , pix)
+-searchable : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
→ searchable 𝓦 X
→ searchable 𝓦 Y
→ searchable 𝓦 (X + Y)
+-searchable {𝓤} {𝓥} {𝓦} {X} {Y} Sx Sy (p , d)
= Cases (d (inl x₀))
(λ px₀ → inl x₀ , λ _ → px₀)
(λ ¬px₀ → inr y₀ , γ ¬px₀)
where
px : decidable-predicate 𝓦 X
px = p ∘ inl , d ∘ inl
py : decidable-predicate 𝓦 Y
py = p ∘ inr , d ∘ inr
x₀ : X
x₀ = pr₁ (Sx px)
γx : Σ x ꞉ X , (pr₁ px x holds) → pr₁ px x₀ holds
γx = pr₂ (Sx px)
y₀ : Y
y₀ = pr₁ (Sy py)
γy : Σ y ꞉ Y , (pr₁ py y holds) → pr₁ py y₀ holds
γy = pr₂ (Sy py)
γ : ¬ (p (inl x₀) holds)
→ (Σ xy ꞉ (X + Y) , p xy holds)
→ p (inr y₀) holds
γ ¬px₀ (inl x , pix) = 𝟘-elim (¬px₀ (γx (x , pix)))
γ ¬px₀ (inr y , piy) = γy (y , piy)
Fin-searchable : (n : ℕ) → Fin n → searchable 𝓦 (Fin n)
Fin-searchable 1 _ = 𝟘+-searchable 𝟙-searchable
Fin-searchable (succ (succ n)) _
= +-searchable (Fin-searchable (succ n) 𝟎) 𝟙-searchable
equivs-preserve-searchability
: {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
→ (f : X → Y)
→ is-equiv f
→ searchable 𝓦 X
→ searchable 𝓦 Y
equivs-preserve-searchability {𝓤} {𝓥} {𝓦} {X} {Y}
f ((g , η) , _) Sx (p , d) = y₀ , γ
where
px : decidable-predicate 𝓦 X
px = p ∘ f , d ∘ f
x₀ : X
x₀ = pr₁ (Sx px)
γx : Σ x ꞉ X , p (f x) holds → p (f x₀) holds
γx = pr₂ (Sx px)
y₀ : Y
y₀ = f x₀
γ : Σ y ꞉ Y , p y holds → p y₀ holds
γ (y , py) = γx (g y , transport (λ - → p - holds) (η y ⁻¹) py)
≃-searchable
: {X : 𝓤 ̇ } {Y : 𝓥 ̇ } → X ≃ Y → searchable 𝓦 X → searchable 𝓦 Y
≃-searchable (f , e) = equivs-preserve-searchability f e
finite-searchable : {X : 𝓤 ̇ }
→ finite-linear-order X
→ X
→ searchable 𝓦 X
finite-searchable (0 , (g , _)) x = 𝟘-elim (g x)
finite-searchable (succ n , e) x
= ≃-searchable (≃-sym e) (Fin-searchable (succ n) 𝟎)
×-searchable : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
→ searchable 𝓦 X
→ searchable 𝓦 Y
→ searchable 𝓦 (X × Y)
×-searchable {𝓤} {𝓥} {𝓦} {X} {Y} Sx Sy (p , d)
= xy₀ , γ
where
py→ : X → decidable-predicate 𝓦 Y
py→ x = p ∘ (x ,_) , d ∘ (x ,_)
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))
px : decidable-predicate 𝓦 X
px = (λ x → p (x , y₀ x)) , (λ x → d (x , 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₀
γ : Σ (x , y) ꞉ X × Y , p (x , y) holds → p (x₀ , y₀ x₀) holds
γ ((x , y) , pxy) = γx (x , (γy x (y , pxy)))
\end{code}
## Cantor searchability is LPO
\begin{code}
LPO : 𝓤₀ ̇
LPO = (α : ℕ → 𝟚) → ((n : ℕ) → α n = ₀) + (Σ n ꞉ ℕ , α n = ₁)
no-ones-means-all-zero
: (α : ℕ → 𝟚) → ¬ (Σ n ꞉ ℕ , α n = ₁) → (n : ℕ) → α n = ₀
no-ones-means-all-zero α f n
= Cases (𝟚-possibilities (α n)) id
(λ αn=₁ → 𝟘-elim (f (n , αn=₁)))
ℕ-searchability-is-taboo : searchable 𝓤₀ ℕ → LPO
ℕ-searchability-is-taboo S α
= Cases (𝟚-possibilities (α n))
(λ αn=₀ → inl (no-ones-means-all-zero α
(λ (i , αi=₁) → zero-is-not-one
(αn=₀ ⁻¹ ∙ γ (i , αi=₁)))))
(λ αn=₁ → inr (n , αn=₁))
where
p : decidable-predicate 𝓤₀ ℕ
pr₁ p n = (α n = ₁) , 𝟚-is-set
pr₂ p n = 𝟚-is-discrete (α n) ₁
n : ℕ
n = pr₁ (S p)
γ : Σ i ꞉ ℕ , pr₁ p i holds → pr₁ p n holds
γ = pr₂ (S p)
decidable-to-𝟚 : {X : 𝓤 ̇ } → is-decidable X
→ Σ b ꞉ 𝟚 , ((b = ₁ ↔ X) × (b = ₀ ↔ ¬ X))
decidable-to-𝟚 (inl x)
= ₁ , (((λ _ → x) , (λ _ → refl))
, (𝟘-elim ∘ zero-is-not-one ∘ _⁻¹) , (λ ¬x → 𝟘-elim (¬x x)))
decidable-to-𝟚 (inr ¬x)
= ₀ , ((𝟘-elim ∘ zero-is-not-one) , (λ x → 𝟘-elim (¬x x)))
, (λ _ → ¬x) , (λ _ → refl)
LPO-implies-ℕ-searchability : LPO → searchable 𝓦 ℕ
LPO-implies-ℕ-searchability {𝓦} f (p , d)
= Cases (f (λ i → decidable-𝟚 (d i)))
(λ α∼₀ → 0 , λ (n , pn) → (𝟘-elim ∘ zero-is-not-one)
(α∼₀ n ⁻¹ ∙ decidable-𝟚₁ (d n) pn))
λ (i , αᵢ=₀) → i , λ _ → 𝟚-decidable₁ (d i) αᵢ=₀
\end{code}
## Uniformly continuously searchable closeness spaces
\begin{code}
decidable-uc-predicate-with-mod
: (𝓦 : Universe) → ClosenessSpace 𝓤 → ℕ → 𝓤 ⊔ 𝓦 ⁺ ̇
decidable-uc-predicate-with-mod 𝓦 X δ
= Σ (p , d) ꞉ decidable-predicate 𝓦 ⟨ X ⟩
, p-ucontinuous-with-mod X p δ
decidable-uc-predicate
: (𝓦 : Universe) → ClosenessSpace 𝓤 → 𝓤 ⊔ 𝓦 ⁺ ̇
decidable-uc-predicate 𝓦 X
= Σ (p , d) ꞉ decidable-predicate 𝓦 ⟨ X ⟩ , p-ucontinuous X p
to-uc-pred : (𝓦 : Universe)
→ (X : ClosenessSpace 𝓤)
→ (δ : ℕ)
→ decidable-uc-predicate-with-mod 𝓦 X δ
→ decidable-uc-predicate 𝓦 X
to-uc-pred 𝓦 X δ ((p , d) , ϕ) = (p , d) , δ , ϕ
get-uc-mod : (X : ClosenessSpace 𝓤) → decidable-uc-predicate 𝓦 X → ℕ
get-uc-mod 𝓦 (_ , δ , _) = δ
csearchable𝓔 : (𝓦 : Universe) → ClosenessSpace 𝓤 → 𝓤 ⊔ (𝓦 ⁺) ̇
csearchable𝓔 𝓦 X
= Σ 𝓔 ꞉ (decidable-uc-predicate 𝓦 X → ⟨ X ⟩)
, ((((p , d) , ϕ) : decidable-uc-predicate 𝓦 X)
→ (Σ x ꞉ ⟨ X ⟩ , (p x holds))
→ p (𝓔 ((p , d) , ϕ)) holds)
csearchable : (𝓦 : Universe) → ClosenessSpace 𝓤 → 𝓤 ⊔ (𝓦 ⁺) ̇
csearchable 𝓦 X
= (((p , d) , ϕ) : decidable-uc-predicate 𝓦 X)
→ Σ x₀ ꞉ ⟨ X ⟩ , ((Σ x ꞉ ⟨ X ⟩ , (p x holds)) → p x₀ holds)
csearchable→csearchable𝓔
: (X : ClosenessSpace 𝓤) → csearchable 𝓦 X → csearchable𝓔 𝓦 X
csearchable→csearchable𝓔 X S = (λ p → pr₁ (S p)) , (λ p → pr₂ (S p))
csearchable𝓔→csearchable
: (X : ClosenessSpace 𝓤) → csearchable𝓔 𝓦 X → csearchable 𝓦 X
csearchable𝓔→csearchable X (𝓔 , S) p = 𝓔 p , S p
searchable→csearchable : {𝓦 : Universe} (X : ClosenessSpace 𝓤)
→ searchable 𝓦 ⟨ X ⟩
→ csearchable 𝓦 X
searchable→csearchable X S ((p , d) , _) = S (p , d)
csearchable-pointed
: (𝓦 : Universe)
→ (X : ClosenessSpace 𝓤)
→ csearchable 𝓦 X
→ ⟨ X ⟩
csearchable-pointed 𝓦 X Sx
= pr₁ (Sx (((λ _ → ⊤) , (λ _ → inl ⋆)) , 0 , λ _ _ _ → id))
totally-bounded-csearchable : (X : ClosenessSpace 𝓤)
→ ⟨ X ⟩
→ (t : totally-bounded X 𝓤')
→ csearchable 𝓦 X
totally-bounded-csearchable {𝓤} {𝓤'} {𝓦} X x t ((p , d) , δ , ϕ)
= x₀ , γ
where
X' : 𝓤' ̇
X' = pr₁ (t δ)
g : X' → ⟨ X ⟩
g = pr₁ (pr₁ (pr₂ (t δ)))
h : ⟨ X ⟩ → X'
h = pr₁ (pr₂ (pr₁ (pr₂ (t δ))))
η : (x : ⟨ X ⟩) → C X δ x (g (h x))
η = pr₂ (pr₂ (pr₁ (pr₂ (t δ))))
f : finite-linear-order X'
f = pr₂ (pr₂ (t δ))
p' : decidable-predicate 𝓦 X'
p' = p ∘ g , d ∘ g
Sx : searchable 𝓦 X'
Sx = finite-searchable f (h x)
x'₀ : X'
x'₀ = pr₁ (Sx p')
γ' : (Σ x' ꞉ X' , p (g x') holds) → p (g x'₀) holds
γ' = pr₂ (Sx p')
x₀ : ⟨ X ⟩
x₀ = g x'₀
γ : (Σ x ꞉ ⟨ X ⟩ , p x holds) → p x₀ holds
γ (x , px) = γ' (h x , (ϕ x (g (h x)) (η x) px))
\end{code}