Theorem: IsFreeGroupoid.SpanningTree.functorOfMonoidHom_map
File: Mathlib/GroupTheory/FreeGroup/NielsenSchreier.lean

Proof steps:
state_before: G : Type u
inst✝³ : Groupoid G
inst✝² : IsFreeGroupoid G
T : WideSubquiver (Symmetrify (Generators G))
inst✝¹ : Arborescence (WideSubquiver.toType (Symmetrify (Generators G)) T)
X : Type ?u.22662
inst✝ : Monoid X
f : End (IsFreeGroupoid.SpanningTree.root' T) →* X
⊢ ∀ (X_1 : G),
    { obj := fun x => (), map := fun {X_2 Y} p => f (loopOfHom T p) }.map (𝟙 X_1) =
      𝟙 ({ obj := fun x => (), map := fun {X_2 Y} p => f (loopOfHom T p) }.obj X_1)
state_after: G : Type u
inst✝³ : Groupoid G
inst✝² : IsFreeGroupoid G
T : WideSubquiver (Symmetrify (Generators G))
inst✝¹ : Arborescence (WideSubquiver.toType (Symmetrify (Generators G)) T)
X : Type ?u.22662
inst✝ : Monoid X
f : End (IsFreeGroupoid.SpanningTree.root' T) →* X
a : G
⊢ { obj := fun x => (), map := fun {X_1 Y} p => f (loopOfHom T p) }.map (𝟙 a) =
    𝟙 ({ obj := fun x => (), map := fun {X_1 Y} p => f (loopOfHom T p) }.obj a)
tactic: intro a
state_before: G : Type u
inst✝³ : Groupoid G
inst✝² : IsFreeGroupoid G
T : WideSubquiver (Symmetrify (Generators G))
inst✝¹ : Arborescence (WideSubquiver.toType (Symmetrify (Generators G)) T)
X : Type ?u.22662
inst✝ : Monoid X
f : End (IsFreeGroupoid.SpanningTree.root' T) →* X
a : G
⊢ { obj := fun x => (), map := fun {X_1 Y} p => f (loopOfHom T p) }.map (𝟙 a) =
    𝟙 ({ obj := fun x => (), map := fun {X_1 Y} p => f (loopOfHom T p) }.obj a)
state_after: G : Type u
inst✝³ : Groupoid G
inst✝² : IsFreeGroupoid G
T : WideSubquiver (Symmetrify (Generators G))
inst✝¹ : Arborescence (WideSubquiver.toType (Symmetrify (Generators G)) T)
X : Type ?u.22662
inst✝ : Monoid X
f : End (IsFreeGroupoid.SpanningTree.root' T) →* X
a : G
⊢ f (treeHom T a ≫ 𝟙 a ≫ inv (treeHom T a)) = 𝟙 ()
tactic: dsimp only [loopOfHom]
state_before: G : Type u
inst✝³ : Groupoid G
inst✝² : IsFreeGroupoid G
T : WideSubquiver (Symmetrify (Generators G))
inst✝¹ : Arborescence (WideSubquiver.toType (Symmetrify (Generators G)) T)
X : Type ?u.22662
inst✝ : Monoid X
f : End (IsFreeGroupoid.SpanningTree.root' T) →* X
a : G
⊢ f (treeHom T a ≫ 𝟙 a ≫ inv (treeHom T a)) = 𝟙 ()
state_after: no goals
tactic: rw [Category.id_comp, IsIso.hom_inv_id, ← End.one_def, f.map_one, id_as_one]
state_before: G : Type u
inst✝³ : Groupoid G
inst✝² : IsFreeGroupoid G
T : WideSubquiver (Symmetrify (Generators G))
inst✝¹ : Arborescence (WideSubquiver.toType (Symmetrify (Generators G)) T)
X : Type ?u.22662
inst✝ : Monoid X
f : End (IsFreeGroupoid.SpanningTree.root' T) →* X
⊢ ∀ {X_1 Y Z : G} (f_1 : X_1 ⟶ Y) (g : Y ⟶ Z),
    { obj := fun x => (), map := fun {X_2 Y} p => f (loopOfHom T p) }.map (f_1 ≫ g) =
      { obj := fun x => (), map := fun {X_2 Y} p => f (loopOfHom T p) }.map f_1 ≫
        { obj := fun x => (), map := fun {X_2 Y} p => f (loopOfHom T p) }.map g
state_after: G : Type u
inst✝³ : Groupoid G
inst✝² : IsFreeGroupoid G
T : WideSubquiver (Symmetrify (Generators G))
inst✝¹ : Arborescence (WideSubquiver.toType (Symmetrify (Generators G)) T)
X : Type ?u.22662
inst✝ : Monoid X
f : End (IsFreeGroupoid.SpanningTree.root' T) →* X
X✝ Y✝ Z✝ : G
f✝ : X✝ ⟶ Y✝
g✝ : Y✝ ⟶ Z✝
⊢ { obj := fun x => (), map := fun {X_1 Y} p => f (loopOfHom T p) }.map (f✝ ≫ g✝) =
    { obj := fun x => (), map := fun {X_1 Y} p => f (loopOfHom T p) }.map f✝ ≫
      { obj := fun x => (), map := fun {X_1 Y} p => f (loopOfHom T p) }.map g✝
tactic: intros
state_before: G : Type u
inst✝³ : Groupoid G
inst✝² : IsFreeGroupoid G
T : WideSubquiver (Symmetrify (Generators G))
inst✝¹ : Arborescence (WideSubquiver.toType (Symmetrify (Generators G)) T)
X : Type ?u.22662
inst✝ : Monoid X
f : End (IsFreeGroupoid.SpanningTree.root' T) →* X
X✝ Y✝ Z✝ : G
f✝ : X✝ ⟶ Y✝
g✝ : Y✝ ⟶ Z✝
⊢ { obj := fun x => (), map := fun {X_1 Y} p => f (loopOfHom T p) }.map (f✝ ≫ g✝) =
    { obj := fun x => (), map := fun {X_1 Y} p => f (loopOfHom T p) }.map f✝ ≫
      { obj := fun x => (), map := fun {X_1 Y} p => f (loopOfHom T p) }.map g✝
state_after: G : Type u
inst✝³ : Groupoid G
inst✝² : IsFreeGroupoid G
T : WideSubquiver (Symmetrify (Generators G))
inst✝¹ : Arborescence (WideSubquiver.toType (Symmetrify (Generators G)) T)
X : Type ?u.22662
inst✝ : Monoid X
f : End (IsFreeGroupoid.SpanningTree.root' T) →* X
X✝ Y✝ Z✝ : G
f✝ : X✝ ⟶ Y✝
g✝ : Y✝ ⟶ Z✝
⊢ { obj := fun x => (), map := fun {X_1 Y} p => f (loopOfHom T p) }.map (f✝ ≫ g✝) = f (loopOfHom T g✝ * loopOfHom T f✝)
tactic: rw [comp_as_mul, ← f.map_mul]
state_before: G : Type u
inst✝³ : Groupoid G
inst✝² : IsFreeGroupoid G
T : WideSubquiver (Symmetrify (Generators G))
inst✝¹ : Arborescence (WideSubquiver.toType (Symmetrify (Generators G)) T)
X : Type ?u.22662
inst✝ : Monoid X
f : End (IsFreeGroupoid.SpanningTree.root' T) →* X
X✝ Y✝ Z✝ : G
f✝ : X✝ ⟶ Y✝
g✝ : Y✝ ⟶ Z✝
⊢ { obj := fun x => (), map := fun {X_1 Y} p => f (loopOfHom T p) }.map (f✝ ≫ g✝) = f (loopOfHom T g✝ * loopOfHom T f✝)
state_after: no goals
tactic: simp only [IsIso.inv_hom_id_assoc, loopOfHom, End.mul_def, Category.assoc]