Theorem: MonCat.FilteredColimits.colimitMulAux_eq_of_rel_right
File: Mathlib/Algebra/Category/Mon/FilteredColimits.lean

tactic: cases' y with j₁ y
state_before: J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCat
inst✝ : IsFiltered J
x y y' : (j : J) × ↑(F.obj j)
hyy' : Types.FilteredColimit.Rel (F ⋙ forget MonCat) y y'
⊢ colimitMulAux F x y = colimitMulAux F x y'

tactic: cases' x with j₂ x
state_before: case mk
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCat
inst✝ : IsFiltered J
x y' : (j : J) × ↑(F.obj j)
j₁ : J
y : ↑(F.obj j₁)
hyy' : Types.FilteredColimit.Rel (F ⋙ forget MonCat) { fst := j₁, snd := y } y'
⊢ colimitMulAux F x { fst := j₁, snd := y } = colimitMulAux F x y'

tactic: cases' y' with j₃ y'
state_before: case mk.mk
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCat
inst✝ : IsFiltered J
y' : (j : J) × ↑(F.obj j)
j₁ : J
y : ↑(F.obj j₁)
hyy' : Types.FilteredColimit.Rel (F ⋙ forget MonCat) { fst := j₁, snd := y } y'
j₂ : J
x : ↑(F.obj j₂)
⊢ colimitMulAux F { fst := j₂, snd := x } { fst := j₁, snd := y } = colimitMulAux F { fst := j₂, snd := x } y'

tactic: obtain ⟨l, f, g, hfg⟩ := hyy'
state_before: case mk.mk.mk
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCat
inst✝ : IsFiltered J
j₁ : J
y : ↑(F.obj j₁)
j₂ : J
x : ↑(F.obj j₂)
j₃ : J
y' : ↑(F.obj j₃)
hyy' : Types.FilteredColimit.Rel (F ⋙ forget MonCat) { fst := j₁, snd := y } { fst := j₃, snd := y' }
⊢ colimitMulAux F { fst := j₂, snd := x } { fst := j₁, snd := y } =
    colimitMulAux F { fst := j₂, snd := x } { fst := j₃, snd := y' }

tactic: simp at hfg
state_before: case mk.mk.mk.intro.intro.intro
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCat
inst✝ : IsFiltered J
j₁ : J
y : ↑(F.obj j₁)
j₂ : J
x : ↑(F.obj j₂)
j₃ : J
y' : ↑(F.obj j₃)
l : J
f : { fst := j₁, snd := y }.fst ⟶ l
g : { fst := j₃, snd := y' }.fst ⟶ l
hfg : (F ⋙ forget MonCat).map f { fst := j₁, snd := y }.snd = (F ⋙ forget MonCat).map g { fst := j₃, snd := y' }.snd
⊢ colimitMulAux F { fst := j₂, snd := x } { fst := j₁, snd := y } =
    colimitMulAux F { fst := j₂, snd := x } { fst := j₃, snd := y' }

tactic: obtain ⟨s, α, β, γ, h₁, h₂, h₃⟩ :=
  IsFiltered.tulip (IsFiltered.rightToMax j₂ j₁) (IsFiltered.leftToMax j₂ j₁)
    (IsFiltered.leftToMax j₂ j₃) (IsFiltered.rightToMax j₂ j₃) f g
state_before: case mk.mk.mk.intro.intro.intro
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCat
inst✝ : IsFiltered J
j₁ : J
y : ↑(F.obj j₁)
j₂ : J
x : ↑(F.obj j₂)
j₃ : J
y' : ↑(F.obj j₃)
l : J
f : { fst := j₁, snd := y }.fst ⟶ l
g : { fst := j₃, snd := y' }.fst ⟶ l
hfg : ↑(F.map f) y = ↑(F.map g) y'
⊢ colimitMulAux F { fst := j₂, snd := x } { fst := j₁, snd := y } =
    colimitMulAux F { fst := j₂, snd := x } { fst := j₃, snd := y' }

tactic: apply M.mk_eq
state_before: case mk.mk.mk.intro.intro.intro.intro.intro.intro.intro.intro.intro
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCat
inst✝ : IsFiltered J
j₁ : J
y : ↑(F.obj j₁)
j₂ : J
x : ↑(F.obj j₂)
j₃ : J
y' : ↑(F.obj j₃)
l : J
f : { fst := j₁, snd := y }.fst ⟶ l
g : { fst := j₃, snd := y' }.fst ⟶ l
hfg : ↑(F.map f) y = ↑(F.map g) y'
s : J
α : IsFiltered.max j₂ j₁ ⟶ s
β : l ⟶ s
γ : IsFiltered.max j₂ j₃ ⟶ s
h₁ : IsFiltered.rightToMax j₂ j₁ ≫ α = f ≫ β
h₂ : IsFiltered.leftToMax j₂ j₁ ≫ α = IsFiltered.leftToMax j₂ j₃ ≫ γ
h₃ : IsFiltered.rightToMax j₂ j₃ ≫ γ = g ≫ β
⊢ colimitMulAux F { fst := j₂, snd := x } { fst := j₁, snd := y } =
    colimitMulAux F { fst := j₂, snd := x } { fst := j₃, snd := y' }

tactic: use s, α, γ
state_before: case mk.mk.mk.intro.intro.intro.intro.intro.intro.intro.intro.intro.h
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCat
inst✝ : IsFiltered J
j₁ : J
y : ↑(F.obj j₁)
j₂ : J
x : ↑(F.obj j₂)
j₃ : J
y' : ↑(F.obj j₃)
l : J
f : { fst := j₁, snd := y }.fst ⟶ l
g : { fst := j₃, snd := y' }.fst ⟶ l
hfg : ↑(F.map f) y = ↑(F.map g) y'
s : J
α : IsFiltered.max j₂ j₁ ⟶ s
β : l ⟶ s
γ : IsFiltered.max j₂ j₃ ⟶ s
h₁ : IsFiltered.rightToMax j₂ j₁ ≫ α = f ≫ β
h₂ : IsFiltered.leftToMax j₂ j₁ ≫ α = IsFiltered.leftToMax j₂ j₃ ≫ γ
h₃ : IsFiltered.rightToMax j₂ j₃ ≫ γ = g ≫ β
⊢ ∃ k f g,
    ↑(F.map f)
        { fst := IsFiltered.max { fst := j₂, snd := x }.fst { fst := j₁, snd := y }.fst,
            snd :=
              ↑(F.map (IsFiltered.leftToMax { fst := j₂, snd := x }.fst { fst := j₁, snd := y }.fst))
                  { fst := j₂, snd := x }.snd *
                ↑(F.map (IsFiltered.rightToMax { fst := j₂, snd := x }.fst { fst := j₁, snd := y }.fst))
                  { fst := j₁, snd := y }.snd }.snd =
      ↑(F.map g)
        { fst := IsFiltered.max { fst := j₂, snd := x }.fst { fst := j₃, snd := y' }.fst,
            snd :=
              ↑(F.map (IsFiltered.leftToMax { fst := j₂, snd := x }.fst { fst := j₃, snd := y' }.fst))
                  { fst := j₂, snd := x }.snd *
                ↑(F.map (IsFiltered.rightToMax { fst := j₂, snd := x }.fst { fst := j₃, snd := y' }.fst))
                  { fst := j₃, snd := y' }.snd }.snd

tactic: dsimp
state_before: case mk.mk.mk.intro.intro.intro.intro.intro.intro.intro.intro.intro.h
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCat
inst✝ : IsFiltered J
j₁ : J
y : ↑(F.obj j₁)
j₂ : J
x : ↑(F.obj j₂)
j₃ : J
y' : ↑(F.obj j₃)
l : J
f : { fst := j₁, snd := y }.fst ⟶ l
g : { fst := j₃, snd := y' }.fst ⟶ l
hfg : ↑(F.map f) y = ↑(F.map g) y'
s : J
α : IsFiltered.max j₂ j₁ ⟶ s
β : l ⟶ s
γ : IsFiltered.max j₂ j₃ ⟶ s
h₁ : IsFiltered.rightToMax j₂ j₁ ≫ α = f ≫ β
h₂ : IsFiltered.leftToMax j₂ j₁ ≫ α = IsFiltered.leftToMax j₂ j₃ ≫ γ
h₃ : IsFiltered.rightToMax j₂ j₃ ≫ γ = g ≫ β
⊢ ↑(F.map α)
      { fst := IsFiltered.max { fst := j₂, snd := x }.fst { fst := j₁, snd := y }.fst,
          snd :=
            ↑(F.map (IsFiltered.leftToMax { fst := j₂, snd := x }.fst { fst := j₁, snd := y }.fst))
                { fst := j₂, snd := x }.snd *
              ↑(F.map (IsFiltered.rightToMax { fst := j₂, snd := x }.fst { fst := j₁, snd := y }.fst))
                { fst := j₁, snd := y }.snd }.snd =
    ↑(F.map γ)
      { fst := IsFiltered.max { fst := j₂, snd := x }.fst { fst := j₃, snd := y' }.fst,
          snd :=
            ↑(F.map (IsFiltered.leftToMax { fst := j₂, snd := x }.fst { fst := j₃, snd := y' }.fst))
                { fst := j₂, snd := x }.snd *
              ↑(F.map (IsFiltered.rightToMax { fst := j₂, snd := x }.fst { fst := j₃, snd := y' }.fst))
                { fst := j₃, snd := y' }.snd }.snd

tactic: simp_rw [MonoidHom.map_mul]
state_before: case mk.mk.mk.intro.intro.intro.intro.intro.intro.intro.intro.intro.h
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCat
inst✝ : IsFiltered J
j₁ : J
y : ↑(F.obj j₁)
j₂ : J
x : ↑(F.obj j₂)
j₃ : J
y' : ↑(F.obj j₃)
l : J
f : { fst := j₁, snd := y }.fst ⟶ l
g : { fst := j₃, snd := y' }.fst ⟶ l
hfg : ↑(F.map f) y = ↑(F.map g) y'
s : J
α : IsFiltered.max j₂ j₁ ⟶ s
β : l ⟶ s
γ : IsFiltered.max j₂ j₃ ⟶ s
h₁ : IsFiltered.rightToMax j₂ j₁ ≫ α = f ≫ β
h₂ : IsFiltered.leftToMax j₂ j₁ ≫ α = IsFiltered.leftToMax j₂ j₃ ≫ γ
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 (IsFiltered.leftToMax j₂ j₃)) x * ↑(F.map (IsFiltered.rightToMax j₂ j₃)) y')

tactic: change (F.map _ ≫ F.map _) _ * (F.map _ ≫ F.map _) _ =
  (F.map _ ≫ F.map _) _ * (F.map _ ≫ F.map _) _
state_before: case mk.mk.mk.intro.intro.intro.intro.intro.intro.intro.intro.intro.h
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCat
inst✝ : IsFiltered J
j₁ : J
y : ↑(F.obj j₁)
j₂ : J
x : ↑(F.obj j₂)
j₃ : J
y' : ↑(F.obj j₃)
l : J
f : { fst := j₁, snd := y }.fst ⟶ l
g : { fst := j₃, snd := y' }.fst ⟶ l
hfg : ↑(F.map f) y = ↑(F.map g) y'
s : J
α : IsFiltered.max j₂ j₁ ⟶ s
β : l ⟶ s
γ : IsFiltered.max j₂ j₃ ⟶ s
h₁ : IsFiltered.rightToMax j₂ j₁ ≫ α = f ≫ β
h₂ : IsFiltered.leftToMax j₂ j₁ ≫ α = IsFiltered.leftToMax j₂ j₃ ≫ γ
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 (IsFiltered.leftToMax j₂ j₃)) x) * ↑(F.map γ) (↑(F.map (IsFiltered.rightToMax j₂ j₃)) y')

tactic: simp_rw [← F.map_comp, h₁, h₂, h₃, F.map_comp]
state_before: case mk.mk.mk.intro.intro.intro.intro.intro.intro.intro.intro.intro.h
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCat
inst✝ : IsFiltered J
j₁ : J
y : ↑(F.obj j₁)
j₂ : J
x : ↑(F.obj j₂)
j₃ : J
y' : ↑(F.obj j₃)
l : J
f : { fst := j₁, snd := y }.fst ⟶ l
g : { fst := j₃, snd := y' }.fst ⟶ l
hfg : ↑(F.map f) y = ↑(F.map g) y'
s : J
α : IsFiltered.max j₂ j₁ ⟶ s
β : l ⟶ s
γ : IsFiltered.max j₂ j₃ ⟶ s
h₁ : IsFiltered.rightToMax j₂ j₁ ≫ α = f ≫ β
h₂ : IsFiltered.leftToMax j₂ j₁ ≫ α = IsFiltered.leftToMax j₂ j₃ ≫ γ
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 (IsFiltered.leftToMax j₂ j₃) ≫ F.map γ) x * ↑(F.map (IsFiltered.rightToMax j₂ j₃) ≫ F.map γ) y'

tactic: congr 1
state_before: case mk.mk.mk.intro.intro.intro.intro.intro.intro.intro.intro.intro.h
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCat
inst✝ : IsFiltered J
j₁ : J
y : ↑(F.obj j₁)
j₂ : J
x : ↑(F.obj j₂)
j₃ : J
y' : ↑(F.obj j₃)
l : J
f : { fst := j₁, snd := y }.fst ⟶ l
g : { fst := j₃, snd := y' }.fst ⟶ l
hfg : ↑(F.map f) y = ↑(F.map g) y'
s : J
α : IsFiltered.max j₂ j₁ ⟶ s
β : l ⟶ s
γ : IsFiltered.max j₂ j₃ ⟶ s
h₁ : IsFiltered.rightToMax j₂ j₁ ≫ α = f ≫ β
h₂ : IsFiltered.leftToMax j₂ j₁ ≫ α = IsFiltered.leftToMax j₂ j₃ ≫ γ
h₃ : IsFiltered.rightToMax j₂ j₃ ≫ γ = g ≫ β
⊢ ↑(F.map (IsFiltered.leftToMax j₂ j₃) ≫ F.map γ) x * ↑(F.map f ≫ F.map β) y =
    ↑(F.map (IsFiltered.leftToMax j₂ j₃) ≫ F.map γ) x * ↑(F.map g ≫ F.map β) y'

tactic: change F.map _ (F.map _ _) = F.map _ (F.map _ _)
state_before: case mk.mk.mk.intro.intro.intro.intro.intro.intro.intro.intro.intro.h.e_a
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCat
inst✝ : IsFiltered J
j₁ : J
y : ↑(F.obj j₁)
j₂ : J
x : ↑(F.obj j₂)
j₃ : J
y' : ↑(F.obj j₃)
l : J
f : { fst := j₁, snd := y }.fst ⟶ l
g : { fst := j₃, snd := y' }.fst ⟶ l
hfg : ↑(F.map f) y = ↑(F.map g) y'
s : J
α : IsFiltered.max j₂ j₁ ⟶ s
β : l ⟶ s
γ : IsFiltered.max j₂ j₃ ⟶ s
h₁ : IsFiltered.rightToMax j₂ j₁ ≫ α = f ≫ β
h₂ : IsFiltered.leftToMax j₂ j₁ ≫ α = IsFiltered.leftToMax j₂ j₃ ≫ γ
h₃ : IsFiltered.rightToMax j₂ j₃ ≫ γ = g ≫ β
⊢ ↑(F.map f ≫ F.map β) y = ↑(F.map g ≫ F.map β) y'

tactic: rw [hfg]
state_before: case mk.mk.mk.intro.intro.intro.intro.intro.intro.intro.intro.intro.h.e_a
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCat
inst✝ : IsFiltered J
j₁ : J
y : ↑(F.obj j₁)
j₂ : J
x : ↑(F.obj j₂)
j₃ : J
y' : ↑(F.obj j₃)
l : J
f : { fst := j₁, snd := y }.fst ⟶ l
g : { fst := j₃, snd := y' }.fst ⟶ l
hfg : ↑(F.map f) y = ↑(F.map g) y'
s : J
α : IsFiltered.max j₂ j₁ ⟶ s
β : l ⟶ s
γ : IsFiltered.max j₂ j₃ ⟶ s
h₁ : IsFiltered.rightToMax j₂ j₁ ≫ α = f ≫ β
h₂ : IsFiltered.leftToMax j₂ j₁ ≫ α = IsFiltered.leftToMax j₂ j₃ ≫ γ
h₃ : IsFiltered.rightToMax j₂ j₃ ≫ γ = g ≫ β
⊢ ↑(F.map β) (↑(F.map f) y) = ↑(F.map β) (↑(F.map g) y')