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

tactic: constructor
state_before: V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
⊢ (G \ fromEdgeSet {s(v, w)}).Reachable v w ↔ ∃ p, s(v, w) ∉ p.edges
state_after: case mp
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
⊢ (G \ fromEdgeSet {s(v, w)}).Reachable v w → ∃ p, s(v, w) ∉ p.edges

case mpr
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
⊢ (∃ p, s(v, w) ∉ p.edges) → (G \ fromEdgeSet {s(v, w)}).Reachable v w

tactic: rintro ⟨p⟩
state_before: case mp
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
⊢ (G \ fromEdgeSet {s(v, w)}).Reachable v w → ∃ p, s(v, w) ∉ p.edges
state_after: case mp.intro
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
p : (G \ fromEdgeSet {s(v, w)}).Walk v w
⊢ ∃ p, s(v, w) ∉ p.edges

tactic: use p.map (Hom.mapSpanningSubgraphs (by simp))
state_before: case mp.intro
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
p : (G \ fromEdgeSet {s(v, w)}).Walk v w
⊢ ∃ p, s(v, w) ∉ p.edges
state_after: case h
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
p : (G \ fromEdgeSet {s(v, w)}).Walk v w
⊢ s(v, w) ∉ (Walk.map (Hom.mapSpanningSubgraphs ⋯) p).edges

tactic: simp_rw [Walk.edges_map, List.mem_map, Hom.mapSpanningSubgraphs_apply, Sym2.map_id', id]
state_before: case h
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
p : (G \ fromEdgeSet {s(v, w)}).Walk v w
⊢ s(v, w) ∉ (Walk.map (Hom.mapSpanningSubgraphs ⋯) p).edges
state_after: case h
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
p : (G \ fromEdgeSet {s(v, w)}).Walk v w
⊢ ¬∃ a ∈ p.edges, a = s(v, w)

tactic: rintro ⟨e, h, rfl⟩
state_before: case h
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
p : (G \ fromEdgeSet {s(v, w)}).Walk v w
⊢ ¬∃ a ∈ p.edges, a = s(v, w)
state_after: case h.intro.intro
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
p : (G \ fromEdgeSet {s(v, w)}).Walk v w
h : s(v, w) ∈ p.edges
⊢ False

tactic: simpa using p.edges_subset_edgeSet h
state_before: case h.intro.intro
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
p : (G \ fromEdgeSet {s(v, w)}).Walk v w
h : s(v, w) ∈ p.edges
⊢ False
state_after: no goals

tactic: simp
state_before: V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
p : (G \ fromEdgeSet {s(v, w)}).Walk v w
⊢ G \ fromEdgeSet {s(v, w)} ≤ G
state_after: no goals

tactic: rintro ⟨p, h⟩
state_before: case mpr
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
⊢ (∃ p, s(v, w) ∉ p.edges) → (G \ fromEdgeSet {s(v, w)}).Reachable v w
state_after: case mpr.intro
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
p : G.Walk v w
h : s(v, w) ∉ p.edges
⊢ (G \ fromEdgeSet {s(v, w)}).Reachable v w

tactic: refine ⟨p.transfer _ fun e ep => ?_⟩
state_before: case mpr.intro
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
p : G.Walk v w
h : s(v, w) ∉ p.edges
⊢ (G \ fromEdgeSet {s(v, w)}).Reachable v w
state_after: case mpr.intro
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
p : G.Walk v w
h : s(v, w) ∉ p.edges
e : Sym2 V
ep : e ∈ p.edges
⊢ e ∈ (G \ fromEdgeSet {s(v, w)}).edgeSet

tactic: simp only [edgeSet_sdiff, edgeSet_fromEdgeSet, edgeSet_sdiff_sdiff_isDiag, Set.mem_diff,
  Set.mem_singleton_iff]
state_before: case mpr.intro
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
p : G.Walk v w
h : s(v, w) ∉ p.edges
e : Sym2 V
ep : e ∈ p.edges
⊢ e ∈ (G \ fromEdgeSet {s(v, w)}).edgeSet
state_after: case mpr.intro
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
p : G.Walk v w
h : s(v, w) ∉ p.edges
e : Sym2 V
ep : e ∈ p.edges
⊢ e ∈ G.edgeSet ∧ ¬e = s(v, w)

tactic: exact ⟨p.edges_subset_edgeSet ep, fun h' => h (h' ▸ ep)⟩
state_before: case mpr.intro
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
v w : V
p : G.Walk v w
h : s(v, w) ∉ p.edges
e : Sym2 V
ep : e ∈ p.edges
⊢ e ∈ G.edgeSet ∧ ¬e = s(v, w)
state_after: no goals