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

tactic: induction' p with u' u' v' w' ha p' ih
state_before: V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w : V
p : G.Walk v w
h : u ∈ p.support
x : V
⊢ List.count s(u, x) (p.takeUntil u h).edges ≤ 1
state_after: case nil
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' : V
h : u ∈ nil.support
⊢ List.count s(u, x) (nil.takeUntil u h).edges ≤ 1

case cons
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
h : u ∈ (cons ha p').support
⊢ List.count s(u, x) ((cons ha p').takeUntil u h).edges ≤ 1

tactic: rw [mem_support_nil_iff] at h
state_before: case nil
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' : V
h : u ∈ nil.support
⊢ List.count s(u, x) (nil.takeUntil u h).edges ≤ 1
state_after: case nil
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' : V
h✝ : u ∈ nil.support
h : u = u'
⊢ List.count s(u, x) (nil.takeUntil u h✝).edges ≤ 1

tactic: subst u
state_before: case nil
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' : V
h✝ : u ∈ nil.support
h : u = u'
⊢ List.count s(u, x) (nil.takeUntil u h✝).edges ≤ 1
state_after: case nil
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
v w x u' : V
h : u' ∈ nil.support
⊢ List.count s(u', x) (nil.takeUntil u' h).edges ≤ 1

tactic: simp!
state_before: case nil
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
v w x u' : V
h : u' ∈ nil.support
⊢ List.count s(u', x) (nil.takeUntil u' h).edges ≤ 1
state_after: no goals

tactic: cases h
state_before: case cons
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
h : u ∈ (cons ha p').support
⊢ List.count s(u, x) ((cons ha p').takeUntil u h).edges ≤ 1
state_after: case cons.head
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x v' w' : V
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
ha : G.Adj u v'
⊢ List.count s(u, x) ((cons ha p').takeUntil u ⋯).edges ≤ 1

case cons.tail
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
⊢ List.count s(u, x) ((cons ha p').takeUntil u ⋯).edges ≤ 1

tactic: simp!
state_before: case cons.head
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x v' w' : V
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
ha : G.Adj u v'
⊢ List.count s(u, x) ((cons ha p').takeUntil u ⋯).edges ≤ 1
state_after: no goals

tactic: simp! only
state_before: case cons.tail
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
⊢ List.count s(u, x) ((cons ha p').takeUntil u ⋯).edges ≤ 1
state_after: case cons.tail
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
⊢ List.count s(u, x)
      (if h : u' = u then Eq.rec (motive := fun x x_1 => x ∈ u' :: p'.support → G.Walk u' x) (fun h => nil) ⋯ ⋯
        else cons ha (p'.takeUntil u ⋯)).edges ≤
    1

tactic: split_ifs with h'
state_before: case cons.tail
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
⊢ List.count s(u, x)
      (if h : u' = u then Eq.rec (motive := fun x x_1 => x ∈ u' :: p'.support → G.Walk u' x) (fun h => nil) ⋯ ⋯
        else cons ha (p'.takeUntil u ⋯)).edges ≤
    1
state_after: case pos
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
h' : u' = u
⊢ List.count s(u, x) (Eq.rec (motive := fun x x_1 => x ∈ u' :: p'.support → G.Walk u' x) (fun h => nil) ⋯ ⋯).edges ≤ 1

case neg
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
h' : ¬u' = u
⊢ List.count s(u, x) (cons ha (p'.takeUntil u ⋯)).edges ≤ 1

tactic: subst h'
state_before: case pos
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
h' : u' = u
⊢ List.count s(u, x) (Eq.rec (motive := fun x x_1 => x ∈ u' :: p'.support → G.Walk u' x) (fun h => nil) ⋯ ⋯).edges ≤ 1
state_after: case pos
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u' ∈ p'.support), List.count s(u', x) (p'.takeUntil u' h).edges ≤ 1
a✝ : List.Mem u' p'.support
⊢ List.count s(u', x) (Eq.rec (motive := fun x x_1 => x ∈ u' :: p'.support → G.Walk u' x) (fun h => nil) ⋯ ⋯).edges ≤ 1

tactic: simp
state_before: case pos
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u' ∈ p'.support), List.count s(u', x) (p'.takeUntil u' h).edges ≤ 1
a✝ : List.Mem u' p'.support
⊢ List.count s(u', x) (Eq.rec (motive := fun x x_1 => x ∈ u' :: p'.support → G.Walk u' x) (fun h => nil) ⋯ ⋯).edges ≤ 1
state_after: no goals

tactic: rw [edges_cons, List.count_cons]
state_before: case neg
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
h' : ¬u' = u
⊢ List.count s(u, x) (cons ha (p'.takeUntil u ⋯)).edges ≤ 1
state_after: case neg
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
h' : ¬u' = u
⊢ (List.count s(u, x) (p'.takeUntil u ⋯).edges + if s(u, x) = s(u', v') then 1 else 0) ≤ 1

tactic: split_ifs with h''
state_before: case neg
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
h' : ¬u' = u
⊢ (List.count s(u, x) (p'.takeUntil u ⋯).edges + if s(u, x) = s(u', v') then 1 else 0) ≤ 1
state_after: case pos
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
h' : ¬u' = u
h'' : s(u, x) = s(u', v')
⊢ List.count s(u, x) (p'.takeUntil u ⋯).edges + 1 ≤ 1

case neg
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
h' : ¬u' = u
h'' : ¬s(u, x) = s(u', v')
⊢ List.count s(u, x) (p'.takeUntil u ⋯).edges + 0 ≤ 1

tactic: rw [Sym2.eq_iff] at h''
state_before: case pos
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
h' : ¬u' = u
h'' : s(u, x) = s(u', v')
⊢ List.count s(u, x) (p'.takeUntil u ⋯).edges + 1 ≤ 1
state_after: case pos
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
h' : ¬u' = u
h'' : u = u' ∧ x = v' ∨ u = v' ∧ x = u'
⊢ List.count s(u, x) (p'.takeUntil u ⋯).edges + 1 ≤ 1

tactic: obtain ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩ := h''
state_before: case pos
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
h' : ¬u' = u
h'' : u = u' ∧ x = v' ∨ u = v' ∧ x = u'
⊢ List.count s(u, x) (p'.takeUntil u ⋯).edges + 1 ≤ 1
state_after: case pos.inl.intro
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x w' : V
h' : ¬u = u
p' : G.Walk x w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
ha : G.Adj u x
⊢ List.count s(u, x) (p'.takeUntil u ⋯).edges + 1 ≤ 1

case pos.inr.intro
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x w' : V
p' : G.Walk u w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
h' : ¬x = u
ha : G.Adj x u
⊢ List.count s(u, x) (p'.takeUntil u ⋯).edges + 1 ≤ 1

tactic: exact (h' rfl).elim
state_before: case pos.inl.intro
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x w' : V
h' : ¬u = u
p' : G.Walk x w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
ha : G.Adj u x
⊢ List.count s(u, x) (p'.takeUntil u ⋯).edges + 1 ≤ 1
state_after: no goals

tactic: cases p' <;> simp!
state_before: case pos.inr.intro
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x w' : V
p' : G.Walk u w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
h' : ¬x = u
ha : G.Adj x u
⊢ List.count s(u, x) (p'.takeUntil u ⋯).edges + 1 ≤ 1
state_after: no goals

tactic: apply ih
state_before: case neg
V : Type u
V' : Type v
V'' : Type w
G : SimpleGraph V
G' : SimpleGraph V'
G'' : SimpleGraph V''
u✝ v✝ w✝ x✝ y : V
inst✝ : DecidableEq V
u v w x u' v' w' : V
ha : G.Adj u' v'
p' : G.Walk v' w'
ih : ∀ (h : u ∈ p'.support), List.count s(u, x) (p'.takeUntil u h).edges ≤ 1
a✝ : List.Mem u p'.support
h' : ¬u' = u
h'' : ¬s(u, x) = s(u', v')
⊢ List.count s(u, x) (p'.takeUntil u ⋯).edges + 0 ≤ 1
state_after: no goals