Documentation
Mathlib
.
Data
.
List
.
Scan
Search
return to top
source
Imports
Init
Mathlib.Order.Basic
Batteries.Data.List.Basic
Mathlib.Data.Nat.Basic
Mathlib.Data.Option.Basic
Imported by
List
.
length_scanl
List
.
scanl_nil
List
.
scanl_ne_nil
List
.
scanl_iff_nil
List
.
scanl_cons
List
.
getElem?_scanl_zero
List
.
getElem_scanl_zero
List
.
head_scanl
List
.
getElem?_succ_scanl
List
.
getElem_succ_scanl
List
.
scanr_nil
List
.
scanr_ne_nil
List
.
scanr_cons
List
.
scanr_iff_nil
List
.
length_scanr
List
.
scanr_append
List
.
head_scanr
List
.
tail_scanr
List
.
drop_scanr
List
.
getElem_scanr_zero
List
.
getElem?_scanr_zero
List
.
getElem_scanr
List
.
getElem?_scanr
List
.
getElem?_scanr_of_lt
List scan
#
Prove basic results about
List.scanl
and
List.scanr
.
List.scanl
#
source
@[simp]
theorem
List
.
length_scanl
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
f
:
β
→
α
→
β
}
(
b
:
β
)
(
l
:
List
α
)
:
(
scanl
f
b
l
)
.
length
=
l
.
length
+
1
source
@[simp]
theorem
List
.
scanl_nil
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
f
:
β
→
α
→
β
}
(
b
:
β
)
:
scanl
f
b
[
]
=
[
b
]
source
@[simp]
theorem
List
.
scanl_ne_nil
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
f
:
β
→
α
→
β
}
{
b
:
β
}
{
l
:
List
α
}
:
scanl
f
b
l
≠
[
]
source
@[simp]
theorem
List
.
scanl_iff_nil
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
f
:
β
→
α
→
β
}
{
b
:
β
}
{
l
:
List
α
}
(
c
:
β
)
:
scanl
f
b
l
=
[
c
]
↔
c
=
b
∧
l
=
[
]
source
@[simp]
theorem
List
.
scanl_cons
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
f
:
β
→
α
→
β
}
{
b
:
β
}
{
a
:
α
}
{
l
:
List
α
}
:
scanl
f
b
(
a
::
l
)
=
[
b
]
++
scanl
f
(
f
b
a
)
l
source
theorem
List
.
getElem?_scanl_zero
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
f
:
β
→
α
→
β
}
{
b
:
β
}
{
l
:
List
α
}
:
(
scanl
f
b
l
)
[
0
]
?
=
some
b
source
@[simp]
theorem
List
.
getElem_scanl_zero
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
f
:
β
→
α
→
β
}
{
b
:
β
}
{
l
:
List
α
}
:
(
scanl
f
b
l
)
[
0
]
=
b
source
@[simp]
theorem
List
.
head_scanl
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
f
:
β
→
α
→
β
}
{
b
:
β
}
{
l
:
List
α
}
(
h
:
scanl
f
b
l
≠
[
]
)
:
(
scanl
f
b
l
)
.
head
h
=
b
source
theorem
List
.
getElem?_succ_scanl
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
f
:
β
→
α
→
β
}
{
b
:
β
}
{
l
:
List
α
}
{
i
:
ℕ
}
:
(
scanl
f
b
l
)
[
i
+
1
]
?
=
(
scanl
f
b
l
)
[
i
]
?
.
bind
fun (
x
:
β
) =>
Option.map
(fun (
y
:
α
) =>
f
x
y
)
l
[
i
]
?
source
theorem
List
.
getElem_succ_scanl
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
f
:
β
→
α
→
β
}
{
b
:
β
}
{
l
:
List
α
}
{
i
:
ℕ
}
(
h
:
i
+
1
<
(
scanl
f
b
l
)
.
length
)
:
(
scanl
f
b
l
)
[
i
+
1
]
=
f
(
scanl
f
b
l
)
[
i
]
l
[
i
]
List.scanr
#
source
@[simp]
theorem
List
.
scanr_nil
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
f
:
α
→
β
→
β
}
(
b
:
β
)
:
scanr
f
b
[
]
=
[
b
]
source
@[simp]
theorem
List
.
scanr_ne_nil
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
b
:
β
}
{
l
:
List
α
}
{
f
:
α
→
β
→
β
}
:
scanr
f
b
l
≠
[
]
source
@[simp]
theorem
List
.
scanr_cons
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
b
:
β
}
{
a
:
α
}
{
l
:
List
α
}
{
f
:
α
→
β
→
β
}
:
scanr
f
b
(
a
::
l
)
=
foldr
f
b
(
a
::
l
)
::
scanr
f
b
l
source
@[simp]
theorem
List
.
scanr_iff_nil
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
b
:
β
}
{
l
:
List
α
}
{
f
:
α
→
β
→
β
}
(
c
:
β
)
:
scanr
f
b
l
=
[
c
]
↔
c
=
b
∧
l
=
[
]
source
@[simp]
theorem
List
.
length_scanr
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
f
:
α
→
β
→
β
}
(
b
:
β
)
(
l
:
List
α
)
:
(
scanr
f
b
l
)
.
length
=
l
.
length
+
1
source
theorem
List
.
scanr_append
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
b
:
β
}
{
f
:
α
→
β
→
β
}
(
l₁
l₂
:
List
α
)
:
scanr
f
b
(
l₁
++
l₂
)
=
scanr
f
(
foldr
f
b
l₂
)
l₁
++
(
scanr
f
b
l₂
)
.
tail
source
@[simp]
theorem
List
.
head_scanr
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
b
:
β
}
{
l
:
List
α
}
{
f
:
α
→
β
→
β
}
(
h
:
scanr
f
b
l
≠
[
]
)
:
(
scanr
f
b
l
)
.
head
h
=
foldr
f
b
l
source
theorem
List
.
tail_scanr
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
b
:
β
}
{
l
:
List
α
}
{
f
:
α
→
β
→
β
}
(
h
:
0
<
l
.
length
)
:
(
scanr
f
b
l
)
.
tail
=
scanr
f
b
l
.
tail
source
theorem
List
.
drop_scanr
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
b
:
β
}
{
l
:
List
α
}
{
f
:
α
→
β
→
β
}
{
i
:
ℕ
}
(
h
:
i
≤
l
.
length
)
:
drop
i
(
scanr
f
b
l
)
=
scanr
f
b
(
drop
i
l
)
source
@[simp]
theorem
List
.
getElem_scanr_zero
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
b
:
β
}
{
l
:
List
α
}
{
f
:
α
→
β
→
β
}
:
(
scanr
f
b
l
)
[
0
]
=
foldr
f
b
l
source
theorem
List
.
getElem?_scanr_zero
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
b
:
β
}
{
l
:
List
α
}
{
f
:
α
→
β
→
β
}
:
(
scanr
f
b
l
)
[
0
]
?
=
some
(
foldr
f
b
l
)
source
theorem
List
.
getElem_scanr
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
b
:
β
}
{
l
:
List
α
}
{
f
:
α
→
β
→
β
}
{
i
:
ℕ
}
(
h
:
i
<
(
scanr
f
b
l
)
.
length
)
:
(
scanr
f
b
l
)
[
i
]
=
foldr
f
b
(
drop
i
l
)
source
theorem
List
.
getElem?_scanr
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
b
:
β
}
{
l
:
List
α
}
{
f
:
α
→
β
→
β
}
{
i
:
ℕ
}
(
h
:
i
<
l
.
length
+
1
)
:
(
scanr
f
b
l
)
[
i
]
?
=
if
i
<
l
.
length
+
1
then
some
(
foldr
f
b
(
drop
i
l
)
)
else
none
source
theorem
List
.
getElem?_scanr_of_lt
{
α
:
Type
u_1}
{
β
:
Type
u_2}
{
b
:
β
}
{
l
:
List
α
}
{
f
:
α
→
β
→
β
}
{
i
:
ℕ
}
(
h
:
i
<
l
.
length
+
1
)
:
(
scanr
f
b
l
)
[
i
]
?
=
some
(
foldr
f
b
(
drop
i
l
)
)