@@ -13,7 +13,7 @@ open import Data.Bool.Base using (true; false)
13
13
open import Data.Fin.Base as Fin using (Fin; zero; suc; toℕ; fromℕ; _↑ˡ_; _↑ʳ_)
14
14
open import Data.List.Base as List using (List)
15
15
open import Data.Nat.Base
16
- open import Data.Nat.Properties
16
+ open import Data.Nat.Properties as ℕₚ
17
17
using (+-assoc; ≤-step; ≤-refl; ≤-trans)
18
18
open import Data.Product as Prod
19
19
using (_×_; _,_; proj₁; proj₂; <_,_>; uncurry)
@@ -25,7 +25,7 @@ open import Function.Inverse using (_↔_; inverse)
25
25
open import Level using (Level)
26
26
open import Relation.Binary hiding (Decidable)
27
27
open import Relation.Binary.PropositionalEquality
28
- using (_≡_; _≢_; _≗_; refl; sym; trans; cong; cong₂; module ≡-Reasoning )
28
+ using (_≡_; _≢_; _≗_; refl; sym; trans; cong; cong₂; subst; module ≡-Reasoning )
29
29
open import Relation.Unary using (Pred; Decidable)
30
30
open import Relation.Nullary using (Dec; does; yes; no)
31
31
open import Relation.Nullary.Decidable using (map′)
@@ -39,7 +39,7 @@ private
39
39
a b c d p : Level
40
40
A B C D : Set a
41
41
w x y z : A
42
- m n : ℕ
42
+ m n o : ℕ
43
43
ws xs ys zs : Vec A n
44
44
45
45
------------------------------------------------------------------------
@@ -386,6 +386,27 @@ lookup∘update′ : ∀ {i j} → i ≢ j → ∀ (xs : Vec A n) y →
386
386
lookup (xs [ j ]≔ y) i ≡ lookup xs i
387
387
lookup∘update′ {i = i} {j} i≢j xs y = lookup∘updateAt′ i j i≢j xs
388
388
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
+
389
410
------------------------------------------------------------------------
390
411
-- map
391
412
@@ -397,6 +418,12 @@ map-const : ∀ (xs : Vec A n) (y : B) → map (const y) xs ≡ replicate y
397
418
map-const [] _ = refl
398
419
map-const (_ ∷ xs) y = cong (y ∷_) (map-const xs y)
399
420
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
+
400
427
map-++ : ∀ (f : A → B) (xs : Vec A m) (ys : Vec A n) →
401
428
map f (xs ++ ys) ≡ map f xs ++ map f ys
402
429
map-++ f [] ys = refl
@@ -487,9 +514,34 @@ lookup-splitAt (suc m) (x ∷ xs) ys (suc i) = trans
487
514
------------------------------------------------------------------------
488
515
-- concat
489
516
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
491
537
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
493
545
494
546
------------------------------------------------------------------------
495
547
-- zipWith
0 commit comments