diff options
Diffstat (limited to 'src/CC/Term.idr')
-rw-r--r-- | src/CC/Term.idr | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/CC/Term.idr b/src/CC/Term.idr index 2bae041..1806904 100644 --- a/src/CC/Term.idr +++ b/src/CC/Term.idr @@ -1,6 +1,7 @@ module CC.Term import CC.Name +import CC.Thinning -- Definition ------------------------------------------------------------------ @@ -56,3 +57,64 @@ 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) |