{-# OPTIONS --type-in-type #-} open import NeilPrelude module Monoid {A : Set} (_⊕_ : Op A) (assoc : Associative _⊕_) (unit : A) (unit⊕' : {a : A} → unit ⊕ a ≡ a) (⊕unit' : {a : A} → a ⊕ unit ≡ a) where import SemiGroup open module SG = SemiGroup _⊕_ assoc unit⊕ : {a : A} → unit ⊕ a ≡ a unit⊕ = unit⊕' ⊕unit : {a : A} → a ⊕ unit ≡ a ⊕unit = ⊕unit' ⊕⊕unit : {a b : A} → a ⊕ (b ⊕ unit) ≡ a ⊕ b ⊕⊕unit = trans assocR ⊕unit unit⊕⊕ : {a b : A} → (unit ⊕ a) ⊕ b ≡ a ⊕ b unit⊕⊕ = trans assoc unit⊕