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

Proof steps:
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: 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
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: 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
⊢ 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: 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
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: 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 < 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: 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: 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: 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
⊢ ¬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: 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.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: 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 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: 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
⊢ ∃ 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: 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
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: use G ⊔ edge x y, inferInstance, cf.sup_edge x y
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 Nat.lt.base G.edgeFinset.card
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: 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.Adj x y
state_after: no goals
tactic: rwa [h.not_adj_iff_part_eq]