diff options
author | Greg Brown <greg.brown01@ed.ac.uk> | 2024-02-01 15:23:47 +0000 |
---|---|---|
committer | Greg Brown <greg.brown01@ed.ac.uk> | 2024-02-02 13:32:49 +0000 |
commit | 6dde244c14410ede6d41e9a8607016e23c19e320 (patch) | |
tree | d693694f65706b9653489effd15f27a40406ae43 /src/SOAS/Theory.idr | |
parent | d90419ce0740331c8ef9ecdd77e875b3367331d3 (diff) |
Split monolithic file into modules.
Prove metatheory for generic initial algebras, instead of a clunky
concrete one.
Diffstat (limited to 'src/SOAS/Theory.idr')
-rw-r--r-- | src/SOAS/Theory.idr | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/SOAS/Theory.idr b/src/SOAS/Theory.idr new file mode 100644 index 0000000..f36e7a1 --- /dev/null +++ b/src/SOAS/Theory.idr @@ -0,0 +1,58 @@ +module SOAS.Theory + +import SOAS.Algebra +import SOAS.Context +import SOAS.Family +import SOAS.Strength +import SOAS.Structure +import SOAS.Var + +public export +record (.Initial) + (signature : type.SortedFunctor) + (meta : type.SortedFamily) + (a : type.SortedFamily) where + constructor MkInitial + metalg : signature.MetaAlg meta a + bang : + (0 b : type.SortedFamily) -> + (metalg : signature.MetaAlg meta b) -> + a -|> b + +public export +(.sem) : + signature .Initial meta a -> + (0 b : type.SortedFamily) -> (metalg : signature.MetaAlg meta b) => + a -|> b +init.sem b = init.bang b metalg + +%hint +public export +(.pointedCoalgStruct) : + (functoriality : signature.Map) => + (str : Strength signature) => + signature.Initial meta a -> type.PointedCoalgStruct a +init.pointedCoalgStruct = MkPointedCoalgStruct + { ren = init.sem ([] a) @{traverse init.metalg.alg init.metalg.var init.metalg.mvar} + , var = init.metalg.var + } + + +%hint +public export +(.monStruct) : + (functoriality : signature.Map) => + (str : Strength signature) => + signature.Initial meta a -> type.MonStruct a +init.monStruct = MkSubstMonoidStruct + { var = init.metalg.var + , mult = init.sem (a ^ a) @{traverse init.metalg.alg id init.metalg.mvar} + } + +%hint +public export +(.monoidStruct) : + (functoriality : signature.Map) => + (str : Strength signature) => + signature.Initial meta a -> signature.MonoidStruct a +init.monoidStruct = MkSignatureMonoid { mon = init.monStruct , alg = init.metalg.alg } |