aboutsummaryrefslogtreecommitdiff
path: root/Data
diff options
context:
space:
mode:
authorJacques Comeaux <jacquesrcomeaux@protonmail.com>2026-07-31 13:08:15 -0700
committerJacques Comeaux <jacquesrcomeaux@protonmail.com>2026-07-31 13:08:15 -0700
commitc48ce55a4bf04ed87e62f7542dcb1703fd762246 (patch)
treeaa419ab164dc4d2e6110e148ea675a619cb9d338 /Data
parentb65266b7b41e3001eb3cf46c95ee6c9af021edc9 (diff)
Add braiding to wiring diagram monoidal structure
Diffstat (limited to 'Data')
-rw-r--r--Data/WiringDiagram/Monoidal/Braided.agda182
-rw-r--r--Data/WiringDiagram/Monoidal/Core.agda (renamed from Data/WiringDiagram/Monoidal.agda)353
2 files changed, 375 insertions, 160 deletions
diff --git a/Data/WiringDiagram/Monoidal/Braided.agda b/Data/WiringDiagram/Monoidal/Braided.agda
new file mode 100644
index 0000000..7b28d85
--- /dev/null
+++ b/Data/WiringDiagram/Monoidal/Braided.agda
@@ -0,0 +1,182 @@
+{-# OPTIONS --without-K --safe #-}
+
+open import Categories.Category using (Category)
+open import Category.Dagger.Semiadditive using (SemiadditiveDagger)
+open import Level using (Level)
+
+module Data.WiringDiagram.Monoidal.Braided
+ {o ℓ e : Level}
+ {𝒞 : Category o ℓ e}
+ (S : SemiadditiveDagger 𝒞)
+ where
+
+import Categories.Morphism.Reasoning 𝒞 as ⇒-Reasoning
+import Data.WiringDiagram.Core as WD
+
+open import Categories.Category.Monoidal using (Monoidal)
+open import Categories.Category.Monoidal.Braided using (Braided)
+open import Categories.Category.Monoidal.Braided.Properties using (hexagon₁-inv; hexagon₂-inv)
+open import Categories.Category.Monoidal.Symmetric using (module Symmetric)
+open import Categories.Functor.Bifunctor using (flip-bifunctor)
+open import Categories.NaturalTransformation.NaturalIsomorphism using (_≃_; niHelper)
+open import Data.Product using (uncurry; _,_)
+open import Data.WiringDiagram.Monoidal.Core S
+ using (_⊞_; _⊞₁_; σ₂₃; associator⇒; associator⇐; DWD-Monoidal; BWD-Monoidal)
+ renaming (module Directed to D; module Balanced to B)
+open import Function using (flip)
+
+open Category 𝒞
+open SemiadditiveDagger S
+open Symmetric symmetric using (braided; hexagon₁; hexagon₂)
+open WD S using (Box; WiringDiagram; _□_; _⧈_; _≈-⧈_; _⌸_; id-⧈; _⌻_; ≈-sym)
+
+open HomReasoning
+open ⇒-Reasoning
+open Equiv
+
+σ₂₃-⟨⟩
+ : {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 ⟩ ⟩ ∎
+
+swap-⧈ : (X Y : Box) → WiringDiagram (X ⊞ Y) (Y ⊞ X)
+swap-⧈ X Y = swap ∘ π₂ ⧈ swap
+
+swap-commute
+ : {X X′ Y Y′ : Box}
+ (f : WiringDiagram X X′)
+ (g : WiringDiagram Y Y′)
+ → swap-⧈ X′ Y′ ⌻ f ⊞₁ g ≈-⧈ g ⊞₁ f ⌻ swap-⧈ X Y
+swap-commute (fᵢ ⧈ fₒ) (gᵢ ⧈ gₒ) = eqᵢ ⌸ swap∘×₁  
+ where
+ eqᵢ : (fᵢ ×₁ gᵢ ∘ σ₂₃) ∘ ⟨ π₁ , (swap ∘ π₂) ∘ (fₒ ×₁ gₒ) ×₁ id ⟩ ≈ (swap ∘ π₂) ∘ ⟨ π₁ , (gᵢ ×₁ fᵢ ∘ σ₂₃) ∘ swap ×₁ id ⟩
+ eqᵢ = begin
+ (fᵢ ×₁ gᵢ ∘ σ₂₃) ∘ ⟨ π₁ , (swap ∘ π₂) ∘ (fₒ ×₁ gₒ) ×₁ id ⟩ ≈⟨ refl⟩∘⟨ ⟨⟩-congˡ (pullʳ π₂∘first) ⟩
+ (fᵢ ×₁ gᵢ ∘ σ₂₃) ∘ ⟨ π₁ , swap ∘ π₂ ⟩ ≈⟨ pullʳ ⟨⟩∘ ⟩
+ fᵢ ×₁ gᵢ ∘ ⟨ π₁ ×₁ π₁ ∘ _ , π₂ ×₁ π₂ ∘ ⟨ π₁ , swap ∘ π₂ ⟩ ⟩ ≈⟨ refl⟩∘⟨ ⟨⟩-cong₂ ×₁∘⟨⟩ ×₁∘⟨⟩ ⟩
+ fᵢ ×₁ gᵢ ∘ ⟨ ⟨ _ , _ ⟩ , ⟨ π₂ ∘ π₁ , π₂ ∘ swap ∘ π₂ ⟩ ⟩ ≈⟨ refl⟩∘⟨ ⟨⟩-cong₂ (⟨⟩-congˡ (pullˡ project₁)) (⟨⟩-congˡ (pullˡ project₂)) ⟩
+ fᵢ ×₁ gᵢ ∘ ⟨ π₁ ×₁ π₂ , π₂ ×₁ π₁ ⟩ ≈⟨ refl⟩∘⟨ swap∘⟨⟩ ⟨
+ fᵢ ×₁ gᵢ ∘ swap ∘ ⟨ π₂ ×₁ π₁ , π₁ ×₁ π₂ ⟩ ≈⟨ refl⟩∘⟨ pushʳ (sym σ₂₃-⟨⟩) ⟩
+ fᵢ ×₁ gᵢ ∘ (swap ∘ σ₂₃) ∘ ⟨ _ , ⟨ π₁ ∘ π₂ , π₂ ∘ π₂ ⟩ ⟩ ≈⟨ refl⟩∘⟨ refl⟩∘⟨ ⟨⟩-cong₂ ⟨⟩∘ ⟨⟩∘ ⟨
+ fᵢ ×₁ gᵢ ∘ (swap ∘ σ₂₃) ∘ ⟨ _ ∘ π₁ , ⟨ π₁ , π₂ ⟩ ∘ π₂ ⟩ ≈⟨ refl⟩∘⟨ refl⟩∘⟨ ⟨⟩-congˡ (η ⟩∘⟨refl) ⟩
+ fᵢ ×₁ gᵢ ∘ (swap ∘ σ₂₃) ∘ swap ×₁ id ≈⟨ extendʳ (extendʳ swap∘×₁) ⟨
+ swap ∘ (gᵢ ×₁ fᵢ ∘ σ₂₃) ∘ swap ×₁ id ≈⟨ pushʳ (sym project₂) ⟩
+ (swap ∘ π₂) ∘ ⟨ π₁ , (gᵢ ×₁ fᵢ ∘ σ₂₃) ∘ swap ×₁ id ⟩ ∎
+
+swap∘swap-⧈
+ : {X Y : Box}
+ → swap-⧈ Y X ⌻ swap-⧈ X Y ≈-⧈ id-⧈
+swap∘swap-⧈ = eqᵢ ⌸ swap∘swap
+ where
+ eqᵢ : (swap ∘ π₂) ∘ ⟨ π₁ , (swap ∘ π₂) ∘ swap ×₁ id ⟩ ≈ π₂
+ eqᵢ = begin
+ (swap ∘ π₂) ∘ ⟨ π₁ , (swap ∘ π₂) ∘ swap ×₁ id ⟩ ≈⟨ pullʳ project₂ ⟩
+ swap ∘ (swap ∘ π₂) ∘ swap ×₁ id ≈⟨ refl⟩∘⟨ pullʳ π₂∘first ⟩
+ swap ∘ swap ∘ π₂ ≈⟨ cancelˡ swap∘swap ⟩
+ π₂ ∎
+
+hex₁
+ : {X Y Z : Box}
+ → id-⧈ ⊞₁ swap-⧈ X Z ⌻ associator⇒ ⌻ swap-⧈ X Y ⊞₁ id-⧈ {Z}
+ ≈-⧈ associator⇒ ⌻ swap-⧈ X (Y ⊞ Z) ⌻ associator⇒
+hex₁ = eqᵢ ⌸ hexagon₁
+ where
+ eqᵢ : (((swap ∘ π₂) ×₁ π₂ ∘ σ₂₃) ∘ ⟨ π₁ , (assocʳ ∘ π₂) ∘ (swap ×₁ id) ×₁ id ⟩) ∘ ⟨ π₁ , (π₂ ×₁ (swap ∘ π₂) ∘ σ₂₃) ∘ (assocˡ ∘ swap ×₁ id) ×₁ id ⟩
+ ≈ ((assocʳ ∘ π₂) ∘ ⟨ π₁ , (swap ∘ π₂) ∘ assocˡ ×₁ id ⟩) ∘ ⟨ π₁ , (assocʳ ∘ π₂) ∘ (swap ∘ assocˡ) ×₁ id ⟩
+ eqᵢ = begin
+ (((swap ∘ π₂) ×₁ π₂ ∘ σ₂₃) ∘ ⟨ π₁ , (assocʳ ∘ π₂) ∘ (swap ×₁ id) ×₁ id ⟩) ∘ _ ≈⟨ (refl⟩∘⟨ ⟨⟩-congˡ (pullʳ π₂∘first)) ⟩∘⟨refl ⟩
+ (((swap ∘ π₂) ×₁ π₂ ∘ ⟨ π₁ ×₁ π₁ , π₂ ×₁ π₂ ⟩) ∘ ⟨ π₁ , assocʳ ∘ π₂ ⟩) ∘ _ ≈⟨ ×₁∘⟨⟩ ⟩∘⟨refl ⟩∘⟨refl ⟩
+ ((⟨ (swap ∘ π₂) ∘ π₁ ×₁ π₁ , π₂ ∘ π₂ ×₁ π₂ ⟩) ∘ ⟨ π₁ , assocʳ ∘ π₂ ⟩) ∘ _ ≈⟨ ⟨⟩-cong₂ (extendˡ π₂∘×₁) π₂∘×₁ ⟩∘⟨refl ⟩∘⟨refl ⟩
+ ((⟨ (swap ∘ π₁) ∘ π₂ , π₂ ∘ π₂ ⟩) ∘ ⟨ π₁ , assocʳ ∘ π₂ ⟩) ∘ _ ≈⟨ ⟨⟩∘ ⟩∘⟨refl ⟩∘⟨refl ⟨
+ ((⟨ swap ∘ π₁ , π₂ ⟩ ∘ π₂) ∘ ⟨ π₁ , assocʳ ∘ π₂ ⟩) ∘ _ ≈⟨ pullʳ project₂ ⟩∘⟨refl ⟩
+ (⟨ swap ∘ π₁ , π₂ ⟩ ∘ assocʳ ∘ π₂) ∘ _ ≈⟨ pullʳ (pullʳ project₂) ⟩
+ ⟨ swap ∘ π₁ , π₂ ⟩ ∘ assocʳ ∘ (π₂ ×₁ (swap ∘ π₂) ∘ σ₂₃) ∘ _ ×₁ id ≈⟨ refl⟩∘⟨ refl⟩∘⟨ ×₁∘⟨⟩ ⟩∘⟨refl ⟩
+ ⟨ _ ∘ π₁ , π₂ ⟩ ∘ _ ∘ ⟨ π₂ ∘ π₁ ×₁ π₁ , (swap ∘ π₂) ∘ π₂ ×₁ π₂ ⟩ ∘ _ ×₁ id ≈⟨ refl⟩∘⟨ refl⟩∘⟨ ⟨⟩-cong₂ π₂∘×₁ (extendˡ π₂∘×₁) ⟩∘⟨refl ⟩
+ ⟨ swap ∘ π₁ , π₂ ⟩ ∘ assocʳ ∘ ⟨ π₁ ∘ π₂ , (swap ∘ π₂) ∘ π₂ ⟩ ∘ _ ×₁ id ≈⟨ refl⟩∘⟨ refl⟩∘⟨ pushˡ (sym ⟨⟩∘) ⟩
+ ⟨ swap ∘ π₁ , π₂ ⟩ ∘ assocʳ ∘ ⟨ π₁ , swap ∘ π₂ ⟩ ∘ π₂ ∘ _ ×₁ id ≈⟨ pushʳ (refl⟩∘⟨ refl⟩∘⟨ π₂∘first) ⟩
+ (⟨ swap ∘ π₁ , π₂ ⟩ ∘ assocʳ) ∘ ⟨ π₁ , swap ∘ π₂ ⟩ ∘ π₂ ≈⟨ (⟨⟩-congˡ identityˡ ⟩∘⟨refl) ⟩∘⟨ ⟨⟩-congʳ identityˡ ⟩∘⟨refl ⟨
+ (swap ×₁ id ∘ assocʳ) ∘ id ×₁ swap ∘ π₂ ≈⟨ extendʳ (hexagon₁-inv braided) ⟩
+ (assocʳ ∘ swap) ∘ assocʳ ∘ π₂ ≈⟨ refl⟩∘⟨ pushʳ (sym π₂∘first) ⟩
+ (assocʳ ∘ swap) ∘ (assocʳ ∘ π₂) ∘ _ ×₁ id ≈⟨ pushʳ (sym project₂) ⟩
+ ((assocʳ ∘ swap) ∘ π₂) ∘ ⟨ π₁ , (assocʳ ∘ π₂) ∘ _ ×₁ id ⟩ ≈⟨ pullʳ (pushʳ (sym π₂∘first)) ⟩∘⟨refl ⟩
+ (assocʳ ∘ (swap ∘ π₂) ∘ assocˡ ×₁ id) ∘ ⟨ π₁ , (assocʳ ∘ π₂) ∘ _ ×₁ id ⟩ ≈⟨ pushʳ (sym project₂) ⟩∘⟨refl ⟩
+ ((assocʳ ∘ π₂) ∘ ⟨ π₁ , (swap ∘ π₂) ∘ assocˡ ×₁ id ⟩) ∘ ⟨ π₁ , _ ∘ _ ×₁ id ⟩ ∎
+
+hex₂
+ : {X Y Z : Box}
+ → (swap-⧈ X Z ⊞₁ id-⧈ ⌻ associator⇐) ⌻ id-⧈ {X} ⊞₁ swap-⧈ Y Z
+ ≈-⧈ (associator⇐ ⌻ swap-⧈ (X ⊞ Y) Z) ⌻ associator⇐
+hex₂ = eqᵢ ⌸ hexagon₂
+ where
+ eqᵢ : (π₂ ×₁ (swap ∘ π₂) ∘ σ₂₃) ∘ ⟨ π₁ , ((assocˡ ∘ π₂) ∘ ⟨ π₁ , ((swap ∘ π₂) ×₁ π₂ ∘ σ₂₃) ∘ assocʳ ×₁ id ⟩) ∘ (id ×₁ swap) ×₁ id ⟩
+ ≈ (assocˡ ∘ π₂) ∘ ⟨ π₁ , ((swap ∘ π₂) ∘ ⟨ π₁ , (assocˡ ∘ π₂) ∘ swap ×₁ id ⟩) ∘ assocʳ ×₁ id ⟩
+ eqᵢ = begin
+ (π₂ ×₁ (swap ∘ π₂) ∘ σ₂₃) ∘ ⟨ π₁ , ((_ ∘ π₂) ∘ ⟨ π₁ , _ ∘ _ ×₁ id ⟩) ∘ _ ×₁ id ⟩ ≈⟨ refl⟩∘⟨ ⟨⟩-congˡ (pullʳ project₂ ⟩∘⟨refl) ⟩
+ (π₂ ×₁ _ ∘ σ₂₃) ∘ ⟨ π₁ , (_ ∘ ((swap ∘ π₂) ×₁ π₂ ∘ σ₂₃) ∘ _ ×₁ id) ∘ _ ×₁ id ⟩ ≈⟨ refl⟩∘⟨ ⟨⟩-congˡ ((refl⟩∘⟨ ×₁∘⟨⟩ ⟩∘⟨refl) ⟩∘⟨refl) ⟩
+ _ ∘ ⟨ π₁ , (_ ∘ ⟨ (swap ∘ π₂) ∘ π₁ ×₁ π₁ , π₂ ∘ π₂ ×₁ π₂ ⟩ ∘ _ ×₁ id) ∘ _ ×₁ id ⟩ ≈⟨ refl⟩∘⟨ ⟨⟩-congˡ ((refl⟩∘⟨ ⟨⟩-cong₂ (extendˡ π₂∘×₁) π₂∘×₁ ⟩∘⟨refl) ⟩∘⟨refl) ⟩
+ _ ∘ ⟨ π₁ , (_ ∘ ⟨ (swap ∘ π₁) ∘ π₂ , π₂ ∘ π₂ ⟩ ∘ assocʳ ×₁ id) ∘ _ ×₁ id ⟩ ≈⟨ refl⟩∘⟨ ⟨⟩-congˡ ((refl⟩∘⟨ pushˡ (sym ⟨⟩∘)) ⟩∘⟨refl) ⟩
+ (π₂ ×₁ _ ∘ σ₂₃) ∘ ⟨ π₁ , (_ ∘ ⟨ swap ∘ π₁ , π₂ ⟩ ∘ π₂ ∘ assocʳ ×₁ id) ∘ _ ×₁ id ⟩ ≈⟨ refl⟩∘⟨ ⟨⟩-congˡ (pushˡ (refl⟩∘⟨ refl⟩∘⟨ π₂∘first)) ⟩
+ (π₂ ×₁ _ ∘ σ₂₃) ∘ ⟨ π₁ , _ ∘ (⟨ swap ∘ π₁ , π₂ ⟩ ∘ π₂) ∘ _ ×₁ id ⟩ ≈⟨ refl⟩∘⟨ ⟨⟩-congˡ (refl⟩∘⟨ pullʳ π₂∘first) ⟩
+ (π₂ ×₁ (swap ∘ π₂) ∘ σ₂₃) ∘ ⟨ π₁ , _ ∘ ⟨ _ ∘ π₁ , π₂ ⟩ ∘ π₂ ⟩ ≈⟨ ×₁∘⟨⟩ ⟩∘⟨refl ⟩
+ ⟨ π₂ ∘ π₁ ×₁ π₁ , (swap ∘ π₂) ∘ π₂ ×₁ π₂ ⟩ ∘ ⟨ π₁ , _ ∘ ⟨ swap ∘ π₁ , π₂ ⟩ ∘ π₂ ⟩ ≈⟨ ⟨⟩-cong₂ π₂∘×₁ (extendˡ π₂∘×₁) ⟩∘⟨refl ⟩
+ ⟨ π₁ ∘ π₂ , (swap ∘ π₂) ∘ π₂ ⟩ ∘ ⟨ π₁ , assocˡ ∘ ⟨ swap ∘ π₁ , π₂ ⟩ ∘ π₂ ⟩ ≈⟨ pushˡ (sym ⟨⟩∘) ⟩
+ ⟨ π₁ , swap ∘ π₂ ⟩ ∘ π₂ ∘ ⟨ π₁ , assocˡ ∘ ⟨ swap ∘ π₁ , π₂ ⟩ ∘ π₂ ⟩ ≈⟨ refl⟩∘⟨ project₂ ⟩
+ ⟨ π₁ , swap ∘ π₂ ⟩ ∘ assocˡ ∘ ⟨ swap ∘ π₁ , π₂ ⟩ ∘ π₂ ≈⟨ ⟨⟩-congʳ (sym identityˡ) ⟩∘⟨ pushʳ (⟨⟩-congˡ (sym identityˡ) ⟩∘⟨refl) ⟩
+ id ×₁ swap ∘ (assocˡ ∘ swap ×₁ id) ∘ π₂ ≈⟨ extendʳ (hexagon₂-inv braided) ⟩
+ assocˡ ∘ (swap ∘ assocˡ) ∘ π₂ ≈⟨ refl⟩∘⟨ pullʳ (pushʳ (sym π₂∘first)) ⟩
+ assocˡ ∘ swap ∘ (assocˡ ∘ π₂) ∘ assocʳ ×₁ id ≈⟨ refl⟩∘⟨ refl⟩∘⟨ pushʳ (sym π₂∘first) ⟩∘⟨refl ⟩
+ assocˡ ∘ swap ∘ ((assocˡ ∘ π₂) ∘ swap ×₁ id) ∘ assocʳ ×₁ id ≈⟨ refl⟩∘⟨ pullˡ (pushʳ (sym project₂)) ⟩
+ assocˡ ∘ ((swap ∘ π₂) ∘ ⟨ π₁ , (assocˡ ∘ π₂) ∘ swap ×₁ id ⟩) ∘ assocʳ ×₁ id ≈⟨ pushʳ (sym project₂) ⟩
+ (assocˡ ∘ π₂) ∘ ⟨ π₁ , ((_ ∘ π₂) ∘ ⟨ π₁ , (_ ∘ π₂) ∘ swap ×₁ id ⟩) ∘ _ ×₁ id ⟩ ∎
+
+module Directed where
+
+ open D using (-⊞-)
+
+ γ : -⊞- ≃ flip-bifunctor -⊞-
+ γ = niHelper record
+ { η = uncurry swap-⧈
+ ; η⁻¹ = uncurry (flip swap-⧈)
+ ; commute = uncurry swap-commute
+ ; iso = λ (X , Y) → record
+ { isoˡ = swap∘swap-⧈
+ ; isoʳ = swap∘swap-⧈
+ }
+ }
+
+module Balanced where
+
+ open B using (-⊞-)
+
+ γ : -⊞- ≃ flip-bifunctor -⊞-
+ γ = niHelper record
+ { η = λ (X , Y) → swap-⧈ (X □ X) (Y □ Y)
+ ; η⁻¹ = λ (X , Y) → swap-⧈ (Y □ Y) (X □ X)
+ ; commute = uncurry swap-commute
+ ; iso = λ (X , Y) → record
+ { isoˡ = swap∘swap-⧈
+ ; isoʳ = swap∘swap-⧈
+ }
+ }
+
+DWD-Braided : Braided DWD-Monoidal
+DWD-Braided = record
+ { braiding = Directed.γ
+ ; hexagon₁ = hex₁
+ ; hexagon₂ = hex₂
+ }
+
+BWD-Braided : Braided BWD-Monoidal
+BWD-Braided = record
+ { braiding = Balanced.γ
+ ; hexagon₁ = hex₁
+ ; hexagon₂ = hex₂
+ }
diff --git a/Data/WiringDiagram/Monoidal.agda b/Data/WiringDiagram/Monoidal/Core.agda
index 1327b1d..382e188 100644
--- a/Data/WiringDiagram/Monoidal.agda
+++ b/Data/WiringDiagram/Monoidal/Core.agda
@@ -4,77 +4,53 @@ open import Categories.Category using (Category)
open import Category.Dagger.Semiadditive using (SemiadditiveDagger)
open import Level using (Level)
-module Data.WiringDiagram.Monoidal
+module Data.WiringDiagram.Monoidal.Core
{o ℓ e : Level}
{𝒞 : Category o ℓ e}
(S : SemiadditiveDagger 𝒞)
where
-import Categories.Category.Monoidal.Interchange.Braided as Interchange
-import Categories.Category.Monoidal.Interchange.Symmetric as SymInterchange
import Categories.Category.Monoidal.Reasoning as ⊗-Reasoning
+import Categories.Morphism as Morphism
import Categories.Morphism.Reasoning 𝒞 as ⇒-Reasoning
+import Data.WiringDiagram.Balanced as BalancedWD
import Data.WiringDiagram.Core as WD
-import Data.WiringDiagram.Directed as Directed
+import Data.WiringDiagram.Directed as DirectedWD
open import Categories.Category.Monoidal using (Monoidal)
-open import Categories.Category.Monoidal.Interchange using (HasInterchange)
-open import Categories.Object.Initial using (Initial; IsInitial)
open import Categories.Category.Monoidal.Symmetric using (module Symmetric)
-open import Categories.NaturalTransformation.NaturalIsomorphism using (NaturalIsomorphism)
-open import Categories.Category.Monoidal.Symmetric.Properties using () renaming (module Shorthands to SymShorthands)
-open import Categories.Category.Monoidal.Utilities using (module Shorthands; pentagon-inv)
+open import Categories.Category.Monoidal.Utilities using (pentagon-inv)
open import Categories.Functor.Bifunctor using (Bifunctor)
+open import Categories.Object.Initial using (Initial; IsInitial)
open import Data.Product using (_,_; uncurry′)
-open WD S using (Box; WiringDiagram; _□_; _⧈_; _≈-⧈_; _⌸_; id-⧈; _⌻_; ≈-sym)
-open Directed S using (DWD)
+open SemiadditiveDagger S
+open BalancedWD S using (BWD)
open Category 𝒞
-module S = SemiadditiveDagger S
-open S
-open Shorthands monoidal
-open SymShorthands symmetric
-
+open DirectedWD S using (DWD)
open Monoidal monoidal using (triangle; pentagon)
open Symmetric symmetric using (braided)
-open Interchange braided using (swapInner; swapInner-natural; hasInterchange)
-
-open import Categories.Morphism DWD using (_≅_)
+open WD S using (Box; WiringDiagram; _□_; _⧈_; _≈-⧈_; _⌸_; id-⧈; _⌻_; ≈-sym)
module DWD = Category DWD
-𝟘-□ : Box
-𝟘-□ = 𝟘 □ 𝟘
+-- Swap middle two of four
-module i⇒ = HasInterchange hasInterchange
+σ₂₃ : {A B C D : Obj} → (A ⊕ B) ⊕ (C ⊕ D) ⇒ (A ⊕ C) ⊕ (B ⊕ D)
+σ₂₃ = ⟨ π₁ ×₁ π₁ , π₂ ×₁ π₂ ⟩
-module i≃ = NaturalIsomorphism i⇒.naturalIso
+-- Monoidal unit and initial object
-i⇒ = i⇒.swapInner.from
-i⇐ = i⇒.swapInner.to
+𝟘-□ : Box
+𝟘-□ = 𝟘 □ 𝟘
-σ₂₃ : {A B C D : Obj} → (A ⊕ B) ⊕ (C ⊕ D) ⇒ (A ⊕ C) ⊕ (B ⊕ D)
-σ₂₃ = ⟨ π₁ ×₁ π₁ , π₂ ×₁ π₂ ⟩
+-- Wiring diagram from the initial box to any box
--- Wiring diagram from the zero box to any box
¡-⧈ : {A : Box} → WiringDiagram 𝟘-□ A
¡-⧈ {A} = ! WD.⧈ ¡
-¡-⧈-unique : {A : Box} (f : WiringDiagram 𝟘-□ A) → ¡-⧈ ≈-⧈ f
-¡-⧈-unique (fᵢ ⧈ fₒ) = !-unique fᵢ ⌸ ¡-unique fₒ
-
-𝟘-□-isInitial : IsInitial DWD 𝟘-□
-𝟘-□-isInitial = record
- { ¡ = ¡-⧈
- ; ¡-unique = ¡-⧈-unique
- }
-
-initial-□ : Initial DWD
-initial-□ = record
- { ⊥ = 𝟘-□
- ; ⊥-is-initial = 𝟘-□-isInitial
- }
+-- Monoidal products of boxes and wiring diagrams
_⊞_ : Box → Box → Box
(Aᵢ □ Aₒ) ⊞ (Bᵢ □ Bₒ) = Aᵢ ⊕ Bᵢ □ Aₒ ⊕ Bₒ
@@ -84,13 +60,48 @@ _⊞₁_
(f : WiringDiagram A B)
(g : WiringDiagram C D)
→ WiringDiagram (A ⊞ C) (B ⊞ D)
-_⊞₁_ {A} {B} {C} {D} (fᵢ ⧈ fₒ) (gᵢ ⧈ gₒ) = fᵢ ×₁ gᵢ ∘ σ₂₃ ⧈ fₒ ×₁ gₒ
+(fᵢ ⧈ fₒ) ⊞₁ (gᵢ ⧈ gₒ) = fᵢ ×₁ gᵢ ∘ σ₂₃ ⧈ fₒ ×₁ gₒ
+
+infixr 10 _⊞_ _⊞₁_
+
+-- Left and right unitor wiring diagrams
+
+unitorˡ⇒ : {X : Box} → WiringDiagram (𝟘-□ ⊞ X) X
+unitorˡ⇒ = i₂ ∘ π₂ ⧈ π₂
+
+unitorˡ⇐ : {X : Box} → WiringDiagram X (𝟘-□ ⊞ X)
+unitorˡ⇐ = π₂ ∘ π₂ ⧈ i₂
+
+unitorʳ⇒ : {X : Box} → WiringDiagram (X ⊞ 𝟘-□) X
+unitorʳ⇒ = i₁ ∘ π₂ ⧈ π₁
+
+unitorʳ⇐ : {X : Box} → WiringDiagram X (X ⊞ 𝟘-□)
+unitorʳ⇐ = π₁ ∘ π₂ ⧈ i₁
+
+-- Associator wiring diagrams
+
+associator⇒
+ : {X Y Z : Box}
+ → WiringDiagram ((X ⊞ Y) ⊞ Z) (X ⊞ (Y ⊞ Z))
+associator⇒ = assocʳ ∘ π₂ ⧈ assocˡ
+
+associator⇐
+ : {X Y Z : Box}
+ → WiringDiagram (X ⊞ (Y ⊞ Z)) ((X ⊞ Y) ⊞ Z)
+associator⇐ = assocˡ ∘ π₂ ⧈ assocʳ
+
+-- Properties
+
+open HomReasoning
+open ⇒-Reasoning
+open Equiv
+
+¡-⧈-unique : {A : Box} (f : WiringDiagram 𝟘-□ A) → ¡-⧈ ≈-⧈ f
+¡-⧈-unique (fᵢ ⧈ fₒ) = !-unique fᵢ ⌸ ¡-unique fₒ
⊞-identity : {A B : Box} → id-⧈ {A} ⊞₁ id-⧈ {B} ≈-⧈ id-⧈
-⊞-identity {A} {B} = eqᵢ ⌸ id×₁id
+⊞-identity = eqᵢ ⌸ id×₁id
where
- open HomReasoning
- open ⇒-Reasoning
eqᵢ : π₂ ×₁ π₂ ∘ σ₂₃ ≈ π₂
eqᵢ = begin
π₂ ×₁ π₂ ∘ σ₂₃ ≈⟨ ×₁∘⟨⟩ ⟩
@@ -111,27 +122,21 @@ _⊞₁_ {A} {B} {C} {D} (fᵢ ⧈ fₒ) (gᵢ ⧈ gₒ) = fᵢ ×₁ gᵢ ∘
⟨ ⟨ π₁ ∘ π₁ ×₁ π₁ , id ∘ π₁ ×₁ π₁ ⟩ , ⟨ π₁ ∘ π₂ ×₁ π₂ , id ∘ π₂ ×₁ π₂ ⟩ ⟩ ≈⟨ ⟨⟩-cong₂ ⟨⟩∘ ⟨⟩∘ ⟨
⟨ ⟨ π₁ , id ⟩ ∘ π₁ ×₁ π₁ , ⟨ π₁ , id ⟩ ∘ π₂ ×₁ π₂ ⟩ ≈⟨ ×₁∘⟨⟩ ⟨
⟨ π₁ , id ⟩ ×₁ ⟨ π₁ , id ⟩ ∘ ⟨ π₁ ×₁ π₁ , π₂ ×₁ π₂ ⟩ ∎
- where
- open HomReasoning
-σ₂₃-comm
+σ₂₃-×₁
: {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)
-σ₂₃-comm {f = f} {g} {h} {i} = begin
+σ₂₃-×₁ {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) ∎
- where
- open HomReasoning
-
-infixr 10 _⊞_ _⊞₁_
⊞-homo
: {A B C D E F : Box}
@@ -154,13 +159,13 @@ infixr 10 _⊞_ _⊞₁_
(fᵢ ∘ id ×₁ _) ×₁ (gᵢ ∘ id ×₁ _) ∘ ⟨ π₁ , id ⟩ ×₁ ⟨ π₁ , id ⟩ ∘ σ₂₃ ≈⟨ refl⟩∘⟨ σ₂₃-lemma ⟨
(fᵢ ∘ id ×₁ _) ×₁ (gᵢ ∘ id ×₁ (iᵢ ∘ gₒ ×₁ id)) ∘ σ₂₃ ∘ ⟨ π₁ , σ₂₃ ⟩ ≈⟨ ×₁-cong₂ (pushʳ (sym second∘second)) (pushʳ (sym second∘second)) ⟩∘⟨refl ⟩
(_ ∘ id ×₁ (fₒ ×₁ id)) ×₁ (_ ∘ id ×₁ (gₒ ×₁ id)) ∘ σ₂₃ ∘ ⟨ π₁ , σ₂₃ ⟩ ≈⟨ pushˡ (sym ×₁∘×₁) ⟩
- (fᵢ ∘ id ×₁ hᵢ) ×₁ _ ∘ (id ×₁ (fₒ ×₁ id)) ×₁ (id ×₁ _) ∘ σ₂₃ ∘ ⟨ π₁ , σ₂₃ ⟩ ≈⟨ refl⟩∘⟨ extendʳ σ₂₃-comm ⟩
+ (fᵢ ∘ id ×₁ hᵢ) ×₁ _ ∘ (id ×₁ (fₒ ×₁ id)) ×₁ (id ×₁ _) ∘ σ₂₃ ∘ ⟨ π₁ , σ₂₃ ⟩ ≈⟨ refl⟩∘⟨ extendʳ σ₂₃-×₁ ⟩
(fᵢ ∘ id ×₁ hᵢ) ×₁ _ ∘ σ₂₃ ∘ (id ×₁ id) ×₁ _ ×₁ (gₒ ×₁ id) ∘ ⟨ π₁ , σ₂₃ ⟩ ≈⟨ refl⟩∘⟨ refl⟩∘⟨ ×₁-congʳ id×₁id ⟩∘⟨refl ⟩
(fᵢ ∘ id ×₁ hᵢ) ×₁ _ ∘ σ₂₃ ∘ id ×₁ (fₒ ×₁ id) ×₁ (gₒ ×₁ id) ∘ ⟨ π₁ , σ₂₃ ⟩ ≈⟨ refl⟩∘⟨ refl⟩∘⟨ second∘⟨⟩ ⟩
- (fᵢ ∘ id ×₁ hᵢ) ×₁ _ ∘ σ₂₃ ∘ ⟨ π₁ , (fₒ ×₁ id) ×₁ (gₒ ×₁ id) ∘ σ₂₃ ⟩ ≈⟨ refl⟩∘⟨ refl⟩∘⟨ ⟨⟩-congˡ σ₂₃-comm ⟩
+ (fᵢ ∘ id ×₁ hᵢ) ×₁ _ ∘ σ₂₃ ∘ ⟨ π₁ , (fₒ ×₁ id) ×₁ (gₒ ×₁ id) ∘ σ₂₃ ⟩ ≈⟨ refl⟩∘⟨ refl⟩∘⟨ ⟨⟩-congˡ σ₂₃-×₁ ⟩
(fᵢ ∘ id ×₁ hᵢ) ×₁ _ ∘ σ₂₃ ∘ ⟨ π₁ , σ₂₃ ∘ (fₒ ×₁ gₒ) ×₁ (id ×₁ id) ⟩ ≈⟨ refl⟩∘⟨ refl⟩∘⟨ ⟨⟩-congˡ (refl⟩∘⟨ ×₁-congˡ id×₁id) ⟩
(fᵢ ∘ id ×₁ hᵢ) ×₁ _ ∘ σ₂₃ ∘ ⟨ π₁ , σ₂₃ ∘ (fₒ ×₁ gₒ) ×₁ id ⟩ ≈⟨ pushˡ (sym ×₁∘×₁) ⟩
- fᵢ ×₁ gᵢ ∘ (id ×₁ hᵢ) ×₁ (id ×₁ iᵢ) ∘ σ₂₃ ∘ ⟨ π₁ , σ₂₃ ∘ (fₒ ×₁ gₒ) ×₁ id ⟩ ≈⟨ pushʳ (extendʳ σ₂₃-comm) ⟩
+ fᵢ ×₁ gᵢ ∘ (id ×₁ hᵢ) ×₁ (id ×₁ iᵢ) ∘ σ₂₃ ∘ ⟨ π₁ , σ₂₃ ∘ (fₒ ×₁ gₒ) ×₁ id ⟩ ≈⟨ pushʳ (extendʳ σ₂₃-×₁) ⟩
(fᵢ ×₁ gᵢ ∘ σ₂₃) ∘ (id ×₁ id) ×₁ (hᵢ ×₁ iᵢ) ∘ ⟨ π₁ , σ₂₃ ∘ (fₒ ×₁ gₒ) ×₁ id ⟩ ≈⟨ refl⟩∘⟨ ×₁-congʳ id×₁id ⟩∘⟨refl ⟩
(fᵢ ×₁ gᵢ ∘ σ₂₃) ∘ id ×₁ (hᵢ ×₁ iᵢ) ∘ ⟨ π₁ , σ₂₃ ∘ (fₒ ×₁ gₒ) ×₁ id ⟩ ≈⟨ refl⟩∘⟨ ×₁∘⟨⟩ ⟩
(fᵢ ×₁ gᵢ ∘ σ₂₃) ∘ ⟨ id ∘ π₁ , hᵢ ×₁ iᵢ ∘ σ₂₃ ∘ (fₒ ×₁ gₒ) ×₁ id ⟩ ≈⟨ refl⟩∘⟨ ⟨⟩-cong₂ identityˡ sym-assoc ⟩
@@ -174,25 +179,6 @@ infixr 10 _⊞_ _⊞₁_
→ h ≈-⧈ i
→ f ⊞₁ h ≈-⧈ g ⊞₁ i
⊞-resp-≈-⧈ (fᵢ≈gᵢ ⌸ fₒ≈gₒ) (hᵢ≈iᵢ ⌸ hₒ≈iₒ) = (×₁-cong₂ fᵢ≈gᵢ hᵢ≈iᵢ ⟩∘⟨refl) ⌸ ×₁-cong₂ fₒ≈gₒ hₒ≈iₒ
- where
- open HomReasoning
-
--⊞- : Bifunctor DWD DWD DWD
--⊞- = record
- { F₀ = uncurry′ _⊞_
- ; F₁ = uncurry′ _⊞₁_
- ; identity = ⊞-identity
- ; homomorphism = ⊞-homo
- ; F-resp-≈ = uncurry′ ⊞-resp-≈-⧈
- }
-
-open import Data.Product using (_×_)
-
-unitorˡ⇒ : {X : Box} → WiringDiagram (𝟘-□ ⊞ X) X
-unitorˡ⇒ = i₂ ∘ π₂ ⧈ π₂
-
-unitorˡ⇐ : {X : Box} → WiringDiagram X (𝟘-□ ⊞ X)
-unitorˡ⇐ {X} = π₂ ∘ π₂ ⧈ i₂
λ-isoˡ : {X : Box} → unitorˡ⇐ ⌻ unitorˡ⇒ ≈-⧈ DWD.id {𝟘-□ ⊞ X}
λ-isoˡ = eqᵢ ⌸ i₂∘π₂≈id
@@ -215,8 +201,6 @@ unitorˡ⇐ {X} = π₂ ∘ π₂ ⧈ i₂
λ-isoʳ : {X : Box} → unitorˡ⇒ ⌻ unitorˡ⇐ ≈-⧈ DWD.id {X}
λ-isoʳ {X} = eqᵢ ⌸ π₂∘i₂≈id
where
- open ⇒-Reasoning
- open HomReasoning
eqᵢ : (π₂ ∘ π₂) ∘ ⟨ π₁ , (i₂ ∘ π₂) ∘ i₂ ×₁ id ⟩ ≈ π₂
eqᵢ = begin
(π₂ ∘ π₂) ∘ ⟨ π₁ , (i₂ ∘ π₂) ∘ i₂ ×₁ id ⟩ ≈⟨ pullʳ project₂ ⟩
@@ -224,28 +208,9 @@ unitorˡ⇐ {X} = π₂ ∘ π₂ ⧈ i₂
π₂ ∘ i₂ ∘ π₂ ≈⟨ cancelˡ π₂∘i₂≈id ⟩
π₂ ∎
-unitorˡ : {X : Box} → 𝟘-□ ⊞ X ≅ X
-unitorˡ {X} = record
- { from = unitorˡ⇒
- ; to = unitorˡ⇐
- ; iso = record
- { isoˡ = λ-isoˡ
- ; isoʳ = λ-isoʳ
- }
- }
-
-unitorʳ⇒ : {X : Box} → WiringDiagram (X ⊞ 𝟘-□) X
-unitorʳ⇒ = i₁ ∘ π₂ ⧈ π₁
-
-unitorʳ⇐ : {X : Box} → WiringDiagram X (X ⊞ 𝟘-□)
-unitorʳ⇐ {X} = π₁ ∘ π₂ ⧈ i₁
-
ρ-isoˡ : {X : Box} → unitorʳ⇐ ⌻ unitorʳ⇒ ≈-⧈ DWD.id {X ⊞ 𝟘-□}
ρ-isoˡ = eqᵢ ⌸ i₁∘π₁≈id
where
- open ⇒-Reasoning
- open HomReasoning
- open Equiv
i₁∘π₁≈id : {A : Obj} → i₁ {A} {𝟘} ∘ π₁ {A} {𝟘} ≈ id
i₁∘π₁≈id = begin
i₁ ∘ π₁ ≈⟨ ⟨⟩-unique (cancelˡ π₁∘i₁≈id) (pullˡ π₂∘i₁≈0) ⟨
@@ -261,8 +226,6 @@ unitorʳ⇐ {X} = π₁ ∘ π₂ ⧈ i₁
ρ-isoʳ : {X : Box} → unitorʳ⇒ ⌻ unitorʳ⇐ ≈-⧈ DWD.id {X}
ρ-isoʳ {X} = eqᵢ ⌸ π₁∘i₁≈id
where
- open ⇒-Reasoning
- open HomReasoning
eqᵢ : (π₁ ∘ π₂) ∘ ⟨ π₁ , (i₁ ∘ π₂) ∘ i₁ ×₁ id ⟩ ≈ π₂
eqᵢ = begin
(π₁ ∘ π₂) ∘ ⟨ π₁ , (i₁ ∘ π₂) ∘ i₁ ×₁ id ⟩ ≈⟨ pullʳ project₂ ⟩
@@ -270,25 +233,12 @@ unitorʳ⇐ {X} = π₁ ∘ π₂ ⧈ i₁
π₁ ∘ i₁ ∘ π₂ ≈⟨ cancelˡ π₁∘i₁≈id ⟩
π₂ ∎
-unitorʳ : {X : Box} → X ⊞ 𝟘-□ ≅ X
-unitorʳ {X} = record
- { from = unitorʳ⇒
- ; to = unitorʳ⇐
- ; iso = record
- { isoˡ = ρ-isoˡ
- ; isoʳ = ρ-isoʳ
- }
- }
-
unitorˡ-commute-from
: {X Y : Box}
{f : WiringDiagram X Y}
→ unitorˡ⇒ ⌻ id-⧈ ⊞₁ f ≈-⧈ f ⌻ unitorˡ⇒
unitorˡ-commute-from {X} {Y} {fᵢ ⧈ fₒ} = eqᵢ ⌸ project₂
where
- open HomReasoning
- open ⇒-Reasoning
- open Equiv
eqᵢ : (π₂ ×₁ fᵢ ∘ σ₂₃) ∘ ⟨ π₁ , (i₂ ∘ π₂) ∘ (id ×₁ fₒ) ×₁ id ⟩ ≈ (i₂ ∘ π₂) ∘ ⟨ π₁ , fᵢ ∘ π₂ ×₁ id ⟩
eqᵢ = begin
(π₂ ×₁ fᵢ ∘ σ₂₃) ∘ ⟨ π₁ , (i₂ ∘ π₂) ∘ (id ×₁ fₒ) ×₁ id ⟩ ≈⟨ refl⟩∘⟨ ⟨⟩-congˡ (pullʳ π₂∘first) ⟩
@@ -311,9 +261,6 @@ unitorˡ-commute-to
→ unitorˡ⇐ ⌻ f ≈-⧈ id-⧈ ⊞₁ f ⌻ unitorˡ⇐
unitorˡ-commute-to {X} {Y} {fᵢ ⧈ fₒ} = eqᵢ ⌸ eqₒ
where
- open HomReasoning
- open ⇒-Reasoning
- open Equiv
eqₒ : i₂ ∘ fₒ ≈ id ×₁ fₒ ∘ i₂
eqₒ = begin
i₂ ∘ fₒ ≈⟨ inject₂ ⟨
@@ -336,9 +283,6 @@ unitorʳ-commute-from
→ unitorʳ⇒ ⌻ f ⊞₁ id-⧈ ≈-⧈ f ⌻ unitorʳ⇒
unitorʳ-commute-from {X} {Y} {fᵢ ⧈ fₒ} = eqᵢ ⌸ project₁
where
- open HomReasoning
- open ⇒-Reasoning
- open Equiv
eqᵢ : (fᵢ ×₁ π₂ ∘ σ₂₃) ∘ ⟨ π₁ , (i₁ ∘ π₂) ∘ (fₒ ×₁ id) ×₁ id ⟩ ≈ (i₁ ∘ π₂) ∘ ⟨ π₁ , fᵢ ∘ π₁ ×₁ id ⟩
eqᵢ = begin
(fᵢ ×₁ π₂ ∘ σ₂₃) ∘ ⟨ π₁ , (i₁ ∘ π₂) ∘ (fₒ ×₁ id) ×₁ id ⟩ ≈⟨ refl⟩∘⟨ ⟨⟩-congˡ (pullʳ π₂∘first) ⟩
@@ -360,9 +304,6 @@ unitorʳ-commute-to
→ unitorʳ⇐ ⌻ f ≈-⧈ f ⊞₁ id-⧈ ⌻ unitorʳ⇐
unitorʳ-commute-to {X} {Y} {fᵢ ⧈ fₒ} = eqᵢ ⌸ eqₒ
where
- open HomReasoning
- open ⇒-Reasoning
- open Equiv
eqᵢ : fᵢ ∘ ⟨ π₁ , (π₁ ∘ π₂) ∘ fₒ ×₁ id ⟩ ≈ (π₁ ∘ π₂) ∘ ⟨ π₁ , (fᵢ ×₁ π₂ ∘ σ₂₃) ∘ i₁ ×₁ id ⟩
eqᵢ = begin
fᵢ ∘ ⟨ π₁ , (π₁ ∘ π₂) ∘ fₒ ×₁ id ⟩ ≈⟨ refl⟩∘⟨ ⟨⟩-congˡ (pullʳ π₂∘first) ⟩
@@ -380,21 +321,9 @@ unitorʳ-commute-to {X} {Y} {fᵢ ⧈ fₒ} = eqᵢ ⌸ eqₒ
fₒ +₁ id ∘ i₁ ≈⟨ ×₁-+₁ fₒ id ⟩∘⟨refl ⟨
fₒ ×₁ id ∘ i₁ ∎
-associator⇒
- : {X Y Z : Box}
- → WiringDiagram ((X ⊞ Y) ⊞ Z) (X ⊞ (Y ⊞ Z))
-associator⇒ = assocʳ ∘ π₂ ⧈ assocˡ
-
-associator⇐
- : {X Y Z : Box}
- → WiringDiagram (X ⊞ (Y ⊞ Z)) ((X ⊞ Y) ⊞ Z)
-associator⇐ = assocˡ ∘ π₂ ⧈ assocʳ
-
α-isoˡ : {X Y Z : Box} → associator⇐ {X} {Y} {Z} ⌻ associator⇒ ≈-⧈ DWD.id
α-isoˡ {X} {Y} {Z} = eqᵢ ⌸ assocʳ∘assocˡ
where
- open HomReasoning
- open ⇒-Reasoning
eqᵢ : (assocʳ ∘ π₂) ∘ ⟨ π₁ , (assocˡ ∘ π₂) ∘ assocˡ ×₁ id ⟩ ≈ π₂
eqᵢ = begin
(assocʳ ∘ π₂) ∘ ⟨ π₁ , (assocˡ ∘ π₂) ∘ assocˡ ×₁ id ⟩ ≈⟨ pullʳ project₂ ⟩
@@ -405,8 +334,6 @@ associator⇐ = assocˡ ∘ π₂ ⧈ assocʳ
α-isoʳ : {X Y Z : Box} → associator⇒ {X} {Y} {Z} ⌻ associator⇐ ≈-⧈ DWD.id
α-isoʳ {X} {Y} {Z} = eqᵢ ⌸ assocˡ∘assocʳ
where
- open HomReasoning
- open ⇒-Reasoning
eqᵢ : (assocˡ ∘ π₂) ∘ ⟨ π₁ , (assocʳ ∘ π₂) ∘ assocʳ ×₁ id ⟩ ≈ π₂
eqᵢ = begin
(assocˡ ∘ π₂) ∘ ⟨ π₁ , (assocʳ ∘ π₂) ∘ assocʳ ×₁ id ⟩ ≈⟨ pullʳ project₂ ⟩
@@ -414,16 +341,6 @@ associator⇐ = assocˡ ∘ π₂ ⧈ assocʳ
assocˡ ∘ assocʳ ∘ π₂ ≈⟨ cancelˡ assocˡ∘assocʳ ⟩
π₂ ∎
-associator : {X Y Z : Box} → (X ⊞ Y) ⊞ Z ≅ X ⊞ (Y ⊞ Z)
-associator = record
- { from = associator⇒
- ; to = associator⇐
- ; iso = record
- { isoˡ = α-isoˡ
- ; isoʳ = α-isoʳ
- }
- }
-
associator-commute-from
: {X X′ Y Y′ Z Z′ : Box}
{f : WiringDiagram X X′}
@@ -432,9 +349,6 @@ associator-commute-from
→ f ⊞₁ (g ⊞₁ h) ⌻ associator⇒ ≈-⧈ associator⇒ ⌻ (f ⊞₁ g) ⊞₁ h
associator-commute-from {X} {X′} {Y} {Y′} {Z} {Z′} {fᵢ ⧈ fₒ} {gᵢ ⧈ gₒ} {hᵢ ⧈ hₒ} = eqᵢ ⌸ eqₒ
where
- open HomReasoning
- open ⇒-Reasoning
- open Equiv
lemma : assocʳ ∘ (id ×₁ σ₂₃ ∘ σ₂₃) ∘ assocˡ ×₁ id ≈ σ₂₃ ×₁ id ∘ σ₂₃ ∘ id ×₁ assocʳ
lemma = begin
assocʳ ∘ (id ×₁ σ₂₃ ∘ σ₂₃) ∘ assocˡ ×₁ id ≈⟨ refl⟩∘⟨ second∘⟨⟩ ⟩∘⟨refl ⟩
@@ -484,9 +398,6 @@ associator-commute-to
→ (f ⊞₁ g) ⊞₁ h ⌻ associator⇐ ≈-⧈ associator⇐ ⌻ f ⊞₁ (g ⊞₁ h)
associator-commute-to {X} {X′} {Y} {Y′} {Z} {Z′} {fᵢ ⧈ fₒ} {gᵢ ⧈ gₒ} {hᵢ ⧈ hₒ} = eqᵢ ⌸ eqₒ
where
- open HomReasoning
- open ⇒-Reasoning
- open Equiv
lemma : assocˡ ∘ (σ₂₃ ×₁ id ∘ σ₂₃) ∘ assocʳ ×₁ id ≈ id ×₁ σ₂₃ ∘ σ₂₃ ∘ id ×₁ assocˡ
lemma = begin
assocˡ ∘ (σ₂₃ ×₁ id ∘ σ₂₃) ∘ assocʳ ×₁ id ≈⟨ refl⟩∘⟨ first∘⟨⟩ ⟩∘⟨refl ⟩
@@ -527,8 +438,6 @@ tri : {X Y : Box}
→ id-⧈ {X} ⊞₁ unitorˡ⇒ ⌻ associator⇒ ≈-⧈ unitorʳ⇒ ⊞₁ id-⧈ {Y}
tri = eqᵢ ⌸ triangle
where
- open HomReasoning
- open ⇒-Reasoning
eqᵢ : (assocʳ ∘ π₂) ∘ ⟨ π₁ , (π₂ ×₁ (i₂ ∘ π₂) ∘ σ₂₃) ∘ assocˡ ×₁ id ⟩ ≈ (i₁ ∘ π₂) ×₁ π₂ ∘ σ₂₃
eqᵢ = begin
(assocʳ ∘ π₂) ∘ ⟨ π₁ , (π₂ ×₁ (i₂ ∘ π₂) ∘ σ₂₃) ∘ assocˡ ×₁ id ⟩ ≈⟨ pullʳ project₂ ⟩
@@ -552,9 +461,6 @@ pent
≈-⧈ associator⇒ ⌻ associator⇒
pent = eqᵢ ⌸ pentagon
where
- open HomReasoning
- open ⇒-Reasoning
- open Equiv
eqᵢ : (((assocʳ ∘ π₂) ×₁ π₂ ∘ σ₂₃) ∘ ⟨ π₁ , (assocʳ ∘ π₂) ∘ (assocˡ ×₁ id) ×₁ id ⟩) ∘ ⟨ π₁ , (π₂ ×₁ (assocʳ ∘ π₂) ∘ σ₂₃) ∘ (assocˡ ∘ assocˡ ×₁ id) ×₁ id ⟩
≈ (assocʳ ∘ π₂) ∘ ⟨ π₁ , (assocʳ ∘ π₂) ∘ assocˡ ×₁ id ⟩
eqᵢ = begin
@@ -573,13 +479,140 @@ pent = eqᵢ ⌸ pentagon
assocʳ ∘ (assocʳ ∘ π₂) ∘ assocˡ ×₁ id ≈⟨ pushʳ (sym project₂) ⟩
(assocʳ ∘ π₂) ∘ ⟨ π₁ , (assocʳ ∘ π₂) ∘ assocˡ ×₁ id ⟩ ∎
+module Directed where
+
+ open Morphism DWD using (_≅_)
+
+ -⊞- : Bifunctor DWD DWD DWD
+ -⊞- = record
+ { F₀ = uncurry′ _⊞_
+ ; F₁ = uncurry′ _⊞₁_
+ ; identity = ⊞-identity
+ ; homomorphism = ⊞-homo
+ ; F-resp-≈ = uncurry′ ⊞-resp-≈-⧈
+ }
+
+ unitorˡ : {X : Box} → 𝟘-□ ⊞ X ≅ X
+ unitorˡ {X} = record
+ { from = unitorˡ⇒
+ ; to = unitorˡ⇐
+ ; iso = record
+ { isoˡ = λ-isoˡ
+ ; isoʳ = λ-isoʳ
+ }
+ }
+
+ unitorʳ : {X : Box} → X ⊞ 𝟘-□ ≅ X
+ unitorʳ {X} = record
+ { from = unitorʳ⇒
+ ; to = unitorʳ⇐
+ ; iso = record
+ { isoˡ = ρ-isoˡ
+ ; isoʳ = ρ-isoʳ
+ }
+ }
+
+ associator : {X Y Z : Box} → (X ⊞ Y) ⊞ Z ≅ X ⊞ (Y ⊞ Z)
+ associator = record
+ { from = associator⇒
+ ; to = associator⇐
+ ; iso = record
+ { isoˡ = α-isoˡ
+ ; isoʳ = α-isoʳ
+ }
+ }
+
+ 𝟘-□-isInitial : IsInitial DWD 𝟘-□
+ 𝟘-□-isInitial = record
+ { ¡ = ¡-⧈
+ ; ¡-unique = ¡-⧈-unique
+ }
+
+module Balanced where
+
+ open Morphism BWD using (_≅_)
+
+ -⊞- : Bifunctor BWD BWD BWD
+ -⊞- = record
+ { F₀ = uncurry′ _⊕_
+ ; F₁ = uncurry′ _⊞₁_
+ ; identity = ⊞-identity
+ ; homomorphism = ⊞-homo
+ ; F-resp-≈ = uncurry′ ⊞-resp-≈-⧈
+ }
+
+ unitorˡ : {X : Obj} → 𝟘 ⊕ X ≅ X
+ unitorˡ {X} = record
+ { from = unitorˡ⇒
+ ; to = unitorˡ⇐
+ ; iso = record
+ { isoˡ = λ-isoˡ
+ ; isoʳ = λ-isoʳ
+ }
+ }
+
+ unitorʳ : {X : Obj} → X ⊕ 𝟘 ≅ X
+ unitorʳ {X} = record
+ { from = unitorʳ⇒
+ ; to = unitorʳ⇐
+ ; iso = record
+ { isoˡ = ρ-isoˡ
+ ; isoʳ = ρ-isoʳ
+ }
+ }
+
+ associator : {X Y Z : Obj} → (X ⊕ Y) ⊕ Z ≅ X ⊕ (Y ⊕ Z)
+ associator = record
+ { from = associator⇒
+ ; to = associator⇐
+ ; iso = record
+ { isoˡ = α-isoˡ
+ ; isoʳ = α-isoʳ
+ }
+ }
+
+ 𝟘-isInitial : IsInitial BWD 𝟘
+ 𝟘-isInitial = record
+ { ¡ = ¡-⧈
+ ; ¡-unique = ¡-⧈-unique
+ }
+
+DWD-Initial : Initial DWD
+DWD-Initial = record
+ { ⊥ = 𝟘-□
+ ; ⊥-is-initial = Directed.𝟘-□-isInitial
+ }
+
+BWD-Initial : Initial BWD
+BWD-Initial = record
+ { ⊥ = 𝟘
+ ; ⊥-is-initial = Balanced.𝟘-isInitial
+ }
+
DWD-Monoidal : Monoidal DWD
DWD-Monoidal = record
- { ⊗ = -⊞-
+ { ⊗ = Directed.-⊞-
; unit = 𝟘-□
- ; unitorˡ = unitorˡ
- ; unitorʳ = unitorʳ
- ; associator = associator
+ ; unitorˡ = Directed.unitorˡ
+ ; unitorʳ = Directed.unitorʳ
+ ; associator = Directed.associator
+ ; unitorˡ-commute-from = unitorˡ-commute-from
+ ; unitorˡ-commute-to = unitorˡ-commute-to
+ ; unitorʳ-commute-from = unitorʳ-commute-from
+ ; unitorʳ-commute-to = unitorʳ-commute-to
+ ; assoc-commute-from = ≈-sym associator-commute-from
+ ; assoc-commute-to = ≈-sym associator-commute-to
+ ; triangle = tri
+ ; pentagon = pent
+ }
+
+BWD-Monoidal : Monoidal BWD
+BWD-Monoidal = record
+ { ⊗ = Balanced.-⊞-
+ ; unit = 𝟘
+ ; unitorˡ = Balanced.unitorˡ
+ ; unitorʳ = Balanced.unitorʳ
+ ; associator = Balanced.associator
; unitorˡ-commute-from = unitorˡ-commute-from
; unitorˡ-commute-to = unitorˡ-commute-to
; unitorʳ-commute-from = unitorʳ-commute-from