9
9
module Data.Vec.Bounded.Base where
10
10
11
11
open import Data.Nat.Base
12
- import Data.Nat.Properties as ℕₚ
12
+ import Data.Nat.Properties as ℕ
13
13
open import Data.List.Base as List using (List)
14
- open import Data.List.Extrema ℕₚ .≤-totalOrder
14
+ open import Data.List.Extrema ℕ .≤-totalOrder
15
15
open import Data.List.Relation.Unary.All as All using (All)
16
- import Data.List.Relation.Unary.All.Properties as Allₚ
16
+ import Data.List.Relation.Unary.All.Properties as All
17
17
open import Data.List.Membership.Propositional using (mapWith∈)
18
18
open import Data.Product.Base using (∃; _×_; _,_; proj₁; proj₂)
19
19
open import Data.Vec.Base as Vec using (Vec)
20
20
open import Data.These.Base as These using (These)
21
21
open import Function.Base using (_∘_; id; _$_)
22
22
open import Level using (Level)
23
23
open import Relation.Nullary.Decidable.Core using (recompute)
24
- open import Relation.Binary.PropositionalEquality.Core as P using (_≡_; refl )
24
+ open import Relation.Binary.PropositionalEquality.Core as ≡ using (_≡_)
25
25
open import Relation.Binary.PropositionalEquality.Properties
26
26
using (module ≡-Reasoning )
27
27
@@ -31,6 +31,7 @@ private
31
31
A : Set a
32
32
B : Set b
33
33
C : Set c
34
+ m n : ℕ
34
35
35
36
------------------------------------------------------------------------
36
37
-- Types
@@ -45,97 +46,95 @@ record Vec≤ (A : Set a) (n : ℕ) : Set a where
45
46
------------------------------------------------------------------------
46
47
-- Conversion functions
47
48
48
- fromVec : ∀ {n} → Vec A n → Vec≤ A n
49
- fromVec v = v , ℕₚ .≤-refl
49
+ fromVec : Vec A n → Vec≤ A n
50
+ fromVec v = v , ℕ .≤-refl
50
51
51
- padRight : ∀ {n} → A → Vec≤ A n → Vec A n
52
+ padRight : A → Vec≤ A n → Vec A n
52
53
padRight a (vs , m≤n)
53
- with recompute (_ ℕₚ .≤″? _) (ℕₚ .≤⇒≤″ m≤n)
54
- ... | less-than-or-equal refl = vs Vec.++ Vec.replicate _ a
54
+ with ≤″-offset k ← recompute (_ ℕ .≤″? _) (ℕ .≤⇒≤″ m≤n)
55
+ = vs Vec.++ Vec.replicate k a
55
56
56
- padLeft : ∀ {n} → A → Vec≤ A n → Vec A n
57
- padLeft a as@(vs , m≤n)
58
- with recompute (_ ℕₚ.≤″? _) (ℕₚ.≤⇒≤″ m≤n)
59
- ... | less-than-or-equal {k} ∣as∣+k≡n
60
- with P.trans (ℕₚ.+-comm k (Vec≤.length as)) ∣as∣+k≡n
61
- ... | refl = Vec.replicate k a Vec.++ vs
57
+ padLeft : A → Vec≤ A n → Vec A n
58
+ padLeft a record { length = m ; vec = vs ; bound = m≤n }
59
+ with ≤″-offset k ← recompute (_ ℕ.≤″? _) (ℕ.≤⇒≤″ m≤n)
60
+ rewrite ℕ.+-comm m k
61
+ = Vec.replicate k a Vec.++ vs
62
62
63
63
private
64
- split : ∀ {m n} k → m + k ≡ n → ⌊ k /2⌋ + (m + ⌈ k /2⌉) ≡ n
65
- split {m} {n} k eq = begin
66
- ⌊ k /2⌋ + (m + ⌈ k /2⌉) ≡⟨ ℕₚ.+-comm ⌊ k /2⌋ _ ⟩
67
- m + ⌈ k /2⌉ + ⌊ k /2⌋ ≡⟨ ℕₚ.+-assoc m ⌈ k /2⌉ ⌊ k /2⌋ ⟩
68
- m + (⌈ k /2⌉ + ⌊ k /2⌋) ≡⟨ P.cong (m +_) (ℕₚ.+-comm ⌈ k /2⌉ ⌊ k /2⌋) ⟩
69
- m + (⌊ k /2⌋ + ⌈ k /2⌉) ≡⟨ P.cong (m +_) (ℕₚ.⌊n/2⌋+⌈n/2⌉≡n k) ⟩
70
- m + k ≡⟨ eq ⟩
71
- n ∎ where open ≡-Reasoning
72
-
73
- padBoth : ∀ {n} → A → A → Vec≤ A n → Vec A n
74
- padBoth aₗ aᵣ as@(vs , m≤n)
75
- with recompute (_ ℕₚ.≤″? _) (ℕₚ.≤⇒≤″ m≤n)
76
- ... | less-than-or-equal {k} ∣as∣+k≡n
77
- with split k ∣as∣+k≡n
78
- ... | refl = Vec.replicate ⌊ k /2⌋ aₗ
64
+ split : ∀ m k → m + k ≡ ⌊ k /2⌋ + (m + ⌈ k /2⌉)
65
+ split m k = begin
66
+ m + k ≡⟨ ≡.cong (m +_) (ℕ.⌊n/2⌋+⌈n/2⌉≡n k) ⟨
67
+ m + (⌊ k /2⌋ + ⌈ k /2⌉) ≡⟨ ≡.cong (m +_) (ℕ.+-comm ⌊ k /2⌋ ⌈ k /2⌉) ⟩
68
+ m + (⌈ k /2⌉ + ⌊ k /2⌋) ≡⟨ ℕ.+-assoc m ⌈ k /2⌉ ⌊ k /2⌋ ⟨
69
+ m + ⌈ k /2⌉ + ⌊ k /2⌋ ≡⟨ ℕ.+-comm _ ⌊ k /2⌋ ⟩
70
+ ⌊ k /2⌋ + (m + ⌈ k /2⌉) ∎
71
+ where open ≡-Reasoning
72
+
73
+ padBoth : A → A → Vec≤ A n → Vec A n
74
+ padBoth aₗ aᵣ record { length = m ; vec = vs ; bound = m≤n }
75
+ with ≤″-offset k ← recompute (_ ℕ.≤″? _) (ℕ.≤⇒≤″ m≤n)
76
+ rewrite split m k
77
+ = Vec.replicate ⌊ k /2⌋ aₗ
79
78
Vec.++ vs
80
79
Vec.++ Vec.replicate ⌈ k /2⌉ aᵣ
81
80
82
81
83
82
fromList : (as : List A) → Vec≤ A (List.length as)
84
83
fromList = fromVec ∘ Vec.fromList
85
84
86
- toList : ∀ {n} → Vec≤ A n → List A
85
+ toList : Vec≤ A n → List A
87
86
toList = Vec.toList ∘ Vec≤.vec
88
87
89
88
------------------------------------------------------------------------
90
89
-- Creating new Vec≤ vectors
91
90
92
- replicate : ∀ {m n} .(m≤n : m ≤ n) → A → Vec≤ A n
91
+ replicate : .(m≤n : m ≤ n) → A → Vec≤ A n
93
92
replicate m≤n a = Vec.replicate _ a , m≤n
94
93
95
- [] : ∀ {n} → Vec≤ A n
94
+ [] : Vec≤ A n
96
95
[] = Vec.[] , z≤n
97
96
98
97
infixr 5 _∷_
99
- _∷_ : ∀ {n} → A → Vec≤ A n → Vec≤ A (suc n)
98
+ _∷_ : A → Vec≤ A n → Vec≤ A (suc n)
100
99
a ∷ (as , p) = a Vec.∷ as , s≤s p
101
100
102
101
------------------------------------------------------------------------
103
102
-- Modifying Vec≤ vectors
104
103
105
- ≤-cast : ∀ {m n} → .(m≤n : m ≤ n) → Vec≤ A m → Vec≤ A n
106
- ≤-cast m≤n (v , p) = v , ℕₚ .≤-trans p m≤n
104
+ ≤-cast : .(m≤n : m ≤ n) → Vec≤ A m → Vec≤ A n
105
+ ≤-cast m≤n (v , p) = v , ℕ .≤-trans p m≤n
107
106
108
- ≡-cast : ∀ {m n} → .(eq : m ≡ n) → Vec≤ A m → Vec≤ A n
109
- ≡-cast m≡n = ≤-cast (ℕₚ .≤-reflexive m≡n)
107
+ ≡-cast : .(eq : m ≡ n) → Vec≤ A m → Vec≤ A n
108
+ ≡-cast m≡n = ≤-cast (ℕ .≤-reflexive m≡n)
110
109
111
- map : (A → B) → ∀ {n} → Vec≤ A n → Vec≤ B n
110
+ map : (A → B) → Vec≤ A n → Vec≤ B n
112
111
map f (v , p) = Vec.map f v , p
113
112
114
- reverse : ∀ {n} → Vec≤ A n → Vec≤ A n
113
+ reverse : Vec≤ A n → Vec≤ A n
115
114
reverse (v , p) = Vec.reverse v , p
116
115
117
116
-- Align and Zip.
118
117
119
- alignWith : (These A B → C) → ∀ {n} → Vec≤ A n → Vec≤ B n → Vec≤ C n
120
- alignWith f (as , p) (bs , q) = Vec.alignWith f as bs , ℕₚ .⊔-lub p q
118
+ alignWith : (These A B → C) → Vec≤ A n → Vec≤ B n → Vec≤ C n
119
+ alignWith f (as , p) (bs , q) = Vec.alignWith f as bs , ℕ .⊔-lub p q
121
120
122
- zipWith : (A → B → C) → ∀ {n} → Vec≤ A n → Vec≤ B n → Vec≤ C n
123
- zipWith f (as , p) (bs , q) = Vec.restrictWith f as bs , ℕₚ .m≤n⇒m⊓o≤n _ p
121
+ zipWith : (A → B → C) → Vec≤ A n → Vec≤ B n → Vec≤ C n
122
+ zipWith f (as , p) (bs , q) = Vec.restrictWith f as bs , ℕ .m≤n⇒m⊓o≤n _ p
124
123
125
- zip : ∀ {n} → Vec≤ A n → Vec≤ B n → Vec≤ (A × B) n
124
+ zip : Vec≤ A n → Vec≤ B n → Vec≤ (A × B) n
126
125
zip = zipWith _,_
127
126
128
- align : ∀ {n} → Vec≤ A n → Vec≤ B n → Vec≤ (These A B) n
127
+ align : Vec≤ A n → Vec≤ B n → Vec≤ (These A B) n
129
128
align = alignWith id
130
129
131
130
-- take and drop
132
131
133
- take : ∀ {m} n → Vec≤ A m → Vec≤ A (n ⊓ m)
132
+ take : ∀ n → Vec≤ A m → Vec≤ A (n ⊓ m)
134
133
take zero _ = []
135
134
take (suc n) (Vec.[] , p) = []
136
135
take {m = suc m} (suc n) (a Vec.∷ as , p) = a ∷ take n (as , s≤s⁻¹ p)
137
136
138
- drop : ∀ {m} n → Vec≤ A m → Vec≤ A (m ∸ n)
137
+ drop : ∀ n → Vec≤ A m → Vec≤ A (m ∸ n)
139
138
drop zero v = v
140
139
drop (suc n) (Vec.[] , p) = []
141
140
drop {m = suc m} (suc n) (a Vec.∷ as , p) = drop n (as , s≤s⁻¹ p)
@@ -150,7 +149,7 @@ rectangle {A = A} rows = width , padded where
150
149
width = max 0 sizes
151
150
152
151
all≤ : All (λ v → proj₁ v ≤ width) rows
153
- all≤ = Allₚ .map⁻ (xs≤max 0 sizes)
152
+ all≤ = All .map⁻ (xs≤max 0 sizes)
154
153
155
154
padded : List (Vec≤ A width)
156
155
padded = mapWith∈ rows $ λ {x} x∈rows →
0 commit comments