module Term.NormalForm where
open import Prelude
open import Term
open import Term.Weakening renaming (lookup to lookupR)
open import Term.Substitution
open import Term.Reduction
open import Term.Reduction.Properties
private
variable
Γ Δ : Context
a : Ty
x : a ∈ Γ
t t' t'' u u' : Term Γ a
σ σ' : Sub Γ Δ
ρ : Wk Γ Δ
mutual
data Ne : Term Γ a → Set where
var : Ne (var x)
app : Ne t → Nf u → Ne (app t u)
data Nf : Term Γ a → Set where
ne : Ne t → Nf t
abs : Nf t → Nf (abs t)
mutual
wk-Ne : (ρ : Wk Γ Δ) {t : Term Δ a} (u : Ne t) → Ne (wk ρ t)
wk-Ne ρ var = var
wk-Ne ρ (app u x) = app (wk-Ne ρ u) (wk-Nf ρ x)
wk-Nf : (ρ : Wk Γ Δ) {t : Term Δ a} (u : Nf t) → Nf (wk ρ t)
wk-Nf ρ (ne x) = ne (wk-Ne ρ x)
wk-Nf ρ (abs n) = abs (wk-Nf (keep ρ) n)
mutual
noRedNe : Ne t → t ⟶ t' → ⊥
noRedNe var ()
noRedNe (app neu nf) (appl r) = noRedNe neu r
noRedNe (app neu nf) (appr r) = noRedNf nf r
noRedNf : Nf t → t ⟶ t' → ⊥
noRedNf (ne neu) r = noRedNe neu r
noRedNf (abs nf) (abs r) = noRedNf nf r