A Lean Companion to Conceptual Mathematics

Session 5: Division of maps: Sections and retractions๐Ÿ”—

1. Determination problems๐Ÿ”—

Exercise 1 (p. 70)

(a) Show that if there is a map g for which {h = g \circ f}, then for any pair a_1, a_2 of points {\mathbf{1} \rightarrow A} of the domain A of f (and of h) we have: \text{if}\; fa_1 = fa_2 \;\text{then}\; ha_1 = ha_2. (So, if for some pair of points one has {f a_1 = f a_2} but {h a_1 \ne h a_2}, then h is not determined by f.)

(b) Does the converse hold? That is, if maps (of sets) f and h satisfy the conditions above ('for any pair ... then {h a_1 = h a_2}'), must there be a map {B \xrightarrow{g} C} with {h = g \circ f}?

Solution: Exercise 1

We use types instead of sets here, and we begin by showing that part (a) holds.

example {A B C : Type} {f : A โŸถ B} {h : A โŸถ C} (hg : โˆƒ g : B โŸถ C, h = g โŠš f) : โˆ€ aโ‚ aโ‚‚ : Point A, f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚ := A:TypeB:TypeC:Typef:A โŸถ Bh:A โŸถ Chg:โˆƒ g, h = g โŠš fโŠข โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚ A:TypeB:TypeC:Typef:A โŸถ Bh:A โŸถ Cg:B โŸถ Chg:h = g โŠš fโŠข โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚ intro _ A:TypeB:TypeC:Typef:A โŸถ Bh:A โŸถ Cg:B โŸถ Chg:h = g โŠš faโ‚โœ:Point Aaโ‚‚โœ:Point AโŠข f โŠš aโ‚โœ = f โŠš aโ‚‚โœ โ†’ h โŠš aโ‚โœ = h โŠš aโ‚‚โœ A:TypeB:TypeC:Typef:A โŸถ Bh:A โŸถ Cg:B โŸถ Chg:h = g โŠš faโ‚โœ:Point Aaโ‚‚โœ:Point Ahfa:f โŠš aโ‚โœ = f โŠš aโ‚‚โœโŠข h โŠš aโ‚โœ = h โŠš aโ‚‚โœ A:TypeB:TypeC:Typef:A โŸถ Bh:A โŸถ Cg:B โŸถ Chg:h = g โŠš faโ‚โœ:Point Aaโ‚‚โœ:Point Ahfa:f โŠš aโ‚โœ = f โŠš aโ‚‚โœโŠข (g โŠš f) โŠš aโ‚โœ = (g โŠš f) โŠš aโ‚‚โœ repeat A:TypeB:TypeC:Typef:A โŸถ Bh:A โŸถ Cg:B โŸถ Chg:h = g โŠš faโ‚โœ:Point Aaโ‚‚โœ:Point Ahfa:f โŠš aโ‚โœ = f โŠš aโ‚‚โœโŠข g โŠš f โŠš aโ‚โœ = g โŠš f โŠš aโ‚‚โœ All goals completed! ๐Ÿ™

For part (b), we first prove the converse in the case when f is surjective.

example {A B C : Type} {f : A โŸถ B} {h : A โŸถ C} (H : โˆ€ aโ‚ aโ‚‚ : Point A, f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚) (hfsurj : Function.Surjective f) : โˆƒ g : B โŸถ C, h = g โŠš f := A:TypeB:TypeC:Typef:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚hfsurj:Function.Surjective fโŠข โˆƒ g, h = g โŠš f A:TypeB:TypeC:Typef:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚hfsurj:Function.Surjective fg:B โŸถ C := fun ฮฒ โ†ฆ h (Classical.choose โ‹ฏ)โŠข โˆƒ g, h = g โŠš f A:TypeB:TypeC:Typef:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚hfsurj:Function.Surjective fg:B โŸถ C := fun ฮฒ โ†ฆ h (Classical.choose โ‹ฏ)โŠข h = g โŠš f A:TypeB:TypeC:Typef:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚hfsurj:Function.Surjective fg:B โŸถ C := fun ฮฒ โ†ฆ h (Classical.choose โ‹ฏ)ฮฑ:AโŠข h ฮฑ = (g โŠš f) ฮฑ A:TypeB:TypeC:Typef:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚hfsurj:Function.Surjective fg:B โŸถ C := fun ฮฒ โ†ฆ h (Classical.choose โ‹ฏ)ฮฑ:Aaโ‚:Point A := fun x โ†ฆ ฮฑโŠข h ฮฑ = (g โŠš f) ฮฑ A:TypeB:TypeC:Typef:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚hfsurj:Function.Surjective fg:B โŸถ C := fun ฮฒ โ†ฆ h (Classical.choose โ‹ฏ)ฮฑ:Aaโ‚:Point A := fun x โ†ฆ ฮฑaโ‚‚:Point A := fun x โ†ฆ Classical.choose โ‹ฏโŠข h ฮฑ = (g โŠš f) ฮฑ have hfa : f โŠš aโ‚ = f โŠš aโ‚‚ := A:TypeB:TypeC:Typef:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚hfsurj:Function.Surjective fโŠข โˆƒ g, h = g โŠš f A:TypeB:TypeC:Typef:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚hfsurj:Function.Surjective fg:B โŸถ C := fun ฮฒ โ†ฆ h (Classical.choose โ‹ฏ)ฮฑ:Aaโ‚:Point A := fun x โ†ฆ ฮฑaโ‚‚:Point A := fun x โ†ฆ Classical.choose โ‹ฏxโœ:OneโŠข (f โŠš aโ‚) xโœ = (f โŠš aโ‚‚) xโœ All goals completed! ๐Ÿ™ A:TypeB:TypeC:Typef:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚hfsurj:Function.Surjective fg:B โŸถ C := fun ฮฒ โ†ฆ h (Classical.choose โ‹ฏ)ฮฑ:Aaโ‚:Point A := fun x โ†ฆ ฮฑaโ‚‚:Point A := fun x โ†ฆ Classical.choose โ‹ฏhfa:f โŠš aโ‚ = f โŠš aโ‚‚ := funext fun x โ†ฆ Eq.symm (Classical.choose_spec (hfsurj (f ฮฑ)))hha:h โŠš aโ‚ = h โŠš aโ‚‚ := H aโ‚ aโ‚‚ hfaโŠข h ฮฑ = (g โŠš f) ฮฑ All goals completed! ๐Ÿ™

Proof in the general case is slightly more complicated and is given below.

open Classical in example {A B C : Type} [Nonempty C] {f : A โŸถ B} {h : A โŸถ C} (H : โˆ€ aโ‚ aโ‚‚ : Point A, f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚) : โˆƒ g : B โŸถ C, h = g โŠš f := A:TypeB:TypeC:Typeinstโœ:Nonempty Cf:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚โŠข โˆƒ g, h = g โŠš f -- ฮฒ : B may or may not be in the image of f, -- so we need to handle both cases A:TypeB:TypeC:Typeinstโœ:Nonempty Cf:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚g:B โŸถ C := fun ฮฒ โ†ฆ if ฮฒ_in_image : โˆƒ ฮฑ, f ฮฑ = ฮฒ then h (choose ฮฒ_in_image) else choice โ‹ฏโŠข โˆƒ g, h = g โŠš f A:TypeB:TypeC:Typeinstโœ:Nonempty Cf:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚g:B โŸถ C := fun ฮฒ โ†ฆ if ฮฒ_in_image : โˆƒ ฮฑ, f ฮฑ = ฮฒ then h (choose ฮฒ_in_image) else choice โ‹ฏโŠข h = g โŠš f A:TypeB:TypeC:Typeinstโœ:Nonempty Cf:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚g:B โŸถ C := fun ฮฒ โ†ฆ if ฮฒ_in_image : โˆƒ ฮฑ, f ฮฑ = ฮฒ then h (choose ฮฒ_in_image) else choice โ‹ฏฮฑ:AโŠข h ฮฑ = (g โŠš f) ฮฑ A:TypeB:TypeC:Typeinstโœ:Nonempty Cf:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚g:B โŸถ C := fun ฮฒ โ†ฆ if ฮฒ_in_image : โˆƒ ฮฑ, f ฮฑ = ฮฒ then h (choose ฮฒ_in_image) else choice โ‹ฏฮฑ:Aฮฒ_in_image_exists:โˆƒ ฮฑ', f ฮฑ' = f ฮฑ := Exists.intro ฮฑ rflโŠข h ฮฑ = (g โŠš f) ฮฑ A:TypeB:TypeC:Typeinstโœ:Nonempty Cf:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚g:B โŸถ C := fun ฮฒ โ†ฆ if ฮฒ_in_image : โˆƒ ฮฑ, f ฮฑ = ฮฒ then h (choose ฮฒ_in_image) else choice โ‹ฏฮฑ:Aฮฒ_in_image_exists:โˆƒ ฮฑ', f ฮฑ' = f ฮฑ := Exists.intro ฮฑ rflaโ‚:Point A := fun x โ†ฆ ฮฑโŠข h ฮฑ = (g โŠš f) ฮฑ A:TypeB:TypeC:Typeinstโœ:Nonempty Cf:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚g:B โŸถ C := fun ฮฒ โ†ฆ if ฮฒ_in_image : โˆƒ ฮฑ, f ฮฑ = ฮฒ then h (choose ฮฒ_in_image) else choice โ‹ฏฮฑ:Aฮฒ_in_image_exists:โˆƒ ฮฑ', f ฮฑ' = f ฮฑ := Exists.intro ฮฑ rflaโ‚:Point A := fun x โ†ฆ ฮฑaโ‚‚:Point A := fun x โ†ฆ choose ฮฒ_in_image_existsโŠข h ฮฑ = (g โŠš f) ฮฑ have hfa : f โŠš aโ‚ = f โŠš aโ‚‚ := A:TypeB:TypeC:Typeinstโœ:Nonempty Cf:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚โŠข โˆƒ g, h = g โŠš f A:TypeB:TypeC:Typeinstโœ:Nonempty Cf:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚g:B โŸถ C := fun ฮฒ โ†ฆ if ฮฒ_in_image : โˆƒ ฮฑ, f ฮฑ = ฮฒ then h (choose ฮฒ_in_image) else choice โ‹ฏฮฑ:Aฮฒ_in_image_exists:โˆƒ ฮฑ', f ฮฑ' = f ฮฑ := Exists.intro ฮฑ rflaโ‚:Point A := fun x โ†ฆ ฮฑaโ‚‚:Point A := fun x โ†ฆ choose ฮฒ_in_image_existsxโœ:OneโŠข (f โŠš aโ‚) xโœ = (f โŠš aโ‚‚) xโœ All goals completed! ๐Ÿ™ A:TypeB:TypeC:Typeinstโœ:Nonempty Cf:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚g:B โŸถ C := fun ฮฒ โ†ฆ if ฮฒ_in_image : โˆƒ ฮฑ, f ฮฑ = ฮฒ then h (choose ฮฒ_in_image) else choice โ‹ฏฮฑ:Aฮฒ_in_image_exists:โˆƒ ฮฑ', f ฮฑ' = f ฮฑ := Exists.intro ฮฑ rflaโ‚:Point A := fun x โ†ฆ ฮฑaโ‚‚:Point A := fun x โ†ฆ choose ฮฒ_in_image_existshfa:f โŠš aโ‚ = f โŠš aโ‚‚ := funext fun x โ†ฆ Eq.symm (choose_spec ฮฒ_in_image_exists)hha:h โŠš aโ‚ = h โŠš aโ‚‚ := H aโ‚ aโ‚‚ hfaโŠข h ฮฑ = (g โŠš f) ฮฑ A:TypeB:TypeC:Typeinstโœ:Nonempty Cf:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚g:B โŸถ C := fun ฮฒ โ†ฆ if ฮฒ_in_image : โˆƒ ฮฑ, f ฮฑ = ฮฒ then h (choose ฮฒ_in_image) else choice โ‹ฏฮฑ:Aฮฒ_in_image_exists:โˆƒ ฮฑ', f ฮฑ' = f ฮฑ := Exists.intro ฮฑ rflaโ‚:Point A := fun x โ†ฆ ฮฑaโ‚‚:Point A := fun x โ†ฆ choose ฮฒ_in_image_existshfa:f โŠš aโ‚ = f โŠš aโ‚‚ := funext fun x โ†ฆ Eq.symm (choose_spec ฮฒ_in_image_exists)hha:h โŠš aโ‚ = h โŠš aโ‚‚ := H aโ‚ aโ‚‚ hfah_eq_h_chosen:h ฮฑ = h (choose ฮฒ_in_image_exists) := congrFun hha ()โŠข h ฮฑ = (g โŠš f) ฮฑ have g_eq_h_chosen : g (f ฮฑ) = h (choose ฮฒ_in_image_exists) := A:TypeB:TypeC:Typeinstโœ:Nonempty Cf:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚โŠข โˆƒ g, h = g โŠš f A:TypeB:TypeC:Typeinstโœ:Nonempty Cf:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚g:B โŸถ C := fun ฮฒ โ†ฆ if ฮฒ_in_image : โˆƒ ฮฑ, f ฮฑ = ฮฒ then h (choose ฮฒ_in_image) else choice โ‹ฏฮฑ:Aฮฒ_in_image_exists:โˆƒ ฮฑ', f ฮฑ' = f ฮฑ := Exists.intro ฮฑ rflaโ‚:Point A := fun x โ†ฆ ฮฑaโ‚‚:Point A := fun x โ†ฆ choose ฮฒ_in_image_existshfa:f โŠš aโ‚ = f โŠš aโ‚‚ := funext fun x โ†ฆ Eq.symm (choose_spec ฮฒ_in_image_exists)hha:h โŠš aโ‚ = h โŠš aโ‚‚ := H aโ‚ aโ‚‚ hfah_eq_h_chosen:h ฮฑ = h (choose ฮฒ_in_image_exists) := congrFun hha ()โŠข (if ฮฒ_in_image : โˆƒ ฮฑ_1, f ฮฑ_1 = f ฮฑ then h (choose ฮฒ_in_image) else choice โ‹ฏ) = h (choose ฮฒ_in_image_exists) All goals completed! ๐Ÿ™ A:TypeB:TypeC:Typeinstโœ:Nonempty Cf:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚g:B โŸถ C := fun ฮฒ โ†ฆ if ฮฒ_in_image : โˆƒ ฮฑ, f ฮฑ = ฮฒ then h (choose ฮฒ_in_image) else choice โ‹ฏฮฑ:Aฮฒ_in_image_exists:โˆƒ ฮฑ', f ฮฑ' = f ฮฑ := Exists.intro ฮฑ rflaโ‚:Point A := fun x โ†ฆ ฮฑaโ‚‚:Point A := fun x โ†ฆ choose ฮฒ_in_image_existshfa:f โŠš aโ‚ = f โŠš aโ‚‚ := funext fun x โ†ฆ Eq.symm (choose_spec ฮฒ_in_image_exists)hha:h โŠš aโ‚ = h โŠš aโ‚‚ := H aโ‚ aโ‚‚ hfah_eq_h_chosen:h ฮฑ = h (choose ฮฒ_in_image_exists) := congrFun hha ()g_eq_h_chosen:g (f ฮฑ) = h (choose ฮฒ_in_image_exists) := id (Eq.mpr (id (congrArg (fun _a โ†ฆ _a = h (choose ฮฒ_in_image_exists)) (dif_pos ฮฒ_in_image_exists))) (Eq.refl (h (choose ฮฒ_in_image_exists))))โŠข h ฮฑ = g (f ฮฑ) A:TypeB:TypeC:Typeinstโœ:Nonempty Cf:A โŸถ Bh:A โŸถ CH:โˆ€ (aโ‚ aโ‚‚ : Point A), f โŠš aโ‚ = f โŠš aโ‚‚ โ†’ h โŠš aโ‚ = h โŠš aโ‚‚g:B โŸถ C := fun ฮฒ โ†ฆ if ฮฒ_in_image : โˆƒ ฮฑ, f ฮฑ = ฮฒ then h (choose ฮฒ_in_image) else choice โ‹ฏฮฑ:Aฮฒ_in_image_exists:โˆƒ ฮฑ', f ฮฑ' = f ฮฑ := Exists.intro ฮฑ rflaโ‚:Point A := fun x โ†ฆ ฮฑaโ‚‚:Point A := fun x โ†ฆ choose ฮฒ_in_image_existshfa:f โŠš aโ‚ = f โŠš aโ‚‚ := funext fun x โ†ฆ Eq.symm (choose_spec ฮฒ_in_image_exists)hha:h โŠš aโ‚ = h โŠš aโ‚‚ := H aโ‚ aโ‚‚ hfah_eq_h_chosen:h ฮฑ = h (choose ฮฒ_in_image_exists) := congrFun hha ()g_eq_h_chosen:g (f ฮฑ) = h (choose ฮฒ_in_image_exists) := id (Eq.mpr (id (congrArg (fun _a โ†ฆ _a = h (choose ฮฒ_in_image_exists)) (dif_pos ฮฒ_in_image_exists))) (Eq.refl (h (choose ฮฒ_in_image_exists))))โŠข h ฮฑ = h (choose ฮฒ_in_image_exists) All goals completed! ๐Ÿ™

2. A special case: Constant maps๐Ÿ”—

Definition: Constant map (p. 71)

A map that can be factored through \mathbf{1} is called a constant map.

We implement IsConstantMap in Lean as follows:

def IsConstantMap {A C : Type} (h : A โŸถ C) := โˆƒ (f : A โŸถ One) (g : One โŸถ C), h = g โŠš f

3. Choice problems๐Ÿ”—

Exercise 2 (p. 71)

(a) Show that if there is an f with {g \circ f = h}, then h and g satisfy: For any a in A there is at least one b in B for which {h(a) = g(b)}.

(b) Does the converse hold? That is, if h and g satisfy the condition above, must there be a map f with {h = g \circ f}?

Solution: Exercise 2

We show that part (a) holds.

example {A B C : Type} {g : B โŸถ C} {h : A โŸถ C} (hf : โˆƒ f : A โŸถ B, g โŠš f = h) : โˆ€ a : A, โˆƒ b : B, h a = g b := A:TypeB:TypeC:Typeg:B โŸถ Ch:A โŸถ Chf:โˆƒ f, g โŠš f = hโŠข โˆ€ (a : A), โˆƒ b, h a = g b A:TypeB:TypeC:Typeg:B โŸถ Ch:A โŸถ Chf:โˆƒ f, g โŠš f = ha:AโŠข โˆƒ b, h a = g b A:TypeB:TypeC:Typeg:B โŸถ Ch:A โŸถ Ca:Af:A โŸถ Bhf:g โŠš f = hโŠข โˆƒ b, h a = g b A:TypeB:TypeC:Typeg:B โŸถ Ch:A โŸถ Ca:Af:A โŸถ Bhf:g โŠš f = hโŠข h a = g (f a) A:TypeB:TypeC:Typeg:B โŸถ Ch:A โŸถ Ca:Af:A โŸถ Bhf:g โŠš f = hโŠข (g โŠš f) a = g (f a) All goals completed! ๐Ÿ™

We show that the converse holds in part (b).

example {A B C : Type} {g : B โŸถ C} {h : A โŸถ C} (H : โˆ€ a : A, โˆƒ b : B, h a = g b) : โˆƒ f : A โŸถ B, g โŠš f = h := A:TypeB:TypeC:Typeg:B โŸถ Ch:A โŸถ CH:โˆ€ (a : A), โˆƒ b, h a = g bโŠข โˆƒ f, g โŠš f = h A:TypeB:TypeC:Typeg:B โŸถ Ch:A โŸถ Cf_fun:A โ†’ Bh_spec:โˆ€ (a : A), h a = g (f_fun a)โŠข โˆƒ f, g โŠš f = h A:TypeB:TypeC:Typeg:B โŸถ Ch:A โŸถ Cf_fun:A โ†’ Bh_spec:โˆ€ (a : A), h a = g (f_fun a)โŠข g โŠš f_fun = h A:TypeB:TypeC:Typeg:B โŸถ Ch:A โŸถ Cf_fun:A โ†’ Bh_spec:โˆ€ (a : A), h a = g (f_fun a)a:AโŠข (g โŠš f_fun) a = h a All goals completed! ๐Ÿ™

4. Two special cases of division: Sections and retractions๐Ÿ”—

Definition: Section (p. 72)

{A \xrightarrow{f} B} is a section of {B \xrightarrow{g} A} if {g \circ f = 1_A}.

See the original presentation of this definition of section in Article II.

5. Stacking or sorting๐Ÿ”—

Exercise 3 (p. 75)

Draw the internal diagrams of all the sections of f.

Solution: Exercise 3

We label the elements in the first column of A as a_{11}, a_{12}, a_{13}, a_{14} and the elements in the second column of A as a_{21}, a_{22}; we label the element in the first column of B as b_1 and the element in the second column of B as b_2.

inductive A | aโ‚โ‚ | aโ‚โ‚‚ | aโ‚โ‚ƒ | aโ‚โ‚„ | aโ‚‚โ‚ | aโ‚‚โ‚‚ deriving Fintype inductive B | bโ‚ | bโ‚‚ deriving Fintype def f : A โŸถ B | A.aโ‚โ‚ => B.bโ‚ | A.aโ‚โ‚‚ => B.bโ‚ | A.aโ‚โ‚ƒ => B.bโ‚ | A.aโ‚โ‚„ => B.bโ‚ | A.aโ‚‚โ‚ => B.bโ‚‚ | A.aโ‚‚โ‚‚ => B.bโ‚‚

Then the sections are

def sโ‚ : B โŸถ A | B.bโ‚ => A.aโ‚โ‚ | B.bโ‚‚ => A.aโ‚‚โ‚ example : f โŠš sโ‚ = ๐Ÿ™ B := โŠข f โŠš sโ‚ = ๐Ÿ™ B x:BโŠข (f โŠš sโ‚) x = ๐Ÿ™ B x; โŠข (f โŠš sโ‚) B.bโ‚ = ๐Ÿ™ B B.bโ‚โŠข (f โŠš sโ‚) B.bโ‚‚ = ๐Ÿ™ B B.bโ‚‚ โŠข (f โŠš sโ‚) B.bโ‚ = ๐Ÿ™ B B.bโ‚โŠข (f โŠš sโ‚) B.bโ‚‚ = ๐Ÿ™ B B.bโ‚‚ All goals completed! ๐Ÿ™ def sโ‚‚ : B โŸถ A | B.bโ‚ => A.aโ‚โ‚‚ | B.bโ‚‚ => A.aโ‚‚โ‚ example : f โŠš sโ‚‚ = ๐Ÿ™ B := โŠข f โŠš sโ‚‚ = ๐Ÿ™ B x:BโŠข (f โŠš sโ‚‚) x = ๐Ÿ™ B x; โŠข (f โŠš sโ‚‚) B.bโ‚ = ๐Ÿ™ B B.bโ‚โŠข (f โŠš sโ‚‚) B.bโ‚‚ = ๐Ÿ™ B B.bโ‚‚ โŠข (f โŠš sโ‚‚) B.bโ‚ = ๐Ÿ™ B B.bโ‚โŠข (f โŠš sโ‚‚) B.bโ‚‚ = ๐Ÿ™ B B.bโ‚‚ All goals completed! ๐Ÿ™ def sโ‚ƒ : B โŸถ A | B.bโ‚ => A.aโ‚โ‚ƒ | B.bโ‚‚ => A.aโ‚‚โ‚ example : f โŠš sโ‚ƒ = ๐Ÿ™ B := โŠข f โŠš sโ‚ƒ = ๐Ÿ™ B x:BโŠข (f โŠš sโ‚ƒ) x = ๐Ÿ™ B x; โŠข (f โŠš sโ‚ƒ) B.bโ‚ = ๐Ÿ™ B B.bโ‚โŠข (f โŠš sโ‚ƒ) B.bโ‚‚ = ๐Ÿ™ B B.bโ‚‚ โŠข (f โŠš sโ‚ƒ) B.bโ‚ = ๐Ÿ™ B B.bโ‚โŠข (f โŠš sโ‚ƒ) B.bโ‚‚ = ๐Ÿ™ B B.bโ‚‚ All goals completed! ๐Ÿ™ def sโ‚„ : B โŸถ A | B.bโ‚ => A.aโ‚โ‚„ | B.bโ‚‚ => A.aโ‚‚โ‚ example : f โŠš sโ‚„ = ๐Ÿ™ B := โŠข f โŠš sโ‚„ = ๐Ÿ™ B x:BโŠข (f โŠš sโ‚„) x = ๐Ÿ™ B x; โŠข (f โŠš sโ‚„) B.bโ‚ = ๐Ÿ™ B B.bโ‚โŠข (f โŠš sโ‚„) B.bโ‚‚ = ๐Ÿ™ B B.bโ‚‚ โŠข (f โŠš sโ‚„) B.bโ‚ = ๐Ÿ™ B B.bโ‚โŠข (f โŠš sโ‚„) B.bโ‚‚ = ๐Ÿ™ B B.bโ‚‚ All goals completed! ๐Ÿ™ def sโ‚… : B โŸถ A | B.bโ‚ => A.aโ‚โ‚ | B.bโ‚‚ => A.aโ‚‚โ‚‚ example : f โŠš sโ‚… = ๐Ÿ™ B := โŠข f โŠš sโ‚… = ๐Ÿ™ B x:BโŠข (f โŠš sโ‚…) x = ๐Ÿ™ B x; โŠข (f โŠš sโ‚…) B.bโ‚ = ๐Ÿ™ B B.bโ‚โŠข (f โŠš sโ‚…) B.bโ‚‚ = ๐Ÿ™ B B.bโ‚‚ โŠข (f โŠš sโ‚…) B.bโ‚ = ๐Ÿ™ B B.bโ‚โŠข (f โŠš sโ‚…) B.bโ‚‚ = ๐Ÿ™ B B.bโ‚‚ All goals completed! ๐Ÿ™ def sโ‚† : B โŸถ A | B.bโ‚ => A.aโ‚โ‚‚ | B.bโ‚‚ => A.aโ‚‚โ‚‚ example : f โŠš sโ‚† = ๐Ÿ™ B := โŠข f โŠš sโ‚† = ๐Ÿ™ B x:BโŠข (f โŠš sโ‚†) x = ๐Ÿ™ B x; โŠข (f โŠš sโ‚†) B.bโ‚ = ๐Ÿ™ B B.bโ‚โŠข (f โŠš sโ‚†) B.bโ‚‚ = ๐Ÿ™ B B.bโ‚‚ โŠข (f โŠš sโ‚†) B.bโ‚ = ๐Ÿ™ B B.bโ‚โŠข (f โŠš sโ‚†) B.bโ‚‚ = ๐Ÿ™ B B.bโ‚‚ All goals completed! ๐Ÿ™ def sโ‚‡ : B โŸถ A | B.bโ‚ => A.aโ‚โ‚ƒ | B.bโ‚‚ => A.aโ‚‚โ‚‚ example : f โŠš sโ‚‡ = ๐Ÿ™ B := โŠข f โŠš sโ‚‡ = ๐Ÿ™ B x:BโŠข (f โŠš sโ‚‡) x = ๐Ÿ™ B x; โŠข (f โŠš sโ‚‡) B.bโ‚ = ๐Ÿ™ B B.bโ‚โŠข (f โŠš sโ‚‡) B.bโ‚‚ = ๐Ÿ™ B B.bโ‚‚ โŠข (f โŠš sโ‚‡) B.bโ‚ = ๐Ÿ™ B B.bโ‚โŠข (f โŠš sโ‚‡) B.bโ‚‚ = ๐Ÿ™ B B.bโ‚‚ All goals completed! ๐Ÿ™ def sโ‚ˆ : B โŸถ A | B.bโ‚ => A.aโ‚โ‚„ | B.bโ‚‚ => A.aโ‚‚โ‚‚ example : f โŠš sโ‚ˆ = ๐Ÿ™ B := โŠข f โŠš sโ‚ˆ = ๐Ÿ™ B x:BโŠข (f โŠš sโ‚ˆ) x = ๐Ÿ™ B x; โŠข (f โŠš sโ‚ˆ) B.bโ‚ = ๐Ÿ™ B B.bโ‚โŠข (f โŠš sโ‚ˆ) B.bโ‚‚ = ๐Ÿ™ B B.bโ‚‚ โŠข (f โŠš sโ‚ˆ) B.bโ‚ = ๐Ÿ™ B B.bโ‚โŠข (f โŠš sโ‚ˆ) B.bโ‚‚ = ๐Ÿ™ B B.bโ‚‚ All goals completed! ๐Ÿ™