Theorem: SimpleGraph.colorable_iff_exists_bdd_nat_coloring
File: Mathlib/Combinatorics/SimpleGraph/Coloring.lean

tactic: constructor
state_before: V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C : G.Coloring α
n : ℕ
⊢ G.Colorable n ↔ ∃ C, ∀ (v : V), C v < n
state_after: case mp
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C : G.Coloring α
n : ℕ
⊢ G.Colorable n → ∃ C, ∀ (v : V), C v < n

case mpr
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C : G.Coloring α
n : ℕ
⊢ (∃ C, ∀ (v : V), C v < n) → G.Colorable n

tactic: rintro hc
state_before: case mp
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C : G.Coloring α
n : ℕ
⊢ G.Colorable n → ∃ C, ∀ (v : V), C v < n
state_after: case mp
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C : G.Coloring α
n : ℕ
hc : G.Colorable n
⊢ ∃ C, ∀ (v : V), C v < n

tactic: have C : G.Coloring (Fin n) := hc.toColoring (by simp)
state_before: case mp
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C : G.Coloring α
n : ℕ
hc : G.Colorable n
⊢ ∃ C, ∀ (v : V), C v < n
state_after: case mp
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C✝ : G.Coloring α
n : ℕ
hc : G.Colorable n
C : G.Coloring (Fin n)
⊢ ∃ C, ∀ (v : V), C v < n

tactic: let f := Embedding.completeGraph (@Fin.valEmbedding n)
state_before: case mp
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C✝ : G.Coloring α
n : ℕ
hc : G.Colorable n
C : G.Coloring (Fin n)
⊢ ∃ C, ∀ (v : V), C v < n
state_after: case mp
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C✝ : G.Coloring α
n : ℕ
hc : G.Colorable n
C : G.Coloring (Fin n)
f : ⊤ ↪g ⊤ := Embedding.completeGraph Fin.valEmbedding
⊢ ∃ C, ∀ (v : V), C v < n

tactic: use f.toHom.comp C
state_before: case mp
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C✝ : G.Coloring α
n : ℕ
hc : G.Colorable n
C : G.Coloring (Fin n)
f : ⊤ ↪g ⊤ := Embedding.completeGraph Fin.valEmbedding
⊢ ∃ C, ∀ (v : V), C v < n
state_after: case h
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C✝ : G.Coloring α
n : ℕ
hc : G.Colorable n
C : G.Coloring (Fin n)
f : ⊤ ↪g ⊤ := Embedding.completeGraph Fin.valEmbedding
⊢ ∀ (v : V), (f.toHom.comp C) v < n

tactic: intro v
state_before: case h
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C✝ : G.Coloring α
n : ℕ
hc : G.Colorable n
C : G.Coloring (Fin n)
f : ⊤ ↪g ⊤ := Embedding.completeGraph Fin.valEmbedding
⊢ ∀ (v : V), (f.toHom.comp C) v < n
state_after: case h
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C✝ : G.Coloring α
n : ℕ
hc : G.Colorable n
C : G.Coloring (Fin n)
f : ⊤ ↪g ⊤ := Embedding.completeGraph Fin.valEmbedding
v : V
⊢ (f.toHom.comp C) v < n

tactic: cases' C with color valid
state_before: case h
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C✝ : G.Coloring α
n : ℕ
hc : G.Colorable n
C : G.Coloring (Fin n)
f : ⊤ ↪g ⊤ := Embedding.completeGraph Fin.valEmbedding
v : V
⊢ (f.toHom.comp C) v < n
state_after: case h.mk
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C : G.Coloring α
n : ℕ
hc : G.Colorable n
f : ⊤ ↪g ⊤ := Embedding.completeGraph Fin.valEmbedding
v : V
color : V → Fin n
valid : ∀ {a b : V}, G.Adj a b → ⊤.Adj (color a) (color b)
⊢ (f.toHom.comp { toFun := color, map_rel' := valid }) v < n

tactic: exact Fin.is_lt (color v)
state_before: case h.mk
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C : G.Coloring α
n : ℕ
hc : G.Colorable n
f : ⊤ ↪g ⊤ := Embedding.completeGraph Fin.valEmbedding
v : V
color : V → Fin n
valid : ∀ {a b : V}, G.Adj a b → ⊤.Adj (color a) (color b)
⊢ (f.toHom.comp { toFun := color, map_rel' := valid }) v < n
state_after: no goals

tactic: simp
state_before: V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C : G.Coloring α
n : ℕ
hc : G.Colorable n
⊢ n ≤ card (Fin n)
state_after: no goals

tactic: rintro ⟨C, Cf⟩
state_before: case mpr
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C : G.Coloring α
n : ℕ
⊢ (∃ C, ∀ (v : V), C v < n) → G.Colorable n
state_after: case mpr.intro
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C✝ : G.Coloring α
n : ℕ
C : G.Coloring ℕ
Cf : ∀ (v : V), C v < n
⊢ G.Colorable n

tactic: refine ⟨Coloring.mk ?_ ?_⟩
state_before: case mpr.intro
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C✝ : G.Coloring α
n : ℕ
C : G.Coloring ℕ
Cf : ∀ (v : V), C v < n
⊢ G.Colorable n
state_after: case mpr.intro.refine_1
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C✝ : G.Coloring α
n : ℕ
C : G.Coloring ℕ
Cf : ∀ (v : V), C v < n
⊢ V → Fin n

case mpr.intro.refine_2
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C✝ : G.Coloring α
n : ℕ
C : G.Coloring ℕ
Cf : ∀ (v : V), C v < n
⊢ ∀ {v w : V}, G.Adj v w → ?mpr.intro.refine_1 v ≠ ?mpr.intro.refine_1 w

tactic: exact fun v => ⟨C v, Cf v⟩
state_before: case mpr.intro.refine_1
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C✝ : G.Coloring α
n : ℕ
C : G.Coloring ℕ
Cf : ∀ (v : V), C v < n
⊢ V → Fin n
state_after: no goals

tactic: rintro v w hvw
state_before: case mpr.intro.refine_2
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C✝ : G.Coloring α
n : ℕ
C : G.Coloring ℕ
Cf : ∀ (v : V), C v < n
⊢ ∀ {v w : V}, G.Adj v w → ⟨C v, ⋯⟩ ≠ ⟨C w, ⋯⟩
state_after: case mpr.intro.refine_2
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C✝ : G.Coloring α
n : ℕ
C : G.Coloring ℕ
Cf : ∀ (v : V), C v < n
v w : V
hvw : G.Adj v w
⊢ ⟨C v, ⋯⟩ ≠ ⟨C w, ⋯⟩

tactic: simp only [Fin.mk_eq_mk, Ne]
state_before: case mpr.intro.refine_2
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C✝ : G.Coloring α
n : ℕ
C : G.Coloring ℕ
Cf : ∀ (v : V), C v < n
v w : V
hvw : G.Adj v w
⊢ ⟨C v, ⋯⟩ ≠ ⟨C w, ⋯⟩
state_after: case mpr.intro.refine_2
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C✝ : G.Coloring α
n : ℕ
C : G.Coloring ℕ
Cf : ∀ (v : V), C v < n
v w : V
hvw : G.Adj v w
⊢ ¬C v = C w

tactic: exact C.valid hvw
state_before: case mpr.intro.refine_2
V : Type u
G : SimpleGraph V
n✝ : ℕ
α : Type u_1
β : Type u_2
C✝ : G.Coloring α
n : ℕ
C : G.Coloring ℕ
Cf : ∀ (v : V), C v < n
v w : V
hvw : G.Adj v w
⊢ ¬C v = C w
state_after: no goals