Skip to content

Commit ab03dc0

Browse files
committed
fix: proofs of properties following agda#2769 and agda#2795; deprecate truncate-irrelevant
1 parent 63fd6e6 commit ab03dc0

File tree

3 files changed

+99
-38
lines changed

3 files changed

+99
-38
lines changed

CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ Minor improvements
2121
that the argument of type `m ≤ n` is marked as irrelevant. This should be
2222
backwards compatible, but does change the equational behaviour of these
2323
functions to be more eager, because no longer blocking on pattern matching
24-
on that argument.
25-
```
24+
on that argument. Corresponding changes have been made to the types of their
25+
properties (and their proofs).
2626

2727
* Refactored usages of `+-∸-assoc 1` to `∸-suc` in:
2828
```agda

src/Data/Vec/Base.agda

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ truncate {m = suc _} le (x ∷ xs) = x ∷ (truncate (s≤s⁻¹ le) xs)
295295

296296
-- Pad out a vector with extra elements.
297297
padRight : .(m ≤ n) A Vec A m Vec A n
298-
padRight {n = _} _ a [] = replicate _ a
298+
padRight {n = n} _ a [] = replicate n a
299299
padRight {n = suc _} le a (x ∷ xs) = x ∷ padRight (s≤s⁻¹ le) a xs
300300

301301
------------------------------------------------------------------------

src/Data/Vec/Properties.agda

Lines changed: 96 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,16 @@ 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
1818
using (ℕ; zero; suc; _+_; _≤_; _<_; s≤s; pred; s<s⁻¹; _≥_; s≤s⁻¹; z≤n)
1919
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+
)
2224
open import Data.Product.Base as Product
2325
using (_×_; _,_; proj₁; proj₂; <_,_>; uncurry)
2426
open import Data.Sum.Base using ([_,_]′)
@@ -136,47 +138,31 @@ truncate-refl : (xs : Vec A n) → truncate ≤-refl xs ≡ xs
136138
truncate-refl [] = refl
137139
truncate-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

152153
take≡truncate : m (xs : Vec A (m + n))
153154
take m xs ≡ truncate (m≤m+n m n) xs
154155
take≡truncate zero _ = refl
155156
take≡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

211197
lookup-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+
11461136
lookup-replicate : (i : Fin n) (x : A) lookup (replicate n x) i ≡ x
11471137
lookup-replicate zero x = refl
11481138
lookup-replicate (suc i) x = lookup-replicate i x
@@ -1184,6 +1174,67 @@ toList-replicate : ∀ (n : ℕ) (x : A) →
11841174
toList-replicate zero x = refl
11851175
toList-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.
15771628
Please 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

Comments
 (0)