Theorem: SimpleGraph.isAcyclic_iff_forall_adj_isBridge
File: Mathlib/Combinatorics/SimpleGraph/Acyclic.lean

tactic: simp_rw [isBridge_iff_adj_and_forall_cycle_not_mem]
state_before: V : Type u
G : SimpleGraph V
⊢ G.IsAcyclic ↔ ∀ ⦃v w : V⦄, G.Adj v w → G.IsBridge s(v, w)
state_after: V : Type u
G : SimpleGraph V
⊢ G.IsAcyclic ↔ ∀ ⦃v w : V⦄, G.Adj v w → G.Adj v w ∧ ∀ ⦃u : V⦄ (p : G.Walk u u), p.IsCycle → s(v, w) ∉ p.edges

tactic: constructor
state_before: V : Type u
G : SimpleGraph V
⊢ G.IsAcyclic ↔ ∀ ⦃v w : V⦄, G.Adj v w → G.Adj v w ∧ ∀ ⦃u : V⦄ (p : G.Walk u u), p.IsCycle → s(v, w) ∉ p.edges
state_after: case mp
V : Type u
G : SimpleGraph V
⊢ G.IsAcyclic → ∀ ⦃v w : V⦄, G.Adj v w → G.Adj v w ∧ ∀ ⦃u : V⦄ (p : G.Walk u u), p.IsCycle → s(v, w) ∉ p.edges

case mpr
V : Type u
G : SimpleGraph V
⊢ (∀ ⦃v w : V⦄, G.Adj v w → G.Adj v w ∧ ∀ ⦃u : V⦄ (p : G.Walk u u), p.IsCycle → s(v, w) ∉ p.edges) → G.IsAcyclic

tactic: intro ha v w hvw
state_before: case mp
V : Type u
G : SimpleGraph V
⊢ G.IsAcyclic → ∀ ⦃v w : V⦄, G.Adj v w → G.Adj v w ∧ ∀ ⦃u : V⦄ (p : G.Walk u u), p.IsCycle → s(v, w) ∉ p.edges
state_after: case mp
V : Type u
G : SimpleGraph V
ha : G.IsAcyclic
v w : V
hvw : G.Adj v w
⊢ G.Adj v w ∧ ∀ ⦃u : V⦄ (p : G.Walk u u), p.IsCycle → s(v, w) ∉ p.edges

tactic: apply And.intro hvw
state_before: case mp
V : Type u
G : SimpleGraph V
ha : G.IsAcyclic
v w : V
hvw : G.Adj v w
⊢ G.Adj v w ∧ ∀ ⦃u : V⦄ (p : G.Walk u u), p.IsCycle → s(v, w) ∉ p.edges
state_after: case mp
V : Type u
G : SimpleGraph V
ha : G.IsAcyclic
v w : V
hvw : G.Adj v w
⊢ ∀ ⦃u : V⦄ (p : G.Walk u u), p.IsCycle → s(v, w) ∉ p.edges

tactic: intro u p hp
state_before: case mp
V : Type u
G : SimpleGraph V
ha : G.IsAcyclic
v w : V
hvw : G.Adj v w
⊢ ∀ ⦃u : V⦄ (p : G.Walk u u), p.IsCycle → s(v, w) ∉ p.edges
state_after: case mp
V : Type u
G : SimpleGraph V
ha : G.IsAcyclic
v w : V
hvw : G.Adj v w
u : V
p : G.Walk u u
hp : p.IsCycle
⊢ s(v, w) ∉ p.edges

tactic: cases ha p hp
state_before: case mp
V : Type u
G : SimpleGraph V
ha : G.IsAcyclic
v w : V
hvw : G.Adj v w
u : V
p : G.Walk u u
hp : p.IsCycle
⊢ s(v, w) ∉ p.edges
state_after: no goals

tactic: rintro hb v (_ | ⟨ha, p⟩) hp
state_before: case mpr
V : Type u
G : SimpleGraph V
⊢ (∀ ⦃v w : V⦄, G.Adj v w → G.Adj v w ∧ ∀ ⦃u : V⦄ (p : G.Walk u u), p.IsCycle → s(v, w) ∉ p.edges) → G.IsAcyclic
state_after: case mpr.nil
V : Type u
G : SimpleGraph V
hb : ∀ ⦃v w : V⦄, G.Adj v w → G.Adj v w ∧ ∀ ⦃u : V⦄ (p : G.Walk u u), p.IsCycle → s(v, w) ∉ p.edges
v : V
hp : nil.IsCycle
⊢ False

case mpr.cons
V : Type u
G : SimpleGraph V
hb : ∀ ⦃v w : V⦄, G.Adj v w → G.Adj v w ∧ ∀ ⦃u : V⦄ (p : G.Walk u u), p.IsCycle → s(v, w) ∉ p.edges
v v✝ : V
ha : G.Adj v v✝
p : G.Walk v✝ v
hp : (cons ha p).IsCycle
⊢ False

tactic: exact hp.not_of_nil
state_before: case mpr.nil
V : Type u
G : SimpleGraph V
hb : ∀ ⦃v w : V⦄, G.Adj v w → G.Adj v w ∧ ∀ ⦃u : V⦄ (p : G.Walk u u), p.IsCycle → s(v, w) ∉ p.edges
v : V
hp : nil.IsCycle
⊢ False
state_after: no goals

tactic: apply (hb ha).2 _ hp
state_before: case mpr.cons
V : Type u
G : SimpleGraph V
hb : ∀ ⦃v w : V⦄, G.Adj v w → G.Adj v w ∧ ∀ ⦃u : V⦄ (p : G.Walk u u), p.IsCycle → s(v, w) ∉ p.edges
v v✝ : V
ha : G.Adj v v✝
p : G.Walk v✝ v
hp : (cons ha p).IsCycle
⊢ False
state_after: case mpr.cons
V : Type u
G : SimpleGraph V
hb : ∀ ⦃v w : V⦄, G.Adj v w → G.Adj v w ∧ ∀ ⦃u : V⦄ (p : G.Walk u u), p.IsCycle → s(v, w) ∉ p.edges
v v✝ : V
ha : G.Adj v v✝
p : G.Walk v✝ v
hp : (cons ha p).IsCycle
⊢ s(v, v✝) ∈ (cons ha p).edges

tactic: rw [Walk.edges_cons]
state_before: case mpr.cons
V : Type u
G : SimpleGraph V
hb : ∀ ⦃v w : V⦄, G.Adj v w → G.Adj v w ∧ ∀ ⦃u : V⦄ (p : G.Walk u u), p.IsCycle → s(v, w) ∉ p.edges
v v✝ : V
ha : G.Adj v v✝
p : G.Walk v✝ v
hp : (cons ha p).IsCycle
⊢ s(v, v✝) ∈ (cons ha p).edges
state_after: case mpr.cons
V : Type u
G : SimpleGraph V
hb : ∀ ⦃v w : V⦄, G.Adj v w → G.Adj v w ∧ ∀ ⦃u : V⦄ (p : G.Walk u u), p.IsCycle → s(v, w) ∉ p.edges
v v✝ : V
ha : G.Adj v v✝
p : G.Walk v✝ v
hp : (cons ha p).IsCycle
⊢ s(v, v✝) ∈ s(v, v✝) :: p.edges

tactic: apply List.mem_cons_self
state_before: case mpr.cons
V : Type u
G : SimpleGraph V
hb : ∀ ⦃v w : V⦄, G.Adj v w → G.Adj v w ∧ ∀ ⦃u : V⦄ (p : G.Walk u u), p.IsCycle → s(v, w) ∉ p.edges
v v✝ : V
ha : G.Adj v v✝
p : G.Walk v✝ v
hp : (cons ha p).IsCycle
⊢ s(v, v✝) ∈ s(v, v✝) :: p.edges
state_after: no goals