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

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 α
⊢ 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: rintro x y hxy
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: simp_rw [mem_image, mem_offDiag] at 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: obtain ⟨a, ⟨ha₁, ha₂, ha⟩, h⟩ := 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: 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 : α × α
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: 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
α : 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: 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
⊢ (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 : (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]
  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
⊢ (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: 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)}
⊢ (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: 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: 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: exact fun _ => hxy'
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: cases h <;> refine ⟨‹_›, ‹_›, ?_⟩ <;> [exact ha; exact ha.symm]
state_before: α : 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)
⊢ x ∈ s ∧ y ∈ s ∧ x ≠ y
state_after: no goals

tactic: ext ⟨x₁, y₁⟩
state_before: α : 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 z => Sym2.mk z = s(x, y)) s.offDiag = {(x, y), (y, x)}
state_after: case a.mk
α : 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
x₁ y₁ : α
⊢ (x₁, y₁) ∈ filter (fun z => Sym2.mk z = s(x, y)) s.offDiag ↔ (x₁, y₁) ∈ {(x, y), (y, x)}

tactic: rw [mem_filter, mem_insert, mem_singleton, Sym2.eq_iff, Prod.mk.inj_iff, Prod.mk.inj_iff,
  and_iff_right_iff_imp]
state_before: case a.mk
α : 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
x₁ y₁ : α
⊢ (x₁, y₁) ∈ filter (fun z => Sym2.mk z = s(x, y)) s.offDiag ↔ (x₁, y₁) ∈ {(x, y), (y, x)}
state_after: case a.mk
α : 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
x₁ y₁ : α
⊢ x₁ = x ∧ y₁ = y ∨ x₁ = y ∧ y₁ = x → (x₁, y₁) ∈ s.offDiag

tactic: rintro (⟨rfl, rfl⟩ | ⟨rfl, rfl⟩) <;> rw [mem_offDiag] <;> exact ⟨‹_›, ‹_›, ‹_›⟩
state_before: case a.mk
α : 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
x₁ y₁ : α
⊢ x₁ = x ∧ y₁ = y ∨ x₁ = y ∧ y₁ = x → (x₁, y₁) ∈ s.offDiag
state_after: no goals