Martin Escardo 20-21 December 2012
Development adapted from the module ConvergentSequenceCompact:
Not only is ℕ∞ compact (or searchable), but, moreover, minimal
witnesses can be found.
\begin{code}
{-# OPTIONS --safe --without-K #-}
open import UF.FunExt
open import MLTT.Spartan
module TypeTopology.ConvergentSequenceHasInf (fe₀ : funext 𝓤₀ 𝓤₀) where
open import CoNaturals.Type
open import MLTT.Two-Properties
open import Notation.CanonicalMap
open import Notation.Order
open import Ordinals.InfProperty
ℕ∞-has-inf : has-inf _≼_
ℕ∞-has-inf p = a , putative-root-lemma , lower-bound-lemma , uborlb-lemma
where
α : ℕ → 𝟚
α 0 = p (ι 0)
α (succ n) = min𝟚 (α n) (p (ι (succ n)))
a : ℕ∞
a = (α , λ i → Lemma[minab≤₂a])
Dagger₀ : (n : ℕ) → a = ι n → p (ι n) = ₀
Dagger₀ 0 r = ap (λ - → ι - 0) r
Dagger₀ (succ n) r = p (ι (succ n)) =⟨ w ⟩
α (succ n) =⟨ t ⟩
₀ ∎
where
s : α n = ₁
s = ap (λ - → ι - n) r ∙ ℕ-to-ℕ∞-diagonal₁ n
t = α (succ n) =⟨ ap (λ - → ι - (succ n)) r ⟩
ι (ι (succ n)) (succ n) =⟨ ℕ-to-ℕ∞-diagonal₀ n ⟩
₀ ∎
w : p (ι (succ n)) = α (succ n)
w = (ap (λ - → min𝟚 - (p (ι (succ n)))) s)⁻¹
Dagger₁ : a = ∞ → (n : ℕ) → p (ι n) = ₁
Dagger₁ r 0 = ap (λ - → ι - 0) r
Dagger₁ r (succ n) = p (ι (succ n)) =⟨ w ⟩
α (succ n) =⟨ t ⟩
₁ ∎
where
s : α n = ₁
s = ap (λ - → ι - n) r
t : α (succ n) = ₁
t = ap (λ - → ι - (succ n)) r
w : p (ι (succ n)) = α (succ n)
w = (ap (λ - → min𝟚 - (p (ι (succ n)))) s)⁻¹
Claim₀ : p a = ₁ → (n : ℕ) → a ≠ ι n
Claim₀ r n s = equal-₁-different-from-₀ r (Lemma s)
where
Lemma : a = ι n → p a = ₀
Lemma t = p a =⟨ ap p t ⟩
p (ι n) =⟨ Dagger₀ n t ⟩
₀ ∎
Claim₁ : p a = ₁ → a = ∞
Claim₁ r = not-finite-is-∞ fe₀ (Claim₀ r)
Claim₂ : p a = ₁ → (n : ℕ) → p (ι n) = ₁
Claim₂ r = Dagger₁ (Claim₁ r)
Claim₃ : p a = ₁ → p ∞ = ₁
Claim₃ r = p ∞ =⟨ (ap p (Claim₁ r))⁻¹ ⟩
p a =⟨ r ⟩
₁ ∎
Lemma : p a = ₁ → (v : ℕ∞) → p v = ₁
Lemma r = ℕ∞-𝟚-density fe₀ (Claim₂ r) (Claim₃ r)
putative-root-lemma : (Σ u ꞉ ℕ∞ , p u = ₀) → p a = ₀
putative-root-lemma (x , r) = lemma claim
where
lemma : ¬ ((x : ℕ∞) → p x = ₁) → p a = ₀
lemma = different-from-₁-equal-₀ ∘ (contrapositive Lemma)
claim : ¬ ((x : ℕ∞) → p x = ₁)
claim f = equal-₁-different-from-₀ (f x) r
lower-bound-lemma : (u : ℕ∞)→ p u = ₀ → a ≼ u
lower-bound-lemma u r 0 s = lemma
where
claim₀ : ι u 0 = ₀ → p u = α 0
claim₀ t = ap p (is-Zero-equal-Zero fe₀ t)
claim₁ : ι u 0 = ₀ → ₀ = ₁
claim₁ t = ₀ =⟨ r ⁻¹ ⟩
p u =⟨ claim₀ t ⟩
α 0 =⟨ s ⟩
₁ ∎
lemma : ι u 0 = ₁
lemma = different-from-₀-equal-₁ (contrapositive claim₁ zero-is-not-one)
lower-bound-lemma u r (succ n) s = lemma
where
_ : min𝟚 (ι a n) (p (ι (succ n))) = ₁
_ = s
IH : ι a n = ₁ → ι u n = ₁
IH = lower-bound-lemma u r n
claim₀ : ι u n = ₁
claim₀ = IH (Lemma[min𝟚ab=₁→a=₁] s)
claim₁ : p (ι (succ n)) = ₁
claim₁ = Lemma[min𝟚ab=₁→b=₁]{(ι a n)} s
claim₂ : ι u (succ n) = ₀ → u = ι (succ n)
claim₂ = Succ-criterion fe₀ claim₀
claim₃ : ι u (succ n) = ₀ → p u = p (ι (succ n))
claim₃ t = ap p (claim₂ t)
claim₄ : ι u (succ n) = ₀ → p u = ₁
claim₄ t = p u =⟨ claim₃ t ⟩
p (ι (succ n)) =⟨ claim₁ ⟩
₁ ∎
claim₅ : ι u (succ n) ≠ ₀
claim₅ t = equal-₁-different-from-₀ (claim₄ t) r
lemma : ι u (succ n) = ₁
lemma = different-from-₀-equal-₁ claim₅
uborlb-lemma : (l : ℕ∞) → ((x : ℕ∞) → p x = ₀ → l ≼ x) → l ≼ a
uborlb-lemma l lower-bounder = 𝟚-equality-cases lemma₀ lemma₁
where
lemma₀ : p a = ₀ → l ≼ a
lemma₀ = lower-bounder a
lemma₁ : p a = ₁ → l ≼ a
lemma₁ r n x = ap (λ - → ι - n) (Claim₁ r)
\end{code}