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)