{-# OPTIONS --cubical-compatible --safe #-}
open import Algebra.Bundles using (Semiring)
open import Data.Nat.Base as ℕ using (zero; suc)
module Algebra.Properties.Semiring.Mult
{a ℓ} (S : Semiring a ℓ) where
open Semiring S renaming (zero to *-zero)
open import Relation.Binary.Reasoning.Setoid setoid
open import Algebra.Definitions _≈_ using (_IdempotentOn_)
open import Algebra.Properties.Monoid.Mult +-monoid public
×-homo-0# : ∀ x → 0 × x ≈ 0# * x
×-homo-0# x = sym (zeroˡ x)
×-homo-1# : ∀ x → 1 × x ≈ 1# * x
×-homo-1# x = trans (×-homo-1 x) (sym (*-identityˡ x))
×-comm-* : ∀ n x y → x * (n × y) ≈ n × (x * y)
×-comm-* zero x y = zeroʳ x
×-comm-* (suc n) x y = begin
x * (suc n × y) ≡⟨⟩
x * (y + n × y) ≈⟨ distribˡ _ _ _ ⟩
x * y + x * (n × y) ≈⟨ +-congˡ (×-comm-* n _ _) ⟩
x * y + n × (x * y) ≡⟨⟩
suc n × (x * y) ∎
×-assoc-* : ∀ n x y → (n × x) * y ≈ n × (x * y)
×-assoc-* zero x y = zeroˡ y
×-assoc-* (suc n) x y = begin
(suc n × x) * y ≡⟨⟩
(x + n × x) * y ≈⟨ distribʳ _ _ _ ⟩
x * y + (n × x) * y ≈⟨ +-congˡ (×-assoc-* n _ _) ⟩
x * y + n × (x * y) ≡⟨⟩
suc n × (x * y) ∎
idem-×-homo-* : ∀ m n {x} → (_*_ IdempotentOn x) → (m × x) * (n × x) ≈ (m ℕ.* n) × x
idem-×-homo-* m n {x} idem = begin
(m × x) * (n × x) ≈⟨ ×-assoc-* m x (n × x) ⟩
m × (x * (n × x)) ≈⟨ ×-congʳ m (×-comm-* n x x) ⟩
m × (n × (x * x)) ≈⟨ ×-assocˡ _ m n ⟩
(m ℕ.* n) × (x * x) ≈⟨ ×-congʳ (m ℕ.* n) idem ⟩
(m ℕ.* n) × x ∎
×1-homo-* : ∀ m n → (m ℕ.* n) × 1# ≈ (m × 1#) * (n × 1#)
×1-homo-* m n = sym (idem-×-homo-* m n (*-identityʳ 1#))
1×-identityʳ = ×-homo-1
{-# WARNING_ON_USAGE 1×-identityʳ
"Warning: 1×-identityʳ was deprecated in v2.1.
Please use ×-homo-1 instead. "
#-}