Theorem: AddMonCat.FilteredColimits.colimit_add_mk_eq
File: Mathlib/Algebra/Category/MonCat/FilteredColimits.lean

Proof steps:
state_before: J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCatMax
inst✝ : IsFiltered J
x y : (j : J) × ↑(F.obj j)
k : J
f : x.fst ⟶ k
g : y.fst ⟶ k
⊢ M.mk F x * M.mk F y = M.mk F ⟨k, (F.map f) x.snd * (F.map g) y.snd⟩
state_after: case mk
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCatMax
inst✝ : IsFiltered J
y : (j : J) × ↑(F.obj j)
k : J
g : y.fst ⟶ k
j₁ : J
x : ↑(F.obj j₁)
f : ⟨j₁, x⟩.fst ⟶ k
⊢ M.mk F ⟨j₁, x⟩ * M.mk F y = M.mk F ⟨k, (F.map f) ⟨j₁, x⟩.snd * (F.map g) y.snd⟩
tactic: cases' x with j₁ x
state_before: case mk
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCatMax
inst✝ : IsFiltered J
y : (j : J) × ↑(F.obj j)
k : J
g : y.fst ⟶ k
j₁ : J
x : ↑(F.obj j₁)
f : ⟨j₁, x⟩.fst ⟶ k
⊢ M.mk F ⟨j₁, x⟩ * M.mk F y = M.mk F ⟨k, (F.map f) ⟨j₁, x⟩.snd * (F.map g) y.snd⟩
state_after: case mk.mk
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCatMax
inst✝ : IsFiltered J
k j₁ : J
x : ↑(F.obj j₁)
f : ⟨j₁, x⟩.fst ⟶ k
j₂ : J
y : ↑(F.obj j₂)
g : ⟨j₂, y⟩.fst ⟶ k
⊢ M.mk F ⟨j₁, x⟩ * M.mk F ⟨j₂, y⟩ = M.mk F ⟨k, (F.map f) ⟨j₁, x⟩.snd * (F.map g) ⟨j₂, y⟩.snd⟩
tactic: cases' y with j₂ y
state_before: case mk.mk
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCatMax
inst✝ : IsFiltered J
k j₁ : J
x : ↑(F.obj j₁)
f : ⟨j₁, x⟩.fst ⟶ k
j₂ : J
y : ↑(F.obj j₂)
g : ⟨j₂, y⟩.fst ⟶ k
⊢ M.mk F ⟨j₁, x⟩ * M.mk F ⟨j₂, y⟩ = M.mk F ⟨k, (F.map f) ⟨j₁, x⟩.snd * (F.map g) ⟨j₂, y⟩.snd⟩
state_after: case mk.mk.intro.intro.intro.intro
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCatMax
inst✝ : IsFiltered J
k j₁ : J
x : ↑(F.obj j₁)
f : ⟨j₁, x⟩.fst ⟶ k
j₂ : J
y : ↑(F.obj j₂)
g : ⟨j₂, y⟩.fst ⟶ k
s : J
α : IsFiltered.max j₁ j₂ ⟶ s
β : k ⟶ s
h₁ : IsFiltered.leftToMax j₁ j₂ ≫ α = f ≫ β
h₂ : IsFiltered.rightToMax j₁ j₂ ≫ α = g ≫ β
⊢ M.mk F ⟨j₁, x⟩ * M.mk F ⟨j₂, y⟩ = M.mk F ⟨k, (F.map f) ⟨j₁, x⟩.snd * (F.map g) ⟨j₂, y⟩.snd⟩
tactic: obtain ⟨s, α, β, h₁, h₂⟩ := IsFiltered.bowtie (IsFiltered.leftToMax j₁ j₂) f
    (IsFiltered.rightToMax j₁ j₂) g
state_before: case mk.mk.intro.intro.intro.intro
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCatMax
inst✝ : IsFiltered J
k j₁ : J
x : ↑(F.obj j₁)
f : ⟨j₁, x⟩.fst ⟶ k
j₂ : J
y : ↑(F.obj j₂)
g : ⟨j₂, y⟩.fst ⟶ k
s : J
α : IsFiltered.max j₁ j₂ ⟶ s
β : k ⟶ s
h₁ : IsFiltered.leftToMax j₁ j₂ ≫ α = f ≫ β
h₂ : IsFiltered.rightToMax j₁ j₂ ≫ α = g ≫ β
⊢ M.mk F ⟨j₁, x⟩ * M.mk F ⟨j₂, y⟩ = M.mk F ⟨k, (F.map f) ⟨j₁, x⟩.snd * (F.map g) ⟨j₂, y⟩.snd⟩
state_after: case mk.mk.intro.intro.intro.intro
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCatMax
inst✝ : IsFiltered J
k j₁ : J
x : ↑(F.obj j₁)
f : ⟨j₁, x⟩.fst ⟶ k
j₂ : J
y : ↑(F.obj j₂)
g : ⟨j₂, y⟩.fst ⟶ k
s : J
α : IsFiltered.max j₁ j₂ ⟶ s
β : k ⟶ s
h₁ : IsFiltered.leftToMax j₁ j₂ ≫ α = f ≫ β
h₂ : IsFiltered.rightToMax j₁ j₂ ≫ α = g ≫ β
⊢ ∃ k_1 f_1 g_1,
    (F.map f_1)
        ⟨IsFiltered.max ⟨j₁, x⟩.fst ⟨j₂, y⟩.fst,
            (F.map (IsFiltered.leftToMax ⟨j₁, x⟩.fst ⟨j₂, y⟩.fst)) ⟨j₁, x⟩.snd *
              (F.map (IsFiltered.rightToMax ⟨j₁, x⟩.fst ⟨j₂, y⟩.fst)) ⟨j₂, y⟩.snd⟩.snd =
      (F.map g_1) ⟨k, (F.map f) ⟨j₁, x⟩.snd * (F.map g) ⟨j₂, y⟩.snd⟩.snd
tactic: refine M.mk_eq F _ _ ?_
state_before: case mk.mk.intro.intro.intro.intro
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCatMax
inst✝ : IsFiltered J
k j₁ : J
x : ↑(F.obj j₁)
f : ⟨j₁, x⟩.fst ⟶ k
j₂ : J
y : ↑(F.obj j₂)
g : ⟨j₂, y⟩.fst ⟶ k
s : J
α : IsFiltered.max j₁ j₂ ⟶ s
β : k ⟶ s
h₁ : IsFiltered.leftToMax j₁ j₂ ≫ α = f ≫ β
h₂ : IsFiltered.rightToMax j₁ j₂ ≫ α = g ≫ β
⊢ ∃ k_1 f_1 g_1,
    (F.map f_1)
        ⟨IsFiltered.max ⟨j₁, x⟩.fst ⟨j₂, y⟩.fst,
            (F.map (IsFiltered.leftToMax ⟨j₁, x⟩.fst ⟨j₂, y⟩.fst)) ⟨j₁, x⟩.snd *
              (F.map (IsFiltered.rightToMax ⟨j₁, x⟩.fst ⟨j₂, y⟩.fst)) ⟨j₂, y⟩.snd⟩.snd =
      (F.map g_1) ⟨k, (F.map f) ⟨j₁, x⟩.snd * (F.map g) ⟨j₂, y⟩.snd⟩.snd
state_after: case h
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCatMax
inst✝ : IsFiltered J
k j₁ : J
x : ↑(F.obj j₁)
f : ⟨j₁, x⟩.fst ⟶ k
j₂ : J
y : ↑(F.obj j₂)
g : ⟨j₂, y⟩.fst ⟶ k
s : J
α : IsFiltered.max j₁ j₂ ⟶ s
β : k ⟶ s
h₁ : IsFiltered.leftToMax j₁ j₂ ≫ α = f ≫ β
h₂ : IsFiltered.rightToMax j₁ j₂ ≫ α = g ≫ β
⊢ (F.map α)
      ⟨IsFiltered.max ⟨j₁, x⟩.fst ⟨j₂, y⟩.fst,
          (F.map (IsFiltered.leftToMax ⟨j₁, x⟩.fst ⟨j₂, y⟩.fst)) ⟨j₁, x⟩.snd *
            (F.map (IsFiltered.rightToMax ⟨j₁, x⟩.fst ⟨j₂, y⟩.fst)) ⟨j₂, y⟩.snd⟩.snd =
    (F.map β) ⟨k, (F.map f) ⟨j₁, x⟩.snd * (F.map g) ⟨j₂, y⟩.snd⟩.snd
tactic: use s, α, β
state_before: case h
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCatMax
inst✝ : IsFiltered J
k j₁ : J
x : ↑(F.obj j₁)
f : ⟨j₁, x⟩.fst ⟶ k
j₂ : J
y : ↑(F.obj j₂)
g : ⟨j₂, y⟩.fst ⟶ k
s : J
α : IsFiltered.max j₁ j₂ ⟶ s
β : k ⟶ s
h₁ : IsFiltered.leftToMax j₁ j₂ ≫ α = f ≫ β
h₂ : IsFiltered.rightToMax j₁ j₂ ≫ α = g ≫ β
⊢ (F.map α)
      ⟨IsFiltered.max ⟨j₁, x⟩.fst ⟨j₂, y⟩.fst,
          (F.map (IsFiltered.leftToMax ⟨j₁, x⟩.fst ⟨j₂, y⟩.fst)) ⟨j₁, x⟩.snd *
            (F.map (IsFiltered.rightToMax ⟨j₁, x⟩.fst ⟨j₂, y⟩.fst)) ⟨j₂, y⟩.snd⟩.snd =
    (F.map β) ⟨k, (F.map f) ⟨j₁, x⟩.snd * (F.map g) ⟨j₂, y⟩.snd⟩.snd
state_after: case h
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCatMax
inst✝ : IsFiltered J
k j₁ : J
x : ↑(F.obj j₁)
f : ⟨j₁, x⟩.fst ⟶ k
j₂ : J
y : ↑(F.obj j₂)
g : ⟨j₂, y⟩.fst ⟶ k
s : J
α : IsFiltered.max j₁ j₂ ⟶ s
β : k ⟶ s
h₁ : IsFiltered.leftToMax j₁ j₂ ≫ α = f ≫ β
h₂ : IsFiltered.rightToMax j₁ j₂ ≫ α = g ≫ β
⊢ (F.map α) ((F.map (IsFiltered.leftToMax j₁ j₂)) x * (F.map (IsFiltered.rightToMax j₁ j₂)) y) =
    (F.map β) ((F.map f) x * (F.map g) y)
tactic: dsimp
state_before: case h
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCatMax
inst✝ : IsFiltered J
k j₁ : J
x : ↑(F.obj j₁)
f : ⟨j₁, x⟩.fst ⟶ k
j₂ : J
y : ↑(F.obj j₂)
g : ⟨j₂, y⟩.fst ⟶ k
s : J
α : IsFiltered.max j₁ j₂ ⟶ s
β : k ⟶ s
h₁ : IsFiltered.leftToMax j₁ j₂ ≫ α = f ≫ β
h₂ : IsFiltered.rightToMax j₁ j₂ ≫ α = g ≫ β
⊢ (F.map α) ((F.map (IsFiltered.leftToMax j₁ j₂)) x * (F.map (IsFiltered.rightToMax j₁ j₂)) y) =
    (F.map β) ((F.map f) x * (F.map g) y)
state_after: case h
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCatMax
inst✝ : IsFiltered J
k j₁ : J
x : ↑(F.obj j₁)
f : ⟨j₁, x⟩.fst ⟶ k
j₂ : J
y : ↑(F.obj j₂)
g : ⟨j₂, y⟩.fst ⟶ k
s : J
α : IsFiltered.max j₁ j₂ ⟶ s
β : k ⟶ s
h₁ : IsFiltered.leftToMax j₁ j₂ ≫ α = f ≫ β
h₂ : IsFiltered.rightToMax j₁ j₂ ≫ α = g ≫ β
⊢ (F.map α) ((F.map (IsFiltered.leftToMax j₁ j₂)) x) * (F.map α) ((F.map (IsFiltered.rightToMax j₁ j₂)) y) =
    (F.map β) ((F.map f) x) * (F.map β) ((F.map g) y)
tactic: simp_rw [MonoidHom.map_mul]
state_before: case h
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCatMax
inst✝ : IsFiltered J
k j₁ : J
x : ↑(F.obj j₁)
f : ⟨j₁, x⟩.fst ⟶ k
j₂ : J
y : ↑(F.obj j₂)
g : ⟨j₂, y⟩.fst ⟶ k
s : J
α : IsFiltered.max j₁ j₂ ⟶ s
β : k ⟶ s
h₁ : IsFiltered.leftToMax j₁ j₂ ≫ α = f ≫ β
h₂ : IsFiltered.rightToMax j₁ j₂ ≫ α = g ≫ β
⊢ (F.map α) ((F.map (IsFiltered.leftToMax j₁ j₂)) x) * (F.map α) ((F.map (IsFiltered.rightToMax j₁ j₂)) y) =
    (F.map β) ((F.map f) x) * (F.map β) ((F.map g) y)
state_after: case h
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCatMax
inst✝ : IsFiltered J
k j₁ : J
x : ↑(F.obj j₁)
f : ⟨j₁, x⟩.fst ⟶ k
j₂ : J
y : ↑(F.obj j₂)
g : ⟨j₂, y⟩.fst ⟶ k
s : J
α : IsFiltered.max j₁ j₂ ⟶ s
β : k ⟶ s
h₁ : IsFiltered.leftToMax j₁ j₂ ≫ α = f ≫ β
h₂ : IsFiltered.rightToMax j₁ j₂ ≫ α = g ≫ β
⊢ (F.map (IsFiltered.leftToMax j₁ j₂) ≫ F.map α) x * (F.map (IsFiltered.rightToMax j₁ j₂) ≫ F.map α) y =
    (F.map f ≫ F.map β) x * (F.map g ≫ F.map β) y
tactic: change (F.map _ ≫ F.map _) _ * (F.map _ ≫ F.map _) _ =
    (F.map _ ≫ F.map _) _ * (F.map _ ≫ F.map _) _
state_before: case h
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCatMax
inst✝ : IsFiltered J
k j₁ : J
x : ↑(F.obj j₁)
f : ⟨j₁, x⟩.fst ⟶ k
j₂ : J
y : ↑(F.obj j₂)
g : ⟨j₂, y⟩.fst ⟶ k
s : J
α : IsFiltered.max j₁ j₂ ⟶ s
β : k ⟶ s
h₁ : IsFiltered.leftToMax j₁ j₂ ≫ α = f ≫ β
h₂ : IsFiltered.rightToMax j₁ j₂ ≫ α = g ≫ β
⊢ (F.map (IsFiltered.leftToMax j₁ j₂) ≫ F.map α) x * (F.map (IsFiltered.rightToMax j₁ j₂) ≫ F.map α) y =
    (F.map f ≫ F.map β) x * (F.map g ≫ F.map β) y
state_after: no goals
tactic: simp_rw [← F.map_comp, h₁, h₂]