Skip to content

Commit dcae546

Browse files
jamesmckinnaMatthewDaggitt
authored andcommitted
Refactor some lookup and truncation lemmas (#2101)
1 parent a8df070 commit dcae546

File tree

5 files changed

+80
-20
lines changed

5 files changed

+80
-20
lines changed

CHANGELOG.md

+12-1
Original file line numberDiff line numberDiff line change
@@ -1464,6 +1464,8 @@ Deprecated names
14641464
sum-++-commute ↦ sum-++
14651465
14661466
take-drop-id ↦ take++drop≡id
1467+
1468+
lookup-inject≤-take ↦ lookup-take-inject≤
14671469
```
14681470
and the type of the proof `zipWith-comm` has been generalised from:
14691471
```
@@ -2193,6 +2195,9 @@ Additions to existing modules
21932195
cast-trans : cast eq₂ (cast eq₁ k) ≡ cast (trans eq₁ eq₂) k
21942196
21952197
fromℕ≢inject₁ : {i : Fin n} → fromℕ n ≢ inject₁ i
2198+
2199+
inject≤-trans : inject≤ (inject≤ i m≤n) n≤o ≡ inject≤ i (≤-trans m≤n n≤o)
2200+
inject≤-irrelevant : inject≤ i m≤n ≡ inject≤ i m≤n′
21962201
```
21972202

21982203
* Added new functions in `Data.Integer.Base`:
@@ -2738,12 +2743,13 @@ Additions to existing modules
27382743
27392744
cast-is-id : cast eq xs ≡ xs
27402745
subst-is-cast : subst (Vec A) eq xs ≡ cast eq xs
2746+
cast-sym : cast eq xs ≡ ys → cast (sym eq) ys ≡ xs
27412747
cast-trans : cast eq₂ (cast eq₁ xs) ≡ cast (trans eq₁ eq₂) xs
27422748
map-cast : map f (cast eq xs) ≡ cast eq (map f xs)
27432749
lookup-cast : lookup (cast eq xs) (Fin.cast eq i) ≡ lookup xs i
27442750
lookup-cast₁ : lookup (cast eq xs) i ≡ lookup xs (Fin.cast (sym eq) i)
27452751
lookup-cast₂ : lookup xs (Fin.cast eq i) ≡ lookup (cast (sym eq) xs) i
2746-
cast-reverse : cast eq ∘ reverse ≗ reverse ∘ cast eq
2752+
cast-reverse : cast eq ∘ reverse ≗ reverse ∘ cast eq
27472753
27482754
zipwith-++ : zipWith f (xs ++ ys) (xs' ++ ys') ≡ zipWith f xs xs' ++ zipWith f ys ys'
27492755
@@ -2757,6 +2763,11 @@ Additions to existing modules
27572763
cast-fromList : cast _ (fromList xs) ≡ fromList ys
27582764
fromList-map : cast _ (fromList (List.map f xs)) ≡ map f (fromList xs)
27592765
fromList-++ : cast _ (fromList (xs List.++ ys)) ≡ fromList xs ++ fromList ys
2766+
2767+
truncate≡take : .(eq : n ≡ m + o) → truncate m≤n xs ≡ take m (cast eq xs)
2768+
take≡truncate : take m xs ≡ truncate (m≤m+n m n) xs
2769+
lookup-truncate : lookup (truncate m≤n xs) i ≡ lookup xs (Fin.inject≤ i m≤n)
2770+
lookup-take-inject≤ : lookup (take m xs) i ≡ lookup xs (Fin.inject≤ i (m≤m+n m n))
27602771
```
27612772

27622773
* Added new proofs in `Data.Vec.Membership.Propositional.Properties`:

src/Data/Fin/Base.agda

+3-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
module Data.Fin.Base where
1313

1414
open import Data.Bool.Base using (Bool; true; false; T; not)
15-
open import Data.Empty using (⊥-elim)
1615
open import Data.Nat.Base as ℕ using (ℕ; zero; suc; z≤n; s≤s; z<s; s<s; _^_)
1716
open import Data.Product.Base as Product using (_×_; _,_; proj₁; proj₂)
1817
open import Data.Sum.Base as Sum using (_⊎_; inj₁; inj₂; [_,_]′)
@@ -115,13 +114,13 @@ inject₁ zero = zero
115114
inject₁ (suc i) = suc (inject₁ i)
116115

117116
inject≤ : Fin m m ℕ.≤ n Fin n
118-
inject≤ {_} {suc n} zero _ = zero
117+
inject≤ {_} {suc n} zero _ = zero
119118
inject≤ {_} {suc n} (suc i) (s≤s m≤n) = suc (inject≤ i m≤n)
120119

121120
-- lower₁ "i" _ = "i".
122121

123122
lower₁ : (i : Fin (suc n)) n ≢ toℕ i Fin n
124-
lower₁ {zero} zero ne = ⊥-elim (ne refl)
123+
lower₁ {zero} zero ne = contradiction refl ne
125124
lower₁ {suc n} zero _ = zero
126125
lower₁ {suc n} (suc i) ne = suc (lower₁ i (ne ∘ cong suc))
127126

@@ -252,7 +251,7 @@ opposite {suc n} (suc i) = inject₁ (opposite i)
252251
-- McBride's "First-order unification by structural recursion".
253252

254253
punchOut : {i j : Fin (suc n)} i ≢ j Fin n
255-
punchOut {_} {zero} {zero} i≢j = ⊥-elim (i≢j refl)
254+
punchOut {_} {zero} {zero} i≢j = contradiction refl i≢j
256255
punchOut {_} {zero} {suc j} _ = j
257256
punchOut {suc _} {suc i} {zero} _ = zero
258257
punchOut {suc _} {suc i} {suc j} i≢j = suc (punchOut (i≢j ∘ cong suc))

src/Data/Fin/Properties.agda

+8
Original file line numberDiff line numberDiff line change
@@ -547,12 +547,20 @@ inject≤-idempotent {_} {suc n} {suc o} zero _ _ _ = refl
547547
inject≤-idempotent {_} {suc n} {suc o} (suc i) (s≤s m≤n) (s≤s n≤o) (s≤s m≤o) =
548548
cong suc (inject≤-idempotent i m≤n n≤o m≤o)
549549

550+
inject≤-trans : (i : Fin m) (m≤n : m ℕ.≤ n) (n≤o : n ℕ.≤ o)
551+
inject≤ (inject≤ i m≤n) n≤o ≡ inject≤ i (ℕₚ.≤-trans m≤n n≤o)
552+
inject≤-trans i m≤n n≤o = inject≤-idempotent i m≤n n≤o _
553+
550554
inject≤-injective : (m≤n m≤n′ : m ℕ.≤ n) i j
551555
inject≤ i m≤n ≡ inject≤ j m≤n′ i ≡ j
552556
inject≤-injective (s≤s p) (s≤s q) zero zero eq = refl
553557
inject≤-injective (s≤s p) (s≤s q) (suc i) (suc j) eq =
554558
cong suc (inject≤-injective p q i j (suc-injective eq))
555559

560+
inject≤-irrelevant : (m≤n m≤n′ : m ℕ.≤ n) i
561+
inject≤ i m≤n ≡ inject≤ i m≤n′
562+
inject≤-irrelevant m≤n m≤n′ i = cong (inject≤ i) (ℕₚ.≤-irrelevant m≤n m≤n′)
563+
556564
------------------------------------------------------------------------
557565
-- pred
558566
------------------------------------------------------------------------

src/Data/Vec/Base.agda

+1-1
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ uncons (x ∷ xs) = x , xs
290290

291291
-- Take the first 'm' elements of a vector.
292292
truncate : {m n} m ≤ n Vec A n Vec A m
293-
truncate z≤n _ = []
293+
truncate {m = zero} _ _ = []
294294
truncate (s≤s le) (x ∷ xs) = x ∷ (truncate le xs)
295295

296296
-- Pad out a vector with extra elements.

src/Data/Vec/Properties.agda

+56-14
Original file line numberDiff line numberDiff line change
@@ -10,27 +10,27 @@ module Data.Vec.Properties where
1010

1111
open import Algebra.Definitions
1212
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ℕ<; _↑ˡ_; _↑ʳ_)
1415
open import Data.List.Base as List using (List)
1516
import Data.List.Properties as Listₚ
1617
open import Data.Nat.Base
1718
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)
1920
open import Data.Product.Base as Prod
2021
using (_×_; _,_; proj₁; proj₂; <_,_>; uncurry)
2122
open import Data.Sum.Base using ([_,_]′)
2223
open import Data.Sum.Properties using ([,]-map)
2324
open import Data.Vec.Base
2425
open import Function.Base
25-
-- open import Function.Inverse using (_↔_; inverse)
2626
open import Function.Bundles using (_↔_; mk↔ₛ′)
2727
open import Level using (Level)
2828
open import Relation.Binary.Definitions using (DecidableEquality)
2929
open import Relation.Binary.PropositionalEquality
3030
using (_≡_; _≢_; _≗_; refl; sym; trans; cong; cong₂; subst; module ≡-Reasoning)
3131
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)
3434

3535
open ≡-Reasoning
3636

@@ -122,6 +122,19 @@ truncate-trans : ∀ {p} (m≤n : m ≤ n) (n≤p : n ≤ p) (xs : Vec A p) →
122122
truncate-trans z≤n n≤p xs = refl
123123
truncate-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)
348371
subst-is-cast : (eq : m ≡ n) (xs : Vec A m) subst (Vec A) eq xs ≡ cast eq xs
349372
subst-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+
351381
cast-trans : .(eq₁ : m ≡ n) .(eq₂ : n ≡ o) (xs : Vec A m)
352382
cast eq₂ (cast eq₁ xs) ≡ cast (trans eq₁ eq₂) xs
353383
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)
399429

400430
map-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

406436
map-[]≔ : (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.
12461276
Please use sum-++ instead."
12471277
#-}
1248-
12491278
take-drop-id = take++drop≡id
12501279
{-# WARNING_ON_USAGE take-drop-id
12511280
"Warning: take-drop-id was deprecated in v2.0.
12521281
Please use take++drop≡id instead."
12531282
#-}
1254-
12551283
take-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.
12731301
Please 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

Comments
 (0)