aboutsummaryrefslogtreecommitdiff
path: root/Data/Matrix/Cast.agda
blob: a171c7a4c2e66c294953b2bf7eace086ec292a27 (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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
{-# OPTIONS --without-K --safe #-}

open import Level using (Level; _⊔_)
open import Relation.Binary using (Setoid)

module Data.Matrix.Cast {c  : Level} (S : Setoid c ) where

module S = Setoid S

open import Data.Matrix.Core S using (Matrix; _∥_; _≑_; _∷ₕ_; []ᵥ; []ᵥ-!; []ᵥ-∥; ∷ₕ-∥; head-∷-tailₕ; headₕ; tailₕ)
open import Data.Nat using (ℕ; _+_)
open import Data.Nat.Properties using (suc-injective; +-assoc)
open import Data.Vec using (Vec; map) renaming (cast to castVec)
open import Data.Vec.Properties using (++-assoc-eqFree) renaming (cast-is-id to castVec-is-id)
open import Data.Vector.Core S using (Vector; _++_)
open import Relation.Binary.PropositionalEquality as  using (_≡_; module ≡-Reasoning)

open Vec
open private
  variable
    A B C D E F : ℕ

opaque
  unfolding Matrix Vector
  cast₁ : .(A  B)  Matrix A C  Matrix B C
  cast₁ eq = map (castVec eq)

opaque
  unfolding Matrix
  cast₂ : .(B  C)  Matrix A B  Matrix A C
  cast₂ eq [] = castVec eq []
  cast₂ {B} {suc C} {A} eq (x  M) = x  cast₂ (suc-injective eq) M

opaque
  unfolding cast₁
  cast₁-is-id : .(eq : A  A) (M : Matrix A B)  cast₁ eq M  M
  cast₁-is-id _ [] = ≡.refl
  cast₁-is-id _ (M₀  M) = ≡.cong₂ _∷_ (castVec-is-id _ M₀) (cast₁-is-id _ M)

opaque
  unfolding cast₂
  cast₂-is-id : .(eq : B  B) (M : Matrix A B)  cast₂ eq M  M
  cast₂-is-id _ [] = ≡.refl
  cast₂-is-id eq (M₀  M) = ≡.cong (M₀ ∷_) (cast₂-is-id (suc-injective eq) M)

opaque
  unfolding cast₂
  cast₂-trans : .(eq₁ : B  C) (eq₂ : C  D) (M : Matrix A B)  cast₂ eq₂ (cast₂ eq₁ M)  cast₂ (≡.trans eq₁ eq₂) M
  cast₂-trans {zero} {zero} {zero} {A} eq₁ eq₂ [] = ≡.refl
  cast₂-trans {suc B} {suc C} {suc D} {A} eq₁ eq₂ (M₀  M) = ≡.cong (M₀ ∷_) (cast₂-trans (suc-injective eq₁) (suc-injective eq₂) M)

opaque
  unfolding _∥_ cast₁
  ∥-assoc
      : (X : Matrix A D)
        (Y : Matrix B D)
        (Z : Matrix C D)
       cast₁ (+-assoc A B C) ((X  Y)  Z)  X  Y  Z
  ∥-assoc [] [] [] = cast₁-is-id ≡.refl []
  ∥-assoc (X₀  X) (Y₀  Y) (Z₀  Z) = ≡.cong₂ _∷_ (++-assoc-eqFree X₀ Y₀ Z₀) (∥-assoc X Y Z)

opaque
  unfolding _≑_ cast₂
  ≑-assoc
      : (X : Matrix A B)
        (Y : Matrix A C)
        (Z : Matrix A D)
       cast₂ (+-assoc B C D) ((X  Y)  Z)  X  Y  Z
  ≑-assoc [] Y Z = cast₂-is-id ≡.refl (Y  Z)
  ≑-assoc (X₀  X) Y Z = ≡.cong (X₀ ∷_) (≑-assoc X Y Z)

≑-sym-assoc
    : (X : Matrix A B)
      (Y : Matrix A C)
      (Z : Matrix A D)
     cast₂ (≡.sym (+-assoc B C D)) (X  Y  Z)  (X  Y)  Z
≑-sym-assoc {A} {B} {C} {D} X Y Z = begin
    cast₂ _ (X  Y  Z)                 ≡⟨ ≡.cong (cast₂ _) (≑-assoc X Y Z)     cast₂ _ (cast₂ assoc ((X  Y)  Z)) ≡⟨ cast₂-trans assoc (≡.sym assoc) ((X  Y)  Z)     cast₂ _ ((X  Y)  Z)               ≡⟨ cast₂-is-id _ ((X  Y)  Z)     (X  Y)  Z                           where
    open ≡-Reasoning
    assoc : B + C + D  B + (C + D)
    assoc = +-assoc B C D

opaque
  unfolding _∥_ _≑_
  ∥-≑ : {A₁ B₁ A₂ B₂ : }
        (W : Matrix A₁ B₁)
        (X : Matrix A₂ B₁)
        (Y : Matrix A₁ B₂)
        (Z : Matrix A₂ B₂)
       W  X  Y  Z  (W  Y)  (X  Z)
  ∥-≑ {A₁} {ℕ.zero} {A₂} {B₂} [] [] Y Z = ≡.refl
  ∥-≑ {A₁} {suc B₁} {A₂} {B₂} (W₀  W) (X₀  X) Y Z = ≡.cong ((W₀ ++ X₀) ∷_) (∥-≑ W X Y Z)

∥-≑⁴
    : (R : Matrix A D)
      (S : Matrix B D)
      (T : Matrix C D)
      (U : Matrix A E)
      (V : Matrix B E)
      (W : Matrix C E)
      (X : Matrix A F)
      (Y : Matrix B F)
      (Z : Matrix C F)
     (R  S  T)       (U  V  W)       (X  Y  Z)
     (R  U  X)       (S  V  Y)       (T  W  Z)
∥-≑⁴ R S T U V W X Y Z = begin
    R  S  T  U  V  W  X  Y  Z               ≡⟨ ≡.cong (R  S  T ≑_) (∥-≑ U (V  W) X (Y  Z))     R  S  T  (U  X)  (V  W  Y  Z)           ≡⟨ ≡.cong (λ h  (R  S  T  (U  X)  h)) (∥-≑ V W Y Z)     R  S  T  (U  X)  (V  Y)  (W  Z)         ≡⟨ ∥-≑ R (S  T) (U  X) ((V  Y)  (W  Z))     (R  (U  X))  ((S  T)  ((V  Y)  (W  Z))) ≡⟨ ≡.cong ((R  U  X) ∥_) (∥-≑ S T (V  Y) (W  Z))     (R  U  X)  (S  V  Y)  (T  W  Z)           where
    open ≡-Reasoning

opaque
  unfolding Vector
  cast : .(A  B)  Vector A  Vector B
  cast = castVec

opaque
  unfolding cast cast₂ _∷ₕ_
  cast₂-∷ₕ : .(eq : B  C) (V : Vector B) (M : Matrix A B)  cast eq V ∷ₕ cast₂ eq M  cast₂ eq (V ∷ₕ M)
  cast₂-∷ₕ {zero} {zero} {A} _ [] [] = ≡.sym (cast₂-is-id ≡.refl ([] ∷ₕ []))
  cast₂-∷ₕ {suc B} {suc C} {A} eq (x  V) (M₀  M) = ≡.cong ((x  M₀) ∷_) (cast₂-∷ₕ _ V M)

opaque
  unfolding []ᵥ cast₂
  cast₂-[]ᵥ : .(eq : A  B)  cast₂ eq []ᵥ  []ᵥ
  cast₂-[]ᵥ {zero} {zero} _ = ≡.refl
  cast₂-[]ᵥ {suc A} {suc B} eq = ≡.cong ([] ∷_) (cast₂-[]ᵥ (suc-injective eq))

cast₂-∥ : .(eq : C  D) (M : Matrix A C) (N : Matrix B C)  cast₂ eq M  cast₂ eq N  cast₂ eq (M  N)
cast₂-∥ {C} {D} {zero} {B} eq M N
  rewrite ([]ᵥ-! M) = begin
    cast₂ _ []ᵥ  cast₂ _ N ≡⟨ ≡.cong (_∥ cast₂ _ N) (cast₂-[]ᵥ _)     []ᵥ  cast₂ _ N         ≡⟨ []ᵥ-∥ (cast₂ _ N)     cast₂ _ N               ≡⟨ ≡.cong (cast₂ _) ([]ᵥ-∥ N)     cast₂ _ ([]ᵥ  N)         where
    open ≡-Reasoning
cast₂-∥ {C} {D} {suc A} {B} eq M N
  rewrite ≡.sym (head-∷-tailₕ M)
  using M₀  headₕ M
  using M  tailₕ M = begin
    cast₂ _ (M₀ ∷ₕ M)  (cast₂ _ N)         ≡⟨ ≡.cong (_∥ (cast₂ eq N)) (cast₂-∷ₕ eq M₀ M)     (cast _ M₀ ∷ₕ cast₂ _ M)  (cast₂ _ N)  ≡⟨ ∷ₕ-∥ (cast _ M₀) (cast₂ _ M) (cast₂ _ N)     cast _ M₀ ∷ₕ (cast₂ _ M  cast₂ _ N)    ≡⟨ ≡.cong (cast eq M₀ ∷ₕ_) (cast₂-∥ _ M N)     cast _ M₀ ∷ₕ cast₂ _ (M  N)            ≡⟨ cast₂-∷ₕ eq M₀ (M  N)     cast₂ _ (M₀ ∷ₕ (M  N))                 ≡⟨ ≡.cong (cast₂ eq) (∷ₕ-∥ M₀ M N)     cast₂ _ ((M₀ ∷ₕ M)  N)                   where
    open ≡-Reasoning