diff options
Diffstat (limited to 'src/CC')
-rw-r--r-- | src/CC/Term.idr | 62 | ||||
-rw-r--r-- | src/CC/Thinning.idr | 46 |
2 files changed, 108 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) diff --git a/src/CC/Thinning.idr b/src/CC/Thinning.idr new file mode 100644 index 0000000..284a230 --- /dev/null +++ b/src/CC/Thinning.idr @@ -0,0 +1,46 @@ +module CC.Thinning + +-- Definition ------------------------------------------------------------------ + +export +data Thins : (src, tgt : SnocList a) -> Type where + IsEmpty : [<] `Thins` [<] + IsDrop : src `Thins` tgt -> src `Thins` tgt :< x + IsKeep : src `Thins` tgt -> src :< x `Thins` tgt :< x + +%name Thins thin + +-- Operations ------------------------------------------------------------------ + +export +empty : [<] `Thins` [<] +empty = IsEmpty + +export +drop : src `Thins` tgt -> src `Thins` tgt :< x +drop thin = IsDrop thin + +export +keep : src `Thins` tgt -> src :< x `Thins` tgt :< x +keep thin = IsKeep thin + +export +id : {ctx : SnocList a} -> ctx `Thins` ctx +id {ctx = [<]} = empty +id {ctx = _ :< _} = keep id + +-- Views ----------------------------------------------------------------------- + +public export +data View : src `Thins` tgt -> Type where + Empty : View CC.Thinning.empty + Drop : (thin : src `Thins` tgt) -> View (drop thin) + Keep : (thin : src `Thins` tgt) -> View (keep thin) + +%name View view + +public export +view : (thin : src `Thins` tgt) -> View thin +view IsEmpty = Empty +view (IsDrop thin) = Drop thin +view (IsKeep thin) = Keep thin |