Theorem: SimpleGraph.IsTuranMaximal.card_parts
File: Mathlib/Combinatorics/SimpleGraph/Turan.lean

tactic: set fp := h.finpartition
state_before: V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
⊢ h.finpartition.parts.card = min (Fintype.card V) r
state_after: V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
⊢ fp.parts.card = min (Fintype.card V) r

tactic: apply le_antisymm (le_min fp.card_parts_le_card h.card_parts_le)
state_before: V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
⊢ fp.parts.card = min (Fintype.card V) r
state_after: V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
⊢ min univ.card r ≤ fp.parts.card

tactic: by_contra! l
state_before: V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
⊢ min univ.card r ≤ fp.parts.card
state_after: V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < min univ.card r
⊢ False

tactic: rw [lt_min_iff] at l
state_before: V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < min univ.card r
⊢ False
state_after: V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
⊢ False

tactic: obtain ⟨x, -, y, -, hn, he⟩ :=
  exists_ne_map_eq_of_card_lt_of_maps_to l.1 fun a _ ↦ fp.part_mem (mem_univ a)
state_before: V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
⊢ False
state_after: case intro.intro.intro.intro.intro
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
⊢ False

tactic: apply absurd h
state_before: case intro.intro.intro.intro.intro
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
⊢ False
state_after: case intro.intro.intro.intro.intro
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
⊢ ¬G.IsTuranMaximal r

tactic: rw [IsTuranMaximal]
state_before: case intro.intro.intro.intro.intro
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
⊢ ¬G.IsTuranMaximal r
state_after: case intro.intro.intro.intro.intro
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
⊢ ¬(G.CliqueFree (r + 1) ∧
      ∀ (H : SimpleGraph V) [inst : DecidableRel H.Adj], H.CliqueFree (r + 1) → H.edgeFinset.card ≤ G.edgeFinset.card)

tactic: push_neg
state_before: case intro.intro.intro.intro.intro
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
⊢ ¬(G.CliqueFree (r + 1) ∧
      ∀ (H : SimpleGraph V) [inst : DecidableRel H.Adj], H.CliqueFree (r + 1) → H.edgeFinset.card ≤ G.edgeFinset.card)
state_after: case intro.intro.intro.intro.intro
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
⊢ G.CliqueFree (r + 1) → ∃ H inst, H.CliqueFree (r + 1) ∧ G.edgeFinset.card < H.edgeFinset.card

tactic: rintro -
state_before: case intro.intro.intro.intro.intro
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
⊢ G.CliqueFree (r + 1) → ∃ H inst, H.CliqueFree (r + 1) ∧ G.edgeFinset.card < H.edgeFinset.card
state_after: case intro.intro.intro.intro.intro
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
⊢ ∃ H inst, H.CliqueFree (r + 1) ∧ G.edgeFinset.card < H.edgeFinset.card

tactic: have cf : G.CliqueFree r := by
  simp_rw [← cliqueFinset_eq_empty_iff, cliqueFinset, filter_eq_empty_iff, mem_univ,
    forall_true_left, isNClique_iff, and_comm, not_and, isClique_iff, Set.Pairwise]
  intro z zc; push_neg; simp_rw [h.not_adj_iff_part_eq]
  exact exists_ne_map_eq_of_card_lt_of_maps_to (zc.symm ▸ l.2) fun a _ ↦ fp.part_mem (mem_univ a)
state_before: case intro.intro.intro.intro.intro
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
⊢ ∃ H inst, H.CliqueFree (r + 1) ∧ G.edgeFinset.card < H.edgeFinset.card
state_after: case intro.intro.intro.intro.intro
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
cf : G.CliqueFree r
⊢ ∃ H inst, H.CliqueFree (r + 1) ∧ G.edgeFinset.card < H.edgeFinset.card

tactic: use G ⊔ edge x y, inferInstance, cf.sup_edge x y
state_before: case intro.intro.intro.intro.intro
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
cf : G.CliqueFree r
⊢ ∃ H inst, H.CliqueFree (r + 1) ∧ G.edgeFinset.card < H.edgeFinset.card
state_after: case right
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
cf : G.CliqueFree r
⊢ G.edgeFinset.card < (G ⊔ edge x y).edgeFinset.card

tactic: convert Nat.lt.base G.edgeFinset.card
state_before: case right
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
cf : G.CliqueFree r
⊢ G.edgeFinset.card < (G ⊔ edge x y).edgeFinset.card
state_after: case h.e'_4
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
cf : G.CliqueFree r
⊢ (G ⊔ edge x y).edgeFinset.card = G.edgeFinset.card.succ

tactic: convert G.card_edgeFinset_sup_edge _ hn
state_before: case h.e'_4
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
cf : G.CliqueFree r
⊢ (G ⊔ edge x y).edgeFinset.card = G.edgeFinset.card.succ
state_after: case h.e'_4
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
cf : G.CliqueFree r
⊢ ¬G.Adj x y

tactic: rwa [h.not_adj_iff_part_eq]
state_before: case h.e'_4
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
cf : G.CliqueFree r
⊢ ¬G.Adj x y
state_after: no goals

tactic: simp_rw [← cliqueFinset_eq_empty_iff, cliqueFinset, filter_eq_empty_iff, mem_univ,
  forall_true_left, isNClique_iff, and_comm, not_and, isClique_iff, Set.Pairwise]
state_before: V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
⊢ G.CliqueFree r
state_after: V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
⊢ ∀ ⦃x : Finset V⦄, x.card = r → ¬∀ ⦃x_1 : V⦄, x_1 ∈ ↑x → ∀ ⦃y : V⦄, y ∈ ↑x → x_1 ≠ y → G.Adj x_1 y

tactic: intro z zc
state_before: V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
⊢ ∀ ⦃x : Finset V⦄, x.card = r → ¬∀ ⦃x_1 : V⦄, x_1 ∈ ↑x → ∀ ⦃y : V⦄, y ∈ ↑x → x_1 ≠ y → G.Adj x_1 y
state_after: V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
z : Finset V
zc : z.card = r
⊢ ¬∀ ⦃x : V⦄, x ∈ ↑z → ∀ ⦃y : V⦄, y ∈ ↑z → x ≠ y → G.Adj x y

tactic: push_neg
state_before: V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
z : Finset V
zc : z.card = r
⊢ ¬∀ ⦃x : V⦄, x ∈ ↑z → ∀ ⦃y : V⦄, y ∈ ↑z → x ≠ y → G.Adj x y
state_after: V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
z : Finset V
zc : z.card = r
⊢ ∃ x ∈ ↑z, ∃ y ∈ ↑z, x ≠ y ∧ ¬G.Adj x y

tactic: simp_rw [h.not_adj_iff_part_eq]
state_before: V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
z : Finset V
zc : z.card = r
⊢ ∃ x ∈ ↑z, ∃ y ∈ ↑z, x ≠ y ∧ ¬G.Adj x y
state_after: V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
z : Finset V
zc : z.card = r
⊢ ∃ x ∈ ↑z, ∃ y ∈ ↑z, x ≠ y ∧ h.finpartition.part x = h.finpartition.part y

tactic: exact exists_ne_map_eq_of_card_lt_of_maps_to (zc.symm ▸ l.2) fun a _ ↦ fp.part_mem (mem_univ a)
state_before: V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h : G.IsTuranMaximal r
fp : Finpartition univ := h.finpartition
l : fp.parts.card < univ.card ∧ fp.parts.card < r
x y : V
hn : x ≠ y
he : fp.part x = fp.part y
z : Finset V
zc : z.card = r
⊢ ∃ x ∈ ↑z, ∃ y ∈ ↑z, x ≠ y ∧ h.finpartition.part x = h.finpartition.part y
state_after: no goals