summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Brown <greg.brown01@ed.ac.uk>2024-01-26 15:19:06 +0000
committerGreg Brown <greg.brown01@ed.ac.uk>2024-01-26 15:19:06 +0000
commitc828b3fe3669132068b0cbcbe44d65edb5c6717e (patch)
treebe770fbea7fcaae624d73f853683299b26039878
parent5826a846d5c9be4a1b7718cf4193bc98627472c7 (diff)
Derive substitution structure for terms.
-rw-r--r--src/SOAS.idr64
1 files changed, 62 insertions, 2 deletions
diff --git a/src/SOAS.idr b/src/SOAS.idr
index cc1c8ad..eee2416 100644
--- a/src/SOAS.idr
+++ b/src/SOAS.idr
@@ -303,6 +303,66 @@ signature.TermAlg x = MkMetaAlg
, var = Va
}
+(.BoxTermAlg) :
+ (0 signature : type.SortedFunctor) ->
+ (str : Strength signature) =>
+ (functoriality : signature.Map) =>
+ (0 x : type.SortedFamily) ->
+ signature.MetaAlg x ([] (signature.Term x))
+signature.BoxTermAlg x = traverse Op Va (\m => Me m)
+
+(.TermPointedCoalg) :
+ (0 signature : type.SortedFunctor) ->
+ (str : Strength signature) =>
+ (functoriality : signature.Map) =>
+ (0 x : type.SortedFamily) ->
+ type.PointedCoalgStruct (signature.Term x)
+signature.TermPointedCoalg x = MkPointedCoalgStruct
+ { ren =
+ ([] (signature.Term x)).sem
+ {metalg = signature.BoxTermAlg x}
+ , var = Va
+ }
+
+(.SubstTermAlg) :
+ (0 signature : type.SortedFunctor) ->
+ (str : Strength signature) =>
+ (functoriality : signature.Map) =>
+ (0 x : type.SortedFamily) ->
+ signature.MetaAlg x (signature.Term x ^ signature.Term x)
+signature.SubstTermAlg x = traverse
+ { coalg = signature.TermPointedCoalg x
+ , alg = Op
+ , phi = id
+ , chi = \m => Me m
+ }
+
+%hint
+(.TermMon) :
+ (0 signature : type.SortedFunctor) ->
+ (str : Strength signature) =>
+ (functoriality : signature.Map) =>
+ (0 x : type.SortedFamily) ->
+ MonStruct (signature.Term x)
+signature.TermMon x = MkSubstMonoidStruct
+ { var = Va
+ , mult =
+ (signature.Term x ^ signature.Term x).sem
+ {metalg = signature.SubstTermAlg x}
+ }
+
+%hint
+(.TermMonoid) :
+ (0 signature : type.SortedFunctor) ->
+ (str : Strength signature) =>
+ (functoriality : signature.Map) =>
+ (0 x : type.SortedFamily) ->
+ signature.MonoidStruct (signature.Term x)
+signature.TermMonoid x = MkSignatureMonoid
+ { mon = signature.TermMon x
+ , alg = Op
+ }
+
-- Not sure these are useful
data (+) : (signature1, signature2 : type.SortedFunctor) ->
type.SortedFunctor where
@@ -366,8 +426,8 @@ Ex1 = Op $ Lam "x" $
beta : Singleton
{a = STLC .Term Var ty ctx}
(Op $ App (Op $ Lam x body) t) -> STLC .Term Var ty ctx
-beta (Val .(Op $ App (Op $ Lam x body) t)) =
- ?beta_rhs
+beta (Val (Op $ App (Op $ Lam x body) t)) =
+ (.sub) {mon = STLC .TermMon Var} body t -- bug: cannot determine mon automagically
Ex2 : STLC .Term Var (B -:> B) [<]
Ex2 = Op $ App