Documentation

Mathlib.Data.Finset.Prod

Finsets in product types #

This file defines finset constructions on the product type α × β. Beware not to confuse with the Finset.prod operation which computes the multiplicative product.

Main declarations #

prod #

def Finset.product {α : Type u_1} {β : Type u_2} (s : Finset α) (t : Finset β) :
Finset (α × β)

product s t is the set of pairs (a, b) such that a ∈ s and b ∈ t.

Equations
Instances For
    instance Finset.instSProd {α : Type u_1} {β : Type u_2} :
    SProd (Finset α) (Finset β) (Finset (α × β))
    Equations
    • Finset.instSProd = { sprod := Finset.product }
    @[simp]
    theorem Finset.product_val {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} :
    (s ×ˢ t).val = s.val ×ˢ t.val
    @[simp]
    theorem Finset.mem_product {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} {p : α × β} :
    p s ×ˢ t p.fst s p.snd t
    theorem Finset.mk_mem_product {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} {a : α} {b : β} (ha : a s) (hb : b t) :
    (a, b) s ×ˢ t
    @[simp]
    theorem Finset.coe_product {α : Type u_1} {β : Type u_2} (s : Finset α) (t : Finset β) :
    ↑(s ×ˢ t) = s ×ˢ t
    theorem Finset.subset_product_image_fst {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} [DecidableEq α] :
    Finset.image Prod.fst (s ×ˢ t) s
    theorem Finset.subset_product_image_snd {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} [DecidableEq β] :
    Finset.image Prod.snd (s ×ˢ t) t
    theorem Finset.product_image_fst {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} [DecidableEq α] (ht : Finset.Nonempty t) :
    Finset.image Prod.fst (s ×ˢ t) = s
    theorem Finset.product_image_snd {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} [DecidableEq β] (ht : Finset.Nonempty s) :
    Finset.image Prod.snd (s ×ˢ t) = t
    theorem Finset.subset_product {α : Type u_1} {β : Type u_2} [DecidableEq α] [DecidableEq β] {s : Finset (α × β)} :
    s Finset.image Prod.fst s ×ˢ Finset.image Prod.snd s
    theorem Finset.product_subset_product {α : Type u_1} {β : Type u_2} {s : Finset α} {s' : Finset α} {t : Finset β} {t' : Finset β} (hs : s s') (ht : t t') :
    s ×ˢ t s' ×ˢ t'
    theorem Finset.product_subset_product_left {α : Type u_1} {β : Type u_2} {s : Finset α} {s' : Finset α} {t : Finset β} (hs : s s') :
    s ×ˢ t s' ×ˢ t
    theorem Finset.product_subset_product_right {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} {t' : Finset β} (ht : t t') :
    s ×ˢ t s ×ˢ t'
    theorem Finset.map_swap_product {α : Type u_1} {β : Type u_2} (s : Finset α) (t : Finset β) :
    Finset.map { toFun := Prod.swap, inj' := (_ : Function.Injective Prod.swap) } (t ×ˢ s) = s ×ˢ t
    @[simp]
    theorem Finset.image_swap_product {α : Type u_1} {β : Type u_2} [DecidableEq (α × β)] (s : Finset α) (t : Finset β) :
    Finset.image Prod.swap (t ×ˢ s) = s ×ˢ t
    theorem Finset.product_eq_biUnion {α : Type u_1} {β : Type u_2} [DecidableEq (α × β)] (s : Finset α) (t : Finset β) :
    s ×ˢ t = Finset.biUnion s fun a => Finset.image (fun b => (a, b)) t
    theorem Finset.product_eq_biUnion_right {α : Type u_1} {β : Type u_2} [DecidableEq (α × β)] (s : Finset α) (t : Finset β) :
    s ×ˢ t = Finset.biUnion t fun b => Finset.image (fun a => (a, b)) s
    @[simp]
    theorem Finset.product_biUnion {α : Type u_1} {β : Type u_2} {γ : Type u_3} [DecidableEq γ] (s : Finset α) (t : Finset β) (f : α × βFinset γ) :
    Finset.biUnion (s ×ˢ t) f = Finset.biUnion s fun a => Finset.biUnion t fun b => f (a, b)

    See also Finset.sup_product_left.

    @[simp]
    theorem Finset.card_product {α : Type u_1} {β : Type u_2} (s : Finset α) (t : Finset β) :
    theorem Finset.nontrivial_prod_iff {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} :
    Nontrivial { x // x s ×ˢ t } Finset.Nonempty s Finset.Nonempty t (Nontrivial { x // x s } Nontrivial { x // x t })

    The product of two Finsets is nontrivial iff both are nonempty at least one of them is nontrivial.

    theorem Finset.filter_product {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} (p : αProp) (q : βProp) [DecidablePred p] [DecidablePred q] :
    Finset.filter (fun x => p x.fst q x.snd) (s ×ˢ t) = Finset.filter p s ×ˢ Finset.filter q t
    theorem Finset.filter_product_left {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} (p : αProp) [DecidablePred p] :
    Finset.filter (fun x => p x.fst) (s ×ˢ t) = Finset.filter p s ×ˢ t
    theorem Finset.filter_product_right {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} (q : βProp) [DecidablePred q] :
    Finset.filter (fun x => q x.snd) (s ×ˢ t) = s ×ˢ Finset.filter q t
    theorem Finset.filter_product_card {α : Type u_1} {β : Type u_2} (s : Finset α) (t : Finset β) (p : αProp) (q : βProp) [DecidablePred p] [DecidablePred q] :
    Finset.card (Finset.filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = Finset.card (Finset.filter p s) * Finset.card (Finset.filter q t) + Finset.card (Finset.filter (fun x => ¬p x) s) * Finset.card (Finset.filter (fun x => ¬q x) t)
    theorem Finset.empty_product {α : Type u_1} {β : Type u_2} (t : Finset β) :
    theorem Finset.product_empty {α : Type u_1} {β : Type u_2} (s : Finset α) :
    theorem Finset.Nonempty.product {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} (hs : Finset.Nonempty s) (ht : Finset.Nonempty t) :
    theorem Finset.Nonempty.fst {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} (h : Finset.Nonempty (s ×ˢ t)) :
    theorem Finset.Nonempty.snd {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} (h : Finset.Nonempty (s ×ˢ t)) :
    @[simp]
    theorem Finset.nonempty_product {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} :
    @[simp]
    theorem Finset.product_eq_empty {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} :
    s ×ˢ t = s = t =
    @[simp]
    theorem Finset.singleton_product {α : Type u_1} {β : Type u_2} {t : Finset β} {a : α} :
    {a} ×ˢ t = Finset.map { toFun := Prod.mk a, inj' := (_ : Function.Injective (Prod.mk a)) } t
    @[simp]
    theorem Finset.product_singleton {α : Type u_1} {β : Type u_2} {s : Finset α} {b : β} :
    s ×ˢ {b} = Finset.map { toFun := fun i => (i, b), inj' := (_ : Function.Injective fun a => (a, b)) } s
    theorem Finset.singleton_product_singleton {α : Type u_1} {β : Type u_2} {a : α} {b : β} :
    {a} ×ˢ {b} = {(a, b)}
    @[simp]
    theorem Finset.union_product {α : Type u_1} {β : Type u_2} {s : Finset α} {s' : Finset α} {t : Finset β} [DecidableEq α] [DecidableEq β] :
    (s s') ×ˢ t = s ×ˢ t s' ×ˢ t
    @[simp]
    theorem Finset.product_union {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} {t' : Finset β} [DecidableEq α] [DecidableEq β] :
    s ×ˢ (t t') = s ×ˢ t s ×ˢ t'
    theorem Finset.inter_product {α : Type u_1} {β : Type u_2} {s : Finset α} {s' : Finset α} {t : Finset β} [DecidableEq α] [DecidableEq β] :
    (s s') ×ˢ t = s ×ˢ t s' ×ˢ t
    theorem Finset.product_inter {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} {t' : Finset β} [DecidableEq α] [DecidableEq β] :
    s ×ˢ (t t') = s ×ˢ t s ×ˢ t'
    theorem Finset.product_inter_product {α : Type u_1} {β : Type u_2} {s : Finset α} {s' : Finset α} {t : Finset β} {t' : Finset β} [DecidableEq α] [DecidableEq β] :
    s ×ˢ t s' ×ˢ t' = (s s') ×ˢ (t t')
    theorem Finset.disjoint_product {α : Type u_1} {β : Type u_2} {s : Finset α} {s' : Finset α} {t : Finset β} {t' : Finset β} :
    Disjoint (s ×ˢ t) (s' ×ˢ t') Disjoint s s' Disjoint t t'
    @[simp]
    theorem Finset.disjUnion_product {α : Type u_1} {β : Type u_2} {s : Finset α} {s' : Finset α} {t : Finset β} (hs : Disjoint s s') :
    Finset.disjUnion s s' hs ×ˢ t = Finset.disjUnion (s ×ˢ t) (s' ×ˢ t) (_ : Disjoint (s ×ˢ t) (s' ×ˢ t))
    @[simp]
    theorem Finset.product_disjUnion {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} {t' : Finset β} (ht : Disjoint t t') :
    s ×ˢ Finset.disjUnion t t' ht = Finset.disjUnion (s ×ˢ t) (s ×ˢ t') (_ : Disjoint (s ×ˢ t) (s ×ˢ t'))
    def Finset.diag {α : Type u_1} [DecidableEq α] (s : Finset α) :
    Finset (α × α)

    Given a finite set s, the diagonal, s.diag is the set of pairs of the form (a, a) for a ∈ s.

    Equations
    Instances For
      def Finset.offDiag {α : Type u_1} [DecidableEq α] (s : Finset α) :
      Finset (α × α)

      Given a finite set s, the off-diagonal, s.offDiag is the set of pairs (a, b) with a ≠ b for a, b ∈ s.

      Equations
      Instances For
        @[simp]
        theorem Finset.mem_diag {α : Type u_1} [DecidableEq α] {s : Finset α} {x : α × α} :
        x Finset.diag s x.fst s x.fst = x.snd
        @[simp]
        theorem Finset.mem_offDiag {α : Type u_1} [DecidableEq α] {s : Finset α} {x : α × α} :
        x Finset.offDiag s x.fst s x.snd s x.fst x.snd
        @[simp]
        theorem Finset.coe_offDiag {α : Type u_1} [DecidableEq α] (s : Finset α) :
        @[simp]
        theorem Finset.diag_mono {α : Type u_1} [DecidableEq α] :
        Monotone Finset.diag
        theorem Finset.offDiag_mono {α : Type u_1} [DecidableEq α] :
        Monotone Finset.offDiag
        @[simp]
        @[simp]
        theorem Finset.diag_inter {α : Type u_1} [DecidableEq α] (s : Finset α) (t : Finset α) :
        theorem Finset.diag_union {α : Type u_1} [DecidableEq α] (s : Finset α) (t : Finset α) :
        theorem Finset.offDiag_union {α : Type u_1} [DecidableEq α] {s : Finset α} {t : Finset α} (h : Disjoint s t) :
        @[simp]
        theorem Finset.offDiag_singleton {α : Type u_1} [DecidableEq α] (a : α) :
        theorem Finset.diag_singleton {α : Type u_1} [DecidableEq α] (a : α) :
        Finset.diag {a} = {(a, a)}
        theorem Finset.diag_insert {α : Type u_1} [DecidableEq α] {s : Finset α} (a : α) :
        theorem Finset.offDiag_insert {α : Type u_1} [DecidableEq α] {s : Finset α} (a : α) (has : ¬a s) :