{-# OPTIONS --safe --without-K #-} module IK.Term.NormalForm.Base where open import IK.Term.Base --------------- -- Normal forms --------------- data Ne : Ctx → Ty → Set data Nf : Ctx → Ty → Set data Ne where var : Var Γ a → Ne Γ a app : Ne Γ (a ⇒ b) → Nf Γ a → Ne Γ b unbox : Ne ΓL (□ a) → LFExt Γ (ΓL #) ΓR → Ne Γ a data Nf where up : Ne Γ ι → Nf Γ ι lam : Nf (Γ `, a) b → Nf Γ (a ⇒ b) box : Nf (Γ #) a → Nf Γ (□ a) -- normal forms of substitutions (simply "do everything pointwise") data Nfₛ : Ctx → Ctx → Set where [] : Nfₛ Γ [] _`,_ : Nfₛ Γ Δ → Nf Γ a → Nfₛ Γ (Δ `, a) lock : Nfₛ ΔL Γ → LFExt Δ (ΔL #) ΔR → Nfₛ Δ (Γ #) Nfₛ- : Ctx → Ctx → Set Nfₛ- Δ Γ = Nfₛ Γ Δ -- embedding into terms embNe : Ne Γ a → Tm Γ a embNf : Nf Γ a → Tm Γ a embNe (var x) = var x embNe (app m n) = app (embNe m) (embNf n) embNe (unbox n x) = unbox (embNe n) x embNf (up x) = embNe x 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ₛ : Nfₛ Γ Δ → Sub Γ Δ embNfₛ [] = [] embNfₛ (n `, s) = embNfₛ n `, embNf s embNfₛ (lock n s) = lock (embNfₛ n) s -- weakening lemmas wkNe : Γ ⊆ Γ' → Ne Γ a → Ne Γ' a wkNf : Γ ⊆ Γ' → Nf Γ a → Nf Γ' a wkNe w (var x) = var (wkVar w x) wkNe w (app m n) = app (wkNe w m) (wkNf w n) wkNe w (unbox n e) = unbox (wkNe (sliceLeft e w) n) (wkLFExt e w) wkNf e (up x) = up (wkNe e x) wkNf e (lam n) = lam (wkNf (keep e) n) wkNf e (box n) = box (wkNf (keep# e) n)
Generated from commit 2fd14c996b195ef101dff8919e837907ca0a08aa.