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 --safe --without-K #-}

open import MLTT.Spartan
open import UF.FunExt

module Taboos.BasicDiscontinuity (fe : funext₀) where

open import CoNaturals.Type

open import MLTT.Plus-Properties
open import MLTT.Two-Properties
open import Notation.CanonicalMap
open import Taboos.WLPO

basic-discontinuity : (ℕ∞ → 𝟚) → 𝓤₀ ̇
basic-discontinuity p = ((n : ℕ) → p (ι n) = ₀) × (p ∞ = ₁)

basic-discontinuity-taboo : (p : ℕ∞ → 𝟚)
                          → basic-discontinuity p
                          → WLPO
basic-discontinuity-taboo p (f , r) u = 𝟚-equality-cases lemma₀ lemma₁
 where
  fact₀ : u = ∞ → p u = ₁
  fact₀ t = p u =⟨ ap p t ⟩
            p ∞ =⟨ r ⟩
            ₁   ∎

  fact₁ : p u ≠ ₁ → u ≠ ∞
  fact₁ = contrapositive fact₀

  fact₂ : p u = ₀ → u ≠ ∞
  fact₂ = fact₁ ∘ equal-₀-different-from-₁

  lemma₀ : p u = ₀ → (u = ∞) + (u ≠ ∞)
  lemma₀ s = inr (fact₂ s)

  fact₃ : p u = ₁ → ((n : ℕ) → u ≠ ι n)
  fact₃ t n s = zero-is-not-one (₀       =⟨ (f n)⁻¹ ⟩
                                 p (ι n) =⟨ (ap p s)⁻¹ ⟩
                                 p u     =⟨ t ⟩
                                 ₁       ∎)

  lemma₁ : p u = ₁ → (u = ∞) + (u ≠ ∞)
  lemma₁ t = inl (not-finite-is-∞ fe (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 = p , (d , d∞)
 where
  p : ℕ∞ → 𝟚
  p u = equality-cases (f u) case₀ case₁
   where
    case₀ : (r : u = ∞) → f u = inl r → 𝟚
    case₀ r s = ₁

    case₁ : (r : u ≠ ∞) → f u = inr r → 𝟚
    case₁ r s = ₀

  d : (n : ℕ) → p (ι n) = ₀
  d n = equality-cases (f (ι n)) case₀ case₁
   where
    case₀ : (r : ι n = ∞) → f (ι n) = inl r → p (ι n) = ₀
    case₀ r s = 𝟘-elim (∞-is-not-finite n (r ⁻¹))

    case₁ : (g : ι n ≠ ∞) → f (ι n) = inr g → p (ι n) = ₀
    case₁ g = ap (λ - → equality-cases - (λ r s → ₁) (λ r s → ₀))

  d∞ : p ∞ = ₁
  d∞ = equality-cases (f ∞) case₀ case₁
   where
    case₀ : (r : ∞ = ∞) → f ∞ = inl r → p ∞ = ₁
    case₀ r = ap (λ - → equality-cases - (λ r s → ₁) (λ r s → ₀))

    case₁ : (g : ∞ ≠ ∞) → f ∞ = inr g → p ∞ = ₁
    case₁ g = 𝟘-elim (g refl)

\end{code}

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

\begin{code}

open import NotionsOfDecidability.Decidable
open import UF.DiscreteAndSeparated

module _ {D : 𝓤 ̇ } (d : is-discrete D) where

 disagreement-taboo' : (p q : ℕ∞ → D)
                     → ((n : ℕ) → p (ι n) = q (ι n))
                     → p ∞ ≠ q ∞
                     → WLPO
 disagreement-taboo' p q f g = basic-discontinuity-taboo r (r-lemma , r-lemma∞)
  where
   A : ℕ∞ → 𝓤 ̇
   A u = p u = q u

   δ : (u : ℕ∞) → is-decidable (p u = q u)
   δ u = d (p u) (q u)

   r : ℕ∞ → 𝟚
   r = characteristic-map A δ

   r-lemma : (n : ℕ) → r (ι n) = ₀
   r-lemma n = characteristic-map-property₀-back A δ (ι n) (f n)

   r-lemma∞ : r ∞ = ₁
   r-lemma∞ = characteristic-map-property₁-back A δ ∞ (λ a → g a)

 agreement-cotaboo' : ¬ WLPO
                    → (p q : ℕ∞ → D)
                    → ((n : ℕ) → p (ι n) = q (ι n))
                    → p ∞ = q ∞
 agreement-cotaboo' φ p q f = discrete-is-¬¬-separated d (p ∞) (q ∞)
                               (contrapositive (disagreement-taboo' p q f) φ)

disagreement-taboo : (p q : ℕ∞ → 𝟚)
                   → ((n : ℕ) → p (ι n) = q (ι n))
                   → p ∞ ≠ q ∞
                   → WLPO
disagreement-taboo = disagreement-taboo' 𝟚-is-discrete

agreement-cotaboo : ¬ WLPO
                  → (p q : ℕ∞ → 𝟚)
                  → ((n : ℕ) → p (ι n) = q (ι n))
                  → p ∞ = q ∞
agreement-cotaboo = agreement-cotaboo' 𝟚-is-discrete

\end{code}

Added 23rd August 2023. Variation.

\begin{code}

basic-discontinuity' : (ℕ∞ → ℕ∞) → 𝓤₀ ̇
basic-discontinuity' f = ((n : ℕ) → f (ι n) = ι 0) × (f ∞ = ι 1)

basic-discontinuity-taboo' : (f : ℕ∞ → ℕ∞)
                           → basic-discontinuity' f
                           → WLPO
basic-discontinuity-taboo' f (f₀ , f₁) = VI
 where
  I : (u : ℕ∞) → f u = ι 0 → u ≠ ∞
  I u p q = Zero-not-Succ
             (ι 0 =⟨ p ⁻¹ ⟩
              f u =⟨ ap f q ⟩
              f ∞ =⟨ f₁ ⟩
              ι 1 ∎)

  II : (u : ℕ∞) → f u ≠ ι 0 → u = ∞
  II u ν = not-finite-is-∞ fe III
   where
    III : (n : ℕ) → u ≠ ι n
    III n refl = V IV
     where
      IV : f (ι n) = ι 0
      IV = f₀ n

      V : f (ι n) ≠ ι 0
      V = ν

  VI : WLPO
  VI u = Cases (finite-isolated fe 0 (f u))
          (λ (p : ι 0 = f u) → inr (I u (p ⁻¹)))
          (λ (ν : ι 0 ≠ f u) → inl (II u (≠-sym ν)))

\end{code}

Added 13th November 2023.

\begin{code}

open import Notation.Order

ℕ∞-linearity-taboo : ((u v : ℕ∞) → (u ≼ v) + (v ≼ u))
                   → WLPO
ℕ∞-linearity-taboo δ = III
 where
  g : (u v : ℕ∞) → (u ≼ v) + (v ≼ u) → 𝟚
  g u v (inl _) = ₀
  g u v (inr _) = ₁

  f : ℕ∞ → ℕ∞ → 𝟚
  f u v = g u v (δ u v)

  I₀ : (n : ℕ) → f (ι n) ∞ = ₀
  I₀ n = a (δ (ι n) ∞)
   where
    a : (d : (ι n ≼ ∞) + (∞ ≼ ι n)) → g (ι n) ∞ d = ₀
    a (inl _) = refl
    a (inr ℓ) = 𝟘-elim (≼-gives-not-≺ ∞ (ι n) ℓ (∞-≺-largest n))

  I₁ : (n : ℕ) → f ∞ (ι n) = ₁
  I₁ n = b (δ ∞ (ι n))
   where
    b : (d : (∞ ≼ ι n) + (ι n ≼ ∞)) → g ∞ (ι n) d = ₁
    b (inl ℓ) = 𝟘-elim (≼-gives-not-≺ ∞ (ι n) ℓ (∞-≺-largest n))
    b (inr _) = refl

  II : (b : 𝟚) → f ∞ ∞ = b → WLPO
  II ₀ e = basic-discontinuity-taboo p II₀
   where
    p : ℕ∞ → 𝟚
    p x = complement (f ∞ x)

    II₀ : ((n : ℕ) → p (ι n) = ₀) × (p ∞ = ₁)
    II₀ = (λ n → p (ι n)                =⟨ refl ⟩
                 complement (f ∞ (ι n)) =⟨ ap complement (I₁ n) ⟩
                 complement ₁           =⟨ refl ⟩
                 ₀                      ∎) ,
           (p ∞                =⟨ refl ⟩
            complement (f ∞ ∞) =⟨ ap complement e ⟩
            complement ₀       =⟨ refl ⟩
            ₁                  ∎)
  II ₁ e = basic-discontinuity-taboo p II₁
   where
    p : ℕ∞ → 𝟚
    p x = f x ∞

    II₁ : ((n : ℕ) → p (ι n) = ₀) × (p ∞ = ₁)
    II₁ = I₀ , e

  III : WLPO
  III = II (f ∞ ∞) refl

\end{code}