diff options
author | Chloe Brown <chloe.brown.00@outlook.com> | 2023-04-06 16:57:25 +0100 |
---|---|---|
committer | Chloe Brown <chloe.brown.00@outlook.com> | 2023-04-06 16:57:25 +0100 |
commit | 93aae7e34e7130d9541d3441079448f156d93477 (patch) | |
tree | 02900fd5e8588e7d04e5375488b70bb12aa4a788 /src/Core/Environment.idr | |
parent | fce659187d9e24e29ae23f7d8de078dcdc9dcfd4 (diff) |
Migrate Env to use Thinned.
Diffstat (limited to 'src/Core/Environment.idr')
-rw-r--r-- | src/Core/Environment.idr | 68 |
1 files changed, 24 insertions, 44 deletions
diff --git a/src/Core/Environment.idr b/src/Core/Environment.idr index ff484f4..a0a10f4 100644 --- a/src/Core/Environment.idr +++ b/src/Core/Environment.idr @@ -14,7 +14,7 @@ import Syntax.PreorderReasoning public export data Env : Context -> Type where Lin : Env [<] - Add : Env sx -> sy `Thins` sx -> Term sy -> Env (sx :< n) + Add : Env sx -> Thinned sx -> Env (sx :< n) %name Env env @@ -22,66 +22,46 @@ data Env : Context -> Type where public export (:<) : Env sx -> Term sx -> Env (sx :< n) -env :< t = Add env (id _) t +env :< t = Add env (t `Over` id sx) --- Operations ------------------------------------------------------------------ +-- Equality -------------------------------------------------------------------- -record IndexResult (sx : Context) where - constructor MkRes - {0 sy : Context} - val : Term sy - thin : sy `Thins` sx +namespace Eq + public export + data EnvEq : Env sx -> Env sx -> Type where + Base : EnvEq env env + (:<) : EnvEq env1 env2 -> expand t = expand u -> EnvEq (Add env1 t) (Add env2 u) -shift : IndexResult sx -> IndexResult (sx :< n) -shift (MkRes val thin) = MkRes val (drop thin n) + %name EnvEq prf -expand : IndexResult sx -> Term sx -expand (MkRes val thin) = wkn val thin +-- Indexing -------------------------------------------------------------------- -doIndex : Env sx -> {0 i : Var sx} -> View i -> IndexResult sx -doIndex (Add env thin t) Here = shift $ MkRes t thin -doIndex (Add env thin t) (There i) = shift $ doIndex env $ view i +doIndex : Env sx -> {0 i : Var sx} -> View i -> Thinned sx +doIndex (Add env t) Here = shift t (wkn1 _ _) +doIndex (Add env t) (There i) = shift (doIndex env $ view i) (wkn1 _ _) export index : Env sx -> Var sx -> Term sx index env i = expand $ doIndex env $ view i --- Equality -------------------------------------------------------------------- - -namespace Eq - public export - data EnvEq : Env sx -> Env sx -> Type where - Lin : EnvEq [<] [<] - (:<) : - EnvEq env1 env2 -> - Term.wkn t thin1 = wkn u thin2 -> - EnvEq (Add env1 thin1 t) (Add env2 thin2 u) - - %name EnvEq prf - -expandShift : (val : IndexResult sx) -> expand (shift val) = wkn (expand val) (drop (id sx) n) -expandShift (MkRes val thin) = sym $ Calc $ - |~ wkn (wkn val thin) (drop (id sx) n) - ~~ wkn val (drop (id sx) n . thin) ...(wknHomo val thin $ drop (id sx) n) - ~~ wkn val (drop (id sx . thin) n) ...(cong (wkn val) $ compLeftDrop (id sx) thin n) - ~~ wkn val (drop thin n) ...(cong (\thin => wkn val (drop thin n)) $ compLeftIdentity thin) +-- Respects Equality doIndexEqIsEq : - -- {env1, env2 : _} -> EnvEq env1 env2 -> {0 i : Var sx} -> (view : View i) -> expand (doIndex env1 view) = expand (doIndex env2 view) -doIndexEqIsEq {sx = sx :< n} ((:<) {t, u, thin1, thin2} prf eq) Here = Calc $ - |~ wkn t (drop thin1 n) - ~~ wkn (wkn t thin1) (drop (id sx) n) ...(expandShift (MkRes t thin1)) - ~~ wkn (wkn u thin2) (drop (id sx) n) ...(cong (\t => wkn t (drop (id sx) n)) $ eq) - ~~ wkn u (drop thin2 n) ...(sym $ expandShift (MkRes u thin2)) +doIndexEqIsEq Base view = Refl +doIndexEqIsEq {sx = sx :< n} ((:<) {t, u} prf eq) Here = Calc $ + |~ expand (shift t $ wkn1 sx n) + ~~ wkn (expand t) (wkn1 sx n) ...(expandShift t (wkn1 sx n)) + ~~ wkn (expand u) (wkn1 sx n) ...(cong (\t => wkn t (wkn1 sx n)) $ eq) + ~~ expand (shift u $ wkn1 sx n) ...(sym $ expandShift u (wkn1 sx n)) doIndexEqIsEq {sx = sx :< n} ((:<) {env1, env2} prf eq) (There i) = Calc $ - |~ expand (shift $ doIndex env1 $ view i) - ~~ wkn (expand $ doIndex env1 $ view i) (drop (id sx) n) ...(expandShift $ doIndex env1 $ view i) - ~~ wkn (expand $ doIndex env2 $ view i) (drop (id sx) n) ...(cong (\t => wkn t (drop (id sx) n)) $ doIndexEqIsEq prf (view i)) - ~~ expand (shift $ doIndex env2 $ view i) ...(sym $ expandShift $ doIndex env2 $ view i) + |~ expand (shift (doIndex env1 $ view i) (wkn1 sx n)) + ~~ wkn (expand (doIndex env1 $ view i)) (wkn1 sx n) ...(expandShift (doIndex env1 $ view i) (wkn1 sx n)) + ~~ wkn (expand (doIndex env2 $ view i)) (wkn1 sx n) ...(cong (\t => wkn t (wkn1 sx n)) $ doIndexEqIsEq prf (view i)) + ~~ expand (shift (doIndex env2 $ view i) (wkn1 sx n)) ...(sym $ expandShift (doIndex env2 $ view i) (wkn1 sx n)) export indexEqIsEq : EnvEq env1 env2 -> (i : Var sx) -> index env1 i = index env2 i |