module Algebra.DecidableField.Base where
open import Level using (_⊔_; suc)
open import Relation.Binary.Core using (Rel)
open import Algebra.Core using (Op₁; Op₂)
open import Algebra.Apartness.Structures
open import Algebra.Apartness.Bundles
open import Algebra.Bundles
open import Relation.Binary.Definitions using (Decidable)
open import Relation.Nullary
open import Tactic.RingSolver.Core.AlmostCommutativeRing
open import Data.Maybe
open import Data.Product
import Algebra.Solver.CommutativeMonoid as CMSolver renaming (_⊕_ to infixl 5 _⊕_)
module _
{c ℓ₁ ℓ₂} {Carrier : Set c}
(_≈_ : Rel Carrier ℓ₁)
(_#_ : Rel Carrier ℓ₂)
(_+_ _*_ : Op₂ Carrier) (-_ : Op₁ Carrier) (0# 1# : Carrier)
where
data IneqEq (x y : Carrier) : Set (ℓ₁ ⊔ ℓ₂) where
sameIE : (x≈y : x ≈ y) (¬# : ¬ (x # y)) → IneqEq x y
diff : (x#y : x # y) (¬≈ : ¬ (x ≈ y)) → IneqEq x y
record IsDecidableField : Set (suc (c ⊔ ℓ₁ ⊔ ℓ₂)) where
field
isHeytingField : IsHeytingField _≈_ _#_ _+_ _*_ -_ 0# 1#
decidableInequality : Decidable _#_
_≟_ = decidableInequality
open IsHeytingField isHeytingField hiding (sym) public
_#≟_ : ∀ x y → IneqEq x y
x #≟ y with x ≟ y
... | yes x#y = diff x#y λ sameIE → tight _ _ .proj₂ sameIE x#y
... | no ¬x#y = sameIE (tight _ _ .proj₁ ¬x#y) ¬x#y
record DecidableField c ℓ₁ ℓ₂ : Set (suc (c ⊔ ℓ₁ ⊔ ℓ₂)) where
infix 8 -_
infixl 7 _*_
infixl 6 _+_
infix 4 _≈_ _#_
field
Carrier : Set c
_≈_ : Rel Carrier ℓ₁
_#_ : Rel Carrier ℓ₂
_+_ : Op₂ Carrier
_*_ : Op₂ Carrier
-_ : Op₁ Carrier
0# : Carrier
1# : Carrier
isDecidableField : IsDecidableField _≈_ _#_ _+_ _*_ -_ 0# 1#
open IsDecidableField isDecidableField public
heytingField : HeytingField c ℓ₁ ℓ₂
heytingField = record { isHeytingField = isHeytingField }
open HeytingField heytingField using (heytingCommutativeRing) public
open HeytingCommutativeRing heytingCommutativeRing using (commutativeRing; apartnessRelation) public
open CommutativeRing commutativeRing using (*-commutativeMonoid; +-commutativeMonoid; ring; rawRing; sym) public
almostCommutativeRing : AlmostCommutativeRing _ _
almostCommutativeRing = fromCommutativeRing commutativeRing ≟?
where
≟? : (x : Carrier) → Maybe (0# ≈ x)
≟? x with 0# ≟ x
... | yes _ = nothing
... | no 0#x = just (tight _ _ .proj₁ 0#x)
module *-solver = CMSolver *-commutativeMonoid
module +-solver = CMSolver +-commutativeMonoid