summaryrefslogtreecommitdiff
path: root/src/Obs/Abstract.idr
diff options
context:
space:
mode:
authorGreg Brown <greg.brown01@ed.ac.uk>2023-01-05 17:06:33 +0000
committerGreg Brown <greg.brown01@ed.ac.uk>2023-01-05 17:06:33 +0000
commit06bd13433cb5e7edcff551454107c9d4e4d88f8f (patch)
treea2eae19d92df1564290f3ff53c68587d0d696384 /src/Obs/Abstract.idr
parent3950a84c00f54ab39f2a209c368cc02460eeebd7 (diff)
Add more program structure to normal forms.
Diffstat (limited to 'src/Obs/Abstract.idr')
-rw-r--r--src/Obs/Abstract.idr46
1 files changed, 31 insertions, 15 deletions
diff --git a/src/Obs/Abstract.idr b/src/Obs/Abstract.idr
index 039f60e..4ef3f43 100644
--- a/src/Obs/Abstract.idr
+++ b/src/Obs/Abstract.idr
@@ -18,29 +18,45 @@ Context n = List (String, Fin n)
bind : Context n -> String -> Context (S n)
bind ctx str = (str, 0) :: map (mapSnd FS) ctx
-abstractSyntax : Context n -> Syntax -> Logging ann (Term n)
abstractSyntaxBounds : Context n -> WithBounds Syntax -> Logging ann (WithBounds (Term n))
+abstractDecl : Context n -> DeclForm -> Logging ann (DeclForm n)
+abstractDecl ctx (MkDecl var type) = do
+ type <- abstractSyntaxBounds ctx type
+ pure (MkDecl var type)
+
+abstractLambda : Context n -> LambdaForm -> Logging ann (LambdaForm n)
+abstractLambda ctx (MkLambda var body) = do
+ body <- abstractSyntaxBounds (bind ctx var.val) body
+ pure (MkLambda var body)
+
+abstractSyntax : Context n -> Syntax -> Logging ann (Term n)
abstractSyntax ctx (Var {var}) = do
let Just i = lookup var ctx
| Nothing => inScope "unbound variable" $ fatal var
pure (Var {var, i})
abstractSyntax ctx (Universe {s}) = pure (Universe {s})
-abstractSyntax ctx (Pi {var, domain, codomain}) = do
- domain <- abstractSyntaxBounds ctx domain
- codomain <- abstractSyntaxBounds (bind ctx var.val) codomain
- pure (Pi {var, domain, codomain})
-abstractSyntax ctx (Lambda {var, body}) = do
- body <- abstractSyntaxBounds (bind ctx var.val) body
- pure (Lambda {var, body})
+abstractSyntax ctx (Pi {domain, codomain}) = do
+ domain <- abstractDecl ctx domain
+
+ let ctx = bind ctx domain.var.val
+ codomain <- abstractSyntaxBounds ctx codomain
+
+ pure (Pi {domain, codomain})
+abstractSyntax ctx (Lambda {body}) = do
+ body <- abstractLambda ctx body
+ pure (Lambda {body})
abstractSyntax ctx (App {fun, arg}) = do
fun <- abstractSyntaxBounds ctx fun
arg <- abstractSyntaxBounds ctx arg
pure (App {fun, arg})
-abstractSyntax ctx (Sigma {var, index, element}) = do
- index <- abstractSyntaxBounds ctx index
- element <- abstractSyntaxBounds (bind ctx var.val) element
- pure (Sigma {var, index, element})
+abstractSyntax ctx (Sigma {index, element}) = do
+ index <- abstractDecl ctx index
+
+ let ctx = bind ctx index.var.val
+ element <- abstractSyntaxBounds ctx element
+
+ pure (Sigma {index, element})
abstractSyntax ctx (Pair {first, second}) = do
first <- abstractSyntaxBounds ctx first
second <- abstractSyntaxBounds ctx second
@@ -54,12 +70,12 @@ abstractSyntax ctx (Second {arg}) = do
abstractSyntax ctx Bool = pure Bool
abstractSyntax ctx True = pure True
abstractSyntax ctx False = pure False
-abstractSyntax ctx (If {var, returnType, discriminant, true, false}) = do
- returnType <- abstractSyntaxBounds (bind ctx var.val) returnType
+abstractSyntax ctx (If {returnType, discriminant, true, false}) = do
+ returnType <- abstractLambda ctx returnType
discriminant <- abstractSyntaxBounds ctx discriminant
true <- abstractSyntaxBounds ctx true
false <- abstractSyntaxBounds ctx false
- pure (If {var, returnType, discriminant, true, false})
+ pure (If {returnType, discriminant, true, false})
abstractSyntax ctx Top = pure Top
abstractSyntax ctx Point = pure Point
abstractSyntax ctx Bottom = pure Bottom