A Lean Companion to Conceptual Mathematics

Session 28: The category of pointed setsπŸ”—

1. An example of a non-distributive categoryπŸ”—

Exercise 1 (p. 298)

Both parts of the distributive law are false in the category of pointed sets:

(a) Find an object A for which the map \mathbf{0} \rightarrow \mathbf{0} \times A is not an isomorphism.

(b) Find objects A, B_1, and B_2 for which the standard map A \times B_1 + A \times B_2 \rightarrow A \times (B_1 + B_2) is not an isomorphism.

Solution: Exercise 1

For part (a), taking A to be

def A : Pointed := { X := Fin 2 point := 0 }

we can show that the map {\mathbf{0} \rightarrow \mathbf{0} \times A} is not an isomorphism, as follows:

example [HasInitial Pointed] [HasBinaryProduct (βŠ₯_ Pointed) A] : IsEmpty ((βŠ₯_ Pointed) β‰… (βŠ₯_ Pointed) β¨― A) := inst✝¹:HasInitial Pointedinst✝:HasBinaryProduct (βŠ₯_ Pointed) A⊒ IsEmpty (βŠ₯_ Pointed β‰… (βŠ₯_ Pointed) β¨― A) inst✝¹:HasInitial Pointedinst✝:HasBinaryProduct (βŠ₯_ Pointed) A⊒ βˆ€ (a : βŠ₯_ Pointed β‰… (βŠ₯_ Pointed) β¨― A), False inst✝¹:HasInitial Pointedinst✝:HasBinaryProduct (βŠ₯_ Pointed) Ae:βŠ₯_ Pointed β‰… (βŠ₯_ Pointed) β¨― A⊒ False inst✝¹:HasInitial Pointedinst✝:HasBinaryProduct (βŠ₯_ Pointed) Ae:βŠ₯_ Pointed β‰… (βŠ₯_ Pointed) β¨― Aaβ‚€:βŠ₯_ Pointed ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }⊒ False inst✝¹:HasInitial Pointedinst✝:HasBinaryProduct (βŠ₯_ Pointed) Ae:βŠ₯_ Pointed β‰… (βŠ₯_ Pointed) β¨― Aaβ‚€:βŠ₯_ Pointed ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }pA:(βŠ₯_ Pointed) β¨― A ⟢ A := prod.snd⊒ False inst✝¹:HasInitial Pointedinst✝:HasBinaryProduct (βŠ₯_ Pointed) Ae:βŠ₯_ Pointed β‰… (βŠ₯_ Pointed) β¨― Aaβ‚€:βŠ₯_ Pointed ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }pA:(βŠ₯_ Pointed) β¨― A ⟢ A := prod.snds:A ⟢ (βŠ₯_ Pointed) β¨― A := prod.lift { toFun := fun x ↦ (βŠ₯_ Pointed).point, map_point := β‹― } (πŸ™ A)⊒ False inst✝¹:HasInitial Pointedinst✝:HasBinaryProduct (βŠ₯_ Pointed) Ae:βŠ₯_ Pointed β‰… (βŠ₯_ Pointed) β¨― Aaβ‚€:βŠ₯_ Pointed ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }pA:(βŠ₯_ Pointed) β¨― A ⟢ A := prod.snds:A ⟢ (βŠ₯_ Pointed) β¨― A := prod.lift { toFun := fun x ↦ (βŠ₯_ Pointed).point, map_point := β‹― } (πŸ™ A)h_comm:pA ⊚ e.hom = aβ‚€βŠ’ False inst✝¹:HasInitial Pointedinst✝:HasBinaryProduct (βŠ₯_ Pointed) Ae:βŠ₯_ Pointed β‰… (βŠ₯_ Pointed) β¨― Aaβ‚€:βŠ₯_ Pointed ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }pA:(βŠ₯_ Pointed) β¨― A ⟢ A := prod.snds:A ⟢ (βŠ₯_ Pointed) β¨― A := prod.lift { toFun := fun x ↦ (βŠ₯_ Pointed).point, map_point := β‹― } (πŸ™ A)h_comm:pA ⊚ e.hom = aβ‚€one:A.X := 1⊒ False have h_contra : one = A.point := calc one _ = (πŸ™ A) one := rfl _ = (pA ⊚ s) one := inst✝¹:HasInitial Pointedinst✝:HasBinaryProduct (βŠ₯_ Pointed) Ae:βŠ₯_ Pointed β‰… (βŠ₯_ Pointed) β¨― Aaβ‚€:βŠ₯_ Pointed ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }pA:(βŠ₯_ Pointed) β¨― A ⟢ A := prod.snds:A ⟢ (βŠ₯_ Pointed) β¨― A := prod.lift { toFun := fun x ↦ (βŠ₯_ Pointed).point, map_point := β‹― } (πŸ™ A)h_comm:pA ⊚ e.hom = aβ‚€one:A.X := 1⊒ (ConcreteCategory.hom (πŸ™ A)) one = (ConcreteCategory.hom (pA ⊚ s)) one All goals completed! πŸ™ _ = pA ((πŸ™ ((βŠ₯_ Pointed) β¨― A)) (s one)) := rfl _ = pA ((e.hom ⊚ e.inv) (s one)) := inst✝¹:HasInitial Pointedinst✝:HasBinaryProduct (βŠ₯_ Pointed) Ae:βŠ₯_ Pointed β‰… (βŠ₯_ Pointed) β¨― Aaβ‚€:βŠ₯_ Pointed ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }pA:(βŠ₯_ Pointed) β¨― A ⟢ A := prod.snds:A ⟢ (βŠ₯_ Pointed) β¨― A := prod.lift { toFun := fun x ↦ (βŠ₯_ Pointed).point, map_point := β‹― } (πŸ™ A)h_comm:pA ⊚ e.hom = aβ‚€one:A.X := 1⊒ (ConcreteCategory.hom pA) ((ConcreteCategory.hom (πŸ™ ((βŠ₯_ Pointed) β¨― A))) ((ConcreteCategory.hom s) one)) = (ConcreteCategory.hom pA) ((ConcreteCategory.hom (e.hom ⊚ e.inv)) ((ConcreteCategory.hom s) one)) All goals completed! πŸ™ _ = (pA ⊚ e.hom) (e.inv (s one)) := rfl _ = aβ‚€ (e.inv (s one)) := inst✝¹:HasInitial Pointedinst✝:HasBinaryProduct (βŠ₯_ Pointed) Ae:βŠ₯_ Pointed β‰… (βŠ₯_ Pointed) β¨― Aaβ‚€:βŠ₯_ Pointed ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }pA:(βŠ₯_ Pointed) β¨― A ⟢ A := prod.snds:A ⟢ (βŠ₯_ Pointed) β¨― A := prod.lift { toFun := fun x ↦ (βŠ₯_ Pointed).point, map_point := β‹― } (πŸ™ A)h_comm:pA ⊚ e.hom = aβ‚€one:A.X := 1⊒ (ConcreteCategory.hom (pA ⊚ e.hom)) ((ConcreteCategory.hom e.inv) ((ConcreteCategory.hom s) one)) = (ConcreteCategory.hom aβ‚€) ((ConcreteCategory.hom e.inv) ((ConcreteCategory.hom s) one)) All goals completed! πŸ™ _ = A.point := rfl All goals completed! πŸ™

For part (b), taking A, B_1, and B_2 to be, respectively,

def A : Pointed := { X := Fin 2 point := 0 } def B₁ : Pointed := { X := Unit point := () } def Bβ‚‚ : Pointed := { X := Unit point := () }

we can use the pigeonhole principle (and grind to aid readability) to show that the map {A \times B_1 + A \times B_2 \rightarrow A \times (B_1 + B_2)} is not an isomorphism, as follows:

instance : OfNat A.X 0 where ofNat := (0 : Fin 2) instance : OfNat A.X 1 where ofNat := (1 : Fin 2) example [HasBinaryProduct A B₁] [HasBinaryProduct A Bβ‚‚] [HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)] [HasBinaryCoproduct B₁ Bβ‚‚] [HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)] : IsEmpty ((A β¨― B₁) β¨Ώ (A β¨― Bβ‚‚) β‰… A β¨― (B₁ β¨Ώ Bβ‚‚)) := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)⊒ IsEmpty ((A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚) inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)⊒ βˆ€ (a : (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚), False inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚βŠ’ False -- Alias longer types for convenience inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚βŠ’ False inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚βŠ’ False -- Define constant basepoint endomorphism of A inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }⊒ False -- Construct 3 distinct pathways from A to L inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }⊒ False inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }⊒ False inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }⊒ False -- Push pathways through isomorphism to obtain 3 target elements inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1⊒ False inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1⊒ False inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1⊒ False -- Define 'detector' morphisms inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)⊒ False inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fst⊒ False -- Evaluate detector compositions for each pathway have h10β‚€ : m10 ⊚ cAL = cAA := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)⊒ IsEmpty ((A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚) inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fstx✝:A.X⊒ ↑(ConcreteCategory.hom (m10 ⊚ cAL)) x✝ = ↑(ConcreteCategory.hom cAA) x✝ All goals completed! πŸ™ have h01β‚€ : m01 ⊚ cAL = cAA := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)⊒ IsEmpty ((A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚) inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAx✝:A.X⊒ ↑(ConcreteCategory.hom (m01 ⊚ cAL)) x✝ = ↑(ConcreteCategory.hom cAA) x✝ All goals completed! πŸ™ have h10₁ : m10 ⊚ j₁ = πŸ™ A := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)⊒ IsEmpty ((A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚) All goals completed! πŸ™ have h01₁ : m01 ⊚ j₁ = cAA := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)⊒ IsEmpty ((A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚) inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ A⊒ m01 ⊚ j₁ = cAA All goals completed! πŸ™ have h10β‚‚ : m10 ⊚ jβ‚‚ = cAA := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)⊒ IsEmpty ((A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚) inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAA⊒ m10 ⊚ jβ‚‚ = cAA All goals completed! πŸ™ have h01β‚‚ : m01 ⊚ jβ‚‚ = πŸ™ A := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)⊒ IsEmpty ((A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚) inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAA⊒ m01 ⊚ jβ‚‚ = πŸ™ A All goals completed! πŸ™ -- Prove all morphisms into Z map to basepoint have h_fXZ {X : Pointed} (f : X ⟢ Z) : f = ⟨fun _ ↦ Z.point, rfl⟩ := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)⊒ IsEmpty ((A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚) have : πŸ™ Z = ⟨fun _ ↦ Z.point, rfl⟩ := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)⊒ IsEmpty ((A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚) have ext_B₁ {Y : Pointed} (f g : B₁ ⟢ Y) : f = g := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)⊒ IsEmpty ((A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚) inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ AX:Pointedf✝:X ⟢ ZY:Pointedf:B₁ ⟢ Yg:B₁ ⟢ Yx✝:B₁.X⊒ ↑(ConcreteCategory.hom f) x✝ = ↑(ConcreteCategory.hom g) x✝ All goals completed! πŸ™ have ext_Bβ‚‚ {Y : Pointed} (f g : Bβ‚‚ ⟢ Y) : f = g := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)⊒ IsEmpty ((A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚) inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ AX:Pointedf✝:X ⟢ Zext_B₁:βˆ€ {Y : Pointed} (f g : B₁ ⟢ Y), f = gY:Pointedf:Bβ‚‚ ⟢ Yg:Bβ‚‚ ⟢ Yx✝:Bβ‚‚.X⊒ ↑(ConcreteCategory.hom f) x✝ = ↑(ConcreteCategory.hom g) x✝ All goals completed! πŸ™ inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ AX:Pointedf:X ⟢ Zext_B₁:βˆ€ {Y : Pointed} (f g : B₁ ⟢ Y), f = gext_Bβ‚‚:βˆ€ {Y : Pointed} (f g : Bβ‚‚ ⟢ Y), f = g⊒ πŸ™ Z ⊚ coprod.inl = { toFun := fun x ↦ Z.point, map_point := β‹― } ⊚ coprod.inlinst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ AX:Pointedf:X ⟢ Zext_B₁:βˆ€ {Y : Pointed} (f g : B₁ ⟢ Y), f = gext_Bβ‚‚:βˆ€ {Y : Pointed} (f g : Bβ‚‚ ⟢ Y), f = g⊒ πŸ™ Z ⊚ coprod.inr = { toFun := fun x ↦ Z.point, map_point := β‹― } ⊚ coprod.inr inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ AX:Pointedf:X ⟢ Zext_B₁:βˆ€ {Y : Pointed} (f g : B₁ ⟢ Y), f = gext_Bβ‚‚:βˆ€ {Y : Pointed} (f g : Bβ‚‚ ⟢ Y), f = g⊒ πŸ™ Z ⊚ coprod.inl = { toFun := fun x ↦ Z.point, map_point := β‹― } ⊚ coprod.inl All goals completed! πŸ™ inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ AX:Pointedf:X ⟢ Zext_B₁:βˆ€ {Y : Pointed} (f g : B₁ ⟢ Y), f = gext_Bβ‚‚:βˆ€ {Y : Pointed} (f g : Bβ‚‚ ⟢ Y), f = g⊒ πŸ™ Z ⊚ coprod.inr = { toFun := fun x ↦ Z.point, map_point := β‹― } ⊚ coprod.inr All goals completed! πŸ™ calc f = πŸ™ Z ⊚ f := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ AX:Pointedf:X ⟢ Zthis:πŸ™ Z = { toFun := fun x ↦ Z.point, map_point := β‹― }⊒ f = πŸ™ Z ⊚ f All goals completed! πŸ™ _ = ⟨fun _ ↦ Z.point, rfl⟩ ⊚ f := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ AX:Pointedf:X ⟢ Zthis:πŸ™ Z = { toFun := fun x ↦ Z.point, map_point := β‹― }⊒ πŸ™ Z ⊚ f = { toFun := fun x ↦ Z.point, map_point := β‹― } ⊚ f All goals completed! πŸ™ _ = ⟨fun _ ↦ Z.point, rfl⟩ := rfl -- Lift element equality to morphism equality for morphisms A ⟢ L have h_fAL {a b : A ⟢ L} (h_v : (prod.fst ⊚ e.hom ⊚ a) 1 = (prod.fst ⊚ e.hom ⊚ b) 1) : a = b := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)⊒ IsEmpty ((A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚) have : e.hom ⊚ a = e.hom ⊚ b := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)⊒ IsEmpty ((A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚) have ext_A {f g : A ⟢ A} (h : f 1 = g 1) : f = g := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)⊒ IsEmpty ((A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚) inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }a:A ⟢ Lb:A ⟢ Lh_v:(ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1f:A ⟢ Ag:A ⟢ Ah:(ConcreteCategory.hom f) 1 = (ConcreteCategory.hom g) 1x:A.X⊒ ↑(ConcreteCategory.hom f) x = ↑(ConcreteCategory.hom g) x inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }a:A ⟢ Lb:A ⟢ Lh_v:(ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1f:A ⟢ Ag:A ⟢ Ah:(ConcreteCategory.hom f) 1 = (ConcreteCategory.hom g) 1x:Fin 2⊒ ↑(ConcreteCategory.hom f) x = ↑(ConcreteCategory.hom g) x inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }a:A ⟢ Lb:A ⟢ Lh_v:(ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1f:A ⟢ Ag:A ⟢ Ah:(ConcreteCategory.hom f) 1 = (ConcreteCategory.hom g) 1⊒ ↑(ConcreteCategory.hom f) ((fun i ↦ i) ⟨0, β‹―βŸ©) = ↑(ConcreteCategory.hom g) ((fun i ↦ i) ⟨0, β‹―βŸ©)inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }a:A ⟢ Lb:A ⟢ Lh_v:(ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1f:A ⟢ Ag:A ⟢ Ah:(ConcreteCategory.hom f) 1 = (ConcreteCategory.hom g) 1⊒ ↑(ConcreteCategory.hom f) ((fun i ↦ i) ⟨1, β‹―βŸ©) = ↑(ConcreteCategory.hom g) ((fun i ↦ i) ⟨1, β‹―βŸ©) inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }a:A ⟢ Lb:A ⟢ Lh_v:(ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1f:A ⟢ Ag:A ⟢ Ah:(ConcreteCategory.hom f) 1 = (ConcreteCategory.hom g) 1⊒ ↑(ConcreteCategory.hom f) ((fun i ↦ i) ⟨0, β‹―βŸ©) = ↑(ConcreteCategory.hom g) ((fun i ↦ i) ⟨0, β‹―βŸ©) All goals completed! πŸ™ inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }a:A ⟢ Lb:A ⟢ Lh_v:(ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1f:A ⟢ Ag:A ⟢ Ah:(ConcreteCategory.hom f) 1 = (ConcreteCategory.hom g) 1⊒ ↑(ConcreteCategory.hom f) ((fun i ↦ i) ⟨1, β‹―βŸ©) = ↑(ConcreteCategory.hom g) ((fun i ↦ i) ⟨1, β‹―βŸ©) All goals completed! πŸ™ inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }a:A ⟢ Lb:A ⟢ Lh_v:(ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1ext_A:βˆ€ {f g : A ⟢ A}, (ConcreteCategory.hom f) 1 = (ConcreteCategory.hom g) 1 β†’ f = g⊒ prod.fst ⊚ e.hom ⊚ a = prod.fst ⊚ e.hom ⊚ binst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }a:A ⟢ Lb:A ⟢ Lh_v:(ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1ext_A:βˆ€ {f g : A ⟢ A}, (ConcreteCategory.hom f) 1 = (ConcreteCategory.hom g) 1 β†’ f = g⊒ prod.snd ⊚ e.hom ⊚ a = prod.snd ⊚ e.hom ⊚ b inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }a:A ⟢ Lb:A ⟢ Lh_v:(ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1ext_A:βˆ€ {f g : A ⟢ A}, (ConcreteCategory.hom f) 1 = (ConcreteCategory.hom g) 1 β†’ f = g⊒ prod.fst ⊚ e.hom ⊚ a = prod.fst ⊚ e.hom ⊚ b All goals completed! πŸ™ inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }a:A ⟢ Lb:A ⟢ Lh_v:(ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1ext_A:βˆ€ {f g : A ⟢ A}, (ConcreteCategory.hom f) 1 = (ConcreteCategory.hom g) 1 β†’ f = g⊒ prod.snd ⊚ e.hom ⊚ a = prod.snd ⊚ e.hom ⊚ b All goals completed! πŸ™ All goals completed! πŸ™ -- Apply pigeonhole principle have h_pigeon : vβ‚€ = v₁ ∨ vβ‚€ = vβ‚‚ ∨ v₁ = vβ‚‚ := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)⊒ IsEmpty ((A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚) inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }h_fAL:βˆ€ {a b : A ⟢ L}, (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1 β†’ a = bval✝:β„•isLt✝:val✝ < 2⊒ ⟨val✝, isLt✝⟩ = v₁ ∨ ⟨val✝, isLt✝⟩ = vβ‚‚ ∨ v₁ = vβ‚‚; inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }h_fAL:βˆ€ {a b : A ⟢ L}, (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1 β†’ a = bval✝¹:β„•isLt✝¹:val✝ < 2val✝:β„•isLt✝:val✝ < 2⊒ ⟨val✝¹, isLt✝¹⟩ = ⟨val✝, isLt✝⟩ ∨ ⟨val✝¹, isLt✝¹⟩ = vβ‚‚ ∨ ⟨val✝, isLt✝⟩ = vβ‚‚; inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }h_fAL:βˆ€ {a b : A ⟢ L}, (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1 β†’ a = bval✝²:β„•isLt✝²:val✝ < 2val✝¹:β„•isLt✝¹:val✝ < 2val✝:β„•isLt✝:val✝ < 2⊒ ⟨val✝², isLt✝²⟩ = ⟨val✝¹, isLt✝¹⟩ ∨ ⟨val✝², isLt✝²⟩ = ⟨val✝, isLt✝⟩ ∨ ⟨val✝¹, isLt✝¹⟩ = ⟨val✝, isLt✝⟩; All goals completed! πŸ™ -- Derive contradiction for each collision inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }h_fAL:βˆ€ {a b : A ⟢ L}, (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1 β†’ a = bh01:vβ‚€ = vβ‚βŠ’ Falseinst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }h_fAL:βˆ€ {a b : A ⟢ L}, (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1 β†’ a = bh02:vβ‚€ = vβ‚‚βŠ’ Falseinst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }h_fAL:βˆ€ {a b : A ⟢ L}, (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1 β†’ a = bh12:v₁ = vβ‚‚βŠ’ False inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }h_fAL:βˆ€ {a b : A ⟢ L}, (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1 β†’ a = bh01:vβ‚€ = vβ‚βŠ’ False have h_contra : (1 : Fin 2) = 0 := calc 1 = (πŸ™ A) 1 := rfl _ = (m10 ⊚ j₁) 1 := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }h_fAL:βˆ€ {a b : A ⟢ L}, (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1 β†’ a = bh01:vβ‚€ = vβ‚βŠ’ (ConcreteCategory.hom (πŸ™ A)) 1 = (ConcreteCategory.hom (m10 ⊚ j₁)) 1 All goals completed! πŸ™ _ = (m10 ⊚ cAL) 1 := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }h_fAL:βˆ€ {a b : A ⟢ L}, (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1 β†’ a = bh01:vβ‚€ = vβ‚βŠ’ (ConcreteCategory.hom (m10 ⊚ j₁)) 1 = (ConcreteCategory.hom (m10 ⊚ cAL)) 1 All goals completed! πŸ™ _ = cAA 1 := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }h_fAL:βˆ€ {a b : A ⟢ L}, (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1 β†’ a = bh01:vβ‚€ = vβ‚βŠ’ (ConcreteCategory.hom (m10 ⊚ cAL)) 1 = (ConcreteCategory.hom cAA) 1 All goals completed! πŸ™ _ = 0 := rfl All goals completed! πŸ™ inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }h_fAL:βˆ€ {a b : A ⟢ L}, (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1 β†’ a = bh02:vβ‚€ = vβ‚‚βŠ’ False have h_contra : (1 : Fin 2) = 0 := calc 1 = (πŸ™ A) 1 := rfl _ = (m01 ⊚ jβ‚‚) 1 := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }h_fAL:βˆ€ {a b : A ⟢ L}, (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1 β†’ a = bh02:vβ‚€ = vβ‚‚βŠ’ (ConcreteCategory.hom (πŸ™ A)) 1 = (ConcreteCategory.hom (m01 ⊚ jβ‚‚)) 1 All goals completed! πŸ™ _ = (m01 ⊚ cAL) 1 := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }h_fAL:βˆ€ {a b : A ⟢ L}, (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1 β†’ a = bh02:vβ‚€ = vβ‚‚βŠ’ (ConcreteCategory.hom (m01 ⊚ jβ‚‚)) 1 = (ConcreteCategory.hom (m01 ⊚ cAL)) 1 All goals completed! πŸ™ _ = cAA 1 := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }h_fAL:βˆ€ {a b : A ⟢ L}, (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1 β†’ a = bh02:vβ‚€ = vβ‚‚βŠ’ (ConcreteCategory.hom (m01 ⊚ cAL)) 1 = (ConcreteCategory.hom cAA) 1 All goals completed! πŸ™ _ = 0 := rfl All goals completed! πŸ™ inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }h_fAL:βˆ€ {a b : A ⟢ L}, (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1 β†’ a = bh12:v₁ = vβ‚‚βŠ’ False have h_contra : (1 : Fin 2) = 0 := calc 1 = (πŸ™ A) 1 := rfl _ = (m10 ⊚ j₁) 1 := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }h_fAL:βˆ€ {a b : A ⟢ L}, (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1 β†’ a = bh12:v₁ = vβ‚‚βŠ’ (ConcreteCategory.hom (πŸ™ A)) 1 = (ConcreteCategory.hom (m10 ⊚ j₁)) 1 All goals completed! πŸ™ _ = (m10 ⊚ jβ‚‚) 1 := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }h_fAL:βˆ€ {a b : A ⟢ L}, (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1 β†’ a = bh12:v₁ = vβ‚‚βŠ’ (ConcreteCategory.hom (m10 ⊚ j₁)) 1 = (ConcreteCategory.hom (m10 ⊚ jβ‚‚)) 1 All goals completed! πŸ™ _ = cAA 1 := inst✝⁴:HasBinaryProduct A B₁inst✝³:HasBinaryProduct A Bβ‚‚inst✝²:HasBinaryCoproduct (A β¨― B₁) (A β¨― Bβ‚‚)inst✝¹:HasBinaryCoproduct B₁ Bβ‚‚inst✝:HasBinaryProduct A (B₁ β¨Ώ Bβ‚‚)e:(A β¨― B₁) β¨Ώ A β¨― Bβ‚‚ β‰… A β¨― B₁ β¨Ώ Bβ‚‚L:Pointed := (A β¨― B₁) β¨Ώ A β¨― Bβ‚‚Z:Pointed := B₁ β¨Ώ Bβ‚‚cAA:A ⟢ A := { toFun := fun x ↦ A.point, map_point := β‹― }cAL:A ⟢ L := { toFun := fun x ↦ L.point, map_point := β‹― }j₁:A ⟢ L := coprod.inl ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ B₁.point, map_point := β‹― }jβ‚‚:A ⟢ L := coprod.inr ⊚ prod.lift (πŸ™ A) { toFun := fun x ↦ Bβ‚‚.point, map_point := β‹― }vβ‚€:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ cAL)) 1v₁:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ j₁)) 1vβ‚‚:A.X := (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ jβ‚‚)) 1m10:L ⟢ A := coprod.desc prod.fst (cAA ⊚ prod.fst)m01:L ⟢ A := coprod.desc (cAA ⊚ prod.fst) prod.fsth10β‚€:m10 ⊚ cAL = cAAh01β‚€:m01 ⊚ cAL = cAAh10₁:m10 ⊚ j₁ = πŸ™ Ah01₁:m01 ⊚ j₁ = cAAh10β‚‚:m10 ⊚ jβ‚‚ = cAAh01β‚‚:m01 ⊚ jβ‚‚ = πŸ™ Ah_fXZ:βˆ€ {X : Pointed} (f : X ⟢ Z), f = { toFun := fun x ↦ Z.point, map_point := β‹― }h_fAL:βˆ€ {a b : A ⟢ L}, (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ a)) 1 = (ConcreteCategory.hom (prod.fst ⊚ e.hom ⊚ b)) 1 β†’ a = bh12:v₁ = vβ‚‚βŠ’ (ConcreteCategory.hom (m10 ⊚ jβ‚‚)) 1 = (ConcreteCategory.hom cAA) 1 All goals completed! πŸ™ _ = 0 := rfl All goals completed! πŸ™
Exercise 2 (p. 298)

As we saw, in the category of pointed sets, the (only) map {\mathbf{0} \rightarrow \mathbf{1}} is an isomorphism. Show that the other clause in the definition of linear category fails, i.e. find objects A and B in \mathbf{1}/𝑺 for which the 'identity matrix' A + B \rightarrow A \times B is not an isomorphism.

Solution: Exercise 2

Taking A and B to be, respectively,

def A : Pointed := { X := Fin 2 point := 0 } def B : Pointed := { X := Fin 2 point := 0 }

we can show that the identity matrix is not an isomorphism, as follows:

instance : OfNat A.X 0 where ofNat := (0 : Fin 2) instance : OfNat A.X 1 where ofNat := (1 : Fin 2) instance : OfNat B.X 0 where ofNat := (0 : Fin 2) instance : OfNat B.X 1 where ofNat := (1 : Fin 2) -- Define helper functions lemma eval_zero {X Y : Pointed} [HasZeroMorphisms Pointed] (x : X.X) : (0 : X ⟢ Y) x = Y.point := X:PointedY:Pointedinst✝:HasZeroMorphisms Pointedx:X.X⊒ (ConcreteCategory.hom 0) x = Y.point X:PointedY:Pointedinst✝:HasZeroMorphisms Pointedx:X.Xthis:{ toFun := fun x ↦ Y.point, map_point := β‹― } ⊚ 0 = 0⊒ (ConcreteCategory.hom 0) x = Y.point X:PointedY:Pointedinst✝:HasZeroMorphisms Pointedx:X.Xthis:{ toFun := fun x ↦ Y.point, map_point := β‹― } ⊚ 0 = 0⊒ (ConcreteCategory.hom ({ toFun := fun x ↦ Y.point, map_point := β‹― } ⊚ 0)) x = Y.point; All goals completed! πŸ™ abbrev d11 : Fin 2 β†’ Fin 2 β†’ Fin 2 | 1, 1 => 1 | _, _ => 0 example [HasZeroMorphisms Pointed] [HasBinaryProduct A B] [HasBinaryCoproduct A B] : IsEmpty (IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))) := inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A B⊒ IsEmpty (IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))) inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A B⊒ IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))) β†’ False inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))⊒ False -- Construct identity matrix inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))⊒ False -- Construct morphism v mapping (1, 1) to 1 and everything else to 0 let v : A β¨― B ⟢ A := { toFun := fun x ↦ d11 ((prod.fst : A β¨― B ⟢ A).toFun x) ((prod.snd : A β¨― B ⟢ B).toFun x) map_point := inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))⊒ d11 (prod.fst.toFun (A β¨― B).point) (prod.snd.toFun (A β¨― B).point) = A.point inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))⊒ d11 A.point B.point = A.point; All goals completed! πŸ™ } -- Construct diagonal morphism mapping 1 to (1, 1) inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }⊒ False -- Evaluate projections on left (a, 0) and right (0, b) axes have eval_inl_fst (x : A.X) : ((prod.fst : A β¨― B ⟢ A) ⊚ prod.lift (πŸ™ A) 0) x = x := inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A B⊒ IsEmpty (IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))) inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }x:A.X⊒ (ConcreteCategory.hom (πŸ™ A)) x = x; All goals completed! πŸ™ have eval_inl_snd (x : A.X) : ((prod.snd : A β¨― B ⟢ B) ⊚ prod.lift (πŸ™ A) 0) x = 0 := inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A B⊒ IsEmpty (IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))) inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xx:A.X⊒ (ConcreteCategory.hom 0) x = 0 All goals completed! πŸ™ have eval_inr_fst (x : B.X) : ((prod.fst : A β¨― B ⟢ A) ⊚ prod.lift 0 (πŸ™ B)) x = 0 := inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A B⊒ IsEmpty (IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))) inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0x:B.X⊒ (ConcreteCategory.hom 0) x = 0 All goals completed! πŸ™ have eval_inr_snd (x : B.X) : ((prod.snd : A β¨― B ⟢ B) ⊚ prod.lift 0 (πŸ™ B)) x = x := inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A B⊒ IsEmpty (IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))) inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0x:B.X⊒ (ConcreteCategory.hom (πŸ™ B)) x = x; All goals completed! πŸ™ -- Show v acts exactly like zero morphism on left axis have hv_inl : (v ⊚ I) ⊚ coprod.inl = (0 ⊚ I) ⊚ coprod.inl := inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A B⊒ IsEmpty (IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))) inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xthis:I ⊚ coprod.inl = prod.lift (πŸ™ A) 0⊒ (v ⊚ I) ⊚ coprod.inl = (0 ⊚ I) ⊚ coprod.inl inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xthis:I ⊚ coprod.inl = prod.lift (πŸ™ A) 0⊒ v ⊚ prod.lift (πŸ™ A) 0 = 0 ⊚ prod.lift (πŸ™ A) 0 inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xthis:I ⊚ coprod.inl = prod.lift (πŸ™ A) 0x:A.X⊒ ↑(ConcreteCategory.hom (v ⊚ prod.lift (πŸ™ A) 0)) x = ↑(ConcreteCategory.hom (0 ⊚ prod.lift (πŸ™ A) 0)) x inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xthis:I ⊚ coprod.inl = prod.lift (πŸ™ A) 0x:A.X⊒ d11 ((ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x) ((ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x) = (ConcreteCategory.hom 0) ((ConcreteCategory.hom (prod.lift (πŸ™ A) 0)) x) inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xthis:I ⊚ coprod.inl = prod.lift (πŸ™ A) 0x:A.X⊒ d11 x 0 = A.point inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xthis:I ⊚ coprod.inl = prod.lift (πŸ™ A) 0x:Fin 2⊒ d11 x 0 = A.point inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xthis:I ⊚ coprod.inl = prod.lift (πŸ™ A) 0⊒ d11 ((fun i ↦ i) ⟨0, β‹―βŸ©) 0 = A.pointinst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xthis:I ⊚ coprod.inl = prod.lift (πŸ™ A) 0⊒ d11 ((fun i ↦ i) ⟨1, β‹―βŸ©) 0 = A.point inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xthis:I ⊚ coprod.inl = prod.lift (πŸ™ A) 0⊒ d11 ((fun i ↦ i) ⟨0, β‹―βŸ©) 0 = A.pointinst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xthis:I ⊚ coprod.inl = prod.lift (πŸ™ A) 0⊒ d11 ((fun i ↦ i) ⟨1, β‹―βŸ©) 0 = A.point All goals completed! πŸ™ -- Show v acts exactly like zero morphism on right axis have hv_inr : (v ⊚ I) ⊚ coprod.inr = (0 ⊚ I) ⊚ coprod.inr := inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A B⊒ IsEmpty (IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))) inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xhv_inl:(v ⊚ I) ⊚ coprod.inl = (0 ⊚ I) ⊚ coprod.inlthis:I ⊚ coprod.inr = prod.lift 0 (πŸ™ B)⊒ (v ⊚ I) ⊚ coprod.inr = (0 ⊚ I) ⊚ coprod.inr inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xhv_inl:(v ⊚ I) ⊚ coprod.inl = (0 ⊚ I) ⊚ coprod.inlthis:I ⊚ coprod.inr = prod.lift 0 (πŸ™ B)⊒ v ⊚ prod.lift 0 (πŸ™ B) = 0 ⊚ prod.lift 0 (πŸ™ B) inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xhv_inl:(v ⊚ I) ⊚ coprod.inl = (0 ⊚ I) ⊚ coprod.inlthis:I ⊚ coprod.inr = prod.lift 0 (πŸ™ B)x:B.X⊒ ↑(ConcreteCategory.hom (v ⊚ prod.lift 0 (πŸ™ B))) x = ↑(ConcreteCategory.hom (0 ⊚ prod.lift 0 (πŸ™ B))) x inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xhv_inl:(v ⊚ I) ⊚ coprod.inl = (0 ⊚ I) ⊚ coprod.inlthis:I ⊚ coprod.inr = prod.lift 0 (πŸ™ B)x:B.X⊒ d11 ((ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x) ((ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x) = (ConcreteCategory.hom 0) ((ConcreteCategory.hom (prod.lift 0 (πŸ™ B))) x) inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xhv_inl:(v ⊚ I) ⊚ coprod.inl = (0 ⊚ I) ⊚ coprod.inlthis:I ⊚ coprod.inr = prod.lift 0 (πŸ™ B)x:B.X⊒ d11 0 x = A.point inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xhv_inl:(v ⊚ I) ⊚ coprod.inl = (0 ⊚ I) ⊚ coprod.inlthis:I ⊚ coprod.inr = prod.lift 0 (πŸ™ B)x:Fin 2⊒ d11 0 x = A.point inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xhv_inl:(v ⊚ I) ⊚ coprod.inl = (0 ⊚ I) ⊚ coprod.inlthis:I ⊚ coprod.inr = prod.lift 0 (πŸ™ B)⊒ d11 0 ((fun i ↦ i) ⟨0, β‹―βŸ©) = A.pointinst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xhv_inl:(v ⊚ I) ⊚ coprod.inl = (0 ⊚ I) ⊚ coprod.inlthis:I ⊚ coprod.inr = prod.lift 0 (πŸ™ B)⊒ d11 0 ((fun i ↦ i) ⟨1, β‹―βŸ©) = A.point inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xhv_inl:(v ⊚ I) ⊚ coprod.inl = (0 ⊚ I) ⊚ coprod.inlthis:I ⊚ coprod.inr = prod.lift 0 (πŸ™ B)⊒ d11 0 ((fun i ↦ i) ⟨0, β‹―βŸ©) = A.pointinst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xhv_inl:(v ⊚ I) ⊚ coprod.inl = (0 ⊚ I) ⊚ coprod.inlthis:I ⊚ coprod.inr = prod.lift 0 (πŸ™ B)⊒ d11 0 ((fun i ↦ i) ⟨1, β‹―βŸ©) = A.point All goals completed! πŸ™ -- Hence v must be zero morphism have hv_eq : v = 0 := inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A B⊒ IsEmpty (IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))) inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xhv_inl:(v ⊚ I) ⊚ coprod.inl = (0 ⊚ I) ⊚ coprod.inlhv_inr:(v ⊚ I) ⊚ coprod.inr = (0 ⊚ I) ⊚ coprod.inr⊒ v ⊚ πŸ™ (A β¨― B) = 0 ⊚ πŸ™ (A β¨― B) inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xhv_inl:(v ⊚ I) ⊚ coprod.inl = (0 ⊚ I) ⊚ coprod.inlhv_inr:(v ⊚ I) ⊚ coprod.inr = (0 ⊚ I) ⊚ coprod.inr⊒ v ⊚ I ⊚ inv I = 0 ⊚ I ⊚ inv I repeat inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xhv_inl:(v ⊚ I) ⊚ coprod.inl = (0 ⊚ I) ⊚ coprod.inlhv_inr:(v ⊚ I) ⊚ coprod.inr = (0 ⊚ I) ⊚ coprod.inr⊒ (v ⊚ I) ⊚ inv I = (0 ⊚ I) ⊚ inv I All goals completed! πŸ™ -- Derive 1 = 0 contradiction by evaluating v at (1, 1) have h_contra : (1 : Fin 2) = 0 := calc 1 = d11 1 1 := rfl _ = d11 (((prod.fst : A β¨― B ⟢ A) ⊚ f11) 1) (((prod.snd : A β¨― B ⟢ B) ⊚ f11) 1) := inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xhv_inl:(v ⊚ I) ⊚ coprod.inl = (0 ⊚ I) ⊚ coprod.inlhv_inr:(v ⊚ I) ⊚ coprod.inr = (0 ⊚ I) ⊚ coprod.inrhv_eq:v = 0⊒ d11 1 1 = d11 ((ConcreteCategory.hom (prod.fst ⊚ f11)) 1) ((ConcreteCategory.hom (prod.snd ⊚ f11)) 1) inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xhv_inl:(v ⊚ I) ⊚ coprod.inl = (0 ⊚ I) ⊚ coprod.inlhv_inr:(v ⊚ I) ⊚ coprod.inr = (0 ⊚ I) ⊚ coprod.inrhv_eq:v = 0⊒ d11 1 1 = d11 ((ConcreteCategory.hom (πŸ™ A)) 1) ((ConcreteCategory.hom { toFun := fun x ↦ x, map_point := β‹― }) 1); All goals completed! πŸ™ _ = v (f11 1) := rfl _ = (0 : A β¨― B ⟢ A) (f11 1) := inst✝²:HasZeroMorphisms Pointedinst✝¹:HasBinaryProduct A Binst✝:HasBinaryCoproduct A Bh_iso:IsIso (coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B)))I:A β¨Ώ B ⟢ A β¨― B := coprod.desc (prod.lift (πŸ™ A) 0) (prod.lift 0 (πŸ™ B))v:A β¨― B ⟢ A := { toFun := fun x ↦ d11 (prod.fst.toFun x) (prod.snd.toFun x), map_point := β‹― }f11:A ⟢ A β¨― B := prod.lift (πŸ™ A) { toFun := fun x ↦ x, map_point := β‹― }eval_inl_fst:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift (πŸ™ A) 0)) x = xeval_inl_snd:βˆ€ (x : A.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift (πŸ™ A) 0)) x = 0eval_inr_fst:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.fst ⊚ prod.lift 0 (πŸ™ B))) x = 0eval_inr_snd:βˆ€ (x : B.X), (ConcreteCategory.hom (prod.snd ⊚ prod.lift 0 (πŸ™ B))) x = xhv_inl:(v ⊚ I) ⊚ coprod.inl = (0 ⊚ I) ⊚ coprod.inlhv_inr:(v ⊚ I) ⊚ coprod.inr = (0 ⊚ I) ⊚ coprod.inrhv_eq:v = 0⊒ (ConcreteCategory.hom v) ((ConcreteCategory.hom f11) 1) = (ConcreteCategory.hom 0) ((ConcreteCategory.hom f11) 1) All goals completed! πŸ™ _ = 0 := eval_zero (f11 1) All goals completed! πŸ™