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}

\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}

\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 (≼-not-≺ ∞ (ι n) ℓ (∞-≺-largest n))

I₁ : (n : ℕ) → f ∞ (ι n) ＝ ₁
I₁ n = b (δ ∞ (ι n))
where
b : (d : (∞ ≼ ι n) + (ι n ≼ ∞)) → g ∞ (ι n) d ＝ ₁
b (inl ℓ) = 𝟘-elim (≼-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}