@@ -10,27 +10,27 @@ module Data.Vec.Properties where
1010
1111open import Algebra.Definitions
1212open 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ℕ<; _↑ˡ_; _↑ʳ_)
1415open import Data.List.Base as List using (List)
1516import Data.List.Properties as Listₚ
1617open import Data.Nat.Base
1718open 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)
1920open import Data.Product.Base as Prod
2021 using (_×_; _,_; proj₁; proj₂; <_,_>; uncurry)
2122open import Data.Sum.Base using ([_,_]′)
2223open import Data.Sum.Properties using ([,]-map)
2324open import Data.Vec.Base
2425open import Function.Base
25- -- open import Function.Inverse using (_↔_; inverse)
2626open import Function.Bundles using (_↔_; mk↔ₛ′)
2727open import Level using (Level)
2828open import Relation.Binary.Definitions using (DecidableEquality)
2929open import Relation.Binary.PropositionalEquality
3030 using (_≡_; _≢_; _≗_; refl; sym; trans; cong; cong₂; subst; module ≡-Reasoning )
3131open 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)
3434
3535open ≡-Reasoning
3636
@@ -122,6 +122,19 @@ truncate-trans : ∀ {p} (m≤n : m ≤ n) (n≤p : n ≤ p) (xs : Vec A p) →
122122truncate-trans z≤n n≤p xs = refl
123123truncate-trans (s≤s m≤n) (s≤s n≤p) (x ∷ xs) = cong (x ∷_) (truncate-trans m≤n n≤p xs)
124124
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+
125138------------------------------------------------------------------------
126139-- pad
127140
@@ -171,10 +184,20 @@ lookup⇒[]= (suc i) (_ ∷ xs) p = there (lookup⇒[]= i xs p)
171184 []=⇒lookup∘lookup⇒[]= (x ∷ xs) zero refl = refl
172185 []=⇒lookup∘lookup⇒[]= (x ∷ xs) (suc i) p = []=⇒lookup∘lookup⇒[]= xs i p
173186
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
178201
179202------------------------------------------------------------------------
180203-- updateAt (_[_]%=_)
@@ -348,6 +371,13 @@ cast-is-id eq (x ∷ xs) = cong (x ∷_) (cast-is-id (suc-injective eq) xs)
348371subst-is-cast : (eq : m ≡ n) (xs : Vec A m) → subst (Vec A) eq xs ≡ cast eq xs
349372subst-is-cast refl xs = sym (cast-is-id refl xs)
350373
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+
351381cast-trans : .(eq₁ : m ≡ n) .(eq₂ : n ≡ o) (xs : Vec A m) →
352382 cast eq₂ (cast eq₁ xs) ≡ cast (trans eq₁ eq₂) xs
353383cast-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)
399429
400430map-insert : ∀ (f : A → B) (x : A) (xs : Vec A n) (i : Fin (suc n)) →
401431 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)
405435
406436map-[]≔ : ∀ (f : A → B) (xs : Vec A n) (i : Fin n) →
407437 map f (xs [ i ]≔ x) ≡ map f xs [ i ]≔ f x
@@ -1245,13 +1275,11 @@ sum-++-commute = sum-++
12451275"Warning: sum-++-commute was deprecated in v2.0.
12461276Please use sum-++ instead."
12471277#-}
1248-
12491278take-drop-id = take++drop≡id
12501279{-# WARNING_ON_USAGE take-drop-id
12511280"Warning: take-drop-id was deprecated in v2.0.
12521281Please use take++drop≡id instead."
12531282#-}
1254-
12551283take-distr-zipWith = take-zipWith
12561284{-# WARNING_ON_USAGE take-distr-zipWith
12571285"Warning: take-distr-zipWith was deprecated in v2.0.
@@ -1272,3 +1300,17 @@ drop-distr-map = drop-map
12721300"Warning: drop-distr-map was deprecated in v2.0.
12731301Please use drop-map instead."
12741302#-}
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