module CC.Term import CC.Name import CC.Thinning -- Definition ------------------------------------------------------------------ public export Context : Type Context = SnocList Name public export data IsVar : Nat -> Name -> Context -> Type where Here : (eq : m ~~ n) -> IsVar 0 m (ctx :< n) There : IsVar k n ctx -> IsVar (S k) n (ctx :< _) public export data Term : Context -> Type where Var : (k : Nat) -> (0 n : Name) -> (0 prf : IsVar k n ctx) -> Term ctx Abs : (n : Name) -> Term (ctx :< n) -> Term ctx App : Term ctx -> Term ctx -> Term ctx Let : (n : Name) -> Term ctx -> Term (ctx :< n) -> Term ctx public export data Value : Context -> Type public export data Neutral : Context -> Type public export data Closure : Context -> Type public export data Env : (local, global : Context) -> Type where Lin : Env [<] global (:<) : Env local global -> (p : (Name, Lazy (Value global))) -> Env (local :< fst p) global data Closure : Context -> Type where Close : (n : Name) -> Env local global -> Term (local :< n) -> Closure global data Value where Ntrl : Neutral ctx -> Value ctx VAbs : Closure ctx -> Value ctx data Neutral where VVar : (k : Nat) -> (0 n : Name) -> (0 prf : IsVar k n ctx) -> Neutral ctx VApp : Neutral ctx -> Lazy (Value ctx) -> Neutral ctx %name IsVar prf %name Term t, u %name Value v %name Neutral n %name Closure close %name Env env -- Operations ------------------------------------------------------------------ export index : Env local global -> (k : Nat) -> (0 prf : IsVar k n local) -> Value global index (env :< (n, v)) 0 (Here eq) = v index (env :< _) (S k) (There prf) = index env k prf -- Weakening ------------------------------------------------------------------- wknVar' : forall src, tgt. {0 thin : src `Thins` tgt} -> (k : Nat) -> (0 prf : IsVar k n src) -> View thin -> Nat wknVar' k prf (Drop thin) = S (wknVar' k prf (view thin)) wknVar' 0 (Here eq) (Keep thin) = 0 wknVar' (S k) (There prf) (Keep thin) = S (wknVar' k prf (view thin)) wknIsVar' : forall src, tgt, k. {0 thin : src `Thins` tgt} -> (prf : IsVar k n src) -> (view : View thin) -> IsVar (wknVar' k prf view) n tgt wknIsVar' prf (Drop thin) = There (wknIsVar' prf (view thin)) wknIsVar' (Here eq) (Keep thin) = Here eq wknIsVar' (There prf) (Keep thin) = There (wknIsVar' prf (view thin)) export wknVar : src `Thins` tgt -> {k : Nat} -> (0 prf : IsVar k n src) -> Nat wknVar thin {k} prf = wknVar' k prf (view thin) export wknIsVar : (prf : IsVar k n src) -> (thin : src `Thins` tgt) -> IsVar (wknVar thin prf) n tgt wknIsVar prf thin = wknIsVar' prf (view thin) export wknTerm : Term src -> src `Thins` tgt -> Term tgt wknTerm (Var k n prf) thin = Var (wknVar thin prf) n (wknIsVar prf thin) wknTerm (Abs n t) thin = Abs n (wknTerm t (keep thin)) wknTerm (App t u) thin = App (wknTerm t thin) (wknTerm u thin) wknTerm (Let n t u) thin = Let n (wknTerm t thin) (wknTerm u (keep thin)) export wknNtrl : Neutral src -> src `Thins` tgt -> Neutral tgt export wknVal : Value src -> src `Thins` tgt -> Value tgt export wknClose : Closure src -> src `Thins` tgt -> Closure tgt export wknEnv : Env local src -> src `Thins` tgt -> Env local tgt wknNtrl (VVar k n prf) thin = VVar (wknVar thin prf) n (wknIsVar prf thin) wknNtrl (VApp n v) thin = VApp (wknNtrl n thin) (wknVal v thin) wknVal (Ntrl n) thin = Ntrl (wknNtrl n thin) wknVal (VAbs close) thin = VAbs (wknClose close thin) wknClose (Close n env t) thin = Close n (wknEnv env thin) t wknEnv [<] thin = [<] wknEnv (env :< (n, v)) thin = wknEnv env thin :< (n, wknVal v thin)