aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Data/Vector/Endofunctor.agda68
1 files changed, 68 insertions, 0 deletions
diff --git a/Data/Vector/Endofunctor.agda b/Data/Vector/Endofunctor.agda
new file mode 100644
index 0000000..a9b2905
--- /dev/null
+++ b/Data/Vector/Endofunctor.agda
@@ -0,0 +1,68 @@
+{-# OPTIONS --without-K --safe #-}
+
+open import Data.Nat using (ℕ)
+open import Level using (Level; _⊔_)
+
+-- The endofunctor in setoids sending A to Vector A n for a fixed n
+module Data.Vector.Endofunctor (n : ℕ) {c ℓ : Level} where
+
+import Data.Vec as Vec
+
+open import Categories.Category.Instance.Setoids using (Setoids)
+open import Categories.Functor using (Functor)
+open import Data.Vec.Properties using (map-id; map-∘)
+open import Data.Vec.Relation.Binary.Pointwise.Inductive using (map⁺)
+open import Data.Vector.Core as Core using (Vector; Vectorₛ; module ≊)
+open import Function using (Func; _⟶ₛ_; _⟨$⟩_)
+open import Function.Construct.Composition using () renaming (function to compose)
+open import Function.Construct.Identity using () renaming (function to Id)
+open import Relation.Binary using (Setoid)
+
+open Func
+
+opaque
+ unfolding Vector
+ map : {c ℓ : Level} {A B : Setoid c ℓ} → A ⟶ₛ B → Vectorₛ A n ⟶ₛ Vectorₛ B n
+ map f .to = Vec.map (to f)
+ map f .cong = map⁺ (cong f)
+
+abstract opaque
+
+ unfolding map
+
+ identity
+ : {A : Setoid c ℓ}
+ {V : Vector A n}
+ (open Core A using (_≊_))
+ → map (Id A) ⟨$⟩ V ≊ V
+ identity {A} {V} = ≊.reflexive A (map-id V)
+
+ homomorphism
+ : {X Y Z : Setoid c ℓ}
+ {f : X ⟶ₛ Y}
+ {g : Y ⟶ₛ Z}
+ {V : Vector X n}
+ (open Core Z using (_≊_))
+ → map (compose f g) ⟨$⟩ V ≊ map g ⟨$⟩ (map f ⟨$⟩ V)
+ homomorphism {_} {_} {Z} {f} {g} {V} = ≊.reflexive Z (map-∘ (to g) (to f) V)
+
+ F-resp-≈
+ : {A B : Setoid c ℓ}
+ {f g : A ⟶ₛ B}
+ → ({x : Setoid.Carrier A} → (B Setoid.≈ to f x) (to g x))
+ → {V : Vector A n}
+ (open Core B using (_≊_))
+ → map f ⟨$⟩ V ≊ map g ⟨$⟩ V
+ F-resp-≈ {A} {B} {_} {g} f≈g {V} = map⁺ (λ x≈y → B.trans f≈g (cong g x≈y)) (≊.refl A)
+ where
+ module B = Setoid B
+
+-- only a true endofunctor when c ≤ ℓ
+Vec : Functor (Setoids c ℓ) (Setoids c (c ⊔ ℓ))
+Vec = record
+ { F₀ = λ A → Vectorₛ A n
+ ; F₁ = map
+ ; identity = identity
+ ; homomorphism = homomorphism
+ ; F-resp-≈ = F-resp-≈
+ }