Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
(** * The free group on one generator *)(** We can define the integers as the free group on one generator, which we denote [Z1] below. Results from Centralizer.v and Groups.FreeGroup let us show that [Z1] is abelian. *)(** We define [Z1] as the free group with a single generator. *)DefinitionZ1 := FreeGroup Unit.DefinitionZ1_gen : Z1 := freegroup_in tt. (* The generator *)(** The recursion principle of [Z1] and its computation rule. *)DefinitionZ1_rec {G : Group} (g : G) : Z1 $-> G
:= FreeGroup_rec (unit_name g).DefinitionZ1_rec_beta {G : Group} (g : G) : Z1_rec g Z1_gen = g
:= FreeGroup_rec_beta _ _ _.(** The free group [Z1] on one generator is isomorphic to the subgroup of [Z1] generated by the generator. And such cyclic subgroups are known to be commutative, by [commutative_cyclic_subgroup]. *)InstanceZ1_commutative `{Funext} : Commutative (@group_sgop Z1)
:= commutative_iso_commutative iso_subgroup_incl_freegroupon.(* TODO: [Funext] is used in [isfreegroupon_freegroup], but there is a comment there saying that it can be removed. If that is done, can remove it from many results in this file. A different proof of this result, directly using the construction of the free group, could probably also avoid [Funext]. *)Definitionab_Z1 `{Funext} : AbGroup
:= Build_AbGroup Z1 _.(** The universal property of [ab_Z1]. *)
H: Funext A: AbGroup
GroupIsomorphism (ab_hom ab_Z1 A) A
H: Funext A: AbGroup
GroupIsomorphism (ab_hom ab_Z1 A) A
H: Funext A: AbGroup
ab_hom ab_Z1 A <~> A
H: Funext A: AbGroup
IsSemiGroupPreserving ?f
H: Funext A: AbGroup
ab_hom ab_Z1 A <~> A
H: Funext A: AbGroup
(Unit -> A) <~> A
H: Funext A: AbGroup
A <~> (Unit -> A)
exact (Build_Equiv _ _ (funa => unit_name a) _).
H: Funext A: AbGroup
IsSemiGroupPreserving
({|
equiv_fun := funa : A => unit_name a;
equiv_isequiv := isequiv_unit_name A
|}^-1 oE (equiv_freegroup_rec A Unit)^-1)
H: Funext A: AbGroup f, g: ab_hom ab_Z1 A
({|
equiv_fun := funa : A => unit_name a;
equiv_isequiv := isequiv_unit_name A
|}^-1 oE (equiv_freegroup_rec A Unit)^-1) (sg_op f g) =
sg_op
(({|
equiv_fun := funa : A => unit_name a;
equiv_isequiv := isequiv_unit_name A
|}^-1 oE (equiv_freegroup_rec A Unit)^-1) f)
(({|
equiv_fun := funa : A => unit_name a;
equiv_isequiv := isequiv_unit_name A
|}^-1 oE (equiv_freegroup_rec A Unit)^-1) g)
A: AbGroup a: A n: nat H: Z1_rec a (nat_to_Z1 n) = ab_mul n a
Z1_rec a (nat_to_Z1 n.+1) = ab_mul n.+1%nat a
A: AbGroup a: A n: nat H: Z1_rec a (nat_to_Z1 n) = ab_mul n a
Z1_rec a (nat_to_Z1 n.+1) = ab_mul n.+1%nat a
exact (grp_pow_natural _ _ _).Defined.(** [ab_Z1] is projective. *)
H: Funext
IsAbProjective ab_Z1
H: Funext
IsAbProjective ab_Z1
H: Funext A, B: AbGroup p: A $-> B f: ab_Z1 $-> B H1: ReflectiveSubuniverse.IsConnMap (Tr (-1)) p
merely {l : ab_Z1 $-> A & p $o l == f}
H: Funext A, B: AbGroup p: A $-> B f: ab_Z1 $-> B H1: ReflectiveSubuniverse.IsConnMap (Tr (-1)) p a: Tr (-1) (hfiber p (f Z1_gen))
merely {l : ab_Z1 $-> A & p $o l == f}
H: Funext A, B: AbGroup p: A $-> B f: ab_Z1 $-> B H1: ReflectiveSubuniverse.IsConnMap (Tr (-1)) p a: hfiber p (f Z1_gen)
merely {l : ab_Z1 $-> A & p $o l == f}
H: Funext A, B: AbGroup p: A $-> B f: ab_Z1 $-> B H1: ReflectiveSubuniverse.IsConnMap (Tr (-1)) p a: hfiber p (f Z1_gen)
(funl : ab_Z1 $-> A => p $o l == f) (Z1_rec a.1)
H: Funext A, B: AbGroup p: A $-> B f: ab_Z1 $-> B H1: ReflectiveSubuniverse.IsConnMap (Tr (-1)) p a: hfiber p (f Z1_gen)
p $o Z1_rec a.1 == f
H: Funext A, B: AbGroup p: A $-> B f: ab_Z1 $-> B H1: ReflectiveSubuniverse.IsConnMap (Tr (-1)) p a: hfiber p (f Z1_gen)
p $o Z1_rec a.1 = f
H: Funext A, B: AbGroup p: A $-> B f: ab_Z1 $-> B H1: ReflectiveSubuniverse.IsConnMap (Tr (-1)) p a: hfiber p (f Z1_gen)
p $o Z1_rec a.1 = f
H: Funext A, B: AbGroup p: A $-> B f: ab_Z1 $-> B H1: ReflectiveSubuniverse.IsConnMap (Tr (-1)) p a: hfiber p (f Z1_gen)
(funx : Unit => (p $o Z1_rec a.1) (freegroup_in x)) ==
(funx : Unit => f (freegroup_in x))
H: Funext A, B: AbGroup p: A $-> B f: ab_Z1 $-> B H1: ReflectiveSubuniverse.IsConnMap (Tr (-1)) p a: hfiber p (f Z1_gen)
unit_name (p a.1) ==
(funx : Unit => f (freegroup_in x))
H: Funext A, B: AbGroup p: A $-> B f: ab_Z1 $-> B H1: ReflectiveSubuniverse.IsConnMap (Tr (-1)) p a: hfiber p (f Z1_gen)
p a.1 = f (freegroup_in tt)
exact a.2.Defined.(** The map sending the generator to [1 : Int]. *)DefinitionZ1_to_Z `{Funext} : ab_Z1 $-> abgroup_Z
:= Z1_rec (G:=abgroup_Z) 1%int.(** TODO: Prove that [Z1_to_Z] is a group isomorphism. *)