Theorem: CategoryTheory.Over.over_hasTerminal
File: Mathlib/CategoryTheory/Limits/Constructions/Over/Products.lean

Proof steps:
state_before: J : Type w
C : Type u
inst✝ : Category.{v, u} C
X B : C
F : Discrete PEmpty.{1} ⥤ Over B
s : Cone F
m : s.pt ⟶ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.pt
x✝ :
  ∀ (j : Discrete PEmpty.{1}),
    m ≫ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.π.app j = s.π.app j
⊢ m = (fun s => homMk s.pt.hom ⋯) s
state_after: J : Type w
C : Type u
inst✝ : Category.{v, u} C
X B : C
F : Discrete PEmpty.{1} ⥤ Over B
s : Cone F
m : s.pt ⟶ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.pt
x✝ :
  ∀ (j : Discrete PEmpty.{1}),
    m ≫ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.π.app j = s.π.app j
⊢ m = homMk s.pt.hom ⋯
tactic: simp only
state_before: J : Type w
C : Type u
inst✝ : Category.{v, u} C
X B : C
F : Discrete PEmpty.{1} ⥤ Over B
s : Cone F
m : s.pt ⟶ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.pt
x✝ :
  ∀ (j : Discrete PEmpty.{1}),
    m ≫ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.π.app j = s.π.app j
⊢ m = homMk s.pt.hom ⋯
state_after: case h
J : Type w
C : Type u
inst✝ : Category.{v, u} C
X B : C
F : Discrete PEmpty.{1} ⥤ Over B
s : Cone F
m : s.pt ⟶ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.pt
x✝ :
  ∀ (j : Discrete PEmpty.{1}),
    m ≫ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.π.app j = s.π.app j
⊢ m.left = (homMk s.pt.hom ⋯).left
tactic: ext
state_before: case h
J : Type w
C : Type u
inst✝ : Category.{v, u} C
X B : C
F : Discrete PEmpty.{1} ⥤ Over B
s : Cone F
m : s.pt ⟶ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.pt
x✝ :
  ∀ (j : Discrete PEmpty.{1}),
    m ≫ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.π.app j = s.π.app j
⊢ m.left = (homMk s.pt.hom ⋯).left
state_after: case h
J : Type w
C : Type u
inst✝ : Category.{v, u} C
X B : C
F : Discrete PEmpty.{1} ⥤ Over B
s : Cone F
m : s.pt ⟶ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.pt
x✝ :
  ∀ (j : Discrete PEmpty.{1}),
    m ≫ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.π.app j = s.π.app j
⊢ m.left = s.pt.hom
tactic: rw [Over.homMk_left _]
state_before: case h
J : Type w
C : Type u
inst✝ : Category.{v, u} C
X B : C
F : Discrete PEmpty.{1} ⥤ Over B
s : Cone F
m : s.pt ⟶ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.pt
x✝ :
  ∀ (j : Discrete PEmpty.{1}),
    m ≫ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.π.app j = s.π.app j
⊢ m.left = s.pt.hom
state_after: case h
J : Type w
C : Type u
inst✝ : Category.{v, u} C
X B : C
F : Discrete PEmpty.{1} ⥤ Over B
s : Cone F
m : s.pt ⟶ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.pt
x✝ :
  ∀ (j : Discrete PEmpty.{1}),
    m ≫ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.π.app j = s.π.app j
this :
  (𝟭 C).map m.left ≫ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.pt.hom =
    s.pt.hom ≫ (Functor.fromPUnit B).map m.right
⊢ m.left = s.pt.hom
tactic: have := m.w
state_before: case h
J : Type w
C : Type u
inst✝ : Category.{v, u} C
X B : C
F : Discrete PEmpty.{1} ⥤ Over B
s : Cone F
m : s.pt ⟶ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.pt
x✝ :
  ∀ (j : Discrete PEmpty.{1}),
    m ≫ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.π.app j = s.π.app j
this :
  (𝟭 C).map m.left ≫ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.pt.hom =
    s.pt.hom ≫ (Functor.fromPUnit B).map m.right
⊢ m.left = s.pt.hom
state_after: case h
J : Type w
C : Type u
inst✝ : Category.{v, u} C
X B : C
F : Discrete PEmpty.{1} ⥤ Over B
s : Cone F
m : s.pt ⟶ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.pt
x✝ :
  ∀ (j : Discrete PEmpty.{1}),
    m ≫ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.π.app j = s.π.app j
this : m.left ≫ 𝟙 B = s.pt.hom ≫ 𝟙 B
⊢ m.left = s.pt.hom
tactic: dsimp at this
state_before: case h
J : Type w
C : Type u
inst✝ : Category.{v, u} C
X B : C
F : Discrete PEmpty.{1} ⥤ Over B
s : Cone F
m : s.pt ⟶ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.pt
x✝ :
  ∀ (j : Discrete PEmpty.{1}),
    m ≫ { pt := mk (𝟙 B), π := { app := fun p => p.as.elim, naturality := ⋯ } }.π.app j = s.π.app j
this : m.left ≫ 𝟙 B = s.pt.hom ≫ 𝟙 B
⊢ m.left = s.pt.hom
state_after: no goals
tactic: rwa [Category.comp_id, Category.comp_id] at this