Theorem: Sym2.two_mul_card_image_offDiag
File: Mathlib/Data/Sym/Card.lean

Proof steps:
state_before: α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
⊢ 2 * (image Sym2.mk s.offDiag).card = s.offDiag.card
state_after: α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
⊢ ∀ (x y : α), s(x, y) ∈ image Sym2.mk s.offDiag → (filter (fun x_1 => Sym2.mk x_1 = s(x, y)) s.offDiag).card = 2
tactic: rw [card_eq_sum_card_image (Sym2.mk : α × α → _), sum_const_nat (Sym2.ind _), mul_comm]
state_before: α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
⊢ ∀ (x y : α), s(x, y) ∈ image Sym2.mk s.offDiag → (filter (fun x_1 => Sym2.mk x_1 = s(x, y)) s.offDiag).card = 2
state_after: α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
x y : α
hxy : s(x, y) ∈ image Sym2.mk s.offDiag
⊢ (filter (fun x_1 => Sym2.mk x_1 = s(x, y)) s.offDiag).card = 2
tactic: rintro x y hxy
state_before: α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
x y : α
hxy : s(x, y) ∈ image Sym2.mk s.offDiag
⊢ (filter (fun x_1 => Sym2.mk x_1 = s(x, y)) s.offDiag).card = 2
state_after: α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
x y : α
hxy : ∃ a, (a.1 ∈ s ∧ a.2 ∈ s ∧ a.1 ≠ a.2) ∧ Sym2.mk a = s(x, y)
⊢ (filter (fun x_1 => Sym2.mk x_1 = s(x, y)) s.offDiag).card = 2
tactic: simp_rw [mem_image, mem_offDiag] at hxy
state_before: α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
x y : α
hxy : ∃ a, (a.1 ∈ s ∧ a.2 ∈ s ∧ a.1 ≠ a.2) ∧ Sym2.mk a = s(x, y)
⊢ (filter (fun x_1 => Sym2.mk x_1 = s(x, y)) s.offDiag).card = 2
state_after: case intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
x y : α
a : α × α
h : Sym2.mk a = s(x, y)
ha₁ : a.1 ∈ s
ha₂ : a.2 ∈ s
ha : a.1 ≠ a.2
⊢ (filter (fun x_1 => Sym2.mk x_1 = s(x, y)) s.offDiag).card = 2
tactic: obtain ⟨a, ⟨ha₁, ha₂, ha⟩, h⟩ := hxy
state_before: case intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
x y : α
a : α × α
h : Sym2.mk a = s(x, y)
ha₁ : a.1 ∈ s
ha₂ : a.2 ∈ s
ha : a.1 ≠ a.2
⊢ (filter (fun x_1 => Sym2.mk x_1 = s(x, y)) s.offDiag).card = 2
state_after: case intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
x y : α
a : α × α
ha₁ : a.1 ∈ s
ha₂ : a.2 ∈ s
ha : a.1 ≠ a.2
h : Rel α a (x, y)
⊢ (filter (fun x_1 => Sym2.mk x_1 = s(x, y)) s.offDiag).card = 2
tactic: replace h := Sym2.eq.1 h
state_before: case intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
x y : α
a : α × α
ha₁ : a.1 ∈ s
ha₂ : a.2 ∈ s
ha : a.1 ≠ a.2
h : Rel α a (x, y)
⊢ (filter (fun x_1 => Sym2.mk x_1 = s(x, y)) s.offDiag).card = 2
state_after: case intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
x y : α
a : α × α
ha₁ : a.1 ∈ s
ha₂ : a.2 ∈ s
ha : a.1 ≠ a.2
h : Rel α a (x, y)
hx : x ∈ s
hy : y ∈ s
hxy : x ≠ y
⊢ (filter (fun x_1 => Sym2.mk x_1 = s(x, y)) s.offDiag).card = 2
tactic: obtain ⟨hx, hy, hxy⟩ : x ∈ s ∧ y ∈ s ∧ x ≠ y := by
    cases h <;> refine ⟨‹_›, ‹_›, ?_⟩ <;> [exact ha; exact ha.symm]
state_before: case intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
x y : α
a : α × α
ha₁ : a.1 ∈ s
ha₂ : a.2 ∈ s
ha : a.1 ≠ a.2
h : Rel α a (x, y)
hx : x ∈ s
hy : y ∈ s
hxy : x ≠ y
⊢ (filter (fun x_1 => Sym2.mk x_1 = s(x, y)) s.offDiag).card = 2
state_after: case intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
x y : α
a : α × α
ha₁ : a.1 ∈ s
ha₂ : a.2 ∈ s
ha : a.1 ≠ a.2
h : Rel α a (x, y)
hx : x ∈ s
hy : y ∈ s
hxy : x ≠ y
hxy' : y ≠ x
⊢ (filter (fun x_1 => Sym2.mk x_1 = s(x, y)) s.offDiag).card = 2
tactic: have hxy' : y ≠ x := hxy.symm
state_before: case intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
x y : α
a : α × α
ha₁ : a.1 ∈ s
ha₂ : a.2 ∈ s
ha : a.1 ≠ a.2
h : Rel α a (x, y)
hx : x ∈ s
hy : y ∈ s
hxy : x ≠ y
hxy' : y ≠ x
⊢ (filter (fun x_1 => Sym2.mk x_1 = s(x, y)) s.offDiag).card = 2
state_after: case intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
x y : α
a : α × α
ha₁ : a.1 ∈ s
ha₂ : a.2 ∈ s
ha : a.1 ≠ a.2
h : Rel α a (x, y)
hx : x ∈ s
hy : y ∈ s
hxy : x ≠ y
hxy' : y ≠ x
this : filter (fun z => Sym2.mk z = s(x, y)) s.offDiag = {(x, y), (y, x)}
⊢ (filter (fun x_1 => Sym2.mk x_1 = s(x, y)) s.offDiag).card = 2
tactic: have : (s.offDiag.filter fun z => Sym2.mk z = s(x, y)) = ({(x, y), (y, x)} : Finset _) := by
    ext ⟨x₁, y₁⟩
    rw [mem_filter, mem_insert, mem_singleton, Sym2.eq_iff, Prod.mk.inj_iff, Prod.mk.inj_iff,
      and_iff_right_iff_imp]
    -- `hxy'` is used in `exact`
    rintro (⟨rfl, rfl⟩ | ⟨rfl, rfl⟩) <;> rw [mem_offDiag] <;> exact ⟨‹_›, ‹_›, ‹_›⟩
state_before: case intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
x y : α
a : α × α
ha₁ : a.1 ∈ s
ha₂ : a.2 ∈ s
ha : a.1 ≠ a.2
h : Rel α a (x, y)
hx : x ∈ s
hy : y ∈ s
hxy : x ≠ y
hxy' : y ≠ x
this : filter (fun z => Sym2.mk z = s(x, y)) s.offDiag = {(x, y), (y, x)}
⊢ (filter (fun x_1 => Sym2.mk x_1 = s(x, y)) s.offDiag).card = 2
state_after: case intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
x y : α
a : α × α
ha₁ : a.1 ∈ s
ha₂ : a.2 ∈ s
ha : a.1 ≠ a.2
h : Rel α a (x, y)
hx : x ∈ s
hy : y ∈ s
hxy : x ≠ y
hxy' : y ≠ x
this : filter (fun z => Sym2.mk z = s(x, y)) s.offDiag = {(x, y), (y, x)}
⊢ (x, y) ∉ {(y, x)}
tactic: rw [this, card_insert_of_not_mem, card_singleton]
state_before: case intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
x y : α
a : α × α
ha₁ : a.1 ∈ s
ha₂ : a.2 ∈ s
ha : a.1 ≠ a.2
h : Rel α a (x, y)
hx : x ∈ s
hy : y ∈ s
hxy : x ≠ y
hxy' : y ≠ x
this : filter (fun z => Sym2.mk z = s(x, y)) s.offDiag = {(x, y), (y, x)}
⊢ (x, y) ∉ {(y, x)}
state_after: case intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
x y : α
a : α × α
ha₁ : a.1 ∈ s
ha₂ : a.2 ∈ s
ha : a.1 ≠ a.2
h : Rel α a (x, y)
hx : x ∈ s
hy : y ∈ s
hxy : x ≠ y
hxy' : y ≠ x
this : filter (fun z => Sym2.mk z = s(x, y)) s.offDiag = {(x, y), (y, x)}
⊢ x = y → ¬y = x
tactic: simp only [not_and, Prod.mk.inj_iff, mem_singleton]
state_before: case intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝ : DecidableEq α
s : Finset α
x y : α
a : α × α
ha₁ : a.1 ∈ s
ha₂ : a.2 ∈ s
ha : a.1 ≠ a.2
h : Rel α a (x, y)
hx : x ∈ s
hy : y ∈ s
hxy : x ≠ y
hxy' : y ≠ x
this : filter (fun z => Sym2.mk z = s(x, y)) s.offDiag = {(x, y), (y, x)}
⊢ x = y → ¬y = x
state_after: no goals
tactic: exact fun _ => hxy'