Skip to content

CoNaturals.GenericConvergentSequence2

Martin Escardo, 14th January 2022.

An isomorphic copy of ℕ∞ defined in CoNaturals.GenericConvergentSequence.
The isomorphism is proved in CoNaturals.Equivalence.


{-# OPTIONS --safe --without-K #-}

module CoNaturals.GenericConvergentSequence2 where

open import MLTT.Spartan
open import MLTT.Two-Properties
open import Notation.CanonicalMap
open import TypeTopology.Cantor
open import UF.DiscreteAndSeparated
open import UF.FunExt
open import UF.NotNotStablePropositions
open import UF.Sets
open import UF.Subsingletons
open import UF.Subsingletons-FunExt

T-cantor : (  𝟚)  𝓤₀ ̇
T-cantor α = Σ n   , α n  

private
 T = T-cantor

has-at-most-one-₁ : (  𝟚)  𝓤₀ ̇
has-at-most-one-₁ α = is-prop (T α)

has-at-most-one-₁-is-prop : funext₀  (α :   𝟚)  is-prop (has-at-most-one-₁ α)
has-at-most-one-₁-is-prop fe α = being-prop-is-prop fe

ℕ∞' : 𝓤₀ ̇
ℕ∞' = Σ α  (  𝟚) , has-at-most-one-₁ α

ℕ∞'-to-ℕ→𝟚 : ℕ∞'  (  𝟚)
ℕ∞'-to-ℕ→𝟚 = pr₁

ℕ∞'-to-ℕ→𝟚-lc : funext₀  left-cancellable ℕ∞'-to-ℕ→𝟚
ℕ∞'-to-ℕ→𝟚-lc fe = pr₁-lc (being-prop-is-prop fe)

ℕ∞'-is-¬¬-separated : funext₀  is-¬¬-separated ℕ∞'
ℕ∞'-is-¬¬-separated fe = subtype-is-¬¬-separated
                         pr₁
                         (ℕ∞'-to-ℕ→𝟚-lc fe)
                         (Cantor-is-¬¬-separated fe)

ℕ∞'-is-set : funext₀  is-set ℕ∞'
ℕ∞'-is-set fe = ¬¬-separated-types-are-sets fe (ℕ∞'-is-¬¬-separated fe)

private
 ¬T : (  𝟚)  𝓤₀ ̇
 ¬T α = (n : )  α n  

not-T-gives-¬T : {α :   𝟚}  ¬ (T α)  ¬T α
not-T-gives-¬T {α} ϕ n = different-from-₁-equal-₀  (e : α n  )  ϕ (n , e))

¬T-gives-not-T : {α :   𝟚}  ¬T α  ¬ (T α)
¬T-gives-not-T {α} ψ (n , e) = zero-is-not-one ((ψ n)⁻¹  e)

to-T-= : {α :   𝟚}
          {n n' : }
         n  n'
         {e : α n  } {e' : α n'  }
         (n , e) =[ T α ] (n' , e')
to-T-= p = to-subtype-=  -  𝟚-is-set) p

from-T-= : {α :   𝟚}
          {n n' : }
         {e : α n  } {e' : α n'  }
         (n , e) =[ T α ] (n' , e')
         n  n'
from-T-= p = ap pr₁ p

index-uniqueness : (α :   𝟚)
                  is-prop (T α)
                  {n n' : }  α n    α n'    n  n'
index-uniqueness α i {n} {n'} e e' = from-T-= (i (n , e) (n' , e'))

index-uniqueness-converse : (α :   𝟚)
                           ({n n' : }  α n    α n'    n  n')
                           is-prop (T α)
index-uniqueness-converse α ϕ (n , e) (n' , e') = to-T-= (ϕ e e')

private
 instance
  canonical-map-ℕ∞'-ℕ→𝟚 : Canonical-Map ℕ∞' (  𝟚)
  ι {{canonical-map-ℕ∞'-ℕ→𝟚}} = ℕ∞'-to-ℕ→𝟚

ℕ∞'-to-ℕ→𝟚-at-most-one-₁ : (u : ℕ∞')  is-prop (T (ℕ∞'-to-ℕ→𝟚 u))
ℕ∞'-to-ℕ→𝟚-at-most-one-₁ = pr₂

ℕ∞'-index-uniqueness : (u : ℕ∞')
                      {n n' : }  ι u n    ι u n'    n  n'
ℕ∞'-index-uniqueness (α , i) = index-uniqueness α i

Zero' : ℕ∞'
Zero' = α , h
 where
  α :   𝟚
  α 0        = 
  α (succ n) = 

  i : is-prop (T α)
  i (0 , e) (0 , e') = to-T-= refl

  h : has-at-most-one-₁ α
  h (n , e) (n' , e') = to-T-= (index-uniqueness α i e e')

Succ' : ℕ∞'  ℕ∞'
Succ' (α , h) = cons  α , h'
 where
  h' : has-at-most-one-₁ (cons  α)
  h' (succ n , e) (succ n' , e') = to-T-= (ap succ (index-uniqueness α h e e'))

ℕ-to-ℕ∞' :   ℕ∞'
ℕ-to-ℕ∞' 0        = Zero'
ℕ-to-ℕ∞' (succ n) = Succ' (ℕ-to-ℕ∞' n)

private
 instance
  Canonical-Map-ℕ-ℕ∞' : Canonical-Map  ℕ∞'
  ι {{Canonical-Map-ℕ-ℕ∞'}} = ℕ-to-ℕ∞'

is-finite' : ℕ∞'  𝓤₀ ̇
is-finite' u@(α , a) = T α

being-finite'-is-prop : funext₀  (u : ℕ∞')  is-prop (is-finite' u)
being-finite'-is-prop fe₀ u@(α , a) = a

size' : {u : ℕ∞'}  is-finite' u  
size' (n , e) = n

size'-property : {u : ℕ∞'} (φ : is-finite' u)  ℕ∞'-to-ℕ→𝟚 u (size' {u} φ)  
size'-property (n , e) = e

Zero'-is-finite : is-finite' Zero'
Zero'-is-finite = 0 , refl

is-finite'-up : (u : ℕ∞')
               is-finite' u
               is-finite' (Succ' u)
is-finite'-up _ (n , e) = succ n , e

is-finite'-down : (u : ℕ∞')
                 is-finite' (Succ' u)
                 is-finite' u
is-finite'-down _ (succ n , e) = n , e

ℕ-to-ℕ∞'-is-finite' : (n : )  is-finite' (ι n)
ℕ-to-ℕ∞'-is-finite' 0        = Zero'-is-finite
ℕ-to-ℕ∞'-is-finite' (succ n) = is-finite'-up (ι n)
                                (ℕ-to-ℕ∞'-is-finite' n)

∞' : ℕ∞'
∞' =  _  ) ,  (n , e) (n' , e')  𝟘-elim (zero-is-not-one e))

not-finite'-is-∞' : funext₀  (u : ℕ∞')  ¬ is-finite' u  u  ∞'
not-finite'-is-∞' fe u ν = ℕ∞'-to-ℕ→𝟚-lc fe
                            (dfunext fe
                               i  different-from-₁-equal-₀
                                       (e : ℕ∞'-to-ℕ→𝟚 u i  )  ν (i , e))))

not-T-is-∞' : funext₀  (u : ℕ∞')  ¬ T (ι u)  u  ∞'
not-T-is-∞' fe u ν = ℕ∞'-to-ℕ→𝟚-lc fe (dfunext fe (not-T-gives-¬T ν))

is-infinite-∞' : ¬ is-finite' ∞'
is-infinite-∞' (n , e) = zero-is-not-one e