summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChloe Brown <chloe.brown.00@outlook.com>2023-04-16 15:25:02 +0100
committerChloe Brown <chloe.brown.00@outlook.com>2023-04-16 15:25:02 +0100
commitcdcfdcd31ccfee2b2a491713b4527ca87dd586bf (patch)
treeede7122da2d42d2c8d95eaa509e94fc269432407 /src
parentdc9aa0cc59d67690e7eba1543a37c397e751429a (diff)
Define term reduction.
Diffstat (limited to 'src')
-rw-r--r--src/Core/Declarative.idr5
-rw-r--r--src/Core/Reduction.idr93
2 files changed, 98 insertions, 0 deletions
diff --git a/src/Core/Declarative.idr b/src/Core/Declarative.idr
index 38e6ccd..1292fc9 100644
--- a/src/Core/Declarative.idr
+++ b/src/Core/Declarative.idr
@@ -8,10 +8,15 @@ import Core.Thinning
-- Definition ------------------------------------------------------------------
+public export
data EnvWf : Env n -> Type
+public export
data TypeWf : Env n -> Term n -> Type
+public export
data TypeConv : Env n -> Term n -> Term n -> Type
+public export
data TermWf : Env n -> Term n -> Term n -> Type
+public export
data TermConv : Env n -> Term n -> Term n -> Term n -> Type
data EnvWf where
diff --git a/src/Core/Reduction.idr b/src/Core/Reduction.idr
new file mode 100644
index 0000000..40829f3
--- /dev/null
+++ b/src/Core/Reduction.idr
@@ -0,0 +1,93 @@
+module Core.Reduction
+
+import Core.Environment
+import Core.Declarative
+import Core.Term
+import Core.Term.Substitution
+import Core.Term.Thinned
+import Core.Thinning
+
+-- Definition ------------------------------------------------------------------
+
+public export
+data TermStep : Env n -> Term n -> Term n -> Term n -> Type where
+ AppStep :
+ TermStep env t u (Pi a b) ->
+ TermWf env v a ->
+ ---
+ TermStep env (App t v) (App u v) (subst b $ Wkn (id _) :< pure v)
+ PiBeta :
+ TypeWf env a ->
+ TermWf (env :< pure a) t b ->
+ TermWf env u a ->
+ ---
+ TermStep env
+ (App (Abs t) u)
+ (subst t $ Wkn (id _) :< pure u)
+ (subst b $ Wkn (id _) :< pure u)
+ ConvStep :
+ TermStep env t u a ->
+ TypeConv env a b ->
+ ---
+ TermStep env t u b
+
+public export
+TypeStep : Env n -> Term n -> Term n -> Type
+TypeStep env a b = TermStep env a b Set
+
+public export
+data ReflTransClosure : (refl : a -> Type) -> (step : a -> a -> Type) -> a -> a -> Type where
+ Refl :
+ {0 refl : a -> Type} ->
+ refl x ->
+ ---
+ ReflTransClosure refl step x x
+ Step :
+ {0 step : a -> a -> Type} ->
+ step x y ->
+ ReflTransClosure refl step y z ->
+ ---
+ ReflTransClosure refl step x z
+
+public export
+TypeReduce : Env n -> Term n -> Term n -> Type
+TypeReduce env = ReflTransClosure (TypeWf env) (TypeStep env)
+
+public export
+TermReduce : Env n -> Term n -> Term n -> Term n -> Type
+TermReduce env t u a = ReflTransClosure (\t => TermWf env t a) (\t, u => TermStep env t u a) t u
+
+%name TermStep step
+%name ReflTransClosure steps
+
+-- Respects Environment Quotient -----------------------------------------------
+
+export
+termStepRespEq : TermStep env1 t u a -> env1 =~= env2 -> TermStep env2 t u a
+termStepRespEq (AppStep step tmWf) prf =
+ AppStep
+ (termStepRespEq step prf)
+ (termWfRespEq tmWf prf)
+termStepRespEq (PiBeta tyWf tmWf tmWf1) prf =
+ PiBeta
+ (typeWfRespEq tyWf prf)
+ (termWfRespEq tmWf $ prf :< Refl)
+ (termWfRespEq tmWf1 prf)
+termStepRespEq (ConvStep step tyConv) prf =
+ ConvStep
+ (termStepRespEq step prf)
+ (typeConvRespEq tyConv prf)
+
+export
+typeStepRespEq : TypeStep env1 a b -> env1 =~= env2 -> TypeStep env2 a b
+typeStepRespEq = termStepRespEq
+
+export
+typeRedRespEq : TypeReduce env1 a b -> env1 =~= env2 -> TypeReduce env2 a b
+typeRedRespEq (Refl tyWf) prf = Refl (typeWfRespEq tyWf prf)
+typeRedRespEq (Step step steps) prf = Step (typeStepRespEq step prf) (typeRedRespEq steps prf)
+
+export
+termRedRespEq : TermReduce env1 t u a -> env1 =~= env2 -> TermReduce env2 t u a
+termRedRespEq (Refl tmWf) prf = Refl (termWfRespEq tmWf prf)
+termRedRespEq (Step step steps) prf = Step (termStepRespEq step prf) (termRedRespEq steps prf)