summaryrefslogtreecommitdiff
path: root/src/Obs/NormalForm/Normalise.idr
diff options
context:
space:
mode:
authorGreg Brown <greg.brown01@ed.ac.uk>2023-01-08 00:56:11 +0000
committerGreg Brown <greg.brown01@ed.ac.uk>2023-01-08 00:56:11 +0000
commit9af1a41a58575508c8d2dff6e7b25a5caac8aadc (patch)
tree51522621c0726b19216e13cb18ddc19483c48b54 /src/Obs/NormalForm/Normalise.idr
parent028685cef60b5d32e42a0951856e78f39165635a (diff)
Add box types.
Diffstat (limited to 'src/Obs/NormalForm/Normalise.idr')
-rw-r--r--src/Obs/NormalForm/Normalise.idr12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/Obs/NormalForm/Normalise.idr b/src/Obs/NormalForm/Normalise.idr
index a95e725..28d66da 100644
--- a/src/Obs/NormalForm/Normalise.idr
+++ b/src/Obs/NormalForm/Normalise.idr
@@ -443,6 +443,7 @@ doCastHelper
, second = second'
}
doCastHelper Bool Bool value = pure value
+doCastHelper (Box {prop = _}) (Box {prop = _}) value = pure $ Cnstr MkBox
doCastHelper oldType newType value = pure $ Ntrl $ CastStuck {oldType, newType, value}
doCast Irrelevant oldType newType value = pure Irrel
@@ -570,6 +571,12 @@ equalHelper
, element = returnElement
}
equalHelper Bool Bool = pure (Cnstr Top)
+equalHelper (Box {prop}) (Box {prop = prop'}) = doEqual
+ { rel = Relevant
+ , type = Cnstr (Universe Prop)
+ , left = prop
+ , right = prop'
+ }
equalHelper left right = pure $ Ntrl $ EqualStuck {left, right}
doEqualType : (left, right : TypeNormalForm ctx) -> LogNormalForm ann Relevant ctx
@@ -689,6 +696,7 @@ doEqual Relevant (Cnstr Bool) left right = do
whenLeftTrue <- doIf right (Cnstr Top) (Cnstr Bottom)
whenLeftFalse <- doIf right (Cnstr Bottom) (Cnstr Top)
doIf left whenLeftTrue whenLeftFalse
+doEqual Relevant (Cnstr (Box {prop})) left right = pure (Cnstr Top)
doEqual Relevant (Cnstr t) left right = inScope "wrong constructor for equal" $ fatal t
substDecl : DeclForm ~|> Hom (LogNormalForm' ann) (LogDeclForm ann)
@@ -714,6 +722,10 @@ substCnstr (Pair {indexRel, elementRel, prf, first, second}) f = do
substCnstr Bool f = pure Bool
substCnstr True f = pure True
substCnstr False f = pure False
+substCnstr (Box {prop}) f = do
+ prop <- subst' prop f
+ pure (Box {prop})
+substCnstr MkBox f = pure MkBox
substCnstr Top f = pure Top
substCnstr Bottom f = pure Bottom