module Verona2024.DoubleNegation.Maximum where
open import Data.Nat
open import Data.Product
open import Data.Sum
module _ (⊥ : Set) where
¬_ : Set → Set
¬ X = X → ⊥
return : {X : Set} → X → ¬ ¬ X
return x k = k x
_⟫=_ : {X Y : Set} → ¬ ¬ X → (X → ¬ ¬ Y) → ¬ ¬ Y
m ⟫= f = λ k → m (λ x → f x k)
{-# TERMINATING #-}
maximum : ¬ ¬ (Σ[ n ∈ ℕ ] ((m : ℕ) → ¬ ¬ (n ≥ m)))
maximum = go 0
where
go : ℕ → ¬ ¬ (Σ[ n ∈ ℕ ] ((m : ℕ) → ¬ ¬ (n ≥ m)))
go n k = k (n , h)
where
h : (m : ℕ) → ¬ ¬ (n ≥ m)
h m with ≤-<-connex m n
... | inj₁ m≤n = return m≤n
... | inj₂ n<m = λ k' → go m k
absurd : ¬ ¬ (Σ[ n ∈ ℕ ] n ≥ suc n)
absurd = maximum ⟫= λ (n , h) → h (suc n) ⟫= λ n≥sucn → return (n , n≥sucn)