This commit is contained in:
itamar 2026-04-10 14:48:24 +02:00
parent 66a0eac7e2
commit dccfeaf5b3
Signed by: itamar
SSH key fingerprint: SHA256:Dv6UzB9hN8q8FUgMR/7X3DTFpE/vSB2m05+KNnxM4B0

308
main.agda Normal file
View file

@ -0,0 +1,308 @@
module Quotient.Algebra where
private
open import Relation.Binary.PropositionalEquality as P using (proof-irrelevance; _≡_)
open import Data.Nat using (; zero; suc)
open import Data.Vec.N-ary
N-ary-equality : {a} {A : Set a} (n : ) (f g : N-ary n A A) Set (N-ary-level a a n)
N-ary-equality {A = A} n f g = Eq {A = A} n (_≡_ {A = A}) f g
private
module N-ary-equality-Ex where
open import Data.Nat
ex₀ : N-ary-equality {A = } 0 2 2
ex₀ = P.refl
ex₁ : N-ary-equality {A = } 1 suc (λ ξ ξ + 1)
ex₁ zero = P.refl
ex₁ (suc n) = P.cong suc (ex₁ n)
open import Function using (flip)
ex₂ : N-ary-equality {A = } 2 _+_ (flip _+_)
ex₂ = +-comm
where
open import Algebra
import Data.Nat.Properties
open CommutativeSemiring Data.Nat.Properties.commutativeSemiring
N-ary-irrelevance : {a} {A : Set a} (n : ) Set (N-ary-level a a n)
N-ary-irrelevance {A = A} n = {f g} (p q : N-ary-equality {A = A} n f g) p q
postulate
extensional-irrelevance : {a} {A : Set a} (n : ) N-ary-irrelevance {a} {A} n
private
module N-ary-irrelevance-Ex where
ex₀ : N-ary-irrelevance {A = } 0
ex₀ = proof-irrelevance
ex₁ : N-ary-irrelevance {A = } 1
ex₁ = extensional-irrelevance 1
open import Quotient
open import Algebra
open import Relation.Binary -- using (Setoid)
open import Algebra.Structures
open import Data.Product
open import Function
open import Algebra.FunctionProperties using (Op₁; Op₂)
import Algebra.FunctionProperties as FunProp
Sound₁ : {c } (S : Setoid c ) let open Setoid S in Op₁ Carrier Set _
Sound₁ S f = let open Setoid S in f Preserves _≈_ _≈_
quot₁ : {c } {S : Setoid c } let open Setoid S in
{f : Op₁ Carrier} (∙-sound : Sound₁ S f) Op₁ (Quotient S)
quot₁ {S = S} {f} prf = rec _ (λ x [ f x ]) (λ x≈x [ prf x≈x ]-cong)
where
open Setoid S
Sound₂ : {c } (S : Setoid c ) let open Setoid S in Op₂ Carrier Set _
Sound₂ S = let open Setoid S in Preserves₂ _≈_ _≈_ _≈_
quot₂ : {c } {S : Setoid c } let open Setoid S in
{ : Op₂ Carrier} (∙-sound : Sound₂ S ) Op₂ (Quotient S)
quot₂ {S = S} {_∙_} prf = rec S (λ x rec _ (λ y [ x y ])
(λ y≈y [ refl prf y≈y ]-cong))
-- (λ {x} {x} x≈x → P.cong (λ ξ → rec S ξ _)
-- (extensionality (λ _ → [ x≈x ⟨ prf ⟩ refl ]-cong)))
(λ x≈x extensionality (elim _ _ (λ _ [ (x≈x prf refl) ]-cong)
(λ _ proof-irrelevance _ _)))
where
open Setoid S
postulate extensionality : P.Extensionality _ _
quot-assoc : {c } {S : Setoid c }
let
open Setoid S
module F = FunProp _≈_
module F = FunProp (_≡_ {A = Quotient S})
in
{ : Op₂ Carrier} (∙-sound : Sound₂ S )
F₀.Associative F.Associative (quot₂ ∙-sound)
quot-assoc {S = S} sound prf
= elim S _
(λ x elim S _ (λ y elim S _ (λ z [ prf x y z ]-cong)
(λ _ extensional-irrelevance 0 _ _))
(λ _ extensional-irrelevance 1 _ _))
(λ _ extensional-irrelevance 2 _ _)
quot-comm : {c } {S : Setoid c }
let
open Setoid S
module F = FunProp _≈_
module F = FunProp (_≡_ {A = Quotient S})
in
{ : Op₂ Carrier} (∙-sound : Sound₂ S )
F₀.Commutative F.Commutative (quot₂ ∙-sound)
quot-comm {S = S} sound prf
= elim S _ (λ x elim S _ (λ y [ prf x y ]-cong)
(λ _ extensional-irrelevance 0 _ _))
(λ _ extensional-irrelevance 1 _ _)
quot-leftDistrib : {c } {S : Setoid c }
let
open Setoid S
module F = FunProp _≈_
module F = FunProp (_≡_ {A = Quotient S})
in
{* : Op₂ Carrier} (*-sound : Sound₂ S *)
{+ : Op₂ Carrier} (+-sound : Sound₂ S +)
* F₀.DistributesOverˡ +
(quot₂ *-sound) F.DistributesOverˡ (quot₂ +-sound)
quot-leftDistrib {S = S} {*} *-sound {+} +-sound prf
= elim S _ (λ x elim S _ (λ y elim S _ (λ z [ prf x y z ]-cong)
(λ _ extensional-irrelevance 0 _ _))
(λ _ extensional-irrelevance 1 _ _))
(λ _ extensional-irrelevance 2 _ _)
quot-rightDistrib : {c } {S : Setoid c }
let
open Setoid S
module F = FunProp _≈_
module F = FunProp (_≡_ {A = Quotient S})
in
{* : Op₂ Carrier} (*-sound : Sound₂ S *)
{+ : Op₂ Carrier} (+-sound : Sound₂ S +)
* F₀.DistributesOverʳ +
(quot₂ *-sound) F.DistributesOverʳ (quot₂ +-sound)
quot-rightDistrib {S = S} {*} *-sound {+} +-sound prf
= elim S _ (λ x elim S _ (λ y elim S _ (λ z [ prf x y z ]-cong)
(λ _ extensional-irrelevance 0 _ _))
(λ _ extensional-irrelevance 1 _ _))
(λ _ extensional-irrelevance 2 _ _)
quot-distrib : {c } {S : Setoid c }
let
open Setoid S
module F = FunProp _≈_
module F = FunProp (_≡_ {A = Quotient S})
in
{* : Op₂ Carrier} (*-sound : Sound₂ S *)
{+ : Op₂ Carrier} (+-sound : Sound₂ S +)
* F₀.DistributesOver +
(quot₂ *-sound) F.DistributesOver (quot₂ +-sound)
quot-distrib *-sound +-sound prf
= quot-leftDistrib *-sound +-sound (proj₁ prf) , quot-rightDistrib *-sound +-sound (proj₂ prf)
quot-leftIdentity : {c } {S : Setoid c }
let
open Setoid S
module F = FunProp _≈_
module F = FunProp (_≡_ {A = Quotient S})
in
{ : Op₂ Carrier} (∙-sound : Sound₂ S )
{ε : Carrier}
F₀.LeftIdentity ε F.LeftIdentity [ ε ] (quot₂ ∙-sound)
quot-leftIdentity {S = S} {} sound {ε} prf
= elim S _ (λ x [ prf x ]-cong)
(λ _ extensional-irrelevance 0 _ _)
quot-rightIdentity : {c } {S : Setoid c }
let
open Setoid S
module F = FunProp _≈_
module F = FunProp (_≡_ {A = Quotient S})
in
{ : Op₂ Carrier} (∙-sound : Sound₂ S )
{ε : Carrier}
F₀.RightIdentity ε F.RightIdentity [ ε ] (quot₂ ∙-sound)
quot-rightIdentity {S = S} {} sound {ε} prf
= elim S _
(λ x [ prf x ]-cong)
(λ _ extensional-irrelevance 0 _ _)
quot-identity : {c } {S : Setoid c }
let
open Setoid S
module F = FunProp _≈_
module F = FunProp (_≡_ {A = Quotient S})
in
{ : Op₂ Carrier} (∙-sound : Sound₂ S )
{ε : Carrier}
F₀.Identity ε F.Identity [ ε ] (quot₂ ∙-sound)
quot-identity sound (prfˡ , prfʳ)
= quot-leftIdentity sound prfˡ , quot-rightIdentity sound prfʳ
quot-leftInverse : {c } {S : Setoid c }
let
open Setoid S
module F = FunProp _≈_
module F = FunProp (_≡_ {A = Quotient S})
in
{⁻¹ : Op₁ Carrier} (⁻¹-sound : Sound₁ S ⁻¹)
{ : Op₂ Carrier} (∙-sound : Sound₂ S )
{ε : Carrier}
F₀.LeftInverse ε ⁻¹ F.LeftInverse [ ε ] (quot₁ ⁻¹-sound) (quot₂ ∙-sound)
quot-leftInverse {S = S} {_⁻¹} ⁻¹-sound {_∙_} ∙-sound {ε} prf
= elim S _
(λ x [ prf x ]-cong)
(λ _ extensional-irrelevance 0 _ _)
quot-rightInverse : {c } {S : Setoid c }
let
open Setoid S
module F = FunProp _≈_
module F = FunProp (_≡_ {A = Quotient S})
in
{⁻¹ : Op₁ Carrier} (⁻¹-sound : Sound₁ S ⁻¹)
{ : Op₂ Carrier} (∙-sound : Sound₂ S )
{ε : Carrier}
F₀.RightInverse ε ⁻¹ F.RightInverse [ ε ] (quot₁ ⁻¹-sound) (quot₂ ∙-sound)
quot-rightInverse {S = S} {_⁻¹} ⁻¹-sound {_∙_} ∙-sound {ε} prf
= elim S _
(λ x [ prf x ]-cong)
(λ _ extensional-irrelevance 0 _ _)
quot-inverse : {c } {S : Setoid c }
let
open Setoid S
module F = FunProp _≈_
module F = FunProp (_≡_ {A = Quotient S})
in
{⁻¹ : Op₁ Carrier} (⁻¹-sound : Sound₁ S ⁻¹)
{ : Op₂ Carrier} (∙-sound : Sound₂ S )
{ε : Carrier}
F₀.Inverse ε ⁻¹ F.Inverse [ ε ] (quot₁ ⁻¹-sound) (quot₂ ∙-sound)
quot-inverse ⁻¹-sound ∙-sound (prfˡ , prfʳ)
= quot-leftInverse ⁻¹-sound ∙-sound prfˡ , quot-rightInverse ⁻¹-sound ∙-sound prfʳ
quot-isSemigroup : {c } (Σ : Semigroup c ) let open Semigroup Σ in
IsSemigroup (_≡_ {A = Quotient setoid}) (quot₂ ∙-cong)
quot-isSemigroup Σ = record
{ isEquivalence = Relation.Binary.Setoid.isEquivalence (P.setoid _)
; assoc = quot-assoc ∙-cong assoc
; ∙-cong = P.cong₂ _
}
where
open Semigroup Σ
quot-isMonoid : {c } (Σ : Monoid c ) let open Monoid Σ in
IsMonoid (_≡_ {A = Quotient setoid}) (quot₂ ∙-cong) [ ε ]
quot-isMonoid Σ = record
{ isSemigroup = quot-isSemigroup semigroup
; identity = quot-identity ∙-cong identity
}
where
open Monoid Σ
quot-isGroup : {c } (Σ : Group c ) let open Group Σ in
IsGroup (_≡_ {A = Quotient setoid}) (quot₂ ∙-cong) [ ε ] (quot₁ ⁻¹-cong)
quot-isGroup Σ = record
{ isMonoid = quot-isMonoid monoid
; inverse = quot-inverse ⁻¹-cong ∙-cong inverse
; ⁻¹-cong = P.cong _
}
where
open Group Σ
quot-isAbelianGroup : {c } (Σ : AbelianGroup c ) let open AbelianGroup Σ in
IsAbelianGroup (_≡_ {A = Quotient setoid}) (quot₂ ∙-cong) [ ε ] (quot₁ ⁻¹-cong)
quot-isAbelianGroup Σ = record
{ isGroup = quot-isGroup group
; comm = quot-comm ∙-cong comm
}
where
open AbelianGroup Σ
quot-isRing : {c } (Σ : Ring c ) let open Ring Σ in
IsRing (_≡_ {A = Quotient setoid}) (quot₂ +-cong) (quot₂ *-cong) (quot₁ -‿cong) [ 0# ] [ 1# ]
quot-isRing Σ = record
{ +-isAbelianGroup = quot-isAbelianGroup +-abelianGroup
; *-isMonoid = quot-isMonoid (record
{ Carrier = Carrier
; _≈_ = _≈_
; _∙_ = _*_
; ε = 1#
; isMonoid = record
{ isSemigroup = record
{ isEquivalence = isEquivalence
; assoc = *-assoc
; ∙-cong = *-cong
}
; identity = *-identity }
})
; distrib = quot-distrib *-cong +-cong distrib
}
where
open Ring Σ
-- quot-semigroup : ∀ {c } → (Σ : Semigroup c ) →
-- Semigroup ( ⊔ c) ( ⊔ c)
-- quot-semigroup Σ = record
-- { Carrier = Quotient setoid
-- ; _≈_ = _≡_
-- ; _∙_ = quot₂ ∙₀ ∙-cong
-- ; isSemigroup = quot-isSemigroup Σ
-- }
-- where
-- open Semigroup Σ renaming (_∙_ to ∙₀)