Theorem: Prefunctor.pathStar_surjective
File: Mathlib/Combinatorics/Quiver/Covering.lean

tactic: dsimp (config := { unfoldPartialApp := true }) [Prefunctor.pathStar, Quiver.PathStar.mk]
state_before: U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
⊢ Surjective (φ.pathStar u)
state_after: U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
⊢ Surjective fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩

tactic: rintro ⟨v, p⟩
state_before: U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
⊢ Surjective fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩
state_after: case mk
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v : V
p : Path (φ.obj u) v
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨v, p⟩

tactic: induction' p with v' v'' p' ev ih
state_before: case mk
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v : V
p : Path (φ.obj u) v
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨v, p⟩
state_after: case mk.nil
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v : V
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨φ.obj u, Path.nil⟩

case mk.cons
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v v' v'' : V
p' : Path (φ.obj u) v'
ev : v' ⟶ v''
ih : ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨v', p'⟩
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨v'', p'.cons ev⟩

tactic: use ⟨u, Path.nil⟩
state_before: case mk.nil
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v : V
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨φ.obj u, Path.nil⟩
state_after: case h
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v : V
⊢ (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) ⟨u, Path.nil⟩ = ⟨φ.obj u, Path.nil⟩

tactic: simp only [Prefunctor.mapPath_nil, eq_self_iff_true, heq_iff_eq, and_self_iff]
state_before: case h
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v : V
⊢ (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) ⟨u, Path.nil⟩ = ⟨φ.obj u, Path.nil⟩
state_after: no goals

tactic: obtain ⟨⟨u', q'⟩, h⟩ := ih
state_before: case mk.cons
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v v' v'' : V
p' : Path (φ.obj u) v'
ev : v' ⟶ v''
ih : ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨v', p'⟩
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨v'', p'.cons ev⟩
state_after: case mk.cons.intro.mk
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v v' v'' : V
p' : Path (φ.obj u) v'
ev : v' ⟶ v''
u' : U
q' : Path u u'
h : (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) ⟨u', q'⟩ = ⟨v', p'⟩
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨v'', p'.cons ev⟩

tactic: simp only at h
state_before: case mk.cons.intro.mk
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v v' v'' : V
p' : Path (φ.obj u) v'
ev : v' ⟶ v''
u' : U
q' : Path u u'
h : (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) ⟨u', q'⟩ = ⟨v', p'⟩
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨v'', p'.cons ev⟩
state_after: case mk.cons.intro.mk
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v v' v'' : V
p' : Path (φ.obj u) v'
ev : v' ⟶ v''
u' : U
q' : Path u u'
h : ⟨φ.obj u', φ.mapPath q'⟩ = ⟨v', p'⟩
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨v'', p'.cons ev⟩

tactic: obtain ⟨rfl, rfl⟩ := h
state_before: case mk.cons.intro.mk
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v v' v'' : V
p' : Path (φ.obj u) v'
ev : v' ⟶ v''
u' : U
q' : Path u u'
h : ⟨φ.obj u', φ.mapPath q'⟩ = ⟨v', p'⟩
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨v'', p'.cons ev⟩
state_after: case mk.cons.intro.mk.refl
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v v'' : V
u' : U
q' : Path u u'
ev : φ.obj u' ⟶ v''
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨v'', (φ.mapPath q').cons ev⟩

tactic: obtain ⟨⟨u'', eu⟩, k⟩ := hφ u' ⟨_, ev⟩
state_before: case mk.cons.intro.mk.refl
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v v'' : V
u' : U
q' : Path u u'
ev : φ.obj u' ⟶ v''
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨v'', (φ.mapPath q').cons ev⟩
state_after: case mk.cons.intro.mk.refl.intro.mk
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v v'' : V
u' : U
q' : Path u u'
ev : φ.obj u' ⟶ v''
u'' : U
eu : u' ⟶ u''
k : φ.star u' ⟨u'', eu⟩ = ⟨v'', ev⟩
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨v'', (φ.mapPath q').cons ev⟩

tactic: simp only [star_apply, Sigma.mk.inj_iff] at k
state_before: case mk.cons.intro.mk.refl.intro.mk
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v v'' : V
u' : U
q' : Path u u'
ev : φ.obj u' ⟶ v''
u'' : U
eu : u' ⟶ u''
k : φ.star u' ⟨u'', eu⟩ = ⟨v'', ev⟩
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨v'', (φ.mapPath q').cons ev⟩
state_after: case mk.cons.intro.mk.refl.intro.mk
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v v'' : V
u' : U
q' : Path u u'
ev : φ.obj u' ⟶ v''
u'' : U
eu : u' ⟶ u''
k : φ.obj u'' = v'' ∧ HEq (φ.map eu) ev
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨v'', (φ.mapPath q').cons ev⟩

tactic: obtain ⟨rfl, k⟩ := k
state_before: case mk.cons.intro.mk.refl.intro.mk
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v v'' : V
u' : U
q' : Path u u'
ev : φ.obj u' ⟶ v''
u'' : U
eu : u' ⟶ u''
k : φ.obj u'' = v'' ∧ HEq (φ.map eu) ev
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨v'', (φ.mapPath q').cons ev⟩
state_after: case mk.cons.intro.mk.refl.intro.mk.intro
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v : V
u' : U
q' : Path u u'
u'' : U
eu : u' ⟶ u''
ev : φ.obj u' ⟶ φ.obj u''
k : HEq (φ.map eu) ev
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨φ.obj u'', (φ.mapPath q').cons ev⟩

tactic: simp only [heq_eq_eq] at k
state_before: case mk.cons.intro.mk.refl.intro.mk.intro
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v : V
u' : U
q' : Path u u'
u'' : U
eu : u' ⟶ u''
ev : φ.obj u' ⟶ φ.obj u''
k : HEq (φ.map eu) ev
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨φ.obj u'', (φ.mapPath q').cons ev⟩
state_after: case mk.cons.intro.mk.refl.intro.mk.intro
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v : V
u' : U
q' : Path u u'
u'' : U
eu : u' ⟶ u''
ev : φ.obj u' ⟶ φ.obj u''
k : φ.map eu = ev
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨φ.obj u'', (φ.mapPath q').cons ev⟩

tactic: subst k
state_before: case mk.cons.intro.mk.refl.intro.mk.intro
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v : V
u' : U
q' : Path u u'
u'' : U
eu : u' ⟶ u''
ev : φ.obj u' ⟶ φ.obj u''
k : φ.map eu = ev
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨φ.obj u'', (φ.mapPath q').cons ev⟩
state_after: case mk.cons.intro.mk.refl.intro.mk.intro
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v : V
u' : U
q' : Path u u'
u'' : U
eu : u' ⟶ u''
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨φ.obj u'', (φ.mapPath q').cons (φ.map eu)⟩

tactic: use ⟨_, q'.cons eu⟩
state_before: case mk.cons.intro.mk.refl.intro.mk.intro
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v : V
u' : U
q' : Path u u'
u'' : U
eu : u' ⟶ u''
⊢ ∃ a, (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a = ⟨φ.obj u'', (φ.mapPath q').cons (φ.map eu)⟩
state_after: case h
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v : V
u' : U
q' : Path u u'
u'' : U
eu : u' ⟶ u''
⊢ (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) ⟨u'', q'.cons eu⟩ = ⟨φ.obj u'', (φ.mapPath q').cons (φ.map eu)⟩

tactic: simp only [Prefunctor.mapPath_cons, eq_self_iff_true, heq_iff_eq, and_self_iff]
state_before: case h
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.15180
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Surjective (φ.star u)
u : U
v : V
u' : U
q' : Path u u'
u'' : U
eu : u' ⟶ u''
⊢ (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) ⟨u'', q'.cons eu⟩ = ⟨φ.obj u'', (φ.mapPath q').cons (φ.map eu)⟩
state_after: no goals