namespace http://cds.omdoc.org/examples

theory Magma : ?FOLEQNatDed =
  op : term ⟶ term ⟶ term # 1  2 prec 50


theory Semigroup : ?FOLEQNatDed =
  include ?Magma
  assoc: {x,y,z} ⊦ (x∘y)∘z ≐ x∘(y∘z)
  
  assocR: {x,y,z} ⊦ x∘(y∘z) ≐ (x∘y)∘z
        = [x,y,z] sym assoc

  assoc4:  {w,x,y,z} ⊦ ((w∘x)∘y)∘z ≐ w∘(x∘(y∘z))
        =  [w,x,y,z] trans3 (congT assoc [u]u∘z) assoc (congT assoc [u]w∘u)
  assoc4R: {w,x,y,z} ⊦ w∘(x∘(y∘z)) ≐ ((w∘x)∘y)∘z
        = [w,x,y,z] sym assoc4
  assoc5: {v,w,x,y,z} ⊦ (((v∘w)∘x)∘y)∘z ≐ v∘(w∘(x∘(y∘z)))
        = [v,w,x,y,z] trans4 (congT assoc4 [u]u∘z) assoc
                              (congT assoc [u]v∘u) (congT assoc [u]v∘(w∘u))


theory Commutative : ?FOLEQNatDed =
  include ?Magma
  comm: {x,y} ⊦ x∘y ≐ y∘x


theory Neutral : ?FOLEQNatDed =
  include ?Magma
  e  : term   
  neutLeft: {x} ⊦ x∘e ≐ x
  neutRight: {x} ⊦ x∘e ≐ x


theory Idempotent : ?FOLEQNatDed =
  include ?Magma
  idempotent: {x} ⊦ x∘x ≐ x


theory Monoid : ?FOLEQNatDed =
  include ?Semigroup
  include ?Neutral


theory Band : ?FOLEQNatDed =
  include ?Semigroup
  include ?Idempotent


theory Semilattice : ?FOLEQNatDed =
  include ?Band
  include ?Commutative