Documentation
Batteries
.
Data
.
Vector
.
Lemmas
Search
return to top
source
Imports
Init
Batteries.Data.Array.Basic
Batteries.Data.Array.Scan
Batteries.Data.List.Scan
Batteries.Data.Vector.Basic
Imported by
Vector
.
toArray_injective
Vector
.
get_mk
Vector
.
getD_mk
Vector
.
uget_mk
Vector
.
tail_eq_of_zero
Vector
.
tail_eq_of_ne_zero
Vector
.
toList_tail
Vector
.
getElem_tail
Vector
.
get_eq_getElem
Vector
.
get_push_last
Vector
.
get_push_castSucc
Vector
.
get_map
Vector
.
get_reverse
Vector
.
get_replicate
Vector
.
get_range
Vector
.
get_ofFn
Vector
.
get_cast
Vector
.
get_tail
Vector
.
finIdxOf?_empty
Vector
.
finIdxOf?_eq_none_iff
Vector
.
finIdxOf?_eq_some_iff
Vector
.
isSome_finIdxOf?
Vector
.
isNone_finIdxOf?
Vector
.
toArray_scanlM
Vector
.
toArray_scanrM
Vector
.
toList_scanlM
Vector
.
toList_scanrM
Vector
.
scanlM_empty
Vector
.
scanrM_empty
Vector
.
scanlM_reverse
Vector
.
scanlM_pure
Vector
.
scanrM_pure
Vector
.
idRun_scanlM
Vector
.
idRun_scanrM
Vector
.
scanlM_map
Vector
.
scanrM_map
Vector
.
scanl_eq_scanlM
Vector
.
scanr_eq_scanrM
Vector
.
toArray_scanl
Vector
.
toArray_scanr
Vector
.
toList_scanl
Vector
.
toList_scanr
Vector
.
scanl_empty
Vector
.
scanr_empty
Vector
.
scanl_singleton
Vector
.
getElem_scanl
Vector
.
getElem_scanr
Vector
.
getElem?_scanl
Vector
.
getElem?_scanr
Vector
.
getElem_scanl_zero
Vector
.
getElem_scanr_zero
Vector
.
getElem?_scanl_zero
Vector
.
getElem?_scanr_zero
Vector
.
getElem?_succ_scanl
Vector
.
getElem_succ_scanl
Vector
.
scanl_push
Vector
.
scanr_push
Vector
.
scanl_map
Vector
.
scanr_map
Vector
.
scanl_reverse
Vector
.
scanr_reverse
Vector
.
back_scanl
Vector
.
back_scanr
Vector
.
back?_scanl
Vector
.
back?_scanr
source
theorem
Vector
.
toArray_injective
{
α
:
Type
u_1}
{
n
:
Nat
}
{
v
w
:
Vector
α
n
}
:
v
.
toArray
=
w
.
toArray
→
v
=
w
mk lemmas
#
source
@[simp]
theorem
Vector
.
get_mk
{
α
:
Type
u_1}
{
n
:
Nat
}
(
a
:
Array
α
)
(
h
:
a
.
size
=
n
)
(
i
:
Fin
n
)
:
(
mk
a
h
)
.
get
i
=
a
[
i
]
source
@[simp]
theorem
Vector
.
getD_mk
{
α
:
Type
u_1}
{
n
:
Nat
}
(
a
:
Array
α
)
(
h
:
a
.
size
=
n
)
(
i
:
Nat
)
(
x
:
α
)
:
(
mk
a
h
)
.
getD
i
x
=
a
.
getD
i
x
source
@[simp]
theorem
Vector
.
uget_mk
{
α
:
Type
u_1}
{
n
:
Nat
}
(
a
:
Array
α
)
(
h
:
a
.
size
=
n
)
(
i
:
USize
)
(
hi
:
i
.
toNat
<
n
)
:
(
mk
a
h
)
.
uget
i
hi
=
a
.
uget
i
⋯
tail lemmas
#
source
theorem
Vector
.
tail_eq_of_zero
{
α
:
Type
u_1}
{
v
:
Vector
α
0
}
:
v
.
tail
=
#v[
]
source
theorem
Vector
.
tail_eq_of_ne_zero
{
n
:
Nat
}
{
α
:
Type
u_1}
[
NeZero
n
]
{
v
:
Vector
α
n
}
:
v
.
tail
=
v
.
eraseIdx
0
⋯
source
theorem
Vector
.
toList_tail
{
α
:
Type
u_1}
{
n
:
Nat
}
{
v
:
Vector
α
n
}
:
v
.
tail
.
toList
=
v
.
toList
.
tail
getElem lemmas
#
source
theorem
Vector
.
getElem_tail
{
α
:
Type
u_1}
{
n
:
Nat
}
{
v
:
Vector
α
n
}
{
i
:
Nat
}
(
hi
:
i
<
n
-
1
)
:
v
.
tail
[
i
]
=
v
[
i
+
1
]
get lemmas
#
source
theorem
Vector
.
get_eq_getElem
{
α
:
Type
u_1}
{
n
:
Nat
}
(
v
:
Vector
α
n
)
(
i
:
Fin
n
)
:
v
.
get
i
=
v
[
↑
i
]
source
@[simp]
theorem
Vector
.
get_push_last
{
α
:
Type
u_1}
{
n
:
Nat
}
(
v
:
Vector
α
n
)
(
a
:
α
)
:
(
v
.
push
a
)
.
get
(
Fin.last
n
)
=
a
source
@[simp]
theorem
Vector
.
get_push_castSucc
{
α
:
Type
u_1}
{
n
:
Nat
}
(
v
:
Vector
α
n
)
(
a
:
α
)
(
i
:
Fin
n
)
:
(
v
.
push
a
)
.
get
i
.
castSucc
=
v
.
get
i
source
@[simp]
theorem
Vector
.
get_map
{
α
:
Type
u_1}
{
n
:
Nat
}
{
β
:
Type
u_2}
(
v
:
Vector
α
n
)
(
f
:
α
→
β
)
(
i
:
Fin
n
)
:
(
map
f
v
)
.
get
i
=
f
(
v
.
get
i
)
source
@[simp]
theorem
Vector
.
get_reverse
{
α
:
Type
u_1}
{
n
:
Nat
}
(
v
:
Vector
α
n
)
(
i
:
Fin
n
)
:
v
.
reverse
.
get
i
=
v
.
get
i
.
rev
source
@[simp]
theorem
Vector
.
get_replicate
{
α
:
Type
u_1}
(
n
:
Nat
)
(
a
:
α
)
(
i
:
Fin
n
)
:
(
replicate
n
a
)
.
get
i
=
a
source
@[simp]
theorem
Vector
.
get_range
(
n
:
Nat
)
(
i
:
Fin
n
)
:
(
range
n
)
.
get
i
=
↑
i
source
@[simp]
theorem
Vector
.
get_ofFn
{
n
:
Nat
}
{
α
:
Type
u_1}
(
f
:
Fin
n
→
α
)
(
i
:
Fin
n
)
:
(
ofFn
f
)
.
get
i
=
f
i
source
@[simp]
theorem
Vector
.
get_cast
{
α
:
Type
u_1}
{
m
n
:
Nat
}
(
v
:
Vector
α
m
)
(
h
:
m
=
n
)
(
i
:
Fin
n
)
:
(
Vector.cast
h
v
)
.
get
i
=
v
.
get
(
Fin.cast
⋯
i
)
source
theorem
Vector
.
get_tail
{
α
:
Type
u_1}
{
n
:
Nat
}
(
v
:
Vector
α
(
n
+
1
)
)
(
i
:
Fin
n
)
:
v
.
tail
.
get
i
=
v
.
get
i
.
succ
finIdxOf? lemmas
#
source
@[simp]
theorem
Vector
.
finIdxOf?_empty
{
α
:
Type
u_1}
{
a
:
α
}
[
BEq
α
]
(
v
:
Vector
α
0
)
:
v
.
finIdxOf?
a
=
none
source
@[simp]
theorem
Vector
.
finIdxOf?_eq_none_iff
{
α
:
Type
u_1}
{
n
:
Nat
}
[
BEq
α
]
[
LawfulBEq
α
]
{
v
:
Vector
α
n
}
{
a
:
α
}
:
v
.
finIdxOf?
a
=
none
↔
¬
a
∈
v
source
@[simp]
theorem
Vector
.
finIdxOf?_eq_some_iff
{
α
:
Type
u_1}
{
n
:
Nat
}
[
BEq
α
]
[
LawfulBEq
α
]
{
v
:
Vector
α
n
}
{
a
:
α
}
{
i
:
Fin
n
}
:
v
.
finIdxOf?
a
=
some
i
↔
v
.
get
i
=
a
∧
∀ (
j
:
Fin
n
),
j
<
i
→
¬
v
.
get
j
=
a
source
@[simp]
theorem
Vector
.
isSome_finIdxOf?
{
α
:
Type
u_1}
{
n
:
Nat
}
[
BEq
α
]
[
PartialEquivBEq
α
]
{
v
:
Vector
α
n
}
{
a
:
α
}
:
(
v
.
finIdxOf?
a
)
.
isSome
=
v
.
contains
a
source
@[simp]
theorem
Vector
.
isNone_finIdxOf?
{
α
:
Type
u_1}
{
n
:
Nat
}
[
BEq
α
]
[
PartialEquivBEq
α
]
{
v
:
Vector
α
n
}
{
a
:
α
}
:
(
v
.
finIdxOf?
a
)
.
isNone
=
!
v
.
contains
a
source
theorem
Vector
.
toArray_scanlM
{
m
:
Type
u_1 →
Type
u_2
}
{
β
:
Type
u_1}
{
α
:
Type
u_3}
{
n
:
Nat
}
{
init
:
β
}
[
Monad
m
]
[
LawfulMonad
m
]
{
f
:
β
→
α
→
m
β
}
{
as
:
Vector
α
n
}
:
toArray
<$>
scanlM
f
init
as
=
Array.scanlM
f
init
as
.
toArray
source
theorem
Vector
.
toArray_scanrM
{
m
:
Type
u_1 →
Type
u_2
}
{
α
:
Type
u_3}
{
β
:
Type
u_1}
{
n
:
Nat
}
{
init
:
β
}
[
Monad
m
]
[
LawfulMonad
m
]
{
f
:
α
→
β
→
m
β
}
{
as
:
Vector
α
n
}
:
toArray
<$>
scanrM
f
init
as
=
Array.scanrM
f
init
as
.
toArray
scanlM/scanrM lemmas
#
source
@[simp]
theorem
Vector
.
toList_scanlM
{
m
:
Type
u_1 →
Type
u_2
}
{
β
:
Type
u_1}
{
α
:
Type
u_3}
{
n
:
Nat
}
{
init
:
β
}
[
Monad
m
]
[
LawfulMonad
m
]
{
f
:
β
→
α
→
m
β
}
{
as
:
Vector
α
n
}
:
toList
<$>
scanlM
f
init
as
=
List.scanlM
f
init
as
.
toList
source
@[simp]
theorem
Vector
.
toList_scanrM
{
m
:
Type
u_1 →
Type
u_2
}
{
α
:
Type
u_3}
{
β
:
Type
u_1}
{
n
:
Nat
}
{
init
:
β
}
[
Monad
m
]
[
LawfulMonad
m
]
{
f
:
α
→
β
→
m
β
}
{
as
:
Vector
α
n
}
:
toList
<$>
scanrM
f
init
as
=
List.scanrM
f
init
as
.
toList
source
@[simp]
theorem
Vector
.
scanlM_empty
{
m
:
Type
u_1 →
Type
u_2
}
{
β
:
Type
u_1}
{
α
:
Type
u_3}
{
init
:
β
}
[
Monad
m
]
[
LawfulMonad
m
]
{
f
:
β
→
α
→
m
β
}
:
scanlM
f
init
#v[
]
=
pure
#v[
init
]
source
@[simp]
theorem
Vector
.
scanrM_empty
{
m
:
Type
u_1 →
Type
u_2
}
{
α
:
Type
u_3}
{
β
:
Type
u_1}
{
init
:
β
}
[
Monad
m
]
[
LawfulMonad
m
]
{
f
:
α
→
β
→
m
β
}
:
scanrM
f
init
#v[
]
=
pure
#v[
init
]
source
theorem
Vector
.
scanlM_reverse
{
m
:
Type
u_1 →
Type
u_2
}
{
β
:
Type
u_1}
{
α
:
Type
u_3}
{
n
:
Nat
}
{
init
:
β
}
[
Monad
m
]
[
LawfulMonad
m
]
{
f
:
β
→
α
→
m
β
}
{
as
:
Vector
α
n
}
:
scanlM
f
init
as
.
reverse
=
reverse
<$>
scanrM
(
flip
f
)
init
as
source
@[simp]
theorem
Vector
.
scanlM_pure
{
m
:
Type
u_1 →
Type
u_2
}
{
β
:
Type
u_1}
{
α
:
Type
u_3}
{
n
:
Nat
}
{
init
:
β
}
[
Monad
m
]
[
LawfulMonad
m
]
{
f
:
β
→
α
→
β
}
{
as
:
Vector
α
n
}
:
scanlM
(fun (
x1
:
β
) (
x2
:
α
) =>
pure
(
f
x1
x2
)
)
init
as
=
pure
(
scanl
f
init
as
)
source
@[simp]
theorem
Vector
.
scanrM_pure
{
m
:
Type
u_1 →
Type
u_2
}
{
α
:
Type
u_3}
{
β
:
Type
u_1}
{
n
:
Nat
}
{
init
:
β
}
[
Monad
m
]
[
LawfulMonad
m
]
{
f
:
α
→
β
→
β
}
{
as
:
Vector
α
n
}
:
scanrM
(fun (
x1
:
α
) (
x2
:
β
) =>
pure
(
f
x1
x2
)
)
init
as
=
pure
(
scanr
f
init
as
)
source
theorem
Vector
.
idRun_scanlM
{
β
:
Type
u_1}
{
α
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
β
→
α
→
Id
β
}
{
as
:
Vector
α
n
}
:
(
scanlM
f
init
as
)
.
run
=
scanl
(fun (
x1
:
β
) (
x2
:
α
) =>
(
f
x1
x2
)
.
run
)
init
as
source
theorem
Vector
.
idRun_scanrM
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
α
→
β
→
Id
β
}
{
as
:
Vector
α
n
}
:
(
scanrM
f
init
as
)
.
run
=
scanr
(fun (
x1
:
α
) (
x2
:
β
) =>
(
f
x1
x2
)
.
run
)
init
as
source
theorem
Vector
.
scanlM_map
{
m
:
Type
u_1 →
Type
u_2
}
{
α₁
:
Type
u_3}
{
α₂
:
Type
u_4}
{
β
:
Type
u_1}
{
n
:
Nat
}
{
init
:
β
}
[
Monad
m
]
[
LawfulMonad
m
]
{
f
:
α₁
→
α₂
}
{
g
:
β
→
α₂
→
m
β
}
{
as
:
Vector
α₁
n
}
:
scanlM
g
init
(
map
f
as
)
=
scanlM
(fun (
x1
:
β
) (
x2
:
α₁
) =>
g
x1
(
f
x2
)
)
init
as
source
theorem
Vector
.
scanrM_map
{
m
:
Type
u_1 →
Type
u_2
}
{
α₁
:
Type
u_3}
{
α₂
:
Type
u_4}
{
β
:
Type
u_1}
{
n
:
Nat
}
{
init
:
β
}
[
Monad
m
]
[
LawfulMonad
m
]
{
f
:
α₁
→
α₂
}
{
g
:
α₂
→
β
→
m
β
}
{
as
:
Vector
α₁
n
}
:
scanrM
g
init
(
map
f
as
)
=
scanrM
(fun (
a
:
α₁
) (
b
:
β
) =>
g
(
f
a
)
b
)
init
as
scanl/scanr lemmas
#
source
theorem
Vector
.
scanl_eq_scanlM
{
β
:
Type
u_1}
{
α
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
β
→
α
→
β
}
{
as
:
Vector
α
n
}
:
scanl
f
init
as
=
(
scanlM
(fun (
x1
:
β
) (
x2
:
α
) =>
pure
(
f
x1
x2
)
)
init
as
)
.
run
source
theorem
Vector
.
scanr_eq_scanrM
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
α
→
β
→
β
}
{
as
:
Vector
α
n
}
:
scanr
f
init
as
=
(
scanrM
(fun (
x1
:
α
) (
x2
:
β
) =>
pure
(
f
x1
x2
)
)
init
as
)
.
run
source
theorem
Vector
.
toArray_scanl
{
β
:
Type
u_1}
{
α
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
β
→
α
→
β
}
{
as
:
Vector
α
n
}
:
(
scanl
f
init
as
)
.
toArray
=
Array.scanl
f
init
as
.
toArray
source
theorem
Vector
.
toArray_scanr
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
α
→
β
→
β
}
{
as
:
Vector
α
n
}
:
(
scanr
f
init
as
)
.
toArray
=
Array.scanr
f
init
as
.
toArray
source
@[simp]
theorem
Vector
.
toList_scanl
{
β
:
Type
u_1}
{
α
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
β
→
α
→
β
}
{
as
:
Vector
α
n
}
:
(
scanl
f
init
as
)
.
toList
=
List.scanl
f
init
as
.
toList
source
@[simp]
theorem
Vector
.
toList_scanr
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
α
→
β
→
β
}
{
as
:
Vector
α
n
}
:
(
scanr
f
init
as
)
.
toList
=
List.scanr
f
init
as
.
toList
source
theorem
Vector
.
scanl_empty
{
β
:
Type
u_1}
{
α
:
Type
u_2}
{
init
:
β
}
{
f
:
β
→
α
→
β
}
:
scanl
f
init
#v[
]
=
#v[
init
]
source
theorem
Vector
.
scanr_empty
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
init
:
β
}
{
f
:
α
→
β
→
β
}
:
scanr
f
init
#v[
]
=
#v[
init
]
source
theorem
Vector
.
scanl_singleton
{
β
:
Type
u_1}
{
α
:
Type
u_2}
{
init
:
β
}
{
f
:
β
→
α
→
β
}
{
a
:
α
}
:
scanl
f
init
#v[
a
]
=
#v[
init
,
f
init
a
]
source
@[simp]
theorem
Vector
.
getElem_scanl
{
β
:
Type
u_1}
{
α
:
Type
u_2}
{
n
i
:
Nat
}
{
init
:
β
}
{
f
:
β
→
α
→
β
}
{
as
:
Vector
α
n
}
(
h
:
i
<
n
+
1
)
:
(
scanl
f
init
as
)
[
i
]
=
foldl
f
init
(
as
.
take
i
)
source
@[simp]
theorem
Vector
.
getElem_scanr
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
n
i
:
Nat
}
{
init
:
β
}
{
f
:
α
→
β
→
β
}
{
as
:
Vector
α
n
}
(
h
:
i
<
n
+
1
)
:
(
scanr
f
init
as
)
[
i
]
=
foldr
f
init
(
as
.
drop
i
)
source
theorem
Vector
.
getElem?_scanl
{
β
:
Type
u_1}
{
α
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
i
:
Nat
}
{
f
:
β
→
α
→
β
}
{
as
:
Vector
α
n
}
:
(
scanl
f
init
as
)
[
i
]
?
=
if
i
≤
n
then
some
(
foldl
f
init
(
as
.
take
i
)
)
else
none
source
theorem
Vector
.
getElem?_scanr
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
i
:
Nat
}
{
f
:
α
→
β
→
β
}
{
as
:
Vector
α
n
}
:
(
scanr
f
init
as
)
[
i
]
?
=
if
i
<
n
+
1
then
some
(
foldr
f
init
(
as
.
drop
i
)
)
else
none
source
theorem
Vector
.
getElem_scanl_zero
{
β
:
Type
u_1}
{
α
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
β
→
α
→
β
}
{
as
:
Vector
α
n
}
:
(
scanl
f
init
as
)
[
0
]
=
init
source
theorem
Vector
.
getElem_scanr_zero
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
α
→
β
→
β
}
{
as
:
Vector
α
n
}
:
(
scanr
f
init
as
)
[
0
]
=
foldr
f
init
as
source
theorem
Vector
.
getElem?_scanl_zero
{
β
:
Type
u_1}
{
α
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
β
→
α
→
β
}
{
as
:
Vector
α
n
}
:
(
scanl
f
init
as
)
[
0
]
?
=
some
init
source
theorem
Vector
.
getElem?_scanr_zero
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
α
→
β
→
β
}
{
as
:
Vector
α
n
}
:
(
scanr
f
init
as
)
[
0
]
?
=
some
(
foldr
f
init
as
)
source
theorem
Vector
.
getElem?_succ_scanl
{
β
:
Type
u_1}
{
α
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
i
:
Nat
}
{
f
:
β
→
α
→
β
}
{
as
:
Vector
α
n
}
:
(
scanl
f
init
as
)
[
i
+
1
]
?
=
(
scanl
f
init
as
)
[
i
]
?
.
bind
fun (
x
:
β
) =>
Option.map
(fun (
y
:
α
) =>
f
x
y
)
as
[
i
]
?
source
theorem
Vector
.
getElem_succ_scanl
{
β
:
Type
u_1}
{
α
:
Type
u_2}
{
n
i
:
Nat
}
{
init
:
β
}
{
f
:
β
→
α
→
β
}
{
as
:
Vector
α
n
}
(
h
:
i
+
1
<
n
+
1
)
:
(
scanl
f
init
as
)
[
i
+
1
]
=
f
(
scanl
f
init
as
)
[
i
]
as
[
i
]
source
theorem
Vector
.
scanl_push
{
β
:
Type
u_1}
{
α
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
β
→
α
→
β
}
{
as
:
Vector
α
n
}
{
a
:
α
}
:
scanl
f
init
(
as
.
push
a
)
=
(
scanl
f
init
as
)
.
push
(
f
(
foldl
f
init
as
)
a
)
source
theorem
Vector
.
scanr_push
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
α
→
β
→
β
}
{
as
:
Vector
α
n
}
{
a
:
α
}
:
scanr
f
init
(
as
.
push
a
)
=
(
scanr
f
(
f
a
init
)
as
)
.
push
init
source
theorem
Vector
.
scanl_map
{
γ
:
Type
u_1}
{
β
:
Type
u_2}
{
α
:
Type
u_3}
{
n
:
Nat
}
{
init
:
γ
}
{
f
:
γ
→
β
→
γ
}
{
g
:
α
→
β
}
{
as
:
Vector
α
n
}
:
scanl
f
init
(
map
g
as
)
=
scanl
(fun (
x1
:
γ
) (
x2
:
α
) =>
f
x1
(
g
x2
)
)
init
as
source
theorem
Vector
.
scanr_map
{
β
:
Type
u_1}
{
γ
:
Type
u_2}
{
α
:
Type
u_3}
{
n
:
Nat
}
{
init
:
γ
}
{
f
:
β
→
γ
→
γ
}
{
g
:
α
→
β
}
{
as
:
Vector
α
n
}
:
scanr
f
init
(
map
g
as
)
=
scanr
(fun (
x
:
α
) (
acc
:
γ
) =>
f
(
g
x
)
acc
)
init
as
source
theorem
Vector
.
scanl_reverse
{
β
:
Type
u_1}
{
α
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
β
→
α
→
β
}
{
as
:
Vector
α
n
}
:
scanl
f
init
as
.
reverse
=
(
scanr
(
flip
f
)
init
as
)
.
reverse
source
theorem
Vector
.
scanr_reverse
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
α
→
β
→
β
}
{
as
:
Vector
α
n
}
:
scanr
f
init
as
.
reverse
=
(
scanl
(
flip
f
)
init
as
)
.
reverse
source
@[simp]
theorem
Vector
.
back_scanl
{
β
:
Type
u_1}
{
α
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
β
→
α
→
β
}
{
as
:
Vector
α
n
}
:
(
scanl
f
init
as
)
.
back
=
foldl
f
init
as
source
@[simp]
theorem
Vector
.
back_scanr
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
α
→
β
→
β
}
{
as
:
Vector
α
n
}
:
(
scanr
f
init
as
)
.
back
=
init
source
theorem
Vector
.
back?_scanl
{
β
:
Type
u_1}
{
α
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
β
→
α
→
β
}
{
as
:
Vector
α
n
}
:
(
scanl
f
init
as
)
.
back?
=
some
(
foldl
f
init
as
)
source
theorem
Vector
.
back?_scanr
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
n
:
Nat
}
{
init
:
β
}
{
f
:
α
→
β
→
β
}
{
as
:
Vector
α
n
}
:
(
scanr
f
init
as
)
.
back?
=
some
init