{-# OPTIONS --cubical --safe #-}

module Semirings where

open import Cubical.Foundations.Prelude

record Semiring a : Set (ℓ-suc a) where
  infixl 6 _+_
  infixl 7 _*_
  field
    R : Set a
    _+_ : R → R → R
    _*_ : R → R → R
    0# : R
    1# : R
    +-assoc : ∀ x y z → (x + y) + z ≡ x + (y + z)
    *-assoc : ∀ x y z → (x * y) * z ≡ x * (y * z)
    *0 : ∀ x → x * 0# ≡ 0#
    0* : ∀ x → 0# * x ≡ 0#
    0+ : ∀ x → 0# + x ≡ x
    *1 : ∀ x → x * 1# ≡ x
    1* : ∀ x → 1# * x ≡ x
    +-comm : ∀ x y → x + y ≡ y + x
    *⟨+⟩ : ∀ x y z → x * (y + z) ≡ x * y + x * z
    ⟨+⟩* : ∀ x y z → (x + y) * z ≡ x * z + y * z
    sIsSet : isSet R
  +0 : ∀ x → x + 0# ≡ x
  +0 x = +-comm x 0# ∙ 0+ x

record IdempotentSemiring a : Set (ℓ-suc a) where
  field
    semiring : Semiring a
  open Semiring semiring public
  field
    idem : ∀ x → x + x ≡ x