Skip to content

Commit a2db54a

Browse files
authored
Rename inject+ and raise to left and right infix addition #1589 (#1592)
* committed changes as per Issue \#1589 * changes in line with Matthew and Jacques's comments; new lemma added * fixed whitespace * deprecated code, commented out, now removed entirely; types retained for documentation/argument order shenanigans * added new proof to Data.vec.properties * Update CHANGELOG.md Added new proof to `Data.Vec.Properties` * added fixities
1 parent 4dee360 commit a2db54a

File tree

9 files changed

+165
-72
lines changed

9 files changed

+165
-72
lines changed

CHANGELOG.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,28 @@ Deprecated names
335335
sym-↔ ↦ ↔-sym
336336
```
337337

338+
* In `Data.Fin.Base`:
339+
two new, hopefully more memorable, names `↑ˡ` `↑ʳ` for the 'left', resp. 'right' injection of a Fin m into a 'larger' type, `Fin (m + n)`, resp. `Fin (n + m)`, with argument order to reflect the position of the Fin m argument.
340+
```
341+
inject+ ↦ flip _↑ˡ_
342+
raise ↦ _↑ʳ_
343+
```
344+
345+
* In `Data.Fin.Properties`:
346+
```
347+
toℕ-raise ↦ toℕ-↑ʳ
348+
toℕ-inject+ n i ↦ sym (toℕ-↑ˡ i n)
349+
splitAt-inject+ m n i ↦ splitAt-↑ˡ m i n
350+
splitAt-raise ↦ splitAt-↑ʳ
351+
```
352+
353+
* In `Data.Vec.Properties`:
354+
```
355+
[]≔-++-inject+ ↦ []≔-++-↑ˡ
356+
```
357+
Additionally, `[]≔-++-↑ʳ`, by analogy.
358+
359+
338360
New modules
339361
-----------
340362

@@ -518,6 +540,7 @@ Other minor changes
518540
map-⊛ : ∀ {n} (f : A → B → C) (g : A → B) (xs : Vec A n) → (map f xs ⊛ map g xs) ≡ map (f ˢ g) xs
519541
⊛-is->>= : ∀ {n} (fs : Vec (A → B) n) (xs : Vec A n) → (fs ⊛ xs) ≡ (fs DiagonalBind.>>= flip map xs)
520542
transpose-replicate : ∀ {m n} (xs : Vec A m) → transpose (replicate {n = n} xs) ≡ map replicate xs
543+
[]≔-++-↑ʳ : ∀ {m n y} (xs : Vec A m) (ys : Vec A n) i → (xs ++ ys) [ m ↑ʳ i ]≔ y ≡ xs ++ (ys [ i ]≔ y)
521544
```
522545

523546
* Added new proofs in `Function.Construct.Symmetry`:

HACKING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ How to make changes
8181
thrown up until the tests are passed. Note that the tests
8282
require the use of a tool called `fix-whitespace`. See the
8383
instructions at the end of this file for how to install this.
84-
84+
8585
Note this step is optional as these tests will also be run automatically
8686
by our CI infrastructure when you open a pull request on Github, but it
8787
can be useful to run it locally to get a faster turn around time when finding

src/Data/Fin/Base.agda

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ open import Data.Nat.Base as ℕ using (ℕ; zero; suc; z≤n; s≤s)
1717
open import Data.Nat.Properties.Core using (≤-pred)
1818
open import Data.Product as Product using (_×_; _,_)
1919
open import Data.Sum.Base as Sum using (_⊎_; inj₁; inj₂; [_,_]′)
20-
open import Function.Base using (id; _∘_; _on_)
20+
open import Function.Base using (id; _∘_; _on_; flip)
2121
open import Level using (0ℓ)
2222
open import Relation.Nullary using (yes; no)
2323
open import Relation.Nullary.Decidable.Core using (True; toWitness)
@@ -77,11 +77,19 @@ fromℕ<″ zero (ℕ.less-than-or-equal refl) = zero
7777
fromℕ<″ (suc m) (ℕ.less-than-or-equal refl) =
7878
suc (fromℕ<″ m (ℕ.less-than-or-equal refl))
7979

80-
-- raise m "i" = "m + i".
80+
-- canonical liftings of i:Fin m to larger index
8181

82-
raise : {m} n Fin m Fin (n ℕ.+ m)
83-
raise zero i = i
84-
raise (suc n) i = suc (raise n i)
82+
-- injection on the left: "i" ↑ˡ n = "i" in Fin (m + n)
83+
infixl 5 _↑ˡ_
84+
_↑ˡ_ : {m} Fin m n Fin (m ℕ.+ n)
85+
zero ↑ˡ n = zero
86+
(suc i) ↑ˡ n = suc (i ↑ˡ n)
87+
88+
-- injection on the right: n ↑ʳ "i" = "n + i" in Fin (n + m)
89+
infixr 5 _↑ʳ_
90+
_↑ʳ_ : {m} n Fin m Fin (n ℕ.+ m)
91+
zero ↑ʳ i = i
92+
(suc n) ↑ʳ i = suc (n ↑ʳ i)
8593

8694
-- reduce≥ "m + i" _ = "i".
8795

@@ -99,10 +107,6 @@ inject! : ∀ {n} {i : Fin (suc n)} → Fin′ i → Fin n
99107
inject! {n = suc _} {i = suc _} zero = zero
100108
inject! {n = suc _} {i = suc _} (suc j) = suc (inject! j)
101109

102-
inject+ : {m} n Fin m Fin (m ℕ.+ n)
103-
inject+ n zero = zero
104-
inject+ n (suc i) = suc (inject+ n i)
105-
106110
inject₁ : {m} Fin m Fin (suc m)
107111
inject₁ zero = zero
108112
inject₁ (suc i) = suc (inject₁ i)
@@ -134,7 +138,7 @@ splitAt (suc m) (suc i) = Sum.map suc id (splitAt m i)
134138

135139
-- inverse of above function
136140
join : m n Fin m ⊎ Fin n Fin (m ℕ.+ n)
137-
join m n = [ inject+ n , raise {n} m ]′
141+
join m n = [ _↑ˡ n , m ↑ʳ_ ]′
138142

139143
-- quotRem k "i" = "i % k" , "i / k"
140144
-- This is dual to group from Data.Vec.
@@ -150,8 +154,8 @@ remQuot k = Product.swap ∘ quotRem k
150154

151155
-- inverse of remQuot
152156
combine : {n k} Fin n Fin k Fin (n ℕ.* k)
153-
combine {suc n} {k} zero y = inject+ (n ℕ.* k) y
154-
combine {suc n} {k} (suc x) y = raise k (combine x y)
157+
combine {suc n} {k} zero y = y ↑ˡ (n ℕ.* k)
158+
combine {suc n} {k} (suc x) y = k ↑ʳ (combine x y)
155159

156160
------------------------------------------------------------------------
157161
-- Operations
@@ -307,3 +311,20 @@ fromℕ≤″ = fromℕ<″
307311
"Warning: fromℕ≤″ was deprecated in v1.2.
308312
Please use fromℕ<″ instead."
309313
#-}
314+
315+
-- Version 2.0
316+
317+
raise = _↑ʳ_
318+
{-# WARNING_ON_USAGE raise
319+
"Warning: raise was deprecated in v2.0.
320+
Please use _↑_ʳ instead."
321+
#-}
322+
inject+ : {m} n Fin m Fin (m ℕ.+ n)
323+
inject+ n i = i ↑ˡ n
324+
{-# WARNING_ON_USAGE inject+
325+
"Warning: inject+ was deprecated in v2.0.
326+
Please use _↑ˡ_ instead.
327+
NB argument order has been flipped:
328+
the left-hand argument is the Fin m
329+
the right-hand is the Nat index increment."
330+
#-}

src/Data/Fin/Properties.agda

Lines changed: 63 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ open import Data.Unit using (tt)
2121
open import Data.Product using (Σ-syntax; ∃; ∃₂; ∄; _×_; _,_; map; proj₁; uncurry; <_,_>)
2222
open import Data.Sum.Base as Sum using (_⊎_; inj₁; inj₂; [_,_]; [_,_]′)
2323
open import Data.Sum.Properties using ([,]-map-commute; [,]-∘-distr)
24-
open import Function.Base using (_∘_; id; _$_)
24+
open import Function.Base using (_∘_; id; _$_; flip)
2525
open import Function.Bundles using (_↔_; mk↔′)
2626
open import Function.Definitions.Core2 using (Surjective)
2727
open import Function.Equivalence using (_⇔_; equivalence)
@@ -105,9 +105,21 @@ toℕ-strengthen : ∀ {n} (i : Fin n) → toℕ (strengthen i) ≡ toℕ i
105105
toℕ-strengthen zero = refl
106106
toℕ-strengthen (suc i) = cong suc (toℕ-strengthen i)
107107

108-
toℕ-raise : {m} n (i : Fin m) toℕ (raise n i) ≡ n ℕ.+ toℕ i
109-
toℕ-raise zero i = refl
110-
toℕ-raise (suc n) i = cong suc (toℕ-raise n i)
108+
------------------------------------------------------------------------
109+
-- toℕ-↑ˡ: "i" ↑ˡ n = "i" in Fin (m + n)
110+
------------------------------------------------------------------------
111+
112+
toℕ-↑ˡ : {m} (i : Fin m) n toℕ (i ↑ˡ n) ≡ toℕ i
113+
toℕ-↑ˡ zero n = refl
114+
toℕ-↑ˡ (suc i) n = cong suc (toℕ-↑ˡ i n)
115+
116+
------------------------------------------------------------------------
117+
-- toℕ-↑ʳ: n ↑ʳ "i" = "n + i" in Fin (n + m)
118+
------------------------------------------------------------------------
119+
120+
toℕ-↑ʳ : {m} n (i : Fin m) toℕ (n ↑ʳ i) ≡ n ℕ.+ toℕ i
121+
toℕ-↑ʳ zero i = refl
122+
toℕ-↑ʳ (suc n) i = cong suc (toℕ-↑ʳ n i)
111123

112124
toℕ<n : {n} (i : Fin n) toℕ i ℕ.< n
113125
toℕ<n zero = s≤s z≤n
@@ -371,14 +383,6 @@ toℕ-inject : ∀ {n} {i : Fin n} (j : Fin′ i) →
371383
toℕ-inject {i = suc i} zero = refl
372384
toℕ-inject {i = suc i} (suc j) = cong suc (toℕ-inject j)
373385

374-
------------------------------------------------------------------------
375-
-- inject+
376-
------------------------------------------------------------------------
377-
378-
toℕ-inject+ : {m} n (i : Fin m) toℕ i ≡ toℕ (inject+ n i)
379-
toℕ-inject+ n zero = refl
380-
toℕ-inject+ n (suc i) = cong suc (toℕ-inject+ n i)
381-
382386
------------------------------------------------------------------------
383387
-- inject₁
384388
------------------------------------------------------------------------
@@ -490,25 +494,25 @@ pred< (suc i) p = ≤̄⇒inject₁< ℕₚ.≤-refl
490494

491495
-- Fin (m + n) ↔ Fin m ⊎ Fin n
492496

493-
splitAt-inject+ : m n i splitAt m (inject+ n i) ≡ inj₁ i
494-
splitAt-inject+ (suc m) n zero = refl
495-
splitAt-inject+ (suc m) n (suc i) rewrite splitAt-inject+ m n i = refl
497+
splitAt-↑ˡ : m i n splitAt m (i ↑ˡ n) ≡ inj₁ i
498+
splitAt-↑ˡ (suc m) zero n = refl
499+
splitAt-↑ˡ (suc m) (suc i) n rewrite splitAt-↑ˡ m i n = refl
496500

497-
splitAt-raise : m n i splitAt m (raise {n} m i) ≡ inj₂ i
498-
splitAt-raise zero n i = refl
499-
splitAt-raise (suc m) n i rewrite splitAt-raise m n i = refl
501+
splitAt-↑ʳ : m n i splitAt m (m ↑ʳ i) ≡ inj₂ {B = Fin n} i
502+
splitAt-↑ʳ zero n i = refl
503+
splitAt-↑ʳ (suc m) n i rewrite splitAt-↑ʳ m n i = refl
500504

501505
splitAt-join : m n i splitAt m (join m n i) ≡ i
502-
splitAt-join m n (inj₁ x) = splitAt-inject+ m n x
503-
splitAt-join m n (inj₂ y) = splitAt-raise m n y
506+
splitAt-join m n (inj₁ x) = splitAt-↑ˡ m x n
507+
splitAt-join m n (inj₂ y) = splitAt-↑ʳ m n y
504508

505509
join-splitAt : m n i join m n (splitAt m i) ≡ i
506510
join-splitAt zero n i = refl
507511
join-splitAt (suc m) n zero = refl
508512
join-splitAt (suc m) n (suc i) = begin
509-
[ inject+ n , raise {n} (suc m) ]′ (splitAt (suc m) (suc i)) ≡⟨ [,]-map-commute (splitAt m i) ⟩
510-
[ suc ∘ (inject+ n) , suc ∘ (raise {n} m) ]′ (splitAt m i) ≡˘⟨ [,]-∘-distr suc (splitAt m i) ⟩
511-
suc ([ inject+ n , raise {n} m ]′ (splitAt m i)) ≡⟨ cong suc (join-splitAt m n i) ⟩
513+
[ _↑ˡ n , (suc m) ↑ʳ_ ]′ (splitAt (suc m) (suc i)) ≡⟨ [,]-map-commute (splitAt m i) ⟩
514+
[ suc ∘ (_↑ˡ n) , suc ∘ (m ↑ʳ_) ]′ (splitAt m i) ≡˘⟨ [,]-∘-distr suc (splitAt m i) ⟩
515+
suc ([ _↑ˡ n , m ↑ʳ_ ]′ (splitAt m i)) ≡⟨ cong suc (join-splitAt m n i) ⟩
512516
suc i ∎
513517
where open ≡-Reasoning
514518

@@ -537,8 +541,8 @@ splitAt-≥ (suc m) (suc i) (s≤s i≥m) = cong (Sum.map suc id) (splitAt-≥ m
537541
-- Fin (m * n) ↔ Fin m × Fin n
538542

539543
remQuot-combine : {n k} (x : Fin n) y remQuot k (combine x y) ≡ (x , y)
540-
remQuot-combine {suc n} {k} 0F y rewrite splitAt-inject+ k (n ℕ.* k) y = refl
541-
remQuot-combine {suc n} {k} (suc x) y rewrite splitAt-raise k (n ℕ.* k) (combine x y) = cong (Data.Product.map₁ suc) (remQuot-combine x y)
544+
remQuot-combine {suc n} {k} 0F y rewrite splitAt-↑ˡ k y (n ℕ.* k) = refl
545+
remQuot-combine {suc n} {k} (suc x) y rewrite splitAt-↑ʳ k (n ℕ.* k) (combine x y) = cong (Data.Product.map₁ suc) (remQuot-combine x y)
542546

543547
combine-remQuot : {n} k (i : Fin (n ℕ.* k)) uncurry combine (remQuot {n} k i) ≡ i
544548
combine-remQuot {suc n} k i with splitAt k i | P.inspect (splitAt k) i
@@ -548,10 +552,10 @@ combine-remQuot {suc n} k i with splitAt k i | P.inspect (splitAt k) i
548552
i ∎
549553
where open ≡-Reasoning
550554
... | inj₂ j | P.[ eq ] = begin
551-
raise {n ℕ.* k} k (uncurry combine (remQuot {n} k j)) ≡⟨ cong (raise k) (combine-remQuot {n} k j) ⟩
552-
join k (n ℕ.* k) (inj₂ j) ≡˘⟨ cong (join k (n ℕ.* k)) eq ⟩
553-
join k (n ℕ.* k) (splitAt k i) ≡⟨ join-splitAt k (n ℕ.* k) i ⟩
554-
i
555+
k ↑ʳ (uncurry combine (remQuot {n} k j)) ≡⟨ cong (k ↑ʳ_) (combine-remQuot {n} k j) ⟩
556+
join k (n ℕ.* k) (inj₂ j) ≡˘⟨ cong (join k (n ℕ.* k)) eq ⟩
557+
join k (n ℕ.* k) (splitAt k i) ≡⟨ join-splitAt k (n ℕ.* k) i ⟩
558+
i ∎
555559
where open ≡-Reasoning
556560

557561
------------------------------------------------------------------------
@@ -890,3 +894,33 @@ inject+-raise-splitAt = join-splitAt
890894
"Warning: decSetoid was deprecated in v1.5.
891895
Please use join-splitAt instead."
892896
#-}
897+
898+
-- Version 2.0
899+
900+
toℕ-raise = toℕ-↑ʳ
901+
{-# WARNING_ON_USAGE toℕ-raise
902+
"Warning: toℕ-raise was deprecated in v2.0.
903+
Please use toℕ-↑ʳ instead."
904+
#-}
905+
toℕ-inject+ : {m} n (i : Fin m) toℕ i ≡ toℕ (i ↑ˡ n)
906+
toℕ-inject+ n i = sym (toℕ-↑ˡ i n)
907+
{-# WARNING_ON_USAGE toℕ-inject+
908+
"Warning: toℕ-inject+ was deprecated in v2.0.
909+
Please use toℕ-↑ˡ instead.
910+
NB argument order has been flipped:
911+
the left-hand argument is the Fin m
912+
the right-hand is the Nat index increment."
913+
#-}
914+
splitAt-inject+ : m n i splitAt m (i ↑ˡ n) ≡ inj₁ i
915+
splitAt-inject+ m n i = splitAt-↑ˡ m i n
916+
{-# WARNING_ON_USAGE splitAt-inject+
917+
"Warning: splitAt-inject+ was deprecated in v2.0.
918+
Please use splitAt-↑ˡ instead.
919+
NB argument order has been flipped."
920+
#-}
921+
splitAt-raise : m n i splitAt m (m ↑ʳ i) ≡ inj₂ {B = Fin n} i
922+
splitAt-raise = splitAt-↑ʳ
923+
{-# WARNING_ON_USAGE splitAt-raise
924+
"Warning: splitAt-raise was deprecated in v2.0.
925+
Please use splitAt-↑ʳ instead."
926+
#-}

src/Data/Vec/Functional.agda

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,10 @@ unzip : ∀ {n} → Vector (A × B) n → Vector A n × Vector B n
138138
unzip = unzipWith id
139139

140140
take : m {n} Vector A (m ℕ.+ n) Vector A m
141-
take _ {n = n} xs = xs ∘ inject+ n
141+
take _ {n = n} xs = xs ∘ (_↑ˡ n)
142142

143143
drop : m {n} Vector A (m ℕ.+ n) Vector A n
144-
drop m xs = xs ∘ raise m
144+
drop m xs = xs ∘ (m ↑ʳ_)
145145

146146
reverse : {n} Vector A n Vector A n
147147
reverse xs = xs ∘ opposite

src/Data/Vec/Functional/Properties.agda

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -166,12 +166,12 @@ lookup-++-≥ : ∀ {m n} (xs : Vector A m) (ys : Vector A n) →
166166
lookup-++-≥ {m = m} xs ys i i≥m = cong Sum.[ xs , ys ] (Finₚ.splitAt-≥ m i i≥m)
167167

168168
lookup-++ˡ : {m n} (xs : Vector A m) (ys : Vector A n) i
169-
(xs ++ ys) (inject+ n i) ≡ xs i
170-
lookup-++ˡ {m = m} {n = n} xs ys i = cong Sum.[ xs , ys ] (Finₚ.splitAt-inject+ m n i)
169+
(xs ++ ys) (i ↑ˡ n) ≡ xs i
170+
lookup-++ˡ {m = m} {n = n} xs ys i = cong Sum.[ xs , ys ] (Finₚ.splitAt-↑ˡ m i n)
171171

172172
lookup-++ʳ : {m n} (xs : Vector A m) (ys : Vector A n) i
173-
(xs ++ ys) (raise m i) ≡ ys i
174-
lookup-++ʳ {m = m} {n = n} xs ys i = cong Sum.[ xs , ys ] (Finₚ.splitAt-raise m n i)
173+
(xs ++ ys) (m ↑ʳ i) ≡ ys i
174+
lookup-++ʳ {m = m} {n = n} xs ys i = cong Sum.[ xs , ys ] (Finₚ.splitAt-↑ʳ m n i)
175175

176176
module _ {m} {ys ys′ : Vector A m} where
177177

@@ -194,19 +194,19 @@ module _ {m} {ys ys′ : Vector A m} where
194194
++-injectiveˡ : {n} (xs xs′ : Vector A n)
195195
xs ++ ys ≗ xs′ ++ ys′ xs ≗ xs′
196196
++-injectiveˡ xs xs′ eq i = begin
197-
xs i ≡˘⟨ lookup-++ˡ xs ys i ⟩
198-
(xs ++ ys) (inject+ m i) ≡⟨ eq (inject+ m i) ⟩
199-
(xs′ ++ ys′) (inject+ m i) ≡⟨ lookup-++ˡ xs′ ys′ i ⟩
200-
xs′ i
197+
xs i ≡˘⟨ lookup-++ˡ xs ys i ⟩
198+
(xs ++ ys) (i ↑ˡ m) ≡⟨ eq (i ↑ˡ m) ⟩
199+
(xs′ ++ ys′) (i ↑ˡ m) ≡⟨ lookup-++ˡ xs′ ys′ i ⟩
200+
xs′ i ∎
201201
where open ≡-Reasoning
202202

203203
++-injectiveʳ : {n} (xs xs′ : Vector A n)
204204
xs ++ ys ≗ xs′ ++ ys′ ys ≗ ys′
205205
++-injectiveʳ {n} xs xs′ eq i = begin
206-
ys i ≡˘⟨ lookup-++ʳ xs ys i ⟩
207-
(xs ++ ys) (raise n i) ≡⟨ eq (raise n i) ⟩
208-
(xs′ ++ ys′) (raise n i) ≡⟨ lookup-++ʳ xs′ ys′ i ⟩
209-
ys′ i
206+
ys i ≡˘⟨ lookup-++ʳ xs ys i ⟩
207+
(xs ++ ys) (n ↑ʳ i) ≡⟨ eq (n ↑ʳ i) ⟩
208+
(xs′ ++ ys′) (n ↑ʳ i) ≡⟨ lookup-++ʳ xs′ ys′ i ⟩
209+
ys′ i ∎
210210
where open ≡-Reasoning
211211

212212
++-injective : {n} (xs xs′ : Vector A n)

src/Data/Vec/Functional/Relation/Binary/Pointwise/Properties.agda

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,13 +120,13 @@ module _ (R : REL A B r) where
120120

121121
++⁻ˡ : {m n} (xs : Vector A m) (ys : Vector B m) {xs′ ys′}
122122
Pointwise R (xs ++ xs′) (ys ++ ys′) Pointwise R xs ys
123-
++⁻ˡ {m} {n} _ _ rs i with rs (inject+ n i)
124-
... | r rewrite splitAt-inject+ m n i = r
123+
++⁻ˡ {m} {n} _ _ rs i with rs (i ↑ˡ n)
124+
... | r rewrite splitAt-↑ˡ m i n = r
125125

126126
++⁻ʳ : {m n} (xs : Vector A m) (ys : Vector B m) {xs′ ys′}
127127
Pointwise R (xs ++ xs′) (ys ++ ys′) Pointwise R xs′ ys′
128-
++⁻ʳ {m} {n} _ _ rs i with rs (raise m i)
129-
... | r rewrite splitAt-raise m n i = r
128+
++⁻ʳ {m} {n} _ _ rs i with rs (m ↑ʳ i)
129+
... | r rewrite splitAt-↑ʳ m n i = r
130130

131131
++⁻ : {m n} xs ys {xs′ ys′}
132132
Pointwise R (xs ++ xs′) (ys ++ ys′)

src/Data/Vec/Functional/Relation/Unary/All/Properties.agda

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,12 @@ module _ (P : Pred A p) {m n : ℕ} {xs : Vector A m} {ys : Vector A n} where
9797
module _ (P : Pred A p) {m n : ℕ} (xs : Vector A m) {ys : Vector A n} where
9898

9999
++⁻ˡ : All P (xs ++ ys) All P xs
100-
++⁻ˡ ps i with ps (inject+ n i)
101-
... | p rewrite splitAt-inject+ m n i = p
100+
++⁻ˡ ps i with ps (i ↑ˡ n)
101+
... | p rewrite splitAt-↑ˡ m i n = p
102102

103103
++⁻ʳ : All P (xs ++ ys) All P ys
104-
++⁻ʳ ps i with ps (raise m i)
105-
... | p rewrite splitAt-raise m n i = p
104+
++⁻ʳ ps i with ps (m ↑ʳ i)
105+
... | p rewrite splitAt-↑ʳ m n i = p
106106

107107
++⁻ : All P (xs ++ ys) All P xs × All P ys
108108
++⁻ ps = ++⁻ˡ ps , ++⁻ʳ ps

0 commit comments

Comments
 (0)