diff options
| author | Jacques Comeaux <jacquesrcomeaux@protonmail.com> | 2026-07-13 16:06:43 -0700 |
|---|---|---|
| committer | Jacques Comeaux <jacquesrcomeaux@protonmail.com> | 2026-07-13 16:06:43 -0700 |
| commit | 9e2f3f3bb9916dca8d4ad4b162ce5b089c26b82e (patch) | |
| tree | c09ddc07193cc214557979ce160dfd64ee154e6c | |
| parent | cdcf0ebd6432799f6b7a3656437fb01d1ff79966 (diff) | |
Construct Sys functor from wiring diagrams to Cats
| -rw-r--r-- | Category/Dagger/Semiadditive.agda | 27 | ||||
| -rw-r--r-- | Data/System.agda | 10 | ||||
| -rw-r--r-- | Functor/Instance/WiringDiagram/System.agda | 382 |
3 files changed, 413 insertions, 6 deletions
diff --git a/Category/Dagger/Semiadditive.agda b/Category/Dagger/Semiadditive.agda index a6a9e57..e8a9b39 100644 --- a/Category/Dagger/Semiadditive.agda +++ b/Category/Dagger/Semiadditive.agda @@ -10,6 +10,7 @@ import Categories.Morphism.Reasoning as β-Reasoning open import Categories.Category.BinaryProducts π using (BinaryProducts) 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.Cocartesian.Monoidal using (module CocartesianMonoidal) open import Categories.Category.Cocartesian.SymmetricMonoidal using (module CocartesianSymmetricMonoidal) @@ -54,7 +55,7 @@ record SemiadditiveDagger : Set (suc (o β β β e)) where open Cocartesian cocartesian using ([]β+-assocΚ³; []β+-swap) renaming (_+_ to _ββ_; _+β_ to infixr 10 _ββ_; -+- to β) public open CocartesianMonoidal cocartesian using (+-monoidal) public open Cocartesian cocartesian using (iβ; iβ; Β‘) public - open Cocartesian cocartesian using (β₯; [_,_]; β[]; []β+β; []-congβ; coproduct; Β‘-unique; injectβ; injectβ; +-unique; +-Ξ·) + open Cocartesian cocartesian using (β₯; [_,_]; β[]; []β+β; []-congΛ‘; []-congβ; coproduct; Β‘-unique; injectβ; injectβ; +-unique; +-Ξ·) renaming (ββ+β to β½β+β) open CocartesianSymmetricMonoidal π cocartesian using (+-symmetric) open HasDagger dagger using (_β ; β -involutive; β¨_β©β ; β -identity; β -homomorphism) public open Monoidal +-monoidal using (unitorΛ‘-commute-from; unitorΚ³-commute-from; assoc-commute-from; module unitorΛ‘; module unitorΚ³; module associator) @@ -421,6 +422,30 @@ record SemiadditiveDagger : Set (suc (o β β β e)) where ; products = products } + open Cartesian cartesian using (_Γβ_) + open CartesianMonoidal cartesian using (monoidal) + open Shorthands monoidal using () renaming (Ξ±β to Ξ±ββ²) + + Γβ-ββ : {A B C D : Obj} (f : A β B) (g : C β D) β f Γβ g β f ββ g + Γβ-ββ f g = begin + (f β pβ) ββ (g β pβ) β β³ ββ¨ pushΛ‘ β-distrib-over-β β© + f ββ g β pβ ββ pβ β β³ ββ¨ elimΚ³ pββpβββ³ β© + f ββ g β + + βΞ±β : {A B C : Obj} β Ξ±ββ² {A} {B} {C} β Ξ±β {A} {B} {C} + βΞ±β {A} {B} {C} = begin + (pβ β pβ) ββ ((pβ β pβ) ββ pβ β β³) β β³ ββ¨ reflβ©ββ¨ pushΛ‘ splitβΛ‘ β©ββ¨refl β© + (pβ β pβ) ββ ((pβ ββ id) β (pβ ββ pβ) β β³) β β³ ββ¨ reflβ©ββ¨ elimΚ³ pββpβββ³ β©ββ¨refl β© + (pβ β pβ) ββ (pβ ββ id) β β³ ββ¨ β -homomorphism β©ββ¨ (reflβ©ββ¨ β -identity ) β©ββ¨refl β¨ + ((iβ β iβ) β ) ββ (pβ ββ (id β )) β β³ ββ¨ reflβ©ββ¨ β -resp-β β©ββ¨refl β¨ + ((iβ β iβ) β ) ββ ((iβ ββ id) β ) β β³ ββ¨ β -resp-β β©ββ¨refl β¨ + ((iβ β iβ) ββ (iβ ββ id)) β β β³ ββ¨ β -homomorphism β¨ + (β½ β ((iβ β iβ) ββ (iβ ββ id))) β ββ¨ β¨ β½β+β β©β β© + [ iβ β iβ , iβ ββ id ] β ββ¨ β¨ []-congΛ‘ ([]-congΛ‘ identityΚ³) β©β β© + Ξ±β β ββ¨ β¨ Ξ±β
β β©β β¨ + Ξ±β β β ββ¨ β -involutive Ξ±β β© + Ξ±β β + record IdempotentSemiadditiveDagger : Set (suc (o β β β e)) where field diff --git a/Data/System.agda b/Data/System.agda index 968332d..7b6fe06 100644 --- a/Data/System.agda +++ b/Data/System.agda @@ -2,9 +2,9 @@ open import Level using (Level) -module Data.System {β : Level} where +module Data.System {c β : Level} where -open import Data.System.Core {β} public -open import Data.System.Category {β} public -open import Data.System.Looped {β} public -open import Data.System.Monoidal {β} public using (Systems-MC; Systems-SMC) +open import Data.System.Core {c} {β} public +open import Data.System.Category {c} {β} public +open import Data.System.Looped {c} {β} public +open import Data.System.Monoidal {c} {β} public using (Systems-MC; Systems-SMC) diff --git a/Functor/Instance/WiringDiagram/System.agda b/Functor/Instance/WiringDiagram/System.agda new file mode 100644 index 0000000..753f0f0 --- /dev/null +++ b/Functor/Instance/WiringDiagram/System.agda @@ -0,0 +1,382 @@ +{-# OPTIONS --without-K --safe #-} + +open import Categories.Category using (Category) +open import Categories.Category.Cartesian.Bundle using (CartesianCategory) +open import Categories.Category.Cartesian.Monoidal using (module CartesianMonoidal) +open import Categories.Category.Cocartesian.Monoidal using (module CocartesianMonoidal) +open import Categories.Category.Instance.Cats using (Cats) +open import Categories.Functor using (Functor; _βF_) renaming (id to IdF) +open import Categories.Functor.Cartesian using (CartesianF) +open import Category.Cartesian.Instance.CMonoids using (CMonoids-CC) +open import Category.Dagger.Semiadditive using (IdempotentSemiadditiveDagger) +open import Category.Instance.CMonoids using (CMonoids; CMonoidHomomorphism) +open import Level using (Level; suc) + +open CartesianMonoidal using (monoidal) +open CocartesianMonoidal using (+-monoidal) + +module Functor.Instance.WiringDiagram.System + {o β e oβ² ββ² eβ² : Level} + {c : Level} + {π : Category o β e} + {S : IdempotentSemiadditiveDagger π} + (let private module S = IdempotentSemiadditiveDagger S) + (let π-CC = record { cartesian = S.cartesian }) + (F : CartesianF π-CC (CMonoids-CC {c} {c})) + where + +import Data.System.Monoidal as Sys-β +import Relation.Binary.Reasoning.Setoid as β-Reasoning + +open import Algebra using (CommutativeMonoid) +open import Categories.Category.Cartesian using (Cartesian) +open import Categories.Category.CartesianClosed using (CartesianClosed) +open import Categories.Category.Instance.Properties.Setoids.CCC using (Setoids-CCC) +open import Categories.Category.Monoidal.Utilities using (module Shorthands) +open import Categories.Category.Product using (_β_) +open import Categories.Functor.Cartesian.Properties using (isMonoidalFunctor) +open import Categories.Functor.Monoidal using (MonoidalFunctor) +open import Categories.Functor.Monoidal.Symmetric using (module Lax) +open import Categories.Morphism.Reasoning.Iso (CMonoids c c) using (switch-fromtoΛ‘) +open import Categories.NaturalTransformation.NaturalIsomorphism using (_β_; niHelper) +open import Categories.Object.Product (CMonoids c c) using (Product; IsProduct) +open import Data.Product using (_,_) +open import Data.Product.Function.NonDependent.Setoid using (_Γ-function_; projββ; projββ; swapβ) +open import Data.Product.Relation.Binary.Pointwise.NonDependent using (_Γβ_) +open import Data.Setoid using (_ββ_; β£_β£) +open import Data.Setoid.Unit using (β€β) +open import Data.System using (System; _β€_; Systems[_,_]; Systems-SMC; discrete) +open import Data.Unit.Polymorphic using (tt) +open import Data.WiringDiagram.Core S using (Box; WiringDiagram; _β‘_; _β§_; _β»_; _β-β§_) +open import Data.WiringDiagram.Directed S using (DWD; Pulsh) +open import Function using (Func; _βΆβ_; _β¨$β©_; id; _$_) +open import Function.Construct.Identity using () renaming (function to Id) +open import Function.Construct.Setoid using (_β_) + +module F = CartesianF F + +module π = Category π + +open Box +open CMonoidHomomorphism +open Category π using (Obj; _β_; _β_) +open CommutativeMonoid using (setoid; Carrier; refl; sym) +open Func +open IdempotentSemiadditiveDagger S using (_ββ_; _ββ_; β³) +open Shorthands (+-monoidal S.cocartesian) using (Ξ±β) +open Shorthands (monoidal S.cartesian) using () renaming (Ξ±β to Ξ±ββ²) +open WiringDiagram using (input; output) + +_β¦ββ§_ : {A B : Obj} β Carrier (F.β A) β Carrier (F.β B) β Carrier (F.β (A ββ B)) +_β¦ββ§_ {A} {B} a b = β¦ F.Γ-iso.to A B β§ (a , b) + +β¦ββ§-cong + : {A B : Obj} + (let module FA = CommutativeMonoid (F.β A)) + (let module FB = CommutativeMonoid (F.β B)) + (let module F[A+B] = CommutativeMonoid (F.β (A ββ B))) + {a aβ² : Carrier (F.β A)} + {b bβ² : Carrier (F.β B)} + β a FA.β aβ² + β b FB.β bβ² + β a β¦ββ§ b F[A+B].β aβ² β¦ββ§ bβ² +β¦ββ§-cong {A} {B} βa βb = β¦β§-cong (F.Γ-iso.to A B) (βa , βb) + +β¦ββ§-commute + : {A B C D : Obj} + {f : A β B} + {g : C β D} + (a : Carrier (F.β A)) + (c : Carrier (F.β C)) + β (let open CommutativeMonoid (F.β (B ββ D)) using (_β_)) + β β¦ F.β (f ββ g) β§ (a β¦ββ§ c) β β¦ F.β f β§ a β¦ββ§ β¦ F.β g β§ c +β¦ββ§-commute {A} {B} {C} {D} {f} {g} a c- = begin + β¦ F.β (f ββ g) β§ (a β¦ββ§ c-) ββ¨ F.F-resp-β (S.Γβ-ββ f g) (a β¦ββ§ c-) β¨ + β¦ F.β (f Γβ g) β§ (a β¦ββ§ c-) ββ¨ β-F.β-homo.sym-commute (f , g) (a , c-) β© + β¦ F.β f β§ a β¦ββ§ β¦ F.β g β§ c- β + where + open β-Reasoning (setoid (F.β (B ββ D))) + open CommutativeMonoid (F.β (B ββ D)) using (_β_) + module π-CC = CartesianCategory π-CC + open π-CC using (_Γβ_) + β-F : MonoidalFunctor π-CC.monoidalCategory (CMonoids-CC.monoidalCategory {c} {c}) + β-F = isMonoidalFunctor {C = π-CC} {CMonoids-CC {c} {c}} F + module β-F = MonoidalFunctor β-F + +β¦β³β§ : {A : Obj} + (a : Carrier (F.β A)) + β (let open CommutativeMonoid (F.β (A ββ A)) using (_β_)) + β β¦ F.β β³ β§ a β a β¦ββ§ a +β¦β³β§ {A} a = begin + β¦ F.β β³ β§ a ββ¨ F.identity ((β¦ F.β β³ β§ a)) β¨ + β¦ F.β π.id β§ (β¦ F.β β³ β§ a) ββ¨ F.F-resp-β β.identity (β¦ F.β β³ β§ a) β¨ + β¦ F.β (π.id ββ π.id) β§ (β¦ F.β β³ β§ a) ββ¨ F.homomorphism a β¨ + β¦ F.β (π.id ββ π.id β β³) β§ a ββ¨ switch-fromtoΛ‘ (F.Γ-iso A A) {h = F.β (π.id ββ π.id β β³)} {k = CMonoids-CC.β¨ F.β π.id , F.β π.id β©} (F.F-resp-β¨β© π.id π.id) a β© + β¦ F.β π.id β§ a β¦ββ§ β¦ F.β π.id β§ a ββ¨ β¦ββ§-cong (F.identity a) (F.identity a) β© + a β¦ββ§ a β + where + open β-Reasoning (setoid (F.β (A ββ A))) + open Product (F.F-prod A A) using (β¨β©-congβ) + module β = Functor S.β + +β¦Ξ±ββ§ + : {A B C : Obj} + (a : Carrier (F.β A)) + (b : Carrier (F.β B)) + (c : Carrier (F.β C)) + β (let open CommutativeMonoid (F.β (A ββ (B ββ C))) using (_β_)) + β β¦ F.β Ξ±β β§ ((a β¦ββ§ b) β¦ββ§ c) β a β¦ββ§ (b β¦ββ§ c) +β¦Ξ±ββ§ {A} {B} {C} a b c- = begin + β¦ F.β Ξ±β β§ ((a β¦ββ§ b) β¦ββ§ c-) ββ¨ F.F-resp-β S.βΞ±β ((a β¦ββ§ b) β¦ββ§ c-) β¨ + β¦ F.β Ξ±ββ² β§ ((a β¦ββ§ b) β¦ββ§ c-) ββ¨ β-F.associativity ((a , b) , c-) β© + a β¦ββ§ (b β¦ββ§ c-) β + where + open β-Reasoning (setoid (F.β (A ββ (B ββ C)))) + module π-CC = CartesianCategory π-CC + β-F : MonoidalFunctor π-CC.monoidalCategory (CMonoids-CC.monoidalCategory {c} {c}) + β-F = isMonoidalFunctor {C = π-CC} {CMonoids-CC {c} {c}} F + module β-F = MonoidalFunctor β-F + +β¦ββ§-congΛ‘ + : {A B : Obj} + (let module FB = CommutativeMonoid (F.β B)) + (let module F[A+B] = CommutativeMonoid (F.β (A ββ B))) + {a : Carrier (F.β A)} + {b bβ² : Carrier (F.β B)} + β b FB.β bβ² + β a β¦ββ§ b F[A+B].β a β¦ββ§ bβ² +β¦ββ§-congΛ‘ {A} βb = β¦ββ§-cong (refl (F.β A)) βb + + +β¦ββ§-congΚ³ + : {A B : Obj} + (let module FA = CommutativeMonoid (F.β A)) + (let module F[A+B] = CommutativeMonoid (F.β (A ββ B))) + {a aβ² : Carrier (F.β A)} + {b : Carrier (F.β B)} + β a FA.β aβ² + β a β¦ββ§ b F[A+B].β aβ² β¦ββ§ b +β¦ββ§-congΚ³ {B = B} βa = β¦ββ§-cong βa (refl (F.β B)) + +module _ {Aα΅’ Aβ Bα΅’ Bβ : Obj} (i : Aβ ββ Bα΅’ β Aα΅’) (o : Aβ β Bβ) where + + A-System B-System : Set (suc c) + A-System = System (setoid (F.β Aα΅’)) (F.β Aβ) + B-System = System (setoid (F.β Bα΅’)) (F.β Bβ) + + A-Systems B-Systems : Category (suc c) c c + A-Systems = Systems[ setoid (F.β Aα΅’) , F.β Aβ ] + B-Systems = Systems[ setoid (F.β Bα΅’) , F.β Bβ ] + + Iβ : CMonoidHomomorphism c c (F.β (Aβ ββ Bα΅’)) (F.β Aα΅’) + Iβ = F.β i + + Oβ : CMonoidHomomorphism c c (F.β Aβ) (F.β Bβ) + Oβ = F.β o + + wire : A-System β B-System + wire sys = record + { S = X.S + ; fβ = Ξ»g (eval β (X.fβ Γ-function Id X.S) β β¨ func Iβ β func (F.Γ-iso.to Aβ Bα΅’) β X.fβ Γ-function IdΒ (setoid (F.β Bα΅’)) β swapβ , Οβ β©) + ; fβ = func Oβ β X.fβ + } + where + module X = System sys + open CartesianClosed (Setoids-CCC c) using (Ξ»g; eval; cartesian) + open Cartesian cartesian using (Οβ; Οβ; β¨_,_β©) + + wire-β€ : {A B : A-System} β A β€ B β wire A β€ wire B + wire-β€ {A} {B} Aβ€B = record + { βS = βS + ; β-fβ = β-wfβ + ; β-fβ = β-wfβ + } + where + module A = System A + module B = System B + module wA = System (wire A) + module wB = System (wire B) + open System + open _β€_ Aβ€B + β-wfβ + : (i : Carrier (F.β Bα΅’)) + (s : β£ wA.S β£) + β βS β¨$β© wA.fββ² i s B.S.β wB.fββ² i (βS β¨$β© s) + β-wfβ i s = begin + βS β¨$β© A.fββ² (β¦ Iβ β§ (A.fββ² s β¦ββ§ i)) s ββ¨ β-fβ (β¦ Iβ β§ (A.fββ² s β¦ββ§ i)) s β© + B.fββ² (β¦ Iβ β§ (A.fββ² s β¦ββ§ i)) (βS β¨$β© s) ββ¨ cong B.fβ (β¦β§-cong Iβ (β¦ββ§-congΚ³ (β-fβ s))) β© + B.fββ² (β¦ Iβ β§ (B.fββ² (βS β¨$β© s) β¦ββ§ i)) (βS β¨$β© s) β + where + open β-Reasoning B.S + β-wfβ + : (s : β£ wA.S β£) + β (open CommutativeMonoid (F.β Bβ) using (_β_)) + β wA.fββ² s β wB.fββ² (βS β¨$β© s) + β-wfβ s = β¦β§-cong Oβ (β-fβ s) + + Wire : Functor A-Systems B-Systems + Wire = record + { Fβ = wire + ; Fβ = wire-β€ + ; identity = Ξ» {X} β System.S.refl X + ; homomorphism = Ξ» {Z = Z} β System.S.refl Z + ; F-resp-β = id + } + +identity : {Aα΅’ Aβ : Obj} β Wire {Aα΅’} {Aβ} S.pβ π.id β IdF +identity {Aα΅’} {Aβ} = niHelper record + { Ξ· = β€X + ; Ξ·β»ΒΉ = β₯X + ; commute = Ξ» {_ Y} _ β System.S.refl Y + ; iso = Ξ» X β record + { isoΛ‘ = System.S.refl X + ; isoΚ³ = System.S.refl X + } + } + where + module _ (X : System (setoid (F.β Aα΅’)) (F.β Aβ)) where + module X = System X + open IsProduct F.F-resp-Γ using (projectβ) + β€X : wire S.pβ π.id X β€ X + β€X = record + { βS = Id X.S + ; β-fβ = Ξ» i s β cong X.fβ (projectβ (X.fββ² s , i)) + ; β-fβ = Ξ» s β F.identity (X.fββ² s) + } + β₯X : X β€ wire S.pβ π.id X + β₯X = record + { βS = Id X.S + ; β-fβ = Ξ» i s β X.S.sym (cong X.fβ (projectβ (X.fββ² s , i))) + ; β-fβ = Ξ» s β sym (F.β Aβ) (F.identity (X.fββ² s)) + } + +homomorphism + : {Xα΅’ Xβ Yα΅’ Yβ Zα΅’ Zβ : Obj} + {fα΅’ : Xβ ββ Yα΅’ β Xα΅’} + {fβ : Xβ β Yβ} + {gα΅’ : Yβ ββ Zα΅’ β Yα΅’} + {gβ : Yβ β Zβ} + β Wire (input ((gα΅’ β§ gβ) β» (fα΅’ β§ fβ))) (output ((gα΅’ β§ gβ) β» (fα΅’ β§ fβ))) + β Wire gα΅’ gβ βF Wire fα΅’ fβ +homomorphism {Xα΅’} {Xβ} {Yα΅’} {Yβ} {Zα΅’} {Zβ} {fα΅’} {fβ} {gα΅’} {gβ} = niHelper record + { Ξ· = Ξ· + ; Ξ·β»ΒΉ = Ξ·β»ΒΉ + ; commute = Ξ» {_ Y} _ β System.S.refl Y + ; iso = Ξ» X β record + { isoΛ‘ = System.S.refl X + ; isoΚ³ = System.S.refl X + } + } + where + module _ (X : System (setoid (F.β Xα΅’)) (F.β Xβ)) where + module X = System X + module _ (i : Carrier (F.β Zα΅’)) (s : β£ X.S β£) where + lemβ + : (let open CommutativeMonoid (F.β Yα΅’) using (_β_)) + β β¦ F.β (gα΅’ β fβ ββ π.id) β§ (X.fββ² s β¦ββ§ i) β β¦ F.β gα΅’ β§ (β¦ F.β fβ β§ (X.fββ² s) β¦ββ§ i) + lemβ = begin + β¦ F.β (gα΅’ β fβ ββ π.id) β§ (X.fββ² s β¦ββ§ i) ββ¨ F.homomorphism (X.fββ² s β¦ββ§ i) β© + β¦ F.β gα΅’ β§ (β¦ F.β (fβ ββ π.id) β§ (X.fββ² s β¦ββ§ i)) ββ¨ β¦β§-cong (F.β gα΅’) (β¦ββ§-commute (X.fββ² s) i) β© + β¦ F.β gα΅’ β§ (β¦ F.β fβ β§ (X.fββ² s) β¦ββ§ β¦ F.β π.id β§ i) ββ¨ β¦β§-cong (F.β gα΅’) (β¦ββ§-congΛ‘ (F.identity i)) β© + β¦ F.β gα΅’ β§ (β¦ F.β fβ β§ (X.fββ² s) β¦ββ§ i) β + where + open β-Reasoning (setoid (F.β Yα΅’)) + lemβ + : (let open CommutativeMonoid (F.β (Xβ ββ (Xβ ββ Zα΅’))) using (_β_)) + β β¦ F.β (Ξ±β π.β β³ ββ π.id) β§ (X.fββ² s β¦ββ§ i) + β X.fββ² s β¦ββ§ (X.fββ² s β¦ββ§ i) + lemβ = begin + β¦ F.β (Ξ±β π.β β³ ββ π.id) β§ (X.fββ² s β¦ββ§ i) ββ¨ F.homomorphism (X.fββ² s β¦ββ§ i) β© + β¦ F.β Ξ±β β§ (β¦ F.β (β³ ββ π.id) β§ (X.fββ² s β¦ββ§ i)) ββ¨ β¦β§-cong (F.β Ξ±β) (β¦ββ§-commute (X.fββ² s) i) β© + β¦ F.β Ξ±β β§ (β¦ F.β β³ β§ (X.fββ² s) β¦ββ§ β¦ F.β π.id β§ i) ββ¨ β¦β§-cong (F.β Ξ±β) (β¦ββ§-cong (β¦β³β§ (X.fββ² s)) (F.identity i)) β© + β¦ F.β Ξ±β β§ ((X.fββ² s β¦ββ§ X.fββ² s) β¦ββ§ i) ββ¨ β¦Ξ±ββ§ (X.fββ² s) (X.fββ² s) i β© + X.fββ² s β¦ββ§ (X.fββ² s β¦ββ§ i) β + where + open β-Reasoning (setoid (F.β (Xβ ββ (Xβ ββ Zα΅’)))) + lemβ + : (let open CommutativeMonoid (F.β (Xβ ββ Yα΅’)) using (_β_)) + β β¦ F.β (π.id ββ (gα΅’ β fβ ββ π.id) π.β Ξ±β π.β β³ ββ π.id) β§ (X.fββ² s β¦ββ§ i) + β (X.fββ² s β¦ββ§ (β¦ F.β gα΅’ β§ (β¦ F.β fβ β§ (X.fββ² s) β¦ββ§ i))) + lemβ = begin + β¦ F.β (π.id ββ (gα΅’ β fβ ββ π.id) π.β Ξ±β π.β β³ ββ π.id) β§ (X.fββ² s β¦ββ§ i) ββ¨ F.homomorphism (X.fββ² s β¦ββ§ i) β© + β¦ F.β (π.id ββ (gα΅’ β fβ ββ π.id)) β§ (β¦ F.β (Ξ±β π.β β³ ββ π.id) β§ (X.fββ² s β¦ββ§ i)) ββ¨ β¦β§-cong (F.β (π.id ββ (gα΅’ β fβ ββ π.id))) lemβ β© + β¦ F.β (π.id ββ (gα΅’ β fβ ββ π.id)) β§ (X.fββ² s β¦ββ§ (X.fββ² s β¦ββ§ i)) ββ¨ β¦ββ§-commute (X.fββ² s) (X.fββ² s β¦ββ§ i) β© + β¦ F.β π.id β§ (X.fββ² s) β¦ββ§ β¦ F.β (gα΅’ β fβ ββ π.id) β§ (X.fββ² s β¦ββ§ i) ββ¨ β¦ββ§-cong (F.identity (X.fββ² s)) lemβ β© + X.fββ² s β¦ββ§ β¦ F.β gα΅’ β§ (β¦ F.β fβ β§ (X.fββ² s) β¦ββ§ i) β + where + open β-Reasoning (setoid (F.β (Xβ ββ Yα΅’))) + β-fβ + : X.fββ² (β¦ F.β (fα΅’ β π.id ββ (gα΅’ β fβ ββ π.id) π.β Ξ±β π.β β³ ββ π.id) β§ (X.fββ² s β¦ββ§ i)) s X.S.β + X.fββ² (β¦ F.β fα΅’ β§ (X.fββ² s β¦ββ§ (β¦ F.β gα΅’ β§ (β¦ F.β fβ β§ (X.fββ² s) β¦ββ§ i)))) s + β-fβ = cong X.fβ $ begin + β¦ F.β (fα΅’ β π.id ββ (gα΅’ β fβ ββ π.id) π.β Ξ±β π.β β³ ββ π.id) β§ (X.fββ² s β¦ββ§ i) ββ¨ F.homomorphism (X.fββ² s β¦ββ§ i) β© + β¦ F.β fα΅’ β§ (β¦ F.β (π.id ββ (gα΅’ β fβ ββ π.id) π.β Ξ±β π.β β³ ββ π.id) β§ (X.fββ² s β¦ββ§ i)) ββ¨ β¦β§-cong (F.β fα΅’) lemβ β© + β¦ F.β fα΅’ β§ (X.fββ² s β¦ββ§ β¦ F.β gα΅’ β§ (β¦ F.β fβ β§ (X.fββ² s) β¦ββ§ i)) β + where + open β-Reasoning (setoid (F.β Xα΅’)) + Ξ· : wire (input ((gα΅’ β§ gβ) β» (fα΅’ β§ fβ))) (output ((gα΅’ β§ gβ) β» (fα΅’ β§ fβ))) X β€ wire gα΅’ gβ (wire fα΅’ fβ X) + Ξ· = record + { βS = Id X.S + ; β-fβ = β-fβ + ; β-fβ = Ξ» s β F.homomorphism (X.fββ² s) + } + Ξ·β»ΒΉ : wire gα΅’ gβ (wire fα΅’ fβ X) β€ wire (input ((gα΅’ β§ gβ) β» (fα΅’ β§ fβ))) (output ((gα΅’ β§ gβ) β» (fα΅’ β§ fβ))) X + Ξ·β»ΒΉ = record + { βS = Id X.S + ; β-fβ = Ξ» i s β X.S.sym (β-fβ i s) + ; β-fβ = Ξ» s β sym (F.β Zβ) (F.homomorphism (X.fββ² s)) + } + +Sys-resp-β + : {A B : Box} + {f g : WiringDiagram A B} + β f β-β§ g + β Wire (input f) (output f) β Wire (input g) (output g) +Sys-resp-β {A} {B} {f} {g} fβg = niHelper record + { Ξ· = wfβ€wg + ; Ξ·β»ΒΉ = wgβ€wf + ; commute = Ξ» {_ Y} _ β System.S.refl Y + ; iso = Ξ» X β record + { isoΛ‘ = System.S.refl X + ; isoΚ³ = System.S.refl X + } + } + where + module A = Box A + module B = Box B + module _ (X : System (setoid (F.β A.α΅’)) (F.β A.β)) where + + fα΅’ gα΅’ : A.β ββ B.α΅’ β A.α΅’ + fα΅’ = input f + gα΅’ = input g + + fβ gβ : A.β β B.β + fβ = output f + gβ = output g + + open _β-β§_ fβg + + module X = System X + + wfβ€wg : wire fα΅’ fβ X β€ wire gα΅’ gβ X + wfβ€wg = record + { βS = Id X.S + ; β-fβ = Ξ» i s β cong X.fβ (F.F-resp-β βi (X.fββ² s β¦ββ§ i)) + ; β-fβ = Ξ» s β F.F-resp-β βo (X.fββ² s) + } + + wgβ€wf : wire (input g) (output g) X β€ wire (input f) (output f) X + wgβ€wf = record + { βS = Id X.S + ; β-fβ = Ξ» i s β X.S.sym (cong X.fβ (F.F-resp-β βi (X.fββ² s β¦ββ§ i))) + ; β-fβ = Ξ» s β sym (F.β B.β) (F.F-resp-β βo (X.fββ² s)) + } + +Sys : Functor DWD (Cats (suc c) c c) +Sys = record + { Fβ = Ξ» (i β‘ o) β Systems[ setoid (F.β i) , F.β o ] + ; Fβ = Ξ» (input β§ output) β Wire input output + ; identity = identity + ; homomorphism = homomorphism + ; F-resp-β = Sys-resp-β + } |
