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)