Documentation
Init
.
Data
.
Array
.
Count
Search
return to top
source
Imports
Init.Data.Array.Lemmas
Init.Data.List.Nat.Count
Imported by
Array
.
countP_empty
Array
.
countP_push_of_pos
Array
.
countP_push_of_neg
Array
.
countP_push
Array
.
countP_singleton
Array
.
size_eq_countP_add_countP
Array
.
countP_eq_size_filter
Array
.
countP_eq_size_filter'
Array
.
countP_le_size
Array
.
countP_append
Array
.
countP_pos_iff
Array
.
one_le_countP_iff
Array
.
countP_eq_zero
Array
.
countP_eq_size
Array
.
countP_mkArray
Array
.
boole_getElem_le_countP
Array
.
countP_set
Array
.
countP_filter
Array
.
countP_true
Array
.
countP_false
Array
.
countP_map
Array
.
size_filterMap_eq_countP
Array
.
countP_filterMap
Array
.
countP_flatten
Array
.
countP_flatMap
Array
.
countP_reverse
Array
.
countP_mono_left
Array
.
countP_congr
Array
.
count_empty
Array
.
count_push
Array
.
count_eq_countP
Array
.
count_eq_countP'
Array
.
count_le_size
Array
.
count_le_count_push
Array
.
count_singleton
Array
.
count_append
Array
.
count_flatten
Array
.
count_reverse
Array
.
boole_getElem_le_count
Array
.
count_set
Array
.
count_push_self
Array
.
count_push_of_ne
Array
.
count_singleton_self
Array
.
count_pos_iff
Array
.
one_le_count_iff
Array
.
count_eq_zero_of_not_mem
Array
.
not_mem_of_count_eq_zero
Array
.
count_eq_zero
Array
.
count_eq_size
Array
.
count_mkArray_self
Array
.
count_mkArray
Array
.
filter_beq
Array
.
filter_eq
Array
.
mkArray_count_eq_of_count_eq_size
Array
.
count_filter
Array
.
count_le_count_map
Array
.
count_filterMap
Array
.
count_flatMap
Lemmas about
Array.countP
and
Array.count
.
#
countP
#
source
@[simp]
theorem
Array
.
countP_empty
{α :
Type
u_1}
(p :
α
→
Bool
)
:
countP
p
#[
]
=
0
source
@[simp]
theorem
Array
.
countP_push_of_pos
{α :
Type
u_1}
(p :
α
→
Bool
)
{a :
α
}
(l :
Array
α
)
(pa :
p
a
=
true
)
:
countP
p
(
l
.
push
a
)
=
countP
p
l
+
1
source
@[simp]
theorem
Array
.
countP_push_of_neg
{α :
Type
u_1}
(p :
α
→
Bool
)
{a :
α
}
(l :
Array
α
)
(pa :
¬
p
a
=
true
)
:
countP
p
(
l
.
push
a
)
=
countP
p
l
source
theorem
Array
.
countP_push
{α :
Type
u_1}
(p :
α
→
Bool
)
(a :
α
)
(l :
Array
α
)
:
countP
p
(
l
.
push
a
)
=
countP
p
l
+
if
p
a
=
true
then
1
else
0
source
@[simp]
theorem
Array
.
countP_singleton
{α :
Type
u_1}
(p :
α
→
Bool
)
(a :
α
)
:
countP
p
#[
a
]
=
if
p
a
=
true
then
1
else
0
source
theorem
Array
.
size_eq_countP_add_countP
{α :
Type
u_1}
(p :
α
→
Bool
)
(l :
Array
α
)
:
l
.
size
=
countP
p
l
+
countP
(fun (
a
:
α
) =>
decide
¬
p
a
=
true
)
l
source
theorem
Array
.
countP_eq_size_filter
{α :
Type
u_1}
(p :
α
→
Bool
)
(l :
Array
α
)
:
countP
p
l
=
(
filter
p
l
)
.
size
source
theorem
Array
.
countP_eq_size_filter'
{α :
Type
u_1}
(p :
α
→
Bool
)
:
countP
p
=
size
∘
fun (
as
:
Array
α
) =>
filter
p
as
source
theorem
Array
.
countP_le_size
{α :
Type
u_1}
(p :
α
→
Bool
)
{l :
Array
α
}
:
countP
p
l
≤
l
.
size
source
@[simp]
theorem
Array
.
countP_append
{α :
Type
u_1}
(p :
α
→
Bool
)
(l₁ l₂ :
Array
α
)
:
countP
p
(
l₁
++
l₂
)
=
countP
p
l₁
+
countP
p
l₂
source
@[simp]
theorem
Array
.
countP_pos_iff
{α✝ :
Type
u_1}
{l :
Array
α✝
}
{p :
α✝
→
Bool
}
:
0
<
countP
p
l
↔
∃
(
a
:
α✝
)
,
a
∈
l
∧
p
a
=
true
source
@[simp]
theorem
Array
.
one_le_countP_iff
{α✝ :
Type
u_1}
{l :
Array
α✝
}
{p :
α✝
→
Bool
}
:
1
≤
countP
p
l
↔
∃
(
a
:
α✝
)
,
a
∈
l
∧
p
a
=
true
source
@[simp]
theorem
Array
.
countP_eq_zero
{α✝ :
Type
u_1}
{l :
Array
α✝
}
{p :
α✝
→
Bool
}
:
countP
p
l
=
0
↔
∀ (
a
:
α✝
),
a
∈
l
→
¬
p
a
=
true
source
@[simp]
theorem
Array
.
countP_eq_size
{α✝ :
Type
u_1}
{l :
Array
α✝
}
{p :
α✝
→
Bool
}
:
countP
p
l
=
l
.
size
↔
∀ (
a
:
α✝
),
a
∈
l
→
p
a
=
true
source
theorem
Array
.
countP_mkArray
{α :
Type
u_1}
(p :
α
→
Bool
)
(a :
α
)
(n :
Nat
)
:
countP
p
(
mkArray
n
a
)
=
if
p
a
=
true
then
n
else
0
source
theorem
Array
.
boole_getElem_le_countP
{α :
Type
u_1}
(p :
α
→
Bool
)
(l :
Array
α
)
(i :
Nat
)
(h :
i
<
l
.
size
)
:
(
if
p
l
[
i
]
=
true
then
1
else
0
)
≤
countP
p
l
source
theorem
Array
.
countP_set
{α :
Type
u_1}
(p :
α
→
Bool
)
(l :
Array
α
)
(i :
Nat
)
(a :
α
)
(h :
i
<
l
.
size
)
:
countP
p
(
l
.
set
i
a
h
)
=
(
countP
p
l
-
if
p
l
[
i
]
=
true
then
1
else
0
)
+
if
p
a
=
true
then
1
else
0
source
theorem
Array
.
countP_filter
{α :
Type
u_1}
(p q :
α
→
Bool
)
(l :
Array
α
)
:
countP
p
(
filter
q
l
)
=
countP
(fun (
a
:
α
) =>
p
a
&&
q
a
)
l
source
@[simp]
theorem
Array
.
countP_true
{α :
Type
u_1}
:
(
countP
fun (
x
:
α
) =>
true
)
=
size
source
@[simp]
theorem
Array
.
countP_false
{α :
Type
u_1}
:
(
countP
fun (
x
:
α
) =>
false
)
=
Function.const
(
Array
α
)
0
source
@[simp]
theorem
Array
.
countP_map
{α :
Type
u_2}
{β :
Type
u_1}
(p :
β
→
Bool
)
(f :
α
→
β
)
(l :
Array
α
)
:
countP
p
(
map
f
l
)
=
countP
(
p
∘
f
)
l
source
theorem
Array
.
size_filterMap_eq_countP
{α :
Type
u_2}
{β :
Type
u_1}
(f :
α
→
Option
β
)
(l :
Array
α
)
:
(
filterMap
f
l
)
.
size
=
countP
(fun (
a
:
α
) =>
(
f
a
)
.
isSome
)
l
source
theorem
Array
.
countP_filterMap
{α :
Type
u_2}
{β :
Type
u_1}
(p :
β
→
Bool
)
(f :
α
→
Option
β
)
(l :
Array
α
)
:
countP
p
(
filterMap
f
l
)
=
countP
(fun (
a
:
α
) =>
(
Option.map
p
(
f
a
)
)
.
getD
false
)
l
source
@[simp]
theorem
Array
.
countP_flatten
{α :
Type
u_1}
(p :
α
→
Bool
)
(l :
Array
(
Array
α
)
)
:
countP
p
l
.
flatten
=
(
map
(
countP
p
)
l
)
.
sum
source
theorem
Array
.
countP_flatMap
{α :
Type
u_2}
{β :
Type
u_1}
(p :
β
→
Bool
)
(l :
Array
α
)
(f :
α
→
Array
β
)
:
countP
p
(
flatMap
f
l
)
=
(
map
(
countP
p
∘
f
)
l
)
.
sum
source
@[simp]
theorem
Array
.
countP_reverse
{α :
Type
u_1}
(p :
α
→
Bool
)
(l :
Array
α
)
:
countP
p
l
.
reverse
=
countP
p
l
source
theorem
Array
.
countP_mono_left
{α :
Type
u_1}
{p q :
α
→
Bool
}
{l :
Array
α
}
(h :
∀ (
x
:
α
),
x
∈
l
→
p
x
=
true
→
q
x
=
true
)
:
countP
p
l
≤
countP
q
l
source
theorem
Array
.
countP_congr
{α :
Type
u_1}
{p q :
α
→
Bool
}
{l :
Array
α
}
(h :
∀ (
x
:
α
),
x
∈
l
→ (
p
x
=
true
↔
q
x
=
true
)
)
:
countP
p
l
=
countP
q
l
count
#
source
@[simp]
theorem
Array
.
count_empty
{α :
Type
u_1}
[
BEq
α
]
(a :
α
)
:
count
a
#[
]
=
0
source
theorem
Array
.
count_push
{α :
Type
u_1}
[
BEq
α
]
(a b :
α
)
(l :
Array
α
)
:
count
a
(
l
.
push
b
)
=
count
a
l
+
if
(
b
==
a
)
=
true
then
1
else
0
source
theorem
Array
.
count_eq_countP
{α :
Type
u_1}
[
BEq
α
]
(a :
α
)
(l :
Array
α
)
:
count
a
l
=
countP
(fun (
x
:
α
) =>
x
==
a
)
l
source
theorem
Array
.
count_eq_countP'
{α :
Type
u_1}
[
BEq
α
]
{a :
α
}
:
count
a
=
countP
fun (
x
:
α
) =>
x
==
a
source
theorem
Array
.
count_le_size
{α :
Type
u_1}
[
BEq
α
]
(a :
α
)
(l :
Array
α
)
:
count
a
l
≤
l
.
size
source
theorem
Array
.
count_le_count_push
{α :
Type
u_1}
[
BEq
α
]
(a b :
α
)
(l :
Array
α
)
:
count
a
l
≤
count
a
(
l
.
push
b
)
source
@[simp]
theorem
Array
.
count_singleton
{α :
Type
u_1}
[
BEq
α
]
(a b :
α
)
:
count
a
#[
b
]
=
if
(
b
==
a
)
=
true
then
1
else
0
source
@[simp]
theorem
Array
.
count_append
{α :
Type
u_1}
[
BEq
α
]
(a :
α
)
(l₁ l₂ :
Array
α
)
:
count
a
(
l₁
++
l₂
)
=
count
a
l₁
+
count
a
l₂
source
@[simp]
theorem
Array
.
count_flatten
{α :
Type
u_1}
[
BEq
α
]
(a :
α
)
(l :
Array
(
Array
α
)
)
:
count
a
l
.
flatten
=
(
map
(
count
a
)
l
)
.
sum
source
@[simp]
theorem
Array
.
count_reverse
{α :
Type
u_1}
[
BEq
α
]
(a :
α
)
(l :
Array
α
)
:
count
a
l
.
reverse
=
count
a
l
source
theorem
Array
.
boole_getElem_le_count
{α :
Type
u_1}
[
BEq
α
]
(a :
α
)
(l :
Array
α
)
(i :
Nat
)
(h :
i
<
l
.
size
)
:
(
if
(
l
[
i
]
==
a
)
=
true
then
1
else
0
)
≤
count
a
l
source
theorem
Array
.
count_set
{α :
Type
u_1}
[
BEq
α
]
(a b :
α
)
(l :
Array
α
)
(i :
Nat
)
(h :
i
<
l
.
size
)
:
count
b
(
l
.
set
i
a
h
)
=
(
count
b
l
-
if
(
l
[
i
]
==
b
)
=
true
then
1
else
0
)
+
if
(
a
==
b
)
=
true
then
1
else
0
source
@[simp]
theorem
Array
.
count_push_self
{α :
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
(a :
α
)
(l :
Array
α
)
:
count
a
(
l
.
push
a
)
=
count
a
l
+
1
source
@[simp]
theorem
Array
.
count_push_of_ne
{α :
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
{b a :
α
}
(h :
b
≠
a
)
(l :
Array
α
)
:
count
a
(
l
.
push
b
)
=
count
a
l
source
theorem
Array
.
count_singleton_self
{α :
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
(a :
α
)
:
count
a
#[
a
]
=
1
source
@[simp]
theorem
Array
.
count_pos_iff
{α :
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
{a :
α
}
{l :
Array
α
}
:
0
<
count
a
l
↔
a
∈
l
source
@[simp]
theorem
Array
.
one_le_count_iff
{α :
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
{a :
α
}
{l :
Array
α
}
:
1
≤
count
a
l
↔
a
∈
l
source
theorem
Array
.
count_eq_zero_of_not_mem
{α :
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
{a :
α
}
{l :
Array
α
}
(h :
¬
a
∈
l
)
:
count
a
l
=
0
source
theorem
Array
.
not_mem_of_count_eq_zero
{α :
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
{a :
α
}
{l :
Array
α
}
(h :
count
a
l
=
0
)
:
¬
a
∈
l
source
theorem
Array
.
count_eq_zero
{α :
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
{a :
α
}
{l :
Array
α
}
:
count
a
l
=
0
↔
¬
a
∈
l
source
theorem
Array
.
count_eq_size
{α :
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
{a :
α
}
{l :
Array
α
}
:
count
a
l
=
l
.
size
↔
∀ (
b
:
α
),
b
∈
l
→
a
=
b
source
@[simp]
theorem
Array
.
count_mkArray_self
{α :
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
(a :
α
)
(n :
Nat
)
:
count
a
(
mkArray
n
a
)
=
n
source
theorem
Array
.
count_mkArray
{α :
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
(a b :
α
)
(n :
Nat
)
:
count
a
(
mkArray
n
b
)
=
if
(
b
==
a
)
=
true
then
n
else
0
source
theorem
Array
.
filter_beq
{α :
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
(l :
Array
α
)
(a :
α
)
:
filter
(fun (
x
:
α
) =>
x
==
a
)
l
=
mkArray
(
count
a
l
)
a
source
theorem
Array
.
filter_eq
{α :
Type
u_1}
[
DecidableEq
α
]
(l :
Array
α
)
(a :
α
)
:
filter
(fun (
x
:
α
) =>
decide
(
x
=
a
)
)
l
=
mkArray
(
count
a
l
)
a
source
theorem
Array
.
mkArray_count_eq_of_count_eq_size
{α :
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
{a :
α
}
{l :
Array
α
}
(h :
count
a
l
=
l
.
size
)
:
mkArray
(
count
a
l
)
a
=
l
source
@[simp]
theorem
Array
.
count_filter
{α :
Type
u_1}
[
BEq
α
]
[
LawfulBEq
α
]
{p :
α
→
Bool
}
{a :
α
}
{l :
Array
α
}
(h :
p
a
=
true
)
:
count
a
(
filter
p
l
)
=
count
a
l
source
theorem
Array
.
count_le_count_map
{α :
Type
u_2}
[
BEq
α
]
[
LawfulBEq
α
]
{β :
Type
u_1}
[
DecidableEq
β
]
(l :
Array
α
)
(f :
α
→
β
)
(x :
α
)
:
count
x
l
≤
count
(
f
x
)
(
map
f
l
)
source
theorem
Array
.
count_filterMap
{β :
Type
u_1}
{α :
Type
u_2}
[
BEq
β
]
(b :
β
)
(f :
α
→
Option
β
)
(l :
Array
α
)
:
count
b
(
filterMap
f
l
)
=
countP
(fun (
a
:
α
) =>
f
a
==
some
b
)
l
source
theorem
Array
.
count_flatMap
{β :
Type
u_1}
{α :
Type
u_2}
[
BEq
β
]
(l :
Array
α
)
(f :
α
→
Array
β
)
(x :
β
)
:
count
x
(
flatMap
f
l
)
=
(
map
(
count
x
∘
f
)
l
)
.
sum