Documentation
Init
.
Data
.
Vector
.
Count
Search
return to top
source
Imports
Init.Data.Array.Count
Init.Data.Vector.Lemmas
Imported by
Vector
.
countP_empty
Vector
.
countP_push_of_pos
Vector
.
countP_push_of_neg
Vector
.
countP_push
Vector
.
countP_singleton
Vector
.
size_eq_countP_add_countP
Vector
.
countP_le_size
Vector
.
countP_append
Vector
.
countP_pos_iff
Vector
.
one_le_countP_iff
Vector
.
countP_eq_zero
Vector
.
countP_eq_size
Vector
.
countP_cast
Vector
.
countP_mkVector
Vector
.
boole_getElem_le_countP
Vector
.
countP_set
Vector
.
countP_true
Vector
.
countP_false
Vector
.
countP_map
Vector
.
countP_flatten
Vector
.
countP_flatMap
Vector
.
countP_reverse
Vector
.
countP_mono_left
Vector
.
countP_congr
Vector
.
count_empty
Vector
.
count_push
Vector
.
count_eq_countP
Vector
.
count_eq_countP'
Vector
.
count_le_size
Vector
.
count_le_count_push
Vector
.
count_singleton
Vector
.
count_append
Vector
.
count_flatten
Vector
.
count_reverse
Vector
.
boole_getElem_le_count
Vector
.
count_set
Vector
.
count_cast
Vector
.
count_push_self
Vector
.
count_push_of_ne
Vector
.
count_singleton_self
Vector
.
count_pos_iff
Vector
.
one_le_count_iff
Vector
.
count_eq_zero_of_not_mem
Vector
.
not_mem_of_count_eq_zero
Vector
.
count_eq_zero
Vector
.
count_eq_size
Vector
.
count_mkVector_self
Vector
.
count_mkVector
Vector
.
count_le_count_map
Vector
.
count_flatMap
Lemmas about
Vector.countP
and
Vector.count
.
#
countP
#
source
@[simp]
theorem
Vector
.
countP_empty
{
α
:
Type
u_1}
(
p
:
α
→
Bool
)
:
countP
p
{
toArray
:=
#[
]
,
size_toArray
:=
⋯
}
=
0
source
@[simp]
theorem
Vector
.
countP_push_of_pos
{
α
:
Type
u_1}
(
p
:
α
→
Bool
)
{
n
:
Nat
}
{
a
:
α
}
(
xs
:
Vector
α
n
)
(
pa
:
p
a
=
true
)
:
countP
p
(
xs
.
push
a
)
=
countP
p
xs
+
1
source
@[simp]
theorem
Vector
.
countP_push_of_neg
{
α
:
Type
u_1}
(
p
:
α
→
Bool
)
{
n
:
Nat
}
{
a
:
α
}
(
xs
:
Vector
α
n
)
(
pa
:
¬
p
a
=
true
)
:
countP
p
(
xs
.
push
a
)
=
countP
p
xs
source
theorem
Vector
.
countP_push
{
α
:
Type
u_1}
(
p
:
α
→
Bool
)
{
n
:
Nat
}
(
a
:
α
)
(
xs
:
Vector
α
n
)
:
countP
p
(
xs
.
push
a
)
=
countP
p
xs
+
if
p
a
=
true
then
1
else
0
source
@[simp]
theorem
Vector
.
countP_singleton
{
α
:
Type
u_1}
(
p
:
α
→
Bool
)
(
a
:
α
)
:
countP
p
{
toArray
:=
#[
a
]
,
size_toArray
:=
⋯
}
=
if
p
a
=
true
then
1
else
0
source
theorem
Vector
.
size_eq_countP_add_countP
{
α
:
Type
u_1}
(
p
:
α
→
Bool
)
{
n
:
Nat
}
(
xs
:
Vector
α
n
)
:
n
=
countP
p
xs
+
countP
(fun (
a
:
α
) =>
decide
¬
p
a
=
true
)
xs
source
theorem
Vector
.
countP_le_size
{
α
:
Type
u_1}
(
p
:
α
→
Bool
)
{
n
:
Nat
}
{
xs
:
Vector
α
n
}
:
countP
p
xs
≤
n
source
@[simp]
theorem
Vector
.
countP_append
{
α
:
Type
u_1}
(
p
:
α
→
Bool
)
{
n
m
:
Nat
}
(
xs
:
Vector
α
n
)
(
ys
:
Vector
α
m
)
:
countP
p
(
xs
++
ys
)
=
countP
p
xs
+
countP
p
ys
source
@[simp]
theorem
Vector
.
countP_pos_iff
{
α✝
:
Type
u_1}
{
n✝
:
Nat
}
{
xs
:
Vector
α✝
n✝
}
{
p
:
α✝
→
Bool
}
:
0
<
countP
p
xs
↔
∃
(
a
:
α✝
)
,
a
∈
xs
∧
p
a
=
true
source
@[simp]
theorem
Vector
.
one_le_countP_iff
{
α✝
:
Type
u_1}
{
n✝
:
Nat
}
{
xs
:
Vector
α✝
n✝
}
{
p
:
α✝
→
Bool
}
:
1
≤
countP
p
xs
↔
∃
(
a
:
α✝
)
,
a
∈
xs
∧
p
a
=
true
source
@[simp]
theorem
Vector
.
countP_eq_zero
{
α✝
:
Type
u_1}
{
n✝
:
Nat
}
{
xs
:
Vector
α✝
n✝
}
{
p
:
α✝
→
Bool
}
:
countP
p
xs
=
0
↔
∀ (
a
:
α✝
),
a
∈
xs
→
¬
p
a
=
true
source
@[simp]
theorem
Vector
.
countP_eq_size
{
α✝
:
Type
u_1}
{
n✝
:
Nat
}
{
xs
:
Vector
α✝
n✝
}
{
p
:
α✝
→
Bool
}
:
countP
p
xs
=
xs
.
size
↔
∀ (
a
:
α✝
),
a
∈
xs
→
p
a
=
true
source
@[simp]
theorem
Vector
.
countP_cast
{
α
:
Type
u_1}
{
n
a✝
:
Nat
}
{
h
:
n
=
a✝
}
(
p
:
α
→
Bool
)
(
xs
:
Vector
α
n
)
:
countP
p
(
Vector.cast
h
xs
)
=
countP
p
xs
source
theorem
Vector
.
countP_mkVector
{
α
:
Type
u_1}
(
p
:
α
→
Bool
)
(
a
:
α
)
(
n
:
Nat
)
:
countP
p
(
mkVector
n
a
)
=
if
p
a
=
true
then
n
else
0
source
theorem
Vector
.
boole_getElem_le_countP
{
α
:
Type
u_1}
{
n
:
Nat
}
(
p
:
α
→
Bool
)
(
xs
:
Vector
α
n
)
(
i
:
Nat
)
(
h
:
i
<
n
)
:
(
if
p
xs
[
i
]
=
true
then
1
else
0
)
≤
countP
p
xs
source
theorem
Vector
.
countP_set
{
α
:
Type
u_1}
{
n
:
Nat
}
(
p
:
α
→
Bool
)
(
xs
:
Vector
α
n
)
(
i
:
Nat
)
(
a
:
α
)
(
h
:
i
<
n
)
:
countP
p
(
xs
.
set
i
a
h
)
=
(
countP
p
xs
-
if
p
xs
[
i
]
=
true
then
1
else
0
)
+
if
p
a
=
true
then
1
else
0
source
@[simp]
theorem
Vector
.
countP_true
{
α
:
Type
u_1}
{
n
:
Nat
}
:
(
countP
fun (
x
:
α
) =>
true
)
=
fun (
x
:
Vector
α
n
) =>
n
source
@[simp]
theorem
Vector
.
countP_false
{
α
:
Type
u_1}
{
n
:
Nat
}
:
(
countP
fun (
x
:
α
) =>
false
)
=
fun (
x
:
Vector
α
n
) =>
0
source
@[simp]
theorem
Vector
.
countP_map
{
α
:
Type
u_2}
{
β
:
Type
u_1}
{
n
:
Nat
}
(
p
:
β
→
Bool
)
(
f
:
α
→
β
)
(
xs
:
Vector
α
n
)
:
countP
p
(
map
f
xs
)
=
countP
(
p
∘
f
)
xs
source
@[simp]
theorem
Vector
.
countP_flatten
{
α
:
Type
u_1}
(
p
:
α
→
Bool
)
{
m
n
:
Nat
}
(
xss
:
Vector
(
Vector
α
m
)
n
)
:
countP
p
xss
.
flatten
=
(
map
(
countP
p
)
xss
)
.
sum
source
theorem
Vector
.
countP_flatMap
{
α
:
Type
u_2}
{
β
:
Type
u_1}
{
n
m
:
Nat
}
(
p
:
β
→
Bool
)
(
xs
:
Vector
α
n
)
(
f
:
α
→
Vector
β
m
)
:
countP
p
(
xs
.
flatMap
f
)
=
(
map
(
countP
p
∘
f
)
xs
)
.
sum
source
@[simp]
theorem
Vector
.
countP_reverse
{
α
:
Type
u_1}
(
p
:
α
→
Bool
)
{
n
:
Nat
}
(
xs
:
Vector
α
n
)
:
countP
p
xs
.
reverse
=
countP
p
xs
source
theorem
Vector
.
countP_mono_left
{
α
:
Type
u_1}
{
p
q
:
α
→
Bool
}
{
n✝
:
Nat
}
{
xs
:
Vector
α
n✝
}
(
h
:
∀ (
x
:
α
),
x
∈
xs
→
p
x
=
true
→
q
x
=
true
)
:
countP
p
xs
≤
countP
q
xs
source
theorem
Vector
.
countP_congr
{
α
:
Type
u_1}
{
p
q
:
α
→
Bool
}
{
n✝
:
Nat
}
{
xs
:
Vector
α
n✝
}
(
h
:
∀ (
x
:
α
),
x
∈
xs
→ (
p
x
=
true
↔
q
x
=
true
)
)
:
countP
p
xs
=
countP
q
xs
count
#
source
@[simp]
theorem
Vector
.
count_empty
{
α
:
Type
u_1}
[
BEq
α
]
(
a
:
α
)
:
count
a
{
toArray
:=
#[
]
,
size_toArray
:=
⋯
}
=
0
source
theorem
Vector
.
count_push
{
α
:
Type
u_1}
[
BEq
α
]
{
n
:
Nat
}
(
a
b
:
α
)
(
xs
:
Vector
α
n
)
:
count
a
(
xs
.
push
b
)
=
count
a
xs
+
if
(
b
==
a
)
=
true
then
1
else
0
source
theorem
Vector
.
count_eq_countP
{
α
:
Type
u_1}
[
BEq
α
]
{
n
:
Nat
}
(
a
:
α
)
(
xs
:
Vector
α
n
)
:
count
a
xs
=
countP
(fun (
x
:
α
) =>
x
==
a
)
xs
source
theorem
Vector
.
count_eq_countP'
{
α
:
Type
u_1}
[
BEq
α
]
{
n
:
Nat
}
{
a
:
α
}
:
count
a
=
countP
fun (
x
:
α
) =>
x
==
a
source
theorem
Vector
.
count_le_size
{
α
:
Type
u_1}
[
BEq
α
]
{
n
:
Nat
}
(
a
:
α
)
(
xs
:
Vector
α
n
)
:
count
a
xs
≤
n
source
theorem
Vector
.
count_le_count_push
{
α
:
Type
u_1}
[
BEq
α
]
{
n
:
Nat
}
(
a
b
:
α
)
(
xs
:
Vector
α
n
)
:
count
a
xs
≤
count
a
(
xs
.
push
b
)
source
@[simp]
theorem
Vector
.
count_singleton
{
α
:
Type
u_1}
[
BEq
α
]
(
a
b
:
α
)
:
count
a
{
toArray
:=
#[
b
]
,
size_toArray
:=
⋯
}
=
if
(
b
==
a
)
=
true
then
1
else
0
source
@[simp]
theorem
Vector
.
count_append
{
α
:
Type
u_1}
[
BEq
α
]
{
n
m
:
Nat
}
(
a
:
α
)
(
xs
:
Vector
α
n
)
(
ys
:
Vector
α
m
)
:
count
a
(
xs
++
ys
)
=
count
a
xs
+
count
a
ys
source
@[simp]
theorem
Vector
.
count_flatten
{
α
:
Type
u_1}
[
BEq
α
]
{
m
n
:
Nat
}
(
a
:
α
)
(
xss
:
Vector
(
Vector
α
m
)
n
)
:
count
a
xss
.
flatten
=
(
map
(
count
a
)
xss
)
.
sum
source
@[simp]
theorem
Vector
.
count_reverse
{
α
:
Type
u_1}
[
BEq
α
]
{
n
:
Nat
}
(
a
:
α
)
(
xs
:
Vector
α
n
)
:
count
a
xs
.
reverse
=
count
a
xs
source
theorem
Vector
.
boole_getElem_le_count
{
α
:
Type
u_1}
[
BEq
α
]
{
n
:
Nat
}
(
a
:
α
)
(
xs
:
Vector
α
n
)
(
i
:
Nat
)
(
h
:
i
<
n
)
:
(
if
(
xs
[
i
]
==
a
)
=
true
then
1
else
0
)
≤
count
a
xs
source
theorem
Vector
.
count_set
{
α
:
Type
u_1}
[
BEq
α
]
{
n
:
Nat
}
(
a
b
:
α
)
(
xs
:
Vector
α
n
)
(
i
:
Nat
)
(
h
:
i
<
n
)
:
count
b
(
xs
.
set
i
a
h
)
=
(
count
b
xs
-
if
(
xs
[
i
]
==
b
)
=
true
then
1
else
0
)
+
if
(
a
==
b
)
=
true
then
1
else
0
source
@[simp]
theorem
Vector
.
count_cast
{
α
:
Type
u_1}
[
BEq
α
]
{
n
a✝
:
Nat
}
{
h
:
n
=
a✝
}
{
a
:
α
}
(
xs
:
Vector
α
n
)
:
count
a
(
Vector.cast
h
xs
)
=
count
a
xs
source
@[simp]
theorem
Vector
.
count_push_self
{
α
:
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
{
n
:
Nat
}
(
a
:
α
)
(
xs
:
Vector
α
n
)
:
count
a
(
xs
.
push
a
)
=
count
a
xs
+
1
source
@[simp]
theorem
Vector
.
count_push_of_ne
{
α
:
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
{
b
a
:
α
}
{
n
:
Nat
}
(
h
:
b
≠
a
)
(
xs
:
Vector
α
n
)
:
count
a
(
xs
.
push
b
)
=
count
a
xs
source
theorem
Vector
.
count_singleton_self
{
α
:
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
(
a
:
α
)
:
count
a
{
toArray
:=
#[
a
]
,
size_toArray
:=
⋯
}
=
1
source
@[simp]
theorem
Vector
.
count_pos_iff
{
α
:
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
{
n
:
Nat
}
{
a
:
α
}
{
xs
:
Vector
α
n
}
:
0
<
count
a
xs
↔
a
∈
xs
source
@[simp]
theorem
Vector
.
one_le_count_iff
{
α
:
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
{
n
:
Nat
}
{
a
:
α
}
{
xs
:
Vector
α
n
}
:
1
≤
count
a
xs
↔
a
∈
xs
source
theorem
Vector
.
count_eq_zero_of_not_mem
{
α
:
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
{
n
:
Nat
}
{
a
:
α
}
{
xs
:
Vector
α
n
}
(
h
:
¬
a
∈
xs
)
:
count
a
xs
=
0
source
theorem
Vector
.
not_mem_of_count_eq_zero
{
α
:
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
{
n
:
Nat
}
{
a
:
α
}
{
xs
:
Vector
α
n
}
(
h
:
count
a
xs
=
0
)
:
¬
a
∈
xs
source
theorem
Vector
.
count_eq_zero
{
α
:
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
{
n
:
Nat
}
{
a
:
α
}
{
xs
:
Vector
α
n
}
:
count
a
xs
=
0
↔
¬
a
∈
xs
source
theorem
Vector
.
count_eq_size
{
α
:
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
{
n
:
Nat
}
{
a
:
α
}
{
xs
:
Vector
α
n
}
:
count
a
xs
=
xs
.
size
↔
∀ (
b
:
α
),
b
∈
xs
→
a
=
b
source
@[simp]
theorem
Vector
.
count_mkVector_self
{
α
:
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
(
a
:
α
)
(
n
:
Nat
)
:
count
a
(
mkVector
n
a
)
=
n
source
theorem
Vector
.
count_mkVector
{
α
:
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
(
a
b
:
α
)
(
n
:
Nat
)
:
count
a
(
mkVector
n
b
)
=
if
(
b
==
a
)
=
true
then
n
else
0
source
theorem
Vector
.
count_le_count_map
{
α
:
Type
u_2}
[
BEq
α
]
[
LawfulBEq
α
]
{
β
:
Type
u_1}
{
n
:
Nat
}
[
DecidableEq
β
]
(
xs
:
Vector
α
n
)
(
f
:
α
→
β
)
(
x
:
α
)
:
count
x
xs
≤
count
(
f
x
)
(
map
f
xs
)
source
theorem
Vector
.
count_flatMap
{
β
:
Type
u_1}
{
n
m
:
Nat
}
{
α
:
Type
u_2}
[
BEq
β
]
(
xs
:
Vector
α
n
)
(
f
:
α
→
Vector
β
m
)
(
x
:
β
)
:
count
x
(
xs
.
flatMap
f
)
=
(
map
(
count
x
∘
f
)
xs
)
.
sum