summaryrefslogtreecommitdiff
path: root/src/CC
diff options
context:
space:
mode:
Diffstat (limited to 'src/CC')
-rw-r--r--src/CC/Term.idr62
-rw-r--r--src/CC/Thinning.idr46
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