Ayberk Tosun
Finished on 31 August 2023.
\begin{code}
{-# OPTIONS --safe --without-K #-}
open import UF.FunExt
module EffectfulForcing.Internal.Degrees (fe : Fun-Ext) where
open import MLTT.Spartan
open import EffectfulForcing.MFPSAndVariations.SystemT
using (type; ι; _⇒_;〖_〗)
open import Naturals.Order using (max)
open import EffectfulForcing.Internal.SystemT
\end{code}
The degree of a type is the height of the tallest exponent tower involved in it.
\begin{code}
degree : type → ℕ
degree ι = 0
degree (τ₁ ⇒ τ₂) = max (succ (degree τ₁)) (degree τ₂)
\end{code}
Some examples of `degree`.
\begin{code}
degree-example₁ : degree (ι ⇒ ι) = 1
degree-example₁ = refl
degree-example₂ : degree (ι ⇒ (ι ⇒ ι)) = 1
degree-example₂ = refl
degree-example₃ : degree ((ι ⇒ ι) ⇒ ι) = 2
degree-example₃ = refl
\end{code}
\begin{code}
rank : {Γ : Cxt} {τ : type} → T Γ τ → ℕ
rank {_} {ι} Zero = 0
rank {_} {ι} (Succ t) = rank t
rank {_} {ι} (Rec t t₁ t₂) = max (rank t₁) (rank t₂)
rank {_} {τ@(_ ⇒ _)} (Rec t t₁ t₂) = max (max (degree τ) (rank t₁)) (rank t₂)
rank {_} {ι} (ν i) = 0
rank {_} {_ ⇒ _} (ν i) = 0
rank {_} {τ} (ƛ t) = rank t
rank {_} {_} (t₁ · t₂) = max (rank t₁) (rank t₂)
\end{code}