\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 E) = id E
  | imul-assoc : imul  prodMap imul (id E) = imul  prodMap (id E) 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 E) = id E
  | iadd-assoc : iadd  prodMap iadd (id E) = iadd  prodMap (id E) iadd  associator
  | iadd-comm : iadd  pair proj2 proj1 = iadd
  | inegative-left : iadd  pair inegative (id E) = izro  terminalMap

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