open import Algebra.Core
open import Algebra.Apartness
import Relation.Binary.Reasoning.Setoid as ReasonSetoid
open import Data.Product
module Algebra.HeytingCommutativeRing.Properties
{c ℓ₁ ℓ₂} (HF : HeytingCommutativeRing c ℓ₁ ℓ₂) where
open HeytingCommutativeRing HF
open ReasonSetoid setoid
open import Algebra.Apartness.Properties.HeytingCommutativeRing HF public
open import Algebra.Definitions _≈_ using (Invertible)
open import Algebra.CommRing.Properties
open Units commutativeRing public
private variable
x y z : Carrier
cong-# : x ≈ y → x # z → y # z
cong-# {x} {y} {z} x≈y x#z = invertible⇒# (x-z⁻¹ , theo , theo2) where
InvXZ : Invertible 1# _*_ (x - z)
InvXZ = #⇒invertible x#z
x-z⁻¹ = InvXZ .proj₁
x-z⁻¹*x-z≈1# : x-z⁻¹ * (x - z) ≈ 1#
x-z⁻¹*x-z≈1# = InvXZ .proj₂ .proj₁
x-z*x-z⁻¹≈1# : (x - z) * x-z⁻¹ ≈ 1#
x-z*x-z⁻¹≈1# = InvXZ .proj₂ .proj₂
theo : x-z⁻¹ * (y - z) ≈ 1#
theo = begin
x-z⁻¹ * (y - z) ≈˘⟨ *-congˡ (+-congʳ x≈y) ⟩
x-z⁻¹ * (x - z) ≈⟨ x-z⁻¹*x-z≈1# ⟩
1# ∎
theo2 : (y - z) * x-z⁻¹ ≈ 1#
theo2 = trans (*-comm _ _) theo
x⁻¹#0 : (x : Carrier) (x#0 : x # 0#) (let x⁻¹ = #⇒invertible x#0 .proj₁) → x⁻¹ # 0#
x⁻¹#0 x x#0 = invertibleˡ⇒# (x , (begin
x * (x⁻¹ - 0#) ≈⟨ *-congˡ (x-0≈x _) ⟩
x * x⁻¹ ≈˘⟨ *-congʳ (x-0≈x _) ⟩
(x - 0#) * x⁻¹ ≈⟨ #⇒invertible x#0 .proj₂ .proj₂ ⟩
1# ∎)) where
x⁻¹ = #⇒invertible x#0 .proj₁
#0⇒invertible : (x#0 : x # 0#) → Invertible 1# _*_ x
#0⇒invertible {x} x#0 = x⁻¹ , x⁻¹*x≈1 , x*x⁻¹≈1 where
invX = #⇒invertible x#0
x⁻¹ = invX .proj₁
invX1 = invX .proj₂ .proj₁
invX2 = invX .proj₂ .proj₂
x⁻¹*x≈1 = begin
x⁻¹ * x ≈˘⟨ *-congˡ (x-0≈x _) ⟩
x⁻¹ * (x - 0#) ≈⟨ invX1 ⟩
1# ∎
x*x⁻¹≈1 = begin
x * x⁻¹ ≈˘⟨ *-congʳ (x-0≈x _) ⟩
(x - 0#) * x⁻¹ ≈⟨ invX2 ⟩
1# ∎
x#0*y≈0⇒y≈0 : ∀ {x y} → x # 0# → x * y ≈ 0# → y ≈ 0#
x#0*y≈0⇒y≈0 {x} {y} x#0 x*y≈0 with (x⁻¹ , invL , invR) ← #0⇒invertible x#0
= begin
y ≈˘⟨ *-identityˡ _ ⟩
1# * y ≈˘⟨ *-congʳ invL ⟩
x⁻¹ * x * y ≈⟨ *-assoc _ _ _ ⟩
x⁻¹ * (x * y) ≈⟨ *-congˡ x*y≈0 ⟩
x⁻¹ * 0# ≈⟨ zeroʳ _ ⟩
0# ∎