@@ -11,14 +11,16 @@ 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
18
18
using (ℕ; zero; suc; _+_; _≤_; _<_; s≤s; pred; s<s⁻¹; _≥_; s≤s⁻¹; z≤n)
19
19
open import Data.Nat.Properties
20
- using (+-assoc; m≤n⇒m≤1+n; m≤m+n; ≤-refl; ≤-trans; ≤-irrelevant; ≤⇒≤″
21
- ; suc-injective; +-comm; +-suc; +-identityʳ)
20
+ using (suc-injective; +-assoc; +-comm; +-suc; +-identityʳ
21
+ ; m≤n⇒m≤1+n; m≤m+n; suc[m]≤n⇒m≤pred[n]
22
+ ; ≤-refl; ≤-trans; ≤-irrelevant; ≤⇒≤″
23
+ )
22
24
open import Data.Product.Base as Product
23
25
using (_×_; _,_; proj₁; proj₂; <_,_>; uncurry)
24
26
open import Data.Sum.Base using ([_,_]′)
@@ -136,47 +138,31 @@ truncate-refl : (xs : Vec A n) → truncate ≤-refl xs ≡ xs
136
138
truncate-refl [] = refl
137
139
truncate-refl (x ∷ xs) = cong (x ∷_) (truncate-refl xs)
138
140
139
- truncate-trans : ∀ {p} (m≤n : m ≤ n) (n≤p : n ≤ p) (xs : Vec A p) →
140
- truncate (≤-trans m≤n n≤p) xs ≡ truncate m≤n (truncate n≤p xs)
141
- truncate-trans z≤n n≤p xs = refl
142
- truncate-trans (s≤s m≤n) (s≤s n≤p) (x ∷ xs) = cong (x ∷_) (truncate-trans m≤n n≤p xs)
141
+ truncate-trans : ∀ .(m≤n : m ≤ n) .(n≤o : n ≤ o) (xs : Vec A o) →
142
+ truncate (≤-trans m≤n n≤o) xs ≡ truncate m≤n (truncate n≤o xs)
143
+ truncate-trans {m = zero} _ _ _ = refl
144
+ truncate-trans {m = suc _} {n = suc _} m≤n n≤o (x ∷ xs) =
145
+ cong (x ∷_) (truncate-trans (s≤s⁻¹ m≤n) (s≤s⁻¹ n≤o) xs)
143
146
144
- truncate-irrelevant : (m≤n₁ m≤n₂ : m ≤ n) → truncate {A = A} m≤n₁ ≗ truncate m≤n₂
145
- truncate-irrelevant m≤n₁ m≤n₂ xs = cong (λ m≤n → truncate m≤n xs) (≤-irrelevant m≤n₁ m≤n₂)
146
-
147
- truncate≡take : (m≤n : m ≤ n) (xs : Vec A n) .(eq : n ≡ m + o) →
147
+ truncate≡take : .(m≤n : m ≤ n) (xs : Vec A n) .(eq : n ≡ m + o) →
148
148
truncate m≤n xs ≡ take m (cast eq xs)
149
- truncate≡take z≤n _ eq = refl
150
- truncate≡take (s≤s m≤n) (x ∷ xs) eq = cong (x ∷_) (truncate≡take m≤n xs (suc-injective eq))
149
+ truncate≡take {m = zero} _ _ _ = refl
150
+ truncate≡take {m = suc _} m≤n (x ∷ xs) eq =
151
+ cong (x ∷_) (truncate≡take (s≤s⁻¹ m≤n) xs (suc-injective eq))
151
152
152
153
take≡truncate : ∀ m (xs : Vec A (m + n)) →
153
154
take m xs ≡ truncate (m≤m+n m n) xs
154
155
take≡truncate zero _ = refl
155
156
take≡truncate (suc m) (x ∷ xs) = cong (x ∷_) (take≡truncate m xs)
156
157
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
158
------------------------------------------------------------------------
174
159
-- truncate and padRight together
175
160
176
- truncate-padRight : (m≤n : m ≤ n) (a : A) (xs : Vec A m) →
161
+ truncate-padRight : . (m≤n : m ≤ n) (a : A) (xs : Vec A m) →
177
162
truncate m≤n (padRight m≤n a xs) ≡ xs
178
- truncate-padRight z≤n a [] = refl
179
- truncate-padRight (s≤s m≤n) a (x ∷ xs) = cong (x ∷_) (truncate-padRight m≤n a xs)
163
+ truncate-padRight _ a [] = refl
164
+ truncate-padRight {n = suc _} m≤n a (x ∷ xs) =
165
+ cong (x ∷_) (truncate-padRight (s≤s⁻¹ m≤n) a xs)
180
166
181
167
------------------------------------------------------------------------
182
168
-- lookup
@@ -203,10 +189,10 @@ lookup⇒[]= (suc i) (_ ∷ xs) p = there (lookup⇒[]= i xs p)
203
189
[]=⇒lookup∘lookup⇒[]= (x ∷ xs) zero refl = refl
204
190
[]=⇒lookup∘lookup⇒[]= (x ∷ xs) (suc i) p = []=⇒lookup∘lookup⇒[]= xs i p
205
191
206
- lookup-truncate : (m≤n : m ≤ n) (xs : Vec A n) (i : Fin m) →
192
+ lookup-truncate : . (m≤n : m ≤ n) (xs : Vec A n) (i : Fin m) →
207
193
lookup (truncate m≤n xs) i ≡ lookup xs (Fin.inject≤ i m≤n)
208
- lookup-truncate (s≤s m≤m+n) (_ ∷ _) zero = refl
209
- lookup-truncate (s≤s m≤m+n) (_ ∷ xs) (suc i) = lookup-truncate m≤m+n xs i
194
+ lookup-truncate _ (_ ∷ _) zero = refl
195
+ lookup-truncate m≤n (_ ∷ xs) (suc i) = lookup-truncate (suc[m]≤n⇒m≤pred[n] m≤n) xs i
210
196
211
197
lookup-take-inject≤ : (xs : Vec A (m + n)) (i : Fin m) →
212
198
lookup (take m xs) i ≡ lookup xs (Fin.inject≤ i (m≤m+n m n))
@@ -1143,6 +1129,10 @@ sum-++ {ys = ys} (x ∷ xs) = begin
1143
1129
------------------------------------------------------------------------
1144
1130
-- replicate
1145
1131
1132
+ cast-replicate : ∀ .(m≡n : m ≡ n) (x : A) → cast m≡n (replicate m x) ≡ replicate n x
1133
+ cast-replicate {m = zero} {n = zero} _ _ = refl
1134
+ cast-replicate {m = suc _} {n = suc _} eq x = cong (x ∷_) (cast-replicate (suc-injective eq) x)
1135
+
1146
1136
lookup-replicate : ∀ (i : Fin n) (x : A) → lookup (replicate n x) i ≡ x
1147
1137
lookup-replicate zero x = refl
1148
1138
lookup-replicate (suc i) x = lookup-replicate i x
@@ -1184,6 +1174,67 @@ toList-replicate : ∀ (n : ℕ) (x : A) →
1184
1174
toList-replicate zero x = refl
1185
1175
toList-replicate (suc n) x = cong (_ List.∷_) (toList-replicate n x)
1186
1176
1177
+ ------------------------------------------------------------------------
1178
+ -- pad
1179
+
1180
+ padRight-refl : (a : A) (xs : Vec A n) → padRight ≤-refl a xs ≡ xs
1181
+ padRight-refl a [] = refl
1182
+ padRight-refl a (x ∷ xs) = cong (x ∷_) (padRight-refl a xs)
1183
+
1184
+ padRight-replicate : ∀ .(m≤n : m ≤ n) (a : A) →
1185
+ replicate n a ≡ padRight m≤n a (replicate m a)
1186
+ padRight-replicate {m = zero} _ a = refl
1187
+ padRight-replicate {m = suc _} {n = suc _} m≤n a =
1188
+ cong (a ∷_) (padRight-replicate (s≤s⁻¹ m≤n) a)
1189
+
1190
+ padRight-trans : ∀ .(m≤n : m ≤ n) .(n≤o : n ≤ o) (a : A) (xs : Vec A m) →
1191
+ padRight (≤-trans m≤n n≤o) a xs ≡ padRight n≤o a (padRight m≤n a xs)
1192
+ padRight-trans _ n≤o a [] = padRight-replicate n≤o a
1193
+ padRight-trans {n = suc _} {o = suc _} m≤n n≤o a (x ∷ xs) =
1194
+ cong (x ∷_) (padRight-trans (s≤s⁻¹ m≤n) (s≤s⁻¹ n≤o) a xs)
1195
+
1196
+ padRight-lookup : ∀ .(m≤n : m ≤ n) (a : A) (xs : Vec A m) (i : Fin m) →
1197
+ lookup (padRight m≤n a xs) (inject≤ i m≤n) ≡ lookup xs i
1198
+ padRight-lookup {n = suc _} _ a (x ∷ xs) zero = refl
1199
+ padRight-lookup {n = suc _} m≤n a (x ∷ xs) (suc i) = padRight-lookup (s≤s⁻¹ m≤n) a xs i
1200
+
1201
+ padRight-map : ∀ (f : A → B) .(m≤n : m ≤ n) (a : A) (xs : Vec A m) →
1202
+ map f (padRight m≤n a xs) ≡ padRight m≤n (f a) (map f xs)
1203
+ padRight-map f _ a [] = map-replicate f a _
1204
+ padRight-map {n = suc _} f m≤n a (x ∷ xs) = cong (f x ∷_) (padRight-map f (s≤s⁻¹ m≤n) a xs)
1205
+
1206
+ padRight-zipWith : ∀ (f : A → B → C) .(m≤n : m ≤ n) (a : A) (b : B)
1207
+ (xs : Vec A m) (ys : Vec B m) →
1208
+ zipWith f (padRight m≤n a xs) (padRight m≤n b ys) ≡ padRight m≤n (f a b) (zipWith f xs ys)
1209
+ padRight-zipWith f _ a b [] [] = zipWith-replicate f a b
1210
+ padRight-zipWith {n = suc _} f m≤n a b (x ∷ xs) (y ∷ ys) =
1211
+ cong (f x y ∷_) (padRight-zipWith f (s≤s⁻¹ m≤n) a b xs ys)
1212
+
1213
+ padRight-zipWith₁ : ∀ (f : A → B → C) .(m≤n : m ≤ n) .(n≤o : n ≤ o)
1214
+ (a : A) (b : B) (xs : Vec A n) (ys : Vec B m) →
1215
+ zipWith f (padRight n≤o a xs) (padRight (≤-trans m≤n n≤o) b ys) ≡
1216
+ padRight n≤o (f a b) (zipWith f xs (padRight m≤n b ys))
1217
+ padRight-zipWith₁ f m≤n n≤o a b xs ys =
1218
+ trans (cong (zipWith f (padRight n≤o a xs)) (padRight-trans m≤n n≤o b ys))
1219
+ (padRight-zipWith f n≤o a b xs (padRight m≤n b ys))
1220
+
1221
+ padRight-drop : ∀ .(m≤n : m ≤ n) (a : A) (xs : Vec A m) .(n≡m+o : n ≡ m + o) →
1222
+ drop m (cast n≡m+o (padRight m≤n a xs)) ≡ replicate o a
1223
+ padRight-drop {m = zero} _ a [] eq = cast-replicate eq a
1224
+ padRight-drop {m = suc _} {n = suc _} m≤n a (x ∷ xs) eq = padRight-drop (s≤s⁻¹ m≤n) a xs (suc-injective eq)
1225
+
1226
+ padRight-take : ∀ .(m≤n : m ≤ n) (a : A) (xs : Vec A m) .(n≡m+o : n ≡ m + o) →
1227
+ take m (cast n≡m+o (padRight m≤n a xs)) ≡ xs
1228
+ padRight-take {m = zero} _ a [] _ = refl
1229
+ padRight-take {m = suc _} {n = suc _} m≤n a (x ∷ xs) eq = cong (x ∷_) (padRight-take (s≤s⁻¹ m≤n) a xs (suc-injective eq))
1230
+
1231
+ padRight-updateAt : ∀ .(m≤n : m ≤ n) (xs : Vec A m) (f : A → A) (i : Fin m) (x : A) →
1232
+ updateAt (padRight m≤n x xs) (inject≤ i m≤n) f ≡
1233
+ padRight m≤n x (updateAt xs i f)
1234
+ padRight-updateAt {n = suc _} m≤n (y ∷ xs) f zero x = refl
1235
+ padRight-updateAt {n = suc _} m≤n (y ∷ xs) f (suc i) x = cong (y ∷_) (padRight-updateAt (s≤s⁻¹ m≤n) xs f i x)
1236
+
1237
+
1187
1238
------------------------------------------------------------------------
1188
1239
-- iterate
1189
1240
@@ -1576,3 +1627,13 @@ lookup-inject≤-take m m≤m+n i xs = sym (begin
1576
1627
"Warning: lookup-inject≤-take was deprecated in v2.0.
1577
1628
Please use lookup-take-inject≤ or lookup-truncate, take≡truncate instead."
1578
1629
#-}
1630
+
1631
+ -- Version 2.4
1632
+
1633
+ truncate-irrelevant : (m≤n₁ m≤n₂ : m ≤ n) → truncate {A = A} m≤n₁ ≗ truncate m≤n₂
1634
+ truncate-irrelevant _ _ xs = refl
1635
+ {-# WARNING_ON_USAGE truncate-irrelevant
1636
+ "Warning: truncate-irrelevant was deprecated in v2.4.
1637
+ Definition of truncate has been made definitionally proof-irrelevant."
1638
+ #-}
1639
+
0 commit comments