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 Truncations.Core.Require Import Algebra.Groups.Group.Require Import Algebra.Groups.Subgroup.Require Import WildCat.Core.Require Import HSet.(** Image of group homomorphisms *)LocalOpen Scope mc_scope.LocalOpen Scope mc_mult_scope.(** The image of a group homomorphism between groups is a subgroup *)
A, B: Group f: A $-> B
Subgroup B
A, B: Group f: A $-> B
Subgroup B
A, B: Group f: A $-> B
IsSubgroup
(funb : B => hexists (funa : A => f a = b))
A, B: Group f: A $-> B
forallx : B, IsHProp (hexists (funa : A => f a = x))
A, B: Group f: A $-> B
hexists (funa : A => f a = mon_unit)
A, B: Group f: A $-> B
forallxy : B,
hexists (funa : A => f a = x) ->
hexists (funa : A => f a = y) ->
hexists (funa : A => f a = x * y)
A, B: Group f: A $-> B
forallx : B,
hexists (funa : A => f a = x) ->
hexists (funa : A => f a = - x)
A, B: Group f: A $-> B
hexists (funa : A => f a = mon_unit)
A, B: Group f: A $-> B
forallxy : B,
hexists (funa : A => f a = x) ->
hexists (funa : A => f a = y) ->
hexists (funa : A => f a = x * y)
A, B: Group f: A $-> B
forallx : B,
hexists (funa : A => f a = x) ->
hexists (funa : A => f a = - x)
A, B: Group f: A $-> B
forallxy : B,
hexists (funa : A => f a = x) ->
hexists (funa : A => f a = y) ->
hexists (funa : A => f a = x * y)
A, B: Group f: A $-> B
forallx : B,
hexists (funa : A => f a = x) ->
hexists (funa : A => f a = - x)
A, B: Group f: A $-> B
forallxy : B,
hexists (funa : A => f a = x) ->
hexists (funa : A => f a = y) ->
hexists (funa : A => f a = x * y)
A, B: Group f: A $-> B x, y: B q: {a : A & f a = y} p: {a : A & f a = x}
{a : A & f a = x * y}
A, B: Group f: A $-> B x, y: B b, a: A
{a0 : A & f a0 = f a * f b}
A, B: Group f: A $-> B x, y: B b, a: A
f (a * b) = f a * f b
apply grp_homo_op.
A, B: Group f: A $-> B
forallx : B,
hexists (funa : A => f a = x) ->
hexists (funa : A => f a = - x)
A, B: Group f: A $-> B b: B p: hexists (funa : A => f a = b)
hexists (funa : A => f a = - b)
A, B: Group f: A $-> B b: B p: {a : A & f a = b}
hexists (funa : A => f a = - b)
A, B: Group f: A $-> B b: B a: A
hexists (funa0 : A => f a0 = - f a)
A, B: Group f: A $-> B b: B a: A
f (- a) = - f a
apply grp_homo_inv.Defined.
A, B: Group f: A $-> B
A $-> grp_image f
A, B: Group f: A $-> B
A $-> grp_image f
A, B: Group f: A $-> B
A -> grp_image f
A, B: Group f: A $-> B
IsSemiGroupPreserving ?f
A, B: Group f: A $-> B
A -> grp_image f
A, B: Group f: A $-> B x: A
grp_image f
A, B: Group f: A $-> B x: A
grp_image f (f x)
A, B: Group f: A $-> B x: A
{a : A & f a = f x}
A, B: Group f: A $-> B x: A
f x = f x
reflexivity.
A, B: Group f: A $-> B
IsSemiGroupPreserving
(funx : A => (f x; tr (x; 1%path)))
A, B: Group f: A $-> B
IsSemiGroupPreserving
(funx : A => (f x; tr (x; 1%path)))
grp_auto.Defined.(** When the homomorphism is an embedding, we don't need to truncate. *)
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
Subgroup B
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
Subgroup B
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
IsSubgroup (hfiber f)
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
forallx : B, IsHProp (hfiber f x)
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
hfiber f mon_unit
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
forallxy : B,
hfiber f x -> hfiber f y -> hfiber f (x * y)
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
forallx : B, hfiber f x -> hfiber f (- x)
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
forallx : B, IsHProp (hfiber f x)
exact _.
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
hfiber f mon_unit
exact (mon_unit; grp_homo_unit f).
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
forallxy : B,
hfiber f x -> hfiber f y -> hfiber f (x * y)
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f x, y: B a, b: A
hfiber f (f a * f b)
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f x, y: B a, b: A
f (a * b) = f a * f b
apply grp_homo_op.
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
forallx : B, hfiber f x -> hfiber f (- x)
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f b: B a: A
hfiber f (- f a)
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f b: B a: A
f (- a) = - f a
apply grp_homo_inv.Defined.
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
GroupIsomorphism A (grp_image_embedding f)
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
GroupIsomorphism A (grp_image_embedding f)
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
GroupHomomorphism A (grp_image_embedding f)
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
IsEquiv ?grp_iso_homo
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
GroupHomomorphism A (grp_image_embedding f)
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
A -> grp_image_embedding f
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
IsSemiGroupPreserving ?f
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
A -> grp_image_embedding f
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f x: A
grp_image_embedding f
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f x: A
grp_image_embedding f (f x)
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f x: A
f x = f x
reflexivity.
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
IsSemiGroupPreserving (funx : A => (f x; x; 1%path))
cbn; grp_auto.
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f
IsEquiv
(Build_GroupHomomorphism
(funx : A => (f x; x; 1%path)))
A, B: Group f: A $-> B IsEmbedding0: IsEmbedding f