@@ -11,14 +11,16 @@ module Data.Vec.Properties where
1111open import Algebra.Definitions
1212open import Data.Bool.Base using (true; false)
1313open import Data.Fin.Base as Fin
14- using (Fin; zero; suc; toℕ; fromℕ<; _↑ˡ_; _↑ʳ_)
14+ using (Fin; zero; suc; toℕ; fromℕ<; _↑ˡ_; _↑ʳ_; inject≤ )
1515open import Data.List.Base as List using (List)
1616import Data.List.Properties as List
1717open import Data.Nat.Base
1818 using (ℕ; zero; suc; _+_; _≤_; _<_; s≤s; pred; s<s⁻¹; _≥_; s≤s⁻¹; z≤n)
1919open 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+ )
2224open import Data.Product.Base as Product
2325 using (_×_; _,_; proj₁; proj₂; <_,_>; uncurry)
2426open import Data.Sum.Base using ([_,_]′)
@@ -136,47 +138,31 @@ truncate-refl : (xs : Vec A n) → truncate ≤-refl xs ≡ xs
136138truncate-refl [] = refl
137139truncate-refl (x ∷ xs) = cong (x ∷_) (truncate-refl xs)
138140
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)
143146
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) →
148148 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))
151152
152153take≡truncate : ∀ m (xs : Vec A (m + n)) →
153154 take m xs ≡ truncate (m≤m+n m n) xs
154155take≡truncate zero _ = refl
155156take≡truncate (suc m) (x ∷ xs) = cong (x ∷_) (take≡truncate m xs)
156157
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-
173158------------------------------------------------------------------------
174159-- truncate and padRight together
175160
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) →
177162 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)
180166
181167------------------------------------------------------------------------
182168-- lookup
@@ -203,10 +189,10 @@ lookup⇒[]= (suc i) (_ ∷ xs) p = there (lookup⇒[]= i xs p)
203189 []=⇒lookup∘lookup⇒[]= (x ∷ xs) zero refl = refl
204190 []=⇒lookup∘lookup⇒[]= (x ∷ xs) (suc i) p = []=⇒lookup∘lookup⇒[]= xs i p
205191
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) →
207193 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
210196
211197lookup-take-inject≤ : (xs : Vec A (m + n)) (i : Fin m) →
212198 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
11431129------------------------------------------------------------------------
11441130-- replicate
11451131
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+
11461136lookup-replicate : ∀ (i : Fin n) (x : A) → lookup (replicate n x) i ≡ x
11471137lookup-replicate zero x = refl
11481138lookup-replicate (suc i) x = lookup-replicate i x
@@ -1184,6 +1174,67 @@ toList-replicate : ∀ (n : ℕ) (x : A) →
11841174toList-replicate zero x = refl
11851175toList-replicate (suc n) x = cong (_ List.∷_) (toList-replicate n x)
11861176
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+
11871238------------------------------------------------------------------------
11881239-- iterate
11891240
@@ -1576,3 +1627,13 @@ lookup-inject≤-take m m≤m+n i xs = sym (begin
15761627"Warning: lookup-inject≤-take was deprecated in v2.0.
15771628Please use lookup-take-inject≤ or lookup-truncate, take≡truncate instead."
15781629#-}
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