Skip to content

Commit 9b241ca

Browse files
committed
[ fix agda#1443 ] Also add cast for Vec
1 parent c6a1ae0 commit 9b241ca

File tree

4 files changed

+74
-7
lines changed

4 files changed

+74
-7
lines changed

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1836,6 +1836,8 @@ Other minor changes
18361836
diagonal : Vec (Vec A n) n → Vec A n
18371837
DiagonalBind._>>=_ : Vec A n → (A → Vec B n) → Vec B n
18381838
_ʳ++_ : Vec A m → Vec A n → Vec A (m + n)
1839+
1840+
cast : .(eq : m ≡ n) → Vec A m → Vec A n
18391841
```
18401842

18411843
* Added new instance in `Data.Vec.Categorical`:
@@ -1894,6 +1896,15 @@ Other minor changes
18941896
reverse-injective : reverse xs ≡ reverse ys → xs ≡ ys
18951897
18961898
transpose-replicate : transpose (replicate xs) ≡ map replicate xs
1899+
1900+
toList-cast : toList (cast eq xs) ≡ toList xs
1901+
cast-is-id : cast eq xs ≡ xs
1902+
cast-is-subst : cast eq xs ≡ subst (Vec A) eq xs
1903+
cast-trans : cast eq₂ (cast eq₁ xs) ≡ cast (trans eq₁ eq₂) xs
1904+
map-cast : map f (cast eq xs) ≡ cast eq (map f xs)
1905+
lookup-cast : lookup (cast eq xs) (Fin.cast eq i) ≡ lookup xs i
1906+
lookup-cast₁ : lookup (cast eq xs) i ≡ lookup xs (Fin.cast (sym eq) i)
1907+
lookup-cast₂ : lookup xs (Fin.cast eq i) ≡ lookup (cast (sym eq) xs) i
18971908
```
18981909

18991910
* Added new proofs in `Data.Vec.Functional.Properties`:

src/Data/Fin/Properties.agda

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ toℕ-cast {n = suc n} eq zero = refl
257257
toℕ-cast {n = suc n} eq (suc k) = cong suc (toℕ-cast (cong ℕ.pred eq) k)
258258

259259
cast-is-id : .(eq : m ≡ m) (k : Fin m) cast eq k ≡ k
260-
cast-is-id eq zero = refl
260+
cast-is-id eq zero = refl
261261
cast-is-id eq (suc k) = cong suc (cast-is-id (ℕₚ.suc-injective eq) k)
262262

263263
cast-is-subst : (eq : m ≡ n) (k : Fin m) cast eq k ≡ subst Fin eq k

src/Data/Vec/Base.agda

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ open import Data.Product as Prod using (∃; ∃₂; _×_; _,_)
1616
open import Data.These.Base as These using (These; this; that; these)
1717
open import Function.Base using (const; _∘′_; id; _∘_)
1818
open import Level using (Level)
19-
open import Relation.Binary.PropositionalEquality.Core using (_≡_; refl)
19+
open import Relation.Binary.PropositionalEquality.Core using (_≡_; refl; cong)
2020
open import Relation.Nullary using (does)
2121
open import Relation.Unary using (Pred; Decidable)
2222

@@ -93,6 +93,10 @@ xs [ i ]≔ y = xs [ i ]%= const y
9393
------------------------------------------------------------------------
9494
-- Operations for transforming vectors
9595

96+
cast : .(eq : m ≡ n) Vec A m Vec A n
97+
cast {n = zero} eq [] = []
98+
cast {n = suc _} eq (x ∷ xs) = x ∷ cast (cong pred eq) xs
99+
96100
map : (A B) Vec A n Vec B n
97101
map f [] = []
98102
map f (x ∷ xs) = f x ∷ map f xs

src/Data/Vec/Properties.agda

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ open import Data.Bool.Base using (true; false)
1313
open import Data.Fin.Base as Fin using (Fin; zero; suc; toℕ; fromℕ; _↑ˡ_; _↑ʳ_)
1414
open import Data.List.Base as List using (List)
1515
open import Data.Nat.Base
16-
open import Data.Nat.Properties
16+
open import Data.Nat.Properties as ℕₚ
1717
using (+-assoc; ≤-step; ≤-refl; ≤-trans)
1818
open import Data.Product as Prod
1919
using (_×_; _,_; proj₁; proj₂; <_,_>; uncurry)
@@ -25,7 +25,7 @@ open import Function.Inverse using (_↔_; inverse)
2525
open import Level using (Level)
2626
open import Relation.Binary hiding (Decidable)
2727
open import Relation.Binary.PropositionalEquality
28-
using (_≡_; _≢_; _≗_; refl; sym; trans; cong; cong₂; module ≡-Reasoning)
28+
using (_≡_; _≢_; _≗_; refl; sym; trans; cong; cong₂; subst; module ≡-Reasoning)
2929
open import Relation.Unary using (Pred; Decidable)
3030
open import Relation.Nullary using (Dec; does; yes; no)
3131
open import Relation.Nullary.Decidable using (map′)
@@ -39,7 +39,7 @@ private
3939
a b c d p : Level
4040
A B C D : Set a
4141
w x y z : A
42-
m n :
42+
m n o :
4343
ws xs ys zs : Vec A n
4444

4545
------------------------------------------------------------------------
@@ -386,6 +386,27 @@ lookup∘update′ : ∀ {i j} → i ≢ j → ∀ (xs : Vec A n) y →
386386
lookup (xs [ j ]≔ y) i ≡ lookup xs i
387387
lookup∘update′ {i = i} {j} i≢j xs y = lookup∘updateAt′ i j i≢j xs
388388

389+
------------------------------------------------------------------------
390+
-- cast
391+
392+
toList-cast : .(eq : m ≡ n) (xs : Vec A m) toList (cast eq xs) ≡ toList xs
393+
toList-cast {n = zero} eq [] = refl
394+
toList-cast {n = suc _} eq (x ∷ xs) =
395+
cong (x List.∷_) (toList-cast (cong pred eq) xs)
396+
397+
cast-is-id : .(eq : m ≡ m) (xs : Vec A m) cast eq xs ≡ xs
398+
cast-is-id eq [] = refl
399+
cast-is-id eq (x ∷ xs) = cong (x ∷_) (cast-is-id (ℕₚ.suc-injective eq) xs)
400+
401+
cast-is-subst : (eq : m ≡ n) (xs : Vec A m) cast eq xs ≡ subst (Vec A) eq xs
402+
cast-is-subst refl xs = cast-is-id refl xs
403+
404+
cast-trans : .(eq₁ : m ≡ n) (eq₂ : n ≡ o) (xs : Vec A m)
405+
cast eq₂ (cast eq₁ xs) ≡ cast (trans eq₁ eq₂) xs
406+
cast-trans {m = zero} {n = zero} {o = zero} eq₁ eq₂ [] = refl
407+
cast-trans {m = suc _} {n = suc _} {o = suc _} eq₁ eq₂ (x ∷ xs) =
408+
cong (x ∷_) (cast-trans (ℕₚ.suc-injective eq₁) (ℕₚ.suc-injective eq₂) xs)
409+
389410
------------------------------------------------------------------------
390411
-- map
391412

@@ -397,6 +418,12 @@ map-const : ∀ (xs : Vec A n) (y : B) → map (const y) xs ≡ replicate y
397418
map-const [] _ = refl
398419
map-const (_ ∷ xs) y = cong (y ∷_) (map-const xs y)
399420

421+
map-cast : (f : A B) .(eq : m ≡ n) (xs : Vec A m)
422+
map f (cast eq xs) ≡ cast eq (map f xs)
423+
map-cast {n = zero} f eq [] = refl
424+
map-cast {n = suc _} f eq (x ∷ xs)
425+
= cong (f x ∷_) (map-cast f (ℕₚ.suc-injective eq) xs)
426+
400427
map-++ : (f : A B) (xs : Vec A m) (ys : Vec A n)
401428
map f (xs ++ ys) ≡ map f xs ++ map f ys
402429
map-++ f [] ys = refl
@@ -487,9 +514,34 @@ lookup-splitAt (suc m) (x ∷ xs) ys (suc i) = trans
487514
------------------------------------------------------------------------
488515
-- concat
489516

490-
lookup-concat : (xss : Vec (Vec A m) n) i j lookup (concat xss) (Fin.combine i j) ≡ lookup (lookup xss i) j
517+
lookup-cast : .(eq : m ≡ n) (xs : Vec A m) (i : Fin m)
518+
lookup (cast eq xs) (Fin.cast eq i) ≡ lookup xs i
519+
lookup-cast {n = suc _} eq (x ∷ _) zero = refl
520+
lookup-cast {n = suc _} eq (_ ∷ xs) (suc i) =
521+
lookup-cast (ℕₚ.suc-injective eq) xs i
522+
523+
lookup-cast₁ : .(eq : m ≡ n) (xs : Vec A m) (i : Fin n)
524+
lookup (cast eq xs) i ≡ lookup xs (Fin.cast (sym eq) i)
525+
lookup-cast₁ eq (x ∷ _) zero = refl
526+
lookup-cast₁ eq (_ ∷ xs) (suc i) =
527+
lookup-cast₁ (ℕₚ.suc-injective eq) xs i
528+
529+
lookup-cast₂ : .(eq : m ≡ n) (xs : Vec A n) (i : Fin m)
530+
lookup xs (Fin.cast eq i) ≡ lookup (cast (sym eq) xs) i
531+
lookup-cast₂ {n = suc _} eq (x ∷ _) zero = refl
532+
lookup-cast₂ {n = suc _} eq (_ ∷ xs) (suc i) =
533+
lookup-cast₂ (ℕₚ.suc-injective eq) xs i
534+
535+
lookup-concat : (xss : Vec (Vec A m) n) i j
536+
lookup (concat xss) (Fin.combine i j) ≡ lookup (lookup xss i) j
491537
lookup-concat (xs ∷ xss) zero j = lookup-++ˡ xs (concat xss) j
492-
lookup-concat (xs ∷ xss) (suc i) j = trans (lookup-++ʳ xs (concat xss) (Fin.combine i j)) (lookup-concat xss i j)
538+
lookup-concat (xs ∷ xss) (suc i) j = begin
539+
lookup (concat (xs ∷ xss)) (Fin.combine (suc i) j)
540+
≡⟨ lookup-++ʳ xs (concat xss) (Fin.combine i j) ⟩
541+
lookup (concat xss) (Fin.combine i j)
542+
≡⟨ lookup-concat xss i j ⟩
543+
lookup (lookup (xs ∷ xss) (suc i)) j
544+
where open ≡-Reasoning
493545

494546
------------------------------------------------------------------------
495547
-- zipWith

0 commit comments

Comments
 (0)