Theorem: Digraph.Walk.IsPath.of_map (GraphProjects/DigraphConnectivity.lean)

State before:
V : Type u
V' : Type v
V'' : Type w
G : Digraph V
G' : Digraph V'
G'' : Digraph V''
f✝ : G →g G'
f' : G' →g G''
u v u' v' : V
p : Walk G u v
f : G →g G'
hp : IsPath (Walk.map f p)
⊢ IsPath p
Tactic:
induction p with
| nil => simp
| cons _ _ ih =>
  rw [map_cons, Walk.cons_isPath_iff, support_map] at hp
  rw [Walk.cons_isPath_iff]
  cases' hp with hp1 hp2
  refine' ⟨ih hp1, _⟩
  contrapose! hp2
  exact List.mem_map_of_mem f hp2
State after:
no goals

State before:
case nil
V : Type u
V' : Type v
V'' : Type w
G : Digraph V
G' : Digraph V'
G'' : Digraph V''
f✝ : G →g G'
f' : G' →g G''
u v u' v' : V
p : Walk G u v
f : G →g G'
u✝ : V
hp : IsPath (Walk.map f Walk.nil)
⊢ IsPath Walk.nil
Tactic:
simp
State after:
no goals

State before:
case cons
V : Type u
V' : Type v
V'' : Type w
G : Digraph V
G' : Digraph V'
G'' : Digraph V''
f✝ : G →g G'
f' : G' →g G''
u v u' v' : V
p : Walk G u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : Walk G v✝ w✝
ih : IsPath (Walk.map f p✝) → IsPath p✝
hp : IsPath (Walk.map f (cons h✝ p✝))
⊢ IsPath (cons h✝ p✝)
Tactic:
rw [map_cons, Walk.cons_isPath_iff, support_map] at hp
State after:
case cons
V : Type u
V' : Type v
V'' : Type w
G : Digraph V
G' : Digraph V'
G'' : Digraph V''
f✝ : G →g G'
f' : G' →g G''
u v u' v' : V
p : Walk G u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : Walk G v✝ w✝
ih : IsPath (Walk.map f p✝) → IsPath p✝
hp : IsPath (Walk.map f p✝) ∧ ¬↑f u✝ ∈ List.map (↑f) (support p✝)
⊢ IsPath (cons h✝ p✝)

State before:
case cons
V : Type u
V' : Type v
V'' : Type w
G : Digraph V
G' : Digraph V'
G'' : Digraph V''
f✝ : G →g G'
f' : G' →g G''
u v u' v' : V
p : Walk G u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : Walk G v✝ w✝
ih : IsPath (Walk.map f p✝) → IsPath p✝
hp : IsPath (Walk.map f p✝) ∧ ¬↑f u✝ ∈ List.map (↑f) (support p✝)
⊢ IsPath (cons h✝ p✝)
Tactic:
rw [Walk.cons_isPath_iff]
State after:
case cons
V : Type u
V' : Type v
V'' : Type w
G : Digraph V
G' : Digraph V'
G'' : Digraph V''
f✝ : G →g G'
f' : G' →g G''
u v u' v' : V
p : Walk G u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : Walk G v✝ w✝
ih : IsPath (Walk.map f p✝) → IsPath p✝
hp : IsPath (Walk.map f p✝) ∧ ¬↑f u✝ ∈ List.map (↑f) (support p✝)
⊢ IsPath p✝ ∧ ¬u✝ ∈ support p✝

State before:
case cons
V : Type u
V' : Type v
V'' : Type w
G : Digraph V
G' : Digraph V'
G'' : Digraph V''
f✝ : G →g G'
f' : G' →g G''
u v u' v' : V
p : Walk G u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : Walk G v✝ w✝
ih : IsPath (Walk.map f p✝) → IsPath p✝
hp : IsPath (Walk.map f p✝) ∧ ¬↑f u✝ ∈ List.map (↑f) (support p✝)
⊢ IsPath p✝ ∧ ¬u✝ ∈ support p✝
Tactic:
cases' hp with hp1 hp2
State after:
case cons.intro
V : Type u
V' : Type v
V'' : Type w
G : Digraph V
G' : Digraph V'
G'' : Digraph V''
f✝ : G →g G'
f' : G' →g G''
u v u' v' : V
p : Walk G u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : Walk G v✝ w✝
ih : IsPath (Walk.map f p✝) → IsPath p✝
hp1 : IsPath (Walk.map f p✝)
hp2 : ¬↑f u✝ ∈ List.map (↑f) (support p✝)
⊢ IsPath p✝ ∧ ¬u✝ ∈ support p✝

State before:
case cons.intro
V : Type u
V' : Type v
V'' : Type w
G : Digraph V
G' : Digraph V'
G'' : Digraph V''
f✝ : G →g G'
f' : G' →g G''
u v u' v' : V
p : Walk G u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : Walk G v✝ w✝
ih : IsPath (Walk.map f p✝) → IsPath p✝
hp1 : IsPath (Walk.map f p✝)
hp2 : ¬↑f u✝ ∈ List.map (↑f) (support p✝)
⊢ IsPath p✝ ∧ ¬u✝ ∈ support p✝
Tactic:
refine' ⟨ih hp1, _⟩
State after:
case cons.intro
V : Type u
V' : Type v
V'' : Type w
G : Digraph V
G' : Digraph V'
G'' : Digraph V''
f✝ : G →g G'
f' : G' →g G''
u v u' v' : V
p : Walk G u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : Walk G v✝ w✝
ih : IsPath (Walk.map f p✝) → IsPath p✝
hp1 : IsPath (Walk.map f p✝)
hp2 : ¬↑f u✝ ∈ List.map (↑f) (support p✝)
⊢ ¬u✝ ∈ support p✝

State before:
case cons.intro
V : Type u
V' : Type v
V'' : Type w
G : Digraph V
G' : Digraph V'
G'' : Digraph V''
f✝ : G →g G'
f' : G' →g G''
u v u' v' : V
p : Walk G u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : Walk G v✝ w✝
ih : IsPath (Walk.map f p✝) → IsPath p✝
hp1 : IsPath (Walk.map f p✝)
hp2 : ¬↑f u✝ ∈ List.map (↑f) (support p✝)
⊢ ¬u✝ ∈ support p✝
Tactic:
contrapose! hp2
State after:
case cons.intro
V : Type u
V' : Type v
V'' : Type w
G : Digraph V
G' : Digraph V'
G'' : Digraph V''
f✝ : G →g G'
f' : G' →g G''
u v u' v' : V
p : Walk G u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : Walk G v✝ w✝
ih : IsPath (Walk.map f p✝) → IsPath p✝
hp1 : IsPath (Walk.map f p✝)
hp2 : u✝ ∈ support p✝
⊢ ↑f u✝ ∈ List.map (↑f) (support p✝)

State before:
case cons.intro
V : Type u
V' : Type v
V'' : Type w
G : Digraph V
G' : Digraph V'
G'' : Digraph V''
f✝ : G →g G'
f' : G' →g G''
u v u' v' : V
p : Walk G u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : Walk G v✝ w✝
ih : IsPath (Walk.map f p✝) → IsPath p✝
hp1 : IsPath (Walk.map f p✝)
hp2 : u✝ ∈ support p✝
⊢ ↑f u✝ ∈ List.map (↑f) (support p✝)
Tactic:
exact List.mem_map_of_mem f hp2
State after:
no goals