Theorem: SimpleGraph.Walk.bypass_eq_self_of_length_le
File: Mathlib/Combinatorics/SimpleGraph/Connectivity.lean

tactic: rfl
state_before: case nil
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝ : DecidableEq V
u v u✝ : V
h : nil.length ≤ nil.bypass.length
⊢ nil.bypass = nil
state_after: no goals

tactic: simp only [Walk.bypass]
state_before: case cons
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝ : DecidableEq V
u v u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p : G.Walk v✝ w✝
ih : p.length ≤ p.bypass.length → p.bypass = p
h : (cons h✝ p).length ≤ (cons h✝ p).bypass.length
⊢ (cons h✝ p).bypass = cons h✝ p
state_after: case cons
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝ : DecidableEq V
u v u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p : G.Walk v✝ w✝
ih : p.length ≤ p.bypass.length → p.bypass = p
h : (cons h✝ p).length ≤ (cons h✝ p).bypass.length
⊢ (if hs : u✝ ∈ p.bypass.support then p.bypass.dropUntil u✝ hs else cons h✝ p.bypass) = cons h✝ p

tactic: split_ifs with hb
state_before: case cons
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝ : DecidableEq V
u v u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p : G.Walk v✝ w✝
ih : p.length ≤ p.bypass.length → p.bypass = p
h : (cons h✝ p).length ≤ (cons h✝ p).bypass.length
⊢ (if hs : u✝ ∈ p.bypass.support then p.bypass.dropUntil u✝ hs else cons h✝ p.bypass) = cons h✝ p
state_after: case pos
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝ : DecidableEq V
u v u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p : G.Walk v✝ w✝
ih : p.length ≤ p.bypass.length → p.bypass = p
h : (cons h✝ p).length ≤ (cons h✝ p).bypass.length
hb : u✝ ∈ p.bypass.support
⊢ p.bypass.dropUntil u✝ hb = cons h✝ p

case neg
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝ : DecidableEq V
u v u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p : G.Walk v✝ w✝
ih : p.length ≤ p.bypass.length → p.bypass = p
h : (cons h✝ p).length ≤ (cons h✝ p).bypass.length
hb : u✝ ∉ p.bypass.support
⊢ cons h✝ p.bypass = cons h✝ p

tactic: exfalso
state_before: case pos
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝ : DecidableEq V
u v u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p : G.Walk v✝ w✝
ih : p.length ≤ p.bypass.length → p.bypass = p
h : (cons h✝ p).length ≤ (cons h✝ p).bypass.length
hb : u✝ ∈ p.bypass.support
⊢ p.bypass.dropUntil u✝ hb = cons h✝ p
state_after: case pos
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝ : DecidableEq V
u v u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p : G.Walk v✝ w✝
ih : p.length ≤ p.bypass.length → p.bypass = p
h : (cons h✝ p).length ≤ (cons h✝ p).bypass.length
hb : u✝ ∈ p.bypass.support
⊢ False

tactic: simp only [hb, Walk.bypass, Walk.length_cons, dif_pos] at h
state_before: case pos
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝ : DecidableEq V
u v u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p : G.Walk v✝ w✝
ih : p.length ≤ p.bypass.length → p.bypass = p
h : (cons h✝ p).length ≤ (cons h✝ p).bypass.length
hb : u✝ ∈ p.bypass.support
⊢ False
state_after: case pos
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝ : DecidableEq V
u v u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p : G.Walk v✝ w✝
ih : p.length ≤ p.bypass.length → p.bypass = p
hb : u✝ ∈ p.bypass.support
h : p.length + 1 ≤ (p.bypass.dropUntil u✝ ⋯).length
⊢ False

tactic: apply Nat.not_succ_le_self p.length
state_before: case pos
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝ : DecidableEq V
u v u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p : G.Walk v✝ w✝
ih : p.length ≤ p.bypass.length → p.bypass = p
hb : u✝ ∈ p.bypass.support
h : p.length + 1 ≤ (p.bypass.dropUntil u✝ ⋯).length
⊢ False
state_after: case pos
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝ : DecidableEq V
u v u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p : G.Walk v✝ w✝
ih : p.length ≤ p.bypass.length → p.bypass = p
hb : u✝ ∈ p.bypass.support
h : p.length + 1 ≤ (p.bypass.dropUntil u✝ ⋯).length
⊢ p.length.succ ≤ p.length

tactic: calc p.length + 1
  _ ≤ (p.bypass.dropUntil _ _).length := h
  _ ≤ p.bypass.length := Walk.length_dropUntil_le p.bypass hb
  _ ≤ p.length := Walk.length_bypass_le _
state_before: case pos
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝ : DecidableEq V
u v u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p : G.Walk v✝ w✝
ih : p.length ≤ p.bypass.length → p.bypass = p
hb : u✝ ∈ p.bypass.support
h : p.length + 1 ≤ (p.bypass.dropUntil u✝ ⋯).length
⊢ p.length.succ ≤ p.length
state_after: no goals

tactic: simp only [hb, Walk.bypass, Walk.length_cons, not_false_iff, dif_neg,
  Nat.add_le_add_iff_right] at h
state_before: case neg
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝ : DecidableEq V
u v u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p : G.Walk v✝ w✝
ih : p.length ≤ p.bypass.length → p.bypass = p
h : (cons h✝ p).length ≤ (cons h✝ p).bypass.length
hb : u✝ ∉ p.bypass.support
⊢ cons h✝ p.bypass = cons h✝ p
state_after: case neg
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝ : DecidableEq V
u v u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p : G.Walk v✝ w✝
ih : p.length ≤ p.bypass.length → p.bypass = p
hb : u✝ ∉ p.bypass.support
h : p.length ≤ p.bypass.length
⊢ cons h✝ p.bypass = cons h✝ p

tactic: rw [ih h]
state_before: case neg
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
inst✝ : DecidableEq V
u v u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p : G.Walk v✝ w✝
ih : p.length ≤ p.bypass.length → p.bypass = p
hb : u✝ ∉ p.bypass.support
h : p.length ≤ p.bypass.length
⊢ cons h✝ p.bypass = cons h✝ p
state_after: no goals