{-# OPTIONS --without-K --safe #-}
open import Categories.Category.Core using (Category)
open import Categories.Category.Monoidal.Core using (Monoidal)
open import Categories.Category.Monoidal.Traced using (Traced)
module Categories.Category.Monoidal.Traced.Properties
{o ℓ e} {C : Category o ℓ e} {M : Monoidal C} (T : Traced M) where
open Category C
using (Obj; _⇒_; _≈_; id; _∘_; assoc; identityˡ; identityʳ)
open Traced T
open import Categories.Category.Monoidal.Scalars M
using ( Scalar; _·ₛ_; idₛ; _·ˡ_; _·ʳ_; ·ˡ-resp-≈; ·ˡ-∘
; id-·ˡ; id-·ʳ )
open import Categories.Category.Monoidal.Reasoning M
open import Categories.Morphism.Reasoning C
open import Categories.Category.Monoidal.Reassociation M
using (λ⇒-assoc; λ⇐-assoc; α⇐-⊗id-commute)
open import Categories.Category.Monoidal.Properties M using (monoidal-Op)
open import Categories.Category.Monoidal.Braided.Properties braided using (scalar-central)
open import Categories.Category.Monoidal.Symmetric.Properties symmetric
using (symmetric-Op; braiding-selfInverse)
import Categories.Category.Monoidal.Utilities M as MonUtil
open MonUtil.Shorthands
private
variable
A B X Y : Obj
s : Scalar
f : A ⇒ B
ff : A ⊗₀ X ⇒ B ⊗₀ X
private abstract
·ˡ-natural : s ·ˡ f ≈ (s ·ˡ id) ∘ f
·ˡ-natural {s = s} {f = f} = begin
s ·ˡ f ≈⟨ ·ˡ-resp-≈ (⟺ identityʳ) (⟺ identityˡ) ⟩
(s ·ₛ idₛ) ·ˡ (id ∘ f) ≈⟨ ·ˡ-∘ ⟩
(s ·ˡ id) ∘ (idₛ ·ˡ f) ≈⟨ refl⟩∘⟨ id-·ˡ ⟩
(s ·ˡ id) ∘ f ∎
α-conjugate : {g : A ⇒ B} → α⇐ ∘ (g ⊗₁ id {X ⊗₀ Y}) ∘ α⇒ ≈ (g ⊗₁ id) ⊗₁ id
α-conjugate = pullˡ α⇐-⊗id-commute ○ cancelʳ associator.isoˡ
·ˡ-id⊗ : s ·ˡ id {A ⊗₀ X} ≈ (s ·ˡ id) ⊗₁ id
·ˡ-id⊗ {s = s} = begin
λ⇒ ∘ (s ⊗₁ id) ∘ λ⇐ ≈˘⟨ λ⇒-assoc ⟩∘⟨ refl⟩∘⟨ λ⇐-assoc ⟩
((λ⇒ ⊗₁ id) ∘ α⇐) ∘ (s ⊗₁ id) ∘ α⇒ ∘ (λ⇐ ⊗₁ id) ≈⟨ pullʳ assoc²εβ ⟩
(λ⇒ ⊗₁ id) ∘ (α⇐ ∘ (s ⊗₁ id) ∘ α⇒) ∘ (λ⇐ ⊗₁ id) ≈⟨ refl⟩∘⟨ α-conjugate ⟩∘⟨refl ⟩
(λ⇒ ⊗₁ id) ∘ ((s ⊗₁ id) ⊗₁ id) ∘ (λ⇐ ⊗₁ id) ≈⟨ merge₁³ ⟩
(λ⇒ ∘ (s ⊗₁ id) ∘ λ⇐) ⊗₁ id ∎
trace-resp-scalarˡ : trace (s ·ˡ ff) ≈ s ·ˡ trace ff
trace-resp-scalarˡ {s = s} {ff = ff} = begin
trace (s ·ˡ ff) ≈⟨ trace⟨ ·ˡ-natural ⟩ ⟩
trace ((s ·ˡ id) ∘ ff) ≈⟨ trace⟨ ·ˡ-id⊗ ⟩∘⟨refl ⟩ ⟩
trace (((s ·ˡ id) ⊗₁ id) ∘ ff) ≈⟨ tightenₗ ⟩
(s ·ˡ id) ∘ trace ff ≈˘⟨ ·ˡ-natural ⟩
s ·ˡ trace ff ∎
trace-scalar-idˡ : trace (idₛ ·ˡ ff) ≈ trace ff
trace-scalar-idˡ = trace-resp-≈ id-·ˡ
trace-resp-scalarʳ : trace (ff ·ʳ s) ≈ trace ff ·ʳ s
trace-resp-scalarʳ {ff = ff} {s = s} = begin
trace (ff ·ʳ s) ≈⟨ trace⟨ scalar-central ⟩ ⟩
trace (s ·ˡ ff) ≈⟨ trace-resp-scalarˡ ⟩
s ·ˡ trace ff ≈˘⟨ scalar-central ⟩
trace ff ·ʳ s ∎
trace-scalar-idʳ : trace (ff ·ʳ idₛ) ≈ trace ff
trace-scalar-idʳ = trace-resp-≈ id-·ʳ
trace-endo : X ⇒ X → Scalar
trace-endo f = trace (λ⇐ ∘ f ∘ λ⇒)
trace-dim : Obj → Scalar
trace-dim X = trace-endo (id {X})
traced-Op : Traced monoidal-Op
traced-Op = record
{ symmetric = symmetric-Op
; trace = trace
; trace-resp-≈ = trace-resp-≈
; slide = ⟺ slide
; tightenₗ = tightenᵣ
; tightenᵣ = tightenₗ
; vanishing₁ = vanishing₁
; vanishing₂ = trace⟨ trace⟨ assoc ⟩ ⟩ ○ vanishing₂
; superposing = trace⟨ assoc ⟩ ○ superposing
; yanking = trace⟨ braiding-selfInverse ⟩ ○ yanking
}