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]
Require Import Algebra.Groups.Group.Require Import Algebra.Groups.Subgroup.Require Import WildCat.Core.(** * Kernels of group homomorphisms *)LocalOpen Scope mc_scope.LocalOpen Scope mc_mult_scope.
A, B: Group f: GroupHomomorphism A B
NormalSubgroup A
A, B: Group f: GroupHomomorphism A B
NormalSubgroup A
A, B: Group f: GroupHomomorphism A B
Subgroup A
A, B: Group f: GroupHomomorphism A B
IsNormalSubgroup ?normalsubgroup_subgroup
A, B: Group f: GroupHomomorphism A B
Subgroup A
A, B: Group f: GroupHomomorphism A B
(funx : A => f x = group_unit) mon_unit
A, B: Group f: GroupHomomorphism A B
forallxy : A,
(funx0 : A => f x0 = group_unit) x ->
(funx0 : A => f x0 = group_unit) y ->
(funx0 : A => f x0 = group_unit) (x * - y)
A, B: Group f: GroupHomomorphism A B
forallxy : A,
(funx0 : A => f x0 = group_unit) x ->
(funx0 : A => f x0 = group_unit) y ->
(funx0 : A => f x0 = group_unit) (x * - y)
A, B: Group f: GroupHomomorphism A B x, y: A p: f x = group_unit q: f y = group_unit
f (x * - y) = group_unit
A, B: Group f: GroupHomomorphism A B x, y: A p: f x = group_unit q: f y = group_unit
f (- y) = ?Goal
A, B: Group f: GroupHomomorphism A B x, y: A p: f x = group_unit q: f y = group_unit
group_unit * ?Goal = group_unit
A, B: Group f: GroupHomomorphism A B x, y: A p: f x = group_unit q: f y = group_unit
group_unit * - f y = group_unit
rewrite q; apply right_inverse.
A, B: Group f: GroupHomomorphism A B
IsNormalSubgroup
(Build_Subgroup' (funx : A => f x = group_unit)
(grp_homo_unit f)
(fun (xy : A)
(p : (funx0 : A => f x0 = group_unit) x)
(q : (funx0 : A => f x0 = group_unit) y) =>
(grp_homo_op f x (- y) @
ap011 sg_op p (grp_homo_inv f y)) @
internal_paths_rew_r
(fung : B => group_unit * - g = group_unit)
(right_inverse group_unit) q
:
(funx0 : A => f x0 = group_unit) (x * - y)))
A, B: Group f: GroupHomomorphism A B x, y: A
f (- x * y) = group_unit <~> f (x * - y) = group_unit
A, B: Group f: GroupHomomorphism A B x, y: A
f (- x) * f y = group_unit <~>
f x * f (- y) = group_unit
A, B: Group f: GroupHomomorphism A B x, y: A
- f x * f y = group_unit <~> f x * - f y = group_unit
A, B: Group f: GroupHomomorphism A B x, y: A
f x * - f y = group_unit <~> f y = f x
A, B: Group f: GroupHomomorphism A B x, y: A
group_unit = f x * - f y <~> f y = f x
apply grp_moveR_1M.Defined.(** ** Corecursion principle for group kernels *)
A, B, G: Group f: A $-> B g: G $-> A h: f $o g == grp_homo_const
G $-> grp_kernel f
A, B, G: Group f: A $-> B g: G $-> A h: f $o g == grp_homo_const
G $-> grp_kernel f
A, B, G: Group f: A $-> B g: G $-> A h: f $o g == grp_homo_const
G -> grp_kernel f
A, B, G: Group f: A $-> B g: G $-> A h: f $o g == grp_homo_const
IsSemiGroupPreserving ?f
A, B, G: Group f: A $-> B g: G $-> A h: f $o g == grp_homo_const
G -> grp_kernel f
exact (funx:G => (g x; h x)).
A, B, G: Group f: A $-> B g: G $-> A h: f $o g == grp_homo_const
IsSemiGroupPreserving (funx : G => (g x; h x))
A, B, G: Group f: A $-> B g: G $-> A h: f $o g == grp_homo_const x, x': G
(g (x * x'); h (x * x')) = (g x; h x) * (g x'; h x')
A, B, G: Group f: A $-> B g: G $-> A h: f $o g == grp_homo_const x, x': G
g (x * x') = g x * g x'
apply grp_homo_op.Defined.
H: Funext A, B, G: Group f: A $-> B
(G $-> grp_kernel f) <~>
{g : G $-> A & f $o g == grp_homo_const}
H: Funext A, B, G: Group f: A $-> B
(G $-> grp_kernel f) <~>
{g : G $-> A & f $o g == grp_homo_const}
H: Funext A, B, G: Group f: A $-> B
(G $-> grp_kernel f) ->
{g : G $-> A & f $o g == grp_homo_const}
H: Funext A, B, G: Group f: A $-> B
{g : G $-> A & f $o g == grp_homo_const} ->
G $-> grp_kernel f
H: Funext A, B, G: Group f: A $-> B
?f o ?g == idmap
H: Funext A, B, G: Group f: A $-> B
?g o ?f == idmap
H: Funext A, B, G: Group f: A $-> B
(G $-> grp_kernel f) ->
{g : G $-> A & f $o g == grp_homo_const}
H: Funext A, B, G: Group f: A $-> B k: G $-> grp_kernel f
{g : G $-> A & f $o g == grp_homo_const}
H: Funext A, B, G: Group f: A $-> B k: G $-> grp_kernel f
grp_kernel f $-> A
H: Funext A, B, G: Group f: A $-> B k: G $-> grp_kernel f
(fung : G $-> A => f $o g == grp_homo_const)
(?Goal $o k)
H: Funext A, B, G: Group f: A $-> B k: G $-> grp_kernel f
(fung : G $-> A => f $o g == grp_homo_const)
(subgroup_incl (grp_kernel f) $o k)
H: Funext A, B, G: Group f: A $-> B k: G $-> grp_kernel f x: G
f (k x).1 = group_unit
exact (k x).2.
H: Funext A, B, G: Group f: A $-> B
{g : G $-> A & f $o g == grp_homo_const} ->
G $-> grp_kernel f
H: Funext A, B, G: Group f: A $-> B g: G $-> A p: f $o g == grp_homo_const
G $-> grp_kernel f
exact (grp_kernel_corec _ p).
H: Funext A, B, G: Group f: A $-> B
(funk : G $-> grp_kernel f =>
(subgroup_incl (grp_kernel f) $o k;
(funx : G =>
(k x).2
:
(f $o (subgroup_incl (grp_kernel f) $o k)) x =
grp_homo_const x)
:
(fung : G $-> A => f $o g == grp_homo_const)
(subgroup_incl (grp_kernel f) $o k)))
o (funX : {g : G $-> A & f $o g == grp_homo_const} =>
(fun (g : G $-> A) (p : f $o g == grp_homo_const)
=> grp_kernel_corec g p) X.1 X.2) == idmap
H: Funext A, B, G: Group f: A $-> B g: G $-> A p: f $o g == grp_homo_const
(subgroup_incl (grp_kernel f) $o grp_kernel_corec g p;
funx : G => (grp_kernel_corec g p x).2) = (g; p)
H: Funext A, B, G: Group f: A $-> B g: G $-> A p: f $o g == grp_homo_const
subgroup_incl (grp_kernel f) $o grp_kernel_corec g p =
g
(funX : {g : G $-> A & f $o g == grp_homo_const} =>
(fun (g : G $-> A) (p : f $o g == grp_homo_const) =>
grp_kernel_corec g p) X.1 X.2)
o (funk : G $-> grp_kernel f =>
(subgroup_incl (grp_kernel f) $o k;
(funx : G =>
(k x).2
:
(f $o (subgroup_incl (grp_kernel f) $o k)) x =
grp_homo_const x)
:
(fung : G $-> A => f $o g == grp_homo_const)
(subgroup_incl (grp_kernel f) $o k))) == idmap
H: Funext A, B, G: Group f: A $-> B k: G $-> grp_kernel f
grp_kernel_corec (subgroup_incl (grp_kernel f) $o k)
(funx : G => (k x).2) = k
H: Funext A, B, G: Group f: A $-> B k: G $-> grp_kernel f x: G
grp_kernel_corec (subgroup_incl (grp_kernel f) $o k)
(funx : G => (k x).2) x = k x
apply path_sigma_hprop; reflexivity.Defined.(** ** Characterisation of group embeddings *)
H: Univalence A, B: Group f: A $-> B
grp_kernel f = trivial_subgroup <~> IsEmbedding f
H: Univalence A, B: Group f: A $-> B
grp_kernel f = trivial_subgroup <~> IsEmbedding f
H: Univalence A, B: Group f: A $-> B
(forallg : A, grp_kernel f g <-> trivial_subgroup g) <~>
IsEmbedding f
H: Univalence A, B: Group f: A $-> B
(forallg : A, grp_kernel f g <-> trivial_subgroup g) <->
IsEmbedding f
H: Univalence A, B: Group f: A $-> B
(forallg : A, grp_kernel f g <-> trivial_subgroup g) ->
foralla : A, f a = group_unit -> a = group_unit
H: Univalence A, B: Group f: A $-> B
(foralla : A, f a = group_unit -> a = group_unit) ->
forallg : A, grp_kernel f g <-> trivial_subgroup g
H: Univalence A, B: Group f: A $-> B
(forallg : A, grp_kernel f g <-> trivial_subgroup g) ->
foralla : A, f a = group_unit -> a = group_unit
H: Univalence A, B: Group f: A $-> B E: forallg : A,
grp_kernel f g <-> trivial_subgroup g a: A X: f a = group_unit
a = group_unit
byapply E.
H: Univalence A, B: Group f: A $-> B
(foralla : A, f a = group_unit -> a = group_unit) ->
forallg : A, grp_kernel f g <-> trivial_subgroup g
H: Univalence A, B: Group f: A $-> B e: foralla : A, f a = group_unit -> a = group_unit a: A
grp_kernel f a -> trivial_subgroup a
H: Univalence A, B: Group f: A $-> B e: foralla : A, f a = group_unit -> a = group_unit a: A
trivial_subgroup a -> grp_kernel f a
H: Univalence A, B: Group f: A $-> B e: foralla : A, f a = group_unit -> a = group_unit a: A
grp_kernel f a -> trivial_subgroup a
apply e.
H: Univalence A, B: Group f: A $-> B e: foralla : A, f a = group_unit -> a = group_unit a: A
trivial_subgroup a -> grp_kernel f a
H: Univalence A, B: Group f: A $-> B e: foralla : A, f a = group_unit -> a = group_unit a: A p: trivial_subgroup a