@@ -10,27 +10,27 @@ module Data.Vec.Properties where
10
10
11
11
open import Algebra.Definitions
12
12
open import Data.Bool.Base using (true; false)
13
- open import Data.Fin.Base as Fin using (Fin; zero; suc; toℕ; fromℕ<; _↑ˡ_; _↑ʳ_)
13
+ open import Data.Fin.Base as Fin
14
+ using (Fin; zero; suc; toℕ; fromℕ<; _↑ˡ_; _↑ʳ_)
14
15
open import Data.List.Base as List using (List)
15
16
import Data.List.Properties as Listₚ
16
17
open import Data.Nat.Base
17
18
open import Data.Nat.Properties
18
- using (+-assoc; m≤n⇒m≤1+n; ≤ -refl; ≤-trans; suc-injective; +-comm; +-suc)
19
+ using (+-assoc; m≤n⇒m≤1+n; m≤m+n; ≤ -refl; ≤-trans; ≤-irrelevant; ≤⇒≤″ ; suc-injective; +-comm; +-suc)
19
20
open import Data.Product.Base as Prod
20
21
using (_×_; _,_; proj₁; proj₂; <_,_>; uncurry)
21
22
open import Data.Sum.Base using ([_,_]′)
22
23
open import Data.Sum.Properties using ([,]-map)
23
24
open import Data.Vec.Base
24
25
open import Function.Base
25
- -- open import Function.Inverse using (_↔_; inverse)
26
26
open import Function.Bundles using (_↔_; mk↔ₛ′)
27
27
open import Level using (Level)
28
28
open import Relation.Binary.Definitions using (DecidableEquality)
29
29
open import Relation.Binary.PropositionalEquality
30
30
using (_≡_; _≢_; _≗_; refl; sym; trans; cong; cong₂; subst; module ≡-Reasoning )
31
31
open import Relation.Unary using (Pred; Decidable)
32
- open import Relation.Nullary.Decidable using (Dec; does; yes; no; _×-dec_; map′)
33
- open import Relation.Nullary.Negation using (contradiction)
32
+ open import Relation.Nullary.Decidable.Core using (Dec; does; yes; no; _×-dec_; map′)
33
+ open import Relation.Nullary.Negation.Core using (contradiction)
34
34
35
35
open ≡-Reasoning
36
36
@@ -122,6 +122,19 @@ truncate-trans : ∀ {p} (m≤n : m ≤ n) (n≤p : n ≤ p) (xs : Vec A p) →
122
122
truncate-trans z≤n n≤p xs = refl
123
123
truncate-trans (s≤s m≤n) (s≤s n≤p) (x ∷ xs) = cong (x ∷_) (truncate-trans m≤n n≤p xs)
124
124
125
+ truncate-irrelevant : (m≤n₁ m≤n₂ : m ≤ n) → truncate {A = A} m≤n₁ ≗ truncate m≤n₂
126
+ truncate-irrelevant m≤n₁ m≤n₂ xs = cong (λ m≤n → truncate m≤n xs) (≤-irrelevant m≤n₁ m≤n₂)
127
+
128
+ truncate≡take : (m≤n : m ≤ n) (xs : Vec A n) .(eq : n ≡ m + o) →
129
+ truncate m≤n xs ≡ take m (cast eq xs)
130
+ truncate≡take z≤n _ eq = refl
131
+ truncate≡take (s≤s m≤n) (x ∷ xs) eq = cong (x ∷_) (truncate≡take m≤n xs (suc-injective eq))
132
+
133
+ take≡truncate : ∀ m (xs : Vec A (m + n)) →
134
+ take m xs ≡ truncate (m≤m+n m n) xs
135
+ take≡truncate zero _ = refl
136
+ take≡truncate (suc m) (x ∷ xs) = cong (x ∷_) (take≡truncate m xs)
137
+
125
138
------------------------------------------------------------------------
126
139
-- pad
127
140
@@ -171,10 +184,20 @@ lookup⇒[]= (suc i) (_ ∷ xs) p = there (lookup⇒[]= i xs p)
171
184
[]=⇒lookup∘lookup⇒[]= (x ∷ xs) zero refl = refl
172
185
[]=⇒lookup∘lookup⇒[]= (x ∷ xs) (suc i) p = []=⇒lookup∘lookup⇒[]= xs i p
173
186
174
- lookup-inject≤-take : ∀ m (m≤m+n : m ≤ m + n) (i : Fin m) (xs : Vec A (m + n)) →
175
- lookup xs (Fin.inject≤ i m≤m+n) ≡ lookup (take m xs) i
176
- lookup-inject≤-take (suc m) m≤m+n zero (x ∷ xs) = refl
177
- lookup-inject≤-take (suc m) (s≤s m≤m+n) (suc i) (x ∷ xs) = lookup-inject≤-take m m≤m+n i xs
187
+ lookup-truncate : (m≤n : m ≤ n) (xs : Vec A n) (i : Fin m) →
188
+ lookup (truncate m≤n xs) i ≡ lookup xs (Fin.inject≤ i m≤n)
189
+ lookup-truncate (s≤s m≤m+n) (_ ∷ _) zero = refl
190
+ lookup-truncate (s≤s m≤m+n) (_ ∷ xs) (suc i) = lookup-truncate m≤m+n xs i
191
+
192
+ lookup-take-inject≤ : (xs : Vec A (m + n)) (i : Fin m) →
193
+ lookup (take m xs) i ≡ lookup xs (Fin.inject≤ i (m≤m+n m n))
194
+ lookup-take-inject≤ {m = m} {n = n} xs i = begin
195
+ lookup (take _ xs) i
196
+ ≡⟨ cong (λ ys → lookup ys i) (take≡truncate m xs) ⟩
197
+ lookup (truncate _ xs) i
198
+ ≡⟨ lookup-truncate (m≤m+n m n) xs i ⟩
199
+ lookup xs (Fin.inject≤ i (m≤m+n m n))
200
+ ∎ where open ≡-Reasoning
178
201
179
202
------------------------------------------------------------------------
180
203
-- updateAt (_[_]%=_)
@@ -348,6 +371,13 @@ cast-is-id eq (x ∷ xs) = cong (x ∷_) (cast-is-id (suc-injective eq) xs)
348
371
subst-is-cast : (eq : m ≡ n) (xs : Vec A m) → subst (Vec A) eq xs ≡ cast eq xs
349
372
subst-is-cast refl xs = sym (cast-is-id refl xs)
350
373
374
+ cast-sym : .(eq : m ≡ n) {xs : Vec A m} {ys : Vec A n} →
375
+ cast eq xs ≡ ys → cast (sym eq) ys ≡ xs
376
+ cast-sym eq {xs = []} {ys = []} _ = refl
377
+ cast-sym eq {xs = x ∷ xs} {ys = y ∷ ys} xxs[eq]≡yys =
378
+ let x≡y , xs[eq]≡ys = ∷-injective xxs[eq]≡yys
379
+ in cong₂ _∷_ (sym x≡y) (cast-sym (suc-injective eq) xs[eq]≡ys)
380
+
351
381
cast-trans : .(eq₁ : m ≡ n) .(eq₂ : n ≡ o) (xs : Vec A m) →
352
382
cast eq₂ (cast eq₁ xs) ≡ cast (trans eq₁ eq₂) xs
353
383
cast-trans {m = zero} {n = zero} {o = zero} eq₁ eq₂ [] = refl
@@ -399,9 +429,9 @@ map-updateAt (x ∷ xs) (suc i) eq = cong (_ ∷_) (map-updateAt xs i eq)
399
429
400
430
map-insert : ∀ (f : A → B) (x : A) (xs : Vec A n) (i : Fin (suc n)) →
401
431
map f (insert xs i x) ≡ insert (map f xs) i (f x)
402
- map-insert f _ [] Fin. zero = refl
403
- map-insert f _ (x' ∷ xs) Fin. zero = refl
404
- map-insert f x (x' ∷ xs) (Fin. suc i) = cong (_ ∷_) (map-insert f x xs i)
432
+ map-insert f _ [] zero = refl
433
+ map-insert f _ (x' ∷ xs) zero = refl
434
+ map-insert f x (x' ∷ xs) (suc i) = cong (_ ∷_) (map-insert f x xs i)
405
435
406
436
map-[]≔ : ∀ (f : A → B) (xs : Vec A n) (i : Fin n) →
407
437
map f (xs [ i ]≔ x) ≡ map f xs [ i ]≔ f x
@@ -1245,13 +1275,11 @@ sum-++-commute = sum-++
1245
1275
"Warning: sum-++-commute was deprecated in v2.0.
1246
1276
Please use sum-++ instead."
1247
1277
#-}
1248
-
1249
1278
take-drop-id = take++drop≡id
1250
1279
{-# WARNING_ON_USAGE take-drop-id
1251
1280
"Warning: take-drop-id was deprecated in v2.0.
1252
1281
Please use take++drop≡id instead."
1253
1282
#-}
1254
-
1255
1283
take-distr-zipWith = take-zipWith
1256
1284
{-# WARNING_ON_USAGE take-distr-zipWith
1257
1285
"Warning: take-distr-zipWith was deprecated in v2.0.
@@ -1272,3 +1300,17 @@ drop-distr-map = drop-map
1272
1300
"Warning: drop-distr-map was deprecated in v2.0.
1273
1301
Please use drop-map instead."
1274
1302
#-}
1303
+ lookup-inject≤-take : ∀ m (m≤m+n : m ≤ m + n) (i : Fin m) (xs : Vec A (m + n)) →
1304
+ lookup xs (Fin.inject≤ i m≤m+n) ≡ lookup (take m xs) i
1305
+ lookup-inject≤-take m m≤m+n i xs = sym (begin
1306
+ lookup (take m xs) i
1307
+ ≡⟨ lookup-take-inject≤ xs i ⟩
1308
+ lookup xs (Fin.inject≤ i _)
1309
+ ≡⟨ cong ((lookup xs) ∘ (Fin.inject≤ i)) (≤-irrelevant _ _) ⟩
1310
+ lookup xs (Fin.inject≤ i m≤m+n)
1311
+ ∎) where open ≡-Reasoning
1312
+ {-# WARNING_ON_USAGE lookup-inject≤-take
1313
+ "Warning: lookup-inject≤-take was deprecated in v2.0.
1314
+ Please use lookup-take-inject≤ or lookup-truncate, take≡truncate instead."
1315
+ #-}
1316
+
0 commit comments