Theorem: SimpleGraph.EdgeDisjointTriangles.card_edgeFinset_le
File: Mathlib/Combinatorics/SimpleGraph/Triangle/Basic.lean

tactic: rw [mul_comm, ← mul_one G.edgeFinset.card]
state_before: α : Type u_1
β : Type u_2
𝕜 : Type u_3
inst✝³ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : DecidableRel G.Adj
hG : G.EdgeDisjointTriangles
⊢ 3 * (G.cliqueFinset 3).card ≤ G.edgeFinset.card
state_after: α : Type u_1
β : Type u_2
𝕜 : Type u_3
inst✝³ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : DecidableRel G.Adj
hG : G.EdgeDisjointTriangles
⊢ (G.cliqueFinset 3).card * 3 ≤ G.edgeFinset.card * 1

tactic: refine card_mul_le_card_mul (fun s e ↦ e ∈ s.sym2) ?_ (fun e he ↦ ?_)
state_before: α : Type u_1
β : Type u_2
𝕜 : Type u_3
inst✝³ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : DecidableRel G.Adj
hG : G.EdgeDisjointTriangles
⊢ (G.cliqueFinset 3).card * 3 ≤ G.edgeFinset.card * 1
state_after: case refine_1
α : Type u_1
β : Type u_2
𝕜 : Type u_3
inst✝³ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : DecidableRel G.Adj
hG : G.EdgeDisjointTriangles
⊢ ∀ a ∈ G.cliqueFinset 3, 3 ≤ (bipartiteAbove (fun s e => e ∈ s.sym2) G.edgeFinset a).card

case refine_2
α : Type u_1
β : Type u_2
𝕜 : Type u_3
inst✝³ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : DecidableRel G.Adj
hG : G.EdgeDisjointTriangles
e : Sym2 α
he : e ∈ G.edgeFinset
⊢ (bipartiteBelow (fun s e => e ∈ s.sym2) (G.cliqueFinset 3) e).card ≤ 1

tactic: simp only [is3Clique_iff, mem_cliqueFinset_iff, mem_sym2_iff, forall_exists_index, and_imp]
state_before: case refine_1
α : Type u_1
β : Type u_2
𝕜 : Type u_3
inst✝³ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : DecidableRel G.Adj
hG : G.EdgeDisjointTriangles
⊢ ∀ a ∈ G.cliqueFinset 3, 3 ≤ (bipartiteAbove (fun s e => e ∈ s.sym2) G.edgeFinset a).card
state_after: case refine_1
α : Type u_1
β : Type u_2
𝕜 : Type u_3
inst✝³ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : DecidableRel G.Adj
hG : G.EdgeDisjointTriangles
⊢ ∀ (a : Finset α) (x x_1 x_2 : α),
    G.Adj x x_1 →
      G.Adj x x_2 →
        G.Adj x_1 x_2 → a = {x, x_1, x_2} → 3 ≤ (bipartiteAbove (fun s e => ∀ a ∈ e, a ∈ s) G.edgeFinset a).card

tactic: rintro _ a b c hab hac hbc rfl
state_before: case refine_1
α : Type u_1
β : Type u_2
𝕜 : Type u_3
inst✝³ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : DecidableRel G.Adj
hG : G.EdgeDisjointTriangles
⊢ ∀ (a : Finset α) (x x_1 x_2 : α),
    G.Adj x x_1 →
      G.Adj x x_2 →
        G.Adj x_1 x_2 → a = {x, x_1, x_2} → 3 ≤ (bipartiteAbove (fun s e => ∀ a ∈ e, a ∈ s) G.edgeFinset a).card
state_after: case refine_1
α : Type u_1
β : Type u_2
𝕜 : Type u_3
inst✝³ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : DecidableRel G.Adj
hG : G.EdgeDisjointTriangles
a b c : α
hab : G.Adj a b
hac : G.Adj a c
hbc : G.Adj b c
⊢ 3 ≤ (bipartiteAbove (fun s e => ∀ a ∈ e, a ∈ s) G.edgeFinset {a, b, c}).card

tactic: have : Finset.card ({s(a, b), s(a, c), s(b, c)} : Finset (Sym2 α)) = 3 := by
  refine card_eq_three.2 ⟨_, _, _, ?_, ?_, ?_, rfl⟩ <;> simp [hab.ne, hac.ne, hbc.ne]
state_before: case refine_1
α : Type u_1
β : Type u_2
𝕜 : Type u_3
inst✝³ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : DecidableRel G.Adj
hG : G.EdgeDisjointTriangles
a b c : α
hab : G.Adj a b
hac : G.Adj a c
hbc : G.Adj b c
⊢ 3 ≤ (bipartiteAbove (fun s e => ∀ a ∈ e, a ∈ s) G.edgeFinset {a, b, c}).card
state_after: case refine_1
α : Type u_1
β : Type u_2
𝕜 : Type u_3
inst✝³ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : DecidableRel G.Adj
hG : G.EdgeDisjointTriangles
a b c : α
hab : G.Adj a b
hac : G.Adj a c
hbc : G.Adj b c
this : {s(a, b), s(a, c), s(b, c)}.card = 3
⊢ 3 ≤ (bipartiteAbove (fun s e => ∀ a ∈ e, a ∈ s) G.edgeFinset {a, b, c}).card

tactic: rw [← this]
state_before: case refine_1
α : Type u_1
β : Type u_2
𝕜 : Type u_3
inst✝³ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : DecidableRel G.Adj
hG : G.EdgeDisjointTriangles
a b c : α
hab : G.Adj a b
hac : G.Adj a c
hbc : G.Adj b c
this : {s(a, b), s(a, c), s(b, c)}.card = 3
⊢ 3 ≤ (bipartiteAbove (fun s e => ∀ a ∈ e, a ∈ s) G.edgeFinset {a, b, c}).card
state_after: case refine_1
α : Type u_1
β : Type u_2
𝕜 : Type u_3
inst✝³ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : DecidableRel G.Adj
hG : G.EdgeDisjointTriangles
a b c : α
hab : G.Adj a b
hac : G.Adj a c
hbc : G.Adj b c
this : {s(a, b), s(a, c), s(b, c)}.card = 3
⊢ {s(a, b), s(a, c), s(b, c)}.card ≤ (bipartiteAbove (fun s e => ∀ a ∈ e, a ∈ s) G.edgeFinset {a, b, c}).card

tactic: refine card_mono ?_
state_before: case refine_1
α : Type u_1
β : Type u_2
𝕜 : Type u_3
inst✝³ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : DecidableRel G.Adj
hG : G.EdgeDisjointTriangles
a b c : α
hab : G.Adj a b
hac : G.Adj a c
hbc : G.Adj b c
this : {s(a, b), s(a, c), s(b, c)}.card = 3
⊢ {s(a, b), s(a, c), s(b, c)}.card ≤ (bipartiteAbove (fun s e => ∀ a ∈ e, a ∈ s) G.edgeFinset {a, b, c}).card
state_after: case refine_1
α : Type u_1
β : Type u_2
𝕜 : Type u_3
inst✝³ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : DecidableRel G.Adj
hG : G.EdgeDisjointTriangles
a b c : α
hab : G.Adj a b
hac : G.Adj a c
hbc : G.Adj b c
this : {s(a, b), s(a, c), s(b, c)}.card = 3
⊢ {s(a, b), s(a, c), s(b, c)} ≤ bipartiteAbove (fun s e => ∀ a ∈ e, a ∈ s) G.edgeFinset {a, b, c}

tactic: simp [insert_subset, *]
state_before: case refine_1
α : Type u_1
β : Type u_2
𝕜 : Type u_3
inst✝³ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : DecidableRel G.Adj
hG : G.EdgeDisjointTriangles
a b c : α
hab : G.Adj a b
hac : G.Adj a c
hbc : G.Adj b c
this : {s(a, b), s(a, c), s(b, c)}.card = 3
⊢ {s(a, b), s(a, c), s(b, c)} ≤ bipartiteAbove (fun s e => ∀ a ∈ e, a ∈ s) G.edgeFinset {a, b, c}
state_after: no goals

tactic: refine card_eq_three.2 ⟨_, _, _, ?_, ?_, ?_, rfl⟩ <;> simp [hab.ne, hac.ne, hbc.ne]
state_before: α : Type u_1
β : Type u_2
𝕜 : Type u_3
inst✝³ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : DecidableRel G.Adj
hG : G.EdgeDisjointTriangles
a b c : α
hab : G.Adj a b
hac : G.Adj a c
hbc : G.Adj b c
⊢ {s(a, b), s(a, c), s(b, c)}.card = 3
state_after: no goals

tactic: simpa only [card_le_one, mem_bipartiteBelow, and_imp, Set.Subsingleton, Set.mem_setOf_eq,
  mem_cliqueFinset_iff, mem_cliqueSet_iff]
  using hG.mem_sym2_subsingleton (G.not_isDiag_of_mem_edgeSet $ mem_edgeFinset.1 he)
state_before: case refine_2
α : Type u_1
β : Type u_2
𝕜 : Type u_3
inst✝³ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝² : DecidableEq α
inst✝¹ : Fintype α
inst✝ : DecidableRel G.Adj
hG : G.EdgeDisjointTriangles
e : Sym2 α
he : e ∈ G.edgeFinset
⊢ (bipartiteBelow (fun s e => e ∈ s.sym2) (G.cliqueFinset 3) e).card ≤ 1
state_after: no goals