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 Spaces.Nat.Core.(* Some of the material in abstract_algebra and canonical names could be selectively exported to the user, as is done in Groups/Group.v. *)Require Import Classes.interfaces.canonical_names.Require Import Algebra.Groups.Kernel Algebra.Groups.Image Algebra.Groups.QuotientGroup.Require Import Algebra.AbGroups.AbelianGroup Algebra.AbGroups.Biproduct.Require Import Rings.Ring.Declare Scope module_scope.(** * Left modules over a ring. *)(** TODO: Right modules? We can treat right modules as left modules over the opposite ring. *)(** ** Definition *)(** An abelian group [M] is a left [R]-module when equipped with the following data: *)ClassIsLeftModule (R : Ring) (M : AbGroup) := {
(** A function [lact] (left-action) that takes an element [r : R] and an element [m : M] and returns an element [lact r m : M]. *)
lact : R -> M -> M;
(** Actions distribute on the left over addition in the abelian group. That is [lact r (m + n) = lact r m + lact r n]. *)
lact_left_dist :: LeftHeteroDistribute lact (+) (+);
(** Actions distribute on the right over addition in the ring. That is [lact (r + s) m = lact r m + lact s m]. *)
lact_right_dist :: RightHeteroDistribute lact (+) (+);
(** Actions are associative. That is [lact (r * s) m = lact r (lact s m)]. *)
lact_assoc :: HeteroAssociative lact lact lact (.*.);
(** Actions preserve the multiplicative identity. That is [lact 1 m = m]. *)
lact_unit :: LeftIdentity lact 1;
}.(** TODO: notation for action. *)(** A left R-module is an abelian group equipped with a left R-module structure. *)RecordLeftModule (R : Ring) := {
lm_carrier :> AbGroup;
lm_lact :: IsLeftModule R lm_carrier;
}.SectionModuleAxioms.Context {R : Ring} {M : LeftModule R} (rs : R) (mn : M).(** Here we state the module axioms in a readable form for direct use. *)Definitionlm_dist_l : lact r (m + n) = lact r m + lact r n := lact_left_dist r m n.Definitionlm_dist_r : lact (r + s) m = lact r m + lact s m := lact_right_dist r s m.Definitionlm_assoc : lact r (lact s m) = lact (r * s) m := lact_assoc r s m.Definitionlm_unit : lact 1 m = m := lact_unit m.EndModuleAxioms.(** ** Facts about left modules *)SectionModuleFacts.Context {R : Ring} {M : LeftModule R} (r : R) (m : M).(** Here are some quick facts that hold in modules. *)(** The action of zero is zero. *)
R: Ring M: LeftModule R r: R m: M
lact 0 m = 0
R: Ring M: LeftModule R r: R m: M
lact 0 m = 0
R: Ring M: LeftModule R r: R m: M
sg_op (lact 0 m) (lact 0 m) = lact 0 m
R: Ring M: LeftModule R r: R m: M
lact (0 + 0) m = lact 0 m
R: Ring M: LeftModule R r: R m: M
0 + 0 = 0
apply rng_plus_zero_r.Defined.(** The action on zero is zero. *)
R: Ring M: LeftModule R r: R m: M
lact r (0 : M) = 0
R: Ring M: LeftModule R r: R m: M
lact r (0 : M) = 0
R: Ring M: LeftModule R r: R m: M
sg_op (lact r 0) (lact r 0) = lact r 0
R: Ring M: LeftModule R r: R m: M
lact r (0 + 0) = lact r 0
R: Ring M: LeftModule R r: R m: M
0 + 0 = 0
apply grp_unit_l.Defined.(** The action of [-1] is the additive inverse. *)
R: Ring M: LeftModule R r: R m: M
lact (-1) m = - m
R: Ring M: LeftModule R r: R m: M
lact (-1) m = - m
R: Ring M: LeftModule R r: R m: M
sg_op (lact (-1) m) m = mon_unit
R: Ring M: LeftModule R r: R m: M
lact (-1) m + lact 1 m = mon_unit
R: Ring M: LeftModule R r: R m: M
lact (-1 + 1) m = mon_unit
R: Ring M: LeftModule R r: R m: M
lact (-1 + 1) m = lact 0 m
R: Ring M: LeftModule R r: R m: M
-1 + 1 = 0
apply grp_inv_l.Defined.EndModuleFacts.(** ** Left Submodules *)(** A subgroup of a left R-module is a left submodule if it is closed under the action of R. *)ClassIsLeftSubmodule {R : Ring} {M : LeftModule R} (N : M -> Type) := {
ils_issubgroup :: IsSubgroup N;
is_left_submodule : forallrm, N m -> N (lact r m);
}.(** A left submodule is a subgroup of the abelian group closed under the action of R. *)RecordLeftSubmodule {R : Ring} (M : LeftModule R) := {
lsm_carrier :> M -> Type;
lsm_submodule :: IsLeftSubmodule lsm_carrier;
}.Definitionsubgroup_leftsubmodule {R : Ring} {M : LeftModule R}
: LeftSubmodule M -> Subgroup M
:= funN => Build_Subgroup M N _.Coercionsubgroup_leftsubmodule : LeftSubmodule >-> Subgroup.(** Submodules inherit the R-module structure of their parent. *)
R: Ring M: LeftModule R N: LeftSubmodule M
IsLeftModule R N
R: Ring M: LeftModule R N: LeftSubmodule M
IsLeftModule R N
R: Ring M: LeftModule R N: LeftSubmodule M
R -> N -> N
R: Ring M: LeftModule R N: LeftSubmodule M
LeftHeteroDistribute ?lact plus plus
R: Ring M: LeftModule R N: LeftSubmodule M
RightHeteroDistribute ?lact plus plus
R: Ring M: LeftModule R N: LeftSubmodule M
HeteroAssociative ?lact?lact?lact mult
R: Ring M: LeftModule R N: LeftSubmodule M
LeftIdentity ?lact1
R: Ring M: LeftModule R N: LeftSubmodule M
R -> N -> N
R: Ring M: LeftModule R N: LeftSubmodule M r: R n: M n_in_N: N n
N
R: Ring M: LeftModule R N: LeftSubmodule M r: R n: M n_in_N: N n
N (lact r n)
byapply lsm_submodule.
R: Ring M: LeftModule R N: LeftSubmodule M
LeftHeteroDistribute
(fun (r : R) (X : N) =>
(fun (n : M) (n_in_N : N n) =>
(lact r n;
letX0 :=
fun (M : LeftModule R) (l : LeftSubmodule M) =>
is_left_submodule in
X0 M N r n n_in_N)) X.1 X.2) plus plus
R: Ring M: LeftModule R N: LeftSubmodule M r: R n: M proj2: N n m: M proj0: N m
(lact r ((n; proj2) + (m; proj0)).1;
letX :=
fun (M : LeftModule R) (l : LeftSubmodule M) =>
is_left_submodule in
X M N r ((n; proj2) + (m; proj0)).1
((n; proj2) + (m; proj0)).2).1 =
((lact r n;
letX :=
fun (M : LeftModule R) (l : LeftSubmodule M) =>
is_left_submodule in
X M N r n proj2) +
(lact r m;
letX :=
fun (M : LeftModule R) (l : LeftSubmodule M) =>
is_left_submodule in
X M N r m proj0)).1
apply lact_left_dist.
R: Ring M: LeftModule R N: LeftSubmodule M
RightHeteroDistribute
(fun (r : R) (X : N) =>
(fun (n : M) (n_in_N : N n) =>
(lact r n;
letX0 :=
fun (M : LeftModule R) (l : LeftSubmodule M) =>
is_left_submodule in
X0 M N r n n_in_N)) X.1 X.2) plus plus
R: Ring M: LeftModule R N: LeftSubmodule M r, s: R n: M proj2: N n
(lact (r + s) n;
letX :=
fun (M : LeftModule R) (l : LeftSubmodule M) =>
is_left_submodule in
X M N (r + s) n proj2).1 =
((lact r n;
letX :=
fun (M : LeftModule R) (l : LeftSubmodule M) =>
is_left_submodule in
X M N r n proj2) +
(lact s n;
letX :=
fun (M : LeftModule R) (l : LeftSubmodule M) =>
is_left_submodule in
X M N s n proj2)).1
apply lact_right_dist.
R: Ring M: LeftModule R N: LeftSubmodule M
HeteroAssociative
(fun (r : R) (X : N) =>
(fun (n : M) (n_in_N : N n) =>
(lact r n;
letX0 :=
fun (M : LeftModule R) (l : LeftSubmodule M) =>
is_left_submodule in
X0 M N r n n_in_N)) X.1 X.2)
(fun (r : R) (X : N) =>
(fun (n : M) (n_in_N : N n) =>
(lact r n;
letX0 :=
fun (M : LeftModule R) (l : LeftSubmodule M) =>
is_left_submodule in
X0 M N r n n_in_N)) X.1 X.2)
(fun (r : R) (X : N) =>
(fun (n : M) (n_in_N : N n) =>
(lact r n;
letX0 :=
fun (M : LeftModule R) (l : LeftSubmodule M) =>
is_left_submodule in
X0 M N r n n_in_N)) X.1 X.2) mult
R: Ring M: LeftModule R N: LeftSubmodule M r, s: R n: M proj2: N n
(lact r (lact s n);
letX :=
fun (M : LeftModule R) (l : LeftSubmodule M) =>
is_left_submodule in
X M N r (lact s n)
(letX0 :=
fun (M : LeftModule R) (l : LeftSubmodule M) =>
is_left_submodule in
X0 M N s n proj2)).1 =
(lact (r * s) n;
letX :=
fun (M : LeftModule R) (l : LeftSubmodule M) =>
is_left_submodule in
X M N (r * s) n proj2).1
apply lact_assoc.
R: Ring M: LeftModule R N: LeftSubmodule M
LeftIdentity
(fun (r : R) (X : N) =>
(fun (n : M) (n_in_N : N n) =>
(lact r n;
letX0 :=
fun (M : LeftModule R) (l : LeftSubmodule M) =>
is_left_submodule in
X0 M N r n n_in_N)) X.1 X.2) 1
R: Ring M: LeftModule R N: LeftSubmodule M n: M proj2: N n
(lact 1 n;
letX :=
fun (M : LeftModule R) (l : LeftSubmodule M) =>
is_left_submodule in
X M N 1 n proj2).1 = (n; proj2).1
apply lact_unit.Defined.(** Any left submodule of a left R-module is a left R-module. *)Definitionleftmodule_leftsubmodule {R : Ring}
{M : LeftModule R} (N : LeftSubmodule M)
: LeftModule R
:= Build_LeftModule R N _.Coercionleftmodule_leftsubmodule : LeftSubmodule >-> LeftModule.(** The submodule criterion. This is a convenient way to build submodules. *)
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m)
IsLeftSubmodule H
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m)
IsLeftSubmodule H
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m)
IsSubgroup H
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m)
forall (r : R) (m : M), H m -> H (lact r m)
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m)
IsSubgroup H
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m)
forallx : M, IsHProp (H x)
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m)
H mon_unit
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m)
forallxy : M, H x -> H y -> H (sg_op x (- y))
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m)
forallx : M, IsHProp (H x)
exact _.
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m)
H mon_unit
exact z.
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m)
forallxy : M, H x -> H y -> H (sg_op x (- y))
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m) x, y: M hx: H x hy: H y
H (sg_op x (- y))
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m) x, y: M hx: H x hy: H y
H (x - y)
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m) x, y: M hx: H x hy: H y p: H (x + lact (-1) y)
H (x - y)
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m) x, y: M hx: H x hy: H y p: H (x - y)
H (x - y)
exact p.
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m)
forall (r : R) (m : M), H m -> H (lact r m)
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m) r: R m: M hm: H m
H (lact r m)
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m) r: R m: M hm: H m
H (sg_op mon_unit (lact r m))
byapply c.Defined.
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m)
LeftSubmodule M
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m)
LeftSubmodule M
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m) p:= Build_IsLeftSubmodule' H z c: IsLeftSubmodule H
LeftSubmodule M
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m) p:= Build_IsLeftSubmodule' H z c: IsLeftSubmodule H
M -> Type
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m) p:= Build_IsLeftSubmodule' H z c: IsLeftSubmodule H
IsLeftSubmodule ?lsm_carrier
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m) p:= Build_IsLeftSubmodule' H z c: IsLeftSubmodule H
IsSubgroup H
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m) p:= Build_IsLeftSubmodule' H z c: IsLeftSubmodule H
R: Ring M: LeftModule R H: M -> Type H0: forallx : M, IsHProp (H x) z: H 0 c: forall (r : R) (nm : M),
H n -> H m -> H (n + lact r m) p:= Build_IsLeftSubmodule' H z c: IsLeftSubmodule H
IsSubgroup H
rapply ils_issubgroup.Defined.(** ** Left R-module homomorphisms *)(** A left module homomorphism is a group homomorphism that commutes with the action of R. *)RecordLeftModuleHomomorphism {R : Ring} (MN : LeftModule R) := {
lm_homo_map :> GroupHomomorphism M N;
lm_homo_lact : forallrm, lm_homo_map (lact r m) = lact r (lm_homo_map m);
}.
R: Ring M: LeftModule R
LeftModuleHomomorphism M M
R: Ring M: LeftModule R
LeftModuleHomomorphism M M
R: Ring M: LeftModule R
GroupHomomorphism M M
R: Ring M: LeftModule R
forall (r : R) (m : M),
?lm_homo_map (lact r m) = lact r (?lm_homo_map m)
R: Ring M: LeftModule R
GroupHomomorphism M M
exact grp_homo_id.
R: Ring M: LeftModule R
forall (r : R) (m : M),
grp_homo_id (lact r m) = lact r (grp_homo_id m)
reflexivity.Defined.
R: Ring M, N, L: LeftModule R
LeftModuleHomomorphism N L ->
LeftModuleHomomorphism M N ->
LeftModuleHomomorphism M L
R: Ring M, N, L: LeftModule R
LeftModuleHomomorphism N L ->
LeftModuleHomomorphism M N ->
LeftModuleHomomorphism M L
R: Ring M, N, L: LeftModule R f: LeftModuleHomomorphism N L g: LeftModuleHomomorphism M N
LeftModuleHomomorphism M L
R: Ring M, N, L: LeftModule R f: LeftModuleHomomorphism N L g: LeftModuleHomomorphism M N
GroupHomomorphism M L
R: Ring M, N, L: LeftModule R f: LeftModuleHomomorphism N L g: LeftModuleHomomorphism M N
forall (r : R) (m : M),
?lm_homo_map (lact r m) = lact r (?lm_homo_map m)
R: Ring M, N, L: LeftModule R f: LeftModuleHomomorphism N L g: LeftModuleHomomorphism M N
GroupHomomorphism M L
exact (grp_homo_compose f g).
R: Ring M, N, L: LeftModule R f: LeftModuleHomomorphism N L g: LeftModuleHomomorphism M N
forall (r : R) (m : M),
grp_homo_compose f g (lact r m) =
lact r (grp_homo_compose f g m)
R: Ring M, N, L: LeftModule R f: LeftModuleHomomorphism N L g: LeftModuleHomomorphism M N r: R m: M
grp_homo_compose f g (lact r m) =
lact r (grp_homo_compose f g m)
R: Ring M, N, L: LeftModule R f: LeftModuleHomomorphism N L g: LeftModuleHomomorphism M N r: R m: M
grp_homo_compose f g (lact r m) = f (lact r (g m))
R: Ring M, N, L: LeftModule R f: LeftModuleHomomorphism N L g: LeftModuleHomomorphism M N r: R m: M
g (lact r m) = lact r (g m)
apply lm_homo_lact.Defined.(** Smart constructor for building left module homomorphisms from a map. *)
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y
LeftModuleHomomorphism M N
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y
LeftModuleHomomorphism M N
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y
GroupHomomorphism M N
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y
forall (r : R) (m : M),
?lm_homo_map (lact r m) = lact r (?lm_homo_map m)
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y
GroupHomomorphism M N
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y
M -> N
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y
IsSemiGroupPreserving ?f
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y
M -> N
exact f.
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y
IsSemiGroupPreserving f
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y x, y: M
f (sg_op x y) = sg_op (f x) (f y)
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y x, y: M
f (sg_op x y) = sg_op (lact 1 (f x)) (f y)
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y x, y: M g:= lact 1 (f x): N
f (sg_op x y) = sg_op g (f y)
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y x, y: M g:= lact 1 (f x): N
f (sg_op (lact 1 x) y) = sg_op g (f y)
apply p.
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y
forall (r : R) (m : M),
Build_GroupHomomorphism f (lact r m) =
lact r (Build_GroupHomomorphism f m)
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y r: R m: M
Build_GroupHomomorphism f (lact r m) =
lact r (Build_GroupHomomorphism f m)
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y r: R m: M
f (lact r m) = lact r (f m)
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y r: R m: M
f (sg_op (lact r m) mon_unit) = lact r (f m)
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y r: R m: M
lact r (f m) + f mon_unit = lact r (f m)
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y r: R m: M
lact r (f m) + f mon_unit =
sg_op (lact r (f m)) mon_unit
R: Ring M, N: LeftModule R f: M -> N p: forall (r : R) (xy : M),
f (lact r x + y) = lact r (f x) + f y r: R m: M
f mon_unit = mon_unit
R: Ring M, N: LeftModule R f: M -> N p: f (lact 10 + 0) = lact 1 (f 0) + f 0 r: R m: M
f mon_unit = mon_unit
R: Ring M, N: LeftModule R f: M -> N p: f (0 + 0) = f 0 + f 0 r: R m: M
f mon_unit = mon_unit
R: Ring M, N: LeftModule R f: M -> N p: f (0 + 0) = f 0 + f 0 r: R m: M
sg_op (f 0) (f mon_unit) = f 0
R: Ring M, N: LeftModule R f: M -> N p: f (0 + 0) = f 0 + f 0 r: R m: M
f (0 + 0) = f 0
R: Ring M, N: LeftModule R f: M -> N p: f (0 + 0) = f 0 + f 0 r: R m: M
R: Ring M, N: LeftModule R f: GroupIsomorphism M N p: forall (r : R) (x : M),
f (lact r x) = lact r (f x)
LeftModuleIsomorphism M N
R: Ring M, N: LeftModule R f: GroupIsomorphism M N p: forall (r : R) (x : M),
f (lact r x) = lact r (f x)
LeftModuleIsomorphism M N
R: Ring M, N: LeftModule R f: GroupIsomorphism M N p: forall (r : R) (x : M),
f (lact r x) = lact r (f x)
LeftModuleHomomorphism M N
R: Ring M, N: LeftModule R f: GroupIsomorphism M N p: forall (r : R) (x : M),
f (lact r x) = lact r (f x)
IsEquiv ?lm_iso_map
R: Ring M, N: LeftModule R f: GroupIsomorphism M N p: forall (r : R) (x : M),
f (lact r x) = lact r (f x)
LeftModuleHomomorphism M N
R: Ring M, N: LeftModule R f: GroupIsomorphism M N p: forall (r : R) (x : M),
f (lact r x) = lact r (f x)
GroupHomomorphism M N
R: Ring M, N: LeftModule R f: GroupIsomorphism M N p: forall (r : R) (x : M),
f (lact r x) = lact r (f x)
forall (r : R) (m : M),
?lm_homo_map (lact r m) = lact r (?lm_homo_map m)
R: Ring M, N: LeftModule R f: GroupIsomorphism M N p: forall (r : R) (x : M),
f (lact r x) = lact r (f x)
GroupHomomorphism M N
exact f.
R: Ring M, N: LeftModule R f: GroupIsomorphism M N p: forall (r : R) (x : M),
f (lact r x) = lact r (f x)
forall (r : R) (m : M), f (lact r m) = lact r (f m)
exact p.
R: Ring M, N: LeftModule R f: GroupIsomorphism M N p: forall (r : R) (x : M),
f (lact r x) = lact r (f x)
IsEquiv {| lm_homo_map := f; lm_homo_lact := p |}
exact _.Defined.
R: Ring M, N: LeftModule R
LeftModuleIsomorphism M N -> LeftModuleIsomorphism N M
R: Ring M, N: LeftModule R
LeftModuleIsomorphism M N -> LeftModuleIsomorphism N M
R: Ring M, N: LeftModule R f: LeftModuleIsomorphism M N
LeftModuleIsomorphism N M
R: Ring M, N: LeftModule R f: LeftModuleIsomorphism M N
LeftModuleHomomorphism N M
R: Ring M, N: LeftModule R f: LeftModuleIsomorphism M N
IsEquiv ?lm_iso_map
R: Ring M, N: LeftModule R f: LeftModuleIsomorphism M N
LeftModuleHomomorphism N M
R: Ring M, N: LeftModule R f: LeftModuleIsomorphism M N
N -> M
R: Ring M, N: LeftModule R f: LeftModuleIsomorphism M N
forall (r : R) (xy : N),
?f (lact r x + y) = lact r (?f x) + ?f y
R: Ring M, N: LeftModule R f: LeftModuleIsomorphism M N
N -> M
exact f^-1.
R: Ring M, N: LeftModule R f: LeftModuleIsomorphism M N
forall (r : R) (xy : N),
f^-1 (lact r x + y) = lact r (f^-1 x) + f^-1 y
R: Ring M, N: LeftModule R f: LeftModuleIsomorphism M N r: R m, n: N
f^-1 (lact r m + n) = lact r (f^-1 m) + f^-1 n
R: Ring M, N: LeftModule R f: LeftModuleIsomorphism M N r: R m, n: N
lact r m + n = f (lact r (f^-1 m) + f^-1 n)
R: Ring M, N: LeftModule R f: LeftModuleIsomorphism M N r: R m, n: N
lact r m + n =
sg_op (f (lact r (f^-1 m))) (f (f^-1 n))
R: Ring M, N: LeftModule R f: LeftModuleIsomorphism M N r: R m, n: N
sg_op (f (lact r (f^-1 m))) (f (f^-1 n)) =
lact r m + n
R: Ring M, N: LeftModule R f: LeftModuleIsomorphism M N r: R m, n: N
f (lact r (f^-1 m)) = lact r m
R: Ring M, N: LeftModule R f: LeftModuleIsomorphism M N r: R m, n: N
f (f^-1 n) = n
R: Ring M, N: LeftModule R f: LeftModuleIsomorphism M N r: R m, n: N
f (lact r (f^-1 m)) = lact r m
R: Ring M, N: LeftModule R f: LeftModuleIsomorphism M N r: R m, n: N
lact r (f (f^-1 m)) = lact r m
R: Ring M, N: LeftModule R f: LeftModuleIsomorphism M N r: R m, n: N
f (f^-1 m) = m
apply eisretr.
R: Ring M, N: LeftModule R f: LeftModuleIsomorphism M N
IsEquiv
(Build_LeftModuleHomomorphism' f^-1
(fun (r : R) (mn : N) =>
moveR_equiv_V (lact r m + n)
(lact r (f^-1 m) + f^-1 n)
((ap11
(ap11 1
(lm_homo_lact M N f r (f^-1 m) @
ap (lact r) (eisretr f m)))
(eisretr f n))^ @
(grp_homo_op f (lact r (f^-1 m)) (f^-1 n))^)))
exact _.Defined.(** ** Category of left R-modules *)(** TODO: define as a displayed category over Ring *)Global Instanceisgraph_leftmodule {R : Ring} : IsGraph (LeftModule R)
:= Build_IsGraph _ LeftModuleHomomorphism.Global Instanceis01cat_leftmodule {R : Ring} : Is01Cat (LeftModule R)
:= Build_Is01Cat _ _ lm_homo_id (@lm_homo_compose R).Global Instanceis2graph_leftmodule {R : Ring} : Is2Graph (LeftModule R)
:= funMN => isgraph_induced (@lm_homo_map R M N).
R: Ring
Is1Cat (LeftModule R)
R: Ring
Is1Cat (LeftModule R)
R: Ring
forallab : LeftModule R, Is01Cat (a $-> b)
R: Ring
forallab : LeftModule R, Is0Gpd (a $-> b)
R: Ring
forall (abc : LeftModule R) (g : b $-> c),
Is0Functor (cat_postcomp a g)
R: Ring
forall (abc : LeftModule R) (f : a $-> b),
Is0Functor (cat_precomp c f)
R: Ring
forall (abcd : LeftModule R) (f : a $-> b)
(g : b $-> c) (h : c $-> d),
h $o g $o f $== h $o (g $o f)
R: Ring
forall (ab : LeftModule R) (f : a $-> b),
Id b $o f $== f
R: Ring
forall (ab : LeftModule R) (f : a $-> b),
f $o Id a $== f
R: Ring
forallab : LeftModule R, Is01Cat (a $-> b)
intros M N; rapply is01cat_induced.
R: Ring
forallab : LeftModule R, Is0Gpd (a $-> b)
intros M N; rapply is0gpd_induced.
R: Ring
forall (abc : LeftModule R) (g : b $-> c),
Is0Functor (cat_postcomp a g)
R: Ring M, N, L: LeftModule R h: N $-> L
Is0Functor (cat_postcomp M h)
R: Ring M, N, L: LeftModule R h: N $-> L
forallab : M $-> N,
(a $-> b) -> cat_postcomp M h a $-> cat_postcomp M h b
R: Ring M, N, L: LeftModule R h: N $-> L f, g: M $-> N p: f $-> g m: M
cat_postcomp M h f m = cat_postcomp M h g m
exact (ap h (p m)).
R: Ring
forall (abc : LeftModule R) (f : a $-> b),
Is0Functor (cat_precomp c f)
R: Ring M, N, L: LeftModule R f: M $-> N
Is0Functor (cat_precomp L f)
R: Ring M, N, L: LeftModule R f: M $-> N
forallab : N $-> L,
(a $-> b) -> cat_precomp L f a $-> cat_precomp L f b
R: Ring M, N, L: LeftModule R f: M $-> N g, h: N $-> L p: g $-> h m: M
cat_precomp L f g m = cat_precomp L f h m
exact (p (f m)).
R: Ring
forall (abcd : LeftModule R) (f : a $-> b)
(g : b $-> c) (h : c $-> d),
h $o g $o f $== h $o (g $o f)
simpl; reflexivity.
R: Ring
forall (ab : LeftModule R) (f : a $-> b),
Id b $o f $== f
simpl; reflexivity.
R: Ring
forall (ab : LeftModule R) (f : a $-> b),
f $o Id a $== f
simpl; reflexivity.Defined.
R: Ring
HasEquivs (LeftModule R)
R: Ring
HasEquivs (LeftModule R)
R: Ring
LeftModule R -> LeftModule R -> Type
R: Ring
forallab : LeftModule R, (a $-> b) -> Type
R: Ring
forallab : LeftModule R, ?CatEquiv' a b -> a $-> b
R: Ring
forall (ab : LeftModule R) (f : ?CatEquiv' a b),
?CatIsEquiv' a b (?cate_fun' a b f)
R: Ring
forall (ab : LeftModule R) (f : a $-> b),
?CatIsEquiv' a b f -> ?CatEquiv' a b
R: Ring
forall (ab : LeftModule R) (f : a $-> b)
(fe : ?CatIsEquiv' a b f),
?cate_fun' a b (?cate_buildequiv' a b f fe) $== f
R: Ring
forallab : LeftModule R, ?CatEquiv' a b -> b $-> a
R: Ring
forall (ab : LeftModule R) (f : ?CatEquiv' a b),
?cate_inv' a b f $o ?cate_fun' a b f $== Id a
R: Ring
forall (ab : LeftModule R) (f : ?CatEquiv' a b),
?cate_fun' a b f $o ?cate_inv' a b f $== Id b
R: Ring
forall (ab : LeftModule R) (f : a $-> b)
(g : b $-> a),
f $o g $== Id b ->
g $o f $== Id a -> ?CatIsEquiv' a b f
R: Ring
LeftModule R -> LeftModule R -> Type
exact LeftModuleIsomorphism.
R: Ring
forallab : LeftModule R, (a $-> b) -> Type
intros M N; exact IsEquiv.
R: Ring
forallab : LeftModule R,
LeftModuleIsomorphism a b -> a $-> b
intros M N f; exact f.
R: Ring
forall (ab : LeftModule R)
(f : LeftModuleIsomorphism a b),
(fun (MN : LeftModule R) (f0 : M $-> N) => IsEquiv f0)
a b
((fun (MN : LeftModule R)
(f0 : LeftModuleIsomorphism M N) =>
lm_iso_map M N f0) a b f)
simpl; exact _.
R: Ring
forall (ab : LeftModule R) (f : a $-> b),
(fun (MN : LeftModule R) (f0 : M $-> N) => IsEquiv f0)
a b f -> LeftModuleIsomorphism a b
apply Build_LeftModuleIsomorphism.
R: Ring
forall (ab : LeftModule R) (f : a $-> b)
(fe : (fun (MN : LeftModule R) (f0 : M $-> N) =>
IsEquiv f0) a b f),
(fun (MN : LeftModule R)
(f0 : LeftModuleIsomorphism M N) =>
lm_iso_map M N f0) a b
{| lm_iso_map := f; isequiv_lm_iso_map := fe |} $==
f
reflexivity.
R: Ring
forallab : LeftModule R,
LeftModuleIsomorphism a b -> b $-> a
intros M N; apply lm_iso_inverse.
R: Ring
forall (ab : LeftModule R)
(f : LeftModuleIsomorphism a b),
(funMN : LeftModule R =>
letX :=
funH : LeftModuleIsomorphism M N =>
lm_iso_map N M (lm_iso_inverse H) in
X) a b f $o
(fun (MN : LeftModule R)
(f0 : LeftModuleIsomorphism M N) =>
lm_iso_map M N f0) a b f $== Id a
intros M N f; apply eissect.
R: Ring
forall (ab : LeftModule R)
(f : LeftModuleIsomorphism a b),
(fun (MN : LeftModule R)
(f0 : LeftModuleIsomorphism M N) =>
lm_iso_map M N f0) a b f $o
(funMN : LeftModule R =>
letX :=
funH : LeftModuleIsomorphism M N =>
lm_iso_map N M (lm_iso_inverse H) in
X) a b f $== Id b
intros M N f; apply eisretr.
R: Ring
forall (ab : LeftModule R) (f : a $-> b)
(g : b $-> a),
f $o g $== Id b ->
g $o f $== Id a ->
(fun (MN : LeftModule R) (f0 : M $-> N) => IsEquiv f0)
a b f
R: Ring M, N: LeftModule R f: M $-> N g: N $-> M fg: f $o g $== Id N gf: g $o f $== Id M
(fun (MN : LeftModule R) (f : M $-> N) => IsEquiv f)
M N f
exact (isequiv_adjointify f g fg gf).Defined.(** ** Kernel of module homomorphism *)
R: Ring M, N: LeftModule R f: M $-> N
IsLeftSubmodule (grp_kernel f)
R: Ring M, N: LeftModule R f: M $-> N
IsLeftSubmodule (grp_kernel f)
R: Ring M, N: LeftModule R f: M $-> N
forall (r : R) (m : M),
grp_kernel f m -> grp_kernel f (lact r m)
R: Ring M, N: LeftModule R f: M $-> N r: R m: M n: grp_kernel f m
grp_kernel f (lact r m)
R: Ring M, N: LeftModule R f: M $-> N r: R m: M n: grp_kernel f m
lact r (f m) = group_unit
R: Ring M, N: LeftModule R f: M $-> N r: R m: M n: grp_kernel f m
lact r (f m) = lact r 0
R: Ring M, N: LeftModule R f: M $-> N r: R m: M n: grp_kernel f m
f m = 0
exact n.Defined.Definitionlm_kernel {R : Ring} {MN : LeftModule R} (f : M $-> N)
: LeftSubmodule M
:= Build_LeftSubmodule _ _ (grp_kernel f) _.(** ** Image of module homomorphism *)
R: Ring M, N: LeftModule R f: M $-> N
IsLeftSubmodule (grp_image f)
R: Ring M, N: LeftModule R f: M $-> N
IsLeftSubmodule (grp_image f)
R: Ring M, N: LeftModule R f: M $-> N
forall (r : R) (m : N),
grp_image f m -> grp_image f (lact r m)
R: Ring M, N: LeftModule R f: M $-> N r: R m: N n: M p: f n = m
{a : M & f a = lact r m}
R: Ring M, N: LeftModule R f: M $-> N r: R m: N n: M p: f n = m
f (lact r n) = lact r m
R: Ring M, N: LeftModule R f: M $-> N r: R m: N n: M p: f n = m
lact r (f n) = lact r m
R: Ring M, N: LeftModule R f: M $-> N r: R m: N n: M p: f n = m
f n = m
exact p.Defined.Definitionlm_image {R : Ring} {MN : LeftModule R} (f : M $-> N)
: LeftSubmodule N
:= Build_LeftSubmodule _ _ (grp_image f) _.(** ** Quotient Modules *)(** The quotient abelian group of a module and a submodule has a natural ring action. *)
R: Ring M: LeftModule R N: LeftSubmodule M
IsLeftModule R (QuotientAbGroup M N)
R: Ring M: LeftModule R N: LeftSubmodule M
IsLeftModule R (QuotientAbGroup M N)
R: Ring M: LeftModule R N: LeftSubmodule M
R -> QuotientAbGroup M N -> QuotientAbGroup M N
R: Ring M: LeftModule R N: LeftSubmodule M
LeftHeteroDistribute ?lact plus plus
R: Ring M: LeftModule R N: LeftSubmodule M
RightHeteroDistribute ?lact plus plus
R: Ring M: LeftModule R N: LeftSubmodule M
HeteroAssociative ?lact?lact?lact mult
R: Ring M: LeftModule R N: LeftSubmodule M
LeftIdentity ?lact1
R: Ring M: LeftModule R N: LeftSubmodule M
R -> QuotientAbGroup M N -> QuotientAbGroup M N
R: Ring M: LeftModule R N: LeftSubmodule M r: R
QuotientAbGroup M N -> QuotientAbGroup M N
R: Ring M: LeftModule R N: LeftSubmodule M r: R
GroupHomomorphism M (QuotientAbGroup M N)
R: Ring M: LeftModule R N: LeftSubmodule M r: R
foralln : M, N n -> ?f n = mon_unit
R: Ring M: LeftModule R N: LeftSubmodule M r: R
GroupHomomorphism M (QuotientAbGroup M N)
R: Ring M: LeftModule R N: LeftSubmodule M r: R
M $-> M
R: Ring M: LeftModule R N: LeftSubmodule M r: R
M -> M
R: Ring M: LeftModule R N: LeftSubmodule M r: R
IsSemiGroupPreserving ?f
R: Ring M: LeftModule R N: LeftSubmodule M r: R
M -> M
exact (lact r).
R: Ring M: LeftModule R N: LeftSubmodule M r: R
IsSemiGroupPreserving (lact r)
R: Ring M: LeftModule R N: LeftSubmodule M r: R x, y: M
lact r (sg_op x y) = sg_op (lact r x) (lact r y)
apply lm_dist_l.
R: Ring M: LeftModule R N: LeftSubmodule M r: R
foralln : M,
N n ->
(grp_quotient_map $o Build_GroupHomomorphism (lact r))
n = mon_unit
R: Ring M: LeftModule R N: LeftSubmodule M r: R n: M Nn: N n
class_of (funxy : M => N (sg_op (- x) y)) (lact r n) =
mon_unit
R: Ring M: LeftModule R N: LeftSubmodule M r: R n: M Nn: N n
N (sg_op (- lact r n) mon_unit)
R: Ring M: LeftModule R N: LeftSubmodule M r: R n: M Nn: N n
N (lact r n)
R: Ring M: LeftModule R N: LeftSubmodule M r: R n: M Nn: N n
N mon_unit
R: Ring M: LeftModule R N: LeftSubmodule M r: R n: M Nn: N n
N (lact r n)
byapply is_left_submodule.
R: Ring M: LeftModule R N: LeftSubmodule M
LeftHeteroDistribute
(funr : R =>
quotient_abgroup_rec N (QuotientAbGroup M N)
(grp_quotient_map $o
Build_GroupHomomorphism (lact r))
(fun (n : M) (Nn : N n) =>
qglue
(issubgroup_in_inv_op (lact r n) mon_unit
(is_left_submodule r n Nn)
issubgroup_in_unit)
:
(grp_quotient_map $o
Build_GroupHomomorphism (lact r)) n = mon_unit))
plus plus
R: Ring M: LeftModule R N: LeftSubmodule M r: R n: QuotientAbGroup M N
forallm : QuotientAbGroup M N,
quotient_abgroup_rec N (QuotientAbGroup M N)
(grp_quotient_map $o
Build_GroupHomomorphism (lact r))
(fun (n : M) (Nn : N n) =>
qglue
(issubgroup_in_inv_op (lact r n) mon_unit
(is_left_submodule r n Nn) issubgroup_in_unit))
(m + n) =
quotient_abgroup_rec N (QuotientAbGroup M N)
(grp_quotient_map $o
Build_GroupHomomorphism (lact r))
(fun (n : M) (Nn : N n) =>
qglue
(issubgroup_in_inv_op (lact r n) mon_unit
(is_left_submodule r n Nn) issubgroup_in_unit))
m +
quotient_abgroup_rec N (QuotientAbGroup M N)
(grp_quotient_map $o
Build_GroupHomomorphism (lact r))
(fun (n : M) (Nn : N n) =>
qglue
(issubgroup_in_inv_op (lact r n) mon_unit
(is_left_submodule r n Nn) issubgroup_in_unit))
n
R: Ring M: LeftModule R N: LeftSubmodule M r: R m: M
foralln : QuotientAbGroup M N,
(funq : M /
in_cosetL
{|
normalsubgroup_subgroup := N;
normalsubgroup_isnormal :=
isnormal_ab_subgroup M N
|} =>
quotient_abgroup_rec N (QuotientAbGroup M N)
(grp_quotient_map $o
Build_GroupHomomorphism (lact r))
(fun (n0 : M) (Nn : N n0) =>
qglue
(issubgroup_in_inv_op (lact r n0) mon_unit
(is_left_submodule r n0 Nn)
issubgroup_in_unit)) (q + n) =
quotient_abgroup_rec N (QuotientAbGroup M N)
(grp_quotient_map $o
Build_GroupHomomorphism (lact r))
(fun (n0 : M) (Nn : N n0) =>
qglue
(issubgroup_in_inv_op (lact r n0) mon_unit
(is_left_submodule r n0 Nn)
issubgroup_in_unit)) q +
quotient_abgroup_rec N (QuotientAbGroup M N)
(grp_quotient_map $o
Build_GroupHomomorphism (lact r))
(fun (n0 : M) (Nn : N n0) =>
qglue
(issubgroup_in_inv_op (lact r n0) mon_unit
(is_left_submodule r n0 Nn)
issubgroup_in_unit)) n)
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := N;
normalsubgroup_isnormal :=
isnormal_ab_subgroup M N
|}) m)
R: Ring M: LeftModule R N: LeftSubmodule M r: R m, n: M
class_of (funxy : M => N (sg_op (- x) y))
(lact r (sg_op m n)) =
class_of (funxy : M => N (sg_op (- x) y)) (lact r m) +
class_of (funxy : M => N (sg_op (- x) y)) (lact r n)
R: Ring M: LeftModule R N: LeftSubmodule M r: R m, n: M
lact r (sg_op m n) = sg_op (lact r m) (lact r n)
apply lm_dist_l.
R: Ring M: LeftModule R N: LeftSubmodule M
RightHeteroDistribute
(funr : R =>
quotient_abgroup_rec N (QuotientAbGroup M N)
(grp_quotient_map $o
Build_GroupHomomorphism (lact r))
(fun (n : M) (Nn : N n) =>
qglue
(issubgroup_in_inv_op (lact r n) mon_unit
(is_left_submodule r n Nn)
issubgroup_in_unit)
:
(grp_quotient_map $o
Build_GroupHomomorphism (lact r)) n = mon_unit))
plus plus
R: Ring M: LeftModule R N: LeftSubmodule M r, s: R
forallc : QuotientAbGroup M N,
quotient_abgroup_rec N (QuotientAbGroup M N)
(grp_quotient_map $o
Build_GroupHomomorphism (lact (r + s)))
(fun (n : M) (Nn : N n) =>
qglue
(issubgroup_in_inv_op (lact (r + s) n) mon_unit
(is_left_submodule (r + s) n Nn)
issubgroup_in_unit)) c =
quotient_abgroup_rec N (QuotientAbGroup M N)
(grp_quotient_map $o
Build_GroupHomomorphism (lact r))
(fun (n : M) (Nn : N n) =>
qglue
(issubgroup_in_inv_op (lact r n) mon_unit
(is_left_submodule r n Nn) issubgroup_in_unit))
c +
quotient_abgroup_rec N (QuotientAbGroup M N)
(grp_quotient_map $o
Build_GroupHomomorphism (lact s))
(fun (n : M) (Nn : N n) =>
qglue
(issubgroup_in_inv_op (lact s n) mon_unit
(is_left_submodule s n Nn) issubgroup_in_unit))
c
R: Ring M: LeftModule R N: LeftSubmodule M r, s: R m: M
class_of (funxy : M => N (sg_op (- x) y))
(lact (r + s) m) =
class_of (funxy : M => N (sg_op (- x) y)) (lact r m) +
class_of (funxy : M => N (sg_op (- x) y)) (lact s m)
R: Ring M: LeftModule R N: LeftSubmodule M r, s: R m: M
lact (r + s) m = sg_op (lact r m) (lact s m)
apply lm_dist_r.
R: Ring M: LeftModule R N: LeftSubmodule M
HeteroAssociative
(funr : R =>
quotient_abgroup_rec N (QuotientAbGroup M N)
(grp_quotient_map $o
Build_GroupHomomorphism (lact r))
(fun (n : M) (Nn : N n) =>
qglue
(issubgroup_in_inv_op (lact r n) mon_unit
(is_left_submodule r n Nn)
issubgroup_in_unit)
:
(grp_quotient_map $o
Build_GroupHomomorphism (lact r)) n = mon_unit))
(funr : R =>
quotient_abgroup_rec N (QuotientAbGroup M N)
(grp_quotient_map $o
Build_GroupHomomorphism (lact r))
(fun (n : M) (Nn : N n) =>
qglue
(issubgroup_in_inv_op (lact r n) mon_unit
(is_left_submodule r n Nn)
issubgroup_in_unit)
:
(grp_quotient_map $o
Build_GroupHomomorphism (lact r)) n = mon_unit))
(funr : R =>
quotient_abgroup_rec N (QuotientAbGroup M N)
(grp_quotient_map $o
Build_GroupHomomorphism (lact r))
(fun (n : M) (Nn : N n) =>
qglue
(issubgroup_in_inv_op (lact r n) mon_unit
(is_left_submodule r n Nn)
issubgroup_in_unit)
:
(grp_quotient_map $o
Build_GroupHomomorphism (lact r)) n = mon_unit))
mult
R: Ring M: LeftModule R N: LeftSubmodule M r, s: R
forallz : QuotientAbGroup M N,
quotient_abgroup_rec N (QuotientAbGroup M N)
(grp_quotient_map $o
Build_GroupHomomorphism (lact r))
(fun (n : M) (Nn : N n) =>
qglue
(issubgroup_in_inv_op (lact r n) mon_unit
(is_left_submodule r n Nn) issubgroup_in_unit))
(quotient_abgroup_rec N (QuotientAbGroup M N)
(grp_quotient_map $o
Build_GroupHomomorphism (lact s))
(fun (n : M) (Nn : N n) =>
qglue
(issubgroup_in_inv_op (lact s n) mon_unit
(is_left_submodule s n Nn)
issubgroup_in_unit)) z) =
quotient_abgroup_rec N (QuotientAbGroup M N)
(grp_quotient_map $o
Build_GroupHomomorphism (lact (r * s)))
(fun (n : M) (Nn : N n) =>
qglue
(issubgroup_in_inv_op (lact (r * s) n) mon_unit
(is_left_submodule (r * s) n Nn)
issubgroup_in_unit)) z
R: Ring M: LeftModule R N: LeftSubmodule M r, s: R m: M
class_of (funxy : M => N (sg_op (- x) y))
(lact r (lact s m)) =
class_of (funxy : M => N (sg_op (- x) y))
(lact (r * s) m)
R: Ring M: LeftModule R N: LeftSubmodule M r, s: R m: M
lact r (lact s m) = lact (r * s) m
apply lm_assoc.
R: Ring M: LeftModule R N: LeftSubmodule M
LeftIdentity
(funr : R =>
quotient_abgroup_rec N (QuotientAbGroup M N)
(grp_quotient_map $o
Build_GroupHomomorphism (lact r))
(fun (n : M) (Nn : N n) =>
qglue
(issubgroup_in_inv_op (lact r n) mon_unit
(is_left_submodule r n Nn)
issubgroup_in_unit)
:
(grp_quotient_map $o
Build_GroupHomomorphism (lact r)) n = mon_unit))
1
R: Ring M: LeftModule R N: LeftSubmodule M m: M
class_of (funxy : M => N (sg_op (- x) y)) (lact 1 m) =
class_of (funxy : M => N (sg_op (- x) y)) m
R: Ring M: LeftModule R N: LeftSubmodule M m: M
lact 1 m = m
apply lm_unit.Defined.(** We can therefore form the quotient module of a module by its submodule. *)DefinitionQuotientLeftModule {R : Ring} (M : LeftModule R) (N : LeftSubmodule M)
: LeftModule R
:= Build_LeftModule R (QuotientAbGroup M N) _.Infix"/" := QuotientLeftModule : module_scope.(** ** First Isomorphism Theorem *)LocalOpen Scope module_scope.LocalOpen Scope wc_iso_scope.
H: Funext R: Ring M, N: LeftModule R f: M $-> N
M / lm_kernel f ≅ lm_image f
H: Funext R: Ring M, N: LeftModule R f: M $-> N
M / lm_kernel f ≅ lm_image f
H: Funext R: Ring M, N: LeftModule R f: M $-> N
GroupIsomorphism (M / lm_kernel f) (lm_image f)
H: Funext R: Ring M, N: LeftModule R f: M $-> N
forall (r : R) (x : M / lm_kernel f),
?f (lact r x) = lact r (?f x)
H: Funext R: Ring M, N: LeftModule R f: M $-> N
forall (r : R) (x : M / lm_kernel f),
abgroup_first_iso f (lact r x) =
lact r (abgroup_first_iso f x)
H: Funext R: Ring M, N: LeftModule R f: M $-> N r: R
forallx : M / lm_kernel f,
abgroup_first_iso f (lact r x) =
lact r (abgroup_first_iso f x)
H: Funext R: Ring M, N: LeftModule R f: M $-> N r: R m: M
(funq : Quotient
(in_cosetL
{|
normalsubgroup_subgroup := lm_kernel f;
normalsubgroup_isnormal :=
isnormal_ab_subgroup M (lm_kernel f)
|}) =>
abgroup_first_iso f (lact r q) =
lact r (abgroup_first_iso f q))
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := lm_kernel f;
normalsubgroup_isnormal :=
isnormal_ab_subgroup M (lm_kernel f)
|}) m)
H: Funext R: Ring M, N: LeftModule R f: M $-> N r: R m: M
f (lact r m) = lact r (f m)
apply lm_homo_lact.Defined.(** ** Direct products *)(** TODO: generalise to biproducts *)(** The direct product of modules *)
R: Ring
LeftModule R -> LeftModule R -> LeftModule R
R: Ring
LeftModule R -> LeftModule R -> LeftModule R
R: Ring M, N: LeftModule R
LeftModule R
R: Ring M, N: LeftModule R
IsLeftModule R (ab_biprod M N)
R: Ring M, N: LeftModule R
R -> ab_biprod M N -> ab_biprod M N
R: Ring M, N: LeftModule R
LeftHeteroDistribute ?lact plus plus
R: Ring M, N: LeftModule R
RightHeteroDistribute ?lact plus plus
R: Ring M, N: LeftModule R
HeteroAssociative ?lact?lact?lact mult
R: Ring M, N: LeftModule R
LeftIdentity ?lact1
R: Ring M, N: LeftModule R
R -> ab_biprod M N -> ab_biprod M N
R: Ring M, N: LeftModule R r: R
ab_biprod M N -> ab_biprod M N
apply functor_prod; exact (lact r).
R: Ring M, N: LeftModule R
LeftHeteroDistribute
(funr : R => functor_prod (lact r) (lact r)) plus
plus
R: Ring M, N: LeftModule R r: R m, n: ab_biprod M N