A Lean Companion to Conceptual Mathematics

Article II: Isomorphisms๐Ÿ”—

1. Isomorphisms๐Ÿ”—

Definition: Isomorphism, Inverse (p. 40)

A map {A \xrightarrow{f} B} is called an isomorphism, or invertible map, if there is a map {B \xrightarrow{g} A} for which {g \circ f = 1_A} and {f \circ g = 1_B}.

A map g related to f by satisfying these equations is called an inverse for f.

Two objects A and B are said to be isomorphic if there is at least one isomorphism {A \xrightarrow{f} B}.

The corresponding mathlib definition for isomorphism is Iso (and IsIso), which we print below for reference.

structure CategoryTheory.Iso.{v, u} {C : Type u} [Category.{v, u} C] (X Y : C) : Type v number of parameters: 4 fields: CategoryTheory.Iso.hom : X โŸถ Y CategoryTheory.Iso.inv : Y โŸถ X CategoryTheory.Iso.hom_inv_id : self.inv โŠš self.hom = ๐Ÿ™ X := by cat_disch CategoryTheory.Iso.inv_hom_id : self.hom โŠš self.inv = ๐Ÿ™ Y := by cat_disch constructor: CategoryTheory.Iso.mk.{v, u} {C : Type u} [Category.{v, u} C] {X Y : C} (hom : X โŸถ Y) (inv : Y โŸถ X) (hom_inv_id : inv โŠš hom = ๐Ÿ™ X := by cat_disch) (inv_hom_id : hom โŠš inv = ๐Ÿ™ Y := by cat_disch) : X โ‰… Y#print Iso
structure CategoryTheory.Iso.{v, u} {C : Type u} [Category.{v, u} C] (X Y : C) : Type v
number of parameters: 4
fields:
  CategoryTheory.Iso.hom : X โŸถ Y
  CategoryTheory.Iso.inv : Y โŸถ X
  CategoryTheory.Iso.hom_inv_id : self.inv โŠš self.hom = ๐Ÿ™ X := by
    cat_disch
  CategoryTheory.Iso.inv_hom_id : self.hom โŠš self.inv = ๐Ÿ™ Y := by
    cat_disch
constructor:
  CategoryTheory.Iso.mk.{v, u} {C : Type u} [Category.{v, u} C] {X Y : C} (hom : X โŸถ Y) (inv : Y โŸถ X)
    (hom_inv_id : inv โŠš hom = ๐Ÿ™ X := by cat_disch) (inv_hom_id : hom โŠš inv = ๐Ÿ™ Y := by cat_disch) : X โ‰… Y
class CategoryTheory.IsIso.{v, u} {C : Type u} [Category.{v, u} C] {X Y : C} (f : X โŸถ Y) : Prop number of parameters: 5 fields: CategoryTheory.IsIso.out : โˆƒ inv, inv โŠš f = ๐Ÿ™ X โˆง f โŠš inv = ๐Ÿ™ Y constructor: CategoryTheory.IsIso.mk.{v, u} {C : Type u} [Category.{v, u} C] {X Y : C} {f : X โŸถ Y} (out : โˆƒ inv, inv โŠš f = ๐Ÿ™ X โˆง f โŠš inv = ๐Ÿ™ Y) : IsIso f#print IsIso
class CategoryTheory.IsIso.{v, u} {C : Type u} [Category.{v, u} C] {X Y : C} (f : X โŸถ Y) : Prop
number of parameters: 5
fields:
  CategoryTheory.IsIso.out : โˆƒ inv, inv โŠš f = ๐Ÿ™ X โˆง f โŠš inv = ๐Ÿ™ Y
constructor:
  CategoryTheory.IsIso.mk.{v, u} {C : Type u} [Category.{v, u} C] {X Y : C} {f : X โŸถ Y}
    (out : โˆƒ inv, inv โŠš f = ๐Ÿ™ X โˆง f โŠš inv = ๐Ÿ™ Y) : IsIso f
Excerpt (p. 41)

Reflexive: A is isomorphic to A.

Symmetric: If A is isomorphic to B, then B is isomorphic to A.

Transitive: If A is isomorphic to B, and B is isomorphic to C, then A is isomorphic to C.

The respective mathlib definitions are Iso.refl, Iso.symm, and Iso.trans, which we print below for reference.

def CategoryTheory.Iso.refl.{v, u} : {C : Type u} โ†’ [inst : Category.{v, u} C] โ†’ (X : C) โ†’ X โ‰… X := fun {C} [Category.{v, u} C] X โ†ฆ { hom := ๐Ÿ™ X, inv := ๐Ÿ™ X, hom_inv_id := โ‹ฏ, inv_hom_id := โ‹ฏ }#print Iso.refl
def CategoryTheory.Iso.refl.{v, u} : {C : Type u} โ†’ [inst : Category.{v, u} C] โ†’ (X : C) โ†’ X โ‰… X :=
fun {C} [Category.{v, u} C] X โ†ฆ { hom := ๐Ÿ™ X, inv := ๐Ÿ™ X, hom_inv_id := โ‹ฏ, inv_hom_id := โ‹ฏ }
def CategoryTheory.Iso.symm.{v, u} : {C : Type u} โ†’ [inst : Category.{v, u} C] โ†’ {X Y : C} โ†’ (X โ‰… Y) โ†’ (Y โ‰… X) := fun {C} [Category.{v, u} C] {X Y} I โ†ฆ { hom := I.inv, inv := I.hom, hom_inv_id := โ‹ฏ, inv_hom_id := โ‹ฏ }#print Iso.symm
def CategoryTheory.Iso.symm.{v, u} : {C : Type u} โ†’ [inst : Category.{v, u} C] โ†’ {X Y : C} โ†’ (X โ‰… Y) โ†’ (Y โ‰… X) :=
fun {C} [Category.{v, u} C] {X Y} I โ†ฆ { hom := I.inv, inv := I.hom, hom_inv_id := โ‹ฏ, inv_hom_id := โ‹ฏ }
def CategoryTheory.Iso.trans.{v, u} : {C : Type u} โ†’ [inst : Category.{v, u} C] โ†’ {X Y Z : C} โ†’ (X โ‰… Y) โ†’ (Y โ‰… Z) โ†’ (X โ‰… Z) := fun {C} [Category.{v, u} C] {X Y Z} ฮฑ ฮฒ โ†ฆ { hom := ฮฒ.hom โŠš ฮฑ.hom, inv := ฮฑ.inv โŠš ฮฒ.inv, hom_inv_id := โ‹ฏ, inv_hom_id := โ‹ฏ }#print Iso.trans
def CategoryTheory.Iso.trans.{v, u} : {C : Type u} โ†’
  [inst : Category.{v, u} C] โ†’ {X Y Z : C} โ†’ (X โ‰… Y) โ†’ (Y โ‰… Z) โ†’ (X โ‰… Z) :=
fun {C} [Category.{v, u} C] {X Y Z} ฮฑ ฮฒ โ†ฆ
  { hom := ฮฒ.hom โŠš ฮฑ.hom, inv := ฮฑ.inv โŠš ฮฒ.inv, hom_inv_id := โ‹ฏ, inv_hom_id := โ‹ฏ }
Exercise 1 (p. 41)

(R) Show that {A \xrightarrow{1_A} A} is an isomorphism. (Hint: find an inverse for 1_A.)

(S) Show that if {A \xrightarrow{f} B} is an isomorphism, and {B \xrightarrow{g} A} is an inverse for f; then g is also an isomorphism. (Hint: find an inverse for g.)

(T) Show that if {A \xrightarrow{f} B} and {B \xrightarrow{k} C} are isomorphisms, {A \xrightarrow{k \circ f} C} is also an isomorphism.

Solution: Exercise 1variable {๐’ž : Type u} [Category.{v, u} ๐’ž] {A B C : ๐’ž}

(R) 1_A is an inverse for itself, so 1_A is an isomorphism.

example : IsIso (๐Ÿ™ A) := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žโŠข IsIso (๐Ÿ™ A) ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žโŠข ๐Ÿ™ A โŠš ๐Ÿ™ A = ๐Ÿ™ A โˆง ๐Ÿ™ A โŠš ๐Ÿ™ A = ๐Ÿ™ A ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žโŠข ๐Ÿ™ A โŠš ๐Ÿ™ A = ๐Ÿ™ A๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žโŠข ๐Ÿ™ A โŠš ๐Ÿ™ A = ๐Ÿ™ A ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žโŠข ๐Ÿ™ A โŠš ๐Ÿ™ A = ๐Ÿ™ A๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žโŠข ๐Ÿ™ A โŠš ๐Ÿ™ A = ๐Ÿ™ A All goals completed! ๐Ÿ™

(S) f is an inverse for g, so g is an isomorphism. (Note that the hypothesis "f is an isomorphism" is redundant here and could be omitted.)

example (f : A โŸถ B) (_ : IsIso f) (g : B โŸถ A) (hg : g โŠš f = ๐Ÿ™ A โˆง f โŠš g = ๐Ÿ™ B) : IsIso g := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bxโœ:IsIso fg:B โŸถ Ahg:g โŠš f = ๐Ÿ™ A โˆง f โŠš g = ๐Ÿ™ BโŠข IsIso g ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bxโœ:IsIso fg:B โŸถ Ahg:g โŠš f = ๐Ÿ™ A โˆง f โŠš g = ๐Ÿ™ BโŠข f โŠš g = ๐Ÿ™ B โˆง g โŠš f = ๐Ÿ™ A All goals completed! ๐Ÿ™

(T) Composition of isomorphisms is transitive, so {k \circ f} is an isomorphism.

example (f : A โŸถ B) (hf : IsIso f) (k : B โŸถ C) (hk : IsIso k) : IsIso (k โŠš f) := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bhf:IsIso fk:B โŸถ Chk:IsIso kโŠข IsIso (k โŠš f) ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bk:B โŸถ Chk:IsIso kfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ BโŠข IsIso (k โŠš f) ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bk:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bkinv:C โŸถ Bhkinv:kinv โŠš k = ๐Ÿ™ B โˆง k โŠš kinv = ๐Ÿ™ CโŠข IsIso (k โŠš f) ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bk:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bkinv:C โŸถ Bhkinv:kinv โŠš k = ๐Ÿ™ B โˆง k โŠš kinv = ๐Ÿ™ CโŠข (finv โŠš kinv) โŠš k โŠš f = ๐Ÿ™ A โˆง (k โŠš f) โŠš finv โŠš kinv = ๐Ÿ™ C ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bk:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bkinv:C โŸถ Bhkinv:kinv โŠš k = ๐Ÿ™ B โˆง k โŠš kinv = ๐Ÿ™ CโŠข (finv โŠš kinv) โŠš k โŠš f = ๐Ÿ™ A๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bk:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bkinv:C โŸถ Bhkinv:kinv โŠš k = ๐Ÿ™ B โˆง k โŠš kinv = ๐Ÿ™ CโŠข (k โŠš f) โŠš finv โŠš kinv = ๐Ÿ™ C ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bk:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bkinv:C โŸถ Bhkinv:kinv โŠš k = ๐Ÿ™ B โˆง k โŠš kinv = ๐Ÿ™ CโŠข (finv โŠš kinv) โŠš k โŠš f = ๐Ÿ™ A ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bk:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bkinv:C โŸถ Bhkinv:kinv โŠš k = ๐Ÿ™ B โˆง k โŠš kinv = ๐Ÿ™ CโŠข (finv โŠš kinv โŠš k) โŠš f = ๐Ÿ™ A All goals completed! ๐Ÿ™ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bk:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bkinv:C โŸถ Bhkinv:kinv โŠš k = ๐Ÿ™ B โˆง k โŠš kinv = ๐Ÿ™ CโŠข (k โŠš f) โŠš finv โŠš kinv = ๐Ÿ™ C ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bk:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bkinv:C โŸถ Bhkinv:kinv โŠš k = ๐Ÿ™ B โˆง k โŠš kinv = ๐Ÿ™ CโŠข (k โŠš f โŠš finv) โŠš kinv = ๐Ÿ™ C All goals completed! ๐Ÿ™
Exercise 2 (p. 42)

Suppose {B \xrightarrow{g} A} and {B \xrightarrow{k} A} are both inverses for {A \xrightarrow{f} B}. Show that {g = k}.

Solution: Exercise 2

The inverse of a map is unique (when it exists).

example {๐’ž : Type u} [Category.{v, u} ๐’ž] {A B : ๐’ž} (f : A โŸถ B) (g : B โŸถ A) (hg : g โŠš f = ๐Ÿ™ A โˆง f โŠš g = ๐Ÿ™ B) (k : B โŸถ A) (hk : k โŠš f = ๐Ÿ™ A โˆง f โŠš k = ๐Ÿ™ B) : g = k := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bg:B โŸถ Ahg:g โŠš f = ๐Ÿ™ A โˆง f โŠš g = ๐Ÿ™ Bk:B โŸถ Ahk:k โŠš f = ๐Ÿ™ A โˆง f โŠš k = ๐Ÿ™ BโŠข g = k calc g = ๐Ÿ™ A โŠš g := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bg:B โŸถ Ahg:g โŠš f = ๐Ÿ™ A โˆง f โŠš g = ๐Ÿ™ Bk:B โŸถ Ahk:k โŠš f = ๐Ÿ™ A โˆง f โŠš k = ๐Ÿ™ BโŠข g = ๐Ÿ™ A โŠš g All goals completed! ๐Ÿ™ _ = (k โŠš f) โŠš g := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bg:B โŸถ Ahg:g โŠš f = ๐Ÿ™ A โˆง f โŠš g = ๐Ÿ™ Bk:B โŸถ Ahk:k โŠš f = ๐Ÿ™ A โˆง f โŠš k = ๐Ÿ™ BโŠข ๐Ÿ™ A โŠš g = (k โŠš f) โŠš g All goals completed! ๐Ÿ™ _ = k โŠš (f โŠš g) := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bg:B โŸถ Ahg:g โŠš f = ๐Ÿ™ A โˆง f โŠš g = ๐Ÿ™ Bk:B โŸถ Ahk:k โŠš f = ๐Ÿ™ A โˆง f โŠš k = ๐Ÿ™ BโŠข (k โŠš f) โŠš g = k โŠš f โŠš g All goals completed! ๐Ÿ™ _ = k โŠš ๐Ÿ™ B := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bg:B โŸถ Ahg:g โŠš f = ๐Ÿ™ A โˆง f โŠš g = ๐Ÿ™ Bk:B โŸถ Ahk:k โŠš f = ๐Ÿ™ A โˆง f โŠš k = ๐Ÿ™ BโŠข k โŠš f โŠš g = k โŠš ๐Ÿ™ B All goals completed! ๐Ÿ™ _ = k := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bg:B โŸถ Ahg:g โŠš f = ๐Ÿ™ A โˆง f โŠš g = ๐Ÿ™ Bk:B โŸถ Ahk:k โŠš f = ๐Ÿ™ A โˆง f โŠš k = ๐Ÿ™ BโŠข k โŠš ๐Ÿ™ B = k All goals completed! ๐Ÿ™
Exercise 3 (p. 43)

If f has an inverse, then f satisfies the two cancellation laws:

(a) If {f \circ h = f \circ k}, then {h = k}.

(b) If {h \circ f = k \circ f}, then {h = k}.

Warning: The following 'cancellation law' is not correct, even if f has an inverse.

(c) (wrong): If {h \circ f = f \circ k}, then {h = k}.

Solution: Exercise 3variable {๐’ž : Type u} [Category.{v, u} ๐’ž] {A B : ๐’ž}

(a) We show that f is left-cancellative.

example (f : A โŸถ B) (hf : โˆƒ finv : B โŸถ A, finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ B) (h : B โŸถ A) (k : B โŸถ A) : f โŠš h = f โŠš k โ†’ h = k := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bhf:โˆƒ finv, finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bh:B โŸถ Ak:B โŸถ AโŠข f โŠš h = f โŠš k โ†’ h = k ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bh:B โŸถ Ak:B โŸถ Afinv:B โŸถ Ahfinvโ‚:finv โŠš f = ๐Ÿ™ Ahfinvโ‚‚:f โŠš finv = ๐Ÿ™ BโŠข f โŠš h = f โŠš k โ†’ h = k ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bh:B โŸถ Ak:B โŸถ Afinv:B โŸถ Ahfinvโ‚:finv โŠš f = ๐Ÿ™ Ahfinvโ‚‚:f โŠš finv = ๐Ÿ™ Bhโ‚:f โŠš h = f โŠš kโŠข h = k have hโ‚‚ : finv โŠš f โŠš h = finv โŠš f โŠš k := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bhf:โˆƒ finv, finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bh:B โŸถ Ak:B โŸถ AโŠข f โŠš h = f โŠš k โ†’ h = k All goals completed! ๐Ÿ™ repeat ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bh:B โŸถ Ak:B โŸถ Afinv:B โŸถ Ahfinvโ‚:finv โŠš f = ๐Ÿ™ Ahfinvโ‚‚:f โŠš finv = ๐Ÿ™ Bhโ‚:f โŠš h = f โŠš khโ‚‚:(finv โŠš f) โŠš h = (finv โŠš f) โŠš kโŠข h = k ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bh:B โŸถ Ak:B โŸถ Afinv:B โŸถ Ahfinvโ‚:finv โŠš f = ๐Ÿ™ Ahfinvโ‚‚:f โŠš finv = ๐Ÿ™ Bhโ‚:f โŠš h = f โŠš khโ‚‚:๐Ÿ™ A โŠš h = ๐Ÿ™ A โŠš kโŠข h = k repeat ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bh:B โŸถ Ak:B โŸถ Afinv:B โŸถ Ahfinvโ‚:finv โŠš f = ๐Ÿ™ Ahfinvโ‚‚:f โŠš finv = ๐Ÿ™ Bhโ‚:f โŠš h = f โŠš khโ‚‚:h = kโŠข h = k All goals completed! ๐Ÿ™

(b) We show that f is right-cancellative.

example (f : A โŸถ B) (hf : โˆƒ finv : B โŸถ A, finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ B) (h : B โŸถ A) (k : B โŸถ A) : h โŠš f = k โŠš f โ†’ h = k := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bhf:โˆƒ finv, finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bh:B โŸถ Ak:B โŸถ AโŠข h โŠš f = k โŠš f โ†’ h = k ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bh:B โŸถ Ak:B โŸถ Afinv:B โŸถ Ahfinvโ‚:finv โŠš f = ๐Ÿ™ Ahfinvโ‚‚:f โŠš finv = ๐Ÿ™ BโŠข h โŠš f = k โŠš f โ†’ h = k ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bh:B โŸถ Ak:B โŸถ Afinv:B โŸถ Ahfinvโ‚:finv โŠš f = ๐Ÿ™ Ahfinvโ‚‚:f โŠš finv = ๐Ÿ™ Bhโ‚:h โŠš f = k โŠš fโŠข h = k have hโ‚‚ : (h โŠš f) โŠš finv = (k โŠš f) โŠš finv := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bhf:โˆƒ finv, finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bh:B โŸถ Ak:B โŸถ AโŠข h โŠš f = k โŠš f โ†’ h = k All goals completed! ๐Ÿ™ repeat ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bh:B โŸถ Ak:B โŸถ Afinv:B โŸถ Ahfinvโ‚:finv โŠš f = ๐Ÿ™ Ahfinvโ‚‚:f โŠš finv = ๐Ÿ™ Bhโ‚:h โŠš f = k โŠš fhโ‚‚:h โŠš f โŠš finv = k โŠš f โŠš finvโŠข h = k ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bh:B โŸถ Ak:B โŸถ Afinv:B โŸถ Ahfinvโ‚:finv โŠš f = ๐Ÿ™ Ahfinvโ‚‚:f โŠš finv = ๐Ÿ™ Bhโ‚:h โŠš f = k โŠš fhโ‚‚:h โŠš ๐Ÿ™ B = k โŠš ๐Ÿ™ BโŠข h = k repeat ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bh:B โŸถ Ak:B โŸถ Afinv:B โŸถ Ahfinvโ‚:finv โŠš f = ๐Ÿ™ Ahfinvโ‚‚:f โŠš finv = ๐Ÿ™ Bhโ‚:h โŠš f = k โŠš fhโ‚‚:h = kโŠข h = k All goals completed! ๐Ÿ™

(c) We take our counterexample from endomaps on Fin 2, the canonical type with two elements.

def f : Fin 2 โŸถ Fin 2 | 0 => 1 | 1 => 0

f has an inverse, as required. (f is self-inverse.)

example : f โŠš f = ๐Ÿ™ (Fin 2) := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žโŠข f โŠš f = ๐Ÿ™ (Fin 2) ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žx:Fin 2โŠข (f โŠš f) x = ๐Ÿ™ (Fin 2) x ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žโŠข (f โŠš f) ((fun i โ†ฆ i) โŸจ0, โ‹ฏโŸฉ) = ๐Ÿ™ (Fin 2) ((fun i โ†ฆ i) โŸจ0, โ‹ฏโŸฉ)๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žโŠข (f โŠš f) ((fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ) = ๐Ÿ™ (Fin 2) ((fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ) ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žโŠข (f โŠš f) ((fun i โ†ฆ i) โŸจ0, โ‹ฏโŸฉ) = ๐Ÿ™ (Fin 2) ((fun i โ†ฆ i) โŸจ0, โ‹ฏโŸฉ)๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žโŠข (f โŠš f) ((fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ) = ๐Ÿ™ (Fin 2) ((fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ) All goals completed! ๐Ÿ™ def h : Fin 2 โŸถ Fin 2 | 0 => 1 | 1 => 1 def k : Fin 2 โŸถ Fin 2 | 0 => 0 | 1 => 0 example : ยฌ(h โŠš f = f โŠš k โ†’ h = k) := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žโŠข ยฌ(h โŠš f = f โŠš k โ†’ h = k) ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žโŠข h โŠš f = f โŠš k โˆง h โ‰  k ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žโŠข h โŠš f = f โŠš k๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žโŠข h โ‰  k ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žโŠข h โŠš f = f โŠš k ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žx:Fin 2โŠข (h โŠš f) x = (f โŠš k) x ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žโŠข (h โŠš f) ((fun i โ†ฆ i) โŸจ0, โ‹ฏโŸฉ) = (f โŠš k) ((fun i โ†ฆ i) โŸจ0, โ‹ฏโŸฉ)๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žโŠข (h โŠš f) ((fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ) = (f โŠš k) ((fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ) ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žโŠข (h โŠš f) ((fun i โ†ฆ i) โŸจ0, โ‹ฏโŸฉ) = (f โŠš k) ((fun i โ†ฆ i) โŸจ0, โ‹ฏโŸฉ)๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žโŠข (h โŠš f) ((fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ) = (f โŠš k) ((fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ) All goals completed! ๐Ÿ™ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žโŠข h โ‰  k ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žhโ‚€:h = kโŠข False ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žhโ‚€:h = khโ‚:h 0 = 1 := rflโŠข False ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žhโ‚€:h = khโ‚:h 0 = 1 := rflhโ‚‚:k 0 = 0 := rflโŠข False ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žhโ‚€:h = khโ‚:h 0 = 1 := rflhโ‚‚:1 = 0โŠข False All goals completed! ๐Ÿ™
Exercise 4 (p. 44)

For each of the five maps below: decide whether it is invertible; and if it is invertible, find a 'formula' for the inverse map.

  1. \mathbb{R} \xrightarrow{f} \mathbb{R},\; f(x) = 3x + 7

  2. \mathbb{R}_{\ge 0} \xrightarrow{g} \mathbb{R}_{\ge 0},\; g(x) = x^2

  3. \mathbb{R} \xrightarrow{h} \mathbb{R},\; h(x) = x^2

  4. \mathbb{R} \xrightarrow{k} \mathbb{R}_{\ge 0},\; k(x) = x^2

  5. \mathbb{R}_{\ge 0} \xrightarrow{l} \mathbb{R}_{\ge 0},\; l(x) = \dfrac{1}{x + 1}

Solution: Exercise 4

Since all five maps have their domain and codomain as the real numbers (or a subset of the real numbers), we implement them as functions in Lean.

f is invertible, with inverse {f^{-1}(x) = \dfrac{x - 7}{3}}.

example (f : โ„ โ†’ โ„) (hf : โˆ€ x : โ„, f x = 3 * x + 7) : โˆƒ finv : โ„ โ†’ โ„, finv โˆ˜ f = id โˆง f โˆ˜ finv = id := f:โ„ โ†’ โ„hf:โˆ€ (x : โ„), f x = 3 * x + 7โŠข โˆƒ finv, finv โˆ˜ f = id โˆง f โˆ˜ finv = id f:โ„ โ†’ โ„hf:โˆ€ (x : โ„), f x = 3 * x + 7โŠข (fun x โ†ฆ (x - 7) / 3) โˆ˜ f = id โˆง (f โˆ˜ fun x โ†ฆ (x - 7) / 3) = id -- fโปยน(x) f:โ„ โ†’ โ„hf:โˆ€ (x : โ„), f x = 3 * x + 7โŠข (fun x โ†ฆ (x - 7) / 3) โˆ˜ f = idf:โ„ โ†’ โ„hf:โˆ€ (x : โ„), f x = 3 * x + 7โŠข (f โˆ˜ fun x โ†ฆ (x - 7) / 3) = id f:โ„ โ†’ โ„hf:โˆ€ (x : โ„), f x = 3 * x + 7โŠข (fun x โ†ฆ (x - 7) / 3) โˆ˜ f = id f:โ„ โ†’ โ„hf:โˆ€ (x : โ„), f x = 3 * x + 7x:โ„โŠข ((fun x โ†ฆ (x - 7) / 3) โˆ˜ f) x = id x f:โ„ โ†’ โ„hf:โˆ€ (x : โ„), f x = 3 * x + 7x:โ„โŠข (3 * x + 7 - 7) / 3 = x All goals completed! ๐Ÿ™ f:โ„ โ†’ โ„hf:โˆ€ (x : โ„), f x = 3 * x + 7โŠข (f โˆ˜ fun x โ†ฆ (x - 7) / 3) = id f:โ„ โ†’ โ„hf:โˆ€ (x : โ„), f x = 3 * x + 7x:โ„โŠข (f โˆ˜ fun x โ†ฆ (x - 7) / 3) x = id x f:โ„ โ†’ โ„hf:โˆ€ (x : โ„), f x = 3 * x + 7x:โ„โŠข 3 * ((x - 7) / 3) + 7 = x All goals completed! ๐Ÿ™

g is invertible, with inverse {g^{-1}(x) = \sqrt{x}}.

open NNReal in example (g : โ„โ‰ฅ0 โ†’ โ„โ‰ฅ0) (hg : โˆ€ x : โ„โ‰ฅ0, g x = x * x) : โˆƒ ginv : โ„โ‰ฅ0 โ†’ โ„โ‰ฅ0, ginv โˆ˜ g = id โˆง g โˆ˜ ginv = id := g:โ„โ‰ฅ0 โ†’ โ„โ‰ฅ0hg:โˆ€ (x : โ„โ‰ฅ0), g x = x * xโŠข โˆƒ ginv, ginv โˆ˜ g = id โˆง g โˆ˜ ginv = id g:โ„โ‰ฅ0 โ†’ โ„โ‰ฅ0hg:โˆ€ (x : โ„โ‰ฅ0), g x = x * xโŠข (fun x โ†ฆ sqrt x) โˆ˜ g = id โˆง (g โˆ˜ fun x โ†ฆ sqrt x) = id -- gโปยน(x) g:โ„โ‰ฅ0 โ†’ โ„โ‰ฅ0hg:โˆ€ (x : โ„โ‰ฅ0), g x = x * xโŠข (fun x โ†ฆ sqrt x) โˆ˜ g = idg:โ„โ‰ฅ0 โ†’ โ„โ‰ฅ0hg:โˆ€ (x : โ„โ‰ฅ0), g x = x * xโŠข (g โˆ˜ fun x โ†ฆ sqrt x) = id g:โ„โ‰ฅ0 โ†’ โ„โ‰ฅ0hg:โˆ€ (x : โ„โ‰ฅ0), g x = x * xโŠข (fun x โ†ฆ sqrt x) โˆ˜ g = id g:โ„โ‰ฅ0 โ†’ โ„โ‰ฅ0hg:โˆ€ (x : โ„โ‰ฅ0), g x = x * xx:โ„โ‰ฅ0โŠข ((fun x โ†ฆ sqrt x) โˆ˜ g) x = id x g:โ„โ‰ฅ0 โ†’ โ„โ‰ฅ0hg:โˆ€ (x : โ„โ‰ฅ0), g x = x * xx:โ„โ‰ฅ0โŠข sqrt (x * x) = x All goals completed! ๐Ÿ™ g:โ„โ‰ฅ0 โ†’ โ„โ‰ฅ0hg:โˆ€ (x : โ„โ‰ฅ0), g x = x * xโŠข (g โˆ˜ fun x โ†ฆ sqrt x) = id g:โ„โ‰ฅ0 โ†’ โ„โ‰ฅ0hg:โˆ€ (x : โ„โ‰ฅ0), g x = x * xx:โ„โ‰ฅ0โŠข (g โˆ˜ fun x โ†ฆ sqrt x) x = id x g:โ„โ‰ฅ0 โ†’ โ„โ‰ฅ0hg:โˆ€ (x : โ„โ‰ฅ0), g x = x * xx:โ„โ‰ฅ0โŠข sqrt x * sqrt x = x All goals completed! ๐Ÿ™

h is not invertible, since {h(1) = h(-1) = 1}.

example (h : โ„ โ†’ โ„) (hh : โˆ€ x : โ„, h x = x * x) : ยฌ(โˆƒ hinv : โ„ โ†’ โ„, hinv โˆ˜ h = id โˆง h โˆ˜ hinv = id) := h:โ„ โ†’ โ„hh:โˆ€ (x : โ„), h x = x * xโŠข ยฌโˆƒ hinv, hinv โˆ˜ h = id โˆง h โˆ˜ hinv = id h:โ„ โ†’ โ„hh:โˆ€ (x : โ„), h x = x * xโŠข โˆ€ (hinv : โ„ โ†’ โ„), hinv โˆ˜ h = id โ†’ h โˆ˜ hinv โ‰  id intro hinv h:โ„ โ†’ โ„hh:โˆ€ (x : โ„), h x = x * xhinv:โ„ โ†’ โ„h_inv_left:hinv โˆ˜ h = idโŠข h โˆ˜ hinv โ‰  id h:โ„ โ†’ โ„hh:โˆ€ (x : โ„), h x = x * xhinv:โ„ โ†’ โ„h_inv_left:hinv โˆ˜ h = idaโœ:h โˆ˜ hinv = idโŠข False have hโ‚ : h 1 = 1 := h:โ„ โ†’ โ„hh:โˆ€ (x : โ„), h x = x * xโŠข ยฌโˆƒ hinv, hinv โˆ˜ h = id โˆง h โˆ˜ hinv = id h:โ„ โ†’ โ„hh:โˆ€ (x : โ„), h x = x * xhinv:โ„ โ†’ โ„h_inv_left:hinv โˆ˜ h = idaโœ:h โˆ˜ hinv = idโŠข 1 * 1 = 1 All goals completed! ๐Ÿ™ have hโ‚‚ : h (-1) = 1 := h:โ„ โ†’ โ„hh:โˆ€ (x : โ„), h x = x * xโŠข ยฌโˆƒ hinv, hinv โˆ˜ h = id โˆง h โˆ˜ hinv = id h:โ„ โ†’ โ„hh:โˆ€ (x : โ„), h x = x * xhinv:โ„ โ†’ โ„h_inv_left:hinv โˆ˜ h = idaโœ:h โˆ˜ hinv = idhโ‚:h 1 = 1 := Eq.mpr (id (congrArg (fun _a โ†ฆ _a = 1) (hh 1))) (Mathlib.Meta.NormNum.isNat_eq_true (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one) (Eq.refl 1)) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one))โŠข -1 * -1 = 1 All goals completed! ๐Ÿ™ have hโ‚ƒ : (hinv โˆ˜ h) 1 = 1:= h:โ„ โ†’ โ„hh:โˆ€ (x : โ„), h x = x * xโŠข ยฌโˆƒ hinv, hinv โˆ˜ h = id โˆง h โˆ˜ hinv = id All goals completed! ๐Ÿ™ have hโ‚„ : (hinv โˆ˜ h) (-1) = -1 := h:โ„ โ†’ โ„hh:โˆ€ (x : โ„), h x = x * xโŠข ยฌโˆƒ hinv, hinv โˆ˜ h = id โˆง h โˆ˜ hinv = id All goals completed! ๐Ÿ™ h:โ„ โ†’ โ„hh:โˆ€ (x : โ„), h x = x * xhinv:โ„ โ†’ โ„h_inv_left:hinv โˆ˜ h = idaโœ:h โˆ˜ hinv = idhโ‚:h 1 = 1 := Eq.mpr (id (congrArg (fun _a โ†ฆ _a = 1) (hh 1))) (Mathlib.Meta.NormNum.isNat_eq_true (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one) (Eq.refl 1)) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one))hโ‚‚:h (-1) = 1 := Eq.mpr (id (congrArg (fun _a โ†ฆ _a = 1) (hh (-1)))) (Mathlib.Meta.NormNum.isNat_eq_true (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one)) (Eq.refl (Int.negOfNat 1))) (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one)) (Eq.refl (Int.negOfNat 1))) (Eq.refl (Int.ofNat 1)))) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one))hโ‚ƒ:hinv (h 1) = 1 := Eq.mpr (id (congrArg (fun _a โ†ฆ _a 1 = 1) h_inv_left)) (Eq.mpr (id (congrArg (fun _a โ†ฆ _a = 1) (id_eq 1))) (Eq.refl 1))hโ‚„:hinv (h (-1)) = -1 := Eq.mpr (id (congrArg (fun _a โ†ฆ _a (-1) = -1) h_inv_left)) (Eq.mpr (id (congrArg (fun _a โ†ฆ _a = -1) (id_eq (-1)))) (Eq.refl (-1)))โŠข False h:โ„ โ†’ โ„hh:โˆ€ (x : โ„), h x = x * xhinv:โ„ โ†’ โ„h_inv_left:hinv โˆ˜ h = idaโœ:h โˆ˜ hinv = idhโ‚:h 1 = 1 := Eq.mpr (id (congrArg (fun _a โ†ฆ _a = 1) (hh 1))) (Mathlib.Meta.NormNum.isNat_eq_true (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one) (Eq.refl 1)) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one))hโ‚‚:h (-1) = 1 := Eq.mpr (id (congrArg (fun _a โ†ฆ _a = 1) (hh (-1)))) (Mathlib.Meta.NormNum.isNat_eq_true (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one)) (Eq.refl (Int.negOfNat 1))) (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one)) (Eq.refl (Int.negOfNat 1))) (Eq.refl (Int.ofNat 1)))) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one))hโ‚ƒ:hinv 1 = 1hโ‚„:hinv (h (-1)) = -1โŠข False h:โ„ โ†’ โ„hh:โˆ€ (x : โ„), h x = x * xhinv:โ„ โ†’ โ„h_inv_left:hinv โˆ˜ h = idaโœ:h โˆ˜ hinv = idhโ‚:h 1 = 1 := Eq.mpr (id (congrArg (fun _a โ†ฆ _a = 1) (hh 1))) (Mathlib.Meta.NormNum.isNat_eq_true (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one) (Eq.refl 1)) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one))hโ‚‚:h (-1) = 1 := Eq.mpr (id (congrArg (fun _a โ†ฆ _a = 1) (hh (-1)))) (Mathlib.Meta.NormNum.isNat_eq_true (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one)) (Eq.refl (Int.negOfNat 1))) (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one)) (Eq.refl (Int.negOfNat 1))) (Eq.refl (Int.ofNat 1)))) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one))hโ‚ƒ:hinv 1 = 1hโ‚„:hinv 1 = -1โŠข False All goals completed! ๐Ÿ™

k is not invertible, since {k(1) = k(-1) = 1}.

open NNReal in example (k : โ„ โ†’ โ„โ‰ฅ0) (hk : โˆ€ x : โ„, k x = x * x) : ยฌ(โˆƒ kinv : โ„โ‰ฅ0 โ†’ โ„, kinv โˆ˜ k = id โˆง k โˆ˜ kinv = id) := k:โ„ โ†’ โ„โ‰ฅ0hk:โˆ€ (x : โ„), โ†‘(k x) = x * xโŠข ยฌโˆƒ kinv, kinv โˆ˜ k = id โˆง k โˆ˜ kinv = id k:โ„ โ†’ โ„โ‰ฅ0hk:โˆ€ (x : โ„), โ†‘(k x) = x * xโŠข โˆ€ (kinv : โ„โ‰ฅ0 โ†’ โ„), kinv โˆ˜ k = id โ†’ k โˆ˜ kinv โ‰  id intro kinv k:โ„ โ†’ โ„โ‰ฅ0hk:โˆ€ (x : โ„), โ†‘(k x) = x * xkinv:โ„โ‰ฅ0 โ†’ โ„h_inv_left:kinv โˆ˜ k = idโŠข k โˆ˜ kinv โ‰  id k:โ„ โ†’ โ„โ‰ฅ0hk:โˆ€ (x : โ„), โ†‘(k x) = x * xkinv:โ„โ‰ฅ0 โ†’ โ„h_inv_left:kinv โˆ˜ k = idaโœ:k โˆ˜ kinv = idโŠข False have hโ‚ : k 1 = 1 := k:โ„ โ†’ โ„โ‰ฅ0hk:โˆ€ (x : โ„), โ†‘(k x) = x * xโŠข ยฌโˆƒ kinv, kinv โˆ˜ k = id โˆง k โˆ˜ kinv = id k:โ„ โ†’ โ„โ‰ฅ0hk:โˆ€ (x : โ„), โ†‘(k x) = x * xkinv:โ„โ‰ฅ0 โ†’ โ„h_inv_left:kinv โˆ˜ k = idaโœ:k โˆ˜ kinv = idโŠข 1 * 1 = 1 All goals completed! ๐Ÿ™ have hโ‚‚ : k (-1) = 1 := k:โ„ โ†’ โ„โ‰ฅ0hk:โˆ€ (x : โ„), โ†‘(k x) = x * xโŠข ยฌโˆƒ kinv, kinv โˆ˜ k = id โˆง k โˆ˜ kinv = id k:โ„ โ†’ โ„โ‰ฅ0hk:โˆ€ (x : โ„), โ†‘(k x) = x * xkinv:โ„โ‰ฅ0 โ†’ โ„h_inv_left:kinv โˆ˜ k = idaโœ:k โˆ˜ kinv = idhโ‚:k 1 = 1 := Eq.mpr (id (congrArg (fun _a โ†ฆ _a) (Eq.symm (propext coe_eq_one)))) (Eq.mpr (id (congrArg (fun _a โ†ฆ _a = 1) (hk 1))) (Mathlib.Meta.NormNum.isNat_eq_true (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one) (Eq.refl 1)) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one)))โŠข -1 * -1 = 1 All goals completed! ๐Ÿ™ have hโ‚ƒ : (kinv โˆ˜ k) 1 = 1:= k:โ„ โ†’ โ„โ‰ฅ0hk:โˆ€ (x : โ„), โ†‘(k x) = x * xโŠข ยฌโˆƒ kinv, kinv โˆ˜ k = id โˆง k โˆ˜ kinv = id All goals completed! ๐Ÿ™ have hโ‚„ : (kinv โˆ˜ k) (-1) = -1 := k:โ„ โ†’ โ„โ‰ฅ0hk:โˆ€ (x : โ„), โ†‘(k x) = x * xโŠข ยฌโˆƒ kinv, kinv โˆ˜ k = id โˆง k โˆ˜ kinv = id All goals completed! ๐Ÿ™ k:โ„ โ†’ โ„โ‰ฅ0hk:โˆ€ (x : โ„), โ†‘(k x) = x * xkinv:โ„โ‰ฅ0 โ†’ โ„h_inv_left:kinv โˆ˜ k = idaโœ:k โˆ˜ kinv = idhโ‚:k 1 = 1 := Eq.mpr (id (congrArg (fun _a โ†ฆ _a) (Eq.symm (propext coe_eq_one)))) (Eq.mpr (id (congrArg (fun _a โ†ฆ _a = 1) (hk 1))) (Mathlib.Meta.NormNum.isNat_eq_true (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one) (Eq.refl 1)) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one)))hโ‚‚:k (-1) = 1 := Eq.mpr (id (congrArg (fun _a โ†ฆ _a) (Eq.symm (propext coe_eq_one)))) (Eq.mpr (id (congrArg (fun _a โ†ฆ _a = 1) (hk (-1)))) (Mathlib.Meta.NormNum.isNat_eq_true (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one)) (Eq.refl (Int.negOfNat 1))) (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one)) (Eq.refl (Int.negOfNat 1))) (Eq.refl (Int.ofNat 1)))) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one)))hโ‚ƒ:kinv (k 1) = 1 := Eq.mpr (id (congrArg (fun _a โ†ฆ _a 1 = 1) h_inv_left)) (Eq.mpr (id (congrArg (fun _a โ†ฆ _a = 1) (id_eq 1))) (Eq.refl 1))hโ‚„:kinv (k (-1)) = -1 := Eq.mpr (id (congrArg (fun _a โ†ฆ _a (-1) = -1) h_inv_left)) (Eq.mpr (id (congrArg (fun _a โ†ฆ _a = -1) (id_eq (-1)))) (Eq.refl (-1)))โŠข False k:โ„ โ†’ โ„โ‰ฅ0hk:โˆ€ (x : โ„), โ†‘(k x) = x * xkinv:โ„โ‰ฅ0 โ†’ โ„h_inv_left:kinv โˆ˜ k = idaโœ:k โˆ˜ kinv = idhโ‚:k 1 = 1 := Eq.mpr (id (congrArg (fun _a โ†ฆ _a) (Eq.symm (propext coe_eq_one)))) (Eq.mpr (id (congrArg (fun _a โ†ฆ _a = 1) (hk 1))) (Mathlib.Meta.NormNum.isNat_eq_true (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one) (Eq.refl 1)) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one)))hโ‚‚:k (-1) = 1 := Eq.mpr (id (congrArg (fun _a โ†ฆ _a) (Eq.symm (propext coe_eq_one)))) (Eq.mpr (id (congrArg (fun _a โ†ฆ _a = 1) (hk (-1)))) (Mathlib.Meta.NormNum.isNat_eq_true (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one)) (Eq.refl (Int.negOfNat 1))) (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one)) (Eq.refl (Int.negOfNat 1))) (Eq.refl (Int.ofNat 1)))) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one)))hโ‚ƒ:kinv 1 = 1hโ‚„:kinv (k (-1)) = -1โŠข False k:โ„ โ†’ โ„โ‰ฅ0hk:โˆ€ (x : โ„), โ†‘(k x) = x * xkinv:โ„โ‰ฅ0 โ†’ โ„h_inv_left:kinv โˆ˜ k = idaโœ:k โˆ˜ kinv = idhโ‚:k 1 = 1 := Eq.mpr (id (congrArg (fun _a โ†ฆ _a) (Eq.symm (propext coe_eq_one)))) (Eq.mpr (id (congrArg (fun _a โ†ฆ _a = 1) (hk 1))) (Mathlib.Meta.NormNum.isNat_eq_true (Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one) (Eq.refl 1)) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one)))hโ‚‚:k (-1) = 1 := Eq.mpr (id (congrArg (fun _a โ†ฆ _a) (Eq.symm (propext coe_eq_one)))) (Eq.mpr (id (congrArg (fun _a โ†ฆ _a = 1) (hk (-1)))) (Mathlib.Meta.NormNum.isNat_eq_true (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one)) (Eq.refl (Int.negOfNat 1))) (Mathlib.Meta.NormNum.isInt_neg (Eq.refl Neg.neg) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one)) (Eq.refl (Int.negOfNat 1))) (Eq.refl (Int.ofNat 1)))) (Mathlib.Meta.NormNum.isNat_ofNat โ„ Nat.cast_one)))hโ‚ƒ:kinv 1 = 1hโ‚„:kinv 1 = -1โŠข False All goals completed! ๐Ÿ™

l is invertible, with inverse {l^{-1}(x) = \dfrac{1}{x} - 1}, provided that we restrict the codomain of l to the interval {(0,1]}.

TODO Exercise II.4.5

2. General division problems: Determination and choice๐Ÿ”—

Exercise 5 concerns counting the number of sections and retractions for a map (though those terms aren't formally defined until a short while later on p. 49). Rather than providing an exhaustive list of maps, we introduce here two formulas โ€” what the book later calls Chad's formula and Danilo's formula (p. 117).

The former states that the number of sections for a map p is given by \prod_{\mathbf{1} \xrightarrow{a} A} \#(p^{-1}a), where A is the codomain of p.

def Chad's_formula {ฮฑ ฯ‡ : Type*} [DecidableEq ฮฑ] [Fintype ฮฑ] [Fintype ฯ‡] (X : Finset ฯ‡) (A : Finset ฮฑ) (p : ฯ‡ โ†’ ฮฑ) : โ„• := โˆ a โˆˆ A, pinvCount a where pinvCount (a : ฮฑ) : โ„• := X.filter (fun x โ†ฆ p x = a) |>.card

The latter states that the number of retractions for a map j, assuming j is injective, is given by (\#A)^{(\#X - \#A)}, where A is the domain of j and X is the codomain of j.

open Finset in def Danilo's_formula {ฮฑ ฯ‡ : Type*} [Fintype ฮฑ] [Fintype ฯ‡] (A : Finset ฮฑ) (X : Finset ฯ‡) (j : ฮฑ โ†’ ฯ‡) (p : ฯ‡ โ†’ ฮฑ) (_ : p โˆ˜ j = id) (_ : Function.Injective j) : โ„• := #A ^ (#X - #A)
Exercise 5 (p. 47)

Given

\{b, p, q, r, s\} \xrightarrow{g} \{0, 1\}\\\ \qquad b \mapsto 0\\\ \qquad p \mapsto 0\\\ \qquad q \mapsto 0\\\ \qquad r \mapsto 1\\\ \qquad s \mapsto 1,

how many maps f are there with {g \circ f = 1_{\{0, 1\}}}?

Choosing a particular such f, how many maps g (including the given one) satisfy the same equation?

Solution: Exercise 5inductive XElems | b | p | q | r | s deriving Fintype def A : Finset (Fin 2) := Finset.univ def X : Finset XElems := Finset.univ open XElems in def g : XElems โ†’ Fin 2 | b => 0 | p => 0 | q => 0 | r => 1 | s => 1

By Chad's formula, we have 6 different maps f with {g \circ f = 1_{\{0, 1\}}}.

6#eval Chad's_formula X A g
6

We choose f to be

open XElems in def f : Fin 2 โ†’ XElems | 0 => b | 1 => r

Then, by Danilo's formula, we have {(\#A)^{(\#X - \#A)} = 2^3 = 8} different maps g.

8#eval Danilo's_formula A X f g (โŠข g โˆ˜ f = id x:Fin 2โŠข (g โˆ˜ f) x = id x โŠข (g โˆ˜ f) ((fun i โ†ฆ i) โŸจ0, โ‹ฏโŸฉ) = id ((fun i โ†ฆ i) โŸจ0, โ‹ฏโŸฉ)โŠข (g โˆ˜ f) ((fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ) = id ((fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ) โŠข (g โˆ˜ f) ((fun i โ†ฆ i) โŸจ0, โ‹ฏโŸฉ) = id ((fun i โ†ฆ i) โŸจ0, โ‹ฏโŸฉ)โŠข (g โˆ˜ f) ((fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ) = id ((fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ) All goals completed! ๐Ÿ™) (โŠข Function.Injective f intro x x:Fin 2y:Fin 2โŠข f x = f y โ†’ x = y x:Fin 2y:Fin 2aโœ:f x = f yโŠข x = y y:Fin 2aโœ:f ((fun i โ†ฆ i) โŸจ0, โ‹ฏโŸฉ) = f yโŠข (fun i โ†ฆ i) โŸจ0, โ‹ฏโŸฉ = yy:Fin 2aโœ:f ((fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ) = f yโŠข (fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ = y y:Fin 2aโœ:f ((fun i โ†ฆ i) โŸจ0, โ‹ฏโŸฉ) = f yโŠข (fun i โ†ฆ i) โŸจ0, โ‹ฏโŸฉ = yy:Fin 2aโœ:f ((fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ) = f yโŠข (fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ = y aโœ:f ((fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ) = f ((fun i โ†ฆ i) โŸจ0, โ‹ฏโŸฉ)โŠข (fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ = (fun i โ†ฆ i) โŸจ0, โ‹ฏโŸฉaโœ:f ((fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ) = f ((fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ)โŠข (fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ = (fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ all_goals first | All goals completed! ๐Ÿ™ | aโœ:f ((fun i โ†ฆ i) โŸจ1, โ‹ฏโŸฉ) = f ((fun i โ†ฆ i) โŸจ0, โ‹ฏโŸฉ)โŠข 1 = 0; All goals completed! ๐Ÿ™)
8

3. Retractions, sections, and idempotents๐Ÿ”—

Definition: Retraction, Section (p. 49)

If {A \xrightarrow{f} B}:

a retraction for f is a map {B \xrightarrow{r} A} for which {r \circ f = 1_A};

a section for f is a map {B \xrightarrow{s} A} for which {f \circ s = 1_B}.

The mathlib definition corresponding to retraction is SplitMono (and IsSplitMono), which we print below for reference.

structure CategoryTheory.SplitMono.{vโ‚, uโ‚} {C : Type uโ‚} [Category.{vโ‚, uโ‚} C] {X Y : C} (f : X โŸถ Y) : Type vโ‚ number of parameters: 5 fields: CategoryTheory.SplitMono.retraction : Y โŸถ X CategoryTheory.SplitMono.id : self.retraction โŠš f = ๐Ÿ™ X := by cat_disch constructor: CategoryTheory.SplitMono.mk.{vโ‚, uโ‚} {C : Type uโ‚} [Category.{vโ‚, uโ‚} C] {X Y : C} {f : X โŸถ Y} (retraction : Y โŸถ X) (id : retraction โŠš f = ๐Ÿ™ X := by cat_disch) : SplitMono f#print SplitMono
structure CategoryTheory.SplitMono.{vโ‚, uโ‚} {C : Type uโ‚} [Category.{vโ‚, uโ‚} C] {X Y : C} (f : X โŸถ Y) : Type vโ‚
number of parameters: 5
fields:
  CategoryTheory.SplitMono.retraction : Y โŸถ X
  CategoryTheory.SplitMono.id : self.retraction โŠš f = ๐Ÿ™ X := by
    cat_disch
constructor:
  CategoryTheory.SplitMono.mk.{vโ‚, uโ‚} {C : Type uโ‚} [Category.{vโ‚, uโ‚} C] {X Y : C} {f : X โŸถ Y} (retraction : Y โŸถ X)
    (id : retraction โŠš f = ๐Ÿ™ X := by cat_disch) : SplitMono f
class CategoryTheory.IsSplitMono.{vโ‚, uโ‚} {C : Type uโ‚} [Category.{vโ‚, uโ‚} C] {X Y : C} (f : X โŸถ Y) : Prop number of parameters: 5 fields: CategoryTheory.IsSplitMono.exists_splitMono : Nonempty (SplitMono f) constructor: CategoryTheory.IsSplitMono.mk.{vโ‚, uโ‚} {C : Type uโ‚} [Category.{vโ‚, uโ‚} C] {X Y : C} {f : X โŸถ Y} (exists_splitMono : Nonempty (SplitMono f)) : IsSplitMono f#print IsSplitMono
class CategoryTheory.IsSplitMono.{vโ‚, uโ‚} {C : Type uโ‚} [Category.{vโ‚, uโ‚} C] {X Y : C} (f : X โŸถ Y) : Prop
number of parameters: 5
fields:
  CategoryTheory.IsSplitMono.exists_splitMono : Nonempty (SplitMono f)
constructor:
  CategoryTheory.IsSplitMono.mk.{vโ‚, uโ‚} {C : Type uโ‚} [Category.{vโ‚, uโ‚} C] {X Y : C} {f : X โŸถ Y}
    (exists_splitMono : Nonempty (SplitMono f)) : IsSplitMono f

We alias SplitMono and IsSplitMono as Retraction and IsRetraction, respectively, to remain aligned with the terminology in the book.

abbrev Retraction {๐’ž : Type u} [Category.{v, u} ๐’ž] {A B : ๐’ž} (f : A โŸถ B) := SplitMono f abbrev IsRetraction {๐’ž : Type u} [Category.{v, u} ๐’ž] {A B : ๐’ž} (f : A โŸถ B) := IsSplitMono f

The mathlib definition corresponding to section is SplitEpi (and IsSplitEpi), which we print below for reference.

structure CategoryTheory.SplitEpi.{vโ‚, uโ‚} {C : Type uโ‚} [Category.{vโ‚, uโ‚} C] {X Y : C} (f : X โŸถ Y) : Type vโ‚ number of parameters: 5 fields: CategoryTheory.SplitEpi.section_ : Y โŸถ X CategoryTheory.SplitEpi.id : f โŠš self.section_ = ๐Ÿ™ Y := by cat_disch constructor: CategoryTheory.SplitEpi.mk.{vโ‚, uโ‚} {C : Type uโ‚} [Category.{vโ‚, uโ‚} C] {X Y : C} {f : X โŸถ Y} (section_ : Y โŸถ X) (id : f โŠš section_ = ๐Ÿ™ Y := by cat_disch) : SplitEpi f#print SplitEpi
structure CategoryTheory.SplitEpi.{vโ‚, uโ‚} {C : Type uโ‚} [Category.{vโ‚, uโ‚} C] {X Y : C} (f : X โŸถ Y) : Type vโ‚
number of parameters: 5
fields:
  CategoryTheory.SplitEpi.section_ : Y โŸถ X
  CategoryTheory.SplitEpi.id : f โŠš self.section_ = ๐Ÿ™ Y := by
    cat_disch
constructor:
  CategoryTheory.SplitEpi.mk.{vโ‚, uโ‚} {C : Type uโ‚} [Category.{vโ‚, uโ‚} C] {X Y : C} {f : X โŸถ Y} (section_ : Y โŸถ X)
    (id : f โŠš section_ = ๐Ÿ™ Y := by cat_disch) : SplitEpi f
class CategoryTheory.IsSplitEpi.{vโ‚, uโ‚} {C : Type uโ‚} [Category.{vโ‚, uโ‚} C] {X Y : C} (f : X โŸถ Y) : Prop number of parameters: 5 fields: CategoryTheory.IsSplitEpi.exists_splitEpi : Nonempty (SplitEpi f) constructor: CategoryTheory.IsSplitEpi.mk.{vโ‚, uโ‚} {C : Type uโ‚} [Category.{vโ‚, uโ‚} C] {X Y : C} {f : X โŸถ Y} (exists_splitEpi : Nonempty (SplitEpi f)) : IsSplitEpi f#print IsSplitEpi
class CategoryTheory.IsSplitEpi.{vโ‚, uโ‚} {C : Type uโ‚} [Category.{vโ‚, uโ‚} C] {X Y : C} (f : X โŸถ Y) : Prop
number of parameters: 5
fields:
  CategoryTheory.IsSplitEpi.exists_splitEpi : Nonempty (SplitEpi f)
constructor:
  CategoryTheory.IsSplitEpi.mk.{vโ‚, uโ‚} {C : Type uโ‚} [Category.{vโ‚, uโ‚} C] {X Y : C} {f : X โŸถ Y}
    (exists_splitEpi : Nonempty (SplitEpi f)) : IsSplitEpi f

We alias SplitEpi and IsSplitEpi as Section and IsSection, respectively, to remain aligned with the terminology in the book.

abbrev Section {๐’ž : Type u} [Category.{v, u} ๐’ž] {A B : ๐’ž} (f : A โŸถ B) := SplitEpi f abbrev IsSection {๐’ž : Type u} [Category.{v, u} ๐’ž] {A B : ๐’ž} (f : A โŸถ B) := IsSplitEpi f
Proposition 1 (p. 51)

If a map {A \xrightarrow{f} B} has a section, then for any T and for any map {T \xrightarrow{y} B} there exists a map {T \xrightarrow{x} A} for which {f \circ x = y}.

Proof (p. 51)

The assumption means that we have a map s for which {f \circ s = 1_B}. Thus for any given map {T \xrightarrow{y} B} we see that we could define a map x with at least the correct domain and codomain by taking the composite s following y x = s \circ y. Does this map x actually satisfy the required equation? Calculating f \circ x = f \circ (s \circ y) = (f \circ s) \circ y = 1_B \circ y = y we see that it does.

Our implementation in Lean faithfully follows the argument of the book proof given above.

theorem prop1 {๐’ž : Type u} [Category.{v, u} ๐’ž] {A B T : ๐’ž} (f : A โŸถ B) [hf : IsSection f] : โˆ€ y : T โŸถ B, โˆƒ x : T โŸถ A, f โŠš x = y := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Bhf:IsSection fโŠข โˆ€ (y : T โŸถ B), โˆƒ x, f โŠš x = y ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Bs:B โŸถ Ahf:f โŠš s = ๐Ÿ™ BโŠข โˆ€ (y : T โŸถ B), โˆƒ x, f โŠš x = y ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Bs:B โŸถ Ahf:f โŠš s = ๐Ÿ™ By:T โŸถ BโŠข โˆƒ x, f โŠš x = y ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Bs:B โŸถ Ahf:f โŠš s = ๐Ÿ™ By:T โŸถ BโŠข f โŠš s โŠš y = y ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Bs:B โŸถ Ahf:f โŠš s = ๐Ÿ™ By:T โŸถ BโŠข (f โŠš s) โŠš y = y ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Bs:B โŸถ Ahf:f โŠš s = ๐Ÿ™ By:T โŸถ BโŠข ๐Ÿ™ B โŠš y = y All goals completed! ๐Ÿ™
Exercise 6 (p. 52)

If the map {A \xrightarrow{f} B} has a retraction, then for any map {A \xrightarrow{g} T}, there is a map {B \xrightarrow{t} T} for which {t \circ f = g}. (This is Proposition 1*.)

Solution: Exercise 6

Put {t = g \circ r}.

theorem ยซprop1*ยป {๐’ž : Type u} [Category.{v, u} ๐’ž] {A B T : ๐’ž} (f : A โŸถ B) [hf : IsRetraction f] : โˆ€ g : A โŸถ T, โˆƒ t : B โŸถ T, t โŠš f = g := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Bhf:IsRetraction fโŠข โˆ€ (g : A โŸถ T), โˆƒ t, t โŠš f = g ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Br:B โŸถ Ahf:r โŠš f = ๐Ÿ™ AโŠข โˆ€ (g : A โŸถ T), โˆƒ t, t โŠš f = g ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Br:B โŸถ Ahf:r โŠš f = ๐Ÿ™ Ag:A โŸถ TโŠข โˆƒ t, t โŠš f = g ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Br:B โŸถ Ahf:r โŠš f = ๐Ÿ™ Ag:A โŸถ TโŠข (g โŠš r) โŠš f = g All goals completed! ๐Ÿ™
Proposition 2 (p. 52)

Suppose a map {A \xrightarrow{f} B} has a retraction. Then for any set T and for any pair of maps {T \xrightarrow{x_1} A}, {T \xrightarrow{x_2} A} from any set T to A \text{if}\; f \circ x_1 = f \circ x_2 \;\text{then}\; x_1 = x_2.

Proof (p. 52)

Looking back at the definition, we see that the assumption means that we have a map r for which {r \circ f = 1_A}. Using the assumption that x_1 and x_2 are such that f composes with them to get the same {T \rightarrow B}, we can compose further with r as follows: x_1 = 1_A \circ x_1 = (r \circ f) \circ x_1 = r \circ (f \circ x_1) = r \circ (f \circ x_2) = (r \circ f) \circ x_2 = 1_A \circ x_2 = x_2.

Our implementation in Lean generalises the proposition from sets to any categorical object but otherwise faithfully follows the argument of the book proof given above.

theorem prop2 {๐’ž : Type u} [Category.{v, u} ๐’ž] {A B T : ๐’ž} (f : A โŸถ B) [hf : IsRetraction f] : โˆ€ xโ‚ xโ‚‚ : T โŸถ A, f โŠš xโ‚ = f โŠš xโ‚‚ โ†’ xโ‚ = xโ‚‚ := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Bhf:IsRetraction fโŠข โˆ€ (xโ‚ xโ‚‚ : T โŸถ A), f โŠš xโ‚ = f โŠš xโ‚‚ โ†’ xโ‚ = xโ‚‚ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Br:B โŸถ Ahf:r โŠš f = ๐Ÿ™ AโŠข โˆ€ (xโ‚ xโ‚‚ : T โŸถ A), f โŠš xโ‚ = f โŠš xโ‚‚ โ†’ xโ‚ = xโ‚‚ intro xโ‚ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Br:B โŸถ Ahf:r โŠš f = ๐Ÿ™ Axโ‚:T โŸถ Axโ‚‚:T โŸถ AโŠข f โŠš xโ‚ = f โŠš xโ‚‚ โ†’ xโ‚ = xโ‚‚ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Br:B โŸถ Ahf:r โŠš f = ๐Ÿ™ Axโ‚:T โŸถ Axโ‚‚:T โŸถ Ah:f โŠš xโ‚ = f โŠš xโ‚‚โŠข xโ‚ = xโ‚‚ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Br:B โŸถ Ahf:r โŠš f = ๐Ÿ™ Axโ‚:T โŸถ Axโ‚‚:T โŸถ Ah:f โŠš xโ‚ = f โŠš xโ‚‚โŠข ๐Ÿ™ A โŠš xโ‚ = xโ‚‚ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Br:B โŸถ Ahf:r โŠš f = ๐Ÿ™ Axโ‚:T โŸถ Axโ‚‚:T โŸถ Ah:f โŠš xโ‚ = f โŠš xโ‚‚โŠข (r โŠš f) โŠš xโ‚ = xโ‚‚ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Br:B โŸถ Ahf:r โŠš f = ๐Ÿ™ Axโ‚:T โŸถ Axโ‚‚:T โŸถ Ah:f โŠš xโ‚ = f โŠš xโ‚‚โŠข r โŠš f โŠš xโ‚ = xโ‚‚ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Br:B โŸถ Ahf:r โŠš f = ๐Ÿ™ Axโ‚:T โŸถ Axโ‚‚:T โŸถ Ah:f โŠš xโ‚ = f โŠš xโ‚‚โŠข r โŠš f โŠš xโ‚‚ = xโ‚‚ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Br:B โŸถ Ahf:r โŠš f = ๐Ÿ™ Axโ‚:T โŸถ Axโ‚‚:T โŸถ Ah:f โŠš xโ‚ = f โŠš xโ‚‚โŠข (r โŠš f) โŠš xโ‚‚ = xโ‚‚ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Br:B โŸถ Ahf:r โŠš f = ๐Ÿ™ Axโ‚:T โŸถ Axโ‚‚:T โŸถ Ah:f โŠš xโ‚ = f โŠš xโ‚‚โŠข ๐Ÿ™ A โŠš xโ‚‚ = xโ‚‚ All goals completed! ๐Ÿ™
Definition: Injective, Monomorphism (p. 52)

A map f satisfying the conclusion of Proposition 2 (for any pair of maps {T \xrightarrow{x_1} A} and {T \xrightarrow{x_2} A}, if {f \circ x_1 = f \circ x_2} then {x_1 = x_2}) is said to be injective for maps from T.

If f is injective for maps from T for every T, one says that f is injective, or is a monomorphism.

The corresponding mathlib definition is Mono, which we print below for reference.

class CategoryTheory.Mono.{v, u} {C : Type u} [Category.{v, u} C] {X Y : C} (f : X โŸถ Y) : Prop number of parameters: 5 fields: CategoryTheory.Mono.right_cancellation : โˆ€ {Z : C} (g h : Z โŸถ X), f โŠš g = f โŠš h โ†’ g = h constructor: CategoryTheory.Mono.mk.{v, u} {C : Type u} [Category.{v, u} C] {X Y : C} {f : X โŸถ Y} (right_cancellation : โˆ€ {Z : C} (g h : Z โŸถ X), f โŠš g = f โŠš h โ†’ g = h) : Mono f#print Mono
class CategoryTheory.Mono.{v, u} {C : Type u} [Category.{v, u} C] {X Y : C} (f : X โŸถ Y) : Prop
number of parameters: 5
fields:
  CategoryTheory.Mono.right_cancellation : โˆ€ {Z : C} (g h : Z โŸถ X), f โŠš g = f โŠš h โ†’ g = h
constructor:
  CategoryTheory.Mono.mk.{v, u} {C : Type u} [Category.{v, u} C] {X Y : C} {f : X โŸถ Y}
    (right_cancellation : โˆ€ {Z : C} (g h : Z โŸถ X), f โŠš g = f โŠš h โ†’ g = h) : Mono f
Exercise 7 (p. 53)

Suppose the map {A \xrightarrow{f} B} has a section. Then for any set T and any pair {B \xrightarrow{t_1} T}, {B \xrightarrow{t_2} T} of maps from B to T, if {t_1 \circ f = t_2 \circ f} then {t_1 = t_2}. (This is Proposition 2*.)

Solution: Exercise 7

A proof of Proposition 2* is given below.

theorem ยซprop2*ยป {๐’ž : Type u} [Category.{v, u} ๐’ž] {A B T : ๐’ž} (f : A โŸถ B) [hf : IsSection f] : โˆ€ tโ‚ tโ‚‚ : B โŸถ T, tโ‚ โŠš f = tโ‚‚ โŠš f โ†’ tโ‚ = tโ‚‚ := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Bhf:IsSection fโŠข โˆ€ (tโ‚ tโ‚‚ : B โŸถ T), tโ‚ โŠš f = tโ‚‚ โŠš f โ†’ tโ‚ = tโ‚‚ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Bs:B โŸถ Ahf:f โŠš s = ๐Ÿ™ BโŠข โˆ€ (tโ‚ tโ‚‚ : B โŸถ T), tโ‚ โŠš f = tโ‚‚ โŠš f โ†’ tโ‚ = tโ‚‚ intro tโ‚ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Bs:B โŸถ Ahf:f โŠš s = ๐Ÿ™ Btโ‚:B โŸถ Ttโ‚‚:B โŸถ TโŠข tโ‚ โŠš f = tโ‚‚ โŠš f โ†’ tโ‚ = tโ‚‚ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Bs:B โŸถ Ahf:f โŠš s = ๐Ÿ™ Btโ‚:B โŸถ Ttโ‚‚:B โŸถ Th:tโ‚ โŠš f = tโ‚‚ โŠš fโŠข tโ‚ = tโ‚‚ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Bs:B โŸถ Ahf:f โŠš s = ๐Ÿ™ Btโ‚:B โŸถ Ttโ‚‚:B โŸถ Th:tโ‚ โŠš f = tโ‚‚ โŠš fโŠข tโ‚ โŠš f โŠš s = tโ‚‚ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žT:๐’žf:A โŸถ Bs:B โŸถ Ahf:f โŠš s = ๐Ÿ™ Btโ‚:B โŸถ Ttโ‚‚:B โŸถ Th:tโ‚ โŠš f = tโ‚‚ โŠš fโŠข tโ‚‚ โŠš f โŠš s = tโ‚‚ All goals completed! ๐Ÿ™
Definition: Surjective, Epimorphism (p. 53)

A map f with this cancellation property (if {t_1 \circ f = t_2 \circ f} then {t_1 = t_2}) for every T is called an epimorphism.

The corresponding mathlib definition is Epi, which we print below for reference.

class CategoryTheory.Epi.{v, u} {C : Type u} [Category.{v, u} C] {X Y : C} (f : X โŸถ Y) : Prop number of parameters: 5 fields: CategoryTheory.Epi.left_cancellation : โˆ€ {Z : C} (g h : Y โŸถ Z), g โŠš f = h โŠš f โ†’ g = h constructor: CategoryTheory.Epi.mk.{v, u} {C : Type u} [Category.{v, u} C] {X Y : C} {f : X โŸถ Y} (left_cancellation : โˆ€ {Z : C} (g h : Y โŸถ Z), g โŠš f = h โŠš f โ†’ g = h) : Epi f#print Epi
class CategoryTheory.Epi.{v, u} {C : Type u} [Category.{v, u} C] {X Y : C} (f : X โŸถ Y) : Prop
number of parameters: 5
fields:
  CategoryTheory.Epi.left_cancellation : โˆ€ {Z : C} (g h : Y โŸถ Z), g โŠš f = h โŠš f โ†’ g = h
constructor:
  CategoryTheory.Epi.mk.{v, u} {C : Type u} [Category.{v, u} C] {X Y : C} {f : X โŸถ Y}
    (left_cancellation : โˆ€ {Z : C} (g h : Y โŸถ Z), g โŠš f = h โŠš f โ†’ g = h) : Epi f
Excerpt (p. 53)

Thus both 'monomorphism' and 'epimorphism' are 'cancellation' properties.

The mathlib theorems cancel_mono and cancel_epi are relevant here.

example {๐’ž : Type u} [Category.{v, u} ๐’ž] {X Y Z : ๐’ž} (f : X โŸถ Y) [Mono f] {g h : Z โŸถ X} : f โŠš g = f โŠš h โ†” g = h := cancel_mono f example {๐’ž : Type u} [Category.{v, u} ๐’ž] {X Y Z : ๐’ž} (f : X โŸถ Y) [Epi f] {g h : Y โŸถ Z} : g โŠš f = h โŠš f โ†” g = h := cancel_epi f
Proposition 3 (p. 53)

If {A \xrightarrow{f} B} has a retraction and if {B \xrightarrow{g} C} has a retraction, then {A \xrightarrow{g \circ f} C} has a retraction.

Proof (p. 53)

Let {r_1 \circ f = 1_A} and {r_2 \circ g = 1_B}. Then a good guess for a retraction of the composite would be the composite of the retractions in the opposite order (which is anyway the only order in which they can be composed). Does it in fact work? r \circ (g \circ f) = (r_1 \circ r_2) \circ (g \circ f) = r_1 \circ (r_2 \circ g) \circ f = r_1 \circ 1_B \circ f = r_1 \circ f = 1_A proves that r is a retraction for {g \circ f}.

Our implementation in Lean faithfully follows the argument of the book proof given above.

theorem prop3 {๐’ž : Type u} [Category.{v, u} ๐’ž] {A B C : ๐’ž} (f : A โŸถ B) [hf : IsRetraction f] (g : B โŸถ C) [hg : IsRetraction g] : IsRetraction (g โŠš f) := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bhf:IsRetraction fg:B โŸถ Chg:IsRetraction gโŠข IsRetraction (g โŠš f) ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Chg:IsRetraction grโ‚:B โŸถ Ahf:rโ‚ โŠš f = ๐Ÿ™ AโŠข IsRetraction (g โŠš f) ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Crโ‚:B โŸถ Ahf:rโ‚ โŠš f = ๐Ÿ™ Arโ‚‚:C โŸถ Bhg:rโ‚‚ โŠš g = ๐Ÿ™ BโŠข IsRetraction (g โŠš f) ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Crโ‚:B โŸถ Ahf:rโ‚ โŠš f = ๐Ÿ™ Arโ‚‚:C โŸถ Bhg:rโ‚‚ โŠš g = ๐Ÿ™ BโŠข autoParam ((rโ‚ โŠš rโ‚‚) โŠš g โŠš f = ๐Ÿ™ A) SplitMono.id._autoParam ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Crโ‚:B โŸถ Ahf:rโ‚ โŠš f = ๐Ÿ™ Arโ‚‚:C โŸถ Bhg:rโ‚‚ โŠš g = ๐Ÿ™ BโŠข (rโ‚ โŠš rโ‚‚) โŠš g โŠš f = ๐Ÿ™ A ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Crโ‚:B โŸถ Ahf:rโ‚ โŠš f = ๐Ÿ™ Arโ‚‚:C โŸถ Bhg:rโ‚‚ โŠš g = ๐Ÿ™ BโŠข (rโ‚ โŠš rโ‚‚ โŠš g) โŠš f = ๐Ÿ™ A ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Crโ‚:B โŸถ Ahf:rโ‚ โŠš f = ๐Ÿ™ Arโ‚‚:C โŸถ Bhg:rโ‚‚ โŠš g = ๐Ÿ™ BโŠข (rโ‚ โŠš ๐Ÿ™ B) โŠš f = ๐Ÿ™ A ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Crโ‚:B โŸถ Ahf:rโ‚ โŠš f = ๐Ÿ™ Arโ‚‚:C โŸถ Bhg:rโ‚‚ โŠš g = ๐Ÿ™ BโŠข rโ‚ โŠš f = ๐Ÿ™ A All goals completed! ๐Ÿ™

We note that the corresponding mathlib instance is instIsSplitMonoComp.

example {๐’ž : Type u} [Category.{v, u} ๐’ž] {A B C : ๐’ž} (f : A โŸถ B) [hf : IsRetraction f] (g : B โŸถ C) [hg : IsRetraction g] : IsRetraction (g โŠš f) := instIsSplitMonoComp
Exercise 8 (p. 54)

Prove that the composite of two maps, each having sections, has itself a section.

Solution: Exercise 8

The section of the composite is the composite of the sections in the opposite order (cf. Proposition 3).

example {๐’ž : Type u} [Category.{v, u} ๐’ž] {A B C : ๐’ž} (f : A โŸถ B) [hf : IsSection f] (g : B โŸถ C) [hg : IsSection g] : IsSection (g โŠš f) := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bhf:IsSection fg:B โŸถ Chg:IsSection gโŠข IsSection (g โŠš f) ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Chg:IsSection gsโ‚:B โŸถ Ahf:f โŠš sโ‚ = ๐Ÿ™ BโŠข IsSection (g โŠš f) ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Csโ‚:B โŸถ Ahf:f โŠš sโ‚ = ๐Ÿ™ Bsโ‚‚:C โŸถ Bhg:g โŠš sโ‚‚ = ๐Ÿ™ CโŠข IsSection (g โŠš f) ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Csโ‚:B โŸถ Ahf:f โŠš sโ‚ = ๐Ÿ™ Bsโ‚‚:C โŸถ Bhg:g โŠš sโ‚‚ = ๐Ÿ™ CโŠข autoParam ((g โŠš f) โŠš sโ‚ โŠš sโ‚‚ = ๐Ÿ™ C) SplitEpi.id._autoParam ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Csโ‚:B โŸถ Ahf:f โŠš sโ‚ = ๐Ÿ™ Bsโ‚‚:C โŸถ Bhg:g โŠš sโ‚‚ = ๐Ÿ™ CโŠข (g โŠš f) โŠš sโ‚ โŠš sโ‚‚ = ๐Ÿ™ C ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Csโ‚:B โŸถ Ahf:f โŠš sโ‚ = ๐Ÿ™ Bsโ‚‚:C โŸถ Bhg:g โŠš sโ‚‚ = ๐Ÿ™ CโŠข (g โŠš f โŠš sโ‚) โŠš sโ‚‚ = ๐Ÿ™ C ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Csโ‚:B โŸถ Ahf:f โŠš sโ‚ = ๐Ÿ™ Bsโ‚‚:C โŸถ Bhg:g โŠš sโ‚‚ = ๐Ÿ™ CโŠข (g โŠš ๐Ÿ™ B) โŠš sโ‚‚ = ๐Ÿ™ C ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Csโ‚:B โŸถ Ahf:f โŠš sโ‚ = ๐Ÿ™ Bsโ‚‚:C โŸถ Bhg:g โŠš sโ‚‚ = ๐Ÿ™ CโŠข g โŠš sโ‚‚ = ๐Ÿ™ C All goals completed! ๐Ÿ™

We note that the corresponding mathlib instance is instIsSplitEpiComp.

example {๐’ž : Type u} [Category.{v, u} ๐’ž] {A B C : ๐’ž} (f : A โŸถ B) [hf : IsSection f] (g : B โŸถ C) [hg : IsSection g] : IsSection (g โŠš f) := instIsSplitEpiComp
Definition: Idempotent (p. 54)

An endomap e is called idempotent if {e \circ e = e}.

We implement Idempotent and IsIdempotent in Lean as follows:

structure Idempotent {๐’ž : Type u} [Category.{v, u} ๐’ž] (A : ๐’ž) where e : A โŸถ A idem : e โŠš e = e class IsIdempotent {๐’ž : Type u} [Category.{v, u} ๐’ž] {A : ๐’ž} (e : A โŸถ A) where idem : e โŠš e = e
Exercise 9 (p. 54)

Suppose r is a retraction of f (equivalently f is a section of r) and let {e = f \circ r}. Show that e is an idempotent.... Show that if f is an isomorphism, then e is the identity.

Solution: Exercise 9variable {๐’ž : Type u} [Category.{v, u} ๐’ž] {A B : ๐’ž} (f : A โŸถ B) (e : B โŸถ B)

We show that e is an idempotent.

example (r : Retraction f) (he : e = f โŠš r.retraction) : IsIdempotent e := { idem := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Be:B โŸถ Br:Retraction fhe:e = f โŠš r.retractionโŠข e โŠš e = e All goals completed! ๐Ÿ™ }

We show that e is the identity if f is an isomorphism.

example [hf : IsIso f] (r : Retraction f) (he : e = f โŠš r.retraction) : e = ๐Ÿ™ B := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Be:B โŸถ Bhf:IsIso fr:Retraction fhe:e = f โŠš r.retractionโŠข e = ๐Ÿ™ B ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Be:B โŸถ Bhf:IsIso fr:Retraction fhe:e = f โŠš r.retractionfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ BโŠข e = ๐Ÿ™ B ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Be:B โŸถ Bhf:IsIso fr:Retraction fhe:e = f โŠš r.retractionfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ BโŠข e = (f โŠš r.retraction โŠš f) โŠš finv repeat ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Be:B โŸถ Bhf:IsIso fr:Retraction fhe:e = f โŠš r.retractionfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ BโŠข e = f โŠš r.retraction โŠš f โŠš finv rwa [hfinv.2, Category.id_comp๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Be:B โŸถ Bhf:IsIso fr:Retraction fhe:e = f โŠš r.retractionfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ BโŠข e = f โŠš r.retraction
Theorem (uniqueness of inverses) (p. 54)

If f has both a retraction r and a section s then {r = s}.

Proof (p. 54)

From the definition we have, if {A \xrightarrow{f} B}, both of the equations r \circ f = 1_A \quad\text{and}\quad f \circ s = 1_B. Then by the identity laws and the associative law r = r \circ 1_B = r \circ (f \circ s) = (r \circ f) \circ s = 1_A \circ s = s.

Our implementation in Lean faithfully follows the argument of the book proof given above.

theorem uniqueness_of_inverses {๐’ž : Type u} [Category.{v, u} ๐’ž] {A B : ๐’ž} (f : A โŸถ B) (r : Retraction f) (s : Section f) : r.retraction = s.section_ := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:Retraction fs:Section fโŠข r.retraction = s.section_ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bs:Section fr:B โŸถ Ahr:r โŠš f = ๐Ÿ™ AโŠข { retraction := r, id := hr }.retraction = s.section_ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:B โŸถ Ahr:r โŠš f = ๐Ÿ™ As:B โŸถ Ahs:f โŠš s = ๐Ÿ™ BโŠข { retraction := r, id := hr }.retraction = { section_ := s, id := hs }.section_ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:B โŸถ Ahr:r โŠš f = ๐Ÿ™ As:B โŸถ Ahs:f โŠš s = ๐Ÿ™ BโŠข r = s calc r = r โŠš ๐Ÿ™ B := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:B โŸถ Ahr:r โŠš f = ๐Ÿ™ As:B โŸถ Ahs:f โŠš s = ๐Ÿ™ BโŠข r = r โŠš ๐Ÿ™ B All goals completed! ๐Ÿ™ _ = r โŠš (f โŠš s) := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:B โŸถ Ahr:r โŠš f = ๐Ÿ™ As:B โŸถ Ahs:f โŠš s = ๐Ÿ™ BโŠข r โŠš ๐Ÿ™ B = r โŠš f โŠš s All goals completed! ๐Ÿ™ _ = (r โŠš f) โŠš s := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:B โŸถ Ahr:r โŠš f = ๐Ÿ™ As:B โŸถ Ahs:f โŠš s = ๐Ÿ™ BโŠข r โŠš f โŠš s = (r โŠš f) โŠš s All goals completed! ๐Ÿ™ _ = ๐Ÿ™ A โŠš s := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:B โŸถ Ahr:r โŠš f = ๐Ÿ™ As:B โŸถ Ahs:f โŠš s = ๐Ÿ™ BโŠข (r โŠš f) โŠš s = ๐Ÿ™ A โŠš s All goals completed! ๐Ÿ™ _ = s := Category.comp_id s

4. Isomorphisms and automorphisms๐Ÿ”—

Definition: Isomorphism, Inverse (p. 54)

A map {A \xrightarrow{f} B} is called an isomorphism if there exists another map {B \xrightarrow{f^{-1}} A} which is both a retraction and a section for f: f \circ fโปยน = 1_B,\\\ fโปยน \circ f = 1_A. Such a map f^{-1} is called the inverse map for f; since both of the two equations are required, the theorem of uniqueness of inverses shows that there is only one inverse.

We compare these definitions of isomorphism and inverse with the earlier definitions on p. 40. A proof that the two definitions of isomorphism are equivalent is given below.

example {๐’ž : Type u} [Category.{v, u} ๐’ž] {A B : ๐’ž} (f : A โŸถ B) (r : Retraction f) (s : Section f) : r.retraction = s.section_ โ†” IsIso f := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:Retraction fs:Section fโŠข r.retraction = s.section_ โ†” IsIso f ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:Retraction fs:Section fโŠข r.retraction = s.section_ โ†’ IsIso f๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:Retraction fs:Section fโŠข IsIso f โ†’ r.retraction = s.section_ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:Retraction fs:Section fโŠข r.retraction = s.section_ โ†’ IsIso f ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:Retraction fs:Section fh:r.retraction = s.section_โŠข IsIso f exact { out := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:Retraction fs:Section fh:r.retraction = s.section_โŠข โˆƒ inv, inv โŠš f = ๐Ÿ™ A โˆง f โŠš inv = ๐Ÿ™ B ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:Retraction fs:Section fh:r.retraction = s.section_โŠข r.retraction โŠš f = ๐Ÿ™ A โˆง f โŠš r.retraction = ๐Ÿ™ B ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:Retraction fs:Section fh:r.retraction = s.section_โŠข r.retraction โŠš f = ๐Ÿ™ A๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:Retraction fs:Section fh:r.retraction = s.section_โŠข f โŠš r.retraction = ๐Ÿ™ B ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:Retraction fs:Section fh:r.retraction = s.section_โŠข r.retraction โŠš f = ๐Ÿ™ A All goals completed! ๐Ÿ™ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:Retraction fs:Section fh:r.retraction = s.section_โŠข f โŠš r.retraction = ๐Ÿ™ B ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:Retraction fs:Section fh:r.retraction = s.section_โŠข f โŠš s.section_ = ๐Ÿ™ B All goals completed! ๐Ÿ™ } ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:Retraction fs:Section fโŠข IsIso f โ†’ r.retraction = s.section_ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Br:Retraction fs:Section ffinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ BโŠข r.retraction = s.section_ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bs:Section ffinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Br:B โŸถ Ahr:r โŠš f = ๐Ÿ™ AโŠข { retraction := r, id := hr }.retraction = s.section_ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Br:B โŸถ Ahr:r โŠš f = ๐Ÿ™ As:B โŸถ Ahs:f โŠš s = ๐Ÿ™ BโŠข { retraction := r, id := hr }.retraction = { section_ := s, id := hs }.section_ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Br:B โŸถ Ahr:r โŠš f = ๐Ÿ™ As:B โŸถ Ahs:f โŠš s = ๐Ÿ™ BโŠข r = s calc r = r โŠš ๐Ÿ™ B := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Br:B โŸถ Ahr:r โŠš f = ๐Ÿ™ As:B โŸถ Ahs:f โŠš s = ๐Ÿ™ BโŠข r = r โŠš ๐Ÿ™ B All goals completed! ๐Ÿ™ _ = r โŠš (f โŠš s) := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Br:B โŸถ Ahr:r โŠš f = ๐Ÿ™ As:B โŸถ Ahs:f โŠš s = ๐Ÿ™ BโŠข r โŠš ๐Ÿ™ B = r โŠš f โŠš s All goals completed! ๐Ÿ™ _ = (r โŠš f) โŠš s := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Br:B โŸถ Ahr:r โŠš f = ๐Ÿ™ As:B โŸถ Ahs:f โŠš s = ๐Ÿ™ BโŠข r โŠš f โŠš s = (r โŠš f) โŠš s All goals completed! ๐Ÿ™ _ = ๐Ÿ™ A โŠš s := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žf:A โŸถ Bfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Br:B โŸถ Ahr:r โŠš f = ๐Ÿ™ As:B โŸถ Ahs:f โŠš s = ๐Ÿ™ BโŠข (r โŠš f) โŠš s = ๐Ÿ™ A โŠš s All goals completed! ๐Ÿ™ _ = s := Category.comp_id s

When working with inverse maps in Excercise 10, we make use of mathlib's CategoryTheory.inv, which we print below for reference.

def CategoryTheory.inv.{v, u} : {C : Type u} โ†’ [inst : Category.{v, u} C] โ†’ {X Y : C} โ†’ (f : X โŸถ Y) โ†’ [I : IsIso f] โ†’ Y โŸถ X := fun {C} [Category.{v, u} C] {X Y} f [IsIso f] โ†ฆ Classical.choose โ‹ฏ#print CategoryTheory.inv
def CategoryTheory.inv.{v, u} : {C : Type u} โ†’
  [inst : Category.{v, u} C] โ†’ {X Y : C} โ†’ (f : X โŸถ Y) โ†’ [I : IsIso f] โ†’ Y โŸถ X :=
fun {C} [Category.{v, u} C] {X Y} f [IsIso f] โ†ฆ Classical.choose โ‹ฏ
Exercise 10 (p. 55)

If {A \xrightarrow{f} B \xrightarrow{g} C} are both isomorphisms, then {g \circ f} is an isomorphism too, and {(g \circ f)^{-1} = f^{-1} \circ g^{-1}}.

Solution: Exercise 10

The inverse of the composite is the composite of the inverses in the opposite order.

open CategoryTheory in example {๐’ž : Type u} [Category.{v, u} ๐’ž] {A B C : ๐’ž} (f : A โŸถ B) [hf : IsIso f] (g : B โŸถ C) [hg : IsIso g] : IsIso (g โŠš f) โˆง inv (g โŠš f) = inv f โŠš inv g := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bhf:IsIso fg:B โŸถ Chg:IsIso gโŠข IsIso (g โŠš f) โˆง inv (g โŠš f) = inv f โŠš inv g ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bhf:IsIso fg:B โŸถ Chg:IsIso gโŠข IsIso (g โŠš f)๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bhf:IsIso fg:B โŸถ Chg:IsIso gโŠข inv (g โŠš f) = inv f โŠš inv g ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bhf:IsIso fg:B โŸถ Chg:IsIso gโŠข IsIso (g โŠš f) ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Chg:IsIso gfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ BโŠข IsIso (g โŠš f) ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bginv:C โŸถ Bhginv:ginv โŠš g = ๐Ÿ™ B โˆง g โŠš ginv = ๐Ÿ™ CโŠข IsIso (g โŠš f) exact { out := ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bginv:C โŸถ Bhginv:ginv โŠš g = ๐Ÿ™ B โˆง g โŠš ginv = ๐Ÿ™ CโŠข โˆƒ inv, inv โŠš g โŠš f = ๐Ÿ™ A โˆง (g โŠš f) โŠš inv = ๐Ÿ™ C ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bginv:C โŸถ Bhginv:ginv โŠš g = ๐Ÿ™ B โˆง g โŠš ginv = ๐Ÿ™ CโŠข (finv โŠš ginv) โŠš g โŠš f = ๐Ÿ™ A โˆง (g โŠš f) โŠš finv โŠš ginv = ๐Ÿ™ C ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bginv:C โŸถ Bhginv:ginv โŠš g = ๐Ÿ™ B โˆง g โŠš ginv = ๐Ÿ™ CโŠข (finv โŠš ginv) โŠš g โŠš f = ๐Ÿ™ A๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bginv:C โŸถ Bhginv:ginv โŠš g = ๐Ÿ™ B โˆง g โŠš ginv = ๐Ÿ™ CโŠข (g โŠš f) โŠš finv โŠš ginv = ๐Ÿ™ C ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bginv:C โŸถ Bhginv:ginv โŠš g = ๐Ÿ™ B โˆง g โŠš ginv = ๐Ÿ™ CโŠข (finv โŠš ginv) โŠš g โŠš f = ๐Ÿ™ A ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bginv:C โŸถ Bhginv:ginv โŠš g = ๐Ÿ™ B โˆง g โŠš ginv = ๐Ÿ™ CโŠข (finv โŠš ginv โŠš g) โŠš f = ๐Ÿ™ A ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bginv:C โŸถ Bhginv:ginv โŠš g = ๐Ÿ™ B โˆง g โŠš ginv = ๐Ÿ™ CโŠข (finv โŠš ๐Ÿ™ B) โŠš f = ๐Ÿ™ A ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bginv:C โŸถ Bhginv:ginv โŠš g = ๐Ÿ™ B โˆง g โŠš ginv = ๐Ÿ™ CโŠข finv โŠš f = ๐Ÿ™ A All goals completed! ๐Ÿ™ ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bginv:C โŸถ Bhginv:ginv โŠš g = ๐Ÿ™ B โˆง g โŠš ginv = ๐Ÿ™ CโŠข (g โŠš f) โŠš finv โŠš ginv = ๐Ÿ™ C ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bginv:C โŸถ Bhginv:ginv โŠš g = ๐Ÿ™ B โˆง g โŠš ginv = ๐Ÿ™ CโŠข (g โŠš f โŠš finv) โŠš ginv = ๐Ÿ™ C ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bginv:C โŸถ Bhginv:ginv โŠš g = ๐Ÿ™ B โˆง g โŠš ginv = ๐Ÿ™ CโŠข (g โŠš ๐Ÿ™ B) โŠš ginv = ๐Ÿ™ C ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bg:B โŸถ Cfinv:B โŸถ Ahfinv:finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ Bginv:C โŸถ Bhginv:ginv โŠš g = ๐Ÿ™ B โˆง g โŠš ginv = ๐Ÿ™ CโŠข g โŠš ginv = ๐Ÿ™ C All goals completed! ๐Ÿ™ } ๐’ž:Type uinstโœ:Category.{v, u} ๐’žA:๐’žB:๐’žC:๐’žf:A โŸถ Bhf:IsIso fg:B โŸถ Chg:IsIso gโŠข inv (g โŠš f) = inv f โŠš inv g All goals completed! ๐Ÿ™
Exercise 11 (p. 55)

If {A = \{\mathit{Fatima}, \mathit{Omer}, \mathit{Alysia}\}} and {B = \{\mathit{coffee}, \mathit{tea}, \mathit{cocoa}\}}, find an example of an isomorphism {A \xrightarrow{f} B}. If {C = \{\mathit{true}, \mathit{false}\}}, can you find any isomorphism {A \rightarrow C}?

Solution: Exercise 11namespace ExII_11

For convenience, we use finite types here instead of finite sets.

inductive A | Fatima | Omer | Alysia deriving Fintype inductive B | coffee | tea | cocoa deriving Fintype

We give a map f and its inverse f^{-1} below, along with a proof that f is an isomorphism.

def f : A โŸถ B | A.Fatima => B.coffee | A.Omer => B.tea | A.Alysia => B.cocoa def finv : B โŸถ A | B.coffee => A.Fatima | B.tea => A.Omer | B.cocoa => A.Alysia example : IsIso f := { out := โŠข โˆƒ inv, inv โŠš f = ๐Ÿ™ A โˆง f โŠš inv = ๐Ÿ™ B โŠข finv โŠš f = ๐Ÿ™ A โˆง f โŠš finv = ๐Ÿ™ B โŠข finv โŠš f = ๐Ÿ™ AโŠข f โŠš finv = ๐Ÿ™ B all_goals x:BโŠข (f โŠš finv) x = ๐Ÿ™ B x โŠข (f โŠš finv) B.coffee = ๐Ÿ™ B B.coffeeโŠข (f โŠš finv) B.tea = ๐Ÿ™ B B.teaโŠข (f โŠš finv) B.cocoa = ๐Ÿ™ B B.cocoa โŠข (f โŠš finv) B.coffee = ๐Ÿ™ B B.coffeeโŠข (f โŠš finv) B.tea = ๐Ÿ™ B B.teaโŠข (f โŠš finv) B.cocoa = ๐Ÿ™ B B.cocoa All goals completed! ๐Ÿ™ } end ExII_11

Since {\#A > \#C}, there can be no pair {A \xrightarrow{j} C}, {C \xrightarrow{p} A} such that {p \circ j = 1_A}; hence there is no isomorphism {A \rightarrow C}.

Excerpt (p. 55)

A map which is both an endomap and at the same time an isomorphism is usually called by the one word automorphism.

The corresponding mathlib definition is Aut, which we print below for reference.

def CategoryTheory.Aut.{v, u} : {C : Type u} โ†’ [Category.{v, u} C] โ†’ C โ†’ Type v := fun {C} [Category.{v, u} C] X โ†ฆ X โ‰… X#print Aut
def CategoryTheory.Aut.{v, u} : {C : Type u} โ†’ [Category.{v, u} C] โ†’ C โ†’ Type v :=
fun {C} [Category.{v, u} C] X โ†ฆ X โ‰… X

Compare this to the mathlib definition End for endomorphisms of an object in a category.

def CategoryTheory.End.{v, u} : {C : Type u} โ†’ [CategoryStruct.{v, u} C] โ†’ C โ†’ Type v := fun {C} [CategoryStruct.{v, u} C] X โ†ฆ X โŸถ X#print End
def CategoryTheory.End.{v, u} : {C : Type u} โ†’ [CategoryStruct.{v, u} C] โ†’ C โ†’ Type v :=
fun {C} [CategoryStruct.{v, u} C] X โ†ฆ X โŸถ X
Exercise 12 (p. 56)

How many isomorphisms are there from {A = \{\mathit{Fatima}, \mathit{Omer}, \mathit{Alysia}\}} to {B = \{\mathit{coffee}, \mathit{tea}, \mathit{cocoa}\}}? How many automorphisms of A are there? The answers should be less than 27 โ€” why?

Solution: Exercise 12

Provided two sets/types have the same number n of elements, the number of isomorphisms between them is n!; if the sets/types have different numbers of elements, then there are no isomorphisms between them. We implement this formula in Lean as follows:

def isoCount (ฮฑ ฮฒ : Type*) [Fintype ฮฑ] [Fintype ฮฒ] : โ„• := if Fintype.card ฮฑ = Fintype.card ฮฒ then Nat.factorial (Fintype.card ฮฑ) else 0

By the formula above, we have 6 different isomorphisms.

open ExII_11 6#eval isoCount A B
6

Essentially the same formula applies to automorphisms, since an automorphism is just an isomorphism from a set/type to itself. Thus, there are also 6 different automorphisms of A.

abbrev autCount (ฮฑ : Type*) [Fintype ฮฑ] := isoCount ฮฑ ฮฑ open ExII_11 6#eval autCount A
6

By Alysia's formula, {3^3 = 27} is the number of distinct maps {A \rightarrow B} (or {A \rightarrow A}), so the number of isomorphisms between A and B (or automorphisms of A) must be less than 27.

Excerpt (p. 57)

An automorphism in the category of sets is also traditionally called a permutation, suggesting that it shifts the elements of its set around in a specified way.

Repeating the second part of Exercise 12, now using sets instead of types, we have

def permCount {ฮฑ : Type*} (s : Finset ฮฑ) : โ„• := if 0 < Finset.card s then Nat.factorial (Finset.card s) else 0 open ExII_11 6#eval permCount (Finset.univ (ฮฑ := A))
6