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

Proof steps:
state_before: U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.12154
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Injective (φ.star u)
u : U
⊢ Injective (φ.pathStar u)
state_after: U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.12154
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Injective (φ.star u)
u : U
⊢ Injective fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩
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.12154
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Injective (φ.star u)
u : U
⊢ Injective 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.12154
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Injective (φ.star u)
u v₁ : U
p₁ : Path u v₁
⊢ ∀ ⦃a₂ : PathStar u⦄,
    (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) ⟨v₁, p₁⟩ = (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a₂ → ⟨v₁, p₁⟩ = a₂
tactic: rintro ⟨v₁, p₁⟩
state_before: case mk
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.12154
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Injective (φ.star u)
u v₁ : U
p₁ : Path u v₁
⊢ ∀ ⦃a₂ : PathStar u⦄,
    (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) ⟨v₁, p₁⟩ = (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a₂ → ⟨v₁, p₁⟩ = a₂
state_after: case mk.nil.mk.nil
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.12154
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Injective (φ.star u)
u v₁ : U
h : True
⊢ ⟨u, Path.nil⟩ = ⟨u, Path.nil⟩

case mk.nil.mk.cons
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.12154
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Injective (φ.star u)
u v₁ y₂ x₂ : U
p₂ : Path u x₂
e₂ : x₂ ⟶ y₂
h : φ.obj u = φ.obj y₂ ∧ HEq Path.nil ((φ.mapPath p₂).cons (φ.map e₂))
⊢ ⟨u, Path.nil⟩ = ⟨y₂, p₂.cons e₂⟩

case mk.cons.mk.nil
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.12154
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Injective (φ.star u)
u v₁ x₁ y₁ : U
p₁ : Path u x₁
e₁ : x₁ ⟶ y₁
ih :
  ∀ ⦃a₂ : PathStar u⦄,
    (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) ⟨x₁, p₁⟩ = (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a₂ → ⟨x₁, p₁⟩ = a₂
h : φ.obj y₁ = φ.obj u ∧ HEq ((φ.mapPath p₁).cons (φ.map e₁)) Path.nil
⊢ ⟨y₁, p₁.cons e₁⟩ = ⟨u, Path.nil⟩

case mk.cons.mk.cons
U : Type u_1
inst✝² : Quiver U
V : Type u_2
inst✝¹ : Quiver V
φ : U ⥤q V
W : Type ?u.12154
inst✝ : Quiver W
ψ : V ⥤q W
hφ : ∀ (u : U), Injective (φ.star u)
u v₁ x₁ y₁ : U
p₁ : Path u x₁
e₁ : x₁ ⟶ y₁
ih :
  ∀ ⦃a₂ : PathStar u⦄,
    (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) ⟨x₁, p₁⟩ = (fun p => ⟨φ.obj p.fst, φ.mapPath p.snd⟩) a₂ → ⟨x₁, p₁⟩ = a₂
y₂ x₂ : U
p₂ : Path u x₂
e₂ : x₂ ⟶ y₂
h : φ.obj y₁ = φ.obj y₂ ∧ HEq ((φ.mapPath p₁).cons (φ.map e₁)) ((φ.mapPath p₂).cons (φ.map e₂))
⊢ ⟨y₁, p₁.cons e₁⟩ = ⟨y₂, p₂.cons e₂⟩
tactic: induction' p₁ with x₁ y₁ p₁ e₁ ih <;>
    rintro ⟨y₂, p₂⟩ <;>
    cases' p₂ with x₂ _ p₂ e₂ <;>
    intro h <;>
    -- Porting note: added `Sigma.mk.inj_iff`
    simp only [Prefunctor.pathStar_apply, Prefunctor.mapPath_nil, Prefunctor.mapPath_cons,
      Sigma.mk.inj_iff] at h