aboutsummaryrefslogtreecommitdiff
path: root/Data/Vector/Bifunctor.agda
blob: 51e89701832b1f1bb8ec9e59deac561497344929 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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