Theorem: SimpleGraph.coe_finsetWalkLength_eq
File: Mathlib/Combinatorics/SimpleGraph/Connectivity.lean

tactic: induction' n with n ih generalizing u v
state_before: V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝¹ : DecidableEq V
inst✝ : G.LocallyFinite
n : ℕ
u v : V
⊢ ↑(G.finsetWalkLength n u v) = {p | p.length = n}
state_after: case zero
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝¹ : DecidableEq V
inst✝ : G.LocallyFinite
u v : V
⊢ ↑(G.finsetWalkLength 0 u v) = {p | p.length = 0}

case succ
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝¹ : DecidableEq V
inst✝ : G.LocallyFinite
n : ℕ
ih : ∀ (u v : V), ↑(G.finsetWalkLength n u v) = {p | p.length = n}
u v : V
⊢ ↑(G.finsetWalkLength (n + 1) u v) = {p | p.length = n + 1}

tactic: obtain rfl | huv := eq_or_ne u v <;> simp [finsetWalkLength, set_walk_length_zero_eq_of_ne, *]
state_before: case zero
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝¹ : DecidableEq V
inst✝ : G.LocallyFinite
u v : V
⊢ ↑(G.finsetWalkLength 0 u v) = {p | p.length = 0}
state_after: no goals

tactic: simp only [finsetWalkLength, set_walk_length_succ_eq, Finset.coe_biUnion, Finset.mem_coe,
  Finset.mem_univ, Set.iUnion_true]
state_before: case succ
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝¹ : DecidableEq V
inst✝ : G.LocallyFinite
n : ℕ
ih : ∀ (u v : V), ↑(G.finsetWalkLength n u v) = {p | p.length = n}
u v : V
⊢ ↑(G.finsetWalkLength (n + 1) u v) = {p | p.length = n + 1}
state_after: case succ
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝¹ : DecidableEq V
inst✝ : G.LocallyFinite
n : ℕ
ih : ∀ (u v : V), ↑(G.finsetWalkLength n u v) = {p | p.length = n}
u v : V
⊢ ⋃ x, ↑(Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑x) v)) =
    ⋃ w, ⋃ (h : G.Adj u w), Walk.cons h '' {p' | p'.length = n}

tactic: ext p
state_before: case succ
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝¹ : DecidableEq V
inst✝ : G.LocallyFinite
n : ℕ
ih : ∀ (u v : V), ↑(G.finsetWalkLength n u v) = {p | p.length = n}
u v : V
⊢ ⋃ x, ↑(Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑x) v)) =
    ⋃ w, ⋃ (h : G.Adj u w), Walk.cons h '' {p' | p'.length = n}
state_after: case succ.h
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝¹ : DecidableEq V
inst✝ : G.LocallyFinite
n : ℕ
ih : ∀ (u v : V), ↑(G.finsetWalkLength n u v) = {p | p.length = n}
u v : V
p : G.Walk u v
⊢ p ∈ ⋃ x, ↑(Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑x) v)) ↔
    p ∈ ⋃ w, ⋃ (h : G.Adj u w), Walk.cons h '' {p' | p'.length = n}

tactic: simp only [mem_neighborSet, Finset.coe_map, Embedding.coeFn_mk, Set.iUnion_coe_set,
  Set.mem_iUnion, Set.mem_image, Finset.mem_coe, Set.mem_setOf_eq]
state_before: case succ.h
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝¹ : DecidableEq V
inst✝ : G.LocallyFinite
n : ℕ
ih : ∀ (u v : V), ↑(G.finsetWalkLength n u v) = {p | p.length = n}
u v : V
p : G.Walk u v
⊢ p ∈ ⋃ x, ↑(Finset.map { toFun := fun p => Walk.cons ⋯ p, inj' := ⋯ } (G.finsetWalkLength n (↑x) v)) ↔
    p ∈ ⋃ w, ⋃ (h : G.Adj u w), Walk.cons h '' {p' | p'.length = n}
state_after: case succ.h
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝¹ : DecidableEq V
inst✝ : G.LocallyFinite
n : ℕ
ih : ∀ (u v : V), ↑(G.finsetWalkLength n u v) = {p | p.length = n}
u v : V
p : G.Walk u v
⊢ (∃ i, ∃ (h : G.Adj u i), ∃ x ∈ G.finsetWalkLength n i v, Walk.cons ⋯ x = p) ↔
    ∃ i, ∃ (h : G.Adj u i), ∃ x, x.length = n ∧ Walk.cons ⋯ x = p

tactic: congr!
state_before: case succ.h
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝¹ : DecidableEq V
inst✝ : G.LocallyFinite
n : ℕ
ih : ∀ (u v : V), ↑(G.finsetWalkLength n u v) = {p | p.length = n}
u v : V
p : G.Walk u v
⊢ (∃ i, ∃ (h : G.Adj u i), ∃ x ∈ G.finsetWalkLength n i v, Walk.cons ⋯ x = p) ↔
    ∃ i, ∃ (h : G.Adj u i), ∃ x, x.length = n ∧ Walk.cons ⋯ x = p
state_after: case succ.h.a.h.e'_2.h.h.e'_2.h.h.e'_2.h.h.e'_1.a
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝¹ : DecidableEq V
inst✝ : G.LocallyFinite
n : ℕ
ih : ∀ (u v : V), ↑(G.finsetWalkLength n u v) = {p | p.length = n}
u v : V
p : G.Walk u v
x✝² : V
x✝¹ : G.Adj u x✝²
x✝ : G.Walk x✝² v
⊢ x✝ ∈ G.finsetWalkLength n x✝² v ↔ x✝.length = n

tactic: rename_i w _ q
state_before: case succ.h.a.h.e'_2.h.h.e'_2.h.h.e'_2.h.h.e'_1.a
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝¹ : DecidableEq V
inst✝ : G.LocallyFinite
n : ℕ
ih : ∀ (u v : V), ↑(G.finsetWalkLength n u v) = {p | p.length = n}
u v : V
p : G.Walk u v
x✝² : V
x✝¹ : G.Adj u x✝²
x✝ : G.Walk x✝² v
⊢ x✝ ∈ G.finsetWalkLength n x✝² v ↔ x✝.length = n
state_after: case succ.h.a.h.e'_2.h.h.e'_2.h.h.e'_2.h.h.e'_1.a
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝¹ : DecidableEq V
inst✝ : G.LocallyFinite
n : ℕ
ih : ∀ (u v : V), ↑(G.finsetWalkLength n u v) = {p | p.length = n}
u v : V
p : G.Walk u v
w : V
x✝ : G.Adj u w
q : G.Walk w v
⊢ q ∈ G.finsetWalkLength n w v ↔ q.length = n

tactic: have := Set.ext_iff.mp (ih w v) q
state_before: case succ.h.a.h.e'_2.h.h.e'_2.h.h.e'_2.h.h.e'_1.a
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝¹ : DecidableEq V
inst✝ : G.LocallyFinite
n : ℕ
ih : ∀ (u v : V), ↑(G.finsetWalkLength n u v) = {p | p.length = n}
u v : V
p : G.Walk u v
w : V
x✝ : G.Adj u w
q : G.Walk w v
⊢ q ∈ G.finsetWalkLength n w v ↔ q.length = n
state_after: case succ.h.a.h.e'_2.h.h.e'_2.h.h.e'_2.h.h.e'_1.a
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝¹ : DecidableEq V
inst✝ : G.LocallyFinite
n : ℕ
ih : ∀ (u v : V), ↑(G.finsetWalkLength n u v) = {p | p.length = n}
u v : V
p : G.Walk u v
w : V
x✝ : G.Adj u w
q : G.Walk w v
this : q ∈ ↑(G.finsetWalkLength n w v) ↔ q ∈ {p | p.length = n}
⊢ q ∈ G.finsetWalkLength n w v ↔ q.length = n

tactic: simp only [Finset.mem_coe, Set.mem_setOf_eq] at this
state_before: case succ.h.a.h.e'_2.h.h.e'_2.h.h.e'_2.h.h.e'_1.a
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝¹ : DecidableEq V
inst✝ : G.LocallyFinite
n : ℕ
ih : ∀ (u v : V), ↑(G.finsetWalkLength n u v) = {p | p.length = n}
u v : V
p : G.Walk u v
w : V
x✝ : G.Adj u w
q : G.Walk w v
this : q ∈ ↑(G.finsetWalkLength n w v) ↔ q ∈ {p | p.length = n}
⊢ q ∈ G.finsetWalkLength n w v ↔ q.length = n
state_after: case succ.h.a.h.e'_2.h.h.e'_2.h.h.e'_2.h.h.e'_1.a
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝¹ : DecidableEq V
inst✝ : G.LocallyFinite
n : ℕ
ih : ∀ (u v : V), ↑(G.finsetWalkLength n u v) = {p | p.length = n}
u v : V
p : G.Walk u v
w : V
x✝ : G.Adj u w
q : G.Walk w v
this : q ∈ G.finsetWalkLength n w v ↔ q.length = n
⊢ q ∈ G.finsetWalkLength n w v ↔ q.length = n

tactic: rw [← this]
state_before: case succ.h.a.h.e'_2.h.h.e'_2.h.h.e'_2.h.h.e'_1.a
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝¹ : DecidableEq V
inst✝ : G.LocallyFinite
n : ℕ
ih : ∀ (u v : V), ↑(G.finsetWalkLength n u v) = {p | p.length = n}
u v : V
p : G.Walk u v
w : V
x✝ : G.Adj u w
q : G.Walk w v
this : q ∈ G.finsetWalkLength n w v ↔ q.length = n
⊢ q ∈ G.finsetWalkLength n w v ↔ q.length = n
state_after: no goals