Mercurial > hg > Members > kono > Proof > category
diff src/Category/Ring.agda @ 1110:45de2b31bf02
add original library and fix for safe mode
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 07 Oct 2023 19:43:31 +0900 |
parents | |
children | 5620d4a85069 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Category/Ring.agda Sat Oct 07 19:43:31 2023 +0900 @@ -0,0 +1,150 @@ +{-# OPTIONS --universe-polymorphism #-} +module Category.Ring where +open import Category +open import Algebra +open import Algebra.Structures +open import Algebra.Morphism +import Relation.Binary.EqReasoning as EqR +open import Relation.Binary.Core +open import Relation.Binary +open import Level +open import Data.Product + +RingObj : ∀{c ℓ} → Set (suc (c ⊔ ℓ)) +RingObj {c} {ℓ} = Ring c ℓ + +RingHom : ∀{c ℓ} → Set (suc (c ⊔ ℓ)) +RingHom {c} {ℓ} = {R₁ R₂ : Ring c ℓ} → R₁ -Ring⟶ R₂ + +RingId : ∀{c ℓ} {R : Ring c ℓ} → R -Ring⟶ R +RingId {R = R} = record { ⟦_⟧ = ⟦_⟧ ; ⟦⟧-cong = ⟦⟧-cong ; +-homo = +-homo + ; *-homo = *-homo ; 1-homo = 1-homo + } + where + open Algebra.Ring R + open Definitions Carrier Carrier _≈_ + ⟦_⟧ : Morphism + ⟦_⟧ = λ x → x + ⟦⟧-cong : ⟦_⟧ Preserves _≈_ ⟶ _≈_ + ⟦⟧-cong = λ x → x + +-homo : Homomorphic₂ ⟦_⟧ _+_ _+_ + +-homo x y = IsEquivalence.refl isEquivalence + *-homo : Homomorphic₂ ⟦_⟧ _*_ _*_ + *-homo x y = IsEquivalence.refl isEquivalence + 1-homo : Homomorphic₀ ⟦_⟧ 1# 1# + 1-homo = IsEquivalence.refl isEquivalence + +[_]_ : ∀{c ℓ c′ ℓ′} {R₁ : Ring c ℓ} {R₂ : Ring c′ ℓ′} → R₁ -Ring⟶ R₂ → Ring.Carrier R₁ → Ring.Carrier R₂ +[ f ] x = _-Ring⟶_.⟦_⟧ f x + +_∘_ : ∀{c₁ ℓ₁ c₂ ℓ₂ c₃ ℓ₃} {R₁ : Ring c₁ ℓ₁} {R₂ : Ring c₂ ℓ₂} {R₃ : Ring c₃ ℓ₃} + → R₂ -Ring⟶ R₃ → R₁ -Ring⟶ R₂ → R₁ -Ring⟶ R₃ +_∘_ {R₁ = R₁} {R₂} {R₃} g f = + record { ⟦_⟧ = ⟦_⟧ ; ⟦⟧-cong = ⟦⟧-cong ; +-homo = +-homo + ; *-homo = *-homo ; 1-homo = 1-homo + } + where + module F = Ring R₁ + module M = Ring R₂ + module T = Ring R₃ + module homo = _-Ring⟶_ + open Definitions F.Carrier T.Carrier T._≈_ + ⟦_⟧ : Morphism + ⟦ x ⟧ = [ g ] ([ f ] x) + ⟦⟧-cong : ⟦_⟧ Preserves F._≈_ ⟶ T._≈_ + ⟦⟧-cong x = homo.⟦⟧-cong g (homo.⟦⟧-cong f x) + +-homo : Homomorphic₂ ⟦_⟧ F._+_ T._+_ + +-homo x y = + begin + ⟦ F._+_ x y ⟧ ≈⟨ homo.⟦⟧-cong g (homo.+-homo f x y) ⟩ + [ g ] ( M._+_ ([ f ] x) ([ f ] y) ) ≈⟨ homo.+-homo g ([ f ] x) ([ f ] y) ⟩ + T._+_ ⟦ x ⟧ ⟦ y ⟧ + ∎ + where + open IsEquivalence T.isEquivalence + open EqR T.setoid + *-homo : Homomorphic₂ ⟦_⟧ F._*_ T._*_ + *-homo x y = + begin + ⟦ F._*_ x y ⟧ ≈⟨ homo.⟦⟧-cong g (homo.*-homo f x y) ⟩ + [ g ] ( M._*_ ([ f ] x) ([ f ] y) ) ≈⟨ homo.*-homo g ([ f ] x) ([ f ] y) ⟩ + T._*_ ⟦ x ⟧ ⟦ y ⟧ + ∎ + where + open IsEquivalence T.isEquivalence + open EqR T.setoid + 1-homo : Homomorphic₀ ⟦_⟧ F.1# T.1# + 1-homo = + begin + ⟦ F.1# ⟧ ≈⟨ homo.⟦⟧-cong g (homo.1-homo f) ⟩ + [ g ] M.1# ≈⟨ homo.1-homo g ⟩ + T.1# + ∎ + where + open IsEquivalence T.isEquivalence + open EqR T.setoid + +_≈_ : ∀{c ℓ c′ ℓ′} {R₁ : Ring c ℓ} {R₂ : Ring c′ ℓ′} → Rel (R₁ -Ring⟶ R₂) (ℓ′ ⊔ c) +_≈_ {R₁ = R₁} {R₂} φ ψ = ∀(x : F.Carrier) → T._≈_ ([ φ ] x) ([ ψ ] x) + where + module F = Ring R₁ + module T = Ring R₂ + +≈-refl : ∀{c ℓ c′ ℓ′} {R₁ : Ring c ℓ} {R₂ : Ring c′ ℓ′} {F : R₁ -Ring⟶ R₂} → F ≈ F +≈-refl {R₁ = R₁} {F = F} _ = _-Ring⟶_.⟦⟧-cong F (IsEquivalence.refl (Ring.isEquivalence R₁)) + +≈-sym : ∀{c ℓ c′ ℓ′} {R₁ : Ring c ℓ} {R₂ : Ring c′ ℓ′} {F G : R₁ -Ring⟶ R₂} → F ≈ G → G ≈ F +≈-sym {R₁ = R₁} {R₂} {F} {G} F≈G x = IsEquivalence.sym (Ring.isEquivalence R₂)(F≈G x) + +≈-trans : ∀{c ℓ c′ ℓ′} {R₁ : Ring c ℓ} {R₂ : Ring c′ ℓ′} {F G H : R₁ -Ring⟶ R₂} + → F ≈ G → G ≈ H → F ≈ H +≈-trans {R₁ = R₁} {R₂} {F} {G} F≈G G≈H x = IsEquivalence.trans (Ring.isEquivalence R₂) (F≈G x) (G≈H x) + +≈-isEquivalence : ∀{c ℓ c′ ℓ′} {R₁ : Ring c ℓ} {R₂ : Ring c′ ℓ′} + → IsEquivalence {A = R₁ -Ring⟶ R₂} _≈_ +≈-isEquivalence {R₁ = R₁} {R₂} = record { refl = λ {F} → ≈-refl {R₁ = R₁} {R₂} {F} + ; sym = λ{F} {G} → ≈-sym {R₁ = R₁} {R₂} {F} {G} + ; trans = λ{F} {G} {H} → ≈-trans {R₁ = R₁} {R₂} {F} {G} {H} + } + + +RingCat : ∀{c ℓ} → Category _ _ _ +RingCat {c} {ℓ} = + record { Obj = Ring c ℓ + ; Hom = _-Ring⟶_ + ; Id = RingId + ; _o_ = _∘_ + ; _≈_ = _≈_ + ; isCategory = isCategory + } + where + isCategory : IsCategory (Ring c ℓ) _-Ring⟶_ _≈_ _∘_ RingId + isCategory = + record { isEquivalence = ≈-isEquivalence {c} {ℓ} {c} {ℓ} + ; identityL = λ {R₁ R₂ f} → identityL {R₁} {R₂} {f} + ; identityR = λ {R₁ R₂ f} → identityR {R₁} {R₂} {f} + ; o-resp-≈ = λ {A} {B} {C} {f} {g} {h} {i} → o-resp-≈ {A} {B} {C} {f} {g} {h} {i} + ; associative = λ {R₁} {R₂} {R₃} {R₄} {f} {g} {h} → associative {R₁} {R₂} {R₃} {R₄} {f} {g} {h} + } + where + identityL : {R₁ R₂ : Ring c ℓ} {f : R₁ -Ring⟶ R₂} → (RingId ∘ f) ≈ f + identityL {f = f} = ≈-refl {F = f} + identityR : {R₁ R₂ : Ring c ℓ} {f : R₁ -Ring⟶ R₂} → (f ∘ RingId) ≈ f + identityR {f = f} = ≈-refl {F = f} + o-resp-≈ : {R₁ R₂ R₃ : Ring c ℓ} {f g : R₁ -Ring⟶ R₂} {h i : R₂ -Ring⟶ R₃} + → f ≈ g → h ≈ i → (h ∘ f) ≈ (i ∘ g) + o-resp-≈ {R₃ = R₃} {f} {g} {h} {i} f≈g h≈i x = + begin + ([ h ∘ f ] x) ≈⟨ h≈i ([ f ] x) ⟩ + ([ i ∘ f ] x) ≈⟨ _-Ring⟶_.⟦⟧-cong i (f≈g x) ⟩ + ([ i ∘ g ] x) + ∎ + where + module T = Ring R₃ + open IsEquivalence T.isEquivalence + open EqR T.setoid + associative : {R₁ R₂ R₃ R₄ : Ring c ℓ} {f : R₃ -Ring⟶ R₄} {g : R₂ -Ring⟶ R₃} {h : R₁ -Ring⟶ R₂} + → (f ∘ (g ∘ h)) ≈ ((f ∘ g) ∘ h) + associative {f = f} {g} {h} = ≈-refl {F = f ∘ (g ∘ h)} + +