aboutsummaryrefslogtreecommitdiff
path: root/Category
diff options
context:
space:
mode:
Diffstat (limited to 'Category')
-rw-r--r--Category/BinaryBiproducts.agda44
-rw-r--r--Category/Dagger/2-Poset.agda49
-rw-r--r--Category/Dagger/Semiadditive.agda253
-rw-r--r--Category/Semiadditive.agda4
-rw-r--r--Category/Semiadditive/Monoidal.agda166
5 files changed, 474 insertions, 42 deletions
diff --git a/Category/BinaryBiproducts.agda b/Category/BinaryBiproducts.agda
index 81a23cf..3ded5a7 100644
--- a/Category/BinaryBiproducts.agda
+++ b/Category/BinaryBiproducts.agda
@@ -285,3 +285,47 @@ record BinaryBiproducts : Set (levelOfTerm 𝒞) where
×₁∘second : {A B C D E : Obj} {f : A ⇒ B} {g : D ⇒ E} {h : C ⇒ D} → (f ×₁ g) ∘ second h ≈ f ×₁ (g ∘ h)
×₁∘second = ×₁∘×₁ ○ ×₁-cong₂ identityʳ Equiv.refl
+
+ -- Swap middle two of four
+
+ σ₂₃ : {A B C D : Obj} → (A ⊕ B) ⊕ (C ⊕ D) ⇒ (A ⊕ C) ⊕ (B ⊕ D)
+ σ₂₃ = ⟨ π₁ ×₁ π₁ , π₂ ×₁ π₂ ⟩
+
+ σ₂₃-σ₂₃
+ : {A B C D : Obj}
+ → σ₂₃ {A} {B} {C} {D} ∘ σ₂₃ ≈ id
+ σ₂₃-σ₂₃ = begin
+ ⟨ π₁ ×₁ π₁ , π₂ ×₁ π₂ ⟩ ∘ σ₂₃ ≈⟨ ⟨⟩∘ ⟩
+ ⟨ π₁ ×₁ π₁ ∘ σ₂₃ , π₂ ×₁ π₂ ∘ σ₂₃ ⟩ ≈⟨ ⟨⟩-cong₂ ×₁∘⟨⟩ ×₁∘⟨⟩ ⟩
+ ⟨ ⟨ π₁ ∘ π₁ ×₁ π₁ , π₁ ∘ π₂ ×₁ π₂ ⟩ , ⟨ π₂ ∘ _ , π₂ ∘ _ ⟩ ⟩ ≈⟨ ⟨⟩-cong₂ (⟨⟩-cong₂ π₁∘×₁ π₁∘×₁) (⟨⟩-cong₂ π₂∘×₁ π₂∘×₁) ⟩
+ ⟨ ⟨ π₁ ∘ π₁ , π₂ ∘ π₁ ⟩ , ⟨ π₁ ∘ π₂ , π₂ ∘ π₂ ⟩ ⟩ ≈⟨ ⟨⟩-cong₂ g-η g-η ⟩
+ ⟨ π₁ , π₂ ⟩ ≈⟨ η ⟩
+ id ∎
+
+ σ₂₃-×₁
+ : {A A′ B B′ C C′ D D′ : Obj}
+ {f : A ⇒ A′}
+ {g : B ⇒ B′}
+ {h : C ⇒ C′}
+ {i : D ⇒ D′}
+ → (f ×₁ g) ×₁ (h ×₁ i) ∘ σ₂₃ ≈ σ₂₃ ∘ (f ×₁ h) ×₁ (g ×₁ i)
+ σ₂₃-×₁ {f = f} {g} {h} {i} = begin
+ (f ×₁ g) ×₁ (h ×₁ i) ∘ ⟨ π₁ ×₁ π₁ , π₂ ×₁ π₂ ⟩ ≈⟨ ×₁∘⟨⟩ ⟩
+ ⟨ f ×₁ g ∘ π₁ ×₁ π₁ , h ×₁ i ∘ π₂ ×₁ π₂ ⟩ ≈⟨ ⟨⟩-cong₂ ×₁∘×₁ ×₁∘×₁ ⟩
+ ⟨ (f ∘ π₁) ×₁ (g ∘ π₁) , (h ∘ π₂) ×₁ (i ∘ π₂) ⟩ ≈⟨ ⟨⟩-cong₂ (×₁-cong₂ π₁∘×₁ π₁∘×₁) (×₁-cong₂ π₂∘×₁ π₂∘×₁) ⟨
+ ⟨ (π₁ ∘ f ×₁ h) ×₁ (π₁ ∘ g ×₁ i) , (π₂ ∘ f ×₁ h) ×₁ (π₂ ∘ g ×₁ i) ⟩ ≈⟨ ⟨⟩-cong₂ ×₁∘×₁ ×₁∘×₁ ⟨
+ ⟨ π₁ ×₁ π₁ ∘ (f ×₁ h) ×₁ (g ×₁ i) , π₂ ×₁ π₂ ∘ (f ×₁ h) ×₁ (g ×₁ i) ⟩ ≈⟨ ⟨⟩∘ ⟨
+ σ₂₃ ∘ (f ×₁ h) ×₁ (g ×₁ i) ∎
+
+ σ₂₃-⟨⟩
+ : {X A B C D : Obj}
+ {f : X ⇒ A}
+ {g : X ⇒ B}
+ {h : X ⇒ C}
+ {i : X ⇒ D}
+ → σ₂₃ ∘ ⟨ ⟨ f , g ⟩ , ⟨ h , i ⟩ ⟩ ≈ ⟨ ⟨ f , h ⟩ , ⟨ g , i ⟩ ⟩
+ σ₂₃-⟨⟩ {f = f} {g} {h} {i} = begin
+ σ₂₃ ∘ ⟨ ⟨ f , g ⟩ , ⟨ h , i ⟩ ⟩ ≈⟨ ⟨⟩∘ ⟩
+ ⟨ π₁ ×₁ π₁ ∘ ⟨ ⟨ f , g ⟩ , ⟨ h , i ⟩ ⟩ , π₂ ×₁ π₂ ∘ ⟨ ⟨ f , g ⟩ , ⟨ h , i ⟩ ⟩ ⟩ ≈⟨ ⟨⟩-cong₂ ×₁∘⟨⟩ ×₁∘⟨⟩ ⟩
+ ⟨ ⟨ π₁ ∘ ⟨ f , g ⟩ , π₁ ∘ ⟨ h , i ⟩ ⟩ , ⟨ π₂ ∘ ⟨ f , g ⟩ , π₂ ∘ ⟨ h , i ⟩ ⟩ ⟩ ≈⟨ ⟨⟩-cong₂ (⟨⟩-cong₂ project₁ project₁) (⟨⟩-cong₂ project₂ project₂) ⟩
+ ⟨ ⟨ f , h ⟩ , ⟨ g , i ⟩ ⟩ ∎
diff --git a/Category/Dagger/2-Poset.agda b/Category/Dagger/2-Poset.agda
index 27c01af..fcd7e4a 100644
--- a/Category/Dagger/2-Poset.agda
+++ b/Category/Dagger/2-Poset.agda
@@ -1,7 +1,6 @@
{-# OPTIONS --without-K --safe #-}
open import Categories.Category using (Category)
-open import Category.Dagger.Semiadditive using (IdempotentSemiadditiveDagger)
open import Level using (Level; suc; _⊔_)
module Category.Dagger.2-Poset {o ℓ e : Level} where
@@ -17,7 +16,7 @@ open import Categories.Enriched.Category Posets-Monoidal using () renaming (Cate
open import Data.Product using (_,_)
open import Data.Unit.Polymorphic using (tt)
open import Relation.Binary using (Poset)
-open import Relation.Binary.Morphism.Bundles using (PosetHomomorphism; mkPosetHomo)
+open import Relation.Binary.Morphism.Bundles using (PosetHomomorphism)
open PosetHomomorphism using (⟦_⟧; cong; mono)
@@ -51,49 +50,13 @@ record Dagger-2-Poset : Set (suc (o ⊔ ℓ ⊔ e)) where
private
module P {A B : Obj} = Poset (hom A B)
- open P using (_≤_) public
+ open P using (_≤_; reflexive) public
open Category category hiding (Obj) public
open HasDagger hasDagger public
field
†-resp-≤ : {A B : Obj} {f g : A ⇒ B} → f ≤ g → f † ≤ g †
-dagger-2-poset : {𝒞 : Category o ℓ e} (ISA† : IdempotentSemiadditiveDagger 𝒞) → Dagger-2-Poset
-dagger-2-poset {𝒞} ISA† = record
- { 2-poset = record
- { Obj = Obj
- ; hom = λ A B → record
- { Carrier = A ⇒ B
- ; _≈_ = _≈_
- ; _≤_ = ISA†._≤_
- ; isPartialOrder = record
- { isPreorder = record
- { isEquivalence = equiv
- ; reflexive = λ x≈y → Equiv.trans (ISA†.+-congʳ x≈y) ISA†.≤-refl
- ; trans = ISA†.≤-trans
- }
- ; antisym = ISA†.≤-antisym
- }
- }
- ; id = mkPosetHomo _ _ (λ _ → id) (λ _ → ISA†.≤-refl)
- ; ⊚ = mkPosetHomo _ _ (λ (f , g) → f ∘ g) (λ (≤₁ , ≤₂) → ISA†.≤-resp-∘ ≤₁ ≤₂)
- ; ⊚-assoc = assoc
- ; unitˡ = identityˡ
- ; unitʳ = identityʳ
- }
- ; hasDagger = record
- { _† = ISA†._†
- ; †-identity = ISA†.†-identity
- ; †-homomorphism = ISA†.†-homomorphism
- ; †-resp-≈ = ISA†.⟨_⟩†
- ; †-involutive = ISA†.†-involutive
- }
- ; †-resp-≤ = ISA†.†-resp-≤
- }
- where
- module ISA† = IdempotentSemiadditiveDagger ISA†
- open Category 𝒞
-
module _ (S : Dagger-2-Poset) where
open Dagger-2-Poset S
@@ -104,6 +67,14 @@ module _ (S : Dagger-2-Poset) where
functional : f ∘ f † ≤ id
entire : id ≤ f † ∘ f
+ open import Categories.Morphism category using (Iso)
+
+ unitary-isMap : {A B : Obj} {f : A ⇒ B} → Iso f (f †) → IsMap f
+ unitary-isMap iso = let open Iso iso in record
+ { functional = reflexive isoʳ
+ ; entire = reflexive (Equiv.sym isoˡ)
+ }
+
record Map (A B : Obj) : Set (ℓ ⊔ e) where
field
diff --git a/Category/Dagger/Semiadditive.agda b/Category/Dagger/Semiadditive.agda
index a5b03ab..424f8df 100644
--- a/Category/Dagger/Semiadditive.agda
+++ b/Category/Dagger/Semiadditive.agda
@@ -5,11 +5,21 @@ open import Categories.Category using (Category)
module Category.Dagger.Semiadditive {o ℓ e : Level} (𝒞 : Category o ℓ e) where
+import Categories.Morphism as Morphism
import Categories.Morphism.Reasoning 𝒞 as ⇒-Reasoning
+import Category.Semiadditive.Monoidal as SemiadditiveMonoidal
open import Categories.Category.Dagger using (HasDagger)
+open import Categories.Category.Monoidal using (Monoidal)
+open import Categories.Category.Monoidal.Bundle using (MonoidalCategory; SymmetricMonoidalCategory)
+open import Categories.Functor.Bifunctor using (Bifunctor)
+open import Categories.Morphism using (Iso)
+open import Categories.Morphism.Properties 𝒞 using (Iso-resp-≈; Iso-swap)
+open import Category.Dagger.2-Poset using (Dagger-2-Poset; Map; Maps; unitary-isMap)
open import Category.Semiadditive using (Semiadditive)
+open import Data.Product using (_,_)
open import Relation.Binary using (Rel)
+open import Relation.Binary.Morphism.Bundles using (PosetHomomorphism; mkPosetHomo)
record SemiadditiveDagger : Set (suc (o ⊔ ℓ ⊔ e)) where
@@ -41,6 +51,42 @@ record SemiadditiveDagger : Set (suc (o ⊔ ℓ ⊔ e)) where
Δ † † ≈⟨ †-involutive Δ ⟩
Δ ∎
+ i₁† : {A B : Obj} → i₁ {A} {B} † ≈ π₁
+ i₁† = begin
+ i₁ † ≈⟨ ⟨ π₁† ⟩† ⟨
+ π₁ † † ≈⟨ †-involutive π₁ ⟩
+ π₁ ∎
+
+ i₂† : {A B : Obj} → i₂ {A} {B} † ≈ π₂
+ i₂† = begin
+ i₂ † ≈⟨ ⟨ π₂† ⟩† ⟨
+ π₂ † † ≈⟨ †-involutive π₂ ⟩
+ π₂ ∎
+
+ module _ {A B C : Obj} where
+
+ α⇒† : assocˡ {A} {B} {C} † ≈ assocʳ
+ α⇒† = begin
+ ⟨ π₁ ∘ π₁ , ⟨ π₂ ∘ π₁ , π₂ ⟩ ⟩ † ≈⟨ ⟨⟩-† ⟩
+ [ (π₁ ∘ π₁) † , ⟨ π₂ ∘ π₁ , π₂ ⟩ † ] ≈⟨ []-cong₂ †-homomorphism ⟨⟩-† ⟩
+ [ π₁ † ∘ π₁ † , [ (π₂ ∘ π₁) † , π₂ † ] ] ≈⟨ []-congˡ ([]-congʳ †-homomorphism) ⟩
+ [ π₁ † ∘ π₁ † , [ π₁ † ∘ π₂ † , π₂ † ] ] ≈⟨ []-cong₂ (π₁† ⟩∘⟨ π₁†) ([]-cong₂ (π₁† ⟩∘⟨ π₂†) π₂†) ⟩
+ [ i₁ ∘ i₁ , [ i₁ ∘ i₂ , i₂ ] ] ≈⟨ assocʳ≈+-assocʳ ⟨
+ assocʳ ∎
+
+ α⇐† : assocʳ {A} {B} {C} † ≈ assocˡ
+ α⇐† = begin
+ assocʳ † ≈⟨ ⟨ α⇒† ⟩† ⟨
+ assocˡ † † ≈⟨ †-involutive assocˡ ⟩
+ assocˡ ∎
+
+ swap† : {A B : Obj} → swap {A} {B} † ≈ swap {B} {A}
+ swap† {A} {B} = begin
+ ⟨ π₂ , π₁ ⟩ † ≈⟨ ⟨⟩-† ⟩
+ [ π₂ † , π₁ † ] ≈⟨ []-cong₂ π₂† π₁† ⟩
+ [ i₂ , i₁ ] ≈⟨ swap≈+-swap ⟨
+ ⟨ π₂ , π₁ ⟩ ∎
+
†-resp-×₁ : {A B C D : Obj} {f : A ⇒ B} {g : C ⇒ D} → (f ×₁ g) † ≈ (f †) ×₁ (g †)
†-resp-×₁ {f = f} {g} = begin
⟨ f ∘ π₁ , g ∘ π₂ ⟩ † ≈⟨ ⟨⟩-† ⟩
@@ -77,6 +123,21 @@ record SemiadditiveDagger : Set (suc (o ⊔ ℓ ⊔ e)) where
id ∘ f ∘ h + id ∘ g ∘ h ≈⟨ +-cong (pullˡ identityˡ) (pullˡ identityˡ) ⟩
f ∘ h + g ∘ h ∎
+ open SemiadditiveMonoidal semiadditive using (monoidal; symmetric)
+
+ monoidalCategory : MonoidalCategory o ℓ e
+ monoidalCategory = record
+ { U = 𝒞
+ ; monoidal = monoidal
+ }
+
+ symmetricMonoidalCategory : SymmetricMonoidalCategory o ℓ e
+ symmetricMonoidalCategory = record
+ { U = 𝒞
+ ; monoidal = monoidal
+ ; symmetric = symmetric
+ }
+
record IdempotentSemiadditiveDagger : Set (suc (o ⊔ ℓ ⊔ e)) where
field
@@ -127,6 +188,41 @@ record IdempotentSemiadditiveDagger : Set (suc (o ⊔ ℓ ⊔ e)) where
(f + h) + (g + i) ≈⟨ +-cong f≤h g≤i ⟩
h + i ∎
+ Δ-⊕ : {X Y : Obj} → Δ {X ⊕ Y} ≈ σ₂₃ ∘ Δ ×₁ Δ
+ Δ-⊕ {X} {Y} = begin
+ ⟨ id , id ⟩ ≈⟨ ⟨⟩-cong₂ id×₁id id×₁id ⟨
+ ⟨ id ×₁ id , id ×₁ id ⟩ ≈⟨ ⟨⟩-cong₂ (×₁-cong₂ project₁ project₁) (×₁-cong₂ project₂ project₂) ⟨
+ ⟨ (π₁ ∘ Δ) ×₁ (π₁ ∘ Δ) , (π₂ ∘ Δ) ×₁ (π₂ ∘ Δ) ⟩ ≈⟨ ⟨⟩-cong₂ ×₁∘×₁ ×₁∘×₁ ⟨
+ ⟨ π₁ ×₁ π₁ ∘ Δ ×₁ Δ , π₂ ×₁ π₂ ∘ Δ ×₁ Δ ⟩ ≈⟨ ⟨⟩∘ ⟨
+ σ₂₃ ∘ Δ ×₁ Δ ∎
+
+ ∇-⊕ : {X Y : Obj} → ∇ {X ⊕ Y} ≈ ∇ ×₁ ∇ ∘ σ₂₃
+ ∇-⊕ {X} {Y} = begin
+ [ id , id ] ≈⟨ []-cong₂ id×₁id id×₁id ⟨
+ [ id ×₁ id , id ×₁ id ] ≈⟨ []-cong₂ (×₁-cong₂ inject₁ inject₁) (×₁-cong₂ inject₂ inject₂) ⟨
+ [ (∇ ∘ i₁) ×₁ (∇ ∘ i₁) , (∇ ∘ i₂) ×₁ (∇ ∘ i₂) ] ≈⟨ []-cong₂ ×₁∘×₁ ×₁∘×₁ ⟨
+ [ ∇ ×₁ ∇ ∘ i₁ ×₁ i₁ , ∇ ×₁ ∇ ∘ i₂ ×₁ i₂ ] ≈⟨ ∘[] ⟨
+ ∇ ×₁ ∇ ∘ [ i₁ ×₁ i₁ , i₂ ×₁ i₂ ] ≈⟨ refl⟩∘⟨ ⟨⟩-unique (∘[] ○ []-cong₂ π₁∘×₁ π₁∘×₁) (∘[] ○ []-cong₂ π₂∘×₁ π₂∘×₁) ⟨
+ ∇ ×₁ ∇ ∘ ⟨ π₁ +₁ π₁ , π₂ +₁ π₂ ⟩ ≈⟨ refl⟩∘⟨ ⟨⟩-cong₂ (×₁-+₁ π₁ π₁) (×₁-+₁ π₂ π₂) ⟨
+ ∇ ×₁ ∇ ∘ σ₂₃ ∎
+
+ ≤-resp-×₁
+ : {A B C D : Obj}
+ {f h : A ⇒ B}
+ {g i : C ⇒ D}
+ → f ≤ h
+ → g ≤ i
+ → (f ×₁ g) ≤ (h ×₁ i)
+ ≤-resp-×₁ {f = f} {h} {g} {i} f≤h g≤i = begin
+ ∇ ∘ (f ×₁ g) ×₁ (h ×₁ i) ∘ Δ ≈⟨ refl⟩∘⟨ refl⟩∘⟨ Δ-⊕ ⟩
+ ∇ ∘ (f ×₁ g) ×₁ (h ×₁ i) ∘ σ₂₃ ∘ Δ ×₁ Δ ≈⟨ refl⟩∘⟨ extendʳ σ₂₃-×₁ ⟩
+ ∇ ∘ σ₂₃ ∘ (f ×₁ h) ×₁ (g ×₁ i) ∘ Δ ×₁ Δ ≈⟨ pushˡ ∇-⊕ ⟩
+ ∇ ×₁ ∇ ∘ σ₂₃ ∘ σ₂₃ ∘ (f ×₁ h) ×₁ (g ×₁ i) ∘ Δ ×₁ Δ ≈⟨ refl⟩∘⟨ cancelˡ σ₂₃-σ₂₃ ⟩
+ ∇ ×₁ ∇ ∘ (f ×₁ h) ×₁ (g ×₁ i) ∘ Δ ×₁ Δ ≈⟨ refl⟩∘⟨ ×₁∘×₁ ⟩
+ ∇ ×₁ ∇ ∘ (f ×₁ h ∘ Δ) ×₁ (g ×₁ i ∘ Δ) ≈⟨ ×₁∘×₁ ⟩
+ (∇ ∘ f ×₁ h ∘ Δ) ×₁ (∇ ∘ g ×₁ i ∘ Δ) ≈⟨ ×₁-cong₂ f≤h g≤i ⟩
+ h ×₁ i ∎
+
≤-resp-∘
: {A B C : Obj}
{f h : B ⇒ C}
@@ -156,3 +252,160 @@ record IdempotentSemiadditiveDagger : Set (suc (o ⊔ ℓ ⊔ e)) where
∇ ∘ Δ ≈⟨ refl⟩∘⟨ introˡ id×₁id ⟩
∇ ∘ id ×₁ id ∘ Δ ≈⟨ idempotent ⟩
id ∎
+
+ dagger-2-poset : Dagger-2-Poset
+ dagger-2-poset = record
+ { 2-poset = record
+ { Obj = Obj
+ ; hom = λ A B → record
+ { Carrier = A ⇒ B
+ ; _≈_ = _≈_
+ ; _≤_ = _≤_
+ ; isPartialOrder = record
+ { isPreorder = record
+ { isEquivalence = equiv
+ ; reflexive = λ x≈y → Equiv.trans (+-congʳ x≈y) ≤-refl
+ ; trans = ≤-trans
+ }
+ ; antisym = ≤-antisym
+ }
+ }
+ ; id = mkPosetHomo _ _ (λ _ → id) (λ _ → ≤-refl)
+ ; ⊚ = mkPosetHomo _ _ (λ (f , g) → f ∘ g) (λ (≤₁ , ≤₂) → ≤-resp-∘ ≤₁ ≤₂)
+ ; ⊚-assoc = assoc
+ ; unitˡ = identityˡ
+ ; unitʳ = identityʳ
+ }
+ ; hasDagger = record
+ { _† = _†
+ ; †-identity = †-identity
+ ; †-homomorphism = †-homomorphism
+ ; †-resp-≈ = ⟨_⟩†
+ ; †-involutive = †-involutive
+ }
+ ; †-resp-≤ = †-resp-≤
+ }
+
+ maps : Category o (ℓ ⊔ e) e
+ maps = Maps dagger-2-poset
+
+ open Dagger-2-Poset dagger-2-poset using (category)
+ open SemiadditiveMonoidal semiadditive using (monoidal)
+
+ module M = Monoidal monoidal
+
+ ×₁-functional
+ : {A B C D : Obj}
+ {f : A ⇒ B}
+ {g : C ⇒ D}
+ → (f ∘ f †) ≤ id
+ → (g ∘ g †) ≤ id
+ → (f ×₁ g ∘ (f ×₁ g) †) ≤ id
+ ×₁-functional {f = f} {g} f∘f†≤id g∘g†≤id = begin
+ f ×₁ g ∘ (f ×₁ g) † + id ≈⟨ +-congʳ (refl⟩∘⟨ †-resp-×₁) ⟩
+ f ×₁ g ∘ (f †) ×₁ (g †) + id ≈⟨ +-cong ×₁∘×₁ (Equiv.sym id×₁id) ⟩
+ (f ∘ f †) ×₁ (g ∘ g †) + id ×₁ id ≈⟨ ≤-resp-×₁ f∘f†≤id g∘g†≤id ⟩
+ id ×₁ id ≈⟨ id×₁id ⟩
+ id ∎
+
+ ×₁-entire
+ : {A B C D : Obj}
+ {f : A ⇒ B}
+ {g : C ⇒ D}
+ → id ≤ (f † ∘ f)
+ → id ≤ (g † ∘ g)
+ → id ≤ ((f ×₁ g) † ∘ f ×₁ g)
+ ×₁-entire {f = f} {g} id≤f†∘f id≤g†∘g = begin
+ id + (f ×₁ g) † ∘ (f ×₁ g) ≈⟨ +-congˡ (†-resp-×₁ ⟩∘⟨refl) ⟩
+ id + (f †) ×₁ (g †) ∘ f ×₁ g ≈⟨ +-cong (Equiv.sym id×₁id) ×₁∘×₁ ⟩
+ id ×₁ id + (f † ∘ f) ×₁ (g † ∘ g) ≈⟨ ≤-resp-×₁ id≤f†∘f id≤g†∘g ⟩
+ (f † ∘ f) ×₁ (g † ∘ g) ≈⟨ ×₁∘×₁ ⟨
+ (f †) ×₁ (g †) ∘ f ×₁ g ≈⟨ †-resp-×₁ ⟩∘⟨refl ⟨
+ (f ×₁ g) † ∘ f ×₁ g ∎
+
+ open Map
+
+ ⊗ : Bifunctor maps maps maps
+ ⊗ = record
+ { F₀ = M.⊗.₀
+ ; F₁ = λ (f , g) → record
+ { map = map f M.⊗₁ map g
+ ; isMap = record
+ { functional = ×₁-functional (functional f) (functional g)
+ ; entire = ×₁-entire (entire f) (entire g)
+ }
+ }
+ ; identity = M.⊗.identity
+ ; homomorphism = M.⊗.homomorphism
+ ; F-resp-≈ = M.⊗.F-resp-≈
+ }
+
+ open Morphism maps using (_≅_)
+ open Equiv
+
+ λ⇒-unitary : {X : Obj} → Iso category (π₂ {𝟘} {X}) (π₂ †)
+ λ⇒-unitary = record { Iso (Iso-resp-≈ M.unitorˡ.iso refl (sym π₂†)) }
+
+ λ⇐-unitary : {X : Obj} → Iso category (i₂ {𝟘} {X}) (i₂ †)
+ λ⇐-unitary = record { Iso (Iso-swap (Iso-resp-≈ M.unitorˡ.iso (sym i₂†) refl)) }
+
+ ρ⇒-unitary : {X : Obj} → Iso category (π₁ {X} {𝟘}) (π₁ †)
+ ρ⇒-unitary = record { Iso (Iso-resp-≈ M.unitorʳ.iso refl (sym π₁†)) }
+
+ ρ⇐-unitary : {X : Obj} → Iso category (i₁ {X} {𝟘}) (i₁ †)
+ ρ⇐-unitary = record { Iso (Iso-swap (Iso-resp-≈ M.unitorʳ.iso (sym i₁†) refl)) }
+
+ α⇒-unitary : {X Y Z : Obj} → Iso category (assocˡ {X} {Y} {Z}) (assocˡ †)
+ α⇒-unitary = record { Iso (Iso-resp-≈ M.associator.iso refl (sym α⇒†)) }
+
+ α⇐-unitary : {X Y Z : Obj} → Iso category (assocʳ {X} {Y} {Z}) (assocʳ †)
+ α⇐-unitary = record { Iso (Iso-swap (Iso-resp-≈ M.associator.iso (sym α⇐†) refl)) }
+
+ unitorˡ : {X : Obj} → 𝟘 M.⊗₀ X ≅ X
+ unitorˡ = record
+ { from = record
+ { map = M.unitorˡ.from
+ ; isMap = unitary-isMap dagger-2-poset λ⇒-unitary
+ }
+ ; to = record
+ { map = M.unitorˡ.to
+ ; isMap = unitary-isMap dagger-2-poset λ⇐-unitary
+ }
+ ; iso = record { M.unitorˡ }
+ }
+
+ unitorʳ : {X : Obj} → X M.⊗₀ 𝟘 ≅ X
+ unitorʳ = record
+ { from = record
+ { map = M.unitorʳ.from
+ ; isMap = unitary-isMap dagger-2-poset ρ⇒-unitary
+ }
+ ; to = record
+ { map = M.unitorʳ.to
+ ; isMap = unitary-isMap dagger-2-poset ρ⇐-unitary
+ }
+ ; iso = record { M.unitorʳ }
+ }
+
+ associator : {X Y Z : Obj} → (X M.⊗₀ Y) M.⊗₀ Z ≅ X M.⊗₀ (Y M.⊗₀ Z)
+ associator = record
+ { from = record
+ { map = M.associator.from
+ ; isMap = unitary-isMap dagger-2-poset α⇒-unitary
+ }
+ ; to = record
+ { map = M.associator.to
+ ; isMap = unitary-isMap dagger-2-poset α⇐-unitary
+ }
+ ; iso = record { M.associator }
+ }
+
+ maps-monoidal : Monoidal maps
+ maps-monoidal = record
+ { ⊗ = ⊗
+ ; unit = 𝟘
+ ; unitorˡ = unitorˡ
+ ; unitorʳ = unitorʳ
+ ; associator = associator
+ ; M
+ }
diff --git a/Category/Semiadditive.agda b/Category/Semiadditive.agda
index 05ce264..86b5585 100644
--- a/Category/Semiadditive.agda
+++ b/Category/Semiadditive.agda
@@ -13,6 +13,7 @@ open import Categories.Category.CMonoidEnriched using (CM-Category)
open import Categories.Category.Cartesian 𝒞 using (Cartesian)
open import Categories.Category.Cartesian.Monoidal using (module CartesianMonoidal)
open import Categories.Category.Cocartesian 𝒞 using (Cocartesian)
+open import Categories.Category.Monoidal.Bundle using (MonoidalCategory; SymmetricMonoidalCategory)
open import Categories.Object.Zero 𝒞 using (Zero)
open import Category.BinaryBiproducts 𝒞 using (BinaryBiproducts)
open import Data.Product using (_,_)
@@ -176,6 +177,3 @@ record Semiadditive : Set (levelOfTerm 𝒞) where
{ initial = initial
; coproducts = binaryCoproducts
}
-
- open CartesianMonoidal cartesian using (monoidal) public
- open CartesianSymmetricMonoidal cartesian using (symmetric) public
diff --git a/Category/Semiadditive/Monoidal.agda b/Category/Semiadditive/Monoidal.agda
new file mode 100644
index 0000000..3a4a3b7
--- /dev/null
+++ b/Category/Semiadditive/Monoidal.agda
@@ -0,0 +1,166 @@
+{-# OPTIONS --without-K --safe #-}
+
+open import Categories.Category using (Category)
+open import Category.Semiadditive using (Semiadditive)
+open import Level using (Level)
+
+module Category.Semiadditive.Monoidal {o ℓ e : Level} {𝒞 : Category o ℓ e} (semiadditive : Semiadditive 𝒞) where
+
+open import Categories.Category.Monoidal using (Monoidal)
+open import Categories.Category.Monoidal.Braided using (Braided)
+open import Categories.Category.Monoidal.Symmetric using (Symmetric)
+open import Categories.Functor.Bifunctor using (flip-bifunctor)
+open import Categories.Morphism 𝒞 using (_≅_)
+open import Categories.Morphism.Reasoning 𝒞
+open import Categories.NaturalTransformation.NaturalIsomorphism using (_≃_; niHelper)
+
+open Category 𝒞
+open Equiv
+open HomReasoning
+open Semiadditive semiadditive
+
+-- Structure isomorphisms
+
+unitorˡ : {X : Obj} → 𝟘 ⊕ X ≅ X
+unitorˡ {X} = record
+ { from = π₂
+ ; to = i₂
+ ; iso = record
+ { isoˡ = sym (⟨⟩-unique !-unique₂ (pullˡ π₂∘i₂≈id)) ○ id×₁id
+ ; isoʳ = π₂∘i₂≈id
+ }
+ }
+
+unitorʳ : {X : Obj} → X ⊕ 𝟘 ≅ X
+unitorʳ {X} = record
+ { from = π₁
+ ; to = i₁
+ ; iso = record
+ { isoˡ = sym (⟨⟩-unique (pullˡ π₁∘i₁≈id) !-unique₂) ○ id×₁id
+ ; isoʳ = π₁∘i₁≈id
+ }
+ }
+
+associator : {X Y Z : Obj} → (X ⊕ Y) ⊕ Z ≅ X ⊕ (Y ⊕ Z)
+associator = record
+ { from = assocˡ
+ ; to = assocʳ
+ ; iso = record
+ { isoˡ = assocʳ∘assocˡ
+ ; isoʳ = assocˡ∘assocʳ
+ }
+ }
+
+braiding : -×- ≃ flip-bifunctor -×-
+braiding = niHelper record
+ { η = λ _ → swap
+ ; η⁻¹ = λ _ → swap
+ ; commute = λ _ → swap∘×₁
+ ; iso = λ X → record
+ { isoˡ = swap∘swap
+ ; isoʳ = swap∘swap
+ }
+ }
+
+-- Naturality conditions
+
+unitorˡ-commute-to
+ : {X Y : Obj}
+ {f : X ⇒ Y}
+ → i₂ ∘ f
+ ≈ id ×₁ f ∘ i₂ {𝟘} {X}
+unitorˡ-commute-to {f = f} = sym +₁∘i₂ ○ sym (×₁-+₁ id f) ⟩∘⟨refl
+
+unitorʳ-commute-to
+ : {X Y : Obj}
+ {f : X ⇒ Y}
+ → i₁ ∘ f
+ ≈ f ×₁ id ∘ i₁ {X} {𝟘}
+unitorʳ-commute-to {f = f} = sym +₁∘i₁ ○ sym (×₁-+₁ f id) ⟩∘⟨refl
+
+-- Coherence conditions
+
+triangle
+ : {X Y : Obj}
+ → id ×₁ π₂ ∘ assocˡ {X} {𝟘} {Y} ≈ π₁ ×₁ id
+triangle {X} {Y} = begin
+ id ×₁ π₂ ∘ assocˡ ≈⟨ second∘⟨⟩ ⟩
+ ⟨ π₁ ∘ π₁ , π₂ ∘ ⟨ π₂ ∘ π₁ , π₂ ⟩ ⟩ ≈⟨ ⟨⟩-congˡ (project₂ ○ (sym identityˡ)) ⟩
+ π₁ ×₁ id ∎
+
+pentagon
+ : {W X Y Z : Obj}
+ → id {W} ×₁ assocˡ {X} {Y} {Z} ∘ assocˡ ∘ assocˡ ×₁ id ≈ assocˡ ∘ assocˡ
+pentagon {W} {X} {Y} {Z} = begin
+ id ×₁ assocˡ ∘ assocˡ ∘ assocˡ ×₁ id ≈⟨ pullˡ second∘⟨⟩ ⟩
+ ⟨ π₁ ∘ π₁ , assocˡ ∘ ⟨ π₂ ∘ π₁ , π₂ ⟩ ⟩ ∘ assocˡ ×₁ id ≈⟨ ⟨⟩∘ ⟩
+ ⟨ (π₁ ∘ π₁) ∘ assocˡ ×₁ id , (assocˡ ∘ ⟨ π₂ ∘ π₁ , π₂ ⟩) ∘ assocˡ ×₁ id ⟩ ≈⟨ ⟨⟩-congʳ (pullʳ π₁∘×₁) ⟩
+ ⟨ π₁ ∘ assocˡ ∘ π₁ , (assocˡ ∘ ⟨ π₂ ∘ π₁ , π₂ ⟩) ∘ _ ×₁ id ⟩ ≈⟨ ⟨⟩-congʳ (extendʳ project₁) ⟩
+ ⟨ π₁ ∘ π₁ ∘ π₁ , (assocˡ ∘ ⟨ π₂ ∘ π₁ , π₂ ⟩) ∘ assocˡ ×₁ id ⟩ ≈⟨ ⟨⟩-congˡ (⟨⟩∘ ⟩∘⟨refl)⟩
+ ⟨ π₁ ∘ _ , ⟨ (π₁ ∘ π₁) ∘ ⟨ π₂ ∘ π₁ , π₂ ⟩ , _ ∘ _ ⟩ ∘ _ ×₁ id ⟩ ≈⟨ ⟨⟩-congˡ (⟨⟩-congʳ (pullʳ project₁) ⟩∘⟨refl) ⟩
+ ⟨ π₁ ∘ _ , ⟨ π₁ ∘ π₂ ∘ π₁ , ⟨ π₂ ∘ π₁ , π₂ ⟩ ∘ ⟨ _ , π₂ ⟩ ⟩ ∘ _ ⟩ ≈⟨ ⟨⟩-congˡ (⟨⟩-congˡ ⟨⟩∘ ⟩∘⟨refl) ⟩
+ ⟨ π₁ ∘ _ , ⟨ π₁ ∘ _ , ⟨ (π₂ ∘ π₁) ∘ ⟨ _ , π₂ ⟩ , π₂ ∘ ⟨ _ , π₂ ⟩ ⟩ ⟩ ∘ _ ⟩ ≈⟨ ⟨⟩-congˡ (⟨⟩-congˡ (⟨⟩-cong₂ (pullʳ project₁) project₂) ⟩∘⟨refl) ⟩
+ ⟨ π₁ ∘ π₁ ∘ π₁ , ⟨ π₁ ∘ π₂ ∘ π₁ , ⟨ π₂ ∘ π₂ ∘ π₁ , π₂ ⟩ ⟩ ∘ assocˡ ×₁ id ⟩ ≈⟨ ⟨⟩-congˡ ⟨⟩∘ ⟩
+ ⟨ π₁ ∘ π₁ ∘ π₁ , ⟨ (π₁ ∘ π₂ ∘ π₁) ∘ _ ×₁ id , ⟨ _ , π₂ ⟩ ∘ assocˡ ×₁ id ⟩ ⟩ ≈⟨ ⟨⟩-congˡ (⟨⟩-congʳ (pullʳ (pullʳ π₁∘×₁))) ⟩
+ ⟨ π₁ ∘ π₁ ∘ π₁ , ⟨ π₁ ∘ π₂ ∘ assocˡ ∘ π₁ , ⟨ _ , π₂ ⟩ ∘ assocˡ ×₁ id ⟩ ⟩ ≈⟨ ⟨⟩-congˡ (⟨⟩-congʳ (refl⟩∘⟨ pullˡ project₂)) ⟩
+ ⟨ π₁ ∘ π₁ ∘ π₁ , ⟨ π₁ ∘ ⟨ π₂ ∘ π₁ , π₂ ⟩ ∘ π₁ , ⟨ _ , π₂ ⟩ ∘ _ ×₁ id ⟩ ⟩ ≈⟨ ⟨⟩-congˡ (⟨⟩-congʳ (extendʳ project₁)) ⟩
+ ⟨ π₁ ∘ π₁ ∘ π₁ , ⟨ π₂ ∘ π₁ ∘ π₁ , ⟨ π₂ ∘ π₂ ∘ π₁ , π₂ ⟩ ∘ assocˡ ×₁ id ⟩ ⟩ ≈⟨ ⟨⟩-congˡ (⟨⟩-congˡ ⟨⟩∘) ⟩
+ ⟨ π₁ ∘ _ , ⟨ _ , ⟨ (π₂ ∘ π₂ ∘ π₁) ∘ assocˡ ×₁ id , π₂ ∘ assocˡ ×₁ id ⟩ ⟩ ⟩ ≈⟨ ⟨⟩-congˡ (⟨⟩-congˡ (⟨⟩-cong₂ (pullʳ (pullʳ π₁∘×₁)) π₂∘first)) ⟩
+ ⟨ π₁ ∘ π₁ ∘ π₁ , ⟨ π₂ ∘ π₁ ∘ π₁ , ⟨ π₂ ∘ π₂ ∘ assocˡ ∘ π₁ , π₂ ⟩ ⟩ ⟩ ≈⟨ ⟨⟩-congˡ (⟨⟩-congˡ (⟨⟩-congʳ (refl⟩∘⟨ pullˡ project₂))) ⟩
+ ⟨ π₁ ∘ π₁ ∘ π₁ , ⟨ π₂ ∘ π₁ ∘ π₁ , ⟨ π₂ ∘ ⟨ π₂ ∘ π₁ , π₂ ⟩ ∘ π₁ , π₂ ⟩ ⟩ ⟩ ≈⟨ ⟨⟩-congˡ (⟨⟩-congˡ (⟨⟩-congʳ (pullˡ project₂))) ⟩
+ ⟨ π₁ ∘ π₁ ∘ π₁ , ⟨ π₂ ∘ π₁ ∘ π₁ , ⟨ π₂ ∘ π₁ , π₂ ⟩ ⟩ ⟩ ≈⟨ ⟨⟩-cong₂ (pullʳ project₁) (⟨⟩-cong₂ (pullʳ project₁) project₂) ⟨
+ ⟨ (π₁ ∘ π₁) ∘ assocˡ , ⟨ (π₂ ∘ π₁) ∘ assocˡ , π₂ ∘ assocˡ ⟩ ⟩ ≈⟨ ⟨⟩-congˡ ⟨⟩∘ ⟨
+ ⟨ (π₁ ∘ π₁) ∘ assocˡ , ⟨ π₂ ∘ π₁ , π₂ ⟩ ∘ assocˡ ⟩ ≈⟨ ⟨⟩∘ ⟨
+ assocˡ ∘ assocˡ ∎
+
+hexagon₁ : {X Y Z : Obj} → id ×₁ swap ∘ assocˡ {X} {Y} {Z} ∘ swap ×₁ id ≈ assocˡ ∘ swap ∘ assocˡ
+hexagon₁ = begin
+ id ×₁ swap ∘ assocˡ ∘ swap ×₁ id ≈⟨ refl⟩∘⟨ refl⟩∘⟨ ⟨⟩-congʳ ⟨⟩∘ ⟩
+ id ×₁ swap ∘ assocˡ ∘ ⟨ ⟨ π₂ ∘ π₁ , π₁ ∘ π₁ ⟩ , id ∘ π₂ ⟩ ≈⟨ refl⟩∘⟨ assocˡ∘⟨⟩ ⟩
+ id ×₁ swap ∘ ⟨ π₂ ∘ π₁ , ⟨ π₁ ∘ π₁ , id ∘ π₂ ⟩ ⟩ ≈⟨ ×₁∘⟨⟩ ⟩
+ ⟨ id ∘ π₂ ∘ π₁ , swap ∘ ⟨ π₁ ∘ π₁ , id ∘ π₂ ⟩ ⟩ ≈⟨ ⟨⟩-cong₂ identityˡ swap∘⟨⟩ ⟩
+ ⟨ π₂ ∘ π₁ , ⟨ id ∘ π₂ , π₁ ∘ π₁ ⟩ ⟩ ≈⟨ ⟨⟩-congˡ (⟨⟩-congʳ identityˡ) ⟩
+ ⟨ π₂ ∘ π₁ , ⟨ π₂ , π₁ ∘ π₁ ⟩ ⟩ ≈⟨ assocˡ∘⟨⟩ ⟨
+ assocˡ ∘ ⟨ ⟨ π₂ ∘ π₁ , π₂ ⟩ , π₁ ∘ π₁ ⟩ ≈⟨ refl⟩∘⟨ swap∘⟨⟩ ⟨
+ assocˡ ∘ swap ∘ assocˡ ∎
+
+hexagon₂ : {X Y Z : Obj} → (swap ×₁ id ∘ assocʳ {X} {Y} {Z}) ∘ id ×₁ swap ≈ (assocʳ ∘ swap) ∘ assocʳ
+hexagon₂ {X} {Y} {Z} = begin
+ (swap ×₁ id ∘ assocʳ) ∘ id ×₁ swap ≈⟨ pullʳ (refl⟩∘⟨ ⟨⟩-congˡ ⟨⟩∘) ⟩
+ swap ×₁ id ∘ assocʳ ∘ ⟨ id ∘ π₁ , ⟨ π₂ ∘ π₂ , π₁ ∘ π₂ ⟩ ⟩ ≈⟨ refl⟩∘⟨ assocʳ∘⟨⟩ ⟩
+ swap ×₁ id ∘ ⟨ ⟨ id ∘ π₁ , π₂ ∘ π₂ ⟩ , π₁ ∘ π₂ ⟩ ≈⟨ first∘⟨⟩ ⟩
+ ⟨ swap ∘ ⟨ id ∘ π₁ , π₂ ∘ π₂ ⟩ , π₁ ∘ π₂ ⟩ ≈⟨ ⟨⟩-congʳ swap∘⟨⟩ ⟩
+ ⟨ ⟨ π₂ ∘ π₂ , id ∘ π₁ ⟩ , π₁ ∘ π₂ ⟩ ≈⟨ ⟨⟩-congʳ (⟨⟩-congˡ identityˡ) ⟩
+ ⟨ ⟨ π₂ ∘ π₂ , π₁ ⟩ , π₁ ∘ π₂ ⟩ ≈⟨ assocʳ∘⟨⟩ ⟨
+ assocʳ ∘ ⟨ π₂ ∘ π₂ , ⟨ π₁ , π₁ ∘ π₂ ⟩ ⟩ ≈⟨ pushʳ (sym swap∘⟨⟩) ⟩
+ (assocʳ ∘ swap) ∘ assocʳ ∎
+
+monoidal : Monoidal 𝒞
+monoidal = record
+ { ⊗ = -×-
+ ; unit = 𝟘
+ ; unitorˡ = unitorˡ
+ ; unitorʳ = unitorʳ
+ ; associator = associator
+ ; unitorˡ-commute-from = π₂∘×₁
+ ; unitorˡ-commute-to = unitorˡ-commute-to
+ ; unitorʳ-commute-from = π₁∘×₁
+ ; unitorʳ-commute-to = unitorʳ-commute-to
+ ; assoc-commute-from = assocˡ∘×₁
+ ; assoc-commute-to = assocʳ∘×₁
+ ; triangle = triangle
+ ; pentagon = pentagon
+ }
+
+braided : Braided monoidal
+braided = record
+ { braiding = braiding
+ ; hexagon₁ = hexagon₁
+ ; hexagon₂ = hexagon₂
+ }
+
+symmetric : Symmetric monoidal
+symmetric = record
+ { braided = braided
+ ; commutative = swap∘swap
+ }