Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.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]
(** * Projective abelian groups *) (** We define projective abelian groups and show that [P] is projective if and only if every epimorphism [A -> P] merely splits. *) (** An abelian group [P] is projective if for any map [P -> B] and epimorphism [A -> B], there merely exists a lift [P -> A] making the following triangle commute: A ^ | l / | | e / | V P ---> B f *) Class IsAbProjective@{u +} (P : AbGroup@{u}) : Type := isabprojective : forall (A B : AbGroup@{u}), forall (e : A $-> B), forall (f : P $-> B), IsSurjection e -> merely (exists l : P $-> A, e $o l == f). (** An abelian group is projective iff epis into it merely split. *)
P: AbGroup

IsAbProjective P <-> (forall (A : AbGroup) (p : A $-> P), IsConnMap (Tr (-1)) p -> merely {s : P $-> A & p $o s == grp_homo_id})
P: AbGroup

IsAbProjective P <-> (forall (A : AbGroup) (p : A $-> P), IsConnMap (Tr (-1)) p -> merely {s : P $-> A & p $o s == grp_homo_id})
P: AbGroup

IsAbProjective P -> forall (A : AbGroup) (p : A $-> P), IsConnMap (Tr (-1)) p -> merely {s : P $-> A & p $o s == grp_homo_id}
P: AbGroup
(forall (A : AbGroup) (p : A $-> P), IsConnMap (Tr (-1)) p -> merely {s : P $-> A & p $o s == grp_homo_id}) -> IsAbProjective P
P: AbGroup

IsAbProjective P -> forall (A : AbGroup) (p : A $-> P), IsConnMap (Tr (-1)) p -> merely {s : P $-> A & p $o s == grp_homo_id}
P: AbGroup
H: IsAbProjective P
A: AbGroup
B: A $-> P

IsConnMap (Tr (-1)) B -> merely {s : P $-> A & B $o s == grp_homo_id}
apply H.
P: AbGroup

(forall (A : AbGroup) (p : A $-> P), IsConnMap (Tr (-1)) p -> merely {s : P $-> A & p $o s == grp_homo_id}) -> IsAbProjective P
P: AbGroup
H: forall (A : AbGroup) (p : A $-> P), IsConnMap (Tr (-1)) p -> merely {s : P $-> A & p $o s == grp_homo_id}
A, B: AbGroup
e: A $-> B
f: P $-> B
H1: IsConnMap (Tr (-1)) e

merely {l : P $-> A & e $o l == f}
P: AbGroup
H: forall (A : AbGroup) (p : A $-> P), IsConnMap (Tr (-1)) p -> merely {s : P $-> A & p $o s == grp_homo_id}
A, B: AbGroup
e: A $-> B
f: P $-> B
H1: IsConnMap (Tr (-1)) e
s: merely {s : P $-> ab_pullback f e & grp_pullback_pr1 f e $o s == grp_homo_id}

merely {l : P $-> A & e $o l == f}
P: AbGroup
H: forall (A : AbGroup) (p : A $-> P), IsConnMap (Tr (-1)) p -> merely {s : P $-> A & p $o s == grp_homo_id}
A, B: AbGroup
e: A $-> B
f: P $-> B
H1: IsConnMap (Tr (-1)) e
s: {s : P $-> ab_pullback f e & grp_pullback_pr1 f e $o s == grp_homo_id}

merely {l : P $-> A & e $o l == f}
P: AbGroup
H: forall (A : AbGroup) (p : A $-> P), IsConnMap (Tr (-1)) p -> merely {s : P $-> A & p $o s == grp_homo_id}
A, B: AbGroup
e: A $-> B
f: P $-> B
H1: IsConnMap (Tr (-1)) e
s: P $-> ab_pullback f e
h: grp_pullback_pr1 f e $o s == grp_homo_id

merely {l : P $-> A & e $o l == f}
P: AbGroup
H: forall (A : AbGroup) (p : A $-> P), IsConnMap (Tr (-1)) p -> merely {s : P $-> A & p $o s == grp_homo_id}
A, B: AbGroup
e: A $-> B
f: P $-> B
H1: IsConnMap (Tr (-1)) e
s: P $-> ab_pullback f e
h: grp_pullback_pr1 f e $o s == grp_homo_id
x: P

(e $o (grp_pullback_pr2 f e $o s)) x = f x
P: AbGroup
H: forall (A : AbGroup) (p : A $-> P), IsConnMap (Tr (-1)) p -> merely {s : P $-> A & p $o s == grp_homo_id}
A, B: AbGroup
e: A $-> B
f: P $-> B
H1: IsConnMap (Tr (-1)) e
s: P $-> ab_pullback f e
h: grp_pullback_pr1 f e $o s == grp_homo_id
x: P

f (pullback_pr1 (s x)) = f x
exact (ap f (h x)). Defined.