diff --git a/CHANGELOG.md b/CHANGELOG.md index 468a6e6915..895cbe789c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,11 @@ Non-backwards compatible changes Minor improvements ------------------ +* [Issue #2502](https://github.com/agda/agda-stdlib/issues/2502) The module + `Algebra.Consequences.Base` now takes the underlying equality relation as + an additional top-level parameter, with slightly improved ergonomics wrt + subsequent imports by clients, as well as streamlined internals. + Deprecated modules ------------------ diff --git a/src/Algebra/Consequences/Base.agda b/src/Algebra/Consequences/Base.agda index 574ad48a16..2cedb9a5aa 100644 --- a/src/Algebra/Consequences/Base.agda +++ b/src/Algebra/Consequences/Base.agda @@ -7,26 +7,34 @@ {-# OPTIONS --cubical-compatible --safe #-} +open import Relation.Binary.Core using (Rel) + module Algebra.Consequences.Base - {a} {A : Set a} where + {a ℓ} {A : Set a} (_≈_ : Rel A ℓ) where -open import Algebra.Core -open import Algebra.Definitions -open import Data.Sum.Base -open import Relation.Binary.Core +open import Algebra.Core using (Op₁; Op₂) +open import Algebra.Definitions _≈_ +open import Data.Sum.Base using (reduce) open import Relation.Binary.Definitions using (Reflexive) -module _ {ℓ} {_•_ : Op₂ A} (_≈_ : Rel A ℓ) where +private + variable + f : Op₁ A + _∙_ : Op₂ A + +------------------------------------------------------------------------ +-- Selective - sel⇒idem : Selective _≈_ _•_ → Idempotent _≈_ _•_ - sel⇒idem sel x = reduce (sel x x) +sel⇒idem : Selective _∙_ → Idempotent _∙_ +sel⇒idem sel x = reduce (sel x x) + +------------------------------------------------------------------------ +-- SelfInverse -module _ {ℓ} {f : Op₁ A} (_≈_ : Rel A ℓ) where +reflexive∧selfInverse⇒involutive : Reflexive _≈_ → SelfInverse f → + Involutive f +reflexive∧selfInverse⇒involutive refl inv _ = inv refl - reflexive∧selfInverse⇒involutive : Reflexive _≈_ → - SelfInverse _≈_ f → - Involutive _≈_ f - reflexive∧selfInverse⇒involutive refl inv _ = inv refl ------------------------------------------------------------------------ -- DEPRECATED NAMES diff --git a/src/Algebra/Consequences/Propositional.agda b/src/Algebra/Consequences/Propositional.agda index 29490cbd0c..14451e6e3e 100644 --- a/src/Algebra/Consequences/Propositional.agda +++ b/src/Algebra/Consequences/Propositional.agda @@ -20,10 +20,17 @@ open import Relation.Binary.PropositionalEquality.Properties using (setoid) open import Relation.Unary using (Pred) -open import Algebra.Core +open import Algebra.Core using (Op₁; Op₂) open import Algebra.Definitions {A = A} _≡_ import Algebra.Consequences.Setoid (setoid A) as Base +private + variable + e ε 0# : A + f _⁻¹ -_ : Op₁ A + _∙_ _◦_ _+_ _*_ : Op₂ A + + ------------------------------------------------------------------------ -- Re-export all proofs that don't require congruence or substitutivity @@ -41,7 +48,6 @@ open Base public ; comm⇒sym[distribˡ] ; subst∧comm⇒sym ; wlog - ; sel⇒idem -- plus all the deprecated versions of the above ; comm+assoc⇒middleFour ; identity+middleFour⇒assoc @@ -58,39 +64,35 @@ open Base public ------------------------------------------------------------------------ -- Group-like structures -module _ {_∙_ _⁻¹ ε} where - - assoc∧id∧invʳ⇒invˡ-unique : Associative _∙_ → Identity ε _∙_ → - RightInverse ε _⁻¹ _∙_ → - ∀ x y → (x ∙ y) ≡ ε → x ≡ (y ⁻¹) - assoc∧id∧invʳ⇒invˡ-unique = Base.assoc∧id∧invʳ⇒invˡ-unique (cong₂ _) +assoc∧id∧invʳ⇒invˡ-unique : Associative _∙_ → Identity ε _∙_ → + RightInverse ε _⁻¹ _∙_ → + ∀ x y → (x ∙ y) ≡ ε → x ≡ (y ⁻¹) +assoc∧id∧invʳ⇒invˡ-unique = Base.assoc∧id∧invʳ⇒invˡ-unique (cong₂ _) - assoc∧id∧invˡ⇒invʳ-unique : Associative _∙_ → Identity ε _∙_ → - LeftInverse ε _⁻¹ _∙_ → - ∀ x y → (x ∙ y) ≡ ε → y ≡ (x ⁻¹) - assoc∧id∧invˡ⇒invʳ-unique = Base.assoc∧id∧invˡ⇒invʳ-unique (cong₂ _) +assoc∧id∧invˡ⇒invʳ-unique : Associative _∙_ → Identity ε _∙_ → + LeftInverse ε _⁻¹ _∙_ → + ∀ x y → (x ∙ y) ≡ ε → y ≡ (x ⁻¹) +assoc∧id∧invˡ⇒invʳ-unique = Base.assoc∧id∧invˡ⇒invʳ-unique (cong₂ _) ------------------------------------------------------------------------ -- Ring-like structures -module _ {_+_ _*_ -_ 0#} where +assoc∧distribʳ∧idʳ∧invʳ⇒zeˡ : Associative _+_ → _*_ DistributesOverʳ _+_ → + RightIdentity 0# _+_ → RightInverse 0# -_ _+_ → + LeftZero 0# _*_ +assoc∧distribʳ∧idʳ∧invʳ⇒zeˡ {_+_ = _+_} {_*_ = _*_} = + Base.assoc∧distribʳ∧idʳ∧invʳ⇒zeˡ (cong₂ _+_) (cong₂ _*_) - assoc∧distribʳ∧idʳ∧invʳ⇒zeˡ : Associative _+_ → _*_ DistributesOverʳ _+_ → - RightIdentity 0# _+_ → RightInverse 0# -_ _+_ → - LeftZero 0# _*_ - assoc∧distribʳ∧idʳ∧invʳ⇒zeˡ = - Base.assoc∧distribʳ∧idʳ∧invʳ⇒zeˡ (cong₂ _+_) (cong₂ _*_) - - assoc∧distribˡ∧idʳ∧invʳ⇒zeʳ : Associative _+_ → _*_ DistributesOverˡ _+_ → - RightIdentity 0# _+_ → RightInverse 0# -_ _+_ → - RightZero 0# _*_ - assoc∧distribˡ∧idʳ∧invʳ⇒zeʳ = - Base.assoc∧distribˡ∧idʳ∧invʳ⇒zeʳ (cong₂ _+_) (cong₂ _*_) +assoc∧distribˡ∧idʳ∧invʳ⇒zeʳ : Associative _+_ → _*_ DistributesOverˡ _+_ → + RightIdentity 0# _+_ → RightInverse 0# -_ _+_ → + RightZero 0# _*_ +assoc∧distribˡ∧idʳ∧invʳ⇒zeʳ {_+_ = _+_} {_*_ = _*_} = + Base.assoc∧distribˡ∧idʳ∧invʳ⇒zeʳ (cong₂ _+_) (cong₂ _*_) ------------------------------------------------------------------------ -- Bisemigroup-like structures -module _ {_∙_ _◦_ : Op₂ A} (∙-comm : Commutative _∙_) where +module _ (∙-comm : Commutative _∙_) where comm∧distrˡ⇒distrʳ : _∙_ DistributesOverˡ _◦_ → _∙_ DistributesOverʳ _◦_ comm∧distrˡ⇒distrʳ = Base.comm+distrˡ⇒distrʳ (cong₂ _) ∙-comm @@ -99,49 +101,37 @@ module _ {_∙_ _◦_ : Op₂ A} (∙-comm : Commutative _∙_) where comm∧distrʳ⇒distrˡ = Base.comm∧distrʳ⇒distrˡ (cong₂ _) ∙-comm comm⇒sym[distribˡ] : ∀ x → Symmetric (λ y z → (x ◦ (y ∙ z)) ≡ ((x ◦ y) ∙ (x ◦ z))) - comm⇒sym[distribˡ] = Base.comm⇒sym[distribˡ] (cong₂ _◦_) ∙-comm + comm⇒sym[distribˡ] = Base.comm⇒sym[distribˡ] (cong₂ _) ∙-comm ------------------------------------------------------------------------ --- Selectivity - -module _ {_∙_ : Op₂ A} where - - sel⇒idem : Selective _∙_ → Idempotent _∙_ - sel⇒idem = Base.sel⇒idem _≡_ - ------------------------------------------------------------------------- --- Middle-Four Exchange - -module _ {_∙_ : Op₂ A} where +-- MiddleFourExchange - comm∧assoc⇒middleFour : Commutative _∙_ → Associative _∙_ → - _∙_ MiddleFourExchange _∙_ - comm∧assoc⇒middleFour = Base.comm∧assoc⇒middleFour (cong₂ _∙_) +comm∧assoc⇒middleFour : Commutative _∙_ → Associative _∙_ → + _∙_ MiddleFourExchange _∙_ +comm∧assoc⇒middleFour = Base.comm∧assoc⇒middleFour (cong₂ _) - identity∧middleFour⇒assoc : {e : A} → Identity e _∙_ → - _∙_ MiddleFourExchange _∙_ → - Associative _∙_ - identity∧middleFour⇒assoc = Base.identity∧middleFour⇒assoc (cong₂ _∙_) +identity∧middleFour⇒assoc : Identity e _∙_ → + _∙_ MiddleFourExchange _∙_ → + Associative _∙_ +identity∧middleFour⇒assoc {_∙_ = _∙_} = Base.identity∧middleFour⇒assoc (cong₂ _∙_) - identity∧middleFour⇒comm : {_+_ : Op₂ A} {e : A} → Identity e _+_ → - _∙_ MiddleFourExchange _+_ → - Commutative _∙_ - identity∧middleFour⇒comm = Base.identity∧middleFour⇒comm (cong₂ _∙_) +identity∧middleFour⇒comm : Identity e _+_ → + _∙_ MiddleFourExchange _+_ → + Commutative _∙_ +identity∧middleFour⇒comm = Base.identity∧middleFour⇒comm (cong₂ _) ------------------------------------------------------------------------ -- Without Loss of Generality -module _ {p} {P : Pred A p} where +module _ {p} {P : Pred A p} (∙-comm : Commutative _∙_) where - subst∧comm⇒sym : ∀ {f} (f-comm : Commutative f) → - Symmetric (λ a b → P (f a b)) - subst∧comm⇒sym = Base.subst∧comm⇒sym {P = P} subst + subst∧comm⇒sym : Symmetric (λ a b → P (a ∙ b)) + subst∧comm⇒sym = Base.subst∧comm⇒sym {P = P} subst ∙-comm - wlog : ∀ {f} (f-comm : Commutative f) → - ∀ {r} {_R_ : Rel _ r} → Total _R_ → - (∀ a b → a R b → P (f a b)) → - ∀ a b → P (f a b) - wlog = Base.wlog {P = P} subst + wlog : ∀ {r} {_R_ : Rel _ r} → Total _R_ → + (∀ a b → a R b → P (a ∙ b)) → + ∀ a b → P (a ∙ b) + wlog = Base.wlog {P = P} subst ∙-comm ------------------------------------------------------------------------ diff --git a/src/Algebra/Consequences/Setoid.agda b/src/Algebra/Consequences/Setoid.agda index 66e441a9e0..304bd8e004 100644 --- a/src/Algebra/Consequences/Setoid.agda +++ b/src/Algebra/Consequences/Setoid.agda @@ -7,10 +7,7 @@ {-# OPTIONS --cubical-compatible --safe #-} -open import Relation.Binary.Core using (Rel) open import Relation.Binary.Bundles using (Setoid) -open import Relation.Binary.Definitions - using (Substitutive; Symmetric; Total) module Algebra.Consequences.Setoid {a ℓ} (S : Setoid a ℓ) where @@ -21,47 +18,55 @@ open import Data.Sum.Base using (inj₁; inj₂) open import Data.Product.Base using (_,_) open import Function.Base using (_$_; id; _∘_) open import Function.Definitions -import Relation.Binary.Consequences as Bin +import Relation.Binary.Consequences as BinaryConsequences +open import Relation.Binary.Core using (Rel) +open import Relation.Binary.Definitions + using (Substitutive; Symmetric; Total) open import Relation.Binary.Reasoning.Setoid S open import Relation.Unary using (Pred) +private + variable + e 0# : A + f _⁻¹ : Op₁ A + _∙_ _◦_ _+_ _*_ : Op₂ A + ------------------------------------------------------------------------ -- Re-exports -- Export base lemmas that don't require the setoid -open import Algebra.Consequences.Base public +open import Algebra.Consequences.Base _≈_ public ------------------------------------------------------------------------ -- MiddleFourExchange -module _ {_∙_ : Op₂ A} (cong : Congruent₂ _∙_) where +module _ (cong : Congruent₂ _∙_) where comm∧assoc⇒middleFour : Commutative _∙_ → Associative _∙_ → _∙_ MiddleFourExchange _∙_ comm∧assoc⇒middleFour comm assoc w x y z = begin (w ∙ x) ∙ (y ∙ z) ≈⟨ assoc w x (y ∙ z) ⟩ - w ∙ (x ∙ (y ∙ z)) ≈⟨ cong refl (sym (assoc x y z)) ⟩ + w ∙ (x ∙ (y ∙ z)) ≈⟨ cong refl (assoc x y z) ⟨ w ∙ ((x ∙ y) ∙ z) ≈⟨ cong refl (cong (comm x y) refl) ⟩ w ∙ ((y ∙ x) ∙ z) ≈⟨ cong refl (assoc y x z) ⟩ - w ∙ (y ∙ (x ∙ z)) ≈⟨ sym (assoc w y (x ∙ z)) ⟩ + w ∙ (y ∙ (x ∙ z)) ≈⟨ assoc w y (x ∙ z) ⟨ (w ∙ y) ∙ (x ∙ z) ∎ - identity∧middleFour⇒assoc : {e : A} → Identity e _∙_ → - _∙_ MiddleFourExchange _∙_ → + identity∧middleFour⇒assoc : Identity e _∙_ → _∙_ MiddleFourExchange _∙_ → Associative _∙_ - identity∧middleFour⇒assoc {e} (identityˡ , identityʳ) middleFour x y z = begin - (x ∙ y) ∙ z ≈⟨ cong refl (sym (identityˡ z)) ⟩ + identity∧middleFour⇒assoc {e = e} (identityˡ , identityʳ) middleFour x y z + = begin + (x ∙ y) ∙ z ≈⟨ cong refl (identityˡ z) ⟨ (x ∙ y) ∙ (e ∙ z) ≈⟨ middleFour x y e z ⟩ (x ∙ e) ∙ (y ∙ z) ≈⟨ cong (identityʳ x) refl ⟩ x ∙ (y ∙ z) ∎ - identity∧middleFour⇒comm : {_+_ : Op₂ A} {e : A} → Identity e _+_ → - _∙_ MiddleFourExchange _+_ → + identity∧middleFour⇒comm : Identity e _+_ → _∙_ MiddleFourExchange _+_ → Commutative _∙_ - identity∧middleFour⇒comm {_+_} {e} (identityˡ , identityʳ) middleFour x y + identity∧middleFour⇒comm {e = e} {_+_ = _+_} (identityˡ , identityʳ) middleFour x y = begin - x ∙ y ≈⟨ sym (cong (identityˡ x) (identityʳ y)) ⟩ + x ∙ y ≈⟨ cong (identityˡ x) (identityʳ y) ⟨ (e + x) ∙ (y + e) ≈⟨ middleFour e x y e ⟩ (e + y) ∙ (x + e) ≈⟨ cong (identityˡ y) (identityʳ x) ⟩ y ∙ x ∎ @@ -69,12 +74,12 @@ module _ {_∙_ : Op₂ A} (cong : Congruent₂ _∙_) where ------------------------------------------------------------------------ -- SelfInverse -module _ {f : Op₁ A} (self : SelfInverse f) where +module _ (self : SelfInverse f) where selfInverse⇒involutive : Involutive f - selfInverse⇒involutive = reflexive∧selfInverse⇒involutive _≈_ refl self + selfInverse⇒involutive = reflexive∧selfInverse⇒involutive refl self - selfInverse⇒congruent : Congruent _≈_ _≈_ f + selfInverse⇒congruent : Congruent₁ f selfInverse⇒congruent {x} {y} x≈y = sym (self (begin f (f x) ≈⟨ selfInverse⇒involutive x ⟩ x ≈⟨ x≈y ⟩ @@ -98,7 +103,7 @@ module _ {f : Op₁ A} (self : SelfInverse f) where ------------------------------------------------------------------------ -- Magma-like structures -module _ {_∙_ : Op₂ A} (comm : Commutative _∙_) where +module _ (comm : Commutative _∙_) where comm∧cancelˡ⇒cancelʳ : LeftCancellative _∙_ → RightCancellative _∙_ comm∧cancelˡ⇒cancelʳ cancelˡ x y z eq = cancelˡ x y z $ begin @@ -117,16 +122,16 @@ module _ {_∙_ : Op₂ A} (comm : Commutative _∙_) where ------------------------------------------------------------------------ -- Monoid-like structures -module _ {_∙_ : Op₂ A} (comm : Commutative _∙_) {e : A} where +module _ (comm : Commutative _∙_) where comm∧idˡ⇒idʳ : LeftIdentity e _∙_ → RightIdentity e _∙_ - comm∧idˡ⇒idʳ idˡ x = begin + comm∧idˡ⇒idʳ {e = e} idˡ x = begin x ∙ e ≈⟨ comm x e ⟩ e ∙ x ≈⟨ idˡ x ⟩ x ∎ comm∧idʳ⇒idˡ : RightIdentity e _∙_ → LeftIdentity e _∙_ - comm∧idʳ⇒idˡ idʳ x = begin + comm∧idʳ⇒idˡ {e = e} idʳ x = begin e ∙ x ≈⟨ comm e x ⟩ x ∙ e ≈⟨ idʳ x ⟩ x ∎ @@ -138,13 +143,13 @@ module _ {_∙_ : Op₂ A} (comm : Commutative _∙_) {e : A} where comm∧idʳ⇒id idʳ = comm∧idʳ⇒idˡ idʳ , idʳ comm∧zeˡ⇒zeʳ : LeftZero e _∙_ → RightZero e _∙_ - comm∧zeˡ⇒zeʳ zeˡ x = begin + comm∧zeˡ⇒zeʳ {e = e} zeˡ x = begin x ∙ e ≈⟨ comm x e ⟩ e ∙ x ≈⟨ zeˡ x ⟩ e ∎ comm∧zeʳ⇒zeˡ : RightZero e _∙_ → LeftZero e _∙_ - comm∧zeʳ⇒zeˡ zeʳ x = begin + comm∧zeʳ⇒zeˡ {e = e} zeʳ x = begin e ∙ x ≈⟨ comm e x ⟩ x ∙ e ≈⟨ zeʳ x ⟩ e ∎ @@ -157,7 +162,7 @@ module _ {_∙_ : Op₂ A} (comm : Commutative _∙_) {e : A} where comm∧almostCancelˡ⇒almostCancelʳ : AlmostLeftCancellative e _∙_ → AlmostRightCancellative e _∙_ - comm∧almostCancelˡ⇒almostCancelʳ cancelˡ-nonZero x y z x≉e yx≈zx = + comm∧almostCancelˡ⇒almostCancelʳ {e = e} cancelˡ-nonZero x y z x≉e yx≈zx = cancelˡ-nonZero x y z x≉e $ begin x ∙ y ≈⟨ comm x y ⟩ y ∙ x ≈⟨ yx≈zx ⟩ @@ -166,7 +171,7 @@ module _ {_∙_ : Op₂ A} (comm : Commutative _∙_) {e : A} where comm∧almostCancelʳ⇒almostCancelˡ : AlmostRightCancellative e _∙_ → AlmostLeftCancellative e _∙_ - comm∧almostCancelʳ⇒almostCancelˡ cancelʳ-nonZero x y z x≉e xy≈xz = + comm∧almostCancelʳ⇒almostCancelˡ {e = e} cancelʳ-nonZero x y z x≉e xy≈xz = cancelʳ-nonZero x y z x≉e $ begin y ∙ x ≈⟨ comm y x ⟩ x ∙ y ≈⟨ xy≈xz ⟩ @@ -176,10 +181,10 @@ module _ {_∙_ : Op₂ A} (comm : Commutative _∙_) {e : A} where ------------------------------------------------------------------------ -- Group-like structures -module _ {_∙_ : Op₂ A} {_⁻¹ : Op₁ A} {e} (comm : Commutative _∙_) where +module _ (comm : Commutative _∙_) where comm∧invˡ⇒invʳ : LeftInverse e _⁻¹ _∙_ → RightInverse e _⁻¹ _∙_ - comm∧invˡ⇒invʳ invˡ x = begin + comm∧invˡ⇒invʳ {e = e} {_⁻¹ = _⁻¹} invˡ x = begin x ∙ (x ⁻¹) ≈⟨ comm x (x ⁻¹) ⟩ (x ⁻¹) ∙ x ≈⟨ invˡ x ⟩ e ∎ @@ -188,7 +193,7 @@ module _ {_∙_ : Op₂ A} {_⁻¹ : Op₁ A} {e} (comm : Commutative _∙_) whe comm∧invˡ⇒inv invˡ = invˡ , comm∧invˡ⇒invʳ invˡ comm∧invʳ⇒invˡ : RightInverse e _⁻¹ _∙_ → LeftInverse e _⁻¹ _∙_ - comm∧invʳ⇒invˡ invʳ x = begin + comm∧invʳ⇒invˡ {e = e} {_⁻¹ = _⁻¹} invʳ x = begin (x ⁻¹) ∙ x ≈⟨ comm (x ⁻¹) x ⟩ x ∙ (x ⁻¹) ≈⟨ invʳ x ⟩ e ∎ @@ -196,15 +201,15 @@ module _ {_∙_ : Op₂ A} {_⁻¹ : Op₁ A} {e} (comm : Commutative _∙_) whe comm∧invʳ⇒inv : RightInverse e _⁻¹ _∙_ → Inverse e _⁻¹ _∙_ comm∧invʳ⇒inv invʳ = comm∧invʳ⇒invˡ invʳ , invʳ -module _ {_∙_ : Op₂ A} {_⁻¹ : Op₁ A} {e} (cong : Congruent₂ _∙_) where +module _ (cong : Congruent₂ _∙_) where assoc∧id∧invʳ⇒invˡ-unique : Associative _∙_ → Identity e _∙_ → RightInverse e _⁻¹ _∙_ → ∀ x y → (x ∙ y) ≈ e → x ≈ (y ⁻¹) - assoc∧id∧invʳ⇒invˡ-unique assoc (idˡ , idʳ) invʳ x y eq = begin - x ≈⟨ sym (idʳ x) ⟩ + assoc∧id∧invʳ⇒invˡ-unique {e = e} {_⁻¹ = _⁻¹} assoc (idˡ , idʳ) invʳ x y eq = begin + x ≈⟨ idʳ x ⟨ x ∙ e ≈⟨ cong refl (sym (invʳ y)) ⟩ - x ∙ (y ∙ (y ⁻¹)) ≈⟨ sym (assoc x y (y ⁻¹)) ⟩ + x ∙ (y ∙ (y ⁻¹)) ≈⟨ assoc x y (y ⁻¹) ⟨ (x ∙ y) ∙ (y ⁻¹) ≈⟨ cong eq refl ⟩ e ∙ (y ⁻¹) ≈⟨ idˡ (y ⁻¹) ⟩ y ⁻¹ ∎ @@ -212,9 +217,9 @@ module _ {_∙_ : Op₂ A} {_⁻¹ : Op₁ A} {e} (cong : Congruent₂ _∙_) wh assoc∧id∧invˡ⇒invʳ-unique : Associative _∙_ → Identity e _∙_ → LeftInverse e _⁻¹ _∙_ → ∀ x y → (x ∙ y) ≈ e → y ≈ (x ⁻¹) - assoc∧id∧invˡ⇒invʳ-unique assoc (idˡ , idʳ) invˡ x y eq = begin - y ≈⟨ sym (idˡ y) ⟩ - e ∙ y ≈⟨ cong (sym (invˡ x)) refl ⟩ + assoc∧id∧invˡ⇒invʳ-unique {e = e} {_⁻¹ = _⁻¹} assoc (idˡ , idʳ) invˡ x y eq = begin + y ≈⟨ idˡ y ⟨ + e ∙ y ≈⟨ cong (invˡ x) refl ⟨ ((x ⁻¹) ∙ x) ∙ y ≈⟨ assoc (x ⁻¹) x y ⟩ (x ⁻¹) ∙ (x ∙ y) ≈⟨ cong refl eq ⟩ (x ⁻¹) ∙ e ≈⟨ idʳ (x ⁻¹) ⟩ @@ -223,10 +228,7 @@ module _ {_∙_ : Op₂ A} {_⁻¹ : Op₁ A} {e} (cong : Congruent₂ _∙_) wh ------------------------------------------------------------------------ -- Bisemigroup-like structures -module _ {_∙_ _◦_ : Op₂ A} - (◦-cong : Congruent₂ _◦_) - (∙-comm : Commutative _∙_) - where +module _ (◦-cong : Congruent₂ _◦_) (∙-comm : Commutative _∙_) where comm∧distrˡ⇒distrʳ : _∙_ DistributesOverˡ _◦_ → _∙_ DistributesOverʳ _◦_ comm∧distrˡ⇒distrʳ distrˡ x y z = begin @@ -256,8 +258,7 @@ module _ {_∙_ _◦_ : Op₂ A} (x ◦ z) ∙ (x ◦ y) ∎ -module _ {_∙_ _◦_ : Op₂ A} - (∙-cong : Congruent₂ _∙_) +module _ (∙-cong : Congruent₂ _∙_) (∙-assoc : Associative _∙_) (◦-comm : Commutative _◦_) where @@ -278,20 +279,17 @@ module _ {_∙_ _◦_ : Op₂ A} ------------------------------------------------------------------------ -- Ring-like structures -module _ {_+_ _*_ : Op₂ A} - {_⁻¹ : Op₁ A} {0# : A} - (+-cong : Congruent₂ _+_) - (*-cong : Congruent₂ _*_) - where +module _ (+-cong : Congruent₂ _+_) (*-cong : Congruent₂ _*_) where assoc∧distribʳ∧idʳ∧invʳ⇒zeˡ : Associative _+_ → _*_ DistributesOverʳ _+_ → RightIdentity 0# _+_ → RightInverse 0# _⁻¹ _+_ → LeftZero 0# _*_ - assoc∧distribʳ∧idʳ∧invʳ⇒zeˡ +-assoc distribʳ idʳ invʳ x = begin - 0# * x ≈⟨ sym (idʳ _) ⟩ + assoc∧distribʳ∧idʳ∧invʳ⇒zeˡ {0# = 0#} {_⁻¹ = _⁻¹} +-assoc distribʳ idʳ invʳ x + = begin + 0# * x ≈⟨ idʳ _ ⟨ (0# * x) + 0# ≈⟨ +-cong refl (sym (invʳ _)) ⟩ - (0# * x) + ((0# * x) + ((0# * x)⁻¹)) ≈⟨ sym (+-assoc _ _ _) ⟩ - ((0# * x) + (0# * x)) + ((0# * x)⁻¹) ≈⟨ +-cong (sym (distribʳ _ _ _)) refl ⟩ + (0# * x) + ((0# * x) + ((0# * x)⁻¹)) ≈⟨ +-assoc _ _ _ ⟨ + ((0# * x) + (0# * x)) + ((0# * x)⁻¹) ≈⟨ +-cong (distribʳ _ _ _) refl ⟨ ((0# + 0#) * x) + ((0# * x)⁻¹) ≈⟨ +-cong (*-cong (idʳ _) refl) refl ⟩ (0# * x) + ((0# * x)⁻¹) ≈⟨ invʳ _ ⟩ 0# ∎ @@ -299,11 +297,12 @@ module _ {_+_ _*_ : Op₂ A} assoc∧distribˡ∧idʳ∧invʳ⇒zeʳ : Associative _+_ → _*_ DistributesOverˡ _+_ → RightIdentity 0# _+_ → RightInverse 0# _⁻¹ _+_ → RightZero 0# _*_ - assoc∧distribˡ∧idʳ∧invʳ⇒zeʳ +-assoc distribˡ idʳ invʳ x = begin - x * 0# ≈⟨ sym (idʳ _) ⟩ + assoc∧distribˡ∧idʳ∧invʳ⇒zeʳ {0# = 0#} {_⁻¹ = _⁻¹} +-assoc distribˡ idʳ invʳ x + = begin + x * 0# ≈⟨ idʳ _ ⟨ (x * 0#) + 0# ≈⟨ +-cong refl (sym (invʳ _)) ⟩ - (x * 0#) + ((x * 0#) + ((x * 0#)⁻¹)) ≈⟨ sym (+-assoc _ _ _) ⟩ - ((x * 0#) + (x * 0#)) + ((x * 0#)⁻¹) ≈⟨ +-cong (sym (distribˡ _ _ _)) refl ⟩ + (x * 0#) + ((x * 0#) + ((x * 0#)⁻¹)) ≈⟨ +-assoc _ _ _ ⟨ + ((x * 0#) + (x * 0#)) + ((x * 0#)⁻¹) ≈⟨ +-cong (distribˡ _ _ _) refl ⟨ (x * (0# + 0#)) + ((x * 0#)⁻¹) ≈⟨ +-cong (*-cong refl (idʳ _)) refl ⟩ ((x * 0#) + ((x * 0#)⁻¹)) ≈⟨ invʳ _ ⟩ 0# ∎ @@ -311,18 +310,18 @@ module _ {_+_ _*_ : Op₂ A} ------------------------------------------------------------------------ -- Without Loss of Generality -module _ {p} {f : Op₂ A} {P : Pred A p} +module _ {p} {P : Pred A p} (≈-subst : Substitutive _≈_ p) - (comm : Commutative f) + (∙-comm : Commutative _∙_) where - subst∧comm⇒sym : Symmetric (λ a b → P (f a b)) - subst∧comm⇒sym = ≈-subst P (comm _ _) + subst∧comm⇒sym : Symmetric (λ a b → P (a ∙ b)) + subst∧comm⇒sym = ≈-subst P (∙-comm _ _) wlog : ∀ {r} {_R_ : Rel _ r} → Total _R_ → - (∀ a b → a R b → P (f a b)) → - ∀ a b → P (f a b) - wlog r-total = Bin.wlog r-total subst∧comm⇒sym + (∀ a b → a R b → P (a ∙ b)) → + ∀ a b → P (a ∙ b) + wlog r-total = BinaryConsequences.wlog r-total subst∧comm⇒sym ------------------------------------------------------------------------