summaryrefslogtreecommitdiff
path: root/src/CC/Term.idr
diff options
context:
space:
mode:
authorChloe Brown <chloe.brown.00@outlook.com>2023-03-25 16:15:51 +0000
committerChloe Brown <chloe.brown.00@outlook.com>2023-03-25 16:15:51 +0000
commit0225730f5461e693386031a8f06085d2354d6537 (patch)
tree94929f78a1df48e30c809003f212e1f28514667f /src/CC/Term.idr
parentdc600f47e15ff59a46890ca32e5571e24ce00983 (diff)
Extract thinnings to a new module.
Also make the interface more abstract, so more efficient representations can be swapped in with less cost.
Diffstat (limited to 'src/CC/Term.idr')
-rw-r--r--src/CC/Term.idr62
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)