Built with doc-gen4, running Lean4. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓to navigate, Ctrl+🖱️to focus. On Mac, use Cmdinstead of Ctrl.
/-
Copyright (c) 2017 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl, Mario Carneiro, Oliver Nash

! This file was ported from Lean 3 source module data.finset.prod
! leanprover-community/mathlib commit 9003f28797c0664a49e4179487267c494477d853
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Data.Finset.Card

/-!
# 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

* `Finset.product`: Turns `s : Finset α`, `t : Finset β` into their product in `Finset (α × β)`.
* `Finset.diag`: For `s : Finset α`, `s.diag` is the `Finset (α × α)` of pairs `(a, a)` with
  `a ∈ s`.
* `Finset.offDiag`: For `s : Finset α`, `s.offDiag` is the `Finset (α × α)` of pairs `(a, b)` with
  `a, b ∈ s` and `a ≠ b`.
-/


open Multiset

variable {
α: Type ?u.2
α
β: Type ?u.5
β
γ: Type ?u.17
γ
:
Type _: Type (?u.67086+1)
Type _
} namespace Finset /-! ### prod -/ section Prod variable {
s: Finset α
s
s': Finset α
s'
:
Finset: Type ?u.22954 → Type ?u.22954
Finset
α: Type ?u.11
α
} {
t: Finset β
t
t': Finset β
t'
:
Finset: Type ?u.17694 → Type ?u.17694
Finset
β: Type ?u.357
β
} {
a: α
a
:
α: Type ?u.36
α
} {
b: β
b
:
β: Type ?u.14
β
} /-- `product s t` is the set of pairs `(a, b)` such that `a ∈ s` and `b ∈ t`. -/ protected def
product: Finset αFinset βFinset (α × β)
product
(
s: Finset α
s
:
Finset: Type ?u.61 → Type ?u.61
Finset
α: Type ?u.36
α
) (
t: Finset β
t
:
Finset: Type ?u.64 → Type ?u.64
Finset
β: Type ?u.39
β
) :
Finset: Type ?u.67 → Type ?u.67
Finset
(
α: Type ?u.36
α
×
β: Type ?u.39
β
) := ⟨
_: Multiset ?m.77
_
,
s: Finset α
s
.
nodup: ∀ {α : Type ?u.80} (self : Finset α), Nodup self.val
nodup
.
product: ∀ {α : Type ?u.84} {β : Type ?u.83} {s : Multiset α} {t : Multiset β}, Nodup sNodup tNodup (s ×ˢ t)
product
t: Finset β
t
.
nodup: ∀ {α : Type ?u.103} (self : Finset α), Nodup self.val
nodup
#align finset.product
Finset.product: {α : Type u_1} → {β : Type u_2} → Finset αFinset βFinset (α × β)
Finset.product
instance
instSProd: {α : Type u_1} → {β : Type u_2} → SProd (Finset α) (Finset β) (Finset (α × β))
instSProd
:
SProd: Type ?u.230 → Type ?u.229 → outParam (Type ?u.228)Type (max(max?u.230?u.229)?u.228)
SProd
(
Finset: Type ?u.231 → Type ?u.231
Finset
α: Type ?u.203
α
) (
Finset: Type ?u.232 → Type ?u.232
Finset
β: Type ?u.206
β
) (
Finset: Type ?u.233 → Type ?u.233
Finset
(
α: Type ?u.203
α
×
β: Type ?u.206
β
)) where sprod :=
Finset.product: {α : Type ?u.247} → {β : Type ?u.246} → Finset αFinset βFinset (α × β)
Finset.product
@[simp] theorem
product_val: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β}, (s ×ˢ t).val = s.val ×ˢ t.val
product_val
: (
s: Finset α
s
×ˢ
t: Finset β
t
).
1: {α : Type ?u.412} → Finset αMultiset α
1
=
s: Finset α
s
.
1: {α : Type ?u.418} → Finset αMultiset α
1
×ˢ
t: Finset β
t
.
1: {α : Type ?u.420} → Finset αMultiset α
1
:=
rfl: ∀ {α : Sort ?u.455} {a : α}, a = a
rfl
#align finset.product_val
Finset.product_val: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β}, (s ×ˢ t).val = s.val ×ˢ t.val
Finset.product_val
@[simp] theorem
mem_product: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} {p : α × β}, p s ×ˢ t p.fst s p.snd t
mem_product
{
p: α × β
p
:
α: Type ?u.485
α
×
β: Type ?u.488
β
} :
p: α × β
p
s: Finset α
s
×ˢ
t: Finset β
t
p: α × β
p
.
1: {α : Type ?u.569} → {β : Type ?u.568} → α × βα
1
s: Finset α
s
p: α × β
p
.
2: {α : Type ?u.588} → {β : Type ?u.587} → α × ββ
2
t: Finset β
t
:=
Multiset.mem_product: ∀ {α : Type ?u.601} {β : Type ?u.602} {s : Multiset α} {t : Multiset β} {p : α × β}, p product s t p.fst s p.snd t
Multiset.mem_product
#align finset.mem_product
Finset.mem_product: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} {p : α × β}, p s ×ˢ t p.fst s p.snd t
Finset.mem_product
theorem
mk_mem_product: a sb t(a, b) s ×ˢ t
mk_mem_product
(
ha: a s
ha
:
a: α
a
s: Finset α
s
) (
hb: b t
hb
:
b: β
b
t: Finset β
t
) : (
a: α
a
,
b: β
b
) ∈
s: Finset α
s
×ˢ
t: Finset β
t
:=
mem_product: ∀ {α : Type ?u.841} {β : Type ?u.842} {s : Finset α} {t : Finset β} {p : α × β}, p s ×ˢ t p.fst s p.snd t
mem_product
.
2: ∀ {a b : Prop}, (a b) → ba
2
ha: a s
ha
,
hb: b t
hb
#align finset.mk_mem_product
Finset.mk_mem_product: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} {a : α} {b : β}, a sb t(a, b) s ×ˢ t
Finset.mk_mem_product
@[simp, norm_cast] theorem
coe_product: ∀ {α : Type u_1} {β : Type u_2} (s : Finset α) (t : Finset β), ↑(s ×ˢ t) = s ×ˢ t
coe_product
(
s: Finset α
s
:
Finset: Type ?u.919 → Type ?u.919
Finset
α: Type ?u.894
α
) (
t: Finset β
t
:
Finset: Type ?u.922 → Type ?u.922
Finset
β: Type ?u.897
β
) : (↑(
s: Finset α
s
×ˢ
t: Finset β
t
) :
Set: Type ?u.927 → Type ?u.927
Set
(
α: Type ?u.894
α
×
β: Type ?u.897
β
)) = (
s: Finset α
s
:
Set: Type ?u.1082 → Type ?u.1082
Set
α: Type ?u.894
α
) ×ˢ
t: Finset β
t
:=
Set.ext: ∀ {α : Type ?u.1392} {a b : Set α}, (∀ (x : α), x a x b) → a = b
Set.ext
fun
_: ?m.1402
_
=>
Finset.mem_product: ∀ {α : Type ?u.1404} {β : Type ?u.1405} {s : Finset α} {t : Finset β} {p : α × β}, p s ×ˢ t p.fst s p.snd t
Finset.mem_product
#align finset.coe_product
Finset.coe_product: ∀ {α : Type u_1} {β : Type u_2} (s : Finset α) (t : Finset β), ↑(s ×ˢ t) = s ×ˢ t
Finset.coe_product
theorem
subset_product_image_fst: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} [inst : DecidableEq α], image Prod.fst (s ×ˢ t) s
subset_product_image_fst
[
DecidableEq: Sort ?u.1602 → Sort (max1?u.1602)
DecidableEq
α: Type ?u.1577
α
] : (
s: Finset α
s
×ˢ
t: Finset β
t
).
image: {α : Type ?u.1654} → {β : Type ?u.1653} → [inst : DecidableEq β] → (αβ) → Finset αFinset β
image
Prod.fst: {α : Type ?u.1721} → {β : Type ?u.1720} → α × βα
Prod.fst
s: Finset α
s
:= fun
i: ?m.1780
i
=>

Goals accomplished! 🐙
α: Type u_1

β: Type u_2

γ: Type ?u.1583

s, s': Finset α

t, t': Finset β

a: α

b: β

inst✝: DecidableEq α

i: α


i image Prod.fst (s ×ˢ t)i s

Goals accomplished! 🐙
#align finset.subset_product_image_fst
Finset.subset_product_image_fst: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} [inst : DecidableEq α], image Prod.fst (s ×ˢ t) s
Finset.subset_product_image_fst
theorem
subset_product_image_snd: ∀ {α : Type u_2} {β : Type u_1} {s : Finset α} {t : Finset β} [inst : DecidableEq β], image Prod.snd (s ×ˢ t) t
subset_product_image_snd
[
DecidableEq: Sort ?u.6752 → Sort (max1?u.6752)
DecidableEq
β: Type ?u.6730
β
] : (
s: Finset α
s
×ˢ
t: Finset β
t
).
image: {α : Type ?u.6804} → {β : Type ?u.6803} → [inst : DecidableEq β] → (αβ) → Finset αFinset β
image
Prod.snd: {α : Type ?u.6871} → {β : Type ?u.6870} → α × ββ
Prod.snd
t: Finset β
t
:= fun
i: ?m.6930
i
=>

Goals accomplished! 🐙
α: Type u_2

β: Type u_1

γ: Type ?u.6733

s, s': Finset α

t, t': Finset β

a: α

b: β

inst✝: DecidableEq β

i: β


i image Prod.snd (s ×ˢ t)i t

Goals accomplished! 🐙
#align finset.subset_product_image_snd
Finset.subset_product_image_snd: ∀ {α : Type u_2} {β : Type u_1} {s : Finset α} {t : Finset β} [inst : DecidableEq β], image Prod.snd (s ×ˢ t) t
Finset.subset_product_image_snd
theorem
product_image_fst: ∀ [inst : DecidableEq α], Finset.Nonempty timage Prod.fst (s ×ˢ t) = s
product_image_fst
[
DecidableEq: Sort ?u.11271 → Sort (max1?u.11271)
DecidableEq
α: Type ?u.11246
α
] (ht :
t: Finset β
t
.
Nonempty: {α : Type ?u.11280} → Finset αProp
Nonempty
) : (
s: Finset α
s
×ˢ
t: Finset β
t
).
image: {α : Type ?u.11320} → {β : Type ?u.11319} → [inst : DecidableEq β] → (αβ) → Finset αFinset β
image
Prod.fst: {α : Type ?u.11332} → {β : Type ?u.11331} → α × βα
Prod.fst
=
s: Finset α
s
:=

Goals accomplished! 🐙
α: Type u_1

β: Type u_2

γ: Type ?u.11252

s, s': Finset α

t, t': Finset β

a: α

b: β

inst✝: DecidableEq α

ht: Finset.Nonempty t


image Prod.fst (s ×ˢ t) = s
α: Type u_1

β: Type u_2

γ: Type ?u.11252

s, s': Finset α

t, t': Finset β

a: α

b: β

inst✝: DecidableEq α

ht: Finset.Nonempty t

i: α


a
i image Prod.fst (s ×ˢ t) i s
α: Type u_1

β: Type u_2

γ: Type ?u.11252

s, s': Finset α

t, t': Finset β

a: α

b: β

inst✝: DecidableEq α

ht: Finset.Nonempty t


image Prod.fst (s ×ˢ t) = s

Goals accomplished! 🐙
#align finset.product_image_fst
Finset.product_image_fst: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} [inst : DecidableEq α], Finset.Nonempty timage Prod.fst (s ×ˢ t) = s
Finset.product_image_fst
theorem
product_image_snd: ∀ [inst : DecidableEq β], Finset.Nonempty simage Prod.snd (s ×ˢ t) = t
product_image_snd
[
DecidableEq: Sort ?u.13955 → Sort (max1?u.13955)
DecidableEq
β: Type ?u.13933
β
] (ht :
s: Finset α
s
.
Nonempty: {α : Type ?u.13964} → Finset αProp
Nonempty
) : (
s: Finset α
s
×ˢ
t: Finset β
t
).
image: {α : Type ?u.14004} → {β : Type ?u.14003} → [inst : DecidableEq β] → (αβ) → Finset αFinset β
image
Prod.snd: {α : Type ?u.14016} → {β : Type ?u.14015} → α × ββ
Prod.snd
=
t: Finset β
t
:=

Goals accomplished! 🐙
α: Type u_2

β: Type u_1

γ: Type ?u.13936

s, s': Finset α

t, t': Finset β

a: α

b: β

inst✝: DecidableEq β

ht: Finset.Nonempty s


image Prod.snd (s ×ˢ t) = t
α: Type u_2

β: Type u_1

γ: Type ?u.13936

s, s': Finset α

t, t': Finset β

a: α

b: β

inst✝: DecidableEq β

ht: Finset.Nonempty s

i: β


a
i image Prod.snd (s ×ˢ t) i t
α: Type u_2

β: Type u_1

γ: Type ?u.13936

s, s': Finset α

t, t': Finset β

a: α

b: β

inst✝: DecidableEq β

ht: Finset.Nonempty s


image Prod.snd (s ×ˢ t) = t

Goals accomplished! 🐙
#align finset.product_image_snd
Finset.product_image_snd: ∀ {α : Type u_2} {β : Type u_1} {s : Finset α} {t : Finset β} [inst : DecidableEq β], Finset.Nonempty simage Prod.snd (s ×ˢ t) = t
Finset.product_image_snd
theorem
subset_product: ∀ [inst : DecidableEq α] [inst_1 : DecidableEq β] {s : Finset (α × β)}, s image Prod.fst s ×ˢ image Prod.snd s
subset_product
[
DecidableEq: Sort ?u.16402 → Sort (max1?u.16402)
DecidableEq
α: Type ?u.16377
α
] [
DecidableEq: Sort ?u.16411 → Sort (max1?u.16411)
DecidableEq
β: Type ?u.16380
β
] {
s: Finset (α × β)
s
:
Finset: Type ?u.16420 → Type ?u.16420
Finset
(
α: Type ?u.16377
α
×
β: Type ?u.16380
β
)} :
s: Finset (α × β)
s
s: Finset (α × β)
s
.
image: {α : Type ?u.16440} → {β : Type ?u.16439} → [inst : DecidableEq β] → (αβ) → Finset αFinset β
image
Prod.fst: {α : Type ?u.16452} → {β : Type ?u.16451} → α × βα
Prod.fst
×ˢ
s: Finset (α × β)
s
.
image: {α : Type ?u.16507} → {β : Type ?u.16506} → [inst : DecidableEq β] → (αβ) → Finset αFinset β
image
Prod.snd: {α : Type ?u.16519} → {β : Type ?u.16518} → α × ββ
Prod.snd
:= fun
_: ?m.16617
_
hp: ?m.16620
hp
=>
mem_product: ∀ {α : Type ?u.16622} {β : Type ?u.16623} {s : Finset α} {t : Finset β} {p : α × β}, p s ×ˢ t p.fst s p.snd t
mem_product
.
2: ∀ {a b : Prop}, (a b) → ba
2
mem_image_of_mem: ∀ {α : Type ?u.16660} {β : Type ?u.16661} [inst : DecidableEq β] {s : Finset α} (f : αβ) {a : α}, a sf a image f s
mem_image_of_mem
_: ?m.16662?m.16663
_
hp: ?m.16620
hp
,
mem_image_of_mem: ∀ {α : Type ?u.16797} {β : Type ?u.16798} [inst : DecidableEq β] {s : Finset α} (f : αβ) {a : α}, a sf a image f s
mem_image_of_mem
_: ?m.16799?m.16800
_
hp: ?m.16620
hp
#align finset.subset_product
Finset.subset_product: ∀ {α : Type u_1} {β : Type u_2} [inst : DecidableEq α] [inst_1 : DecidableEq β] {s : Finset (α × β)}, s image Prod.fst s ×ˢ image Prod.snd s
Finset.subset_product
theorem
product_subset_product: ∀ {α : Type u_1} {β : Type u_2} {s s' : Finset α} {t t' : Finset β}, s s't t's ×ˢ t s' ×ˢ t'
product_subset_product
(
hs: s s'
hs
:
s: Finset α
s
s': Finset α
s'
) (
ht: t t'
ht
:
t: Finset β
t
t': Finset β
t'
) :
s: Finset α
s
×ˢ
t: Finset β
t
s': Finset α
s'
×ˢ
t': Finset β
t'
:= fun ⟨_, _⟩
h: ?m.17100
h
=>
mem_product: ∀ {α : Type ?u.17154} {β : Type ?u.17155} {s : Finset α} {t : Finset β} {p : α × β}, p s ×ˢ t p.fst s p.snd t
mem_product
.
2: ∀ {a b : Prop}, (a b) → ba
2
hs: s s'
hs
(
mem_product: ∀ {α : Type ?u.17191} {β : Type ?u.17192} {s : Finset α} {t : Finset β} {p : α × β}, p s ×ˢ t p.fst s p.snd t
mem_product
.
1: ∀ {a b : Prop}, (a b) → ab
1
h: (fst✝, snd✝) s ×ˢ t
h
).
1: ∀ {a b : Prop}, a ba
1
,
ht: t t'
ht
(
mem_product: ∀ {α : Type ?u.17216} {β : Type ?u.17217} {s : Finset α} {t : Finset β} {p : α × β}, p s ×ˢ t p.fst s p.snd t
mem_product
.
1: ∀ {a b : Prop}, (a b) → ab
1
h: (fst✝, snd✝) s ×ˢ t
h
).
2: ∀ {a b : Prop}, a bb
2
#align finset.product_subset_product
Finset.product_subset_product: ∀ {α : Type u_1} {β : Type u_2} {s s' : Finset α} {t t' : Finset β}, s s't t's ×ˢ t s' ×ˢ t'
Finset.product_subset_product
theorem
product_subset_product_left: ∀ {α : Type u_1} {β : Type u_2} {s s' : Finset α} {t : Finset β}, s s's ×ˢ t s' ×ˢ t
product_subset_product_left
(
hs: s s'
hs
:
s: Finset α
s
s': Finset α
s'
) :
s: Finset α
s
×ˢ
t: Finset β
t
s': Finset α
s'
×ˢ
t: Finset β
t
:=
product_subset_product: ∀ {α : Type ?u.17463} {β : Type ?u.17464} {s s' : Finset α} {t t' : Finset β}, s s't t's ×ˢ t s' ×ˢ t'
product_subset_product
hs: s s'
hs
(
Subset.refl: ∀ {α : Type ?u.17491} (s : Finset α), s s
Subset.refl
_: Finset ?m.17492
_
) #align finset.product_subset_product_left
Finset.product_subset_product_left: ∀ {α : Type u_1} {β : Type u_2} {s s' : Finset α} {t : Finset β}, s s's ×ˢ t s' ×ˢ t
Finset.product_subset_product_left
theorem
product_subset_product_right: t t's ×ˢ t s ×ˢ t'
product_subset_product_right
(
ht: t t'
ht
:
t: Finset β
t
t': Finset β
t'
) :
s: Finset α
s
×ˢ
t: Finset β
t
s: Finset α
s
×ˢ
t': Finset β
t'
:=
product_subset_product: ∀ {α : Type ?u.17635} {β : Type ?u.17636} {s s' : Finset α} {t t' : Finset β}, s s't t's ×ˢ t s' ×ˢ t'
product_subset_product
(
Subset.refl: ∀ {α : Type ?u.17663} (s : Finset α), s s
Subset.refl
_: Finset ?m.17664
_
)
ht: t t'
ht
#align finset.product_subset_product_right
Finset.product_subset_product_right: ∀ {α : Type u_2} {β : Type u_1} {s : Finset α} {t t' : Finset β}, t t's ×ˢ t s ×ˢ t'
Finset.product_subset_product_right
theorem
map_swap_product: ∀ {α : Type u_1} {β : Type u_2} (s : Finset α) (t : Finset β), map { toFun := Prod.swap, inj' := (_ : Function.Injective Prod.swap) } (t ×ˢ s) = s ×ˢ t
map_swap_product
(
s: Finset α
s
:
Finset: Type ?u.17704 → Type ?u.17704
Finset
α: Type ?u.17679
α
) (
t: Finset β
t
:
Finset: Type ?u.17707 → Type ?u.17707
Finset
β: Type ?u.17682
β
) : (
t: Finset β
t
×ˢ
s: Finset α
s
).
map: {α : Type ?u.17744} → {β : Type ?u.17743} → (α β) → Finset αFinset β
map
Prod.swap: {α : Type ?u.17762} → {β : Type ?u.17761} → α × ββ × α
Prod.swap
,
Prod.swap_injective: ∀ {α : Type ?u.17768} {β : Type ?u.17769}, Function.Injective Prod.swap
Prod.swap_injective
⟩ =
s: Finset α
s
×ˢ
t: Finset β
t
:=
coe_injective: ∀ {α : Type ?u.17827}, Function.Injective toSet
coe_injective
<|

Goals accomplished! 🐙
α: Type u_1

β: Type u_2

γ: Type ?u.17685

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β


↑(map { toFun := Prod.swap, inj' := (_ : Function.Injective Prod.swap) } (t ×ˢ s)) = ↑(s ×ˢ t)
α: Type u_1

β: Type u_2

γ: Type ?u.17685

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β


(fun a => { toFun := Prod.swap, inj' := (_ : Function.Injective Prod.swap) } a) '' t ×ˢ s = s ×ˢ t
α: Type u_1

β: Type u_2

γ: Type ?u.17685

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β


↑(map { toFun := Prod.swap, inj' := (_ : Function.Injective Prod.swap) } (t ×ˢ s)) = ↑(s ×ˢ t)

Goals accomplished! 🐙
#align finset.map_swap_product
Finset.map_swap_product: ∀ {α : Type u_1} {β : Type u_2} (s : Finset α) (t : Finset β), map { toFun := Prod.swap, inj' := (_ : Function.Injective Prod.swap) } (t ×ˢ s) = s ×ˢ t
Finset.map_swap_product
@[simp] theorem
image_swap_product: ∀ {α : Type u_2} {β : Type u_1} [inst : DecidableEq (α × β)] (s : Finset α) (t : Finset β), image Prod.swap (t ×ˢ s) = s ×ˢ t
image_swap_product
[
DecidableEq: Sort ?u.18253 → Sort (max1?u.18253)
DecidableEq
(
α: Type ?u.18228
α
×
β: Type ?u.18231
β
)] (
s: Finset α
s
:
Finset: Type ?u.18264 → Type ?u.18264
Finset
α: Type ?u.18228
α
) (
t: Finset β
t
:
Finset: Type ?u.18267 → Type ?u.18267
Finset
β: Type ?u.18231
β
) : (
t: Finset β
t
×ˢ
s: Finset α
s
).
image: {α : Type ?u.18304} → {β : Type ?u.18303} → [inst : DecidableEq β] → (αβ) → Finset αFinset β
image
Prod.swap: {α : Type ?u.18316} → {β : Type ?u.18315} → α × ββ × α
Prod.swap
=
s: Finset α
s
×ˢ
t: Finset β
t
:=
coe_injective: ∀ {α : Type ?u.18417}, Function.Injective toSet
coe_injective
<|

Goals accomplished! 🐙
α: Type u_2

β: Type u_1

γ: Type ?u.18234

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

inst✝: DecidableEq (α × β)

s: Finset α

t: Finset β


↑(image Prod.swap (t ×ˢ s)) = ↑(s ×ˢ t)
α: Type u_2

β: Type u_1

γ: Type ?u.18234

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

inst✝: DecidableEq (α × β)

s: Finset α

t: Finset β


Prod.swap '' t ×ˢ s = s ×ˢ t
α: Type u_2

β: Type u_1

γ: Type ?u.18234

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

inst✝: DecidableEq (α × β)

s: Finset α

t: Finset β


↑(image Prod.swap (t ×ˢ s)) = ↑(s ×ˢ t)

Goals accomplished! 🐙
#align finset.image_swap_product
Finset.image_swap_product: ∀ {α : Type u_2} {β : Type u_1} [inst : DecidableEq (α × β)] (s : Finset α) (t : Finset β), image Prod.swap (t ×ˢ s) = s ×ˢ t
Finset.image_swap_product
theorem
product_eq_biUnion: ∀ [inst : DecidableEq (α × β)] (s : Finset α) (t : Finset β), s ×ˢ t = Finset.biUnion s fun a => image (fun b => (a, b)) t
product_eq_biUnion
[
DecidableEq: Sort ?u.18861 → Sort (max1?u.18861)
DecidableEq
(
α: Type ?u.18836
α
×
β: Type ?u.18839
β
)] (
s: Finset α
s
:
Finset: Type ?u.18872 → Type ?u.18872
Finset
α: Type ?u.18836
α
) (
t: Finset β
t
:
Finset: Type ?u.18875 → Type ?u.18875
Finset
β: Type ?u.18839
β
) :
s: Finset α
s
×ˢ
t: Finset β
t
=
s: Finset α
s
.
biUnion: {α : Type ?u.18912} → {β : Type ?u.18911} → [inst : DecidableEq β] → Finset α(αFinset β) → Finset β
biUnion
fun
a: ?m.18924
a
=>
t: Finset β
t
.
image: {α : Type ?u.18927} → {β : Type ?u.18926} → [inst : DecidableEq β] → (αβ) → Finset αFinset β
image
fun
b: ?m.18996
b
=> (
a: ?m.18924
a
,
b: ?m.18996
b
) :=
ext: ∀ {α : Type ?u.19081} {s₁ s₂ : Finset α}, (∀ (a : α), a s₁ a s₂) → s₁ = s₂
ext
fun
x: α
x
,
y: β
y
⟩ =>

Goals accomplished! 🐙
α: Type u_2

β: Type u_1

γ: Type ?u.18842

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

inst✝: DecidableEq (α × β)

s: Finset α

t: Finset β

x✝: α × β

x: α

y: β


(x, y) s ×ˢ t (x, y) Finset.biUnion s fun a => image (fun b => (a, b)) t

Goals accomplished! 🐙
#align finset.product_eq_bUnion
Finset.product_eq_biUnion: ∀ {α : Type u_2} {β : Type u_1} [inst : DecidableEq (α × β)] (s : Finset α) (t : Finset β), s ×ˢ t = Finset.biUnion s fun a => image (fun b => (a, b)) t
Finset.product_eq_biUnion
theorem
product_eq_biUnion_right: ∀ {α : Type u_2} {β : Type u_1} [inst : DecidableEq (α × β)] (s : Finset α) (t : Finset β), s ×ˢ t = Finset.biUnion t fun b => image (fun a => (a, b)) s
product_eq_biUnion_right
[
DecidableEq: Sort ?u.20077 → Sort (max1?u.20077)
DecidableEq
(
α: Type ?u.20052
α
×
β: Type ?u.20055
β
)] (
s: Finset α
s
:
Finset: Type ?u.20088 → Type ?u.20088
Finset
α: Type ?u.20052
α
) (
t: Finset β
t
:
Finset: Type ?u.20091 → Type ?u.20091
Finset
β: Type ?u.20055
β
) :
s: Finset α
s
×ˢ
t: Finset β
t
=
t: Finset β
t
.
biUnion: {α : Type ?u.20128} → {β : Type ?u.20127} → [inst : DecidableEq β] → Finset α(αFinset β) → Finset β
biUnion
fun
b: ?m.20140
b
=>
s: Finset α
s
.
image: {α : Type ?u.20143} → {β : Type ?u.20142} → [inst : DecidableEq β] → (αβ) → Finset αFinset β
image
fun
a: ?m.20212
a
=> (
a: ?m.20212
a
,
b: ?m.20140
b
) :=
ext: ∀ {α : Type ?u.20297} {s₁ s₂ : Finset α}, (∀ (a : α), a s₁ a s₂) → s₁ = s₂
ext
fun
x: α
x
,
y: β
y
⟩ =>

Goals accomplished! 🐙
α: Type u_2

β: Type u_1

γ: Type ?u.20058

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

inst✝: DecidableEq (α × β)

s: Finset α

t: Finset β

x✝: α × β

x: α

y: β


(x, y) s ×ˢ t (x, y) Finset.biUnion t fun b => image (fun a => (a, b)) s

Goals accomplished! 🐙
#align finset.product_eq_bUnion_right
Finset.product_eq_biUnion_right: ∀ {α : Type u_2} {β : Type u_1} [inst : DecidableEq (α × β)] (s : Finset α) (t : Finset β), s ×ˢ t = Finset.biUnion t fun b => image (fun a => (a, b)) s
Finset.product_eq_biUnion_right
/-- See also `Finset.sup_product_left`. -/ @[simp] theorem
product_biUnion: ∀ {α : Type u_2} {β : Type u_3} {γ : Type u_1} [inst : 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)
product_biUnion
[
DecidableEq: Sort ?u.21232 → Sort (max1?u.21232)
DecidableEq
γ: Type ?u.21213
γ
] (
s: Finset α
s
:
Finset: Type ?u.21241 → Type ?u.21241
Finset
α: Type ?u.21207
α
) (
t: Finset β
t
:
Finset: Type ?u.21244 → Type ?u.21244
Finset
β: Type ?u.21210
β
) (
f: α × βFinset γ
f
:
α: Type ?u.21207
α
×
β: Type ?u.21210
β
Finset: Type ?u.21251 → Type ?u.21251
Finset
γ: Type ?u.21213
γ
) : (
s: Finset α
s
×ˢ
t: Finset β
t
).
biUnion: {α : Type ?u.21288} → {β : Type ?u.21287} → [inst : DecidableEq β] → Finset α(αFinset β) → Finset β
biUnion
f: α × βFinset γ
f
=
s: Finset α
s
.
biUnion: {α : Type ?u.21346} → {β : Type ?u.21345} → [inst : DecidableEq β] → Finset α(αFinset β) → Finset β
biUnion
fun
a: ?m.21358
a
=>
t: Finset β
t
.
biUnion: {α : Type ?u.21361} → {β : Type ?u.21360} → [inst : DecidableEq β] → Finset α(αFinset β) → Finset β
biUnion
fun
b: ?m.21429
b
=>
f: α × βFinset γ
f
(
a: ?m.21358
a
,
b: ?m.21429
b
) :=

Goals accomplished! 🐙
α: Type u_2

β: Type u_3

γ: Type u_1

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

inst✝: 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)
α: Type u_2

β: Type u_3

γ: Type u_1

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

inst✝: 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)
α: Type u_2

β: Type u_3

γ: Type u_1

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

inst✝: 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)
α: Type u_2

β: Type u_3

γ: Type u_1

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

inst✝: DecidableEq γ

s: Finset α

t: Finset β

f: α × βFinset γ


Finset.biUnion (Finset.biUnion s fun a => image (fun b => (a, b)) t) f = Finset.biUnion s fun a => Finset.biUnion t fun b => f (a, b)
α: Type u_2

β: Type u_3

γ: Type u_1

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

inst✝: 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)
α: Type u_2

β: Type u_3

γ: Type u_1

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

inst✝: DecidableEq γ

s: Finset α

t: Finset β

f: α × βFinset γ


(Finset.biUnion s fun a => Finset.biUnion (image (fun b => (a, b)) t) f) = Finset.biUnion s fun a => Finset.biUnion t fun b => f (a, b)
α: Type u_2

β: Type u_3

γ: Type u_1

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

inst✝: 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)

Goals accomplished! 🐙

Goals accomplished! 🐙
#align finset.product_bUnion
Finset.product_biUnion: ∀ {α : Type u_2} {β : Type u_3} {γ : Type u_1} [inst : 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)
Finset.product_biUnion
@[simp] theorem
card_product: ∀ {α : Type u_1} {β : Type u_2} (s : Finset α) (t : Finset β), card (s ×ˢ t) = card s * card t
card_product
(
s: Finset α
s
:
Finset: Type ?u.22967 → Type ?u.22967
Finset
α: Type ?u.22942
α
) (
t: Finset β
t
:
Finset: Type ?u.22970 → Type ?u.22970
Finset
β: Type ?u.22945
β
) :
card: {α : Type ?u.22974} → Finset α
card
(
s: Finset α
s
×ˢ
t: Finset β
t
) =
card: {α : Type ?u.23015} → Finset α
card
s: Finset α
s
*
card: {α : Type ?u.23018} → Finset α
card
t: Finset β
t
:=
Multiset.card_product: ∀ {α : Type ?u.23070} {β : Type ?u.23071} (s : Multiset α) (t : Multiset β), Multiset.card (s ×ˢ t) = Multiset.card s * Multiset.card t
Multiset.card_product
_: Multiset ?m.23072
_
_: Multiset ?m.23073
_
#align finset.card_product
Finset.card_product: ∀ {α : Type u_1} {β : Type u_2} (s : Finset α) (t : Finset β), card (s ×ˢ t) = card s * card t
Finset.card_product
theorem
filter_product: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} (p : αProp) (q : βProp) [inst : DecidablePred p] [inst_1 : DecidablePred q], filter (fun x => p x.fst q x.snd) (s ×ˢ t) = filter p s ×ˢ filter q t
filter_product
(
p: αProp
p
:
α: Type ?u.23156
α
Prop: Type
Prop
) (
q: βProp
q
:
β: Type ?u.23159
β
Prop: Type
Prop
) [
DecidablePred: {α : Sort ?u.23189} → (αProp) → Sort (max1?u.23189)
DecidablePred
p: αProp
p
] [
DecidablePred: {α : Sort ?u.23199} → (αProp) → Sort (max1?u.23199)
DecidablePred
q: βProp
q
] : ((
s: Finset α
s
×ˢ
t: Finset β
t
).
filter: {α : Type ?u.23242} → (p : αProp) → [inst : DecidablePred p] → Finset αFinset α
filter
fun
x: α × β
x
:
α: Type ?u.23156
α
×
β: Type ?u.23159
β
=>
p: αProp
p
x: α × β
x
.
1: {α : Type ?u.23254} → {β : Type ?u.23253} → α × βα
1
q: βProp
q
x: α × β
x
.
2: {α : Type ?u.23260} → {β : Type ?u.23259} → α × ββ
2
) =
s: Finset α
s
.
filter: {α : Type ?u.23325} → (p : αProp) → [inst : DecidablePred p] → Finset αFinset α
filter
p: αProp
p
×ˢ
t: Finset β
t
.
filter: {α : Type ?u.23349} → (p : αProp) → [inst : DecidablePred p] → Finset αFinset α
filter
q: βProp
q
:=

Goals accomplished! 🐙
α: Type u_1

β: Type u_2

γ: Type ?u.23162

s, s': Finset α

t, t': Finset β

a: α

b: β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


filter (fun x => p x.fst q x.snd) (s ×ˢ t) = filter p s ×ˢ filter q t
α: Type u_1

β: Type u_2

γ: Type ?u.23162

s, s': Finset α

t, t': Finset β

a✝: α

b✝: β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β


a.mk
(a, b) filter (fun x => p x.fst q x.snd) (s ×ˢ t) (a, b) filter p s ×ˢ filter q t
α: Type u_1

β: Type u_2

γ: Type ?u.23162

s, s': Finset α

t, t': Finset β

a: α

b: β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


filter (fun x => p x.fst q x.snd) (s ×ˢ t) = filter p s ×ˢ filter q t

Goals accomplished! 🐙
#align finset.filter_product
Finset.filter_product: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} (p : αProp) (q : βProp) [inst : DecidablePred p] [inst_1 : DecidablePred q], filter (fun x => p x.fst q x.snd) (s ×ˢ t) = filter p s ×ˢ filter q t
Finset.filter_product
theorem
filter_product_left: ∀ (p : αProp) [inst : DecidablePred p], filter (fun x => p x.fst) (s ×ˢ t) = filter p s ×ˢ t
filter_product_left
(
p: αProp
p
:
α: Type ?u.28900
α
Prop: Type
Prop
) [
DecidablePred: {α : Sort ?u.28929} → (αProp) → Sort (max1?u.28929)
DecidablePred
p: αProp
p
] : ((
s: Finset α
s
×ˢ
t: Finset β
t
).
filter: {α : Type ?u.28972} → (p : αProp) → [inst : DecidablePred p] → Finset αFinset α
filter
fun
x: α × β
x
:
α: Type ?u.28900
α
×
β: Type ?u.28903
β
=>
p: αProp
p
x: α × β
x
.
1: {α : Type ?u.28984} → {β : Type ?u.28983} → α × βα
1
) =
s: Finset α
s
.
filter: {α : Type ?u.29015} → (p : αProp) → [inst : DecidablePred p] → Finset αFinset α
filter
p: αProp
p
×ˢ
t: Finset β
t
:=

Goals accomplished! 🐙
α: Type u_1

β: Type u_2

γ: Type ?u.28906

s, s': Finset α

t, t': Finset β

a: α

b: β

p: αProp

inst✝: DecidablePred p


filter (fun x => p x.fst) (s ×ˢ t) = filter p s ×ˢ t

Goals accomplished! 🐙
#align finset.filter_product_left
Finset.filter_product_left: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β} (p : αProp) [inst : DecidablePred p], filter (fun x => p x.fst) (s ×ˢ t) = filter p s ×ˢ t
Finset.filter_product_left
theorem
filter_product_right: ∀ (q : βProp) [inst : DecidablePred q], filter (fun x => q x.snd) (s ×ˢ t) = s ×ˢ filter q t
filter_product_right
(
q: βProp
q
:
β: Type ?u.45775
β
Prop: Type
Prop
) [
DecidablePred: {α : Sort ?u.45801} → (αProp) → Sort (max1?u.45801)
DecidablePred
q: βProp
q
] : ((
s: Finset α
s
×ˢ
t: Finset β
t
).
filter: {α : Type ?u.45844} → (p : αProp) → [inst : DecidablePred p] → Finset αFinset α
filter
fun
x: α × β
x
:
α: Type ?u.45772
α
×
β: Type ?u.45775
β
=>
q: βProp
q
x: α × β
x
.
2: {α : Type ?u.45856} → {β : Type ?u.45855} → α × ββ
2
) =
s: Finset α
s
×ˢ
t: Finset β
t
.
filter: {α : Type ?u.45887} → (p : αProp) → [inst : DecidablePred p] → Finset αFinset α
filter
q: βProp
q
:=

Goals accomplished! 🐙
α: Type u_2

β: Type u_1

γ: Type ?u.45778

s, s': Finset α

t, t': Finset β

a: α

b: β

q: βProp

inst✝: DecidablePred q


filter (fun x => q x.snd) (s ×ˢ t) = s ×ˢ filter q t

Goals accomplished! 🐙
#align finset.filter_product_right
Finset.filter_product_right: ∀ {α : Type u_2} {β : Type u_1} {s : Finset α} {t : Finset β} (q : βProp) [inst : DecidablePred q], filter (fun x => q x.snd) (s ×ˢ t) = s ×ˢ filter q t
Finset.filter_product_right
theorem
filter_product_card: ∀ (s : Finset α) (t : Finset β) (p : αProp) (q : βProp) [inst : DecidablePred p] [inst_1 : DecidablePred q], card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter p s) * card (filter q t) + card (filter (fun x => ¬p x) s) * card (filter (fun x => ¬q x) t)
filter_product_card
(
s: Finset α
s
:
Finset: Type ?u.63141 → Type ?u.63141
Finset
α: Type ?u.63116
α
) (
t: Finset β
t
:
Finset: Type ?u.63144 → Type ?u.63144
Finset
β: Type ?u.63119
β
) (
p: αProp
p
:
α: Type ?u.63116
α
Prop: Type
Prop
) (
q: βProp
q
:
β: Type ?u.63119
β
Prop: Type
Prop
) [
DecidablePred: {α : Sort ?u.63155} → (αProp) → Sort (max1?u.63155)
DecidablePred
p: αProp
p
] [
DecidablePred: {α : Sort ?u.63165} → (αProp) → Sort (max1?u.63165)
DecidablePred
q: βProp
q
] : ((
s: Finset α
s
×ˢ
t: Finset β
t
).
filter: {α : Type ?u.63208} → (p : αProp) → [inst : DecidablePred p] → Finset αFinset α
filter
fun
x: α × β
x
:
α: Type ?u.63116
α
×
β: Type ?u.63119
β
=> (
p: αProp
p
x: α × β
x
.
1: {α : Type ?u.63221} → {β : Type ?u.63220} → α × βα
1
) = (
q: βProp
q
x: α × β
x
.
2: {α : Type ?u.63227} → {β : Type ?u.63226} → α × ββ
2
)).
card: {α : Type ?u.63350} → Finset α
card
= (
s: Finset α
s
.
filter: {α : Type ?u.63361} → (p : αProp) → [inst : DecidablePred p] → Finset αFinset α
filter
p: αProp
p
).
card: {α : Type ?u.63385} → Finset α
card
* (
t: Finset β
t
.
filter: {α : Type ?u.63389} → (p : αProp) → [inst : DecidablePred p] → Finset αFinset α
filter
q: βProp
q
).
card: {α : Type ?u.63411} → Finset α
card
+ (
s: Finset α
s
.
filter: {α : Type ?u.63418} → (p : αProp) → [inst : DecidablePred p] → Finset αFinset α
filter
p: αProp
p
·)).
card: {α : Type ?u.63468} → Finset α
card
* (
t: Finset β
t
.
filter: {α : Type ?u.63472} → (p : αProp) → [inst : DecidablePred p] → Finset αFinset α
filter
q: βProp
q
·)).
card: {α : Type ?u.63518} → Finset α
card
:=

Goals accomplished! 🐙
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter p s) * card (filter q t) + card (filter (fun x => ¬p x) s) * card (filter (fun x => ¬q x) t)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter p s) * card (filter q t) + card (filter (fun x => ¬p x) s) * card (filter (fun x => ¬q x) t)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter p s) * card (filter q t) + card (filter (fun x => ¬p x) s) * card (filter (fun x => ¬q x) t)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter p s ×ˢ filter q t) + card (filter (fun x => ¬p x) s) * card (filter (fun x => ¬q x) t)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter p s) * card (filter q t) + card (filter (fun x => ¬p x) s) * card (filter (fun x => ¬q x) t)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter p s ×ˢ filter q t) + card (filter (fun x => ¬p x) s ×ˢ filter (fun x => ¬q x) t)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter p s) * card (filter q t) + card (filter (fun x => ¬p x) s) * card (filter (fun x => ¬q x) t)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter (fun x => p x.fst q x.snd) (s ×ˢ t)) + card (filter (fun x => ¬p x) s ×ˢ filter (fun x => ¬q x) t)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter p s) * card (filter q t) + card (filter (fun x => ¬p x) s) * card (filter (fun x => ¬q x) t)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter (fun x => p x.fst q x.snd) (s ×ˢ t)) + card (filter (fun x => ¬p x.fst ¬q x.snd) (s ×ˢ t))
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter p s) * card (filter q t) + card (filter (fun x => ¬p x) s) * card (filter (fun x => ¬q x) t)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter (fun x => p x.fst q x.snd) (s ×ˢ t) filter (fun x => ¬p x.fst ¬q x.snd) (s ×ˢ t))
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


_root_.Disjoint (filter (fun x => p x.fst q x.snd) (s ×ˢ t)) (filter (fun x => ¬p x.fst ¬q x.snd) (s ×ˢ t))
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter (fun x => p x.fst q x.snd) (s ×ˢ t) filter (fun x => ¬p x.fst ¬q x.snd) (s ×ˢ t))
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


_root_.Disjoint (filter (fun x => p x.fst q x.snd) (s ×ˢ t)) (filter (fun x => ¬p x.fst ¬q x.snd) (s ×ˢ t))
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter p s) * card (filter q t) + card (filter (fun x => ¬p x) s) * card (filter (fun x => ¬q x) t)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter (fun x => p x.fst q x.snd) (s ×ˢ t) filter (fun x => ¬p x.fst ¬q x.snd) (s ×ˢ t))
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter (fun x => p x.fst q x.snd) (s ×ˢ t) filter (fun x => ¬p x.fst ¬q x.snd) (s ×ˢ t))
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


_root_.Disjoint (filter (fun x => p x.fst q x.snd) (s ×ˢ t)) (filter (fun x => ¬p x.fst ¬q x.snd) (s ×ˢ t))
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


h
filter (fun x => p x.fst = q x.snd) (s ×ˢ t) = filter (fun x => p x.fst q x.snd) (s ×ˢ t) filter (fun x => ¬p x.fst ¬q x.snd) (s ×ˢ t)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter (fun x => p x.fst q x.snd) (s ×ˢ t) filter (fun x => ¬p x.fst ¬q x.snd) (s ×ˢ t))
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β


h.a.mk
(a, b) filter (fun x => p x.fst = q x.snd) (s ×ˢ t) (a, b) filter (fun x => p x.fst q x.snd) (s ×ˢ t) filter (fun x => ¬p x.fst ¬q x.snd) (s ×ˢ t)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter (fun x => p x.fst q x.snd) (s ×ˢ t) filter (fun x => ¬p x.fst ¬q x.snd) (s ×ˢ t))
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β


h.a.mk
(a s b t) p a = q b (a s b t) (p a q b ¬p a ¬q b)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter (fun x => p x.fst q x.snd) (s ×ˢ t) filter (fun x => ¬p x.fst ¬q x.snd) (s ×ˢ t))
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β


h.a.mk.mp
(a s b t) p a = q b(a s b t) (p a q b ¬p a ¬q b)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β


h.a.mk.mpr
(a s b t) (p a q b ¬p a ¬q b)(a s b t) p a = q b
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β


h.a.mk
(a s b t) p a = q b (a s b t) (p a q b ¬p a ¬q b)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β


h.a.mk.mp
(a s b t) p a = q b(a s b t) (p a q b ¬p a ¬q b)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β


h.a.mk.mpr
(a s b t) (p a q b ¬p a ¬q b)(a s b t) p a = q b
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β


h.a.mk
(a s b t) p a = q b (a s b t) (p a q b ¬p a ¬q b)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β

h: (a s b t) p a = q b


h.a.mk.mp
(a s b t) (p a q b ¬p a ¬q b)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β


h.a.mk
(a s b t) p a = q b (a s b t) (p a q b ¬p a ¬q b)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β

h: (a s b t) p a = q b


h.a.mk.mp
(a s b t) (p a q b ¬p a ¬q b)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β

h: (a s b t) (p a q b ¬p a ¬q b)


h.a.mk.mpr
(a s b t) p a = q b
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β


h.a.mk
(a s b t) p a = q b (a s b t) (p a q b ¬p a ¬q b)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β

h: (a s b t) (p a q b ¬p a ¬q b)


h.a.mk.mpr
p a = q b
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter (fun x => p x.fst q x.snd) (s ×ˢ t) filter (fun x => ¬p x.fst ¬q x.snd) (s ×ˢ t))
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β

h: (a s b t) p a = q b


h.a.mk.mp
p a q b ¬p a ¬q b
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β

h: (a s b t) p a = q b


h.a.mk.mp
p a q b ¬p a ¬q b
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β

h: (a s b t) (p a q b ¬p a ¬q b)


h.a.mk.mpr
p a = q b

Goals accomplished! 🐙
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter (fun x => p x.fst q x.snd) (s ×ˢ t) filter (fun x => ¬p x.fst ¬q x.snd) (s ×ˢ t))
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β

h: (a s b t) (p a q b ¬p a ¬q b)


h.a.mk.mpr
p a = q b
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β

h: (a s b t) (p a q b ¬p a ¬q b)


h.a.mk.mpr
p a = q b
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β


h.a.mk.mpr
(a s b t) (p a q b ¬p a ¬q b)p a = q b
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β

h: (a s b t) (p a q b ¬p a ¬q b)


h.a.mk.mpr
p a = q b
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β


h.a.mk.mpr
a sb tp a q b ¬p a ¬q bp a = q b
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β

h: (a s b t) (p a q b ¬p a ¬q b)


h.a.mk.mpr
p a = q b
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝²: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β

a✝¹: a s

a✝: b t

h✝: p a q b


h.a.mk.mpr.inl
p a = q b
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝²: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β

a✝¹: a s

a✝: b t

h✝: ¬p a ¬q b


h.a.mk.mpr.inr
p a = q b
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β


h.a.mk.mpr
a sb tp a q b ¬p a ¬q bp a = q b
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝²: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β

a✝¹: a s

a✝: b t

h✝: p a q b


h.a.mk.mpr.inl
p a = q b
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝²: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β

a✝¹: a s

a✝: b t

h✝: ¬p a ¬q b


h.a.mk.mpr.inr
p a = q b
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a✝: α

b✝: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q

a: α

b: β


h.a.mk.mpr
a sb tp a q b ¬p a ¬q bp a = q b

Goals accomplished! 🐙
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter p s) * card (filter q t) + card (filter (fun x => ¬p x) s) * card (filter (fun x => ¬q x) t)
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


_root_.Disjoint (filter (fun x => p x.fst q x.snd) (s ×ˢ t)) (filter (fun x => ¬p x.fst ¬q x.snd) (s ×ˢ t))
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


_root_.Disjoint (filter (fun x => p x.fst q x.snd) (s ×ˢ t)) (filter (fun x => ¬p x.fst ¬q x.snd) (s ×ˢ t))
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


h
_root_.Disjoint (fun x => p x.fst q x.snd) fun x => ¬p x.fst ¬q x.snd
α: Type u_1

β: Type u_2

γ: Type ?u.63122

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β

p: αProp

q: βProp

inst✝¹: DecidablePred p

inst✝: DecidablePred q


_root_.Disjoint (filter (fun x => p x.fst q x.snd) (s ×ˢ t)) (filter (fun x => ¬p x.fst ¬q x.snd) (s ×ˢ t))

Goals accomplished! 🐙
#align finset.filter_product_card
Finset.filter_product_card: ∀ {α : Type u_1} {β : Type u_2} (s : Finset α) (t : Finset β) (p : αProp) (q : βProp) [inst : DecidablePred p] [inst_1 : DecidablePred q], card (filter (fun x => p x.fst = q x.snd) (s ×ˢ t)) = card (filter p s) * card (filter q t) + card (filter (fun x => ¬p x) s) * card (filter (fun x => ¬q x) t)
Finset.filter_product_card
theorem
empty_product: ∀ (t : Finset β), ×ˢ t =
empty_product
(
t: Finset β
t
:
Finset: Type ?u.66614 → Type ?u.66614
Finset
β: Type ?u.66592
β
) : (
: ?m.66624
:
Finset: Type ?u.66622 → Type ?u.66622
Finset
α: Type ?u.66589
α
) ×ˢ
t: Finset β
t
=
: ?m.66698
:=
rfl: ∀ {α : Sort ?u.66781} {a : α}, a = a
rfl
#align finset.empty_product
Finset.empty_product: ∀ {α : Type u_2} {β : Type u_1} (t : Finset β), ×ˢ t =
Finset.empty_product
theorem
product_empty: ∀ {α : Type u_1} {β : Type u_2} (s : Finset α), s ×ˢ =
product_empty
(
s: Finset α
s
:
Finset: Type ?u.66850 → Type ?u.66850
Finset
α: Type ?u.66825
α
) :
s: Finset α
s
×ˢ (
: ?m.66860
:
Finset: Type ?u.66858 → Type ?u.66858
Finset
β: Type ?u.66828
β
) =
: ?m.66934
:=
eq_empty_of_forall_not_mem: ∀ {α : Type ?u.67017} {s : Finset α}, (∀ (x : α), ¬x s) → s =
eq_empty_of_forall_not_mem
fun
_: ?m.67025
_
h: ?m.67028
h
=>
not_mem_empty: ∀ {α : Type ?u.67030} (a : α), ¬a
not_mem_empty
_: ?m.67031
_
(
Finset.mem_product: ∀ {α : Type ?u.67033} {β : Type ?u.67034} {s : Finset α} {t : Finset β} {p : α × β}, p s ×ˢ t p.fst s p.snd t
Finset.mem_product
.
1: ∀ {a b : Prop}, (a b) → ab
1
h: ?m.67028
h
).
2: ∀ {a b : Prop}, a bb
2
#align finset.product_empty
Finset.product_empty: ∀ {α : Type u_1} {β : Type u_2} (s : Finset α), s ×ˢ =
Finset.product_empty
theorem
Nonempty.product: Finset.Nonempty sFinset.Nonempty tFinset.Nonempty (s ×ˢ t)
Nonempty.product
(hs :
s: Finset α
s
.
Nonempty: {α : Type ?u.67111} → Finset αProp
Nonempty
) (ht :
t: Finset β
t
.
Nonempty: {α : Type ?u.67118} → Finset αProp
Nonempty
) : (
s: Finset α
s
×ˢ
t: Finset β
t
).
Nonempty: {α : Type ?u.67155} → Finset αProp
Nonempty
:= let
x: α
x
,
hx: x s
hx
⟩ := hs let
y: β
y
,
hy: y t
hy
⟩ := ht ⟨(
x: α
x
,
y: β
y
),
mem_product: ∀ {α : Type ?u.67247} {β : Type ?u.67248} {s : Finset α} {t : Finset β} {p : α × β}, p s ×ˢ t p.fst s p.snd t
mem_product
.
2: ∀ {a b : Prop}, (a b) → ba
2
hx: x s
hx
,
hy: y t
hy
⟩⟩ #align finset.nonempty.product
Finset.Nonempty.product: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β}, Finset.Nonempty sFinset.Nonempty tFinset.Nonempty (s ×ˢ t)
Finset.Nonempty.product
theorem
Nonempty.fst: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β}, Finset.Nonempty (s ×ˢ t)Finset.Nonempty s
Nonempty.fst
(h : (
s: Finset α
s
×ˢ
t: Finset β
t
).
Nonempty: {α : Type ?u.67477} → Finset αProp
Nonempty
) :
s: Finset α
s
.
Nonempty: {α : Type ?u.67484} → Finset αProp
Nonempty
:= let
xy: α × β
xy
,
hxy: xy s ×ˢ t
hxy
⟩ := h
xy: α × β
xy
.
1: {α : Type ?u.67542} → {β : Type ?u.67541} → α × βα
1
, (
mem_product: ∀ {α : Type ?u.67547} {β : Type ?u.67548} {s : Finset α} {t : Finset β} {p : α × β}, p s ×ˢ t p.fst s p.snd t
mem_product
.
1: ∀ {a b : Prop}, (a b) → ab
1
hxy: xy s ×ˢ t
hxy
).
1: ∀ {a b : Prop}, a ba
1
#align finset.nonempty.fst
Finset.Nonempty.fst: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β}, Finset.Nonempty (s ×ˢ t)Finset.Nonempty s
Finset.Nonempty.fst
theorem
Nonempty.snd: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β}, Finset.Nonempty (s ×ˢ t)Finset.Nonempty t
Nonempty.snd
(h : (
s: Finset α
s
×ˢ
t: Finset β
t
).
Nonempty: {α : Type ?u.67717} → Finset αProp
Nonempty
) :
t: Finset β
t
.
Nonempty: {α : Type ?u.67724} → Finset αProp
Nonempty
:= let
xy: α × β
xy
,
hxy: xy s ×ˢ t
hxy
⟩ := h
xy: α × β
xy
.
2: {α : Type ?u.67782} → {β : Type ?u.67781} → α × ββ
2
, (
mem_product: ∀ {α : Type ?u.67787} {β : Type ?u.67788} {s : Finset α} {t : Finset β} {p : α × β}, p s ×ˢ t p.fst s p.snd t
mem_product
.
1: ∀ {a b : Prop}, (a b) → ab
1
hxy: xy s ×ˢ t
hxy
).
2: ∀ {a b : Prop}, a bb
2
#align finset.nonempty.snd
Finset.Nonempty.snd: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β}, Finset.Nonempty (s ×ˢ t)Finset.Nonempty t
Finset.Nonempty.snd
@[simp] theorem
nonempty_product: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β}, Finset.Nonempty (s ×ˢ t) Finset.Nonempty s Finset.Nonempty t
nonempty_product
: (
s: Finset α
s
×ˢ
t: Finset β
t
).
Nonempty: {α : Type ?u.67947} → Finset αProp
Nonempty
s: Finset α
s
.
Nonempty: {α : Type ?u.67952} → Finset αProp
Nonempty
t: Finset β
t
.
Nonempty: {α : Type ?u.67956} → Finset αProp
Nonempty
:= ⟨fun
h: ?m.67970
h
=> ⟨
h: ?m.67970
h
.
fst: ∀ {α : Type ?u.67980} {β : Type ?u.67981} {s : Finset α} {t : Finset β}, Finset.Nonempty (s ×ˢ t)Finset.Nonempty s
fst
,
h: ?m.67970
h
.
snd: ∀ {α : Type ?u.68010} {β : Type ?u.68011} {s : Finset α} {t : Finset β}, Finset.Nonempty (s ×ˢ t)Finset.Nonempty t
snd
⟩, fun
h: ?m.68028
h
=>
h: ?m.68028
h
.
1: ∀ {a b : Prop}, a ba
1
.
product: ∀ {α : Type ?u.68032} {β : Type ?u.68033} {s : Finset α} {t : Finset β}, Finset.Nonempty sFinset.Nonempty tFinset.Nonempty (s ×ˢ t)
product
h: ?m.68028
h
.
2: ∀ {a b : Prop}, a bb
2
#align finset.nonempty_product
Finset.nonempty_product: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β}, Finset.Nonempty (s ×ˢ t) Finset.Nonempty s Finset.Nonempty t
Finset.nonempty_product
@[simp] theorem
product_eq_empty: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β}, s ×ˢ t = s = t =
product_eq_empty
{
s: Finset α
s
:
Finset: Type ?u.68110 → Type ?u.68110
Finset
α: Type ?u.68085
α
} {
t: Finset β
t
:
Finset: Type ?u.68113 → Type ?u.68113
Finset
β: Type ?u.68088
β
} :
s: Finset α
s
×ˢ
t: Finset β
t
=
: ?m.68150
s: Finset α
s
=
: ?m.68233
t: Finset β
t
=
: ?m.68314
:=

Goals accomplished! 🐙
α: Type u_1

β: Type u_2

γ: Type ?u.68091

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β


s ×ˢ t = s = t =
α: Type u_1

β: Type u_2

γ: Type ?u.68091

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β


s ×ˢ t = s = t =
α: Type u_1

β: Type u_2

γ: Type ?u.68091

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β


α: Type u_1

β: Type u_2

γ: Type ?u.68091

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β


s ×ˢ t = s = t =
α: Type u_1

β: Type u_2

γ: Type ?u.68091

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β


α: Type u_1

β: Type u_2

γ: Type ?u.68091

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β


s ×ˢ t = s = t =
α: Type u_1

β: Type u_2

γ: Type ?u.68091

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β


α: Type u_1

β: Type u_2

γ: Type ?u.68091

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β


s ×ˢ t = s = t =
α: Type u_1

β: Type u_2

γ: Type ?u.68091

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β


α: Type u_1

β: Type u_2

γ: Type ?u.68091

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β


s ×ˢ t = s = t =
α: Type u_1

β: Type u_2

γ: Type ?u.68091

s✝, s': Finset α

t✝, t': Finset β

a: α

b: β

s: Finset α

t: Finset β


s = t = s = t =

Goals accomplished! 🐙
#align finset.product_eq_empty
Finset.product_eq_empty: ∀ {α : Type u_1} {β : Type u_2} {s : Finset α} {t : Finset β}, s ×ˢ t = s = t =
Finset.product_eq_empty
@[simp] theorem
singleton_product: ∀ {a : α}, {a} ×ˢ t = map { toFun := Prod.mk a, inj' := (_ : Function.Injective (Prod.mk a)) } t
singleton_product
{
a: α
a
:
α: Type ?u.68526
α
} : ({
a: α
a
} :
Finset: Type ?u.68558 → Type ?u.68558
Finset
α: Type ?u.68526
α
) ×ˢ
t: Finset β
t
=
t: Finset β
t
.
map: {α : Type ?u.68613} → {β : Type ?u.68612} → (α β) → Finset αFinset β
map
Prod.mk: {α : Type ?u.68631} → {β : Type ?u.68630} → αβα × β
Prod.mk
a: α
a
,
Prod.mk.inj_left: ∀ {α : Type ?u.68641} {β : Type ?u.68642} (a : α), Function.Injective (Prod.mk a)
Prod.mk.inj_left
_: ?m.68643
_
⟩ :=

Goals accomplished! 🐙
α: Type u_1

β: Type u_2

γ: Type ?u.68532

s, s': Finset α

t, t': Finset β

a✝: α

b: β

a: α


{a} ×ˢ t = map { toFun := Prod.mk a, inj' := (_ : Function.Injective (Prod.mk a)) } t
α: Type u_1

β: Type u_2

γ: Type ?u.68532

s, s': Finset α

t, t': Finset β

a✝: α

b: β

a, x: α

y: β


a.mk
(x, y) {a} ×ˢ t (x, y) map { toFun := Prod.mk a, inj' := (_ : Function.Injective (Prod.mk a)) } t
α: Type u_1

β: Type u_2

γ: Type ?u.68532

s, s': Finset α

t, t': Finset β

a✝: α

b: β

a: α


{a} ×ˢ t = map { toFun := Prod.mk a, inj' := (_ : Function.Injective (Prod.mk a)) } t

Goals accomplished! 🐙
#align finset.singleton_product
Finset.singleton_product: ∀ {α : Type u_1} {β : Type u_2} {t : Finset β} {a : α}, {a} ×ˢ t = map { toFun := Prod.mk a, inj' := (_ : Function.Injective (Prod.mk a)) } t
Finset.singleton_product
@[simp] theorem
product_singleton: ∀ {α : Type u_2} {β : Type u_1} {s : Finset α} {b : β}, s ×ˢ {b} = map { toFun := fun i => (i, b), inj' := (_ : Function.Injective fun a => (a, b)) } s
product_singleton
{
b: β
b
:
β: Type ?u.70203
β
} :
s: Finset α
s
×ˢ {
b: β
b
} =
s: Finset α
s
.
map: {α : Type ?u.70337} → {β : Type ?u.70336} → (α β) → Finset αFinset β
map
fun
i: ?m.70355
i
=> (
i: ?m.70355
i
,
b: β
b
),
Prod.mk.inj_right: ∀ {α : Type ?u.70367} {β : Type ?u.70368} (b : β), Function.Injective fun a => (a, b)
Prod.mk.inj_right
_: ?m.70370
_
⟩ :=

Goals accomplished! 🐙
α: Type u_2

β: Type u_1

γ: Type ?u.70206

s, s': Finset α

t, t': Finset β

a: α

b✝, b: β


s ×ˢ {b} = map { toFun := fun i => (i, b), inj' := (_ : Function.Injective fun a => (a, b)) } s
α: Type u_2

β: Type u_1

γ: Type ?u.70206

s, s': Finset α

t, t': Finset β

a: α

b✝, b: β

x: α

y: β


a.mk
(x, y) s ×ˢ {b} (x, y) map { toFun := fun i => (i, b), inj' := (_ : Function.Injective fun a => (a, b)) } s
α: Type u_2

β: Type u_1

γ: Type ?u.70206

s, s': Finset α

t, t': Finset β

a: α

b✝, b: β


s ×ˢ {b} = map { toFun := fun i => (i, b), inj' := (_ : Function.Injective fun a => (a, b)) } s

Goals accomplished! 🐙
#align finset.product_singleton
Finset.product_singleton: ∀ {α : Type u_2} {β : Type u_1} {s : Finset α} {b : β}, s ×ˢ {b} = map { toFun := fun i => (i, b), inj' := (_ : Function.Injective fun a => (a, b)) } s
Finset.product_singleton
theorem
singleton_product_singleton: ∀ {a : α} {b : β}, {a} ×ˢ {b} = {(a, b)}
singleton_product_singleton
{
a: α
a
:
α: Type ?u.71749
α
} {
b: β
b
:
β: Type ?u.71752
β
} : ({
a: α
a
} ×ˢ {
b: β
b
} :
Finset: Type ?u.71780 → Type ?u.71780
Finset
_: Type ?u.71780
_
) = {(
a: α
a
,
b: β
b
)} :=

Goals accomplished! 🐙
α: Type u_1

β: Type u_2

γ: Type ?u.71755

s, s': Finset α

t, t': Finset β

a✝: α

b✝: β

a: α

b: β


{a} ×ˢ {b} = {(a, b)}

Goals accomplished! 🐙
#align finset.singleton_product_singleton
Finset.singleton_product_singleton: ∀ {α : Type u_1} {β : Type u_2} {a : α} {b : β}, {a} ×ˢ {b} = {(a, b)}
Finset.singleton_product_singleton
@[simp] theorem
union_product: ∀ {α : Type u_1} {β : Type u_2} {s s' : Finset α} {t : Finset β} [inst : DecidableEq α] [inst_1 : DecidableEq β], (s s') ×ˢ t = s ×ˢ t s' ×ˢ t
union_product
[
DecidableEq: Sort ?u.72412 → Sort (max1?u.72412)
DecidableEq
α: Type ?u.72387
α
] [
DecidableEq: Sort ?u.72421 → Sort (max1?u.72421)
DecidableEq
β: Type ?u.72390
β
] : (
s: Finset α
s
s': Finset α
s'
) ×ˢ
t: Finset β
t
=
s: Finset α
s
×ˢ
t: Finset β
t
s': Finset α
s'
×ˢ
t: Finset β
t
:=

Goals accomplished! 🐙
α: Type u_1

β: Type u_2

γ: Type ?u.72393

s, s': Finset α

t, t': Finset β

a: α

b: β

inst✝¹: DecidableEq α

inst✝: DecidableEq β


(s s') ×ˢ t = s ×ˢ t s' ×ˢ t
α: Type u_1

β: Type u_2

γ: Type ?u.72393

s, s': Finset α

t, t': Finset β

a: α

b: β

inst✝¹: DecidableEq α

inst✝: DecidableEq β

x: α

y: β


a.mk
(x, y) (s s') ×ˢ t (x, y) s ×ˢ t s' ×ˢ t
α: Type u_1

β: Type u_2

γ: Type ?u.72393

s, s': Finset α

t, t': Finset β

a: α

b: β

inst✝¹: DecidableEq α

inst✝: DecidableEq β


(s s') ×ˢ t = s ×ˢ t s' ×ˢ t