Skip to content

Commit 08bc2b8

Browse files
[Add] padRight properties to Data.Vec.Properties (#2769)
* padRight final vers l * Adding padRight proprities * Cleaning the drafts * cleaning drafts * modification after reviews * suppr double parentheses * moved cast-replicate * modif after reviews and changelog * changes to changelog * Update CHANGELOG.md `fix-whitespace` --------- Co-authored-by: jamesmckinna <31931406+jamesmckinna@users.noreply.github.com>
1 parent 3337e54 commit 08bc2b8

File tree

2 files changed

+81
-18
lines changed

2 files changed

+81
-18
lines changed

CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,27 @@ Additions to existing modules
7878
∸-suc : m ≤ n → suc n ∸ m ≡ suc (n ∸ m)
7979
```
8080

81+
* In `Data.Vec.Properties`:
82+
```agda
83+
padRight-lookup : (m≤n : m ≤ n) (a : A) (xs : Vec A m) (i : Fin m) → lookup (padRight m≤n a xs) (inject≤ i m≤n) ≡ lookup xs i
84+
85+
padRight-map : (f : A → B) (m≤n : m ≤ n) (a : A) (xs : Vec A m) → map f (padRight m≤n a xs) ≡ padRight m≤n (f a) (map f xs)
86+
87+
padRight-zipWith : (f : A → B → C) (m≤n : m ≤ n) (a : A) (b : B) (xs : Vec A m) (ys : Vec B m) →
88+
zipWith f (padRight m≤n a xs) (padRight m≤n b ys) ≡ padRight m≤n (f a b) (zipWith f xs ys)
89+
90+
padRight-zipWith₁ : (f : A → B → C) (o≤m : o ≤ m) (m≤n : m ≤ n) (a : A) (b : B) (xs : Vec A m) (ys : Vec B o) →
91+
zipWith f (padRight m≤n a xs) (padRight (≤-trans o≤m m≤n) b ys) ≡
92+
padRight m≤n (f a b) (zipWith f xs (padRight o≤m b ys))
93+
94+
padRight-take : (m≤n : m ≤ n) (a : A) (xs : Vec A m) .(n≡m+o : n ≡ m + o) → take m (cast n≡m+o (padRight m≤n a xs)) ≡ xs
95+
96+
padRight-drop : (m≤n : m ≤ n) (a : A) (xs : Vec A m) .(n≡m+o : n ≡ m + o) → drop m (cast n≡m+o (padRight m≤n a xs)) ≡ replicate o a
97+
98+
padRight-updateAt : (m≤n : m ≤ n) (x : A) (xs : Vec A m) (f : A → A) (i : Fin m) →
99+
updateAt (padRight m≤n x xs) (inject≤ i m≤n) f ≡ padRight m≤n x (updateAt xs i f)
100+
```
101+
81102
* In `Relation.Nullary.Negation.Core`
82103
```agda
83104
¬¬-η : A → ¬ ¬ A

src/Data/Vec/Properties.agda

Lines changed: 60 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ module Data.Vec.Properties where
1111
open import Algebra.Definitions
1212
open import Data.Bool.Base using (true; false)
1313
open import Data.Fin.Base as Fin
14-
using (Fin; zero; suc; toℕ; fromℕ<; _↑ˡ_; _↑ʳ_)
14+
using (Fin; zero; suc; toℕ; fromℕ<; _↑ˡ_; _↑ʳ_; inject≤)
1515
open import Data.List.Base as List using (List)
1616
import Data.List.Properties as List
1717
open import Data.Nat.Base
@@ -154,22 +154,6 @@ take≡truncate : ∀ m (xs : Vec A (m + n)) →
154154
take≡truncate zero _ = refl
155155
take≡truncate (suc m) (x ∷ xs) = cong (x ∷_) (take≡truncate m xs)
156156

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-
173157
------------------------------------------------------------------------
174158
-- truncate and padRight together
175159

@@ -1184,13 +1168,71 @@ toList-replicate : ∀ (n : ℕ) (x : A) →
11841168
toList-replicate zero x = refl
11851169
toList-replicate (suc n) x = cong (_ List.∷_) (toList-replicate n x)
11861170

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+
11871230
------------------------------------------------------------------------
11881231
-- iterate
11891232

11901233
iterate-id : (x : A) n iterate id x n ≡ replicate n x
11911234
iterate-id x zero = refl
11921235
iterate-id x (suc n) = cong (_ ∷_) (iterate-id (id x) n)
1193-
11941236
take-iterate : n f (x : A) take n (iterate f x (n + m)) ≡ iterate f x n
11951237
take-iterate zero f x = refl
11961238
take-iterate (suc n) f x = cong (_ ∷_) (take-iterate n f (f x))

0 commit comments

Comments
 (0)