2
module Logic.Structure.Monoid where
4
import Logic.Equivalence
5
import Logic.Operations as Operations
7
open Logic.Equivalence using (Equivalence; module Equivalence)
10
data Monoid (A : Set)(Eq : Equivalence A) : Set where
14
(leftId : LeftIdentity Eq z _+_)
15
(rightId : RightIdentity Eq z _+_)
16
(assoc : Associative Eq _+_) ->
20
module Projections where
22
zero : {A : Set}{Eq : Equivalence A} -> Monoid A Eq -> A
23
zero (monoid z _ _ _ _) = z
25
plus : {A : Set}{Eq : Equivalence A} -> Monoid A Eq -> A -> A -> A
26
plus (monoid _ p _ _ _) = p
28
leftId : {A : Set}{Eq : Equivalence A}(Mon : Monoid A Eq) -> LeftIdentity Eq (zero Mon) (plus Mon)
29
leftId (monoid _ _ li _ _) = li
31
rightId : {A : Set}{Eq : Equivalence A}(Mon : Monoid A Eq) -> RightIdentity Eq (zero Mon) (plus Mon)
32
rightId (monoid _ _ _ ri _) = ri
34
assoc : {A : Set}{Eq : Equivalence A}(Mon : Monoid A Eq) -> Associative Eq (plus Mon)
35
assoc (monoid _ _ _ _ a) = a
37
module Monoid {A : Set}{Eq : Equivalence A}(Mon : Monoid A Eq) where
39
zero = Projections.zero Mon
40
_+_ = Projections.plus Mon
41
leftId = Projections.leftId Mon
42
rightId = Projections.rightId Mon
43
assoc = Projections.assoc Mon