{-# OPTIONS --type-in-type
#-}
open import NeilPrelude
module CommSemiRing {A : Set}
(_⊕_ : Op A)
(⊕assoc : Associative _⊕_)
(⊕comm : Commutative _⊕_)
(zero : A) (unit⊕ : {a : A} → zero ⊕ a ≡ a)
(_⊗_ : Op A)
(⊗assoc : Associative _⊗_)
(⊗comm : Commutative _⊗_)
(zero⊗ : {a : A} → zero ⊗ a ≡ zero)
(one : A) (unit⊗ : {a : A} → one ⊗ a ≡ a)
(distrL : {a b c : A} → a ⊗ (b ⊕ c) ≡ (a ⊗ b) ⊕ (a ⊗ c))
where
import CommMonoid
open CommMonoid _⊗_ ⊗assoc ⊗comm one
⊗zero : {a : A} → a ⊗ zero ≡ zero
⊗zero = trans ⊗comm zero⊗
⊗unit : {a : A} → a ⊗ one ≡ a
⊗unit = ⊕unit unit⊗
distrR : {a b c : A} → (a ⊕ b) ⊗ c ≡ (a ⊗ c) ⊕ (b ⊗ c)
distrR = trans2 ⊗comm distrL (cong2 _⊕_ ⊗comm ⊗comm)
import SemiRingUnity
open SemiRingUnity _⊕_ ⊕assoc ⊕comm zero unit⊕ _⊗_ ⊗assoc zero⊗ ⊗zero one unit⊗ ⊗unit distrL distrR public