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]
Require Import Algebra.Congruence.Require Import Algebra.AbGroups.Require Import Classes.interfaces.abstract_algebra.Require Import Algebra.Rings.Ring.Require Import Algebra.Rings.Ideal.(** * Quotient Rings *)(** In this file we define the quotient of a ring by an ideal. *)Import Ideal.Notation.LocalOpen Scope ring_scope.LocalOpen Scope wc_iso_scope.SectionQuotientRing.Context (R : Ring) (I : Ideal R).Instanceplus_quotient_group : Plus (QuotientAbGroup R I) := group_sgop.
R: Ring I: Ideal R
IsCongruence (in_cosetL I)
R: Ring I: Ideal R
IsCongruence (in_cosetL I)
R: Ring I: Ideal R
forallxx'yy' : R,
in_cosetL I x x' ->
in_cosetL I y y' ->
in_cosetL I (sg_op x y) (sg_op x' y')
R: Ring I: Ideal R x, x', y, y': R p: in_cosetL I x x' q: in_cosetL I y y'
in_cosetL I (sg_op x y) (sg_op x' y')
R: Ring I: Ideal R x, x', y, y': R p: in_cosetL I x x' q: in_cosetL I y y'
I (- (x * y) + x' * y')
R: Ring I: Ideal R x, x', y, y': R p: in_cosetL I x x' q: in_cosetL I y y'
I (- (x * y) + (0 + x' * y'))
R: Ring I: Ideal R x, x', y, y': R p: in_cosetL I x x' q: in_cosetL I y y'
I (- (x * y) + (x' * y - x' * y + x' * y'))
R: Ring I: Ideal R x, x', y, y': R p: in_cosetL I x x' q: in_cosetL I y y'
I (- (x * y) + x' * y - x' * y + x' * y')
R: Ring I: Ideal R x, x', y, y': R p: in_cosetL I x x' q: in_cosetL I y y'
I (- x * y + x' * y - x' * y + x' * y')
R: Ring I: Ideal R x, x', y, y': R p: in_cosetL I x x' q: in_cosetL I y y'
I ((- x + x') * y - x' * y + x' * y')
R: Ring I: Ideal R x, x', y, y': R p: in_cosetL I x x' q: in_cosetL I y y'
I ((- x + x') * y + (- (x' * y) + x' * y'))
R: Ring I: Ideal R x, x', y, y': R p: in_cosetL I x x' q: in_cosetL I y y'
I ((- x + x') * y + (x' * - y + x' * y'))
R: Ring I: Ideal R x, x', y, y': R p: in_cosetL I x x' q: in_cosetL I y y'
I ((- x + x') * y + x' * (- y + y'))
R: Ring I: Ideal R x, x', y, y': R p: in_cosetL I x x' q: in_cosetL I y y'
I ((- x + x') * y)
R: Ring I: Ideal R x, x', y, y': R p: in_cosetL I x x' q: in_cosetL I y y'
I (x' * (- y + y'))
R: Ring I: Ideal R x, x', y, y': R p: in_cosetL I x x' q: in_cosetL I y y'
I ((- x + x') * y)
by rapply isrightideal.
R: Ring I: Ideal R x, x', y, y': R p: in_cosetL I x x' q: in_cosetL I y y'
I (x' * (- y + y'))
by rapply isleftideal.Defined.
R: Ring I: Ideal R
Mult (QuotientAbGroup R I)
R: Ring I: Ideal R
Mult (QuotientAbGroup R I)
R: Ring I: Ideal R
R -> R -> QuotientAbGroup R I
R: Ring I: Ideal R
forallaa'b : R,
in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} a a' -> ?dclass a b = ?dclass a' b
R: Ring I: Ideal R
forallabb' : R,
in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} b b' -> ?dclass a b = ?dclass a b'
R: Ring I: Ideal R
R -> R -> QuotientAbGroup R I
exact (funxy => class_of _ (x * y)).
R: Ring I: Ideal R
forallaa'b : R,
in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} a a' ->
(funxy : R =>
class_of
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) (x * y)) a b =
(funxy : R =>
class_of
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) (x * y)) a' b
R: Ring I: Ideal R x, x', y: R p: in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} x x'
(funxy : R =>
class_of
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) (x * y)) x y =
(funxy : R =>
class_of
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) (x * y)) x' y
R: Ring I: Ideal R x, x', y: R p: in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} x x'
in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} (x * y) (x' * y)
byapply iscong.
R: Ring I: Ideal R
forallabb' : R,
in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} b b' ->
(funxy : R =>
class_of
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) (x * y)) a b =
(funxy : R =>
class_of
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) (x * y)) a b'
R: Ring I: Ideal R x, y, y': R q: in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} y y'
(funxy : R =>
class_of
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) (x * y)) x y =
(funxy : R =>
class_of
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) (x * y)) x y'
R: Ring I: Ideal R x, y, y': R q: in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} y y'
in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} (x * y) (x * y')
byapply iscong.Defined.Instanceone_quotient_abgroup : One (QuotientAbGroup R I) := class_of _ one.
R: Ring I: Ideal R
IsRing (QuotientAbGroup R I)
R: Ring I: Ideal R
IsRing (QuotientAbGroup R I)
R: Ring I: Ideal R
IsAbGroup (QuotientAbGroup R I)
R: Ring I: Ideal R
IsMonoid (QuotientAbGroup R I)
R: Ring I: Ideal R
LeftDistribute mult plus
R: Ring I: Ideal R
RightDistribute mult plus
R: Ring I: Ideal R
IsMonoid (QuotientAbGroup R I)
R: Ring I: Ideal R
LeftDistribute mult plus
R: Ring I: Ideal R
RightDistribute mult plus
R: Ring I: Ideal R
IsHSet (QuotientAbGroup R I)
R: Ring I: Ideal R
Associative sg_op
R: Ring I: Ideal R
LeftIdentity sg_op mon_unit
R: Ring I: Ideal R
RightIdentity sg_op mon_unit
R: Ring I: Ideal R
LeftDistribute mult plus
R: Ring I: Ideal R
RightDistribute mult plus
R: Ring I: Ideal R
Associative sg_op
R: Ring I: Ideal R
LeftIdentity sg_op mon_unit
R: Ring I: Ideal R
RightIdentity sg_op mon_unit
R: Ring I: Ideal R
LeftDistribute mult plus
R: Ring I: Ideal R
RightDistribute mult plus
(** Associativity follows from the underlying operation *)
R: Ring I: Ideal R
Associative sg_op
R: Ring I: Ideal R x, y, z: R
(funxyz : Quotient
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) =>
sg_op x (sg_op y z) = sg_op (sg_op x y) z)
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) x)
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) y)
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) z)
R: Ring I: Ideal R x, y, z: R
class_of (funxy : R => I (sg_op (inv x) y))
(x * (y * z)) =
class_of (funxy : R => I (sg_op (inv x) y))
(x * y * z)
R: Ring I: Ideal R x, y, z: R
x * (y * z) = x * y * z
apply associativity.
R: Ring I: Ideal R
LeftIdentity sg_op mon_unit
R: Ring I: Ideal R
RightIdentity sg_op mon_unit
R: Ring I: Ideal R
LeftDistribute mult plus
R: Ring I: Ideal R
RightDistribute mult plus
(* Left and right identity follow from the underlying structure *)
R: Ring I: Ideal R x: R
(funx : Quotient
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) => sg_op mon_unit x = x)
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) x)
R: Ring I: Ideal R x: R
(funx : Quotient
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) => sg_op x mon_unit = x)
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) x)
R: Ring I: Ideal R
LeftDistribute mult plus
R: Ring I: Ideal R
RightDistribute mult plus
R: Ring I: Ideal R x: R
class_of (funxy : R => I (sg_op (inv x) y)) (1 * x) =
class_of (funxy : R => I (sg_op (inv x) y)) x
R: Ring I: Ideal R x: R
class_of (funxy : R => I (sg_op (inv x) y)) (x * 1) =
class_of (funxy : R => I (sg_op (inv x) y)) x
R: Ring I: Ideal R
LeftDistribute mult plus
R: Ring I: Ideal R
RightDistribute mult plus
R: Ring I: Ideal R x: R
1 * x = x
R: Ring I: Ideal R x: R
x * 1 = x
R: Ring I: Ideal R
LeftDistribute mult plus
R: Ring I: Ideal R
RightDistribute mult plus
R: Ring I: Ideal R x: R
x * 1 = x
R: Ring I: Ideal R
LeftDistribute mult plus
R: Ring I: Ideal R
RightDistribute mult plus
R: Ring I: Ideal R
LeftDistribute mult plus
R: Ring I: Ideal R
RightDistribute mult plus
(** Finally distributivity also follows *)
R: Ring I: Ideal R
LeftDistribute mult plus
R: Ring I: Ideal R x, y, z: R
(funxyz : Quotient
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) => x * (y + z) = x * y + x * z)
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) x)
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) y)
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) z)
R: Ring I: Ideal R x, y, z: R
class_of (funxy : R => I (sg_op (inv x) y))
(ring_mult x (sg_op y z)) =
class_of (funxy : R => I (sg_op (inv x) y))
(sg_op (ring_mult x y) (ring_mult x z))
R: Ring I: Ideal R x, y, z: R
ring_mult x (sg_op y z) =
sg_op (ring_mult x y) (ring_mult x z)
apply simple_distribute_l.
R: Ring I: Ideal R
RightDistribute mult plus
R: Ring I: Ideal R
RightDistribute mult plus
R: Ring I: Ideal R x, y, z: R
(funxyz : Quotient
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) => (x + y) * z = x * z + y * z)
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) x)
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) y)
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|}) z)
R: Ring I: Ideal R x, y, z: R
class_of (funxy : R => I (sg_op (inv x) y))
(ring_mult (sg_op x y) z) =
class_of (funxy : R => I (sg_op (inv x) y))
(sg_op (ring_mult x z) (ring_mult y z))
R: Ring I: Ideal R x, y, z: R
ring_mult (sg_op x y) z =
sg_op (ring_mult x z) (ring_mult y z)
exact _.Defined.(** *** Specialized induction principles *)(** We provide some specialized induction principles for [QuotientRing] that require cleaner hypotheses than the ones given by [Quotient_ind]. *)DefinitionQuotientRing_ind {R : Ring} {I : Ideal R} (P : R / I -> Type)
`{forallx, IsHSet (P x)}
(c : forall (x : R), P (rng_quotient_map I x))
(g : forall (xy : R) (h : I (- x + y)), qglue h # c x = c y)
: forall (r : R / I), P r
:= Quotient_ind _ P c g.(** And a version eliminating into hprops. This one is especially useful. *)DefinitionQuotientRing_ind_hprop {R : Ring} {I : Ideal R} (P : R / I -> Type)
`{forallx, IsHProp (P x)} (c : forall (x : R), P (rng_quotient_map I x))
: forall (r : R / I), P r
:= Quotient_ind_hprop _ P c.DefinitionQuotientRing_ind2_hprop {R : Ring} {I : Ideal R} (P : R / I -> R / I -> Type)
`{forallxy, IsHProp (P x y)}
(c : forall (xy : R), P (rng_quotient_map I x) (rng_quotient_map I y))
: forall (rs : R / I), P r s
:= Quotient_ind2_hprop _ P c.
R: Ring I: Ideal R S: Ring f: R $-> S H: forallx : R, I x -> f x = 0
R / I $-> S
R: Ring I: Ideal R S: Ring f: R $-> S H: forallx : R, I x -> f x = 0
R / I $-> S
R: Ring I: Ideal R S: Ring f: R $-> S H: forallx : R, I x -> f x = 0
GroupHomomorphism (R / I) S
R: Ring I: Ideal R S: Ring f: R $-> S H: forallx : R, I x -> f x = 0
IsMonoidPreserving ?map
R: Ring I: Ideal R S: Ring f: R $-> S H: forallx : R, I x -> f x = 0
GroupHomomorphism (R / I) S
R: Ring I: Ideal R S: Ring f: R $-> S H: forallx : R, I x -> f x = 0
foralln : R,
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal := isnormal_ab_subgroup R I
|} n -> f n = mon_unit
exact H.
R: Ring I: Ideal R S: Ring f: R $-> S H: forallx : R, I x -> f x = 0
IsMonoidPreserving
(grp_quotient_rec R
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} f H)
R: Ring I: Ideal R S: Ring f: R $-> S H: forallx : R, I x -> f x = 0
IsSemiGroupPreserving
(grp_quotient_rec R
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} f H)
R: Ring I: Ideal R S: Ring f: R $-> S H: forallx : R, I x -> f x = 0
IsUnitPreserving
(grp_quotient_rec R
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} f H)
R: Ring I: Ideal R S: Ring f: R $-> S H: forallx : R, I x -> f x = 0
IsSemiGroupPreserving
(grp_quotient_rec R
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} f H)
R: Ring I: Ideal R S: Ring f: R $-> S H: forallx : R, I x -> f x = 0
forallxy : R,
(funrs : R / I =>
grp_quotient_rec R
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} f H (sg_op r s) =
sg_op
(grp_quotient_rec R
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} f H r)
(grp_quotient_rec R
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} f H s)) (rng_quotient_map I x)
(rng_quotient_map I y)
napply rng_homo_mult.
R: Ring I: Ideal R S: Ring f: R $-> S H: forallx : R, I x -> f x = 0
IsUnitPreserving
(grp_quotient_rec R
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} f H)
napply rng_homo_one.Defined.(** ** Quotient theory *)(** First isomorphism theorem for commutative rings *)
H: Funext A, B: Ring f: A $-> B
A / ideal_kernel f ≅ rng_image f
H: Funext A, B: Ring f: A $-> B
A / ideal_kernel f ≅ rng_image f
H: Funext A, B: Ring f: A $-> B
GroupIsomorphism (A / ideal_kernel f) (rng_image f)
H: Funext A, B: Ring f: A $-> B
IsMonoidPreserving ?e
H: Funext A, B: Ring f: A $-> B
IsMonoidPreserving (abgroup_first_iso f)
H: Funext A, B: Ring f: A $-> B
IsSemiGroupPreserving (abgroup_first_iso f)
H: Funext A, B: Ring f: A $-> B
IsUnitPreserving (abgroup_first_iso f)
H: Funext A, B: Ring f: A $-> B
IsSemiGroupPreserving (abgroup_first_iso f)
H: Funext A, B: Ring f: A $-> B x, y: A
(funrs : A / ideal_kernel f =>
abgroup_first_iso f (sg_op r s) =
sg_op (abgroup_first_iso f r) (abgroup_first_iso f s))
(rng_quotient_map (ideal_kernel f) x)
(rng_quotient_map (ideal_kernel f) y)
H: Funext A, B: Ring f: A $-> B x, y: A
(abgroup_first_iso f
(sg_op (rng_quotient_map (ideal_kernel f) x)
(rng_quotient_map (ideal_kernel f) y))).1 =
(sg_op
(abgroup_first_iso f
(rng_quotient_map (ideal_kernel f) x))
(abgroup_first_iso f
(rng_quotient_map (ideal_kernel f) y))).1
exact (rng_homo_mult _ _ _).
H: Funext A, B: Ring f: A $-> B
IsUnitPreserving (abgroup_first_iso f)
H: Funext A, B: Ring f: A $-> B
(abgroup_first_iso f mon_unit).1 = mon_unit.1
exact (rng_homo_one _).Defined.(** Invariance of equal ideals *)
R: Ring I, J: Ideal R p: (I ↔ J)%ideal
R / I ≅ R / J
R: Ring I, J: Ideal R p: (I ↔ J)%ideal
R / I ≅ R / J
R: Ring I, J: Ideal R p: (I ↔ J)%ideal
R / I <~> R / J
R: Ring I, J: Ideal R p: (I ↔ J)%ideal
IsSemiRingPreserving ?e
R: Ring I, J: Ideal R p: (I ↔ J)%ideal
R / I <~> R / J
R: Ring I, J: Ideal R p: (I ↔ J)%ideal
R <~> R
R: Ring I, J: Ideal R p: (I ↔ J)%ideal
forallab : R,
in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} a b <->
in_cosetL
{|
normalsubgroup_subgroup := J;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R J
|} (?f a) (?f b)
R: Ring I, J: Ideal R p: (I ↔ J)%ideal
forallab : R,
in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} a b <->
in_cosetL
{|
normalsubgroup_subgroup := J;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R J
|} (1%equiv a) (1%equiv b)
R: Ring I, J: Ideal R p: (I ↔ J)%ideal x, y: R
I (sg_op (inv x) y) <-> J (sg_op (inv x) y)
apply p.
R: Ring I, J: Ideal R p: (I ↔ J)%ideal
IsSemiRingPreserving
(equiv_quotient_functor'
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|})
(in_cosetL
{|
normalsubgroup_subgroup := J;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R J
|}) 1
(funxy : R =>
p (sg_op (inv x) y)
:
in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|} x y <->
in_cosetL
{|
normalsubgroup_subgroup := J;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R J
|} (1%equiv x) (1%equiv y)))
R: Ring I, J: Ideal R p: (I ↔ J)%ideal
IsSemiGroupPreserving
(equiv_quotient_functor'
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|})
(in_cosetL
{|
normalsubgroup_subgroup := J;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R J
|}) 1 (funxy : R => p (sg_op (inv x) y)))
R: Ring I, J: Ideal R p: (I ↔ J)%ideal
IsSemiGroupPreserving
(equiv_quotient_functor'
(in_cosetL
{|
normalsubgroup_subgroup := I;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R I
|})
(in_cosetL
{|
normalsubgroup_subgroup := J;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R J
|}) 1 (funxy : R => p (sg_op (inv x) y)))
R: Ring I, J: Ideal R p: (I ↔ J)%ideal x, y: R
in_cosetL
{|
normalsubgroup_subgroup := J;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R J
|} (1%equiv (sg_op x y))
(sg_op (1%equiv x) (1%equiv y))
R: Ring I, J: Ideal R p: (I ↔ J)%ideal x, y: R
in_cosetL
{|
normalsubgroup_subgroup := J;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R J
|} (1%equiv (x * y)) (1%equiv x * 1%equiv y)
R: Ring I, J: Ideal R p: (I ↔ J)%ideal x, y: R
J (- (x + y) + (x + y))
R: Ring I, J: Ideal R p: (I ↔ J)%ideal x, y: R
in_cosetL
{|
normalsubgroup_subgroup := J;
normalsubgroup_isnormal :=
isnormal_ab_subgroup R J
|} (1%equiv (x * y)) (1%equiv x * 1%equiv y)
R: Ring I, J: Ideal R p: (I ↔ J)%ideal x, y: R
J (- (x + y) + (x + y))
R: Ring I, J: Ideal R p: (I ↔ J)%ideal x, y: R
J (- (x * y) + x * y)
R: Ring I, J: Ideal R p: (I ↔ J)%ideal x, y: R
J 0
R: Ring I, J: Ideal R p: (I ↔ J)%ideal x, y: R
J 0
1,2: apply ideal_in_zero.Defined.(** We phrase the first ring isomorphism theorem in a slightly different way so that it is easier to use. This form specifically asks for a surjective map *)
H: Funext A, B: Ring f: A $-> B issurj_f: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f I: Ideal A p: (I ↔ ideal_kernel f)%ideal
A / I ≅ B
H: Funext A, B: Ring f: A $-> B issurj_f: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f I: Ideal A p: (I ↔ ideal_kernel f)%ideal
A / I ≅ B
H: Funext A, B: Ring f: A $-> B issurj_f: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f I: Ideal A p: (I ↔ ideal_kernel f)%ideal
A / I ≅ ?Goal
H: Funext A, B: Ring f: A $-> B issurj_f: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f I: Ideal A p: (I ↔ ideal_kernel f)%ideal
?Goal ≅ B
H: Funext A, B: Ring f: A $-> B issurj_f: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f I: Ideal A p: (I ↔ ideal_kernel f)%ideal
A / ideal_kernel f ≅ B
H: Funext A, B: Ring f: A $-> B issurj_f: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f I: Ideal A p: (I ↔ ideal_kernel f)%ideal
A / ideal_kernel f ≅ ?Goal
H: Funext A, B: Ring f: A $-> B issurj_f: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f I: Ideal A p: (I ↔ ideal_kernel f)%ideal
?Goal ≅ B
H: Funext A, B: Ring f: A $-> B issurj_f: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f I: Ideal A p: (I ↔ ideal_kernel f)%ideal