module Algebra.Ring.Properties where open import Level open import Function open import Algebra open import Data.Product using (_,_) open import Relation.Unary module Units {ℓ ℓ'} (ring : Ring ℓ ℓ') where open Ring ring renaming (Carrier to R) open import Relation.Binary.Reasoning.Setoid setoid open import Algebra.Properties.Ring ring public 0Idempotent : 0# + 0# ≈ 0# 0Idempotent = +-identityˡ _ 0RightAnnihilates : (x : R) → (x * 0#) ≈ 0# 0RightAnnihilates x = x+x≈x⇒x≈0 _ (sym x·0-is-idempotent) where x·0-is-idempotent : x * 0# ≈ x * 0# + x * 0# x·0-is-idempotent = begin x * 0# ≈⟨ *-congˡ (sym 0Idempotent) ⟩ x * (0# + 0#) ≈⟨ distribˡ _ _ _ ⟩ (x * 0#) + (x * 0#) ∎ 0LeftAnnihilates : (x : R) → (0# * x) ≈ 0# 0LeftAnnihilates x = x+x≈x⇒x≈0 _ (sym 0·x-is-idempotent) where 0·x-is-idempotent : 0# * x ≈ 0# * x + 0# * x 0·x-is-idempotent = begin 0# * x ≈⟨ *-congʳ (sym 0Idempotent) ⟩ (0# + 0#) * x ≈⟨ distribʳ _ _ _ ⟩ (0# * x) + (0# * x) ∎ invertibleInverse : ∀ {r} → ((r⁻¹ , _) : Invertible _≈_ 1# _*_ (r - 0#)) → Invertible _≈_ 1# _*_ (r⁻¹ - 0#) invertibleInverse {r} (r⁻¹ , r⁻¹*r≈1 , r*r⁻¹≈1) = r , firstEq , secondEq where α : ∀ a b → a * - 0# ≈ - 0# * b α a b = begin a * - 0# ≈⟨ *-congˡ -0#≈0# ⟩ a * 0# ≈⟨ 0RightAnnihilates _ ⟩ 0# ≈˘⟨ 0LeftAnnihilates _ ⟩ 0# * b ≈˘⟨ *-congʳ -0#≈0# ⟩ - 0# * b ∎ firstEq = begin r * (r⁻¹ - 0#) ≈⟨ distribˡ _ _ _ ⟩ r * r⁻¹ + r * (- 0#) ≈⟨ +-congˡ (α _ _) ⟩ r * r⁻¹ + (- 0#) * r⁻¹ ≈˘⟨ distribʳ _ _ _ ⟩ (r - 0#) * r⁻¹ ≈⟨ r*r⁻¹≈1 ⟩ 1# ∎ secondEq = begin (r⁻¹ - 0#) * r ≈⟨ distribʳ _ _ _ ⟩ r⁻¹ * r + - 0# * r ≈˘⟨ +-congˡ (α _ _) ⟩ r⁻¹ * r + r⁻¹ * - 0# ≈˘⟨ distribˡ _ _ _ ⟩ r⁻¹ * (r - 0#) ≈⟨ r⁻¹*r≈1 ⟩ 1# ∎