@@ -11,7 +11,7 @@ module Data.Vec.Properties where
11
11
open import Algebra.Definitions
12
12
open import Data.Bool.Base using (true; false)
13
13
open import Data.Fin.Base as Fin
14
- using (Fin; zero; suc; toℕ; fromℕ<; _↑ˡ_; _↑ʳ_)
14
+ using (Fin; zero; suc; toℕ; fromℕ<; _↑ˡ_; _↑ʳ_; inject≤ )
15
15
open import Data.List.Base as List using (List)
16
16
import Data.List.Properties as List
17
17
open import Data.Nat.Base
@@ -154,22 +154,6 @@ take≡truncate : ∀ m (xs : Vec A (m + n)) →
154
154
take≡truncate zero _ = refl
155
155
take≡truncate (suc m) (x ∷ xs) = cong (x ∷_) (take≡truncate m xs)
156
156
157
- ------------------------------------------------------------------------
158
- -- pad
159
-
160
- padRight-refl : (a : A) (xs : Vec A n) → padRight ≤-refl a xs ≡ xs
161
- padRight-refl a [] = refl
162
- padRight-refl a (x ∷ xs) = cong (x ∷_) (padRight-refl a xs)
163
-
164
- padRight-replicate : (m≤n : m ≤ n) (a : A) → replicate n a ≡ padRight m≤n a (replicate m a)
165
- padRight-replicate z≤n a = refl
166
- padRight-replicate (s≤s m≤n) a = cong (a ∷_) (padRight-replicate m≤n a)
167
-
168
- padRight-trans : ∀ {p} (m≤n : m ≤ n) (n≤p : n ≤ p) (a : A) (xs : Vec A m) →
169
- padRight (≤-trans m≤n n≤p) a xs ≡ padRight n≤p a (padRight m≤n a xs)
170
- padRight-trans z≤n n≤p a [] = padRight-replicate n≤p a
171
- padRight-trans (s≤s m≤n) (s≤s n≤p) a (x ∷ xs) = cong (x ∷_) (padRight-trans m≤n n≤p a xs)
172
-
173
157
------------------------------------------------------------------------
174
158
-- truncate and padRight together
175
159
@@ -1184,13 +1168,71 @@ toList-replicate : ∀ (n : ℕ) (x : A) →
1184
1168
toList-replicate zero x = refl
1185
1169
toList-replicate (suc n) x = cong (_ List.∷_) (toList-replicate n x)
1186
1170
1171
+ cast-replicate : ∀ .(m≡n : m ≡ n) (x : A) → cast m≡n (replicate m x) ≡ replicate n x
1172
+ cast-replicate {m = zero} {n = zero} _ _ = refl
1173
+ cast-replicate {m = suc _} {n = suc _} m≡n x = cong (x ∷_) (cast-replicate (suc-injective m≡n) x)
1174
+
1175
+ ------------------------------------------------------------------------
1176
+ -- pad
1177
+
1178
+ padRight-refl : (a : A) (xs : Vec A n) → padRight ≤-refl a xs ≡ xs
1179
+ padRight-refl a [] = refl
1180
+ padRight-refl a (x ∷ xs) = cong (x ∷_) (padRight-refl a xs)
1181
+
1182
+ padRight-replicate : (m≤n : m ≤ n) (a : A) → replicate n a ≡ padRight m≤n a (replicate m a)
1183
+ padRight-replicate z≤n a = refl
1184
+ padRight-replicate (s≤s m≤n) a = cong (a ∷_) (padRight-replicate m≤n a)
1185
+
1186
+ padRight-trans : ∀ (m≤n : m ≤ n) (n≤o : n ≤ o) (a : A) (xs : Vec A m) →
1187
+ padRight (≤-trans m≤n n≤o) a xs ≡ padRight n≤o a (padRight m≤n a xs)
1188
+ padRight-trans z≤n n≤o a [] = padRight-replicate n≤o a
1189
+ padRight-trans (s≤s m≤n) (s≤s n≤o) a (x ∷ xs) = cong (x ∷_) (padRight-trans m≤n n≤o a xs)
1190
+
1191
+ padRight-lookup : ∀ (m≤n : m ≤ n) (a : A) (xs : Vec A m) (i : Fin m) →
1192
+ lookup (padRight m≤n a xs) (inject≤ i m≤n) ≡ lookup xs i
1193
+ padRight-lookup (s≤s m≤n) a (x ∷ xs) zero = refl
1194
+ padRight-lookup (s≤s m≤n) a (x ∷ xs) (suc i) = padRight-lookup m≤n a xs i
1195
+
1196
+ padRight-map : ∀ (f : A → B) (m≤n : m ≤ n) (a : A) (xs : Vec A m) →
1197
+ map f (padRight m≤n a xs) ≡ padRight m≤n (f a) (map f xs)
1198
+ padRight-map f z≤n a [] = map-replicate f a _
1199
+ padRight-map f (s≤s m≤n) a (x ∷ xs) = cong (f x ∷_) (padRight-map f m≤n a xs)
1200
+
1201
+ padRight-zipWith : ∀ (f : A → B → C) (m≤n : m ≤ n) (a : A) (b : B)
1202
+ (xs : Vec A m) (ys : Vec B m) →
1203
+ zipWith f (padRight m≤n a xs) (padRight m≤n b ys) ≡ padRight m≤n (f a b) (zipWith f xs ys)
1204
+ padRight-zipWith f z≤n a b [] [] = zipWith-replicate f a b
1205
+ padRight-zipWith f (s≤s m≤n) a b (x ∷ xs) (y ∷ ys) = cong (f x y ∷_) (padRight-zipWith f m≤n a b xs ys)
1206
+
1207
+ padRight-zipWith₁ : ∀ (f : A → B → C) (o≤m : o ≤ m) (m≤n : m ≤ n)
1208
+ (a : A) (b : B) (xs : Vec A m) (ys : Vec B o) →
1209
+ zipWith f (padRight m≤n a xs) (padRight (≤-trans o≤m m≤n) b ys) ≡
1210
+ padRight m≤n (f a b) (zipWith f xs (padRight o≤m b ys))
1211
+ padRight-zipWith₁ f o≤m m≤n a b xs ys = trans (cong (zipWith f (padRight m≤n a xs)) (padRight-trans o≤m m≤n b ys))
1212
+ (padRight-zipWith f m≤n a b xs (padRight o≤m b ys))
1213
+
1214
+ padRight-take : ∀ (m≤n : m ≤ n) (a : A) (xs : Vec A m) .(n≡m+o : n ≡ m + o) →
1215
+ take m (cast n≡m+o (padRight m≤n a xs)) ≡ xs
1216
+ padRight-take m≤n a [] n≡m+o = refl
1217
+ padRight-take (s≤s m≤n) a (x ∷ xs) n≡m+o = cong (x ∷_) (padRight-take m≤n a xs (suc-injective n≡m+o))
1218
+
1219
+ padRight-drop : ∀ (m≤n : m ≤ n) (a : A) (xs : Vec A m) .(n≡m+o : n ≡ m + o) →
1220
+ drop m (cast n≡m+o (padRight m≤n a xs)) ≡ replicate o a
1221
+ padRight-drop {m = zero} z≤n a [] n≡m+o = cast-replicate n≡m+o a
1222
+ padRight-drop {m = suc _} {n = suc _} (s≤s m≤n) a (x ∷ xs) n≡m+o = padRight-drop m≤n a xs (suc-injective n≡m+o)
1223
+
1224
+ padRight-updateAt : ∀ (m≤n : m ≤ n) (x : A) (xs : Vec A m) (f : A → A) (i : Fin m) →
1225
+ updateAt (padRight m≤n x xs) (inject≤ i m≤n) f ≡
1226
+ padRight m≤n x (updateAt xs i f)
1227
+ padRight-updateAt {n = suc _} (s≤s m≤n) x (y ∷ xs) f zero = refl
1228
+ padRight-updateAt {n = suc _} (s≤s m≤n) x (y ∷ xs) f (suc i) = cong (y ∷_) (padRight-updateAt m≤n x xs f i)
1229
+
1187
1230
------------------------------------------------------------------------
1188
1231
-- iterate
1189
1232
1190
1233
iterate-id : ∀ (x : A) n → iterate id x n ≡ replicate n x
1191
1234
iterate-id x zero = refl
1192
1235
iterate-id x (suc n) = cong (_ ∷_) (iterate-id (id x) n)
1193
-
1194
1236
take-iterate : ∀ n f (x : A) → take n (iterate f x (n + m)) ≡ iterate f x n
1195
1237
take-iterate zero f x = refl
1196
1238
take-iterate (suc n) f x = cong (_ ∷_) (take-iterate n f (f x))
0 commit comments