-- Mathlib/Combinatorics/SimpleGraph/Path.lean
theorem IsPath.of_map {f : G →g G'} (hp : (p.map f).IsPath) : p.IsPath

Proof state:
case cons
V : Type u
V' : Type v
G : SimpleGraph V
G' : SimpleGraph V'
u v : V
p : G.Walk u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : G.Walk v✝ w✝
ih : (Walk.map f p✝).IsPath → p✝.IsPath
hp : (Walk.map f (cons h✝ p✝)).IsPath
⊢ (cons h✝ p✝).IsPath

Tactic:
rw [map_cons, Walk.cons_isPath_iff, support_map] at hp

Result:
case cons
V : Type u
V' : Type v
G : SimpleGraph V
G' : SimpleGraph V'
u v : V
p : G.Walk u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : G.Walk v✝ w✝
ih : (Walk.map f p✝).IsPath → p✝.IsPath
hp : (Walk.map f p✝).IsPath ∧ f u✝ ∉ List.map (⇑f) p✝.support
⊢ (cons h✝ p✝).IsPath

Proof state:
case cons
V : Type u
V' : Type v
G : SimpleGraph V
G' : SimpleGraph V'
u v : V
p : G.Walk u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : G.Walk v✝ w✝
ih : (Walk.map f p✝).IsPath → p✝.IsPath
hp : (Walk.map f p✝).IsPath ∧ f u✝ ∉ List.map (⇑f) p✝.support
⊢ (cons h✝ p✝).IsPath

Tactic:
rw [Walk.cons_isPath_iff]

Result:
case cons
V : Type u
V' : Type v
G : SimpleGraph V
G' : SimpleGraph V'
u v : V
p : G.Walk u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : G.Walk v✝ w✝
ih : (Walk.map f p✝).IsPath → p✝.IsPath
hp : (Walk.map f p✝).IsPath ∧ f u✝ ∉ List.map (⇑f) p✝.support
⊢ p✝.IsPath ∧ u✝ ∉ p✝.support

Proof state:
case nil
V : Type u
V' : Type v
G : SimpleGraph V
G' : SimpleGraph V'
u v : V
p : G.Walk u v
f : G →g G'
u✝ : V
hp : (Walk.map f Walk.nil).IsPath
⊢ Walk.nil.IsPath

Tactic:
simp

Result:
no goals

Proof state:
case cons.intro
V : Type u
V' : Type v
G : SimpleGraph V
G' : SimpleGraph V'
u v : V
p : G.Walk u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : G.Walk v✝ w✝
ih : (Walk.map f p✝).IsPath → p✝.IsPath
hp1 : (Walk.map f p✝).IsPath
hp2 : f u✝ ∉ List.map (⇑f) p✝.support
⊢ u✝ ∉ p✝.support

Tactic:
contrapose! hp2

Result:
case cons.intro
V : Type u
V' : Type v
G : SimpleGraph V
G' : SimpleGraph V'
u v : V
p : G.Walk u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : G.Walk v✝ w✝
ih : (Walk.map f p✝).IsPath → p✝.IsPath
hp1 : (Walk.map f p✝).IsPath
hp2 : u✝ ∈ p✝.support
⊢ f u✝ ∈ List.map (⇑f) p✝.support

Proof state:
case cons
V : Type u
V' : Type v
G : SimpleGraph V
G' : SimpleGraph V'
u v : V
p : G.Walk u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : G.Walk v✝ w✝
ih : (Walk.map f p✝).IsPath → p✝.IsPath
hp : (Walk.map f p✝).IsPath ∧ f u✝ ∉ List.map (⇑f) p✝.support
⊢ p✝.IsPath ∧ u✝ ∉ p✝.support

Tactic:
obtain ⟨hp1, hp2⟩ := hp

Result:
case cons.intro
V : Type u
V' : Type v
G : SimpleGraph V
G' : SimpleGraph V'
u v : V
p : G.Walk u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : G.Walk v✝ w✝
ih : (Walk.map f p✝).IsPath → p✝.IsPath
hp1 : (Walk.map f p✝).IsPath
hp2 : f u✝ ∉ List.map (⇑f) p✝.support
⊢ p✝.IsPath ∧ u✝ ∉ p✝.support

Proof state:
case cons.intro
V : Type u
V' : Type v
G : SimpleGraph V
G' : SimpleGraph V'
u v : V
p : G.Walk u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : G.Walk v✝ w✝
ih : (Walk.map f p✝).IsPath → p✝.IsPath
hp1 : (Walk.map f p✝).IsPath
hp2 : f u✝ ∉ List.map (⇑f) p✝.support
⊢ p✝.IsPath ∧ u✝ ∉ p✝.support

Tactic:
refine ⟨ih hp1, ?_⟩

Result:
case cons.intro
V : Type u
V' : Type v
G : SimpleGraph V
G' : SimpleGraph V'
u v : V
p : G.Walk u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : G.Walk v✝ w✝
ih : (Walk.map f p✝).IsPath → p✝.IsPath
hp1 : (Walk.map f p✝).IsPath
hp2 : f u✝ ∉ List.map (⇑f) p✝.support
⊢ u✝ ∉ p✝.support

Proof state:
V : Type u
V' : Type v
G : SimpleGraph V
G' : SimpleGraph V'
u v : V
p : G.Walk u v
f : G →g G'
hp : (Walk.map f p).IsPath
⊢ p.IsPath

Tactic:
induction p with
| nil => simp
| cons _ _ ih =>
  rw [map_cons, Walk.cons_isPath_iff, support_map] at hp
  rw [Walk.cons_isPath_iff]
  obtain ⟨hp1, hp2⟩ := hp
  refine ⟨ih hp1, ?_⟩
  contrapose! hp2
  exact List.mem_map_of_mem f hp2

Result:
no goals

Proof state:
case cons.intro
V : Type u
V' : Type v
G : SimpleGraph V
G' : SimpleGraph V'
u v : V
p : G.Walk u v
f : G →g G'
u✝ v✝ w✝ : V
h✝ : G.Adj u✝ v✝
p✝ : G.Walk v✝ w✝
ih : (Walk.map f p✝).IsPath → p✝.IsPath
hp1 : (Walk.map f p✝).IsPath
hp2 : u✝ ∈ p✝.support
⊢ f u✝ ∈ List.map (⇑f) p✝.support

Tactic:
exact List.mem_map_of_mem f hp2

Result:
no goals