Theorem: SimpleGraph.IsTuranMaximal.nonempty_iso_turanGraph
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✝ h : G.IsTuranMaximal r
⊢ Nonempty (G ≃g turanGraph (Fintype.card V) r)
state_after: case 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✝ h : G.IsTuranMaximal r
zm : { x // x ∈ univ } ≃ Fin univ.card
zp :
  ∀ (a b : { x // x ∈ univ }),
    h.finpartition.part ↑a = h.finpartition.part ↑b ↔
      ↑(zm a) % h.finpartition.parts.card = ↑(zm b) % h.finpartition.parts.card
⊢ Nonempty (G ≃g turanGraph (Fintype.card V) r)
tactic: obtain ⟨zm, zp⟩ := h.isEquipartition.exists_partPreservingEquiv
state_before: case 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✝ h : G.IsTuranMaximal r
zm : { x // x ∈ univ } ≃ Fin univ.card
zp :
  ∀ (a b : { x // x ∈ univ }),
    h.finpartition.part ↑a = h.finpartition.part ↑b ↔
      ↑(zm a) % h.finpartition.parts.card = ↑(zm b) % h.finpartition.parts.card
⊢ Nonempty (G ≃g turanGraph (Fintype.card V) r)
state_after: case map_rel_iff'
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h✝ h : G.IsTuranMaximal r
zm : { x // x ∈ univ } ≃ Fin univ.card
zp :
  ∀ (a b : { x // x ∈ univ }),
    h.finpartition.part ↑a = h.finpartition.part ↑b ↔
      ↑(zm a) % h.finpartition.parts.card = ↑(zm b) % h.finpartition.parts.card
⊢ ∀ {a b : V},
    (turanGraph (Fintype.card V) r).Adj (((Equiv.subtypeUnivEquiv ⋯).symm.trans zm) a)
        (((Equiv.subtypeUnivEquiv ⋯).symm.trans zm) b) ↔
      G.Adj a b
tactic: use (Equiv.subtypeUnivEquiv mem_univ).symm.trans zm
state_before: case map_rel_iff'
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h✝ h : G.IsTuranMaximal r
zm : { x // x ∈ univ } ≃ Fin univ.card
zp :
  ∀ (a b : { x // x ∈ univ }),
    h.finpartition.part ↑a = h.finpartition.part ↑b ↔
      ↑(zm a) % h.finpartition.parts.card = ↑(zm b) % h.finpartition.parts.card
⊢ ∀ {a b : V},
    (turanGraph (Fintype.card V) r).Adj (((Equiv.subtypeUnivEquiv ⋯).symm.trans zm) a)
        (((Equiv.subtypeUnivEquiv ⋯).symm.trans zm) b) ↔
      G.Adj a b
state_after: case map_rel_iff'
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h✝ h : G.IsTuranMaximal r
zm : { x // x ∈ univ } ≃ Fin univ.card
zp :
  ∀ (a b : { x // x ∈ univ }),
    h.finpartition.part ↑a = h.finpartition.part ↑b ↔
      ↑(zm a) % h.finpartition.parts.card = ↑(zm b) % h.finpartition.parts.card
a b : V
⊢ (turanGraph (Fintype.card V) r).Adj (((Equiv.subtypeUnivEquiv ⋯).symm.trans zm) a)
      (((Equiv.subtypeUnivEquiv ⋯).symm.trans zm) b) ↔
    G.Adj a b
tactic: intro a b
state_before: case map_rel_iff'
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h✝ h : G.IsTuranMaximal r
zm : { x // x ∈ univ } ≃ Fin univ.card
zp :
  ∀ (a b : { x // x ∈ univ }),
    h.finpartition.part ↑a = h.finpartition.part ↑b ↔
      ↑(zm a) % h.finpartition.parts.card = ↑(zm b) % h.finpartition.parts.card
a b : V
⊢ (turanGraph (Fintype.card V) r).Adj (((Equiv.subtypeUnivEquiv ⋯).symm.trans zm) a)
      (((Equiv.subtypeUnivEquiv ⋯).symm.trans zm) b) ↔
    G.Adj a b
state_after: case map_rel_iff'
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h✝ h : G.IsTuranMaximal r
zm : { x // x ∈ univ } ≃ Fin univ.card
zp :
  ∀ (a b : { x // x ∈ univ }),
    h.finpartition.part ↑a = h.finpartition.part ↑b ↔
      ↑(zm a) % h.finpartition.parts.card = ↑(zm b) % h.finpartition.parts.card
a b : V
⊢ ↑(zm ⟨a, ⋯⟩) % r ≠ ↑(zm ⟨b, ⋯⟩) % r ↔ G.Adj a b
tactic: simp_rw [turanGraph, Equiv.trans_apply, Equiv.subtypeUnivEquiv_symm_apply]
state_before: case map_rel_iff'
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h✝ h : G.IsTuranMaximal r
zm : { x // x ∈ univ } ≃ Fin univ.card
zp :
  ∀ (a b : { x // x ∈ univ }),
    h.finpartition.part ↑a = h.finpartition.part ↑b ↔
      ↑(zm a) % h.finpartition.parts.card = ↑(zm b) % h.finpartition.parts.card
a b : V
⊢ ↑(zm ⟨a, ⋯⟩) % r ≠ ↑(zm ⟨b, ⋯⟩) % r ↔ G.Adj a b
state_after: case map_rel_iff'
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h✝ h : G.IsTuranMaximal r
zm : { x // x ∈ univ } ≃ Fin univ.card
zp :
  ∀ (a b : { x // x ∈ univ }),
    h.finpartition.part ↑a = h.finpartition.part ↑b ↔
      ↑(zm a) % h.finpartition.parts.card = ↑(zm b) % h.finpartition.parts.card
a b : V
this :
  h.finpartition.part ↑⟨a, ⋯⟩ = h.finpartition.part ↑⟨b, ⋯⟩ ↔
    ↑(zm ⟨a, ⋯⟩) % h.finpartition.parts.card = ↑(zm ⟨b, ⋯⟩) % h.finpartition.parts.card
⊢ ↑(zm ⟨a, ⋯⟩) % r ≠ ↑(zm ⟨b, ⋯⟩) % r ↔ G.Adj a b
tactic: have := zp ⟨a, mem_univ a⟩ ⟨b, mem_univ b⟩
state_before: case map_rel_iff'
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h✝ h : G.IsTuranMaximal r
zm : { x // x ∈ univ } ≃ Fin univ.card
zp :
  ∀ (a b : { x // x ∈ univ }),
    h.finpartition.part ↑a = h.finpartition.part ↑b ↔
      ↑(zm a) % h.finpartition.parts.card = ↑(zm b) % h.finpartition.parts.card
a b : V
this :
  h.finpartition.part ↑⟨a, ⋯⟩ = h.finpartition.part ↑⟨b, ⋯⟩ ↔
    ↑(zm ⟨a, ⋯⟩) % h.finpartition.parts.card = ↑(zm ⟨b, ⋯⟩) % h.finpartition.parts.card
⊢ ↑(zm ⟨a, ⋯⟩) % r ≠ ↑(zm ⟨b, ⋯⟩) % r ↔ G.Adj a b
state_after: case map_rel_iff'
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h✝ h : G.IsTuranMaximal r
zm : { x // x ∈ univ } ≃ Fin univ.card
zp :
  ∀ (a b : { x // x ∈ univ }),
    h.finpartition.part ↑a = h.finpartition.part ↑b ↔
      ↑(zm a) % h.finpartition.parts.card = ↑(zm b) % h.finpartition.parts.card
a b : V
this : ¬G.Adj ↑⟨a, ⋯⟩ ↑⟨b, ⋯⟩ ↔ ↑(zm ⟨a, ⋯⟩) % h.finpartition.parts.card = ↑(zm ⟨b, ⋯⟩) % h.finpartition.parts.card
⊢ ↑(zm ⟨a, ⋯⟩) % r ≠ ↑(zm ⟨b, ⋯⟩) % r ↔ G.Adj a b
tactic: rw [← h.not_adj_iff_part_eq] at this
state_before: case map_rel_iff'
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h✝ h : G.IsTuranMaximal r
zm : { x // x ∈ univ } ≃ Fin univ.card
zp :
  ∀ (a b : { x // x ∈ univ }),
    h.finpartition.part ↑a = h.finpartition.part ↑b ↔
      ↑(zm a) % h.finpartition.parts.card = ↑(zm b) % h.finpartition.parts.card
a b : V
this : ¬G.Adj ↑⟨a, ⋯⟩ ↑⟨b, ⋯⟩ ↔ ↑(zm ⟨a, ⋯⟩) % h.finpartition.parts.card = ↑(zm ⟨b, ⋯⟩) % h.finpartition.parts.card
⊢ ↑(zm ⟨a, ⋯⟩) % r ≠ ↑(zm ⟨b, ⋯⟩) % r ↔ G.Adj a b
state_after: case map_rel_iff'
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h✝ h : G.IsTuranMaximal r
zm : { x // x ∈ univ } ≃ Fin univ.card
zp :
  ∀ (a b : { x // x ∈ univ }),
    h.finpartition.part ↑a = h.finpartition.part ↑b ↔
      ↑(zm a) % h.finpartition.parts.card = ↑(zm b) % h.finpartition.parts.card
a b : V
this : ¬G.Adj ↑⟨a, ⋯⟩ ↑⟨b, ⋯⟩ ↔ ↑(zm ⟨a, ⋯⟩) % h.finpartition.parts.card = ↑(zm ⟨b, ⋯⟩) % h.finpartition.parts.card
⊢ ↑(zm ⟨a, ⋯⟩) % r = ↑(zm ⟨b, ⋯⟩) % r ↔ ↑(zm ⟨a, ⋯⟩) % min (Fintype.card V) r = ↑(zm ⟨b, ⋯⟩) % min (Fintype.card V) r
tactic: rw [← not_iff_not, not_ne_iff, this, card_parts]
state_before: case map_rel_iff'
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h✝ h : G.IsTuranMaximal r
zm : { x // x ∈ univ } ≃ Fin univ.card
zp :
  ∀ (a b : { x // x ∈ univ }),
    h.finpartition.part ↑a = h.finpartition.part ↑b ↔
      ↑(zm a) % h.finpartition.parts.card = ↑(zm b) % h.finpartition.parts.card
a b : V
this : ¬G.Adj ↑⟨a, ⋯⟩ ↑⟨b, ⋯⟩ ↔ ↑(zm ⟨a, ⋯⟩) % h.finpartition.parts.card = ↑(zm ⟨b, ⋯⟩) % h.finpartition.parts.card
⊢ ↑(zm ⟨a, ⋯⟩) % r = ↑(zm ⟨b, ⋯⟩) % r ↔ ↑(zm ⟨a, ⋯⟩) % min (Fintype.card V) r = ↑(zm ⟨b, ⋯⟩) % min (Fintype.card V) r
state_after: case map_rel_iff'.inl
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h✝ h : G.IsTuranMaximal r
zm : { x // x ∈ univ } ≃ Fin univ.card
zp :
  ∀ (a b : { x // x ∈ univ }),
    h.finpartition.part ↑a = h.finpartition.part ↑b ↔
      ↑(zm a) % h.finpartition.parts.card = ↑(zm b) % h.finpartition.parts.card
a b : V
this : ¬G.Adj ↑⟨a, ⋯⟩ ↑⟨b, ⋯⟩ ↔ ↑(zm ⟨a, ⋯⟩) % h.finpartition.parts.card = ↑(zm ⟨b, ⋯⟩) % h.finpartition.parts.card
c : r ≤ Fintype.card V
⊢ ↑(zm ⟨a, ⋯⟩) % r = ↑(zm ⟨b, ⋯⟩) % r ↔ ↑(zm ⟨a, ⋯⟩) % min (Fintype.card V) r = ↑(zm ⟨b, ⋯⟩) % min (Fintype.card V) r

case map_rel_iff'.inr
V : Type u_1
inst✝² : Fintype V
inst✝¹ : DecidableEq V
G : SimpleGraph V
inst✝ : DecidableRel G.Adj
n r : ℕ
s t u : V
h✝ h : G.IsTuranMaximal r
zm : { x // x ∈ univ } ≃ Fin univ.card
zp :
  ∀ (a b : { x // x ∈ univ }),
    h.finpartition.part ↑a = h.finpartition.part ↑b ↔
      ↑(zm a) % h.finpartition.parts.card = ↑(zm b) % h.finpartition.parts.card
a b : V
this : ¬G.Adj ↑⟨a, ⋯⟩ ↑⟨b, ⋯⟩ ↔ ↑(zm ⟨a, ⋯⟩) % h.finpartition.parts.card = ↑(zm ⟨b, ⋯⟩) % h.finpartition.parts.card
c : Fintype.card V < r
⊢ ↑(zm ⟨a, ⋯⟩) % r = ↑(zm ⟨b, ⋯⟩) % r ↔ ↑(zm ⟨a, ⋯⟩) % min (Fintype.card V) r = ↑(zm ⟨b, ⋯⟩) % min (Fintype.card V) r
tactic: rcases le_or_lt r (Fintype.card V) with c | c