{-# OPTIONS --safe --without-K #-}
module IS4.Term.NormalForm.Base where
open import IS4.Term.Base
---------------
-- Normal forms
---------------
data Ne : Ctx → Ty → Set
data Nf : Ctx → Ty → Set
data Ne where
var : (v : Var Γ a) → Ne Γ a
app : (n : Ne Γ (a ⇒ b)) → (m : Nf Γ a) → Ne Γ b
unbox : (n : Ne ΓL (□ a)) → (e : CExt Γ ΓL ΓR) → Ne Γ a
data Nf where
up : (n : Ne Γ ι) → Nf Γ ι
lam : (n : Nf (Γ `, a) b) → Nf Γ (a ⇒ b)
box : (n : Nf (Γ #) a) → Nf Γ (□ a)
-- normal forms of substitutions (simply "do everything pointwise")
data Nfₛ : Ctx → Ctx → Set where
[] : Nfₛ Γ []
_`,_ : (n : Nfₛ Γ Δ) → (m : Nf Γ a) → Nfₛ Γ (Δ `, a)
lock : (n : Nfₛ ΔL Γ) → (e : CExt Δ ΔL ΔR) → Nfₛ Δ (Γ #)
Nfₛ- : (Δ : Ctx) → (Γ : Ctx) → Set
Nfₛ- Δ Γ = Nfₛ Γ Δ
-- embedding into terms
embNe : (n : Ne Γ a) → Tm Γ a
embNf : (n : Nf Γ a) → Tm Γ a
embNe (var v) = var v
embNe (app m n) = app (embNe m) (embNf n)
embNe (unbox n e) = unbox (embNe n) e
embNf (up n) = embNe n
embNf (lam n) = lam (embNf n)
embNf (box n) = box (embNf n)
-- embeddding of substitution normal forms back into substitutions (simply "do everything pointwise")
embNfₛ : (N : Nfₛ Γ Δ) → Sub Γ Δ
embNfₛ [] = []
embNfₛ (n `, m) = embNfₛ n `, embNf m
embNfₛ (lock n e) = lock (embNfₛ n) e
-- weakening lemmas
wkNe : (w : Γ ⊆ Γ') → (n : Ne Γ a) → Ne Γ' a
wkNf : (w : Γ ⊆ Γ') → (n : Nf Γ a) → Nf Γ' a
wkNe w (var v) = var (wkVar w v)
wkNe w (app n m) = app (wkNe w n) (wkNf w m)
wkNe w (unbox n e) = unbox (wkNe (factorWk e w) n) (factorExt e w)
wkNf e (up n) = up (wkNe e n)
wkNf e (lam n) = lam (wkNf (keep e) n)
wkNf e (box n) = box (wkNf (keep# e) n)
Generated from commit 2fd14c996b195ef101dff8919e837907ca0a08aa.