📥 Download raw
{-# OPTIONS --cubical-compatible #-}
module Padova2025.ComputationalContent.Dickson where

Case study: Dickson’s lemma

open import Padova2025.ProgrammingBasics.Naturals.Base
open import Padova2025.ProvingBasics.Connectives.Existential
open import Padova2025.ProvingBasics.Termination.Ordering
import Padova2025.ComputationalContent.DoubleNegation
import Padova2025.ComputationalContent.Fictions.Minima

The purpose of this module is to give a constructive proof of (a baby version of) Dickson’s lemma, using a constructively preposterous assertion as a central ingredient, namely the claim that every function ℕ → ℕ has a minimum.

In its basic form, Dickson’s lemma states that for every map α : ℕ → ℕ, there is a number i such that α i ≤ α (succ i).

The constructivization of the classical proof proceeds almost by magic:

Dickson : (  )  Set
Dickson α = Σ[ i   ] α i  α (succ i)
theorem : (α :   )  Dickson α
theorem α = escape do
  (i , p)  minimum α
  q        p (succ i)
  return (i , q)
  where
  open Padova2025.ComputationalContent.DoubleNegation  (Dickson α)
  open Padova2025.ComputationalContent.Fictions.Minima (Dickson α)
-- Equivalently:
-- theorem α = escape (minimum f ⟫= λ (i , p) → p (succ i) ⟫= λ fi≤fsucci → return (i , fi≤fsucci))
--   where
--   open Padova2025.ComputationalContent.DoubleNegation  (Dickson α)
--   open Padova2025.ComputationalContent.Fictions.Minima (Dickson α)

Arbitrarily good local minima

open import Padova2025.ProgrammingBasics.Naturals.Arithmetic
open import Padova2025.ProvingBasics.Connectives.More
open import Padova2025.ProgrammingBasics.Lists

A k-th order approximative minimum of a map α : ℕ → ℕ is a number n such that α n ≤ α (i + n) for all numbers i < n:

ApproximativeMinimum : (  )    Set
ApproximativeMinimum α k = Σ[ n   ] All  i  α n  α (i + n)) (upTo k)

Every true minimum is also a k-th order approximative minimum, for every number k. The following exercise demonstrates that the dynamical minimum computed by the minimum function also gives rise to such approximative minima.

arbitrarily-good-approximative-minimum : (α :   ) (k : )  ApproximativeMinimum α k
arbitrarily-good-approximative-minimum = {!!}