Martin Escardo 2012.

The following says that a particular kind of discontinuity for
functions p : ℕ∞ → ₂ is a taboo. Equivalently, it says that the
convergence of the constant sequence ₀ to the number ₁ in the type
of binary numbers is a taboo. A Brouwerian continuity axiom is
that any convergent sequence in the type ₂ of binary numbers must
be eventually constant (which we don't postulate).

\begin{code}

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

module BasicDiscontinuityTaboo where

open import GenericConvergentSequence
open import WLPO
open import Two
open import CurryHoward
open import Equality
open import SetsAndFunctions

basic-discontinuity : (ℕ∞  )  Prp
basic-discontinuity p = (∀ n  p(under n)  )  p   


basic-discontinuity-taboo : 

 ∀(p : ℕ∞  )  basic-discontinuity p  WLPO

basic-discontinuity-taboo p (f , r) u = 
 two-equality-cases lemma₀ lemma₁
 where 
  fact₀ : u    p u  
  fact₀ t = trans (cong p t) r

  fact₁ : p u    u  
  fact₁ = contra-positive fact₀

  fact₂ : p u    u  
  fact₂ = fact₁  Lemma[b≡₀→b≢₁]

  lemma₀ : p u    u    u  
  lemma₀ s = in₁(fact₂ s)

  fact₃ : p u    (∀ n  u  under n)
  fact₃ t n s = 
   zero-is-not-one(Lemma[x≡y→x≡z→y≡z](f n)(Lemma[x≡y→x≡z→y≡z](cong p s) t))

  lemma₁ : p u    u    u  
  lemma₁ t = in₀(not-ℕ-is-∞ (fact₃ t))

\end{code}

The converse also holds. It shows that any proof of WLPO is a
discontinuous function, which we use to build a discontinuous function
of type ℕ∞ → ₂.

\begin{code}

WLPO-is-discontinuous : 

 WLPO   \(p : ℕ∞  )  basic-discontinuity p

WLPO-is-discontinuous f = ∃-intro p (∧-intro d d∞)
 where
  p : ℕ∞  
  p u = equality-cases (f u) case₀ case₁
   where
    case₀ : (r : u  )  f u  in₀ r  
    case₀ r s =      
    case₁ : (r : u  )  f u  in₁ r  
    case₁ r s =      

  d :  n  p(under n)  
  d n = equality-cases (f(under n)) case₀ case₁
   where
    case₀ : (r : under n  )  f(under n)  in₀ r  p(under n)  
    case₀ r s = ⊥-elim(∞-is-not-ℕ n (sym r))    
    case₁ : (g : under n  )  f(under n)  in₁ g  p(under n)  
    case₁ g = cong  t  equality-cases t  r s  )  r s  ))

  d∞ : p   
  d∞ = equality-cases (f ) case₀ case₁
   where
    case₀ : (r :   )  f   in₀ r  p   
    case₀ r = cong  t  equality-cases t  r s  )  r s  ))
    case₁ : (g :   )  f   in₁ g  p   
    case₁ g = ⊥-elim(g refl)

\end{code}

If two ₂-valued functions defined on ℕ∞ agree at ℕ, they have to agree
at ∞ too, unless WLPO holds:

\begin{code}

disagreement-taboo :

  ∀(p q : ℕ∞  )  (∀ n  p(under n)  q(under n))  p   q   WLPO

disagreement-taboo p q f g = basic-discontinuity-taboo r (r-lemma , r-lemma∞)
 where
  r : ℕ∞  
  r u = (p u)  (q u)

  r-lemma :  n  r(under n)  
  r-lemma n = Lemma[b≡c→b⊕c≡₀](f n)

  r-lemma∞ : r   
  r-lemma∞ = Lemma[b≢c→b⊕c≡₁] g

\end{code}