Built with doc-gen4, running Lean4. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓to navigate, Ctrl+🖱️to focus. On Mac, use Cmdinstead of Ctrl.
/-
Copyright (c) 2014 Parikshit Khanna. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Parikshit Khanna, Jeremy Avigad, Leonardo de Moura, Floris van Doorn, Mario Carneiro

! This file was ported from Lean 3 source module data.list.count
! leanprover-community/mathlib commit 47adfab39a11a072db552f47594bf8ed2cf8a722
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Data.List.BigOperators.Basic

/-!
# Counting in lists

This file proves basic properties of `List.countp` and `List.count`, which count the number of
elements of a list satisfying a predicate and equal to a given element respectively. Their
definitions can be found in `Std.Data.List.Basic`.
-/


open Nat

variable {
l: List α
l
:
List: Type ?u.24637 → Type ?u.24637
List
α: ?m.4
α
} namespace List section Countp variable (
p: αBool
p
q: αBool
q
:
α: ?m.12
α
Bool: Type
Bool
) @[simp] theorem
countp_nil: ∀ {α : Type u_1} (p : αBool), countp p [] = 0
countp_nil
:
countp: {α : Type ?u.43} → (αBool) → List α
countp
p: αBool
p
[]: List ?m.49
[]
=
0: ?m.52
0
:=
rfl: ∀ {α : Sort ?u.77} {a : α}, a = a
rfl
#align list.countp_nil
List.countp_nil: ∀ {α : Type u_1} (p : αBool), countp p [] = 0
List.countp_nil
-- Porting note: added to aid in the following proof. protected theorem
countp_go_eq_add: ∀ {n : } (l : List α), countp.go p l n = n + countp.go p l 0
countp_go_eq_add
(
l: unknown metavariable '?_uniq.122'
l
) :
countp.go: {α : Type ?u.140} → (αBool) → List α
countp.go
p: αBool
p
l: ?m.136
l
n: ?m.133
n
=
n: ?m.133
n
+
countp.go: {α : Type ?u.148} → (αBool) → List α
countp.go
p: αBool
p
l: ?m.136
l
0: ?m.154
0
:=

Goals accomplished! 🐙
α: Type u_1

l✝: List α

p, q: αBool

n:

l: List α


countp.go p l n = n + countp.go p l 0
α: Type u_1

l: List α

p, q: αBool

n✝, n:


nil
countp.go p [] n = n + countp.go p [] 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:


cons
countp.go p (head :: tail) n = n + countp.go p (head :: tail) 0
α: Type u_1

l✝: List α

p, q: αBool

n:

l: List α


countp.go p l n = n + countp.go p l 0
α: Type u_1

l: List α

p, q: αBool

n✝, n:


nil
countp.go p [] n = n + countp.go p [] 0
α: Type u_1

l: List α

p, q: αBool

n✝, n:


nil
countp.go p [] n = n + countp.go p [] 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:


cons
countp.go p (head :: tail) n = n + countp.go p (head :: tail) 0

Goals accomplished! 🐙
α: Type u_1

l✝: List α

p, q: αBool

n:

l: List α


countp.go p l n = n + countp.go p l 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:


cons
countp.go p (head :: tail) n = n + countp.go p (head :: tail) 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:


cons
countp.go p (head :: tail) n = n + countp.go p (head :: tail) 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:


cons
(bif p head then countp.go p tail (n + 1) else countp.go p tail n) = n + bif p head then countp.go p tail (0 + 1) else countp.go p tail 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:


cons
countp.go p (head :: tail) n = n + countp.go p (head :: tail) 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:


cons
(bif p head then countp.go p tail (n + 1) else countp.go p tail n) = n + bif p head then countp.go p tail (0 + 1) else countp.go p tail 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:


cons
(bif p head then n + 1 + countp.go p tail 0 else countp.go p tail n) = n + bif p head then countp.go p tail (0 + 1) else countp.go p tail 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:


cons
(bif p head then countp.go p tail (n + 1) else countp.go p tail n) = n + bif p head then countp.go p tail (0 + 1) else countp.go p tail 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:


cons
(bif p head then n + 1 + countp.go p tail 0 else n + countp.go p tail 0) = n + bif p head then countp.go p tail (0 + 1) else countp.go p tail 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:


cons
(bif p head then countp.go p tail (n + 1) else countp.go p tail n) = n + bif p head then countp.go p tail (0 + 1) else countp.go p tail 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:


cons
(bif p head then n + 1 + countp.go p tail 0 else n + countp.go p tail 0) = n + bif p head then 1 + countp.go p tail 0 else countp.go p tail 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:


cons
(bif p head then n + 1 + countp.go p tail 0 else n + countp.go p tail 0) = n + bif p head then 1 + countp.go p tail 0 else countp.go p tail 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:


cons
countp.go p (head :: tail) n = n + countp.go p (head :: tail) 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:

h: p head = true


pos
(bif p head then n + 1 + countp.go p tail 0 else n + countp.go p tail 0) = n + bif p head then 1 + countp.go p tail 0 else countp.go p tail 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:

h: ¬p head = true


neg
(bif p head then n + 1 + countp.go p tail 0 else n + countp.go p tail 0) = n + bif p head then 1 + countp.go p tail 0 else countp.go p tail 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:


cons
countp.go p (head :: tail) n = n + countp.go p (head :: tail) 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:

h: p head = true


pos
(bif p head then n + 1 + countp.go p tail 0 else n + countp.go p tail 0) = n + bif p head then 1 + countp.go p tail 0 else countp.go p tail 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:

h: p head = true


pos
(bif p head then n + 1 + countp.go p tail 0 else n + countp.go p tail 0) = n + bif p head then 1 + countp.go p tail 0 else countp.go p tail 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:

h: ¬p head = true


neg
(bif p head then n + 1 + countp.go p tail 0 else n + countp.go p tail 0) = n + bif p head then 1 + countp.go p tail 0 else countp.go p tail 0

Goals accomplished! 🐙
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:


cons
countp.go p (head :: tail) n = n + countp.go p (head :: tail) 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:

h: ¬p head = true


neg
(bif p head then n + 1 + countp.go p tail 0 else n + countp.go p tail 0) = n + bif p head then 1 + countp.go p tail 0 else countp.go p tail 0
α: Type u_1

l: List α

p, q: αBool

n✝:

head: α

tail: List α

ih: ∀ {n : }, countp.go p tail n = n + countp.go p tail 0

n:

h: ¬p head = true


neg
(bif p head then n + 1 + countp.go p tail 0 else n + countp.go p tail 0) = n + bif p head then 1 + countp.go p tail 0 else countp.go p tail 0

Goals accomplished! 🐙
@[simp] theorem
countp_cons_of_pos: ∀ {α : Type u_1} (p : αBool) {a : α} (l : List α), p a = truecountp p (a :: l) = countp p l + 1
countp_cons_of_pos
{
a: α
a
:
α: ?m.1478
α
} (
l: List α
l
) (
pa: p a = true
pa
:
p: αBool
p
a: α
a
) :
countp: {α : Type ?u.1511} → (αBool) → List α
countp
p: αBool
p
(
a: α
a
::
l: ?m.1494
l
) =
countp: {α : Type ?u.1522} → (αBool) → List α
countp
p: αBool
p
l: ?m.1494
l
+
1: ?m.1528
1
:=

Goals accomplished! 🐙
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true


countp p (a :: l) = countp p l + 1
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true


this
countp.go p (a :: l) 0 = countp.go p l 1
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true

this: countp.go p (a :: l) 0 = countp.go p l 1


countp p (a :: l) = countp p l + 1
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true


countp p (a :: l) = countp p l + 1
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true


this
countp.go p (a :: l) 0 = countp.go p l 1
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true


this
countp.go p (a :: l) 0 = countp.go p l 1
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true

this: countp.go p (a :: l) 0 = countp.go p l 1


countp p (a :: l) = countp p l + 1
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true


this
(bif p a then countp.go p l (0 + 1) else countp.go p l 0) = countp.go p l 1
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true


this
countp.go p (a :: l) 0 = countp.go p l 1
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true


this
(bif p a then countp.go p l (0 + 1) else countp.go p l 0) = countp.go p l 1
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true


this
(bif true then countp.go p l (0 + 1) else countp.go p l 0) = countp.go p l 1
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true


this
(bif true then countp.go p l (0 + 1) else countp.go p l 0) = countp.go p l 1
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true


this
countp.go p (a :: l) 0 = countp.go p l 1

Goals accomplished! 🐙
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true


countp p (a :: l) = countp p l + 1
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true

this: countp.go p (a :: l) 0 = countp.go p l 1


countp.go p (a :: l) 0 = countp.go p l 0 + 1
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true


countp p (a :: l) = countp p l + 1
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true

this: countp.go p (a :: l) 0 = countp.go p l 1


countp.go p (a :: l) 0 = countp.go p l 0 + 1
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true

this: countp.go p (a :: l) 0 = countp.go p l 1


countp.go p l 1 = countp.go p l 0 + 1
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true

this: countp.go p (a :: l) 0 = countp.go p l 1


countp.go p (a :: l) 0 = countp.go p l 0 + 1
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true

this: countp.go p (a :: l) 0 = countp.go p l 1


countp.go p l 1 = 1 + countp.go p l 0
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true

this: countp.go p (a :: l) 0 = countp.go p l 1


countp.go p (a :: l) 0 = countp.go p l 0 + 1
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: p a = true

this: countp.go p (a :: l) 0 = countp.go p l 1


1 + countp.go p l 0 = 1 + countp.go p l 0

Goals accomplished! 🐙
#align list.countp_cons_of_pos
List.countp_cons_of_pos: ∀ {α : Type u_1} (p : αBool) {a : α} (l : List α), p a = truecountp p (a :: l) = countp p l + 1
List.countp_cons_of_pos
@[simp] theorem
countp_cons_of_neg: ∀ {α : Type u_1} (p : αBool) {a : α} (l : List α), ¬p a = truecountp p (a :: l) = countp p l
countp_cons_of_neg
{
a: α
a
:
α: ?m.1804
α
} (
l: List α
l
) (
pa: ¬p a = true
pa
: ¬
p: αBool
p
a: α
a
) :
countp: {α : Type ?u.1905} → (αBool) → List α
countp
p: αBool
p
(
a: α
a
::
l: ?m.1820
l
) =
countp: {α : Type ?u.1913} → (αBool) → List α
countp
p: αBool
p
l: ?m.1820
l
:=

Goals accomplished! 🐙
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: ¬p a = true


countp p (a :: l) = countp p l
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: ¬p a = true


(bif p a then countp.go p l (0 + 1) else countp.go p l 0) = countp.go p l 0
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: ¬p a = true


countp p (a :: l) = countp p l
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: ¬p a = true


(bif p a then countp.go p l (0 + 1) else countp.go p l 0) = countp.go p l 0
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: ¬p a = true


(bif false then countp.go p l (0 + 1) else countp.go p l 0) = countp.go p l 0
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: ¬p a = true


(bif false then countp.go p l (0 + 1) else countp.go p l 0) = countp.go p l 0
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

pa: ¬p a = true


countp p (a :: l) = countp p l

Goals accomplished! 🐙
#align list.countp_cons_of_neg
List.countp_cons_of_neg: ∀ {α : Type u_1} (p : αBool) {a : α} (l : List α), ¬p a = truecountp p (a :: l) = countp p l
List.countp_cons_of_neg
theorem
countp_cons: ∀ {α : Type u_1} (p : αBool) (a : α) (l : List α), countp p (a :: l) = countp p l + if p a = true then 1 else 0
countp_cons
(
a: α
a
:
α: ?m.2092
α
) (
l: List α
l
) :
countp: {α : Type ?u.2112} → (αBool) → List α
countp
p: αBool
p
(
a: α
a
::
l: ?m.2108
l
) =
countp: {α : Type ?u.2123} → (αBool) → List α
countp
p: αBool
p
l: ?m.2108
l
+ if
p: αBool
p
a: α
a
then
1: ?m.2212
1
else
0: ?m.2223
0
:=

Goals accomplished! 🐙
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α


countp p (a :: l) = countp p l + if p a = true then 1 else 0
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

h: p a = true


pos
countp p (a :: l) = countp p l + if p a = true then 1 else 0
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

h: ¬p a = true


neg
countp p (a :: l) = countp p l + if p a = true then 1 else 0
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α


countp p (a :: l) = countp p l + if p a = true then 1 else 0
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

h: p a = true


pos
countp p (a :: l) = countp p l + if p a = true then 1 else 0
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α

h: ¬p a = true


neg
countp p (a :: l) = countp p l + if p a = true then 1 else 0
α: Type u_1

l✝: List α

p, q: αBool

a: α

l: List α


countp p (a :: l) = countp p l + if p a = true then 1 else 0

Goals accomplished! 🐙
#align list.countp_cons
List.countp_cons: ∀ {α : Type u_1} (p : αBool) (a : α) (l : List α), countp p (a :: l) = countp p l + if p a = true then 1 else 0
List.countp_cons
theorem
length_eq_countp_add_countp: ∀ (l : List α), length l = countp p l + countp (fun a => decide ¬p a = true) l
length_eq_countp_add_countp
(
l: ?m.2765
l
) :
length: {α : Type ?u.2769} → List α
length
l: ?m.2765
l
=
countp: {α : Type ?u.2776} → (αBool) → List α
countp
p: αBool
p
l: ?m.2765
l
+
countp: {α : Type ?u.2782} → (αBool) → List α
countp
(fun
a: ?m.2785
a
=> ¬
p: αBool
p
a: ?m.2785
a
)
l: ?m.2765
l
:=

Goals accomplished! 🐙
α: Type u_1

l✝: List α

p, q: αBool

l: List α


length l = countp p l + countp (fun a => decide ¬p a = true) l
α: Type u_1

l: List α

p, q: αBool


nil
length [] = countp p [] + countp (fun a => decide ¬p a = true) []
α: Type u_1

l: List α

p, q: αBool

x: α

h: List α

ih: length h = countp p h + countp (fun a => decide ¬p a = true) h


cons
length (x :: h) = countp p (x :: h) + countp (fun a => decide ¬p a = true) (x :: h)
α: Type u_1

l✝: List α

p, q: αBool

l: List α


length l = countp p l + countp (fun a => decide ¬p a = true) l
α: Type u_1

l: List α

p, q: αBool


nil
length [] = countp p [] + countp (fun a => decide ¬p a = true) []
α: Type u_1

l: List α

p, q: αBool


nil
length [] = countp p [] + countp (fun a => decide ¬p a = true) []
α: Type u_1

l: List α

p, q: αBool

x: α

h: List α

ih: length h = countp p h + countp (fun a => decide ¬p a = true) h


cons
length (x :: h) = countp p (x :: h) + countp (fun a => decide ¬p a = true) (x :: h)

Goals accomplished! 🐙
α: Type u_1

l✝: List α

p, q: αBool

l: List α


length l = countp p l + countp (fun a => decide ¬p a = true) l
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


pos
length (x :: h✝) = countp p (x :: h✝) + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


neg
length (x :: h✝) = countp p (x :: h✝) + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l✝: List α

p, q: αBool

l: List α


length l = countp p l + countp (fun a => decide ¬p a = true) l
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


pos
length (x :: h✝) = countp p (x :: h✝) + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


pos
length (x :: h✝) = countp p (x :: h✝) + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


neg
length (x :: h✝) = countp p (x :: h✝) + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


pos
length (x :: h✝) = countp p (x :: h✝) + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


pos
length (x :: h✝) = countp p h✝ + 1 + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


pos
length (x :: h✝) = countp p (x :: h✝) + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


pos
length (x :: h✝) = countp p h✝ + 1 + countp (fun a => decide ¬p a = true) h✝
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


pos
length (x :: h✝) = countp p (x :: h✝) + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


pos
length h✝ + 1 = countp p h✝ + 1 + countp (fun a => decide ¬p a = true) h✝
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


pos
length (x :: h✝) = countp p (x :: h✝) + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


pos
countp p h✝ + countp (fun a => decide ¬p a = true) h✝ + 1 = countp p h✝ + 1 + countp (fun a => decide ¬p a = true) h✝
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


pos
countp p h✝ + countp (fun a => decide ¬p a = true) h✝ + 1 = countp p h✝ + 1 + countp (fun a => decide ¬p a = true) h✝
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


pos
length (x :: h✝) = countp p (x :: h✝) + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


pos
countp p h✝ + countp (fun a => decide ¬p a = true) h✝ + 1 = countp p h✝ + 1 + countp (fun a => decide ¬p a = true) h✝
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


pos
countp p h✝ + countp (fun a => decide ¬p a = true) h✝ + 1 = countp p h✝ + 1 + countp (fun a => decide ¬p a = true) h✝
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true



Goals accomplished! 🐙
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


pos
length (x :: h✝) = countp p (x :: h✝) + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true


α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: p x = true



Goals accomplished! 🐙
α: Type u_1

l✝: List α

p, q: αBool

l: List α


length l = countp p l + countp (fun a => decide ¬p a = true) l
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


neg
length (x :: h✝) = countp p (x :: h✝) + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


neg
length (x :: h✝) = countp p (x :: h✝) + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


neg
length (x :: h✝) = countp p (x :: h✝) + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


neg
length (x :: h✝) = countp p (x :: h✝) + (countp (fun a => decide ¬p a = true) h✝ + 1)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


(fun a => decide ¬p a = true) x = true
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


neg
length (x :: h✝) = countp p (x :: h✝) + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


neg
length (x :: h✝) = countp p h✝ + (countp (fun a => decide ¬p a = true) h✝ + 1)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


(fun a => decide ¬p a = true) x = true
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


neg
length (x :: h✝) = countp p (x :: h✝) + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


neg
length h✝ + 1 = countp p h✝ + (countp (fun a => decide ¬p a = true) h✝ + 1)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


(fun a => decide ¬p a = true) x = true
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


neg
length (x :: h✝) = countp p (x :: h✝) + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


neg
countp p h✝ + countp (fun a => decide ¬p a = true) h✝ + 1 = countp p h✝ + (countp (fun a => decide ¬p a = true) h✝ + 1)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


(fun a => decide ¬p a = true) x = true
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


neg
countp p h✝ + countp (fun a => decide ¬p a = true) h✝ + 1 = countp p h✝ + (countp (fun a => decide ¬p a = true) h✝ + 1)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


(fun a => decide ¬p a = true) x = true
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


neg
length (x :: h✝) = countp p (x :: h✝) + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


neg
countp p h✝ + countp (fun a => decide ¬p a = true) h✝ + 1 = countp p h✝ + (countp (fun a => decide ¬p a = true) h✝ + 1)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


neg
countp p h✝ + countp (fun a => decide ¬p a = true) h✝ + 1 = countp p h✝ + (countp (fun a => decide ¬p a = true) h✝ + 1)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


(fun a => decide ¬p a = true) x = true

Goals accomplished! 🐙
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


neg
length (x :: h✝) = countp p (x :: h✝) + countp (fun a => decide ¬p a = true) (x :: h✝)
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


(fun a => decide ¬p a = true) x = true
α: Type u_1

l: List α

p, q: αBool

x: α

h✝: List α

ih: length h✝ = countp p h✝ + countp (fun a => decide ¬p a = true) h✝

h: ¬p x = true


(fun a => decide ¬p a = true) x = true

Goals accomplished! 🐙
#align list.length_eq_countp_add_countp
List.length_eq_countp_add_countp: ∀ {α : Type u_1} (p : αBool) (l : List α), length l = countp p l + countp (fun a => decide ¬p a = true) l
List.length_eq_countp_add_countp
theorem
countp_eq_length_filter: ∀ (l : List α), countp p l = length (filter p l)
countp_eq_length_filter
(
l: ?m.4236
l
) :
countp: {α : Type ?u.4240} → (αBool) → List α
countp
p: αBool
p
l: ?m.4236
l
=
length: {α : Type ?u.4246} → List α
length
(
filter: {α : Type ?u.4248} → (αBool) → List αList α
filter
p: αBool
p
l: ?m.4236
l
) :=

Goals accomplished! 🐙
α: Type u_1

l✝: List α

p, q: αBool

l: List α


countp p l = length (filter p l)
α: Type u_1

l: List α

p, q: αBool


nil
countp p [] = length (filter p [])
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)


cons
countp p (x :: l) = length (filter p (x :: l))
α: Type u_1

l✝: List α

p, q: αBool

l: List α


countp p l = length (filter p l)
α: Type u_1

l: List α

p, q: αBool


nil
countp p [] = length (filter p [])
α: Type u_1

l: List α

p, q: αBool


nil
countp p [] = length (filter p [])
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)


cons
countp p (x :: l) = length (filter p (x :: l))

Goals accomplished! 🐙
α: Type u_1

l✝: List α

p, q: αBool

l: List α


countp p l = length (filter p l)
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: p x = true


pos
countp p (x :: l) = length (filter p (x :: l))
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: ¬p x = true


neg
countp p (x :: l) = length (filter p (x :: l))
α: Type u_1

l✝: List α

p, q: αBool

l: List α


countp p l = length (filter p l)
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: p x = true


pos
countp p (x :: l) = length (filter p (x :: l))
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: p x = true


pos
countp p (x :: l) = length (filter p (x :: l))
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: ¬p x = true


neg
countp p (x :: l) = length (filter p (x :: l))
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: p x = true


pos
countp p (x :: l) = length (filter p (x :: l))
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: p x = true


pos
countp p l + 1 = length (filter p (x :: l))
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: p x = true


pos
countp p (x :: l) = length (filter p (x :: l))
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: p x = true


pos
length (filter p l) + 1 = length (filter p (x :: l))
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: p x = true


pos
countp p (x :: l) = length (filter p (x :: l))
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: p x = true


pos
length (filter p l) + 1 = length (x :: filter p l)
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: p x = true


pos
countp p (x :: l) = length (filter p (x :: l))
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: p x = true


pos
length (filter p l) + 1 = length (filter p l) + 1

Goals accomplished! 🐙
α: Type u_1

l✝: List α

p, q: αBool

l: List α


countp p l = length (filter p l)
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: ¬p x = true


neg
countp p (x :: l) = length (filter p (x :: l))
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: ¬p x = true


neg
countp p (x :: l) = length (filter p (x :: l))
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: ¬p x = true


neg
countp p (x :: l) = length (filter p (x :: l))
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: ¬p x = true


neg
countp p l = length (filter p (x :: l))
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: ¬p x = true


neg
countp p (x :: l) = length (filter p (x :: l))
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: ¬p x = true


neg
length (filter p l) = length (filter p (x :: l))
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: ¬p x = true


neg
countp p (x :: l) = length (filter p (x :: l))
α: Type u_1

l✝: List α

p, q: αBool

x: α

l: List α

ih: countp p l = length (filter p l)

h: ¬p x = true


neg

Goals accomplished! 🐙
#align list.countp_eq_length_filter
List.countp_eq_length_filter: ∀ {α : Type u_1} (p : αBool) (l : List α), countp p l = length (filter p l)
List.countp_eq_length_filter
theorem
countp_le_length: countp p l length l
countp_le_length
:
countp: {α : Type ?u.4538} → (αBool) → List α
countp
p: αBool
p
l: List α
l
l: List α
l
.
length: {α : Type ?u.4544} → List α
length
:=

Goals accomplished! 🐙
α: Type u_1

l: List α

p, q: αBool



Goals accomplished! 🐙
#align list.countp_le_length
List.countp_le_length: ∀ {α : Type u_1} {l : List α} (p : αBool), countp p l length l
List.countp_le_length
@[simp] theorem
countp_append: ∀ {α : Type u_1} (p : αBool) (l₁ l₂ : List α), countp p (l₁ ++ l₂) = countp p l₁ + countp p l₂
countp_append
(
l₁: ?m.4684
l₁
l₂: List α
l₂
) :
countp: {α : Type ?u.4691} → (αBool) → List α
countp
p: αBool
p
(
l₁: ?m.4684
l₁
++
l₂: ?m.4687
l₂
) =
countp: {α : Type ?u.4739} → (αBool) → List α
countp
p: αBool
p
l₁: ?m.4684
l₁
+
countp: {α : Type ?u.4744} → (αBool) → List α
countp
p: αBool
p
l₂: ?m.4687
l₂
:=

Goals accomplished! 🐙
α: Type u_1

l: List α

p, q: αBool

l₁, l₂: List α


countp p (l₁ ++ l₂) = countp p l₁ + countp p l₂

Goals accomplished! 🐙
#align list.countp_append
List.countp_append: ∀ {α : Type u_1} (p : αBool) (l₁ l₂ : List α), countp p (l₁ ++ l₂) = countp p l₁ + countp p l₂
List.countp_append
theorem
countp_join: ∀ {α : Type u_1} (p : αBool) (l : List (List α)), countp p (join l) = sum (map (countp p) l)
countp_join
: ∀
l: List (List α)
l
:
List: Type ?u.5029 → Type ?u.5029
List
(
List: Type ?u.5030 → Type ?u.5030
List
α: ?m.5014
α
),
countp: {α : Type ?u.5034} → (αBool) → List α
countp
p: αBool
p
l: List (List α)
l
.
join: {α : Type ?u.5039} → List (List α)List α
join
= (
l: List (List α)
l
.
map: {α : Type ?u.5045} → {β : Type ?u.5044} → (αβ) → List αList β
map
(
countp: {α : Type ?u.5052} → (αBool) → List α
countp
p: αBool
p
)).
sum: {α : Type ?u.5062} → [inst : Add α] → [inst : Zero α] → List αα
sum
| [] =>
rfl: ∀ {α : Sort ?u.5111} {a : α}, a = a
rfl
|
a: List α
a
::
l: List (List α)
l
=>

Goals accomplished! 🐙
α: Type u_1

l✝: List α

p, q: αBool

a: List α

l: List (List α)


countp p (join (a :: l)) = sum (map (countp p) (a :: l))
α: Type u_1

l✝: List α

p, q: αBool

a: List α

l: List (List α)


countp p (join (a :: l)) = sum (map (countp p) (a :: l))
α: Type u_1

l✝: List α

p, q: αBool

a: List α

l: List (List α)


countp p (a ++ join l) = sum (map (countp p) (a :: l))
α: Type u_1

l✝: List α

p, q: αBool

a: List α

l: List (List α)


countp p (join (a :: l)) = sum (map (countp p) (a :: l))
α: Type u_1

l✝: List α

p, q: αBool

a: List α

l: List (List α)


countp p a + countp p (join l) = sum (map (countp p) (a :: l))
α: Type u_1

l✝: List α

p, q: αBool

a: List α

l: List (List α)


countp p (join (a :: l)) = sum (map (countp p) (a :: l))
α: Type u_1

l✝: List α

p, q: αBool

a: List α

l: List (List α)


countp p a + countp p (join l) = sum (countp p a :: map (countp p) l)
α: Type u_1

l✝: List α

p, q: αBool

a: List α

l: List (List α)


countp p (join (a :: l)) = sum (map (countp p) (a :: l))
α: Type u_1

l✝: List α

p, q: αBool

a: List α

l: List (List α)


countp p a + countp p (join l) = countp p a + sum (map (countp p) l)
α: Type u_1

l✝: List α

p, q: αBool

a: List α

l: List (List α)


countp p (join (a :: l)) = sum (map (countp p) (a :: l))
α: Type u_1

l✝: List α

p, q: αBool

a: List α

l: List (List α)


countp p a + sum (map (countp p) l) = countp p a + sum (map (countp p) l)

Goals accomplished! 🐙
#align list.countp_join
List.countp_join: ∀ {α : Type u_1} (p : αBool) (l : List (List α)), countp p (join l) = sum (map (countp p) l)
List.countp_join
theorem
countp_pos: ∀ {α : Type u_1} {l : List α} (p : αBool), 0 < countp p l a, a l p a = true
countp_pos
:
0: ?m.5714
0
<
countp: {α : Type ?u.5729} → (αBool) → List α
countp
p: αBool
p
l: List α
l
↔ ∃
a: ?m.5756
a
l: List α
l
,
p: αBool
p
a: ?m.5756
a
:=

Goals accomplished! 🐙
α: Type u_1

l: List α

p, q: αBool


0 < countp p l a, a l p a = true

Goals accomplished! 🐙
#align list.countp_pos
List.countp_pos: ∀ {α : Type u_1} {l : List α} (p : αBool), 0 < countp p l a, a l p a = true
List.countp_pos
@[simp] theorem
countp_eq_zero: ∀ {α : Type u_1} {l : List α} (p : αBool), countp p l = 0 ∀ (a : α), a l¬p a = true
countp_eq_zero
:
countp: {α : Type ?u.6177} → (αBool) → List α
countp
p: αBool
p
l: List α
l
=
0: ?m.6184
0
↔ ∀
a: ?m.6209
a
l: List α
l
, ¬
p: αBool
p
a: ?m.6209
a
:=

Goals accomplished! 🐙
α: Type u_1

l: List α

p, q: αBool


countp p l = 0 ∀ (a : α), a l¬p a = true
α: Type u_1

l: List α

p, q: αBool


countp p l = 0 ∀ (a : α), a l¬p a = true
α: Type u_1

l: List α

p, q: αBool


¬countp p l = 0 ¬∀ (a : α), a l¬p a = true
α: Type u_1

l: List α

p, q: αBool


countp p l = 0 ∀ (a : α), a l¬p a = true
α: Type u_1

l: List α

p, q: αBool


countp p l 0 ¬∀ (a : α), a l¬p a = true
α: Type u_1

l: List α

p, q: αBool


countp p l = 0 ∀ (a : α), a l¬p a = true
α: Type u_1

l: List α

p, q: αBool


0 < countp p l ¬∀ (a : α), a l¬p a = true
α: Type u_1

l: List α

p, q: αBool


countp p l = 0 ∀ (a : α), a l¬p a = true
α: Type u_1

l: List α

p, q: αBool


(a, a l p a = true) ¬∀ (a : α), a l¬p a = true
α: Type u_1

l: List α

p, q: αBool


(a, a l p a = true) ¬∀ (a : α), a l¬p a = true
α: Type u_1

l: List α

p, q: αBool


countp p l = 0 ∀ (a : α), a l¬p a = true

Goals accomplished! 🐙
#align list.countp_eq_zero
List.countp_eq_zero: ∀ {α : Type u_1} {l : List α} (p : αBool), countp p l = 0 ∀ (a : α), a l¬p a = true
List.countp_eq_zero
@[simp] theorem
countp_eq_length: ∀ {α : Type u_1} {l : List α} (p : αBool), countp p l = length l ∀ (a : α), a lp a = true
countp_eq_length
:
countp: {α : Type ?u.10489} → (αBool) → List α
countp
p: αBool
p
l: List α
l
=
l: List α
l
.
length: {α : Type ?u.10495} → List α
length
↔ ∀
a: ?m.10501
a
l: List α
l
,
p: αBool
p
a: ?m.10501
a
:=

Goals accomplished! 🐙
α: Type u_1

l: List α

p, q: αBool


countp p l = length l ∀ (a : α), a lp a = true
α: Type u_1

l: List α

p, q: αBool


countp p l = length l ∀ (a : α), a lp a = true
α: Type u_1

l: List α

p, q: αBool


length (filter p l) = length l ∀ (a : α), a lp a = true
α: Type u_1

l: List α

p, q: αBool


countp p l = length l ∀ (a : α), a lp a = true
α: Type u_1

l: List α

p, q: αBool


(∀ (a : α), a lp a = true) ∀ (a : α), a lp a = true

Goals accomplished! 🐙
#align list.countp_eq_length
List.countp_eq_length: ∀ {α : Type u_1} {l : List α} (p : αBool), countp p l = length l ∀ (a : α), a lp a = true
List.countp_eq_length
theorem
length_filter_lt_length_iff_exists: ∀ {α : Type u_1} (p : αBool) (l : List α), length (filter p l) < length l x, x l ¬p x = true
length_filter_lt_length_iff_exists
(
l: List α
l
) :
length: {α : Type ?u.10648} → List α
length
(
filter: {α : Type ?u.10650} → (αBool) → List αList α
filter
p: αBool
p
l: ?m.10644
l
) <
length: {α : Type ?u.10657} → List α
length
l: ?m.10644
l
↔ ∃
x: ?m.10668
x
l: ?m.10644
l
, ¬
p: αBool
p
x: ?m.10668
x
:=

Goals accomplished! 🐙
α: Type u_1

l✝: List α

p, q: αBool

l: List α


length (filter p l) < length l x, x l ¬p x = true

Goals accomplished! 🐙
#align list.length_filter_lt_length_iff_exists
List.length_filter_lt_length_iff_exists: ∀ {α : Type u_1} (p : αBool) (l : List α), length (filter p l) < length l x, x l ¬p x = true
List.length_filter_lt_length_iff_exists
theorem
Sublist.countp_le: ∀ {l₁ l₂ : List α}, l₁ <+ l₂countp p l₁ countp p l₂
Sublist.countp_le
(
s: l₁ <+ l₂
s
:
l₁: ?m.17378
l₁
<+
l₂: ?m.17386
l₂
) :
countp: {α : Type ?u.17396} → (αBool) → List α
countp
p: αBool
p
l₁: ?m.17378
l₁
countp: {α : Type ?u.17402} → (αBool) → List α
countp
p: αBool
p
l₂: ?m.17386
l₂
:=

Goals accomplished! 🐙
α: Type u_1

l: List α

p, q: αBool

l₁, l₂: List α

s: l₁ <+ l₂


countp p l₁ countp p l₂

Goals accomplished! 🐙
#align list.sublist.countp_le
List.Sublist.countp_le: ∀ {α : Type u_1} (p : αBool) {l₁ l₂ : List α}, l₁ <+ l₂countp p l₁ countp p l₂
List.Sublist.countp_le
@[simp] theorem
countp_filter: ∀ {α : Type u_1} (p q : αBool) (l : List α), countp p (filter q l) = countp (fun a => decide (p a = true q a = true)) l
countp_filter
(
l: List α
l
:
List: Type ?u.17554 → Type ?u.17554
List
α: ?m.17540
α
) :
countp: {α : Type ?u.17558} → (αBool) → List α
countp
p: αBool
p
(
filter: {α : Type ?u.17563} → (αBool) → List αList α
filter
q: αBool
q
l: List α
l
) =
countp: {α : Type ?u.17569} → (αBool) → List α
countp
(fun
a: ?m.17572
a
=>
p: αBool
p
a: ?m.17572
a
q: αBool
q
a: ?m.17572
a
)
l: List α
l
:=

Goals accomplished! 🐙
α: Type u_1

l✝: List α

p, q: αBool

l: List α


countp p (filter q l) = countp (fun a => decide (p a = true q a = true)) l

Goals accomplished! 🐙
#align list.countp_filter
List.countp_filter: ∀ {α : Type u_1} (p q : αBool) (l : List α), countp p (filter q l) = countp (fun a => decide (p a = true q a = true)) l
List.countp_filter
@[simp] theorem
countp_true: ∀ {α : Type u_1} {l : List α}, countp (fun x => true) l = length l
countp_true
: (
l: List α
l
.
countp: {α : Type ?u.17956} → (αBool) → List α
countp
fun
_: ?m.17962
_
=>
true: Bool
true
) =
l: List α
l
.
length: {α : Type ?u.17966} → List α
length
:=

Goals accomplished! 🐙
α: Type u_1

l: List α

p, q: αBool


countp (fun x => true) l = length l

Goals accomplished! 🐙
#align list.countp_true
List.countp_true: ∀ {α : Type u_1} {l : List α}, countp (fun x => true) l = length l
List.countp_true
@[simp] theorem
countp_false: ∀ {α : Type u_1} {l : List α}, countp (fun x => false) l = 0
countp_false
: (
l: List α
l
.
countp: {α : Type ?u.19913} → (αBool) → List α
countp
fun
_: ?m.19919
_
=>
false: Bool
false
) =
0: ?m.19924
0
:=

Goals accomplished! 🐙
α: Type u_1

l: List α

p, q: αBool


countp (fun x => false) l = 0

Goals accomplished! 🐙
#align list.countp_false
List.countp_false: ∀ {α : Type u_1} {l : List α}, countp (fun x => false) l = 0
List.countp_false
@[simp] theorem
countp_map: ∀ {β : Type u_1} (p : βBool) (f : αβ) (l : List α), countp p (map f l) = countp (p f) l
countp_map
(
p: βBool
p
:
β: ?m.21906
β
Bool: Type
Bool
) (
f: αβ
f
:
α: ?m.21890
α
β: ?m.21906
β
) : ∀
l: ?m.21918
l
,
countp: {α : Type ?u.21922} → (αBool) → List α
countp
p: βBool
p
(
map: {α : Type ?u.21928} → {β : Type ?u.21927} → (αβ) → List αList β
map
f: αβ
f
l: ?m.21918
l
) =
countp: {α : Type ?u.21936} → (αBool) → List α
countp
(
p: βBool
p
f: αβ
f
)
l: ?m.21918
l
| [] =>
rfl: ∀ {α : Sort ?u.21974} {a : α}, a = a
rfl
|
a: α
a
::
l: List α
l
=>

Goals accomplished! 🐙
α: Type u_2

l✝: List α

p✝, q: αBool

β: Type u_1

p: βBool

f: αβ

a: α

l: List α


countp p (map f (a :: l)) = countp (p f) (a :: l)
α: Type u_2

l✝: List α

p✝, q: αBool

β: Type u_1

p: βBool

f: αβ

a: α

l: List α


countp p (map f (a :: l)) = countp (p f) (a :: l)
α: Type u_2

l✝: List α

p✝, q: αBool

β: Type u_1

p: βBool

f: αβ

a: α

l: List α


countp p (f a :: map f l) = countp (p f) (a :: l)
α: Type u_2

l✝: List α

p✝, q: αBool

β: Type u_1

p: βBool

f: αβ

a: α

l: List α


countp p (map f (a :: l)) = countp (p f) (a :: l)
α: Type u_2

l✝: List α

p✝, q: αBool

β: Type u_1

p: βBool

f: αβ

a: α

l: List α


(countp p (map f l) + if p (f a) = true then 1 else 0) = countp (p f) (a :: l)
α: Type u_2

l✝: List α

p✝, q: αBool

β: Type u_1

p: βBool

f: αβ

a: α

l: List α


countp p (map f (a :: l)) = countp (p f) (a :: l)
α: Type u_2

l✝: List α

p✝, q: αBool

β: Type u_1

p: βBool

f: αβ

a: α

l: List α


(countp p (map f l) + if p (f a) = true then 1 else 0) = countp (p f) l + if (p f) a = true then 1 else 0
α: Type u_2

l✝: List α

p✝, q: αBool

β: Type u_1

p: βBool

f: αβ

a: α

l: List α


countp p (map f (a :: l)) = countp (p f) (a :: l)
α: Type u_2

l✝: List α

p✝, q: αBool

β: Type u_1

p: βBool

f: αβ

a: α

l: List α


(countp (p f) l + if p (f a) = true then 1 else 0) = countp (p f) l + if (p f) a = true then 1 else 0
α: Type u_2

l✝: List α

p✝, q: αBool

β: Type u_1

p: βBool

f: αβ

a: α

l: List α


(countp (p f) l + if p (f a) = true then 1 else 0) = countp (p f) l + if (p f) a = true then 1 else 0
α: Type u_2

l✝: List α

p✝, q: αBool

β: Type u_1

p: βBool

f: αβ

a: α

l: List α


(countp (p f) l + if p (f a) = true then 1 else 0) = countp (p f) l + if (p f) a = true then 1 else 0
α: Type u_2

l✝: List α

p✝, q: αBool

β: Type u_1

p: βBool

f: αβ

a: α

l: List α


countp p (map f (a :: l)) = countp (p f) (a :: l)

Goals accomplished! 🐙
#align list.countp_map
List.countp_map: ∀ {α : Type u_2} {β : Type u_1} (p : βBool) (f : αβ) (l : List α), countp p (map f l) = countp (p f) l
List.countp_map
variable {
p: ?m.22344
p
q: ?m.22347
q
} theorem
countp_mono_left: ∀ {α : Type u_1} {l : List α} {p q : αBool}, (∀ (x : α), x lp x = trueq x = true) → countp p l countp q l
countp_mono_left
(
h: ∀ (x : α), x lp x = trueq x = true
h
: ∀
x: ?m.22367
x
l: List α
l
,
p: αBool
p
x: ?m.22367
x
q: αBool
q
x: ?m.22367
x
) :
countp: {α : Type ?u.22423} → (αBool) → List α
countp
p: αBool
p
l: List α
l
countp: {α : Type ?u.22429} → (αBool) → List α
countp
q: αBool
q
l: List α
l
:=

Goals accomplished! 🐙
α: Type u_1

l: List α

p, q: αBool

h: ∀ (x : α), x lp x = trueq x = true


countp p l countp q l
α: Type u_1

l: List α

p, q: αBool

h✝: ∀ (x : α), x lp x = trueq x = true

h: ∀ (x : α), x []p x = trueq x = true


nil
countp p [] countp q []
α: Type u_1

l✝: List α

p, q: αBool

h✝: ∀ (x : α), x l✝p x = trueq x = true

a: α

l: List α

ihl: (∀ (x : α), x lp x = trueq x = true) → countp p l countp q l

h: ∀ (x : α), x a :: lp x = trueq x = true


cons
countp p (a :: l) countp q (a :: l)
α: Type u_1

l: List α

p, q: αBool

h: ∀ (x : α), x lp x = trueq x = true


countp p l countp q l
α: Type u_1

l: List α

p, q: αBool

h✝: ∀ (x : α), x lp x = trueq x = true

h: ∀ (x : α), x []p x = trueq x = true


nil
countp p [] countp q []
α: Type u_1

l: List α

p, q: αBool

h✝: ∀ (x : α), x lp x = trueq x = true

h: ∀ (x : α), x []p x = trueq x = true


nil
countp p [] countp q []
α: Type u_1

l✝: List α

p, q: αBool

h✝: ∀ (x : α), x l✝p x = trueq x = true

a: α

l: List α

ihl: (∀ (x : α), x lp x = trueq x = true) → countp p l countp q l

h: ∀ (x : α), x a :: lp x = trueq x = true


cons
countp p (a :: l) countp q (a :: l)

Goals accomplished! 🐙
α: Type u_1

l: List α

p, q: αBool

h: ∀ (x : α), x lp x = trueq x = true


countp p l countp q l
α: Type u_1

l✝: List α

p, q: αBool

h✝: ∀ (x : α), x l✝p x = trueq x = true

a: α

l: List α

ihl: (∀ (x : α), x lp x = trueq x = true) → countp p l countp q l

h: ∀ (x : α), x a :: lp x = trueq x = true


cons
countp p (a :: l) countp q (a :: l)
α: Type u_1

l✝: List α

p, q: αBool

h✝: ∀ (x : α), x l✝p x = trueq x = true

a: α

l: List α

ihl: (∀ (x : α), x lp x = trueq x = true) → countp p l countp q l

h: (p a = trueq a = true) ∀ (x : α), x lp x = trueq x = true


cons
countp p (a :: l) countp q (a :: l)
α: Type u_1

l✝: List α

p, q: αBool

h✝: ∀ (x : α), x l✝p x = trueq x = true

a: α

l: List α

ihl: (∀ (x : α), x lp x = trueq x = true) → countp p l countp q l

h: (p a = trueq a = true) ∀ (x : α), x lp x = trueq x = true


cons
countp p (a :: l) countp q (a :: l)
α: Type u_1

l✝: List α

p, q: αBool

h✝: ∀ (x : α), x l✝p x = trueq x = true

a: α

l: List α

ihl: (∀ (x : α), x lp x = trueq x = true) → countp p l countp q l

h: (p a = trueq a = true) ∀ (x : α), x lp x = trueq x = true


cons
countp p (a :: l) countp q (a :: l)
α: Type u_1

l: List α

p, q: αBool

h: ∀ (x : α), x lp x = trueq x = true


countp p l countp q l
α: Type u_1

l✝: List α

p, q: αBool

h: ∀ (x : α), x l✝p x = trueq x = true

a: α

l: List α

ihl: (∀ (x : α), x lp x = trueq x = true) → countp p l countp q l

ha: p a = trueq a = true

hl: ∀ (x : α), x lp x = trueq x = true


cons.intro
countp p (a :: l) countp q (a :: l)
α: Type u_1

l: List α

p, q: αBool

h: ∀ (x : α), x lp x = trueq x = true


countp p l countp q l
α: Type u_1

l✝: List α

p, q: αBool

h: ∀ (x : α), x l✝p x = trueq x = true

a: α

l: List α

ihl: (∀ (x : α), x lp x = trueq x = true) → countp p l countp q l

ha: p a = trueq a = true

hl: ∀ (x : α), x lp x = trueq x = true


cons.intro
countp p (a :: l) countp q (a :: l)
α: Type u_1

l✝: List α

p, q: αBool

h: ∀ (x : α), x l✝p x = trueq x = true

a: α

l: List α

ihl: (∀ (x : α), x lp x = trueq x = true) → countp p l countp q l

ha: p a = trueq a = true

hl: ∀ (x : α), x lp x = trueq x = true


cons.intro
(countp p l + if p a = true then 1 else 0) countp q (a :: l)
α: Type u_1

l✝: List α

p, q: αBool

h: ∀ (x : α), x l✝p x = trueq x = true

a: α

l: List α

ihl: (∀ (x : α), x lp x = trueq x = true) → countp p l countp q l

ha: p a = trueq a = true

hl: ∀ (x : α), x lp x = trueq x = true


cons.intro
countp p (a :: l) countp q (a :: l)
α: Type u_1

l✝: List α

p, q: αBool

h: ∀ (x : α), x l✝p x = trueq x = true

a: α

l: List α

ihl: (∀ (x : α), x lp x = trueq x = true) → countp p l countp q l

ha: p a = trueq a = true

hl: ∀ (x : α), x lp x = trueq x = true


cons.intro
(countp p l + if p a = true then 1 else 0) countp q l + if q a = true then 1 else 0
α: Type u_1

l✝: List α

p, q: αBool

h: ∀ (x : α), x l✝p x = trueq x = true

a: α

l: List α

ihl: (∀ (x : α), x lp x = trueq x = true) → countp p l countp q l

ha: p a = trueq a = true

hl: ∀ (x : α), x lp x = trueq x = true


cons.intro
(countp p l + if p a = true then 1 else 0) countp q l + if q a = true then 1 else 0
α: Type u_1

l: List α

p, q: αBool

h: ∀ (x : α), x lp x = trueq x = true


countp p l countp q l
α: Type u_1

l✝: List α

p, q: αBool

h: ∀ (x : α), x l✝p x = trueq x = true

a: α

l: List α

ihl: (∀ (x : α), x lp x = trueq x = true) → countp p l countp q l

ha: p a = trueq a = true

hl: ∀ (x : α), x lp x = trueq x = true


cons.intro
(if p a = true then 1 else 0) if q a = true then 1 else 0
α: Type u_1

l: List α

p, q: αBool

h: ∀ (x : α), x lp x = trueq x = true


countp p l countp q l
α: Type u_1

l✝: List α

p, q: αBool

h: ∀ (x : α), x l✝p x = trueq x = true

a: α

l: List α

ihl: (∀ (x : α), x lp x = trueq x = true) → countp p l countp q l

ha: p a = trueq a = true

hl: ∀ (x : α), x lp x = trueq x = true

h✝¹: p a = true

h✝: q a = true


cons.intro.inl.inl
1 1
α: Type u_1

l✝: List α

p, q: αBool

h: ∀ (x : α), x l✝p x = trueq x = true

a: α

l: List α

ihl: (∀ (x : α), x lp x = trueq x = true) → countp p l countp q l

ha: p a = trueq a = true

hl: ∀ (x : α), x lp x = trueq x = true

h✝¹: p a = true

h✝: ¬q a = true


cons.intro.inl.inr
1 0
α: Type u_1

l✝: List α

p, q: αBool

h: ∀ (x : α), x l✝p x = trueq x = true

a: α

l: List α

ihl: (∀ (x : α), x lp x = trueq x = true) → countp p l countp q l

ha: p a = trueq a = true

hl: ∀ (x : α), x lp x = trueq x = true

h✝¹: ¬p a = true

h✝: q a = true


cons.intro.inr.inl
0 1
α: Type u_1

l✝: List α

p, q: αBool

h: ∀ (x : α), x l✝p x = trueq x = true

a: α

l: List α

ihl: (∀ (x : α), x lp x = trueq x = true) → countp p l countp q l

ha: p a = trueq a = true

hl: ∀ (x : α), x lp x = trueq x = true

h✝¹: ¬p a = true

h✝: ¬q a = true


cons.intro.inr.inr
0 0
α: Type u_1

l✝: List α

p, q: αBool

h: ∀ (x : α), x l✝p x = trueq x = true

a: α

l: List α

ihl: (∀ (x : α), x lp x = trueq x = true) → countp p l countp q l

ha: p a = trueq a = true

hl: ∀ (x : α), x lp x =