aboutsummaryrefslogtreecommitdiff
path: root/Data/Vector/Bifunctor.agda
diff options
context:
space:
mode:
authorJacques Comeaux <jacquesrcomeaux@protonmail.com>2026-07-07 13:09:11 -0700
committerJacques Comeaux <jacquesrcomeaux@protonmail.com>2026-07-07 13:09:11 -0700
commit61549e3d703bdc5a017833a01febb9c46d95ec17 (patch)
tree7b3aabbe8ddb5d2316cb24368edde212e27d8c1a /Data/Vector/Bifunctor.agda
parentbe685059304423e5a5cbb176b44aef1a4a76325b (diff)
Update matrices and vectors
Diffstat (limited to 'Data/Vector/Bifunctor.agda')
-rw-r--r--Data/Vector/Bifunctor.agda57
1 files changed, 57 insertions, 0 deletions
diff --git a/Data/Vector/Bifunctor.agda b/Data/Vector/Bifunctor.agda
new file mode 100644
index 0000000..51e8970
--- /dev/null
+++ b/Data/Vector/Bifunctor.agda
@@ -0,0 +1,57 @@
+{-# OPTIONS --without-K --safe #-}
+
+open import Level using (Level)
+
+module Data.Vector.Bifunctor {c : Level} where
+
+open import Categories.Category.Instance.Nat using (Natop)
+open import Categories.Category.Instance.Sets using (Sets)
+open import Categories.Functor.Bifunctor using (Bifunctor)
+open import Function using (_∘_)
+open import Data.Nat using (ℕ)
+open import Data.Fin using (Fin)
+open import Data.Product using (_,_)
+open import Data.Vec using (Vec; map; tabulate; lookup)
+open import Data.Vec.Properties using (map-id; map-∘; map-cong; tabulate∘lookup; lookup∘tabulate; tabulate-cong; lookup-map; tabulate-∘)
+open import Relation.Binary.PropositionalEquality as ≡ using (_≡_; module ≡-Reasoning)
+
+naturality
+ : {A B : Set c} {f : A → B} {n m : ℕ} {g : Fin m → Fin n} (v : Vec A n)
+ → map f (tabulate (λ i → lookup v (g i))) ≡ tabulate (λ i → lookup (map f v) (g i))
+naturality {A} {B} {f} {n} {m} {g} v = begin
+ map f (tabulate (λ i → lookup v (g i))) ≡⟨ tabulate-∘ f (λ i → lookup v (g i)) ⟨
+ tabulate (λ i → f (lookup v (g i))) ≡⟨ tabulate-cong (λ i → (lookup-map (g i) f v)) ⟨
+ tabulate (λ i → lookup (map f v) (g i)) ∎
+ where
+ open ≡-Reasoning
+
+bimap : {A B : Set c} {n m : ℕ} (f : A → B) (g : Fin m → Fin n) → Vec A n → Vec B m
+bimap f g v = map f (tabulate (λ i → lookup v (g i)))
+
+Vec₂ : Bifunctor (Sets c) Natop (Sets c)
+Vec₂ = record
+ { F₀ = λ (A , n) → Vec A n
+ ; F₁ = λ (f , g) v → bimap f g v
+ ; identity = λ v → ≡.trans (map-id (tabulate (λ i → lookup v i))) (tabulate∘lookup v)
+ ; homomorphism = λ {_ _ _} {(f , f′)} {(g , g′)} → homomorphism f g f′ g′
+ ; F-resp-≈ = λ (f≗g , f′≗g′) v → ≡.trans (map-cong f≗g (tabulate (λ i → lookup v _))) (≡.cong (map _) (tabulate-cong (λ i → (≡.cong (lookup v) (f′≗g′ i)))))
+ }
+ where
+ homomorphism
+ : {X Y Z : Set c}
+ (f : X → Y)
+ (g : Y → Z)
+ {x y z : ℕ}
+ (f′ : Fin y → Fin x)
+ (g′ : Fin z → Fin y)
+ (v : Vec X x)
+ → bimap (g ∘ f) (f′ ∘ g′) v ≡ bimap g g′ (bimap f f′ v)
+ homomorphism f g f′ g′ v = begin
+ map (g ∘ f) (tabulate (λ i → lookup v (f′ (g′ i)))) ≡⟨ map-∘ g f (tabulate (λ i → lookup v (f′ (g′ i)))) ⟩
+ map g (map f (tabulate (λ i → lookup v (f′ (g′ i))))) ≡⟨ ≡.cong (map g) (naturality v) ⟩
+ map g (tabulate (λ i → lookup (map f v) (f′ (g′ i)))) ≡⟨ ≡.cong (map g) (tabulate-cong (λ i → (lookup∘tabulate (λ i₁ → lookup (map f v) (f′ i₁)) (g′ i)))) ⟨
+ map g (tabulate (λ i → lookup (tabulate (λ i₁ → lookup (map f v) (f′ i₁))) (g′ i)))
+ ≡⟨ ≡.cong (map g) (tabulate-cong (λ i → ≡.cong (λ h → lookup h (g′ i)) (naturality v))) ⟨
+ map g (tabulate (λ i → lookup (map f (tabulate (λ i₁ → lookup v (f′ i₁)))) (g′ i))) ∎
+ where
+ open ≡-Reasoning