/-- Adding a second point is left adjoint to forgetting the second point. -/
noncomputable def pointedToTwoPFstForgetCompBipointedToPointedFstAdjunction :
    pointedToTwoPFst ⊣ forget₂ TwoP Bipointed ⋙ bipointedToPointedFst :=
  Adjunction.mkOfHomEquiv
    { homEquiv := fun X Y =>
        { toFun := fun f => ⟨f.toFun ∘ Option.some, f.map_fst⟩
          invFun := fun f => ⟨fun o => o.elim Y.toTwoPointing.toProd.2 f.toFun, f.map_point, rfl⟩
          left_inv := fun f => by
            apply Bipointed.Hom.ext
            funext x
            cases x
            exact f.map_snd.symm
            rfl
          right_inv := fun f => Pointed.Hom.ext _ _ rfl }
      homEquiv_naturality_left_symm := fun f g => by
        

Proof state:
α : Type u_1
β : Type u_2
X'✝ X✝ : Pointed
Y✝ : TwoP
f : X'✝ ⟶ X✝
g : X✝ ⟶ (forget₂ TwoP Bipointed ⋙ bipointedToPointedFst).obj Y✝
⊢ ((fun X Y =>
            {
              toFun := fun f =>
                { toFun := f.toFun ∘ some,
                  map_point :=
                    (_ :
                      Bipointed.Hom.toFun f (TwoP.toBipointed (pointedToTwoPFst.obj X)).toProd.1 =
                        (TwoP.toBipointed Y).toProd.1) },
              invFun := fun f =>
                { toFun := fun o => Option.elim o Y.toTwoPointing.toProd.2 f.toFun,
                  map_fst :=
                    (_ : Pointed.Hom.toFun f X.point = ((forget₂ TwoP Bipointed ⋙ bipointedToPointedFst).obj Y).point),
                  map_snd :=
                    (_ :
                      (fun o => Option.elim o Y.toTwoPointing.toProd.2 f.toFun)
                          (TwoP.toBipointed (pointedToTwoPFst.obj X)).toProd.2 =
                        (fun o => Option.elim o Y.toTwoPointing.toProd.2 f.toFun)
                          (TwoP.toBipointed (pointedToTwoPFst.obj X)).toProd.2) },
              left_inv :=
                (_ :
                  ∀ (f : pointedToTwoPFst.obj X ⟶ Y),
                    (fun f =>
                          { toFun := fun o => Option.elim o Y.toTwoPointing.toProd.2 f.toFun,
                            map_fst :=
                              (_ :
                                Pointed.Hom.toFun f X.point =
                                  ((forget₂ TwoP Bipointed ⋙ bipointedToPointedFst).obj Y).point),
                            map_snd :=
                              (_ :
                                (fun o => Option.elim o Y.toTwoPointing.toProd.2 f.toFun)
                                    (TwoP.toBipointed (pointedToTwoPFst.obj X)).toProd.2 =
                                  (fun o => Option.elim o Y.toTwoPointing.toProd.2 f.toFun)
                                    (TwoP.toBipointed (pointedToTwoPFst.obj X)).toProd.2) })
                        ((fun f =>
                            { toFun := f.toFun ∘ some,
                              map_point :=
                                (_ :
                                  Bipointed.Hom.toFun f (TwoP.toBipointed (pointedToTwoPFst.obj X)).toProd.1 =
                                    (TwoP.toBipointed Y).toProd.1) })
                          f) =
                      f),
              right_inv :=
                (_ :
                  ∀ (f : X ⟶ (forget₂ TwoP Bipointed ⋙ bipointedToPointedFst).obj Y),
                    (fun f =>
                          { toFun := f.toFun ∘ some,
                            map_point :=
                              (_ :
                                Bipointed.Hom.toFun f (TwoP.toBipointed (pointedToTwoPFst.obj X)).toProd.1 =
                                  (TwoP.toBipointed Y).toProd.1) })
                        ((fun f =>
                            { toFun := fun o => Option.elim o Y.toTwoPointing.toProd.2 f.toFun,
                              map_fst :=
                                (_ :
                                  Pointed.Hom.toFun f X.point =
                                    ((forget₂ TwoP Bipointed ⋙ bipointedToPointedFst).obj Y).point),
                              map_snd :=
                                (_ :
                                  (fun o => Option.elim o Y.toTwoPointing.toProd.2 f.toFun)
                                      (TwoP.toBipointed (pointedToTwoPFst.obj X)).toProd.2 =
                                    (fun o => Option.elim o Y.toTwoPointing.toProd.2 f.toFun)
                                      (TwoP.toBipointed (pointedToTwoPFst.obj X)).toProd.2) })
                          f) =
                      f) })
          X'✝ Y✝).symm
      (f ≫ g) =
    pointedToTwoPFst.map f ≫
      ((fun X Y =>
              {
                toFun := fun f =>
                  { toFun := f.toFun ∘ some,
                    map_point :=
                      (_ :
                        Bipointed.Hom.toFun f (TwoP.toBipointed (pointedToTwoPFst.obj X)).toProd.1 =
                          (TwoP.toBipointed Y).toProd.1) },
                invFun := fun f =>
                  { toFun := fun o => Option.elim o Y.toTwoPointing.toProd.2 f.toFun,
                    map_fst :=
                      (_ :
                        Pointed.Hom.toFun f X.point = ((forget₂ TwoP Bipointed ⋙ bipointedToPointedFst).obj Y).point),
                    map_snd :=
                      (_ :
                        (fun o => Option.elim o Y.toTwoPointing.toProd.2 f.toFun)
                            (TwoP.toBipointed (pointedToTwoPFst.obj X)).toProd.2 =
                          (fun o => Option.elim o Y.toTwoPointing.toProd.2 f.toFun)
                            (TwoP.toBipointed (pointedToTwoPFst.obj X)).toProd.2) },
                left_inv :=
                  (_ :
                    ∀ (f : pointedToTwoPFst.obj X ⟶ Y),
                      (fun f =>
                            { toFun := fun o => Option.elim o Y.toTwoPointing.toProd.2 f.toFun,
                              map_fst :=
                                (_ :
                                  Pointed.Hom.toFun f X.point =
                                    ((forget₂ TwoP Bipointed ⋙ bipointedToPointedFst).obj Y).point),
                              map_snd :=
                                (_ :
                                  (fun o => Option.elim o Y.toTwoPointing.toProd.2 f.toFun)
                                      (TwoP.toBipointed (pointedToTwoPFst.obj X)).toProd.2 =
                                    (fun o => Option.elim o Y.toTwoPointing.toProd.2 f.toFun)
                                      (TwoP.toBipointed (pointedToTwoPFst.obj X)).toProd.2) })
                          ((fun f =>
                              { toFun := f.toFun ∘ some,
                                map_point :=
                                  (_ :
                                    Bipointed.Hom.toFun f (TwoP.toBipointed (pointedToTwoPFst.obj X)).toProd.1 =
                                      (TwoP.toBipointed Y).toProd.1) })
                            f) =
                        f),
                right_inv :=
                  (_ :
                    ∀ (f : X ⟶ (forget₂ TwoP Bipointed ⋙ bipointedToPointedFst).obj Y),
                      (fun f =>
                            { toFun := f.toFun ∘ some,
                              map_point :=
                                (_ :
                                  Bipointed.Hom.toFun f (TwoP.toBipointed (pointedToTwoPFst.obj X)).toProd.1 =
                                    (TwoP.toBipointed Y).toProd.1) })
                          ((fun f =>
                              { toFun := fun o => Option.elim o Y.toTwoPointing.toProd.2 f.toFun,
                                map_fst :=
                                  (_ :
                                    Pointed.Hom.toFun f X.point =
                                      ((forget₂ TwoP Bipointed ⋙ bipointedToPointedFst).obj Y).point),
                                map_snd :=
                                  (_ :
                                    (fun o => Option.elim o Y.toTwoPointing.toProd.2 f.toFun)
                                        (TwoP.toBipointed (pointedToTwoPFst.obj X)).toProd.2 =
                                      (fun o => Option.elim o Y.toTwoPointing.toProd.2 f.toFun)
                                        (TwoP.toBipointed (pointedToTwoPFst.obj X)).toProd.2) })
                            f) =
                        f) })
            X✝ Y✝).symm
        g

Next tactic:
apply Bipointed.Hom.ext