Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor some lookup and truncation lemmas #2101

Merged
merged 29 commits into from
Sep 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
e0c327d
removed `import` dependency
jamesmckinna Sep 19, 2023
987a73c
two easy lemmas
jamesmckinna Sep 19, 2023
323d422
`fix-whitespace`
jamesmckinna Sep 19, 2023
6de7983
simplified `import` dependencies
jamesmckinna Sep 19, 2023
f492da7
placeholder deprecation
jamesmckinna Sep 19, 2023
1aa2fe0
flipped equality; made `m` implicit
jamesmckinna Sep 19, 2023
bd38841
renamed lemma
jamesmckinna Sep 19, 2023
4239216
reordered arguments
jamesmckinna Sep 19, 2023
0781379
inserted canonical proof
jamesmckinna Sep 19, 2023
be4951d
tidy up
jamesmckinna Sep 19, 2023
b4ce98f
definition of `take≤`
jamesmckinna Sep 19, 2023
6214cb0
added definition of `cast-sym`
jamesmckinna Sep 19, 2023
5534d81
tidy up
jamesmckinna Sep 19, 2023
e114a99
re-added `take≤` etc.
jamesmckinna Sep 19, 2023
d1b8f22
renamed things to align with issue #2090
jamesmckinna Sep 19, 2023
1645d5f
Typo in deprecation warning!
jamesmckinna Sep 20, 2023
2e7c745
`cast-sym` made irrelevant in its `eq` argument
jamesmckinna Sep 23, 2023
7bd01c0
further deprecation typo
jamesmckinna Sep 23, 2023
ad9bc24
re-oriented equations in `cast-sym`
jamesmckinna Sep 23, 2023
439bf83
refactored `lookup-take` etc. in terms of `truncate` etc.
jamesmckinna Sep 24, 2023
6540d5a
final version?
jamesmckinna Sep 24, 2023
b7a82d3
simplified `Irrelevant` proofs
jamesmckinna Sep 26, 2023
0c46dfa
simplified `Irrelevant` proofs; removed some cruft
jamesmckinna Sep 26, 2023
c448d53
turn `rewrite` in to `cong`
jamesmckinna Sep 26, 2023
04bce74
turn `rewrite` in to `cong`
jamesmckinna Sep 26, 2023
6e121ba
better deprecation warning advice
jamesmckinna Sep 26, 2023
d4d7054
updated `Data.Fin.Properties`
jamesmckinna Sep 26, 2023
d277ba2
Merge branch 'master' into issue2090
jamesmckinna Sep 26, 2023
824b744
Update Properties.agda: restored renaming from master
jamesmckinna Sep 26, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -1464,6 +1464,8 @@ Deprecated names
sum-++-commute ↦ sum-++

take-drop-id ↦ take++drop≡id

lookup-inject≤-take ↦ lookup-take-inject≤
```
and the type of the proof `zipWith-comm` has been generalised from:
```
Expand Down Expand Up @@ -2193,6 +2195,9 @@ Additions to existing modules
cast-trans : cast eq₂ (cast eq₁ k) ≡ cast (trans eq₁ eq₂) k

fromℕ≢inject₁ : {i : Fin n} → fromℕ n ≢ inject₁ i

inject≤-trans : inject≤ (inject≤ i m≤n) n≤o ≡ inject≤ i (≤-trans m≤n n≤o)
inject≤-irrelevant : inject≤ i m≤n ≡ inject≤ i m≤n′
```

* Added new functions in `Data.Integer.Base`:
Expand Down Expand Up @@ -2738,12 +2743,13 @@ Additions to existing modules

cast-is-id : cast eq xs ≡ xs
subst-is-cast : subst (Vec A) eq xs ≡ cast eq xs
cast-sym : cast eq xs ≡ ys → cast (sym eq) ys ≡ xs
cast-trans : cast eq₂ (cast eq₁ xs) ≡ cast (trans eq₁ eq₂) xs
map-cast : map f (cast eq xs) ≡ cast eq (map f xs)
lookup-cast : lookup (cast eq xs) (Fin.cast eq i) ≡ lookup xs i
lookup-cast₁ : lookup (cast eq xs) i ≡ lookup xs (Fin.cast (sym eq) i)
lookup-cast₂ : lookup xs (Fin.cast eq i) ≡ lookup (cast (sym eq) xs) i
cast-reverse : cast eq ∘ reverse ≗ reverse ∘ cast eq
cast-reverse : cast eq ∘ reverse ≗ reverse ∘ cast eq

zipwith-++ : zipWith f (xs ++ ys) (xs' ++ ys') ≡ zipWith f xs xs' ++ zipWith f ys ys'

Expand All @@ -2757,6 +2763,11 @@ Additions to existing modules
cast-fromList : cast _ (fromList xs) ≡ fromList ys
fromList-map : cast _ (fromList (List.map f xs)) ≡ map f (fromList xs)
fromList-++ : cast _ (fromList (xs List.++ ys)) ≡ fromList xs ++ fromList ys

truncate≡take : .(eq : n ≡ m + o) → truncate m≤n xs ≡ take m (cast eq xs)
take≡truncate : take m xs ≡ truncate (m≤m+n m n) xs
lookup-truncate : lookup (truncate m≤n xs) i ≡ lookup xs (Fin.inject≤ i m≤n)
lookup-take-inject≤ : lookup (take m xs) i ≡ lookup xs (Fin.inject≤ i (m≤m+n m n))
```

* Added new proofs in `Data.Vec.Membership.Propositional.Properties`:
Expand Down
7 changes: 3 additions & 4 deletions src/Data/Fin/Base.agda
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
module Data.Fin.Base where

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

inject≤ : Fin m → m ℕ.≤ n → Fin n
inject≤ {_} {suc n} zero _ = zero
inject≤ {_} {suc n} zero _ = zero
inject≤ {_} {suc n} (suc i) (s≤s m≤n) = suc (inject≤ i m≤n)

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

lower₁ : ∀ (i : Fin (suc n)) → n ≢ toℕ i → Fin n
lower₁ {zero} zero ne = ⊥-elim (ne refl)
lower₁ {zero} zero ne = contradiction refl ne
lower₁ {suc n} zero _ = zero
lower₁ {suc n} (suc i) ne = suc (lower₁ i (ne ∘ cong suc))

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

punchOut : ∀ {i j : Fin (suc n)} → i ≢ j → Fin n
punchOut {_} {zero} {zero} i≢j = ⊥-elim (i≢j refl)
punchOut {_} {zero} {zero} i≢j = contradiction refl i≢j
punchOut {_} {zero} {suc j} _ = j
punchOut {suc _} {suc i} {zero} _ = zero
punchOut {suc _} {suc i} {suc j} i≢j = suc (punchOut (i≢j ∘ cong suc))
Expand Down
8 changes: 8 additions & 0 deletions src/Data/Fin/Properties.agda
Original file line number Diff line number Diff line change
Expand Up @@ -547,12 +547,20 @@ inject≤-idempotent {_} {suc n} {suc o} zero _ _ _ = refl
inject≤-idempotent {_} {suc n} {suc o} (suc i) (s≤s m≤n) (s≤s n≤o) (s≤s m≤o) =
cong suc (inject≤-idempotent i m≤n n≤o m≤o)

inject≤-trans : ∀ (i : Fin m) (m≤n : m ℕ.≤ n) (n≤o : n ℕ.≤ o) →
inject≤ (inject≤ i m≤n) n≤o ≡ inject≤ i (ℕₚ.≤-trans m≤n n≤o)
inject≤-trans i m≤n n≤o = inject≤-idempotent i m≤n n≤o _

inject≤-injective : ∀ (m≤n m≤n′ : m ℕ.≤ n) i j →
inject≤ i m≤n ≡ inject≤ j m≤n′ → i ≡ j
inject≤-injective (s≤s p) (s≤s q) zero zero eq = refl
inject≤-injective (s≤s p) (s≤s q) (suc i) (suc j) eq =
cong suc (inject≤-injective p q i j (suc-injective eq))

inject≤-irrelevant : ∀ (m≤n m≤n′ : m ℕ.≤ n) i →
inject≤ i m≤n ≡ inject≤ i m≤n′
inject≤-irrelevant m≤n m≤n′ i = cong (inject≤ i) (ℕₚ.≤-irrelevant m≤n m≤n′)

------------------------------------------------------------------------
-- pred
------------------------------------------------------------------------
Expand Down
2 changes: 1 addition & 1 deletion src/Data/Vec/Base.agda
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ uncons (x ∷ xs) = x , xs

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

-- Pad out a vector with extra elements.
Expand Down
70 changes: 56 additions & 14 deletions src/Data/Vec/Properties.agda
Original file line number Diff line number Diff line change
Expand Up @@ -10,27 +10,27 @@ module Data.Vec.Properties where

open import Algebra.Definitions
open import Data.Bool.Base using (true; false)
open import Data.Fin.Base as Fin using (Fin; zero; suc; toℕ; fromℕ<; _↑ˡ_; _↑ʳ_)
open import Data.Fin.Base as Fin
using (Fin; zero; suc; toℕ; fromℕ<; _↑ˡ_; _↑ʳ_)
open import Data.List.Base as List using (List)
import Data.List.Properties as Listₚ
open import Data.Nat.Base
open import Data.Nat.Properties
using (+-assoc; m≤n⇒m≤1+n; -refl; ≤-trans; suc-injective; +-comm; +-suc)
using (+-assoc; m≤n⇒m≤1+n; m≤m+n; ≤-refl; ≤-trans; ≤-irrelevant; ≤⇒≤″; suc-injective; +-comm; +-suc)
open import Data.Product.Base as Prod
using (_×_; _,_; proj₁; proj₂; <_,_>; uncurry)
open import Data.Sum.Base using ([_,_]′)
open import Data.Sum.Properties using ([,]-map)
open import Data.Vec.Base
open import Function.Base
-- open import Function.Inverse using (_↔_; inverse)
open import Function.Bundles using (_↔_; mk↔ₛ′)
open import Level using (Level)
open import Relation.Binary.Definitions using (DecidableEquality)
open import Relation.Binary.PropositionalEquality
using (_≡_; _≢_; _≗_; refl; sym; trans; cong; cong₂; subst; module ≡-Reasoning)
open import Relation.Unary using (Pred; Decidable)
open import Relation.Nullary.Decidable using (Dec; does; yes; no; _×-dec_; map′)
open import Relation.Nullary.Negation using (contradiction)
open import Relation.Nullary.Decidable.Core using (Dec; does; yes; no; _×-dec_; map′)
open import Relation.Nullary.Negation.Core using (contradiction)

open ≡-Reasoning

Expand Down Expand Up @@ -122,6 +122,19 @@ truncate-trans : ∀ {p} (m≤n : m ≤ n) (n≤p : n ≤ p) (xs : Vec A p) →
truncate-trans z≤n n≤p xs = refl
truncate-trans (s≤s m≤n) (s≤s n≤p) (x ∷ xs) = cong (x ∷_) (truncate-trans m≤n n≤p xs)

truncate-irrelevant : (m≤n₁ m≤n₂ : m ≤ n) → truncate {A = A} m≤n₁ ≗ truncate m≤n₂
truncate-irrelevant m≤n₁ m≤n₂ xs = cong (λ m≤n → truncate m≤n xs) (≤-irrelevant m≤n₁ m≤n₂)

truncate≡take : (m≤n : m ≤ n) (xs : Vec A n) .(eq : n ≡ m + o) →
truncate m≤n xs ≡ take m (cast eq xs)
truncate≡take z≤n _ eq = refl
truncate≡take (s≤s m≤n) (x ∷ xs) eq = cong (x ∷_) (truncate≡take m≤n xs (suc-injective eq))

take≡truncate : ∀ m (xs : Vec A (m + n)) →
take m xs ≡ truncate (m≤m+n m n) xs
take≡truncate zero _ = refl
take≡truncate (suc m) (x ∷ xs) = cong (x ∷_) (take≡truncate m xs)

------------------------------------------------------------------------
-- pad

Expand Down Expand Up @@ -171,10 +184,20 @@ lookup⇒[]= (suc i) (_ ∷ xs) p = there (lookup⇒[]= i xs p)
[]=⇒lookup∘lookup⇒[]= (x ∷ xs) zero refl = refl
[]=⇒lookup∘lookup⇒[]= (x ∷ xs) (suc i) p = []=⇒lookup∘lookup⇒[]= xs i p

lookup-inject≤-take : ∀ m (m≤m+n : m ≤ m + n) (i : Fin m) (xs : Vec A (m + n)) →
lookup xs (Fin.inject≤ i m≤m+n) ≡ lookup (take m xs) i
lookup-inject≤-take (suc m) m≤m+n zero (x ∷ xs) = refl
lookup-inject≤-take (suc m) (s≤s m≤m+n) (suc i) (x ∷ xs) = lookup-inject≤-take m m≤m+n i xs
lookup-truncate : (m≤n : m ≤ n) (xs : Vec A n) (i : Fin m) →
lookup (truncate m≤n xs) i ≡ lookup xs (Fin.inject≤ i m≤n)
lookup-truncate (s≤s m≤m+n) (_ ∷ _) zero = refl
lookup-truncate (s≤s m≤m+n) (_ ∷ xs) (suc i) = lookup-truncate m≤m+n xs i

lookup-take-inject≤ : (xs : Vec A (m + n)) (i : Fin m) →
lookup (take m xs) i ≡ lookup xs (Fin.inject≤ i (m≤m+n m n))
lookup-take-inject≤ {m = m} {n = n} xs i = begin
lookup (take _ xs) i
≡⟨ cong (λ ys → lookup ys i) (take≡truncate m xs) ⟩
lookup (truncate _ xs) i
≡⟨ lookup-truncate (m≤m+n m n) xs i ⟩
lookup xs (Fin.inject≤ i (m≤m+n m n))
∎ where open ≡-Reasoning

------------------------------------------------------------------------
-- updateAt (_[_]%=_)
Expand Down Expand Up @@ -348,6 +371,13 @@ cast-is-id eq (x ∷ xs) = cong (x ∷_) (cast-is-id (suc-injective eq) xs)
subst-is-cast : (eq : m ≡ n) (xs : Vec A m) → subst (Vec A) eq xs ≡ cast eq xs
subst-is-cast refl xs = sym (cast-is-id refl xs)

cast-sym : .(eq : m ≡ n) {xs : Vec A m} {ys : Vec A n} →
cast eq xs ≡ ys → cast (sym eq) ys ≡ xs
cast-sym eq {xs = []} {ys = []} _ = refl
cast-sym eq {xs = x ∷ xs} {ys = y ∷ ys} xxs[eq]≡yys =
let x≡y , xs[eq]≡ys = ∷-injective xxs[eq]≡yys
in cong₂ _∷_ (sym x≡y) (cast-sym (suc-injective eq) xs[eq]≡ys)

cast-trans : .(eq₁ : m ≡ n) .(eq₂ : n ≡ o) (xs : Vec A m) →
cast eq₂ (cast eq₁ xs) ≡ cast (trans eq₁ eq₂) xs
cast-trans {m = zero} {n = zero} {o = zero} eq₁ eq₂ [] = refl
Expand Down Expand Up @@ -399,9 +429,9 @@ map-updateAt (x ∷ xs) (suc i) eq = cong (_ ∷_) (map-updateAt xs i eq)

map-insert : ∀ (f : A → B) (x : A) (xs : Vec A n) (i : Fin (suc n)) →
map f (insert xs i x) ≡ insert (map f xs) i (f x)
map-insert f _ [] Fin.zero = refl
map-insert f _ (x' ∷ xs) Fin.zero = refl
map-insert f x (x' ∷ xs) (Fin.suc i) = cong (_ ∷_) (map-insert f x xs i)
map-insert f _ [] zero = refl
map-insert f _ (x' ∷ xs) zero = refl
map-insert f x (x' ∷ xs) (suc i) = cong (_ ∷_) (map-insert f x xs i)

map-[]≔ : ∀ (f : A → B) (xs : Vec A n) (i : Fin n) →
map f (xs [ i ]≔ x) ≡ map f xs [ i ]≔ f x
Expand Down Expand Up @@ -1245,13 +1275,11 @@ sum-++-commute = sum-++
"Warning: sum-++-commute was deprecated in v2.0.
Please use sum-++ instead."
#-}

take-drop-id = take++drop≡id
{-# WARNING_ON_USAGE take-drop-id
"Warning: take-drop-id was deprecated in v2.0.
Please use take++drop≡id instead."
#-}

take-distr-zipWith = take-zipWith
{-# WARNING_ON_USAGE take-distr-zipWith
"Warning: take-distr-zipWith was deprecated in v2.0.
Expand All @@ -1272,3 +1300,17 @@ drop-distr-map = drop-map
"Warning: drop-distr-map was deprecated in v2.0.
Please use drop-map instead."
#-}
lookup-inject≤-take : ∀ m (m≤m+n : m ≤ m + n) (i : Fin m) (xs : Vec A (m + n)) →
lookup xs (Fin.inject≤ i m≤m+n) ≡ lookup (take m xs) i
lookup-inject≤-take m m≤m+n i xs = sym (begin
lookup (take m xs) i
≡⟨ lookup-take-inject≤ xs i ⟩
lookup xs (Fin.inject≤ i _)
≡⟨ cong ((lookup xs) ∘ (Fin.inject≤ i)) (≤-irrelevant _ _) ⟩
lookup xs (Fin.inject≤ i m≤m+n)
∎) where open ≡-Reasoning
{-# WARNING_ON_USAGE lookup-inject≤-take
"Warning: lookup-inject≤-take was deprecated in v2.0.
Please use lookup-take-inject≤ or lookup-truncate, take≡truncate instead."
#-}