{-# OPTIONS --erased-cubical #-}
module CantorNormalForm.WithPropositionalEquality.Hardy where
open import Agda.Builtin.Nat renaming (Nat to ℕ)
open import CantorNormalForm.WithPropositionalEquality.Base
open import CantorNormalForm.WithPropositionalEquality.Classifiability
open import PropTrunc
φ₀ : ℕ → ∥ ℕ ∥
φ₀ = λ k → ∣ k ∣
φₛ : (ℕ → ∥ ℕ ∥) → ℕ → ∥ ℕ ∥
φₛ = λ g n → g (suc n)
φₗ : (ℕ → ℕ → ∥ ℕ ∥) → ℕ → ∥ ℕ ∥
φₗ = λ h n → h n n
hardy : Cnf → ℕ → ∥ ℕ ∥
hardy = transfinite-rec φ₀ φₛ φₗ
{-
hardy zero n = ∣ n ∣
hardy (succ a) n = hardy a (suc n)
hardy (limit f) n = hardy (f n) n
-}
{-
-- "Higher-order" hierarchy from http://www-compsci.swan.ac.uk/~csulrich/ftp/fast.txt
τ : ℕ → Set
τ zero = ℕ → ∥ ℕ ∥
τ (suc n) = τ n → τ n
r : (n : ℕ) → (ℕ → τ n) → τ n
r zero = φₗ
r (suc n) u v = r n (λ k → u k v)
t : (n : ℕ) → τ n
t zero = φ₀
t (suc zero) = φₛ
t (suc (suc n)) v v' = r n (λ k → iter k v v')
t[_,_] : (n : ℕ) → Cnf → τ n
t[ n , 𝟎 ] = t n
t[ n , ω^ a + b [ r ] ] = t[ suc n , a ] t[ n , b ]
hardy-higher : Cnf → ℕ → ∥ ℕ ∥
hardy-higher x = t[ 0 , x ]
-}
n = 2
m = 2
-- testC = hardy-higher (ω^⟨ NtoC n ⟩) m
testC2 = hardy (ω^⟨ NtoC n ⟩) m
-- As n increases, testC becomes more efficient, but the difference to testC2 is not big.
-- Fixing n = 2, as m inreases, the difference between testC and testC2 becomes bigger.
-- Try n = 2 and m = 15.