\import Category
\import Category.Limit
\open PrecatWithBprod
\open PrecatWithTerminal
\class BaseObject {C : CartesianPrecat} (E : C)

\class CMonoidObject \extends BaseObject
  | iide : Hom terminal.apex E
  | imul : Hom (Bprod E E) E
  | iide-left : imul  pair (iide  terminalMap) id = id
  | imul-assoc : imul  prodMap imul id = imul  prodMap id imul  associator
  | imul-comm : imul  pair proj2 proj1 = imul

\class AbGroupObject \extends BaseObject
  | izro : Hom terminal.apex E
  | iadd : Hom (Bprod E E) E
  | inegative : Hom E E
  | izro-left : iadd  pair (izro  terminalMap) id = id
  | iadd-assoc : iadd  prodMap iadd id = iadd  prodMap id iadd  associator
  | iadd-comm : iadd  pair proj2 proj1 = iadd
  | inegative-left : iadd  pair inegative id = izro  terminalMap

\class CRingObject \extends AbGroupObject, CMonoidObject
  | ildistr : imul  prodMap id iadd = iadd  prodMap imul imul  pair (prodMap id proj1) (prodMap id proj2)