Module docstring
{"# 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.
"}
{"# 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.
"}
List.countP_lt_length_iff
      theorem
     {l : List α} {p : α → Bool} : l.countP p < l.length ↔ ∃ a ∈ l, p a = false
        @[simp]
theorem countP_lt_length_iff {l : List α} {p : α → Bool} :
    l.countP p < l.length ↔ ∃ a ∈ l, p a = false := by
  simp [Nat.lt_iff_le_and_ne, countP_le_length]
        List.count_lt_length_iff
      theorem
     {a : α} : l.count a < l.length ↔ ∃ b ∈ l, b ≠ a
        @[simp]
theorem count_lt_length_iff {a : α} : l.count a < l.length ↔ ∃ b ∈ l, b ≠ a := by simp [count]
        List.countP_erase
      theorem
     (p : α → Bool) (l : List α) (a : α) : countP p (l.erase a) = countP p l - if a ∈ l ∧ p a then 1 else 0
        lemma countP_erase (p : α → Bool) (l : List α) (a : α) :
    countP p (l.erase a) = countP p l - if a ∈ l ∧ p a then 1 else 0 := by
  rw [countP_eq_length_filter, countP_eq_length_filter, ← erase_filter, length_erase]
  aesop
        List.count_diff
      theorem
     (a : α) (l₁ : List α) : ∀ l₂, count a (l₁.diff l₂) = count a l₁ - count a l₂
        lemma count_diff (a : α) (l₁ : List α) :
    ∀ l₂, count a (l₁.diff l₂) = count a l₁ - count a l₂
  | [] => rfl
  | b :: l₂ => by
    simp only [diff_cons, count_diff, count_erase, beq_iff_eq, Nat.sub_right_comm, count_cons,
      Nat.sub_add_eq]
        List.countP_diff
      theorem
     (hl : l₂ <+~ l₁) (p : α → Bool) : countP p (l₁.diff l₂) = countP p l₁ - countP p l₂
        lemma countP_diff (hl : l₂ <+~ l₁) (p : α → Bool) :
    countP p (l₁.diff l₂) = countP p l₁ - countP p l₂ := by
  refine (Nat.sub_eq_of_eq_add ?_).symm
  rw [← countP_append]
  exact ((subperm_append_diff_self_of_count_le <| subperm_ext_iff.1 hl).symm.trans
    perm_append_comm).countP_eq _
        List.count_map_of_injective
      theorem
     [DecidableEq β] (l : List α) (f : α → β) (hf : Function.Injective f) (x : α) : count (f x) (map f l) = count x l
        @[simp]
theorem count_map_of_injective [DecidableEq β] (l : List α) (f : α → β)
    (hf : Function.Injective f) (x : α) : count (f x) (map f l) = count x l := by
  simp only [count, countP_map]
  unfold Function.comp
  simp only [hf.beq_eq]