Martin Escardo, November 2023.

\begin{code}

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

module CoNaturals.Type2Properties where

open import CoNaturals.Type hiding (is-finite')
open import CoNaturals.GenericConvergentSequence2
open import CoNaturals.Equivalence
open import MLTT.Spartan
open import MLTT.Two-Properties
open import Notation.CanonicalMap
open import TypeTopology.Cantor
open import UF.DiscreteAndSeparated
open import UF.Equiv
open import UF.FunExt
open import UF.Subsingletons

private
 T = T-cantor
 ϕ = ϕ-cantor
 γ = γ-cantor

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

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


module _ (fe : funext₀) where

 open ℕ∞-equivalence fe

 trivial-fact : (i : )  ϕ (ℕ∞-to-ℕ→𝟚 ) i  
 trivial-fact 0        = refl
 trivial-fact (succ i) = refl

 Zero-preservation : ℕ∞-to-ℕ∞' Zero  Zero'
 Zero-preservation = to-subtype-= (has-at-most-one-₁-is-prop fe) (dfunext fe I)
  where
   I : ϕ (ι Zero)  ι Zero'
   I 0        = refl
   I (succ i) = trivial-fact 0

 Succ-preservation : (u : ℕ∞)  ℕ∞-to-ℕ∞' (Succ u)  Succ' (ℕ∞-to-ℕ∞' u)
 Succ-preservation u@(α , d) = to-subtype-= (has-at-most-one-₁-is-prop fe) II
  where
   I : ϕ (ℕ∞-to-ℕ→𝟚 (Succ u))  cons  (ι (ℕ∞-to-ℕ∞' u))
   I 0        = refl
   I (succ _) = refl

   II : ϕ (ℕ∞-to-ℕ→𝟚 (Succ u))  cons  (ι (ℕ∞-to-ℕ∞' u))
   II = dfunext fe I

 ∞-preservation : ℕ∞-to-ℕ∞'   ∞'
 ∞-preservation = to-subtype-= (has-at-most-one-₁-is-prop fe)
                   (dfunext fe trivial-fact)

 ∞-gives-∞' : (u : ℕ∞')  ℕ∞'-to-ℕ∞ u    u  ∞'
 ∞-gives-∞' u e =
  u                       =⟨ II₀ 
  ℕ∞-to-ℕ∞' (ℕ∞'-to-ℕ∞ u) =⟨ II₁ 
  ℕ∞-to-ℕ∞'              =⟨ II₂ 
  ∞'                      
  where
   II₀ = (inverses-are-sections' ℕ∞-to-ℕ∞'-≃ u)⁻¹
   II₁ = ap ℕ∞-to-ℕ∞' e
   II₂ = ∞-preservation

 ∞'-gives-∞ : (u : ℕ∞)  ℕ∞-to-ℕ∞' u  ∞'  u  
 ∞'-gives-∞ u e =
  u                       =⟨ (inverses-are-retractions' ℕ∞-to-ℕ∞'-≃ u)⁻¹ 
  ℕ∞'-to-ℕ∞ (ℕ∞-to-ℕ∞' u) =⟨ ap ℕ∞'-to-ℕ∞ e 
  ℕ∞'-to-ℕ∞ ∞'            =⟨ ap ℕ∞'-to-ℕ∞ (∞-preservation ⁻¹) 
  ℕ∞'-to-ℕ∞ (ℕ∞-to-ℕ∞' ) =⟨ inverses-are-retractions' ℕ∞-to-ℕ∞'-≃  
                         

 finite-preservation : (n : )  ℕ∞-to-ℕ∞' (ι n)  ι n
 finite-preservation 0        = Zero-preservation
 finite-preservation (succ n) =
  ℕ∞-to-ℕ∞' (ι (succ n))  =⟨ refl 
  ℕ∞-to-ℕ∞' (Succ (ι n))  =⟨ Succ-preservation (ι n) 
  Succ' (ℕ∞-to-ℕ∞' (ι n)) =⟨ ap Succ' (finite-preservation n) 
  Succ' (ι n)             =⟨ refl 
  ι (succ n)              

 finite-gives-finite' : (u : ℕ∞')  is-finite (ℕ∞'-to-ℕ∞ u)  is-finite' u
 finite-gives-finite' u (n , e) = III
  where
   I : is-finite' (ι n)
   I = ℕ-to-ℕ∞'-is-finite' n

   II = ι n                     =⟨ (finite-preservation n)⁻¹ 
        ℕ∞-to-ℕ∞' (ι n)         =⟨ ap ℕ∞-to-ℕ∞' e 
        ℕ∞-to-ℕ∞' (ℕ∞'-to-ℕ∞ u) =⟨ inverses-are-sections' ℕ∞-to-ℕ∞'-≃ u 
        u                       

   III : is-finite' u
   III = transport is-finite' II I

 finite'-preservation : (n : )  ℕ∞'-to-ℕ∞ (ι n)  ι n
 finite'-preservation n =
  ℕ∞'-to-ℕ∞ (ι n)             =⟨ I 
  ℕ∞'-to-ℕ∞ (ℕ∞-to-ℕ∞' (ι n)) =⟨ II 
  ι n                         
   where
    I  = (ap ℕ∞'-to-ℕ∞ (finite-preservation n))⁻¹
    II = inverses-are-retractions' ℕ∞-to-ℕ∞'-≃ (ι n)

 ℕ-to-ℕ∞'-lc : left-cancellable ℕ-to-ℕ∞'
 ℕ-to-ℕ∞'-lc {n} {n'} e =
  ℕ-to-ℕ∞-lc (
   ι n              =⟨ (finite'-preservation n)⁻¹ 
   ℕ∞'-to-ℕ∞ (ι n)  =⟨ ap ℕ∞'-to-ℕ∞ e 
   ℕ∞'-to-ℕ∞ (ι n') =⟨ finite'-preservation n' 
   ι n'             )

 ℕ-to-ℕ∞'-diagonal : (n : )  ℕ∞'-to-ℕ→𝟚 (ι n) n  
 ℕ-to-ℕ∞'-diagonal 0        = refl
 ℕ-to-ℕ∞'-diagonal (succ n) = ℕ-to-ℕ∞'-diagonal n

 diagonal-lemma : (n : ) (u : ℕ∞')  ℕ∞'-to-ℕ→𝟚 u n    u  ι n
 diagonal-lemma n u p = ℕ∞'-to-ℕ→𝟚-lc fe (dfunext fe f)
  where
   I : ℕ∞'-to-ℕ→𝟚 u n  ℕ∞'-to-ℕ→𝟚 (ι n) n
   I = ℕ∞'-to-ℕ→𝟚 u n     =⟨ p 
                         =⟨ (ℕ-to-ℕ∞'-diagonal n)⁻¹ 
       ℕ∞'-to-ℕ→𝟚 (ι n) n 

   II : (i : )  n  i  ℕ∞'-to-ℕ→𝟚 u i  ℕ∞'-to-ℕ→𝟚 (ι n) i
   II i ν =
    ℕ∞'-to-ℕ→𝟚 u i      =⟨ II₀ 
                       =⟨ II₁ ⁻¹ 
    ℕ∞'-to-ℕ→𝟚 (ι n) i  
     where
      II₀ = different-from-₁-equal-₀
              (e : ℕ∞'-to-ℕ→𝟚 u i  )
                    ν (ℕ∞'-index-uniqueness u p e))

      II₁ = different-from-₁-equal-₀
              (e : ℕ∞'-to-ℕ→𝟚 (ι n) i  )
                    ν (ℕ∞'-index-uniqueness (ι n) (ℕ-to-ℕ∞'-diagonal n) e))

   f : (i : )  ℕ∞'-to-ℕ→𝟚 u i  ℕ∞'-to-ℕ→𝟚 (ι n) i
   f i = Cases (ℕ-is-discrete n i)
           (q : n  i)
                 transport  -  ℕ∞'-to-ℕ→𝟚 u -  ℕ∞'-to-ℕ→𝟚 (ι n) -) q I)
           (ν : n  i)
                 II i ν)

 size'-property' : {u : ℕ∞'} (φ : is-finite' u)  ι (size' {u} φ)  u
 size'-property' {u} φ = II ⁻¹
  where
   I : ℕ∞'-to-ℕ→𝟚 u (size' {u} φ)  
   I = size'-property {u} φ

   II : u  ι (size' {u} φ)
   II = diagonal-lemma (size' {u} φ) u I

 finite'-is-natural : (u : ℕ∞')  is-finite' u  Σ n   , u  ι n
 finite'-is-natural u (n , p) = (n , diagonal-lemma n u p)

 finite'-gives-finite : (u : ℕ∞)  is-finite' (ℕ∞-to-ℕ∞' u)  is-finite u
 finite'-gives-finite u (n , e) = III
  where
   I : is-finite (ι n)
   I = ℕ-to-ℕ∞-is-finite n

   II = ι n                     =⟨ II₀ 
        ℕ∞'-to-ℕ∞ (ι n)         =⟨ II₁ 
        ℕ∞'-to-ℕ∞ (ℕ∞-to-ℕ∞' u) =⟨ II₂ 
        u                       
         where
          II₀ = (finite'-preservation n)⁻¹
          II₁ = ap ℕ∞'-to-ℕ∞ ((diagonal-lemma n (ℕ∞-to-ℕ∞' u) e)⁻¹)
          II₂ = inverses-are-retractions' ℕ∞-to-ℕ∞'-≃ u

   III : is-finite u
   III = transport is-finite II I

 finite'-isolated : (n : )  is-isolated (ℕ-to-ℕ∞' n)
 finite'-isolated n u = I (finite-isolated fe n (ℕ∞'-to-ℕ∞ u))
  where
   I : is-decidable (ι n  ℕ∞'-to-ℕ∞ u)  is-decidable (ι n  u)
   I (inl e) = inl (ι n                     =⟨ (finite-preservation n)⁻¹ 
                    ℕ∞-to-ℕ∞' (ι n)         =⟨ ap ℕ∞-to-ℕ∞' e 
                    ℕ∞-to-ℕ∞' (ℕ∞'-to-ℕ∞ u) =⟨ ℕ∞-ε u 
                    u                       )
   I (inr ν) = inr  (e : ι n  u)
                          ν (ι n             =⟨ (finite'-preservation n)⁻¹ 
                              ℕ∞'-to-ℕ∞ (ι n) =⟨ ap ℕ∞'-to-ℕ∞ e 
                              ℕ∞'-to-ℕ∞ u     ))

 ℕ∞'-equality-criterion : (x y : ℕ∞')
                         ((n : )  ι n  x  ι n  y)
                         ((n : )  ι n  y  ι n  x)
                         x  y
 ℕ∞'-equality-criterion x y f g = ℕ∞'-to-ℕ→𝟚-lc fe V
  where
   I : (n : ) (x y : ℕ∞')
      (ι n  x  ι n  y)
      ℕ∞'-to-ℕ→𝟚 x n ≤₂ ℕ∞'-to-ℕ→𝟚 y n
   I n x y h = ≤₂-criterion a
    where
     a : ℕ∞'-to-ℕ→𝟚 x n    ℕ∞'-to-ℕ→𝟚 y n  
     a e = ℕ∞'-to-ℕ→𝟚 y n     =⟨ (ap  -  - n) IV)⁻¹ 
           ℕ∞'-to-ℕ→𝟚 (ι n) n =⟨ ℕ-to-ℕ∞'-diagonal n 
                             
      where
       II : ι n  x
       II = (diagonal-lemma n x e)⁻¹

       III : ι n  y
       III = h II

       IV : ℕ∞'-to-ℕ→𝟚 (ι n)  ℕ∞'-to-ℕ→𝟚 y
       IV = ap ℕ∞'-to-ℕ→𝟚 III

   V : ℕ∞'-to-ℕ→𝟚 x  ℕ∞'-to-ℕ→𝟚 y
   V = dfunext fe  n  ≤₂-anti (I n x y (f n)) (I n y x (g n)))


 open import TypeTopology.TotallySeparated

 ℕ∞'-is-totally-separated : is-totally-separated ℕ∞'
 ℕ∞'-is-totally-separated = equiv-to-totally-separated
                             ℕ∞-to-ℕ∞'-≃
                             (ℕ∞-is-totally-separated fe)

\end{code}