Theorem: CategoryTheory.Groupoid.Free.congr_comp_reverse
File: Mathlib/CategoryTheory/Groupoid/FreeGroupoid.lean

tactic: apply Quot.EqvGen_sound
state_before: V : Type u
inst✝ : Quiver V
X Y : Paths (Quiver.Symmetrify V)
p : X ⟶ Y
⊢ Quot.mk (Quotient.CompClosure redStep) (p ≫ Quiver.Path.reverse p) = Quot.mk (Quotient.CompClosure redStep) (𝟙 X)
state_after: case H
V : Type u
inst✝ : Quiver V
X Y : Paths (Quiver.Symmetrify V)
p : X ⟶ Y
⊢ EqvGen (Quotient.CompClosure redStep) (p ≫ Quiver.Path.reverse p) (𝟙 X)

tactic: induction' p with a b q f ih
state_before: case H
V : Type u
inst✝ : Quiver V
X Y : Paths (Quiver.Symmetrify V)
p : X ⟶ Y
⊢ EqvGen (Quotient.CompClosure redStep) (p ≫ Quiver.Path.reverse p) (𝟙 X)
state_after: case H.nil
V : Type u
inst✝ : Quiver V
X Y : Paths (Quiver.Symmetrify V)
⊢ EqvGen (Quotient.CompClosure redStep) (Quiver.Path.nil ≫ Quiver.Path.nil.reverse) (𝟙 X)

case H.cons
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
⊢ EqvGen (Quotient.CompClosure redStep) (q.cons f ≫ (q.cons f).reverse) (𝟙 X)

tactic: apply EqvGen.refl
state_before: case H.nil
V : Type u
inst✝ : Quiver V
X Y : Paths (Quiver.Symmetrify V)
⊢ EqvGen (Quotient.CompClosure redStep) (Quiver.Path.nil ≫ Quiver.Path.nil.reverse) (𝟙 X)
state_after: no goals

tactic: simp only [Quiver.Path.reverse]
state_before: case H.cons
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
⊢ EqvGen (Quotient.CompClosure redStep) (q.cons f ≫ (q.cons f).reverse) (𝟙 X)
state_after: case H.cons
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
⊢ EqvGen (Quotient.CompClosure redStep) (q.cons f ≫ (Quiver.reverse f).toPath.comp q.reverse) (𝟙 X)

tactic: fapply EqvGen.trans
state_before: case H.cons
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
⊢ EqvGen (Quotient.CompClosure redStep) (q.cons f ≫ (Quiver.reverse f).toPath.comp q.reverse) (𝟙 X)
state_after: case H.cons.y
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
⊢ X ⟶ X

case H.cons.a
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
⊢ EqvGen (Quotient.CompClosure redStep) (q.cons f ≫ (Quiver.reverse f).toPath.comp q.reverse) ?H.cons.y

case H.cons.a
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
⊢ EqvGen (Quotient.CompClosure redStep) ?H.cons.y (𝟙 X)

tactic: exact q ≫ Quiver.Path.reverse q
state_before: case H.cons.y
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
⊢ X ⟶ X
state_after: no goals

tactic: apply EqvGen.symm
state_before: case H.cons.a
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
⊢ EqvGen (Quotient.CompClosure redStep) (q.cons f ≫ (Quiver.reverse f).toPath.comp q.reverse) (q ≫ q.reverse)
state_after: case H.cons.a.a
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
⊢ EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (q.cons f ≫ (Quiver.reverse f).toPath.comp q.reverse)

tactic: apply EqvGen.rel
state_before: case H.cons.a.a
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
⊢ EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (q.cons f ≫ (Quiver.reverse f).toPath.comp q.reverse)
state_after: case H.cons.a.a.a
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
⊢ Quotient.CompClosure redStep (q ≫ q.reverse) (q.cons f ≫ (Quiver.reverse f).toPath.comp q.reverse)

tactic: have : Quotient.CompClosure redStep (q ≫ 𝟙 _ ≫ Quiver.Path.reverse q)
    (q ≫ (Quiver.Hom.toPath f ≫ Quiver.Hom.toPath (Quiver.reverse f)) ≫
      Quiver.Path.reverse q) := by
  apply Quotient.CompClosure.intro
  apply redStep.step
state_before: case H.cons.a.a.a
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
⊢ Quotient.CompClosure redStep (q ≫ q.reverse) (q.cons f ≫ (Quiver.reverse f).toPath.comp q.reverse)
state_after: case H.cons.a.a.a
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
this : Quotient.CompClosure redStep (q ≫ 𝟙 a ≫ q.reverse) (q ≫ (f.toPath ≫ (Quiver.reverse f).toPath) ≫ q.reverse)
⊢ Quotient.CompClosure redStep (q ≫ q.reverse) (q.cons f ≫ (Quiver.reverse f).toPath.comp q.reverse)

tactic: simp only [Category.assoc, Category.id_comp] at this ⊢
state_before: case H.cons.a.a.a
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
this : Quotient.CompClosure redStep (q ≫ 𝟙 a ≫ q.reverse) (q ≫ (f.toPath ≫ (Quiver.reverse f).toPath) ≫ q.reverse)
⊢ Quotient.CompClosure redStep (q ≫ q.reverse) (q.cons f ≫ (Quiver.reverse f).toPath.comp q.reverse)
state_after: case H.cons.a.a.a
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
this : Quotient.CompClosure redStep (q ≫ q.reverse) (q ≫ f.toPath ≫ (Quiver.reverse f).toPath ≫ q.reverse)
⊢ Quotient.CompClosure redStep (q ≫ q.reverse) (q.cons f ≫ (Quiver.reverse f).toPath.comp q.reverse)

tactic: change Quotient.CompClosure redStep (q ≫ Quiver.Path.reverse q)
  (Quiver.Path.cons q f ≫ (Quiver.Hom.toPath (Quiver.reverse f)) ≫ (Quiver.Path.reverse q))
state_before: case H.cons.a.a.a
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
this : Quotient.CompClosure redStep (q ≫ q.reverse) (q ≫ f.toPath ≫ (Quiver.reverse f).toPath ≫ q.reverse)
⊢ Quotient.CompClosure redStep (q ≫ q.reverse) (q.cons f ≫ (Quiver.reverse f).toPath.comp q.reverse)
state_after: case H.cons.a.a.a
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
this : Quotient.CompClosure redStep (q ≫ q.reverse) (q ≫ f.toPath ≫ (Quiver.reverse f).toPath ≫ q.reverse)
⊢ Quotient.CompClosure redStep (q ≫ q.reverse) (q.cons f ≫ (Quiver.reverse f).toPath ≫ q.reverse)

tactic: simp only [← Category.assoc] at this ⊢
state_before: case H.cons.a.a.a
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
this : Quotient.CompClosure redStep (q ≫ q.reverse) (q ≫ f.toPath ≫ (Quiver.reverse f).toPath ≫ q.reverse)
⊢ Quotient.CompClosure redStep (q ≫ q.reverse) (q.cons f ≫ (Quiver.reverse f).toPath ≫ q.reverse)
state_after: case H.cons.a.a.a
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
this : Quotient.CompClosure redStep (q ≫ q.reverse) (((q ≫ f.toPath) ≫ (Quiver.reverse f).toPath) ≫ q.reverse)
⊢ Quotient.CompClosure redStep (q ≫ q.reverse) ((q.cons f ≫ (Quiver.reverse f).toPath) ≫ q.reverse)

tactic: exact this
state_before: case H.cons.a.a.a
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
this : Quotient.CompClosure redStep (q ≫ q.reverse) (((q ≫ f.toPath) ≫ (Quiver.reverse f).toPath) ≫ q.reverse)
⊢ Quotient.CompClosure redStep (q ≫ q.reverse) ((q.cons f ≫ (Quiver.reverse f).toPath) ≫ q.reverse)
state_after: no goals

tactic: apply Quotient.CompClosure.intro
state_before: V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
⊢ Quotient.CompClosure redStep (q ≫ 𝟙 a ≫ q.reverse) (q ≫ (f.toPath ≫ (Quiver.reverse f).toPath) ≫ q.reverse)
state_after: case h
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
⊢ redStep (𝟙 a) (f.toPath ≫ (Quiver.reverse f).toPath)

tactic: apply redStep.step
state_before: case h
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
⊢ redStep (𝟙 a) (f.toPath ≫ (Quiver.reverse f).toPath)
state_after: no goals

tactic: exact ih
state_before: case H.cons.a
V : Type u
inst✝ : Quiver V
X Y a b : Paths (Quiver.Symmetrify V)
q : Quiver.Path X a
f : a ⟶ b
ih : EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
⊢ EqvGen (Quotient.CompClosure redStep) (q ≫ q.reverse) (𝟙 X)
state_after: no goals