mathlib3 documentation

data.finset.basic

Finite sets #

THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.

Terms of type finset α are one way of talking about finite subsets of α in mathlib. Below, finset α is defined as a structure with 2 fields:

  1. val is a multiset α of elements;
  2. nodup is a proof that val has no duplicates.

Finsets in Lean are constructive in that they have an underlying list that enumerates their elements. In particular, any function that uses the data of the underlying list cannot depend on its ordering. This is handled on the multiset level by multiset API, so in most cases one needn't worry about it explicitly.

Finsets give a basic foundation for defining finite sums and products over types:

  1. ∑ i in (s : finset α), f i;
  2. ∏ i in (s : finset α), f i.

Lean refers to these operations as big_operators. More information can be found in algebra.big_operators.basic.

Finsets are directly used to define fintypes in Lean. A fintype α instance for a type α consists of a universal finset α containing every term of α, called univ. See data.fintype.basic. There is also univ', the noncomputable partner to univ, which is defined to be α as a finset if α is finite, and the empty finset otherwise. See data.fintype.basic.

finset.card, the size of a finset is defined in data.finset.card. This is then used to define fintype.card, the size of a type.

Main declarations #

Main definitions #

Finset constructions #

Finsets from functions #

The lattice structure on subsets of finsets #

There is a natural lattice structure on the subsets of a set. In Lean, we use lattice notation to talk about things involving unions and intersections. See order.lattice. For the lattice structure on finsets, is called bot with ⊥ = ∅ and is called top with ⊤ = univ.

Operations on two or more finsets #

Maps constructed using finsets #

Predicates on finsets #

Equivalences between finsets #

Tags #

finite sets, finset

structure finset (α : Type u_4) :
Type u_4

finset α is the type of finite sets of elements of α. It is implemented as a multiset (a list up to permutation) which has no duplicate elements.

Instances for finset
@[protected, instance]
Equations
theorem finset.eq_of_veq {α : Type u_1} {s t : finset α} :
s.val = t.val s = t
@[simp]
theorem finset.val_inj {α : Type u_1} {s t : finset α} :
s.val = t.val s = t
@[simp]
theorem finset.dedup_eq_self {α : Type u_1} [decidable_eq α] (s : finset α) :
@[protected, instance]
Equations

membership #

@[protected, instance]
def finset.has_mem {α : Type u_1} :
has_mem α (finset α)
Equations
theorem finset.mem_def {α : Type u_1} {a : α} {s : finset α} :
a s a s.val
@[simp]
theorem finset.mem_val {α : Type u_1} {a : α} {s : finset α} :
a s.val a s
@[simp]
theorem finset.mem_mk {α : Type u_1} {a : α} {s : multiset α} {nd : s.nodup} :
a {val := s, nodup := nd} a s
@[protected, instance]
def finset.decidable_mem {α : Type u_1} [h : decidable_eq α] (a : α) (s : finset α) :
Equations

set coercion #

@[protected, instance]
def finset.set.has_coe_t {α : Type u_1} :
has_coe_t (finset α) (set α)

Convert a finset to a set in the natural way.

Equations
@[simp, norm_cast]
theorem finset.mem_coe {α : Type u_1} {a : α} {s : finset α} :
a s a s
@[simp]
theorem finset.set_of_mem {α : Type u_1} {s : finset α} :
{a : α | a s} = s
@[simp]
theorem finset.coe_mem {α : Type u_1} {s : finset α} (x : s) :
x s
@[simp]
theorem finset.mk_coe {α : Type u_1} {s : finset α} (x : s) {h : x s} :
x, h⟩ = x
@[protected, instance]
def finset.decidable_mem' {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) :
Equations

extensionality #

theorem finset.ext_iff {α : Type u_1} {s₁ s₂ : finset α} :
s₁ = s₂ (a : α), a s₁ a s₂
@[ext]
theorem finset.ext {α : Type u_1} {s₁ s₂ : finset α} :
( (a : α), a s₁ a s₂) s₁ = s₂
@[simp, norm_cast]
theorem finset.coe_inj {α : Type u_1} {s₁ s₂ : finset α} :
s₁ = s₂ s₁ = s₂

type coercion #

@[protected, instance]

Coercion from a finset to the corresponding subtype.

Equations
@[protected, simp]
theorem finset.forall_coe {α : Type u_1} (s : finset α) (p : s Prop) :
( (x : s), p x) (x : α) (h : x s), p x, h⟩
@[protected, simp]
theorem finset.exists_coe {α : Type u_1} (s : finset α) (p : s Prop) :
( (x : s), p x) (x : α) (h : x s), p x, h⟩
@[protected, instance]
def finset.pi_finset_coe.can_lift (ι : Type u_1) (α : ι Type u_2) [ne : (i : ι), nonempty (α i)] (s : finset ι) :
can_lift (Π (i : s), α i) (Π (i : ι), α i) (λ (f : Π (i : ι), α i) (i : s), f i) (λ (_x : Π (i : s), α i), true)
Equations
@[protected, instance]
def finset.pi_finset_coe.can_lift' (ι : Type u_1) (α : Type u_2) [ne : nonempty α] (s : finset ι) :
can_lift (s α) α) (λ (f : ι α) (i : s), f i) (λ (_x : s α), true)
Equations
@[protected, instance]
def finset.finset_coe.can_lift {α : Type u_1} (s : finset α) :
can_lift α s coe (λ (a : α), a s)
Equations
@[simp, norm_cast]
theorem finset.coe_sort_coe {α : Type u_1} (s : finset α) :

Subset and strict subset relations #

@[protected, instance]
def finset.has_subset {α : Type u_1} :
Equations
@[protected, instance]
def finset.has_ssubset {α : Type u_1} :
Equations
@[protected, instance]
@[protected, instance]
@[protected, instance]
@[protected, instance]
theorem finset.subset_def {α : Type u_1} {s t : finset α} :
s t s.val t.val
theorem finset.ssubset_def {α : Type u_1} {s t : finset α} :
s t s t ¬t s
@[simp]
theorem finset.subset.refl {α : Type u_1} (s : finset α) :
s s
@[protected]
theorem finset.subset.rfl {α : Type u_1} {s : finset α} :
s s
@[protected]
theorem finset.subset_of_eq {α : Type u_1} {s t : finset α} (h : s = t) :
s t
theorem finset.subset.trans {α : Type u_1} {s₁ s₂ s₃ : finset α} :
s₁ s₂ s₂ s₃ s₁ s₃
theorem finset.superset.trans {α : Type u_1} {s₁ s₂ s₃ : finset α} :
s₁ s₂ s₂ s₃ s₁ s₃
theorem finset.mem_of_subset {α : Type u_1} {s₁ s₂ : finset α} {a : α} :
s₁ s₂ a s₁ a s₂
theorem finset.not_mem_mono {α : Type u_1} {s t : finset α} (h : s t) {a : α} :
a t a s
theorem finset.subset.antisymm {α : Type u_1} {s₁ s₂ : finset α} (H₁ : s₁ s₂) (H₂ : s₂ s₁) :
s₁ = s₂
theorem finset.subset_iff {α : Type u_1} {s₁ s₂ : finset α} :
s₁ s₂ ⦃x : α⦄, x s₁ x s₂
@[simp, norm_cast]
theorem finset.coe_subset {α : Type u_1} {s₁ s₂ : finset α} :
s₁ s₂ s₁ s₂
@[simp]
theorem finset.val_le_iff {α : Type u_1} {s₁ s₂ : finset α} :
s₁.val s₂.val s₁ s₂
theorem finset.subset.antisymm_iff {α : Type u_1} {s₁ s₂ : finset α} :
s₁ = s₂ s₁ s₂ s₂ s₁
theorem finset.not_subset {α : Type u_1} {s t : finset α} :
¬s t (x : α) (H : x s), x t
theorem finset.le_iff_subset {α : Type u_1} {s₁ s₂ : finset α} :
s₁ s₂ s₁ s₂
theorem finset.lt_iff_ssubset {α : Type u_1} {s₁ s₂ : finset α} :
s₁ < s₂ s₁ s₂
@[simp, norm_cast]
theorem finset.coe_ssubset {α : Type u_1} {s₁ s₂ : finset α} :
s₁ s₂ s₁ s₂
@[simp]
theorem finset.val_lt_iff {α : Type u_1} {s₁ s₂ : finset α} :
s₁.val < s₂.val s₁ s₂
theorem finset.ssubset_iff_subset_ne {α : Type u_1} {s t : finset α} :
s t s t s t
theorem finset.ssubset_iff_of_subset {α : Type u_1} {s₁ s₂ : finset α} (h : s₁ s₂) :
s₁ s₂ (x : α) (H : x s₂), x s₁
theorem finset.ssubset_of_ssubset_of_subset {α : Type u_1} {s₁ s₂ s₃ : finset α} (hs₁s₂ : s₁ s₂) (hs₂s₃ : s₂ s₃) :
s₁ s₃
theorem finset.ssubset_of_subset_of_ssubset {α : Type u_1} {s₁ s₂ s₃ : finset α} (hs₁s₂ : s₁ s₂) (hs₂s₃ : s₂ s₃) :
s₁ s₃
theorem finset.exists_of_ssubset {α : Type u_1} {s₁ s₂ : finset α} (h : s₁ s₂) :
(x : α) (H : x s₂), x s₁
@[protected, instance]

Order embedding from finset α to set α #

def finset.coe_emb {α : Type u_1} :

Coercion to set α as an order_embedding.

Equations
@[simp]

Nonempty #

@[protected]
def finset.nonempty {α : Type u_1} (s : finset α) :
Prop

The property s.nonempty expresses the fact that the finset s is not empty. It should be used in theorem assumptions instead of ∃ x, x ∈ s or s ≠ ∅ as it gives access to a nice API thanks to the dot notation.

Equations
Instances for finset.nonempty
@[protected, instance]
def finset.decidable_nonempty {α : Type u_1} {s : finset α} :
Equations
@[simp, norm_cast]
theorem finset.coe_nonempty {α : Type u_1} {s : finset α} :
@[simp]
theorem finset.nonempty_coe_sort {α : Type u_1} {s : finset α} :
theorem finset.nonempty.to_set {α : Type u_1} {s : finset α} :

Alias of the reverse direction of finset.coe_nonempty.

theorem finset.nonempty.coe_sort {α : Type u_1} {s : finset α} :

Alias of the reverse direction of finset.nonempty_coe_sort.

theorem finset.nonempty.bex {α : Type u_1} {s : finset α} (h : s.nonempty) :
(x : α), x s
theorem finset.nonempty.mono {α : Type u_1} {s t : finset α} (hst : s t) (hs : s.nonempty) :
theorem finset.nonempty.forall_const {α : Type u_1} {s : finset α} (h : s.nonempty) {p : Prop} :
( (x : α), x s p) p
theorem finset.nonempty.to_subtype {α : Type u_1} {s : finset α} :
theorem finset.nonempty.to_type {α : Type u_1} {s : finset α} :

empty #

@[protected]
def finset.empty {α : Type u_1} :

The empty finset

Equations
@[protected, instance]
def finset.has_emptyc {α : Type u_1} :
Equations
@[protected, instance]
def finset.inhabited_finset {α : Type u_1} :
Equations
@[simp]
theorem finset.empty_val {α : Type u_1} :
@[simp]
theorem finset.not_mem_empty {α : Type u_1} (a : α) :
@[simp]
@[simp]
theorem finset.mk_zero {α : Type u_1} :
{val := 0, nodup := _} =
theorem finset.ne_empty_of_mem {α : Type u_1} {a : α} {s : finset α} (h : a s) :
theorem finset.nonempty.ne_empty {α : Type u_1} {s : finset α} (h : s.nonempty) :
@[simp]
theorem finset.empty_subset {α : Type u_1} (s : finset α) :
theorem finset.eq_empty_of_forall_not_mem {α : Type u_1} {s : finset α} (H : (x : α), x s) :
s =
theorem finset.eq_empty_iff_forall_not_mem {α : Type u_1} {s : finset α} :
s = (x : α), x s
@[simp]
theorem finset.val_eq_zero {α : Type u_1} {s : finset α} :
s.val = 0 s =
theorem finset.subset_empty {α : Type u_1} {s : finset α} :
@[simp]
theorem finset.not_ssubset_empty {α : Type u_1} (s : finset α) :
theorem finset.nonempty_of_ne_empty {α : Type u_1} {s : finset α} (h : s ) :
theorem finset.nonempty_iff_ne_empty {α : Type u_1} {s : finset α} :
@[simp]
theorem finset.not_nonempty_iff_eq_empty {α : Type u_1} {s : finset α} :
theorem finset.eq_empty_or_nonempty {α : Type u_1} (s : finset α) :
@[simp, norm_cast]
theorem finset.coe_empty {α : Type u_1} :
@[simp, norm_cast]
theorem finset.coe_eq_empty {α : Type u_1} {s : finset α} :
@[simp]
theorem finset.is_empty_coe_sort {α : Type u_1} {s : finset α} :
@[protected, instance]
theorem finset.eq_empty_of_is_empty {α : Type u_1} [is_empty α] (s : finset α) :
s =

A finset for an empty type is empty.

@[protected, instance]
def finset.order_bot {α : Type u_1} :
Equations
@[simp]
theorem finset.bot_eq_empty {α : Type u_1} :
@[simp]
theorem finset.empty_ssubset {α : Type u_1} {s : finset α} :
theorem finset.nonempty.empty_ssubset {α : Type u_1} {s : finset α} :

Alias of the reverse direction of finset.empty_ssubset.

singleton #

@[protected, instance]
def finset.has_singleton {α : Type u_1} :

{a} : finset a is the set {a} containing a and nothing else.

This differs from insert a ∅ in that it does not require a decidable_eq instance for α.

Equations
@[simp]
theorem finset.singleton_val {α : Type u_1} (a : α) :
{a}.val = {a}
@[simp]
theorem finset.mem_singleton {α : Type u_1} {a b : α} :
b {a} b = a
theorem finset.eq_of_mem_singleton {α : Type u_1} {x y : α} (h : x {y}) :
x = y
theorem finset.not_mem_singleton {α : Type u_1} {a b : α} :
a {b} a b
theorem finset.mem_singleton_self {α : Type u_1} (a : α) :
a {a}
@[simp]
theorem finset.val_eq_singleton_iff {α : Type u_1} {a : α} {s : finset α} :
s.val = {a} s = {a}
@[simp]
theorem finset.singleton_inj {α : Type u_1} {a b : α} :
{a} = {b} a = b
@[simp]
theorem finset.singleton_nonempty {α : Type u_1} (a : α) :
@[simp]
theorem finset.singleton_ne_empty {α : Type u_1} (a : α) :
{a}
theorem finset.empty_ssubset_singleton {α : Type u_1} {a : α} :
{a}
@[simp, norm_cast]
theorem finset.coe_singleton {α : Type u_1} (a : α) :
{a} = {a}
@[simp, norm_cast]
theorem finset.coe_eq_singleton {α : Type u_1} {s : finset α} {a : α} :
s = {a} s = {a}
theorem finset.eq_singleton_iff_unique_mem {α : Type u_1} {s : finset α} {a : α} :
s = {a} a s (x : α), x s x = a
theorem finset.eq_singleton_iff_nonempty_unique_mem {α : Type u_1} {s : finset α} {a : α} :
s = {a} s.nonempty (x : α), x s x = a

Alias of the forward direction of finset.nonempty_iff_eq_singleton_default.

theorem finset.singleton_iff_unique_mem {α : Type u_1} (s : finset α) :
( (a : α), s = {a}) ∃! (a : α), a s
theorem finset.singleton_subset_set_iff {α : Type u_1} {s : set α} {a : α} :
{a} s a s
@[simp]
theorem finset.singleton_subset_iff {α : Type u_1} {s : finset α} {a : α} :
{a} s a s
@[simp]
theorem finset.subset_singleton_iff {α : Type u_1} {s : finset α} {a : α} :
s {a} s = s = {a}
theorem finset.singleton_subset_singleton {α : Type u_1} {a b : α} :
{a} {b} a = b
@[protected]
theorem finset.nonempty.subset_singleton_iff {α : Type u_1} {s : finset α} {a : α} (h : s.nonempty) :
s {a} s = {a}
theorem finset.subset_singleton_iff' {α : Type u_1} {s : finset α} {a : α} :
s {a} (b : α), b s b = a
@[simp]
theorem finset.ssubset_singleton_iff {α : Type u_1} {s : finset α} {a : α} :
s {a} s =
theorem finset.eq_empty_of_ssubset_singleton {α : Type u_1} {s : finset α} {x : α} (hs : s {x}) :
s =
@[protected, reducible]
def finset.nontrivial {α : Type u_1} (s : finset α) :
Prop

A finset is nontrivial if it has at least two elements.

Equations
@[simp]
@[simp]
theorem finset.not_nontrivial_singleton {α : Type u_1} {a : α} :
theorem finset.nontrivial.ne_singleton {α : Type u_1} {s : finset α} {a : α} (hs : s.nontrivial) :
s {a}
theorem finset.eq_singleton_or_nontrivial {α : Type u_1} {s : finset α} {a : α} (ha : a s) :
s = {a} s.nontrivial
theorem finset.nontrivial_iff_ne_singleton {α : Type u_1} {s : finset α} {a : α} (ha : a s) :
theorem finset.nonempty.exists_eq_singleton_or_nontrivial {α : Type u_1} {s : finset α} :
s.nonempty ( (a : α), s = {a}) s.nontrivial
@[protected, instance]
def finset.nontrivial' {α : Type u_1} [nonempty α] :
@[protected, instance]
def finset.unique {α : Type u_1} [is_empty α] :
Equations

cons #

def finset.cons {α : Type u_1} (a : α) (s : finset α) (h : a s) :

cons a s h is the set {a} ∪ s containing a and the elements of s. It is the same as insert a s when it is defined, but unlike insert a s it does not require decidable_eq α, and the union is guaranteed to be disjoint.

Equations
@[simp]
theorem finset.mem_cons {α : Type u_1} {s : finset α} {a b : α} {h : a s} :
b finset.cons a s h b = a b s
@[simp]
theorem finset.mem_cons_self {α : Type u_1} (a : α) (s : finset α) {h : a s} :
@[simp]
theorem finset.cons_val {α : Type u_1} {s : finset α} {a : α} (h : a s) :
(finset.cons a s h).val = a ::ₘ s.val
theorem finset.forall_mem_cons {α : Type u_1} {s : finset α} {a : α} (h : a s) (p : α Prop) :
( (x : α), x finset.cons a s h p x) p a (x : α), x s p x
theorem finset.forall_of_forall_cons {α : Type u_1} {s : finset α} {a : α} {p : α Prop} {h : a s} (H : (x : α), x finset.cons a s h p x) (x : α) (h_1 : x s) :
p x

Useful in proofs by induction.

@[simp]
theorem finset.mk_cons {α : Type u_1} {a : α} {s : multiset α} (h : (a ::ₘ s).nodup) :
{val := a ::ₘ s, nodup := h} = finset.cons a {val := s, nodup := _} _
@[simp]
theorem finset.cons_empty {α : Type u_1} (a : α) :
finset.cons a _ = {a}
@[simp]
theorem finset.nonempty_cons {α : Type u_1} {s : finset α} {a : α} (h : a s) :
@[simp]
theorem finset.nonempty_mk {α : Type u_1} {m : multiset α} {hm : m.nodup} :
{val := m, nodup := hm}.nonempty m 0
@[simp]
theorem finset.coe_cons {α : Type u_1} {a : α} {s : finset α} {h : a s} :
theorem finset.subset_cons {α : Type u_1} {s : finset α} {a : α} (h : a s) :
theorem finset.ssubset_cons {α : Type u_1} {s : finset α} {a : α} (h : a s) :
theorem finset.cons_subset {α : Type u_1} {s t : finset α} {a : α} {h : a s} :
finset.cons a s h t a t s t
@[simp]
theorem finset.cons_subset_cons {α : Type u_1} {s t : finset α} {a : α} {hs : a s} {ht : a t} :
finset.cons a s hs finset.cons a t ht s t
theorem finset.ssubset_iff_exists_cons_subset {α : Type u_1} {s t : finset α} :
s t (a : α) (h : a s), finset.cons a s h t

disjoint #

theorem finset.disjoint_left {α : Type u_1} {s t : finset α} :
disjoint s t ⦃a : α⦄, a s a t
theorem finset.disjoint_right {α : Type u_1} {s t : finset α} :
disjoint s t ⦃a : α⦄, a t a s
theorem finset.disjoint_iff_ne {α : Type u_1} {s t : finset α} :
disjoint s t (a : α), a s (b : α), b t a b
@[simp]
theorem finset.disjoint_val {α : Type u_1} {s t : finset α} :
theorem disjoint.forall_ne_finset {α : Type u_1} {s t : finset α} {a b : α} (h : disjoint s t) (ha : a s) (hb : b t) :
a b
theorem finset.not_disjoint_iff {α : Type u_1} {s t : finset α} :
¬disjoint s t (a : α), a s a t
theorem finset.disjoint_of_subset_left {α : Type u_1} {s t u : finset α} (h : s u) (d : disjoint u t) :
theorem finset.disjoint_of_subset_right {α : Type u_1} {s t u : finset α} (h : t u) (d : disjoint s u) :
@[simp]
theorem finset.disjoint_empty_left {α : Type u_1} (s : finset α) :
@[simp]
theorem finset.disjoint_empty_right {α : Type u_1} (s : finset α) :
@[simp]
theorem finset.disjoint_singleton_left {α : Type u_1} {s : finset α} {a : α} :
disjoint {a} s a s
@[simp]
theorem finset.disjoint_singleton_right {α : Type u_1} {s : finset α} {a : α} :
disjoint s {a} a s
@[simp]
theorem finset.disjoint_singleton {α : Type u_1} {a b : α} :
disjoint {a} {b} a b
theorem finset.disjoint_self_iff_empty {α : Type u_1} (s : finset α) :
@[simp, norm_cast]
theorem finset.disjoint_coe {α : Type u_1} {s t : finset α} :
@[simp, norm_cast]
theorem finset.pairwise_disjoint_coe {α : Type u_1} {ι : Type u_2} {s : set ι} {f : ι finset α} :
s.pairwise_disjoint (λ (i : ι), (f i)) s.pairwise_disjoint f

disjoint union #

def finset.disj_union {α : Type u_1} (s t : finset α) (h : disjoint s t) :

disj_union s t h is the set such that a ∈ disj_union s t h iff a ∈ s or a ∈ t. It is the same as s ∪ t, but it does not require decidable equality on the type. The hypothesis ensures that the sets are disjoint.

Equations
@[simp]
theorem finset.mem_disj_union {α : Type u_1} {s t : finset α} {h : disjoint s t} {a : α} :
a s.disj_union t h a s a t
theorem finset.disj_union_comm {α : Type u_1} (s t : finset α) (h : disjoint s t) :
s.disj_union t h = t.disj_union s _
@[simp]
theorem finset.empty_disj_union {α : Type u_1} (t : finset α) (h : disjoint t := disjoint_bot_left) :
@[simp]
theorem finset.disj_union_empty {α : Type u_1} (s : finset α) (h : disjoint s := disjoint_bot_right) :
theorem finset.singleton_disj_union {α : Type u_1} (a : α) (t : finset α) (h : disjoint {a} t) :
{a}.disj_union t h = finset.cons a t _
theorem finset.disj_union_singleton {α : Type u_1} (s : finset α) (a : α) (h : disjoint s {a}) :
s.disj_union {a} h = finset.cons a s _

insert #

@[protected, instance]
def finset.has_insert {α : Type u_1} [decidable_eq α] :

insert a s is the set {a} ∪ s containing a and the elements of s.

Equations
theorem finset.insert_def {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) :
@[simp]
theorem finset.insert_val {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) :
theorem finset.insert_val' {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) :
theorem finset.insert_val_of_not_mem {α : Type u_1} [decidable_eq α] {a : α} {s : finset α} (h : a s) :
@[simp]
theorem finset.mem_insert {α : Type u_1} [decidable_eq α] {s : finset α} {a b : α} :
theorem finset.mem_insert_self {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) :
theorem finset.mem_insert_of_mem {α : Type u_1} [decidable_eq α] {s : finset α} {a b : α} (h : a s) :
theorem finset.mem_of_mem_insert_of_ne {α : Type u_1} [decidable_eq α] {s : finset α} {a b : α} (h : b has_insert.insert a s) :
b a b s
theorem finset.eq_of_not_mem_of_mem_insert {α : Type u_1} [decidable_eq α] {s : finset α} {a b : α} (ha : b has_insert.insert a s) (hb : b s) :
b = a
@[simp]
theorem finset.cons_eq_insert {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) (h : a s) :
@[simp, norm_cast]
theorem finset.coe_insert {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) :
theorem finset.mem_insert_coe {α : Type u_1} [decidable_eq α] {s : finset α} {x y : α} :
@[protected, instance]
@[simp]
theorem finset.insert_eq_of_mem {α : Type u_1} [decidable_eq α] {s : finset α} {a : α} (h : a s) :
@[simp]
theorem finset.insert_eq_self {α : Type u_1} [decidable_eq α] {s : finset α} {a : α} :
theorem finset.insert_ne_self {α : Type u_1} [decidable_eq α] {s : finset α} {a : α} :
@[simp]
theorem finset.pair_eq_singleton {α : Type u_1} [decidable_eq α] (a : α) :
{a, a} = {a}
@[simp, norm_cast]
theorem finset.coe_pair {α : Type u_1} [decidable_eq α] {a b : α} :
{a, b} = {a, b}
@[simp, norm_cast]
theorem finset.coe_eq_pair {α : Type u_1} [decidable_eq α] {s : finset α} {a b : α} :
s = {a, b} s = {a, b}
theorem finset.pair_comm {α : Type u_1} [decidable_eq α] (a b : α) :
{a, b} = {b, a}
@[simp]
theorem finset.insert_idem {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) :
@[simp]
theorem finset.insert_nonempty {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) :
@[simp]
theorem finset.insert_ne_empty {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) :

The universe annotation is required for the following instance, possibly this is a bug in Lean. See leanprover.zulipchat.com/#narrow/stream/113488-general/topic/strange.20error.20(universe.20issue.3F)

@[protected, instance]
theorem finset.ne_insert_of_not_mem {α : Type u_1} [decidable_eq α] (s t : finset α) {a : α} (h : a s) :
theorem finset.insert_subset {α : Type u_1} [decidable_eq α] {s t : finset α} {a : α} :
theorem finset.subset_insert {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) :
theorem finset.insert_subset_insert {α : Type u_1} [decidable_eq α] (a : α) {s t : finset α} (h : s t) :
theorem finset.insert_inj {α : Type u_1} [decidable_eq α] {s : finset α} {a b : α} (ha : a s) :
theorem finset.insert_inj_on {α : Type u_1} [decidable_eq α] (s : finset α) :
set.inj_on (λ (a : α), has_insert.insert a s) (s)
theorem finset.ssubset_iff {α : Type u_1} [decidable_eq α] {s t : finset α} :
s t (a : α) (H : a s), has_insert.insert a s t
theorem finset.ssubset_insert {α : Type u_1} [decidable_eq α] {s : finset α} {a : α} (h : a s) :
theorem finset.cons_induction {α : Type u_1} {p : finset α Prop} (h₁ : p ) (h₂ : ⦃a : α⦄ {s : finset α} (h : a s), p s p (finset.cons a s h)) (s : finset α) :
p s
theorem finset.cons_induction_on {α : Type u_1} {p : finset α Prop} (s : finset α) (h₁ : p ) (h₂ : ⦃a : α⦄ {s : finset α} (h : a s), p s p (finset.cons a s h)) :
p s
@[protected]
theorem finset.induction {α : Type u_1} {p : finset α Prop} [decidable_eq α] (h₁ : p ) (h₂ : ⦃a : α⦄ {s : finset α}, a s p s p (has_insert.insert a s)) (s : finset α) :
p s
@[protected]
theorem finset.induction_on {α : Type u_1} {p : finset α Prop} [decidable_eq α] (s : finset α) (h₁ : p ) (h₂ : ⦃a : α⦄ {s : finset α}, a s p s p (has_insert.insert a s)) :
p s

To prove a proposition about an arbitrary finset α, it suffices to prove it for the empty finset, and to show that if it holds for some finset α, then it holds for the finset obtained by inserting a new element.

theorem finset.induction_on' {α : Type u_1} {p : finset α Prop} [decidable_eq α] (S : finset α) (h₁ : p ) (h₂ : {a : α} {s : finset α}, a S s S a s p s p (has_insert.insert a s)) :
p S

To prove a proposition about S : finset α, it suffices to prove it for the empty finset, and to show that if it holds for some finset α ⊆ S, then it holds for the finset obtained by inserting a new element of S.

theorem finset.nonempty.cons_induction {α : Type u_1} {p : Π (s : finset α), s.nonempty Prop} (h₀ : (a : α), p {a} _) (h₁ : ⦃a : α⦄ (s : finset α) (h : a s) (hs : s.nonempty), p s hs p (finset.cons a s h) _) {s : finset α} (hs : s.nonempty) :
p s hs

To prove a proposition about a nonempty s : finset α, it suffices to show it holds for all singletons and that if it holds for nonempty t : finset α, then it also holds for the finset obtained by inserting an element in t.

def finset.subtype_insert_equiv_option {α : Type u_1} [decidable_eq α] {t : finset α} {x : α} (h : x t) :
{i // i has_insert.insert x t} option {i // i t}

Inserting an element to a finite set is equivalent to the option type.

Equations
@[simp]
theorem finset.disjoint_insert_left {α : Type u_1} [decidable_eq α] {s t : finset α} {a : α} :
@[simp]
theorem finset.disjoint_insert_right {α : Type u_1} [decidable_eq α] {s t : finset α} {a : α} :

Lattice structure #

@[protected, instance]
def finset.has_union {α : Type u_1} [decidable_eq α] :

s ∪ t is the set such that a ∈ s ∪ t iff a ∈ s or a ∈ t.

Equations
@[protected, instance]
def finset.has_inter {α : Type u_1} [decidable_eq α] :

s ∩ t is the set such that a ∈ s ∩ t iff a ∈ s and a ∈ t.

Equations
theorem finset.disjoint_iff_inter_eq_empty {α : Type u_1} [decidable_eq α] {s t : finset α} :
disjoint s t s t =
@[protected, instance]
def finset.decidable_disjoint {α : Type u_1} [decidable_eq α] (U V : finset α) :
Equations

union #

theorem finset.union_val_nd {α : Type u_1} [decidable_eq α] (s t : finset α) :
(s t).val = s.val.ndunion t.val
@[simp]
theorem finset.union_val {α : Type u_1} [decidable_eq α] (s t : finset α) :
(s t).val = s.val t.val
@[simp]
theorem finset.mem_union {α : Type u_1} [decidable_eq α] {s t : finset α} {a : α} :
a s t a s a t
@[simp]
theorem finset.disj_union_eq_union {α : Type u_1} [decidable_eq α] (s t : finset α) (h : disjoint s t) :
s.disj_union t h = s t
theorem finset.mem_union_left {α : Type u_1} [decidable_eq α] {s : finset α} {a : α} (t : finset α) (h : a s) :
a s t
theorem finset.mem_union_right {α : Type u_1} [decidable_eq α] {t : finset α} {a : α} (s : finset α) (h : a t) :
a s t
theorem finset.forall_mem_union {α : Type u_1} [decidable_eq α] {s t : finset α} {p : α Prop} :
( (a : α), a s t p a) ( (a : α), a s p a) (a : α), a t p a
theorem finset.not_mem_union {α : Type u_1} [decidable_eq α] {s t : finset α} {a : α} :
a s t a s a t
@[simp, norm_cast]
theorem finset.coe_union {α : Type u_1} [decidable_eq α] (s₁ s₂ : finset α) :
(s₁ s₂) = s₁ s₂
theorem finset.union_subset {α : Type u_1} [decidable_eq α] {s t u : finset α} (hs : s u) :
t u s t u
theorem finset.subset_union_left {α : Type u_1} [decidable_eq α] (s₁ s₂ : finset α) :
s₁ s₁ s₂
theorem finset.subset_union_right {α : Type u_1} [decidable_eq α] (s₁ s₂ : finset α) :
s₂ s₁ s₂
theorem finset.union_subset_union {α : Type u_1} [decidable_eq α] {s t u v : finset α} (hsu : s u) (htv : t v) :
s t u v
theorem finset.union_subset_union_left {α : Type u_1} [decidable_eq α] {s₁ s₂ t : finset α} (h : s₁ s₂) :
s₁ t s₂ t
theorem finset.union_subset_union_right {α : Type u_1} [decidable_eq α] {s t₁ t₂ : finset α} (h : t₁ t₂) :
s t₁ s t₂
theorem finset.union_comm {α : Type u_1} [decidable_eq α] (s₁ s₂ : finset α) :
s₁ s₂ = s₂ s₁
@[simp]
theorem finset.union_assoc {α : Type u_1} [decidable_eq α] (s₁ s₂ s₃ : finset α) :
s₁ s₂ s₃ = s₁ (s₂ s₃)
@[simp]
theorem finset.union_idempotent {α : Type u_1} [decidable_eq α] (s : finset α) :
s s = s
theorem finset.union_subset_left {α : Type u_1} [decidable_eq α] {s t u : finset α} (h : s t u) :
s u
theorem finset.union_subset_right {α : Type u_1} [decidable_eq α] {s t u : finset α} (h : s t u) :
t u
theorem finset.union_left_comm {α : Type u_1} [decidable_eq α] (s t u : finset α) :
s (t u) = t (s u)
theorem finset.union_right_comm {α : Type u_1} [decidable_eq α] (s t u : finset α) :
s t u = s u t
theorem finset.union_self {α : Type u_1} [decidable_eq α] (s : finset α) :
s s = s
@[simp]
theorem finset.union_empty {α : Type u_1} [decidable_eq α] (s : finset α) :
s = s
@[simp]
theorem finset.empty_union {α : Type u_1} [decidable_eq α] (s : finset α) :
s = s
theorem finset.insert_eq {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) :
@[simp]
theorem finset.insert_union {α : Type u_1} [decidable_eq α] (a : α) (s t : finset α) :
@[simp]
theorem finset.union_insert {α : Type u_1} [decidable_eq α] (a : α) (s t : finset α) :
@[simp]
theorem finset.union_eq_left_iff_subset {α : Type u_1} [decidable_eq α] {s t : finset α} :
s t = s t s
@[simp]
theorem finset.left_eq_union_iff_subset {α : Type u_1} [decidable_eq α] {s t : finset α} :
s = s t t s
@[simp]
theorem finset.union_eq_right_iff_subset {α : Type u_1} [decidable_eq α] {s t : finset α} :
s t = t s t
@[simp]
theorem finset.right_eq_union_iff_subset {α : Type u_1} [decidable_eq α] {s t : finset α} :
s = t s t s
theorem finset.union_congr_left {α : Type u_1} [decidable_eq α] {s t u : finset α} (ht : t s u) (hu : u s t) :
s t = s u
theorem finset.union_congr_right {α : Type u_1} [decidable_eq α] {s t u : finset α} (hs : s t u) (ht : t s u) :
s u = t u
theorem finset.union_eq_union_iff_left {α : Type u_1} [decidable_eq α] {s t u : finset α} :
s t = s u t s u u s t
theorem finset.union_eq_union_iff_right {α : Type u_1} [decidable_eq α] {s t u : finset α} :
s u = t u s t u t s u
@[simp]
theorem finset.disjoint_union_left {α : Type u_1} [decidable_eq α] {s t u : finset α} :
@[simp]
theorem finset.disjoint_union_right {α : Type u_1} [decidable_eq α] {s t u : finset α} :
theorem finset.induction_on_union {α : Type u_1} [decidable_eq α] (P : finset α finset α Prop) (symm : {a b : finset α}, P a b P b a) (empty_right : {a : finset α}, P a ) (singletons : {a b : α}, P {a} {b}) (union_of : {a b c : finset α}, P a c P b c P (a b) c) (a b : finset α) :
P a b

To prove a relation on pairs of finset X, it suffices to show that it is

  • symmetric,
  • it holds when one of the finsets is empty,
  • it holds for pairs of singletons,
  • if it holds for [a, c] and for [b, c], then it holds for [a ∪ b, c].
theorem directed.exists_mem_subset_of_finset_subset_bUnion {α : Type u_1} {ι : Type u_2} [hn : nonempty ι] {f : ι set α} (h : directed has_subset.subset f) {s : finset α} (hs : s (i : ι), f i) :
(i : ι), s f i
theorem directed_on.exists_mem_subset_of_finset_subset_bUnion {α : Type u_1} {ι : Type u_2} {f : ι set α} {c : set ι} (hn : c.nonempty) (hc : directed_on (λ (i j : ι), f i f j) c) {s : finset α} (hs : s (i : ι) (H : i c), f i) :
(i : ι) (H : i c), s f i

inter #

theorem finset.inter_val_nd {α : Type u_1} [decidable_eq α] (s₁ s₂ : finset α) :
(s₁ s₂).val = s₁.val.ndinter s₂.val
@[simp]
theorem finset.inter_val {α : Type u_1} [decidable_eq α] (s₁ s₂ : finset α) :
(s₁ s₂).val = s₁.val s₂.val
@[simp]
theorem finset.mem_inter {α : Type u_1} [decidable_eq α] {a : α} {s₁ s₂ : finset α} :
a s₁ s₂ a s₁ a s₂
theorem finset.mem_of_mem_inter_left {α : Type u_1} [decidable_eq α] {a : α} {s₁ s₂ : finset α} (h : a s₁ s₂) :
a s₁
theorem finset.mem_of_mem_inter_right {α : Type u_1} [decidable_eq α] {a : α} {s₁ s₂ : finset α} (h : a s₁ s₂) :
a s₂
theorem finset.mem_inter_of_mem {α : Type u_1} [decidable_eq α] {a : α} {s₁ s₂ : finset α} :
a s₁ a s₂ a s₁ s₂
theorem finset.inter_subset_left {α : Type u_1} [decidable_eq α] (s₁ s₂ : finset α) :
s₁ s₂ s₁
theorem finset.inter_subset_right {α : Type u_1} [decidable_eq α] (s₁ s₂ : finset α) :
s₁ s₂ s₂
theorem finset.subset_inter {α : Type u_1} [decidable_eq α] {s₁ s₂ u : finset α} :
s₁ s₂ s₁ u s₁ s₂ u
@[simp, norm_cast]
theorem finset.coe_inter {α : Type u_1} [decidable_eq α] (s₁ s₂ : finset α) :
(s₁ s₂) = s₁ s₂
@[simp]
theorem finset.union_inter_cancel_left {α : Type u_1} [decidable_eq α] {s t : finset α} :
(s t) s = s
@[simp]
theorem finset.union_inter_cancel_right {α : Type u_1} [decidable_eq α] {s t : finset α} :
(s t) t = t
theorem finset.inter_comm {α : Type u_1} [decidable_eq α] (s₁ s₂ : finset α) :
s₁ s₂ = s₂ s₁
@[simp]
theorem finset.inter_assoc {α : Type u_1} [decidable_eq α] (s₁ s₂ s₃ : finset α) :
s₁ s₂ s₃ = s₁ (s₂ s₃)
theorem finset.inter_left_comm {α : Type u_1} [decidable_eq α] (s₁ s₂ s₃ : finset α) :
s₁ (s₂ s₃) = s₂ (s₁ s₃)
theorem finset.inter_right_comm {α : Type u_1} [decidable_eq α] (s₁ s₂ s₃ : finset α) :
s₁ s₂ s₃ = s₁ s₃ s₂
@[simp]
theorem finset.inter_self {α : Type u_1} [decidable_eq α] (s : finset α) :
s s = s
@[simp]
theorem finset.inter_empty {α : Type u_1} [decidable_eq α] (s : finset α) :
@[simp]
theorem finset.empty_inter {α : Type u_1} [decidable_eq α] (s : finset α) :
@[simp]
theorem finset.inter_union_self {α : Type u_1} [decidable_eq α] (s t : finset α) :
s (t s) = s
@[simp]
theorem finset.insert_inter_of_mem {α : Type u_1} [decidable_eq α] {s₁ s₂ : finset α} {a : α} (h : a s₂) :
has_insert.insert a s₁ s₂ = has_insert.insert a (s₁ s₂)
@[simp]
theorem finset.inter_insert_of_mem {α : Type u_1} [decidable_eq α] {s₁ s₂ : finset α} {a : α} (h : a s₁) :
s₁ has_insert.insert a s₂ = has_insert.insert a (s₁ s₂)
@[simp]
theorem finset.insert_inter_of_not_mem {α : Type u_1} [decidable_eq α] {s₁ s₂ : finset α} {a : α} (h : a s₂) :
has_insert.insert a s₁ s₂ = s₁ s₂
@[simp]
theorem finset.inter_insert_of_not_mem {α : Type u_1} [decidable_eq α] {s₁ s₂ : finset α} {a : α} (h : a s₁) :
s₁ has_insert.insert a s₂ = s₁ s₂
@[simp]
theorem finset.singleton_inter_of_mem {α : Type u_1} [decidable_eq α] {a : α} {s : finset α} (H : a s) :
{a} s = {a}
@[simp]
theorem finset.singleton_inter_of_not_mem {α : Type u_1} [decidable_eq α] {a : α} {s : finset α} (H : a s) :
{a} s =
@[simp]
theorem finset.inter_singleton_of_mem {α : Type u_1} [decidable_eq α] {a : α} {s : finset α} (h : a s) :
s {a} = {a}
@[simp]
theorem finset.inter_singleton_of_not_mem {α : Type u_1} [decidable_eq α] {a : α} {s : finset α} (h : a s) :
s {a} =
theorem finset.inter_subset_inter {α : Type u_1} [decidable_eq α] {x y s t : finset α} (h : x y) (h' : s t) :
x s y t
theorem finset.inter_subset_inter_left {α : Type u_1} [decidable_eq α] {s t u : finset α} (h : t u) :
s t s u
theorem finset.inter_subset_inter_right {α : Type u_1} [decidable_eq α] {s t u : finset α} (h : s t) :
s u t u
theorem finset.inter_subset_union {α : Type u_1} [decidable_eq α] {s t : finset α} :
s t s t
@[simp]
theorem finset.union_left_idem {α : Type u_1} [decidable_eq α] (s t : finset α) :
s (s t) = s t
@[simp]
theorem finset.union_right_idem {α : Type u_1} [decidable_eq α] (s t : finset α) :
s t t = s t
@[simp]
theorem finset.inter_left_idem {α : Type u_1} [decidable_eq α] (s t : finset α) :
s (s t) = s t
@[simp]
theorem finset.inter_right_idem {α : Type u_1} [decidable_eq α] (s t : finset α) :
s t t = s t
theorem finset.inter_distrib_left {α : Type u_1} [decidable_eq α] (s t u : finset α) :
s (t u) = s t s u
theorem finset.inter_distrib_right {α : Type u_1} [decidable_eq α] (s t u : finset α) :
(s t) u = s u t u
theorem finset.union_distrib_left {α : Type u_1} [decidable_eq α] (s t u : finset α) :
s t u = (s t) (s u)
theorem finset.union_distrib_right {α : Type u_1} [decidable_eq α] (s t u : finset α) :
s t u = (s u) (t u)
theorem finset.union_union_distrib_left {α : Type u_1} [decidable_eq α] (s t u : finset α) :
s (t u) = s t (s u)
theorem finset.union_union_distrib_right {α : Type u_1} [decidable_eq α] (s t u : finset α) :
s t u = s u (t u)
theorem finset.inter_inter_distrib_left {α : Type u_1} [decidable_eq α] (s t u : finset α) :
s (t u) = s t (s u)
theorem finset.inter_inter_distrib_right {α : Type u_1} [decidable_eq α] (s t u : finset α) :
s t u = s u (t u)
theorem finset.union_union_union_comm {α : Type u_1} [decidable_eq α] (s t u v : finset α) :
s t (u v) = s u (t v)
theorem finset.inter_inter_inter_comm {α : Type u_1} [decidable_eq α] (s t u v : finset α) :
s t (u v) = s u (t v)
theorem finset.union_eq_empty_iff {α : Type u_1} [decidable_eq α] (A B : finset α) :
A B = A = B =
theorem finset.union_subset_iff {α : Type u_1} [decidable_eq α] {s t u : finset α} :
s t u s u t u
theorem finset.subset_inter_iff {α : Type u_1} [decidable_eq α] {s t u : finset α} :
s t u s t s u
@[simp]
theorem finset.inter_eq_left_iff_subset {α : Type u_1} [decidable_eq α] (s t : finset α) :
s t = s s t
@[simp]
theorem finset.inter_eq_right_iff_subset {α : Type u_1} [decidable_eq α] (s t : finset α) :
t s = s s t
theorem finset.inter_congr_left {α : Type u_1} [decidable_eq α] {s t u : finset α} (ht : s u t) (hu : s t u) :
s t = s u
theorem finset.inter_congr_right {α : Type u_1} [decidable_eq α] {s t u : finset α} (hs : t u s) (ht : s u t) :
s u = t u
theorem finset.inter_eq_inter_iff_left {α : Type u_1} [decidable_eq α] {s t u : finset α} :
s t = s u s u t s t u
theorem finset.inter_eq_inter_iff_right {α : Type u_1} [decidable_eq α] {s t u : finset α} :
s u = t u t u s s u t
theorem finset.ite_subset_union {α : Type u_1} [decidable_eq α] (s s' : finset α) (P : Prop) [decidable P] :
ite P s s' s s'
theorem finset.inter_subset_ite {α : Type u_1} [decidable_eq α] (s s' : finset α) (P : Prop) [decidable P] :
s s' ite P s s'
theorem finset.nonempty.not_disjoint {α : Type u_1} [decidable_eq α] {s t : finset α} :

Alias of the reverse direction of finset.not_disjoint_iff_nonempty_inter.

theorem finset.disjoint_or_nonempty_inter {α : Type u_1} [decidable_eq α] (s t : finset α) :

erase #

def finset.erase {α : Type u_1} [decidable_eq α] (s : finset α) (a : α) :

erase s a is the set s - {a}, that is, the elements of s which are not equal to a.

Equations
@[simp]
theorem finset.erase_val {α : Type u_1} [decidable_eq α] (s : finset α) (a : α) :
(s.erase a).val = s.val.erase a
@[simp]
theorem finset.mem_erase {α : Type u_1} [decidable_eq α] {a b : α} {s : finset α} :
a s.erase b a b a s
theorem finset.not_mem_erase {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) :
a s.erase a
@[simp, nolint]
theorem finset.erase_empty {α : Type u_1} [decidable_eq α] (a : α) :
@[simp]
theorem finset.erase_singleton {α : Type u_1} [decidable_eq α] (a : α) :
{a}.erase a =
theorem finset.ne_of_mem_erase {α : Type u_1} [decidable_eq α] {s : finset α} {a b : α} :
b s.erase a b a
theorem finset.mem_of_mem_erase {α : Type u_1} [decidable_eq α] {s : finset α} {a b : α} :
b s.erase a b s
theorem finset.mem_erase_of_ne_of_mem {α : Type u_1} [decidable_eq α] {s : finset α} {a b : α} :
a b a s a s.erase b
theorem finset.eq_of_mem_of_not_mem_erase {α : Type u_1} [decidable_eq α] {s : finset α} {a b : α} (hs : b s) (hsa : b s.erase a) :
b = a

An element of s that is not an element of erase s a must be a.

@[simp]
theorem finset.erase_eq_of_not_mem {α : Type u_1} [decidable_eq α] {a : α} {s : finset α} (h : a s) :
s.erase a = s
@[simp]
theorem finset.erase_eq_self {α : Type u_1} [decidable_eq α] {s : finset α} {a : α} :
s.erase a = s a s
@[simp]
theorem finset.erase_insert_eq_erase {α : Type u_1} [decidable_eq α] (s : finset α) (a : α) :
theorem finset.erase_insert {α : Type u_1} [decidable_eq α] {a : α} {s : finset α} (h : a s) :
theorem finset.erase_insert_of_ne {α : Type u_1} [decidable_eq α] {a b : α} {s : finset α} (h : a b) :
theorem finset.erase_cons_of_ne {α : Type u_1} [decidable_eq α] {a b : α} {s : finset α} (ha : a s) (hb : a b) :
(finset.cons a s ha).erase b = finset.cons a (s.erase b) _
theorem finset.insert_erase {α : Type u_1} [decidable_eq α] {a : α} {s : finset α} (h : a s) :
theorem finset.erase_subset_erase {α : Type u_1} [decidable_eq α] (a : α) {s t : finset α} (h : s t) :
s.erase a t.erase a
theorem finset.erase_subset {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) :
s.erase a s
theorem finset.subset_erase {α : Type u_1} [decidable_eq α] {a : α} {s t : finset α} :
s t.erase a s t a s
@[simp, norm_cast]
theorem finset.coe_erase {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) :
(s.erase a) = s \ {a}
theorem finset.erase_ssubset {α : Type u_1} [decidable_eq α] {a : α} {s : finset α} (h : a s) :
s.erase a s
theorem finset.ssubset_iff_exists_subset_erase {α : Type u_1} [decidable_eq α] {s t : finset α} :
s t (a : α) (H : a t), s t.erase a
theorem finset.erase_ssubset_insert {α : Type u_1} [decidable_eq α] (s : finset α) (a : α) :
theorem finset.erase_ne_self {α : Type u_1} [decidable_eq α] {s : finset α} {a : α} :
s.erase a s a s
theorem finset.erase_cons {α : Type u_1} [decidable_eq α] {s : finset α} {a : α} (h : a s) :
(finset.cons a s h).erase a = s
theorem finset.erase_idem {α : Type u_1} [decidable_eq α] {a : α} {s : finset α} :
(s.erase a).erase a = s.erase a
theorem finset.erase_right_comm {α : Type u_1} [decidable_eq α] {a b : α} {s : finset α} :
(s.erase a).erase b = (s.erase b).erase a
theorem finset.subset_insert_iff {α : Type u_1} [decidable_eq α] {a : α} {s t : finset α} :
theorem finset.erase_insert_subset {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) :
theorem finset.insert_erase_subset {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) :
theorem finset.subset_insert_iff_of_not_mem {α : Type u_1} [decidable_eq α] {s t : finset α} {a : α} (h : a s) :
theorem finset.erase_subset_iff_of_mem {α : Type u_1} [decidable_eq α] {s t : finset α} {a : α} (h : a t) :
s.erase a t s t
theorem finset.erase_inj {α : Type u_1} [decidable_eq α] {x y : α} (s : finset α) (hx : x s) :
s.erase x = s.erase y x = y
theorem finset.erase_inj_on {α : Type u_1} [decidable_eq α] (s : finset α) :
theorem finset.erase_inj_on' {α : Type u_1} [decidable_eq α] (a : α) :
set.inj_on (λ (s : finset α), s.erase a) {s : finset α | a s}

sdiff #

@[protected, instance]
def finset.has_sdiff {α : Type u_1} [decidable_eq α] :

s \ t is the set consisting of the elements of s that are not in t.

Equations
@[simp]
theorem finset.sdiff_val {α : Type u_1} [decidable_eq α] (s₁ s₂ : finset α) :
(s₁ \ s₂).val = s₁.val - s₂.val
@[simp]
theorem finset.mem_sdiff {α : Type u_1} [decidable_eq α] {s t : finset α} {a : α} :
a s \ t a s a t
@[simp]
theorem finset.inter_sdiff_self {α : Type u_1} [decidable_eq α] (s₁ s₂ : finset α) :
s₁ (s₂ \ s₁) =
theorem finset.not_mem_sdiff_of_mem_right {α : Type u_1} [decidable_eq α] {s t : finset α} {a : α} (h : a t) :
a s \ t
theorem finset.not_mem_sdiff_of_not_mem_left {α : Type u_1} [decidable_eq α] {s t : finset α} {a : α} (h : a s) :
a s \ t
theorem finset.union_sdiff_of_subset {α : Type u_1} [decidable_eq α] {s t : finset α} (h : s t) :
s t \ s = t
theorem finset.sdiff_union_of_subset {α : Type u_1} [decidable_eq α] {s₁ s₂ : finset α} (h : s₁ s₂) :
s₂ \ s₁ s₁ = s₂
theorem finset.inter_sdiff {α : Type u_1} [decidable_eq α] (s t u : finset α) :
s (t \ u) = s t \ u
@[simp]
theorem finset.sdiff_inter_self {α : Type u_1} [decidable_eq α] (s₁ s₂ : finset α) :
s₂ \ s₁ s₁ =
@[protected, simp]
theorem finset.sdiff_self {α : Type u_1} [decidable_eq α] (s₁ : finset α) :
s₁ \ s₁ =
theorem finset.sdiff_inter_distrib_right {α : Type u_1} [decidable_eq α] (s t u : finset α) :
s \ (t u) = s \ t s \ u
@[simp]
theorem finset.sdiff_inter_self_left {α : Type u_1} [decidable_eq α] (s t : finset α) :
s \ (s t) = s \ t
@[simp]
theorem finset.sdiff_inter_self_right {α : Type u_1} [decidable_eq α] (s t : finset α) :
s \ (t s) = s \ t
@[simp]
theorem finset.sdiff_empty {α : Type u_1} [decidable_eq α] {s : finset α} :
s \ = s
theorem finset.sdiff_subset_sdiff {α : Type u_1} [decidable_eq α] {s t u v : finset α} (hst : s t) (hvu : v u) :
s \ u t \ v
@[simp, norm_cast]
theorem finset.coe_sdiff {α : Type u_1} [decidable_eq α] (s₁ s₂ : finset α) :
(s₁ \ s₂) = s₁ \ s₂
@[simp]
theorem finset.union_sdiff_self_eq_union {α : Type u_1} [decidable_eq α] {s t : finset α} :
s t \ s = s t
@[simp]
theorem finset.sdiff_union_self_eq_union {α : Type u_1} [decidable_eq α] {s t : finset α} :
s \ t t = s t
theorem finset.union_sdiff_left {α : Type u_1} [decidable_eq α] (s t : finset α) :
(s t) \ s = t \ s
theorem finset.union_sdiff_right {α : Type u_1} [decidable_eq α] (s t : finset α) :
(s t) \ t = s \ t
theorem finset.union_sdiff_cancel_left {α : Type u_1} [decidable_eq α] {s t : finset α} (h : disjoint s t) :
(s t) \ s = t
theorem finset.union_sdiff_cancel_right {α : Type u_1} [decidable_eq α] {s t : finset α} (h : disjoint s t) :
(s t) \ t = s
theorem finset.union_sdiff_symm {α : Type u_1} [decidable_eq α] {s t : finset α} :
s t \ s = t s \ t
theorem finset.sdiff_union_inter {α : Type u_1} [decidable_eq α] (s t : finset α) :
s \ t s t = s
@[simp]
theorem finset.sdiff_idem {α : Type u_1} [decidable_eq α] (s t : finset α) :
s \ t \ t = s \ t
theorem finset.subset_sdiff {α : Type u_1} [decidable_eq α] {s t u : finset α} :
s t \ u s t disjoint s u
@[simp]
theorem finset.sdiff_eq_empty_iff_subset {α : Type u_1} [decidable_eq α] {s t : finset α} :
s \ t = s t
theorem finset.sdiff_nonempty {α : Type u_1} [decidable_eq α] {s t : finset α} :
(s \ t).nonempty ¬s t
@[simp]
theorem finset.empty_sdiff {α : Type u_1} [decidable_eq α] (s : finset α) :
theorem finset.insert_sdiff_of_not_mem {α : Type u_1} [decidable_eq α] (s : finset α) {t : finset α} {x : α} (h : x t) :
theorem finset.insert_sdiff_of_mem {α : Type u_1} [decidable_eq α] {t : finset α} (s : finset α) {x : α} (h : x t) :
@[simp]
theorem finset.insert_sdiff_insert {α : Type u_1} [decidable_eq α] (s t : finset α) (x : α) :
theorem finset.sdiff_insert_of_not_mem {α : Type u_1} [decidable_eq α] {s : finset α} {x : α} (h : x s) (t : finset α) :
@[simp]
theorem finset.sdiff_subset {α : Type u_1} [decidable_eq α] (s t : finset α) :
s \ t s
theorem finset.sdiff_ssubset {α : Type u_1} [decidable_eq α] {s t : finset α} (h : t s) (ht : t.nonempty) :
s \ t s
theorem finset.union_sdiff_distrib {α : Type u_1} [decidable_eq α] (s₁ s₂ t : finset α) :
(s₁ s₂) \ t = s₁ \ t s₂ \ t
theorem finset.sdiff_union_distrib {α : Type u_1} [decidable_eq α] (s t₁ t₂ : finset α) :
s \ (t₁ t₂) = s \ t₁ (s \ t₂)
theorem finset.union_sdiff_self {α : Type u_1} [decidable_eq α] (s t : finset α) :
(s t) \ t = s \ t
theorem finset.sdiff_singleton_eq_erase {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) :
s \ {a} = s.erase a
theorem finset.erase_eq {α : Type u_1} [decidable_eq α] (s : finset α) (a : α) :
s.erase a = s \ {a}
theorem finset.disjoint_erase_comm {α : Type u_1} [decidable_eq α] {s t : finset α} {a : α} :
disjoint (s.erase a) t disjoint s (t.erase a)
theorem finset.disjoint_of_erase_left {α : Type u_1} [decidable_eq α] {s t : finset α} {a : α} (ha : a t) (hst : disjoint (s.erase a) t) :
theorem finset.disjoint_of_erase_right {α : Type u_1} [decidable_eq α] {s t : finset α} {a : α} (ha : a s) (hst : disjoint s (t.erase a)) :
@[simp]
theorem finset.inter_erase {α : Type u_1} [decidable_eq α] (a : α) (s t : finset α) :
s t.erase a = (s t).erase a
@[simp]
theorem finset.erase_inter {α : Type u_1} [decidable_eq α] (a : α) (s t : finset α) :
s.erase a t = (s t).erase a
theorem finset.erase_sdiff_comm {α : Type u_1} [decidable_eq α] (s t : finset α) (a : α) :
s.erase a \ t = (s \ t).erase a
theorem finset.insert_union_comm {α : Type u_1} [decidable_eq α] (s t : finset α) (a : α) :
theorem finset.erase_inter_comm {α : Type u_1} [decidable_eq α] (s t : finset α) (a : α) :
s.erase a t = s t.erase a
theorem finset.erase_union_distrib {α : Type u_1} [decidable_eq α] (s t : finset α) (a : α) :
(s t).erase a = s.erase a t.erase a
theorem finset.erase_sdiff_distrib {α : Type u_1} [decidable_eq α] (s t : finset α) (a : α) :
(s \ t).erase a = s.erase a \ t.erase a
theorem finset.erase_union_of_mem {α : Type u_1} [decidable_eq α] {t : finset α} {a : α} (ha : a t) (s : finset α) :
s.erase a t = s t
theorem finset.union_erase_of_mem {α : Type u_1} [decidable_eq α] {s : finset α} {a : α} (ha : a s) (t : finset α) :
s t.erase a = s t
@[simp]
theorem finset.sdiff_singleton_eq_self {α : Type u_1} [decidable_eq α] {s : finset α} {a : α} (ha : a s) :
s \ {a} = s
theorem finset.sdiff_sdiff_left' {α : Type u_1} [decidable_eq α] (s t u : finset α) :
s \ t \ u = s \ t (s \ u)
theorem finset.sdiff_union_sdiff_cancel {α : Type u_1} [decidable_eq α] {s t u : finset α} (hts : t s) (hut : u t) :
s \ t t \ u = s \ u
theorem finset.sdiff_union_erase_cancel {α : Type u_1} [decidable_eq α] {s t : finset α} {a : α} (hts : t s) (ha : a t) :
s \ t t.erase a = s.erase a
theorem finset.sdiff_sdiff_eq_sdiff_union {α : Type u_1} [decidable_eq α] {s t u : finset α} (h : u s) :
s \ (t \ u) = s \ t u
theorem finset.sdiff_insert {α : Type u_1} [decidable_eq α] (s t : finset α) (x : α) :
s \ has_insert.insert x t = (s \ t).erase x
theorem finset.sdiff_insert_insert_of_mem_of_not_mem {α : Type u_1} [decidable_eq α] {s t : finset α} {x : α} (hxs : x s) (hxt : x t) :
theorem finset.sdiff_erase {α : Type u_1} [decidable_eq α] {s t : finset α} {a : α} (h : a s) :
s \ t.erase a = has_insert.insert a (s \ t)
theorem finset.sdiff_erase_self {α : Type u_1} [decidable_eq α] {s : finset α} {a : α} (ha : a s) :
s \ s.erase a = {a}
theorem finset.sdiff_sdiff_self_left {α : Type u_1} [decidable_eq α] (s t : finset α) :
s \ (s \ t) = s t
theorem finset.sdiff_sdiff_eq_self {α : Type u_1} [decidable_eq α] {s t : finset α} (h : t s) :
s \ (s \ t) = t
theorem finset.sdiff_eq_sdiff_iff_inter_eq_inter {α : Type u_1} [decidable_eq α] {s t₁ t₂ : finset α} :
s \ t₁ = s \ t₂ s t₁ = s t₂
theorem finset.union_eq_sdiff_union_sdiff_union_inter {α : Type u_1} [decidable_eq α] (s t : finset α) :
s t = s \ t t \ s s t
theorem finset.erase_eq_empty_iff {α : Type u_1} [decidable_eq α] (s : finset α) (a : α) :
s.erase a = s = s = {a}
theorem finset.sdiff_disjoint {α : Type u_1} [decidable_eq α] {s t : finset α} :
disjoint (t \ s) s
theorem finset.disjoint_sdiff {α : Type u_1} [decidable_eq α] {s t : finset α} :
disjoint s (t \ s)
theorem finset.disjoint_sdiff_inter {α : Type u_1} [decidable_eq α] (s t : finset α) :
disjoint (s \ t) (s t)
theorem finset.sdiff_eq_self_iff_disjoint {α : Type u_1} [decidable_eq α] {s t : finset α} :
s \ t = s disjoint s t
theorem finset.sdiff_eq_self_of_disjoint {α : Type u_1} [decidable_eq α] {s t : finset α} (h : disjoint s t) :
s \ t = s

Symmetric difference #

theorem finset.mem_symm_diff {α : Type u_1} [decidable_eq α] {s t : finset α} {a : α} :
a s t a s a t a t a s
@[simp, norm_cast]
theorem finset.coe_symm_diff {α : Type u_1} [decidable_eq α] {s t : finset α} :
(s t) = s t

attach #

def finset.attach {α : Type u_1} (s : finset α) :
finset {x // x s}

attach s takes the elements of s and forms a new set of elements of the subtype {x // x ∈ s}.

Equations
theorem finset.sizeof_lt_sizeof_of_mem {α : Type u_1} [has_sizeof α] {x : α} {s : finset α} (hx : x s) :
@[simp]
theorem finset.attach_val {α : Type u_1} (s : finset α) :
@[simp]
theorem finset.mem_attach {α : Type u_1} (s : finset α) (x : {x // x s}) :
@[simp]
theorem finset.attach_empty {α : Type u_1} :
@[simp]
theorem finset.attach_nonempty_iff {α : Type u_1} {s : finset α} :
@[simp]
theorem finset.attach_eq_empty_iff {α : Type u_1} {s : finset α} :

piecewise #

def finset.piecewise {α : Type u_1} {δ : α Sort u_2} (s : finset α) (f g : Π (i : α), δ i) [Π (j : α), decidable (j s)] (i : α) :
δ i

s.piecewise f g is the function equal to f on the finset s, and to g on its complement.

Equations
@[simp]
theorem finset.piecewise_insert_self {α : Type u_1} {δ : α Sort u_4} (s : finset α) (f g : Π (i : α), δ i) [decidable_eq α] {j : α} [Π (i : α), decidable (i has_insert.insert j s)] :
(has_insert.insert j s).piecewise f g j = f j
@[simp]
theorem finset.piecewise_empty {α : Type u_1} {δ : α Sort u_4} (f g : Π (i : α), δ i) [Π (i : α), decidable (i )] :
@[norm_cast]
theorem finset.piecewise_coe {α : Type u_1} {δ : α Sort u_4} (s : finset α) (f g : Π (i : α), δ i) [Π (j : α), decidable (j s)] [Π (j : α), decidable (j s)] :
@[simp]
theorem finset.piecewise_eq_of_mem {α : Type u_1} {δ : α Sort u_4} (s : finset α) (f g : Π (i : α), δ i) [Π (j : α), decidable (j s)] {i : α} (hi : i s) :
s.piecewise f g i = f i
@[simp]
theorem finset.piecewise_eq_of_not_mem {α : Type u_1} {δ : α Sort u_4} (s : finset α) (f g : Π (i : α), δ i) [Π (j : α), decidable (j s)] {i : α} (hi : i s) :
s.piecewise f g i = g i
theorem finset.piecewise_congr {α : Type u_1} {δ : α Sort u_4} (s : finset α) [Π (j : α), decidable (j s)] {f f' g g' : Π (i : α), δ i} (hf : (i : α), i s f i = f' i) (hg : (i : α), i s g i = g' i) :
s.piecewise f g = s.piecewise f' g'
@[simp]
theorem finset.piecewise_insert_of_ne {α : Type u_1} {δ : α Sort u_4} (s : finset α) (f g : Π (i : α), δ i) [Π (j : α), decidable (j s)] [decidable_eq α] {i j : α} [Π (i : α), decidable (i has_insert.insert j s)] (h : i j) :
theorem finset.piecewise_insert {α : Type u_1} {δ : α Sort u_4} (s : finset α) (f g : Π (i : α), δ i) [Π (j : α), decidable (j s)] [decidable_eq α] (j : α) [Π (i : α), decidable (i has_insert.insert j s)] :
theorem finset.piecewise_cases {α : Type u_1} {δ : α Sort u_4} (s : finset α) (f g : Π (i : α), δ i) [Π (j : α), decidable (j s)] {i : α} (p : δ i Prop) (hf : p (f i)) (hg : p (g i)) :
p (s.piecewise f g i)
theorem finset.piecewise_mem_set_pi {α : Type u_1} (s : finset α) [Π (j : α), decidable (j s)] {δ : α Type u_2} {t : set α} {t' : Π (i : α), set (δ i)} {f g : Π (i : α), δ i} (hf : f t.pi t') (hg : g t.pi t') :
s.piecewise f g t.pi t'
theorem finset.piecewise_singleton {α : Type u_1} {δ : α Sort u_4} (f g : Π (i : α), δ i) [decidable_eq α] (i : α) :
{i}.piecewise f g = function.update g i (f i)
theorem finset.piecewise_piecewise_of_subset_left {α : Type u_1} {δ : α Sort u_4} {s t : finset α} [Π (i : α), decidable (i s)] [Π (i : α), decidable (i t)] (h : s t) (f₁ f₂ g : Π (a : α), δ a) :
s.piecewise (t.piecewise f₁ f₂) g = s.piecewise f₁ g
@[simp]
theorem finset.piecewise_idem_left {α : Type u_1} {δ : α Sort u_4} (s : finset α) [Π (j : α), decidable (j s)] (f₁ f₂ g : Π (a : α), δ a) :
s.piecewise (s.piecewise f₁ f₂) g = s.piecewise f₁ g
theorem finset.piecewise_piecewise_of_subset_right {α : Type u_1} {δ : α Sort u_4} {s t : finset α} [Π (i : α), decidable (i s)] [Π (i : α), decidable (i t)] (h : t s) (f g₁ g₂ : Π (a : α), δ a) :
s.piecewise f (t.piecewise g₁ g₂) = s.piecewise f g₂
@[simp]
theorem finset.piecewise_idem_right {α : Type u_1} {δ : α Sort u_4} (s : finset α) [Π (j : α), decidable (j s)] (f g₁ g₂ : Π (a : α), δ a) :
s.piecewise f (s.piecewise g₁ g₂) = s.piecewise f g₂
theorem finset.update_eq_piecewise {α : Type u_1} {β : Type u_2} [decidable_eq α] (f : α β) (i : α) (v : β) :
function.update f i v = {i}.piecewise (λ (j : α), v) f
theorem finset.update_piecewise {α : Type u_1} {δ : α Sort u_4} (s : finset α) (f g : Π (i : α), δ i) [Π (j : α), decidable (j s)] [decidable_eq α] (i : α) (v : δ i) :
theorem finset.update_piecewise_of_mem {α : Type u_1} {δ : α Sort u_4} (s : finset α) (f g : Π (i : α), δ i) [Π (j : α), decidable (j s)] [decidable_eq α] {i : α} (hi : i s) (v : δ i) :
theorem finset.update_piecewise_of_not_mem {α : Type u_1} {δ : α Sort u_4} (s : finset α) (f g : Π (i : α), δ i) [Π (j : α), decidable (j s)] [decidable_eq α] {i : α} (hi : i s) (v : δ i) :
theorem finset.piecewise_le_of_le_of_le {α : Type u_1} (s : finset α) [Π (j : α), decidable (j s)] {δ : α Type u_2} [Π (i : α), preorder (δ i)] {f g h : Π (i : α), δ i} (Hf : f h) (Hg : g h) :
s.piecewise f g h
theorem finset.le_piecewise_of_le_of_le {α : Type u_1} (s : finset α) [Π (j : α), decidable (j s)] {δ : α Type u_2} [Π (i : α), preorder (δ i)] {f g h : Π (i : α), δ i} (Hf : h f) (Hg : h g) :
h s.piecewise f g
theorem finset.piecewise_le_piecewise' {α : Type u_1} (s : finset α) [Π (j : α), decidable (j s)] {δ : α Type u_2} [Π (i : α), preorder (δ i)] {f g f' g' : Π (i : α), δ i} (Hf : (x : α), x s f x f' x) (Hg : (x : α), x s g x g' x) :
s.piecewise f g s.piecewise f' g'
theorem finset.piecewise_le_piecewise {α : Type u_1} (s : finset α) [Π (j : α), decidable (j s)] {δ : α Type u_2} [Π (i : α), preorder (δ i)] {f g f' g' : Π (i : α), δ i} (Hf : f f') (Hg : g g') :
s.piecewise f g s.piecewise f' g'
theorem finset.piecewise_mem_Icc_of_mem_of_mem {α : Type u_1} (s : finset α) [Π (j : α), decidable (j s)] {δ : α Type u_2} [Π (i : α), preorder (δ i)] {f f₁ g g₁ : Π (i : α), δ i} (hf : f set.Icc f₁ g₁) (hg : g set.Icc f₁ g₁) :
s.piecewise f g set.Icc f₁ g₁
theorem finset.piecewise_mem_Icc {α : Type u_1} (s : finset α) [Π (j : α), decidable (j s)] {δ : α Type u_2} [Π (i : α), preorder (δ i)] {f g : Π (i : α), δ i} (h : f g) :
theorem finset.piecewise_mem_Icc' {α : Type u_1} (s : finset α) [Π (j : α), decidable (j s)] {δ : α Type u_2} [Π (i : α), preorder (δ i)] {f g : Π (i : α), δ i} (h : g f) :
@[protected, instance]
def finset.decidable_dforall_finset {α : Type u_1} {s : finset α} {p : Π (a : α), a s Prop} [hp : Π (a : α) (h : a s), decidable (p a h)] :
decidable ( (a : α) (h : a s), p a h)
Equations
@[protected, instance]
def finset.decidable_eq_pi_finset {α : Type u_1} {s : finset α} {β : α Type u_2} [h : Π (a : α), decidable_eq (β a)] :
decidable_eq (Π (a : α), a s β a)

decidable equality for functions whose domain is bounded by finsets

Equations
@[protected, instance]
def finset.decidable_dexists_finset {α : Type u_1} {s : finset α} {p : Π (a : α), a s Prop} [hp : Π (a : α) (h : a s), decidable (p a h)] :
decidable ( (a : α) (h : a s), p a h)
Equations

filter #

def finset.filter {α : Type u_1} (p : α Prop) [decidable_pred p] (s : finset α) :

filter p s is the set of elements of s that satisfy p.

Equations
@[simp]
theorem finset.filter_val {α : Type u_1} (p : α Prop) [decidable_pred p] (s : finset α) :
@[simp]
theorem finset.filter_subset {α : Type u_1} (p : α Prop) [decidable_pred p] (s : finset α) :
@[simp]
theorem finset.mem_filter {α : Type u_1} {p : α Prop} [decidable_pred p] {s : finset α} {a : α} :
a finset.filter p s a s p a
theorem finset.mem_of_mem_filter {α : Type u_1} {p : α Prop} [decidable_pred p] {s : finset α} (x : α) (h : x finset.filter p s) :
x s
theorem finset.filter_ssubset {α : Type u_1} {p : α Prop} [decidable_pred p] {s : finset α} :
finset.filter p s s (x : α) (H : x s), ¬p x
theorem finset.filter_filter {α : Type u_1} (p q : α Prop) [decidable_pred p] [decidable_pred q] (s : finset α) :
finset.filter q (finset.filter p s) = finset.filter (λ (a : α), p a q a) s
theorem finset.filter_comm {α : Type u_1} (p q : α Prop) [decidable_pred p] [decidable_pred q] (s : finset α) :
@[simp]
theorem finset.filter_congr_decidable {α : Type u_1} (s : finset α) (p : α Prop) (h : decidable_pred p) [decidable_pred p] :
theorem finset.filter_true {α : Type u_1} {h : decidable_pred (λ (a : α), true)} (s : finset α) :
finset.filter (λ (a : α), true) s = s
theorem finset.filter_false {α : Type u_1} {h : decidable_pred (λ (a : α), false)} (s : finset α) :
finset.filter (λ (a : α), false) s =
theorem finset.filter_eq_self {α : Type u_1} {p : α Prop} [decidable_pred p] {s : finset α} :
finset.filter p s = s ⦃x : α⦄, x s p x
theorem finset.filter_eq_empty_iff {α : Type u_1} {p : α Prop} [decidable_pred p] {s : finset α} :
finset.filter p s = ⦃x : α⦄, x s ¬p x
theorem finset.filter_nonempty_iff {α : Type u_1} {p : α Prop} [decidable_pred p] {s : finset α} :
(finset.filter p s).nonempty (a : α) (H : a s), p a
@[simp]
theorem finset.filter_true_of_mem {α : Type u_1} {p : α Prop} [decidable_pred p] {s : finset α} (h : (x : α), x s p x) :

If all elements of a finset satisfy the predicate p, s.filter p is s.

@[simp]
theorem finset.filter_false_of_mem {α : Type u_1} {p : α Prop} [decidable_pred p] {s : finset α} (h : (x : α), x s ¬p x) :

If all elements of a finset fail to satisfy the predicate p, s.filter p is .

@[simp]
theorem finset.filter_const {α : Type u_1} (p : Prop) [decidable p] (s : finset α) :
finset.filter (λ (a : α), p) s = ite p s
theorem finset.filter_congr {α : Type u_1} {p q : α Prop} [decidable_pred p] [decidable_pred q] {s : finset α} (H : (x : α), x s (p x q x)) :
theorem finset.filter_empty {α : Type u_1} (p : α Prop) [decidable_pred p] :
theorem finset.filter_subset_filter {α : Type u_1} (p : α Prop) [decidable_pred p] {s t : finset α} (h : s t) :
theorem finset.monotone_filter_left {α : Type u_1} (p : α Prop) [decidable_pred p] :
theorem finset.monotone_filter_right {α : Type u_1} (s : finset α) ⦃p q : α Prop⦄ [decidable_pred p] [decidable_pred q] (h : p q) :
@[simp, norm_cast]
theorem finset.coe_filter {α : Type u_1} (p : α Prop) [decidable_pred p] (s : finset α) :
(finset.filter p s) = {x ∈ s | p x}
theorem finset.subset_coe_filter_of_subset_forall {α : Type u_1} (p : α Prop) [decidable_pred p] (s : finset α) {t : set α} (h₁ : t s) (h₂ : (x : α), x t p x) :
theorem finset.filter_singleton {α : Type u_1} (p : α Prop) [decidable_pred p] (a : α) :
finset.filter p {a} = ite (p a) {a}
theorem finset.filter_cons_of_pos {α : Type u_1} (p : α Prop) [decidable_pred p] (a : α) (s : finset α) (ha : a s) (hp : p a) :
theorem finset.filter_cons_of_neg {α : Type u_1} (p : α Prop) [decidable_pred p] (a : α) (s : finset α) (ha : a s) (hp : ¬p a) :
theorem finset.disjoint_filter {α : Type u_1} {s : finset α} {p q : α Prop} [decidable_pred p] [decidable_pred q] :
disjoint (finset.filter p s) (finset.filter q s) (x : α), x s p x ¬q x
theorem finset.disjoint_filter_filter {α : Type u_1} {s t : finset α} {p q : α Prop} [decidable_pred p] [decidable_pred q] :
theorem finset.disjoint_filter_filter' {α : Type u_1} (s t : finset α) {p q : α Prop} [decidable_pred p] [decidable_pred q] (h : disjoint p q) :
theorem finset.disjoint_filter_filter_neg {α : Type u_1} (s t : finset α) (p : α Prop) [decidable_pred p] [decidable_pred (λ (a : α), ¬p a)] :
disjoint (finset.filter p s) (finset.filter (λ (a : α), ¬p a) t)
theorem finset.filter_disj_union {α : Type u_1} (p : α Prop) [decidable_pred p] (s t : finset α) (h : disjoint s t) :
theorem finset.filter_cons {α : Type u_1} (p : α Prop) [decidable_pred p] {a : α} (s : finset α) (ha : a s) :
finset.filter p (finset.cons a s ha) = (ite (p a) {a} ).disj_union (finset.filter p s) _
theorem finset.filter_union {α : Type u_1} (p : α Prop) [decidable_pred p] [decidable_eq α] (s₁ s₂ : finset α) :
finset.filter p (s₁ s₂) = finset.filter p s₁ finset.filter p s₂
theorem finset.filter_union_right {α : Type u_1} (p q : α Prop) [decidable_pred p] [decidable_pred q] [decidable_eq α] (s : finset α) :
finset.filter p s finset.filter q s = finset.filter (λ (x : α), p x q x) s
theorem finset.filter_mem_eq_inter {α : Type u_1} [decidable_eq α] {s t : finset α} [Π (i : α), decidable (i t)] :
finset.filter (λ (i : α), i t) s = s t
theorem finset.filter_inter_distrib {α : Type u_1} (p : α Prop) [decidable_pred p] [decidable_eq α] (s t : finset α) :
theorem finset.filter_inter {α : Type u_1} (p : α Prop) [decidable_pred p] [decidable_eq α] (s t : finset α) :
theorem finset.inter_filter {α : Type u_1} (p : α Prop) [decidable_pred p] [decidable_eq α] (s t : finset α) :
theorem finset.filter_insert {α : Type u_1} (p : α Prop) [decidable_pred p] [decidable_eq α] (a : α) (s : finset α) :
theorem finset.filter_erase {α : Type u_1} (p : α Prop) [decidable_pred p] [decidable_eq α] (a : α) (s : finset α) :
theorem finset.filter_or {α : Type u_1} (p q : α Prop) [decidable_pred p] [decidable_pred q] [decidable_eq α] [decidable_pred (λ (a : α), p a q a)] (s : finset α) :
finset.filter (λ (a : α), p a q a) s = finset.filter p s finset.filter q s
theorem finset.filter_and {α : Type u_1} (p q : α Prop) [decidable_pred p] [decidable_pred q] [decidable_eq α] [decidable_pred (λ (a : α), p a q a)] (s : finset α) :
finset.filter (λ (a : α), p a q a) s = finset.filter p s finset.filter q s
theorem finset.filter_not {α : Type u_1} (p : α Prop) [decidable_pred p] [decidable_eq α] [decidable_pred (λ (a : α), ¬p a)] (s : finset α) :
finset.filter (λ (a : α), ¬p a) s = s \ finset.filter p s
theorem finset.sdiff_eq_filter {α : Type u_1} [decidable_eq α] (s₁ s₂ : finset α) :
s₁ \ s₂ = finset.filter (λ (_x : α), _x s₂) s₁
theorem finset.sdiff_eq_self {α : Type u_1} [decidable_eq α] (s₁ s₂ : finset α) :
s₁ \ s₂ = s₁ s₁ s₂
theorem finset.subset_union_elim {α : Type u_1} [decidable_eq α] {s : finset α} {t₁ t₂ : set α} (h : s t₁ t₂) :
(s₁ s₂ : finset α), s₁ s₂ = s s₁ t₁ s₂ t₂ \ t₁
@[protected, instance]
noncomputable def finset.has_sep {α : Type u_1} :
has_sep α (finset α)

The following instance allows us to write {x ∈ s | p x} for finset.filter p s. Since the former notation requires us to define this for all propositions p, and finset.filter only works for decidable propositions, the notation {x ∈ s | p x} is only compatible with classical logic because it uses classical.prop_decidable. We don't want to redo all lemmas of finset.filter for has_sep.sep, so we make sure that simp unfolds the notation {x ∈ s | p x} to finset.filter p s. If p happens to be decidable, the simp-lemma finset.filter_congr_decidable will make sure that finset.filter uses the right instance for decidability.

Equations
@[simp]
theorem finset.sep_def {α : Type u_1} (s : finset α) (p : α Prop) :
{x ∈ s | p x} = finset.filter p s
theorem finset.filter_eq {β : Type u_2} [decidable_eq β] (s : finset β) (b : β) :
finset.filter (eq b) s = ite (b s) {b}

After filtering out everything that does not equal a given value, at most that value remains.

This is equivalent to filter_eq' with the equality the other way.

theorem finset.filter_eq' {β : Type u_2} [decidable_eq β] (s : finset β) (b : β) :
finset.filter (λ (a : β), a = b) s = ite (b s) {b}

After filtering out everything that does not equal a given value, at most that value remains.

This is equivalent to filter_eq with the equality the other way.

theorem finset.filter_ne {β : Type u_2} [decidable_eq β] (s : finset β) (b : β) :
finset.filter (λ (a : β), b a) s = s.erase b
theorem finset.filter_ne' {β : Type u_2} [decidable_eq β] (s : finset β) (b : β) :
finset.filter (λ (a : β), a b) s = s.erase b
theorem finset.filter_inter_filter_neg_eq {α : Type u_1} (p : α Prop) [decidable_pred p] [decidable_eq α] [decidable_pred (λ (a : α), ¬p a)] (s t : finset α) :
finset.filter p s finset.filter (λ (a : α), ¬p a) t =
theorem finset.filter_union_filter_of_codisjoint {α : Type u_1} (p q : α Prop) [decidable_pred p] [decidable_pred q] [decidable_eq α] (s : finset α) (h : codisjoint p q) :
theorem finset.filter_union_filter_neg_eq {α : Type u_1} (p : α Prop) [decidable_pred p] [decidable_eq α] [decidable_pred (λ (a : α), ¬p a)] (s : finset α) :
finset.filter p s finset.filter (λ (a : α), ¬p a) s = s

range #

def finset.range (n : ) :

range n is the set of natural numbers less than n.

Equations
@[simp]
@[simp]
theorem finset.mem_range {n m : } :
@[simp, norm_cast]
theorem finset.coe_range (n : ) :
@[simp]
@[simp]
theorem finset.range_one  :
@[simp]
@[simp]
theorem finset.self_mem_range_succ (n : ) :
@[simp]
theorem finset.mem_range_le {n x : } (hx : x finset.range n) :
x n
theorem finset.mem_range_sub_ne_zero {n x : } (hx : x finset.range n) :
n - x 0
@[simp]
@[simp]
@[simp]
theorem finset.range_filter_eq {n m : } :
finset.filter (λ (_x : ), _x = m) (finset.range n) = ite (m < n) {m}
theorem finset.exists_mem_empty_iff {α : Type u_1} (p : α Prop) :
( (x : α), x p x) false
theorem finset.exists_mem_insert {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) (p : α Prop) :
( (x : α), x has_insert.insert a s p x) p a (x : α), x s p x
theorem finset.forall_mem_empty_iff {α : Type u_1} (p : α Prop) :
( (x : α), x p x) true
theorem finset.forall_mem_insert {α : Type u_1} [decidable_eq α] (a : α) (s : finset α) (p : α Prop) :
( (x : α), x has_insert.insert a s p x) p a (x : α), x s p x
theorem finset.forall_of_forall_insert {α : Type u_1} [decidable_eq α] {p : α Prop} {a : α} {s : finset α} (H : (x : α), x has_insert.insert a s p x) (x : α) (h : x s) :
p x

Useful in proofs by induction.

def not_mem_range_equiv (k : ) :

Equivalence between the set of natural numbers which are ≥ k and , given by n → n - k.

Equations
@[simp]
theorem coe_not_mem_range_equiv (k : ) :
(not_mem_range_equiv k) = λ (i : {n // n multiset.range k}), i - k
@[simp]
theorem coe_not_mem_range_equiv_symm (k : ) :
((not_mem_range_equiv k).symm) = λ (j : ), j + k, _⟩

dedup on list and multiset #

def multiset.to_finset {α : Type u_1} [decidable_eq α] (s : multiset α) :

to_finset s removes duplicates from the multiset s to produce a finset.

Equations
@[simp]
theorem multiset.to_finset_val {α : Type u_1} [decidable_eq α] (s : multiset α) :
theorem multiset.to_finset_eq {α : Type u_1} [decidable_eq α] {s : multiset α} (n : s.nodup) :
{val := s, nodup := n} = s.to_finset
theorem multiset.nodup.to_finset_inj {α : Type u_1} [decidable_eq α] {l l' : multiset α} (hl : l.nodup) (hl' : l'.nodup) (h : l.to_finset = l'.to_finset) :
l = l'
@[simp]
theorem multiset.mem_to_finset {α : Type u_1} [decidable_eq α] {a : α} {s : multiset α} :
@[simp]
theorem multiset.to_finset_zero {α : Type u_1} [decidable_eq α] :
@[simp]
theorem multiset.to_finset_cons {α : Type u_1} [decidable_eq α] (a : α) (s : multiset α) :
@[simp]
theorem multiset.to_finset_singleton {α : Type u_1} [decidable_eq α] (a : α) :
{a}.to_finset = {a}
@[simp]
theorem multiset.to_finset_add {α : Type u_1} [decidable_eq α] (s t : multiset α) :
@[simp]
theorem multiset.to_finset_nsmul {α : Type u_1} [decidable_eq α] (s : multiset α) (n : ) (hn : n 0) :
@[simp]
theorem multiset.to_finset_inter {α : Type u_1} [decidable_eq α] (s t : multiset α) :
@[simp]
theorem multiset.to_finset_union {α : Type u_1} [decidable_eq α] (s t : multiset α) :
@[simp]
theorem multiset.to_finset_eq_empty {α : Type u_1} [decidable_eq α] {m : multiset α} :
@[simp]
theorem multiset.to_finset_nonempty {α : Type u_1} [decidable_eq α] {s : multiset α} :
@[simp]
theorem multiset.to_finset_subset {α : Type u_1} [decidable_eq α] {s t : multiset α} :
@[simp]
theorem multiset.to_finset_ssubset {α : Type u_1} [decidable_eq α] {s t : multiset α} :
@[simp]
theorem multiset.to_finset_dedup {α : Type u_1} [decidable_eq α] (m : multiset α) :
@[simp]
theorem multiset.to_finset_bind_dedup {α : Type u_1} {β : Type u_2} [decidable_eq α] [decidable_eq β] (m : multiset α) (f : α multiset β) :
@[simp]
theorem finset.val_to_finset {α : Type u_1} [decidable_eq α] (s : finset α) :
theorem finset.val_le_iff_val_subset {α : Type u_1} {a : finset α} {b : multiset α} :
a.val b a.val b
def list.to_finset {α : Type u_1} [decidable_eq α] (l : list α) :

to_finset l removes duplicates from the list l to produce a finset.

Equations
@[simp]
theorem list.to_finset_val {α : Type u_1} [decidable_eq α] (l : list α) :
@[simp]
theorem list.to_finset_coe {α : Type u_1} [decidable_eq α] (l : list α) :
theorem list.to_finset_eq {α : Type u_1} [decidable_eq α] {l : list α} (n : l.nodup) :
{val := l, nodup := n} = l.to_finset
@[simp]
theorem list.mem_to_finset {α : Type u_1} [decidable_eq α] {l : list α} {a : α} :
@[simp, norm_cast]
theorem list.coe_to_finset {α : Type u_1} [decidable_eq α] (l : list α) :
(l.to_finset) = {a : α | a l}
@[simp]
@[simp]
theorem list.to_finset_cons {α : Type u_1} [decidable_eq α] {l : list α} {a : α} :
theorem list.to_finset_eq_iff_perm_dedup {α : Type u_1} [decidable_eq α] {l l' : list α} :
theorem list.to_finset.ext_iff {α : Type u_1} [decidable_eq α] {a b : list α} :
a.to_finset = b.to_finset (x : α), x a x b
theorem list.to_finset.ext {α : Type u_1} [decidable_eq α] {l l' : list α} :
( (x : α), x l x l') l.to_finset = l'.to_finset
theorem list.to_finset_eq_of_perm {α : Type u_1} [decidable_eq α] (l l' : list α) (h : l ~ l') :
theorem list.perm_of_nodup_nodup_to_finset_eq {α : Type u_1} [decidable_eq α] {l l' : list α} (hl : l.nodup) (hl' : l'.nodup) (h : l.to_finset = l'.to_finset) :
l ~ l'
@[simp]
theorem list.to_finset_append {α : Type u_1} [decidable_eq α] {l l' : list α} :
@[simp]
theorem list.to_finset_reverse {α : Type u_1} [decidable_eq α] {l : list α} :
theorem list.to_finset_replicate_of_ne_zero {α : Type u_1} [decidable_eq α] {a : α} {n : } (hn : n 0) :
@[simp]
theorem list.to_finset_union {α : Type u_1} [decidable_eq α] (l l' : list α) :
@[simp]
theorem list.to_finset_inter {α : Type u_1} [decidable_eq α] (l l' : list α) :
@[simp]
theorem list.to_finset_eq_empty_iff {α : Type u_1} [decidable_eq α] (l : list α) :
@[simp]
noncomputable def finset.to_list {α : Type u_1} (s : finset α) :
list α

Produce a list of the elements in the finite set using choice.

Equations
theorem finset.nodup_to_list {α : Type u_1} (s : finset α) :
@[simp]
theorem finset.mem_to_list {α : Type u_1} {a : α} {s : finset α} :
a s.to_list a s
@[simp]
theorem finset.to_list_eq_nil {α : Type u_1} {s : finset α} :
@[simp]
theorem finset.empty_to_list {α : Type u_1} {s : finset α} :
@[simp]
theorem finset.to_list_empty {α : Type u_1} :
theorem finset.nonempty.to_list_ne_nil {α : Type u_1} {s : finset α} (hs : s.nonempty) :
theorem finset.nonempty.not_empty_to_list {α : Type u_1} {s : finset α} (hs : s.nonempty) :
@[simp, norm_cast]
theorem finset.coe_to_list {α : Type u_1} (s : finset α) :
@[simp]
theorem finset.to_list_to_finset {α : Type u_1} [decidable_eq α] (s : finset α) :
@[simp]
theorem finset.to_list_eq_singleton_iff {α : Type u_1} {a : α} {s : finset α} :
s.to_list = [a] s = {a}
@[simp]
theorem finset.to_list_singleton {α : Type u_1} (a : α) :
{a}.to_list = [a]
theorem finset.exists_list_nodup_eq {α : Type u_1} [decidable_eq α] (s : finset α) :
(l : list α), l.nodup l.to_finset = s
theorem finset.to_list_cons {α : Type u_1} {a : α} {s : finset α} (h : a s) :
theorem finset.to_list_insert {α : Type u_1} [decidable_eq α] {a : α} {s : finset α} (h : a s) :

disj_Union #

This section is about the bounded union of a disjoint indexed family t : α → finset β of finite sets over a finite set s : finset α. In most cases finset.bUnion should be preferred.

def finset.disj_Union {α : Type u_1} {β : Type u_2} (s : finset α) (t : α finset β) (hf : s.pairwise_disjoint t) :

disj_Union s f h is the set such that a ∈ disj_Union s f iff a ∈ f i for some i ∈ s. It is the same as s.bUnion f, but it does not require decidable equality on the type. The hypothesis ensures that the sets are disjoint.

Equations
@[simp]
theorem finset.disj_Union_val {α : Type u_1} {β : Type u_2} (s : finset α) (t : α finset β) (h : s.pairwise_disjoint t) :
(s.disj_Union t h).val = s.val.bind (λ (a : α), (t a).val)
@[simp]
theorem finset.disj_Union_empty {α : Type u_1} {β : Type u_2} (t : α finset β) :
@[simp]
theorem finset.mem_disj_Union {α : Type u_1} {β : Type u_2} {s : finset α} {t : α finset β} {b : β} {h : s.pairwise_disjoint t} :
b s.disj_Union t h (a : α) (H : a s), b t a
@[simp, norm_cast]
theorem finset.coe_disj_Union {α : Type u_1} {β : Type u_2} {s : finset α} {t : α finset β} {h : s.pairwise_disjoint t} :
(s.disj_Union t h) = (x : α) (H : x s), (t x)
@[simp]
theorem finset.disj_Union_cons {α : Type u_1} {β : Type u_2} (a : α) (s : finset α) (ha : a s) (f : α finset β) (H : (finset.cons a s ha).pairwise_disjoint f) :
(finset.cons a s ha).disj_Union f H = (f a).disj_union (s.disj_Union f _) _
@[simp]
theorem finset.singleton_disj_Union {α : Type u_1} {β : Type u_2} {t : α finset β} (a : α) {h : {a}.pairwise_disjoint t} :
{a}.disj_Union t h = t a
theorem finset.disj_Union_disj_Union {α : Type u_1} {β : Type u_2} {γ : Type u_3} (s : finset α) (f : α finset β) (g : β finset γ) (h1 : s.pairwise_disjoint f) (h2 : (s.disj_Union f h1).pairwise_disjoint g) :
(s.disj_Union f h1).disj_Union g h2 = s.attach.disj_Union (λ (a : {x // x s}), (f a).disj_Union g _) _
theorem finset.disj_Union_filter_eq_of_maps_to {α : Type u_1} {β : Type u_2} [decidable_eq β] {s : finset α} {t : finset β} {f : α β} (h : (x : α), x s f x t) :
t.disj_Union (λ (a : β), finset.filter (λ (c : α), f c = a) s) _ = s

bUnion #

This section is about the bounded union of an indexed family t : α → finset β of finite sets over a finite set s : finset α.

@[protected]
def finset.bUnion {α : Type u_1} {β : Type u_2} [decidable_eq β] (s : finset α) (t : α finset β) :

bUnion s t is the union of t x over x ∈ s. (This was formerly bind due to the monad structure on types with decidable_eq.)

Equations
@[simp]
theorem finset.bUnion_val {α : Type u_1} {β : Type u_2} [decidable_eq β] (s : finset α) (t : α finset β) :
(s.bUnion t).val = (s.val.bind (λ (a : α), (t a).val)).dedup
@[simp]
theorem finset.bUnion_empty {α : Type u_1} {β : Type u_2} [decidable_eq β] {t : α finset β} :
@[simp]
theorem finset.mem_bUnion {α : Type u_1} {β : Type u_2} [decidable_eq β] {s : finset α} {t : α finset β} {b : β} :
b s.bUnion t (a : α) (H : a s), b t a
@[simp, norm_cast]
theorem finset.coe_bUnion {α : Type u_1} {β : Type u_2} [decidable_eq β] {s : finset α} {t : α finset β} :
(s.bUnion t) = (x : α) (H : x s), (t x)
@[simp]
theorem finset.bUnion_insert {α : Type u_1} {β : Type u_2} [decidable_eq β] {s : finset α} {t : α finset β} [decidable_eq α] {a : α} :
theorem finset.bUnion_congr {α : Type u_1} {β : Type u_2} [decidable_eq β] {s₁ s₂ : finset α} {t₁ t₂ : α finset β} (hs : s₁ = s₂) (ht : (a : α), a s₁ t₁ a = t₂ a) :
s₁.bUnion t₁ = s₂.bUnion t₂
@[simp]
theorem finset.disj_Union_eq_bUnion {α : Type u_1} {β : Type u_2} [decidable_eq β] (s : finset α) (f : α finset β) (hf : s.pairwise_disjoint f) :
s.disj_Union f hf = s.bUnion f
theorem finset.bUnion_subset {α : Type u_1} {β : Type u_2} [decidable_eq β] {s : finset α} {t : α finset β} {s' : finset β} :
s.bUnion t s' (x : α), x s t x s'
@[simp]
theorem finset.singleton_bUnion {α : Type u_1} {β : Type u_2} [decidable_eq β] {t : α finset β} {a : α} :
{a}.bUnion t = t a
theorem finset.bUnion_inter {α : Type u_1} {β : Type u_2} [decidable_eq β] (s : finset α) (f : α finset β) (t : finset β) :
s.bUnion f t = s.bUnion (λ (x : α), f x t)
theorem finset.inter_bUnion {α : Type u_1} {β : Type u_2} [decidable_eq β] (t : finset β) (s : finset α) (f : α finset β) :
t s.bUnion f = s.bUnion (λ (x : α), t f x)
theorem finset.bUnion_bUnion {α : Type u_1} {β : Type u_2} {γ : Type u_3} [decidable_eq β] [decidable_eq γ] (s : finset α) (f : α finset β) (g : β finset γ) :
(s.bUnion f).bUnion g = s.bUnion (λ (a : α), (f a).bUnion g)
theorem finset.bind_to_finset {α : Type u_1} {β : Type u_2} [decidable_eq β] [decidable_eq α] (s : multiset α) (t : α multiset β) :
(s.bind t).to_finset = s.to_finset.bUnion (λ (a : α), (t a).to_finset)
theorem finset.bUnion_mono {α : Type u_1} {β : Type u_2} [decidable_eq β] {s : finset α} {t₁ t₂ : α finset β} (h : (a : α), a s t₁ a t₂ a) :
s.bUnion t₁ s.bUnion t₂
theorem finset.bUnion_subset_bUnion_of_subset_left {α : Type u_1} {β : Type u_2} [decidable_eq β] {s₁ s₂ : finset α} (t : α finset β) (h : s₁ s₂) :
s₁.bUnion t s₂.bUnion t
theorem finset.subset_bUnion_of_mem {α : Type u_1} {β : Type u_2} [decidable_eq β] {s : finset α} (u : α finset β) {x : α} (xs : x s) :
u x s.bUnion u
@[simp]
theorem finset.bUnion_subset_iff_forall_subset {α : Type u_1} {β : Type u_2} [decidable_eq β] {s : finset α} {t : finset β} {f : α finset β} :
s.bUnion f t (x : α), x s f x t
theorem finset.filter_bUnion {α : Type u_1} {β : Type u_2} [decidable_eq β] (s : finset α) (f : α finset β) (p : β Prop) [decidable_pred p] :
finset.filter p (s.bUnion f) = s.bUnion (λ (a : α), finset.filter p (f a))
theorem finset.bUnion_filter_eq_of_maps_to {α : Type u_1} {β : Type u_2} [decidable_eq β] [decidable_eq α] {s : finset α} {t : finset β} {f : α β} (h : (x : α), x s f x t) :
t.bUnion (λ (a : β), finset.filter (λ (c : α), f c = a) s) = s
theorem finset.erase_bUnion {α : Type u_1} {β : Type u_2} [decidable_eq β] (f : α finset β) (s : finset α) (b : β) :
(s.bUnion f).erase b = s.bUnion (λ (x : α), (f x).erase b)
@[simp]
theorem finset.bUnion_nonempty {α : Type u_1} {β : Type u_2} [decidable_eq β] {s : finset α} {t : α finset β} :
(s.bUnion t).nonempty (x : α) (H : x s), (t x).nonempty
theorem finset.nonempty.bUnion {α : Type u_1} {β : Type u_2} [decidable_eq β] {s : finset α} {t : α finset β} (hs : s.nonempty) (ht : (x : α), x s (t x).nonempty) :
theorem finset.disjoint_bUnion_left {α : Type u_1} {β : Type u_2} [decidable_eq β] (s : finset α) (f : α finset β) (t : finset β) :
disjoint (s.bUnion f) t (i : α), i s disjoint (f i) t
theorem finset.disjoint_bUnion_right {α : Type u_1} {β : Type u_2} [decidable_eq β] (s : finset β) (t : finset α) (f : α finset β) :
disjoint s (t.bUnion f) (i : α), i t disjoint s (f i)

choose #

def finset.choose_x {α : Type u_1} (p : α Prop) [decidable_pred p] (l : finset α) (hp : ∃! (a : α), a l p a) :
{a // a l p a}

Given a finset l and a predicate p, associate to a proof that there is a unique element of l satisfying p this unique element, as an element of the corresponding subtype.

Equations
def finset.choose {α : Type u_1} (p : α Prop) [decidable_pred p] (l : finset α) (hp : ∃! (a : α), a l p a) :
α

Given a finset l and a predicate p, associate to a proof that there is a unique element of l satisfying p this unique element, as an element of the ambient type.

Equations
theorem finset.choose_spec {α : Type u_1} (p : α Prop) [decidable_pred p] (l : finset α) (hp : ∃! (a : α), a l p a) :
finset.choose p l hp l p (finset.choose p l hp)
theorem finset.choose_mem {α : Type u_1} (p : α Prop) [decidable_pred p] (l : finset α) (hp : ∃! (a : α), a l p a) :
theorem finset.choose_property {α : Type u_1} (p : α Prop) [decidable_pred p] (l : finset α) (hp : ∃! (a : α), a l p a) :
p (finset.choose p l hp)
theorem finset.pairwise_subtype_iff_pairwise_finset' {α : Type u_1} {β : Type u_2} {s : finset α} (r : β β Prop) (f : α β) :
pairwise (r on λ (x : s), f x) s.pairwise (r on f)
theorem finset.pairwise_subtype_iff_pairwise_finset {α : Type u_1} {s : finset α} (r : α α Prop) :
pairwise (r on λ (x : s), x) s.pairwise r
theorem finset.pairwise_cons' {α : Type u_1} {β : Type u_2} {s : finset α} {a : α} (ha : a s) (r : β β Prop) (f : α β) :
pairwise (r on λ (a_1 : (finset.cons a s ha)), f a_1) pairwise (r on λ (a : s), f a) (b : α), b s r (f a) (f b) r (f b) (f a)
theorem finset.pairwise_cons {α : Type u_1} {s : finset α} {a : α} (ha : a s) (r : α α Prop) :
pairwise (r on λ (a_1 : (finset.cons a s ha)), a_1) pairwise (r on λ (a : s), a) (b : α), b s r a b r b a

Inhabited types are equivalent to option β for some β by identifying default α with none.

Equations
theorem multiset.disjoint_to_finset {α : Type u_1} [decidable_eq α] {m1 m2 : multiset α} :