{-# OPTIONS --type-in-type
    #-}

open import NeilPrelude

module SemiGroup {A : Set}

       (_⊕_  : Op A)
       (asso : Associative _⊕_)

where

import Magma
open Magma _⊕_

assoc : Associative _⊕_
assoc = asso

assocR : AssociativeR _⊕_
assocR = sym assoc 

assocB : {a b c d e : A}  (a  b)  c  (a  d)  e  a  (b  c)  a  (d  e)
assocB eq = trans2 assocR eq assoc

assocBR : {a b c d e : A}  a  (b  c)  a  (d  e)  (a  b)  c  (a  d)  e
assocBR eq = trans2 assoc eq assocR

assocLL : {a b c d : A}  ((a  b)  c)  d  a  (b  (c  d))
assocLL = trans assoc assoc

assocRR : {a b c d : A}  a  (b  (c  d))  ((a  b)  c)  d
assocRR = trans assocR assocR

assocRL : {a b c d : A}  a  (b  (c  d))  (a  (b  c))  d
assocRL = trans assocRR (cong2R _⊕_ assoc)

assocLR : {a b c d : A}  (a  (b  c))  d  a  (b  (c  d))
assocLR = sym assocRL