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 Spaces.Finite.Fin.Require Import Classes.interfaces.canonical_names.Require Import Algebra.Rings.Ring.Require Import Algebra.Groups.Subgroup.Require Import Algebra.AbGroups.AbelianGroup.Require Import WildCat.Core.Declare Scope ideal_scope.Delimit Scope ideal_scope with ideal.LocalOpen Scope ideal_scope.(** * Left, Right and Two-sided Ideals *)(** ** Definition of Ideals *)(** An additive subgroup [I] of a ring [R] is a left ideal when it is closed under multiplication on the left. *)ClassIsLeftIdeal {R : Ring} (I : Subgroup R) :=
isleftideal (r x : R) : I x -> I (r * x).(** An additive subgroup [I] of a ring [R] is a right ideal when it is closed under multiplication on the right. We define this using the opposite ring allowing us to reduce redundancy between left and right ideals. *)ClassIsRightIdeal {R : Ring} (I : Subgroup R) :=
isrightideal_isleftideal_op :: IsLeftIdeal (R := rng_op R) I.Definitionisrightideal {R : Ring} (I : Subgroup R) (xr : R)
: IsRightIdeal I -> I x -> I (x * r)
:= fun_ => isleftideal (R := rng_op R) r x.(** An additive subgroup [I] of a ring [R] is a two-sided ideal when it is both a left and right ideal. In this case we just call it an ideal. *)ClassIsIdeal {R : Ring} (I : Subgroup R) := {
ideal_isleftideal :: IsLeftIdeal I;
ideal_isrightideal :: IsRightIdeal I;
}.Definitionissig_IsIdeal {R : Ring} (I : Subgroup R) : _ <~> IsIdeal I := ltac:(issig).Hint Immediate Build_IsIdeal : typeclass_instances.(** Any two-sided ideal is also a two-sided ideal of the opposite ring. *)
R: Ring I: Subgroup R
IsIdeal I -> IsIdeal I
R: Ring I: Subgroup R
IsIdeal I -> IsIdeal I
intros [? ?]; exact _.Defined.(** A left ideal of a ring [R] is a subgroup [I] of [R] which is closed under left multiplication. *)RecordLeftIdeal (R : Ring) := {
leftideal_subgroup :> Subgroup R;
leftideal_isleftideal :: IsLeftIdeal leftideal_subgroup;
}.Definitionissig_LeftIdeal (R : Ring) : _ <~> LeftIdeal R := ltac:(issig).(** A right ideal of a ring [R] is a subgroup [I] of [R] which is closed under right multiplication. *)DefinitionRightIdeal (R : Ring) := LeftIdeal (rng_op R).Instanceisrightdeal_rightideal {R} (I : RightIdeal R)
: IsRightIdeal (R:=R) I
:= leftideal_isleftideal _ I.DefinitionBuild_RightIdeal (R : Ring) (I : Subgroup R) (H : IsRightIdeal I)
: RightIdeal R
:= Build_LeftIdeal (rng_op R) I H.Definitionissig_RightIdeal (R : Ring)
: {I : Subgroup R& IsRightIdeal (R:=R) I} <~> RightIdeal R
:= ltac:(issig).(** A two-sided ideal of a ring [R], or just an ideal, is a subgroup [I] of [R] which is closed under both left and right multiplication. *)RecordIdeal (R : Ring) := {
ideal_subgroup :> Subgroup R;
ideal_isideal :: IsIdeal ideal_subgroup;
}.Definitionissig_Ideal (R : Ring) : _ <~> Ideal R := ltac:(issig).Definitionideal_op (R : Ring) : Ideal R -> Ideal (rng_op R)
:= funI => Build_Ideal (rng_op R) I _.Coercionideal_op : Ideal >-> Ideal.(** *** Truncatedness properties *)SectionIdealTrunc.(** Assuming [Funext] we can show that the ideal predicates are propositions. *)Context `{Funext}.(** Being a left ideal is a proposition. *)#[export] Instanceishprop_isleftideal {R : Ring} (I : Subgroup R)
: IsHProp (IsLeftIdeal I) := ltac:(unfold IsLeftIdeal; exact _).(** Being a right ideal is a proposition. *)#[export] Instanceishprop_isrightideal `{Funext} {R : Ring} (I : Subgroup R)
: IsHProp (IsRightIdeal I) := ishprop_isleftideal _.(** Being a two-sided ideal is a proposition. *)#[export] Instanceishprop_isideal {R : Ring} (I : Subgroup R)
: IsHProp (IsIdeal I)
:= istrunc_equiv_istrunc _ (issig_IsIdeal I).(** Assuming [Univalence] we can show that the ideal types are sets. Note that univalence is only used to prove that the type of [Subgroup]s is a set. *)Context `{Univalence}.(** The type of left ideals is a set. *)#[export] Instanceishset_leftideal {R : Ring} : IsHSet (LeftIdeal R)
:= istrunc_equiv_istrunc _ (issig_LeftIdeal R).(** The type of right ideals is a set. *)#[export] Instanceishset_rightideal {R : Ring} : IsHSet (RightIdeal R)
:= _.(** The type of ideals is a set. *)#[export] Instanceishset_ideal {R : Ring} : IsHSet (Ideal R)
:= istrunc_equiv_istrunc _ (issig_Ideal R).EndIdealTrunc.(** *** Conversion between Ideals *)(** Every ideal is a left ideal. *)Definitionleftideal_of_ideal {R : Ring} : Ideal R -> LeftIdeal R
:= funI => Build_LeftIdeal R I _.Coercionleftideal_of_ideal : Ideal >-> LeftIdeal.(** Every ideal is a right ideal. *)Definitionrightideal_of_ideal {R : Ring} : Ideal R -> RightIdeal R
:= funI => Build_RightIdeal R I _.Coercionrightideal_of_ideal : Ideal >-> RightIdeal.(** *** Easy properties of ideals *)(** Here are some lemmas for proving certain elements are in an ideal. They are just special cases of the underlying subgroup lemmas. We write them out for clarity. Note that [I] isn't actually assumed to be an ideal but only a subgroup. *)SectionIdealElements.Context {R : Ring} (I : Subgroup R) (ab : R).Definitionideal_in_zero : I ring_zero := subgroup_in_unit I.Definitionideal_in_plus : I a -> I b -> I (a + b) := subgroup_in_op I a b.Definitionideal_in_negate : I a -> I (- a) := subgroup_in_inv I a.Definitionideal_in_negate' : I (- a) -> I a := subgroup_in_inv' I a.Definitionideal_in_plus_negate : I a -> I b -> I (a - b) := subgroup_in_op_inv I a b.Definitionideal_in_negate_plus : I a -> I b -> I (-a + b) := subgroup_in_inv_op I a b.Definitionideal_in_plus_l : I (a + b) -> I b -> I a := subgroup_in_op_l I a b.Definitionideal_in_plus_r : I (a + b) -> I a -> I b := subgroup_in_op_r I a b.EndIdealElements.(** ** Constructions of ideals *)(** *** Zero Ideal *)(** The trivial subgroup is a left ideal. *)
R: Ring
IsLeftIdeal (trivial_subgroup R)
R: Ring
IsLeftIdeal (trivial_subgroup R)
R: Ring r, x: R p: trivial_subgroup R x
trivial_subgroup R (r * x)
R: Ring r, x: R p: trivial_subgroup R x
r * x = ?Goal0 * 0
f_ap.Defined.(** The trivial subgroup is a right ideal. *)Instanceisrightideal_trivial_subgroup (R : Ring)
: IsRightIdeal (trivial_subgroup R)
:= isleftideal_trivial_subgroup _.(** The trivial subgroup is an ideal. *)Instanceisideal_trivial_subgroup (R : Ring)
: IsIdeal (trivial_subgroup R)
:= {}.(** We call the trivial subgroup the "zero ideal". *)Definitionideal_zero (R : Ring) : Ideal R := Build_Ideal R _ _.(** *** The unit ideal *)(** The maximal subgroup is a left ideal. *)Instanceisleftideal_maximal_subgroup (R : Ring)
: IsLeftIdeal (maximal_subgroup R)
:= ltac:(done).(** The maximal subgroup is a right ideal. *)Instanceisrightideal_maximal_subgroup (R : Ring)
: IsRightIdeal (maximal_subgroup R)
:= isleftideal_maximal_subgroup _.(** The maximal subgroup is an ideal. *)Instanceisideal_maximal_subgroup (R : Ring)
: IsIdeal (maximal_subgroup R)
:= {}.(** We call the maximal subgroup the "unit ideal". *)Definitionideal_unit (R : Ring) : Ideal R
:= Build_Ideal R _ (isideal_maximal_subgroup R).(** *** Intersection of ideals *)(** Intersections of underlying subgroups of left ideals are again left ideals. *)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J
IsLeftIdeal (subgroup_intersection I J)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J
IsLeftIdeal (subgroup_intersection I J)
intros r x [a b]; split; byapply isleftideal.Defined.(** Intersections of underlying subgroups of right ideals are again right ideals. *)Instanceisrightideal_subgroup_intersection (R : Ring) (IJ : Subgroup R)
`{IsRightIdeal R I, IsRightIdeal R J}
: IsRightIdeal (subgroup_intersection I J)
:= isleftideal_subgroup_intersection _ _ _.(** Intersections of underlying subgroups of ideals are again ideals. *)Instanceisideal_subgroup_intersection (R : Ring) (IJ : Subgroup R)
`{IsIdeal R I, IsIdeal R J}
: IsIdeal (subgroup_intersection I J)
:= {}.(** Intersection of left ideals. *)Definitionleftideal_intersection {R : Ring}
: LeftIdeal R -> LeftIdeal R -> LeftIdeal R
:= funIJ => Build_LeftIdeal R (subgroup_intersection I J) _.(** Intersection of right ideals. *)Definitionrightideal_intersection {R : Ring}
: RightIdeal R -> RightIdeal R -> RightIdeal R
:= leftideal_intersection.(** Intersection of ideals. *)Definitionideal_intersection {R : Ring}
: Ideal R -> Ideal R -> Ideal R
:= funIJ => Build_Ideal R (subgroup_intersection I J) _.(** *** Sum of ideals *)(** The subgroup product of left ideals is again an ideal. *)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J
IsLeftIdeal (subgroup_product I J)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J
IsLeftIdeal (subgroup_product I J)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r: R
forallx : R,
subgroup_product I J x -> subgroup_product I J (r * x)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r: R
forallx : R, I x -> subgroup_product I J (r * x)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r: R
forallx : R, J x -> subgroup_product I J (r * x)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r: R
subgroup_product I J (r * mon_unit)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r: R
forallxy : R,
subgroup_generated_type
(funx0 : R => (I x0 + J x0)%type) x ->
subgroup_generated_type
(funx0 : R => (I x0 + J x0)%type) y ->
subgroup_product I J (r * x) ->
subgroup_product I J (r * y) ->
subgroup_product I J (r * sg_op x (- y))
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r: R
forallx : R,
subgroup_product I J x ->
IsHProp (subgroup_product I J (r * x))
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r: R
forallx : R, I x -> subgroup_product I J (r * x)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r, x: R p: I x
subgroup_product I J (r * x)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r, x: R p: I x
(I (mult r x) + J (mult r x))%type
left; byapply isleftideal.
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r: R
forallx : R, J x -> subgroup_product I J (r * x)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r, x: R p: J x
subgroup_product I J (r * x)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r, x: R p: J x
(I (mult r x) + J (mult r x))%type
right; byapply isleftideal.
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r: R
subgroup_product I J (r * mon_unit)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r: R
(I (mult r mon_unit) + J (mult r mon_unit))%type
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r: R
I mon_unit
apply ideal_in_zero.
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r: R
forallxy : R,
subgroup_generated_type
(funx0 : R => (I x0 + J x0)%type) x ->
subgroup_generated_type
(funx0 : R => (I x0 + J x0)%type) y ->
subgroup_product I J (r * x) ->
subgroup_product I J (r * y) ->
subgroup_product I J (r * sg_op x (- y))
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r, x, y: R p: subgroup_generated_type
(funx : R => (I x + J x)%type) x q: subgroup_generated_type
(funx : R => (I x + J x)%type) y IHp: subgroup_product I J (r * x) IHq: subgroup_product I J (r * y)
subgroup_product I J (r * sg_op x (- y))
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r, x, y: R p: subgroup_generated_type
(funx : R => (I x + J x)%type) x q: subgroup_generated_type
(funx : R => (I x + J x)%type) y IHp: subgroup_product I J (r * x) IHq: subgroup_product I J (r * y)
subgroup_product I J (r * x + r * - y)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r, x, y: R p: subgroup_generated_type
(funx : R => (I x + J x)%type) x q: subgroup_generated_type
(funx : R => (I x + J x)%type) y IHp: subgroup_product I J (r * x) IHq: subgroup_product I J (r * y)
subgroup_product I J (r * x - r * y)
byapply subgroup_in_op_inv.
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r: R
forallx : R,
subgroup_product I J x ->
IsHProp (subgroup_product I J (r * x))
exact _.Defined.(** The subgroup product of right ideals is again an ideal. *)Instanceisrightideal_subgroup_product (R : Ring) (IJ : Subgroup R)
`{IsRightIdeal R I, IsRightIdeal R J}
: IsRightIdeal (subgroup_product I J)
:= isleftideal_subgroup_product _ _ _.(** The subgroup product of ideals is again an ideal. *)Instanceisideal_subgroup_product (R : Ring) (IJ : Subgroup R)
`{IsIdeal R I, IsIdeal R J}
: IsIdeal (subgroup_product I J)
:= {}.(** Sum of left ideals. *)Definitionleftideal_sum {R : Ring}
: LeftIdeal R -> LeftIdeal R -> LeftIdeal R
:= funIJ => Build_LeftIdeal R (subgroup_product I J) _.(** Sum of right ideals. *)Definitionrightideal_sum {R : Ring}
: RightIdeal R -> RightIdeal R -> RightIdeal R
:= leftideal_sum.(** Sum of ideals. *)Definitionideal_sum {R : Ring}
: Ideal R -> Ideal R -> Ideal R
:= funIJ => Build_Ideal R (subgroup_product I J) _.Definitionideal_sum_ind {R : Ring} (IJ : Ideal R)
(P : forallx, ideal_sum I J x -> Type)
(P_I_in : forallxy, P x (tr (sgt_in (inl y))))
(P_J_in : forallxy, P x (tr (sgt_in (inr y))))
(P_unit : P mon_unit (tr sgt_unit))
(P_op : forallxyhk, P x (tr h) -> P y (tr k) -> P (x - y) (tr (sgt_op h k)))
`{forallxy, IsHProp (P x y)}
: forallx (p : ideal_sum I J x), P x p
:= subgroup_product_ind I J P P_I_in P_J_in P_unit P_op.(** *** Product of ideals *)(** First we form the "naive" product of ideals { a * b | a ∈ I /\ b ∈ J }. Note that this is not an ideal, but we can fix this. *)Inductiveideal_product_naive_type {R : Ring} (IJ : Subgroup R) : R -> Type :=
| ipn_in : forallxy, I x -> J y -> ideal_product_naive_type I J (x * y).(** We instead consider the subgroup generated by this naive product and later prove it happens to be an ideal. Note that the subgroup generated by a set and the ideal generated by a set are not the same in general. *)Definitionideal_product_type {R : Ring} (IJ : Subgroup R) : Subgroup R
:= subgroup_generated (G := R) (ideal_product_naive_type I J).(** The product of left ideals is a left ideal. *)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J
IsLeftIdeal (ideal_product_type I J)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J
IsLeftIdeal (ideal_product_type I J)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r: R
forallx : R,
ideal_product_type I J x ->
ideal_product_type I J (r * x)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r: R
forallg : R,
ideal_product_naive_type I J g ->
ideal_product_naive_type I J
(grp_homo_rng_left_mult r g)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r, s, s1, s2: R p1: I s1 p2: J s2
ideal_product_naive_type I J (r * (s1 * s2))
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r, s, s1, s2: R p1: I s1 p2: J s2
ideal_product_naive_type I J (r * s1 * s2)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsLeftIdeal J r, s, s1, s2: R p1: I s1 p2: J s2
I (r * s1)
byapply isleftideal.Defined.(** The product of right ideals is a right ideal. *)
R: Ring I, J: Subgroup R H: IsRightIdeal I H0: IsRightIdeal J
IsRightIdeal (ideal_product_type I J)
R: Ring I, J: Subgroup R H: IsRightIdeal I H0: IsRightIdeal J
IsRightIdeal (ideal_product_type I J)
R: Ring I, J: Subgroup R H: IsRightIdeal I H0: IsRightIdeal J r: rng_op R
forallx : rng_op R,
ideal_product_type I J x ->
ideal_product_type I J (r * x)
R: Ring I, J: Subgroup R H: IsRightIdeal I H0: IsRightIdeal J r: rng_op R
forallg : R,
ideal_product_naive_type I J g ->
ideal_product_naive_type I J
(grp_homo_rng_right_mult r g)
R: Ring I, J: Subgroup R H: IsRightIdeal I H0: IsRightIdeal J r: rng_op R s, s1, s2: R p1: I s1 p2: J s2
ideal_product_naive_type I J (s1 * s2 * r)
R: Ring I, J: Subgroup R H: IsRightIdeal I H0: IsRightIdeal J r: rng_op R s, s1, s2: R p1: I s1 p2: J s2
ideal_product_naive_type I J (s1 * (s2 * r))
R: Ring I, J: Subgroup R H: IsRightIdeal I H0: IsRightIdeal J r: rng_op R s, s1, s2: R p1: I s1 p2: J s2
J (s2 * r)
byapply isrightideal.Defined.(** The product of ideals is an ideal. *)Instanceisideal_ideal_product_type {R : Ring} (IJ : Subgroup R)
`{IsIdeal R I, IsIdeal R J}
: IsIdeal (ideal_product_type I J)
:= {}.(** Product of left ideals. *)Definitionleftideal_product {R : Ring}
: LeftIdeal R -> LeftIdeal R -> LeftIdeal R
:= funIJ => Build_LeftIdeal R (ideal_product_type I J) _.(** Product of right ideals. *)Definitionrightideal_product {R : Ring}
: RightIdeal R -> RightIdeal R -> RightIdeal R
:= leftideal_product.(** Product of ideals. *)Definitionideal_product {R : Ring}
: Ideal R -> Ideal R -> Ideal R
:= funIJ => Build_Ideal R (ideal_product_type I J) _.(** *** The kernel of a ring homomorphism *)(** The kernel of the underlying group homomorphism of a ring homomorphism is a left ideal. *)
R, S: Ring f: RingHomomorphism R S
IsLeftIdeal (grp_kernel f)
R, S: Ring f: RingHomomorphism R S
IsLeftIdeal (grp_kernel f)
R, S: Ring f: RingHomomorphism R S r, x: R p: grp_kernel f x
grp_kernel f (r * x)
R, S: Ring f: RingHomomorphism R S r, x: R p: grp_kernel f x
f r * f x = mon_unit
R, S: Ring f: RingHomomorphism R S r, x: R p: grp_kernel f x
f r * f x = f r * 0
byapply ap.Defined.(** The kernel of the underlying group homomorphism of a ring homomorphism is a right ideal. *)Instanceisrightideal_grp_kernel {RS : Ring} (f : RingHomomorphism R S)
: IsRightIdeal (grp_kernel f)
:= isleftideal_grp_kernel (fmap rng_op f).(** The kernel of the underlying group homomorphism of a ring homomorphism is an ideal. *)Instanceisideal_grp_kernel {RS : Ring} (f : RingHomomorphism R S)
: IsIdeal (grp_kernel f)
:= {}.(** The kernel of a ring homomorphism is an ideal. *)Definitionideal_kernel {RS : Ring} (f : RingHomomorphism R S) : Ideal R
:= Build_Ideal R (grp_kernel f) _.(** *** Ideal generated by a subset *)(** It seems tempting to define ideals generated by a subset in terms of subgroups generated by a subset but this does not work. Left ideals also have to be closed under left multiplication by ring elements, and similarly for right and two sided ideals. Therefore we will do an analagous construction to the one done in Subgroup.v. *)(** Underlying type family of a left ideal generated by subset. *)Inductiveleftideal_generated_type (R : Ring) (X : R -> Type) : R -> Type :=
(** It should contain all elements of the original family. *)
| ligt_in (r : R) : X r -> leftideal_generated_type R X r
(** It should contain zero. *)
| ligt_zero : leftideal_generated_type R X ring_zero
(** It should be closed under negation and addition. *)
| ligt_add_neg (r s : R)
: leftideal_generated_type R X r
-> leftideal_generated_type R X s
-> leftideal_generated_type R X (r - s)
(** And finally, it should be closed under left multiplication. *)
| ligt_mul (r s : R)
: leftideal_generated_type R X s
-> leftideal_generated_type R X (r * s)
.Arguments leftideal_generated_type {R} X r.Arguments ligt_in {R X r}.Arguments ligt_zero {R X}.Arguments ligt_add_neg {R X r s}.Arguments ligt_mul {R X r s}.(** Left ideal generated by a subset. *)
R: Ring X: R -> Type
LeftIdeal R
R: Ring X: R -> Type
LeftIdeal R
R: Ring X: R -> Type
Subgroup R
R: Ring X: R -> Type
IsLeftIdeal ?leftideal_subgroup
R: Ring X: R -> Type
Subgroup R
R: Ring X: R -> Type
R -> Type
R: Ring X: R -> Type
forallx : R, IsHProp (?H x)
R: Ring X: R -> Type
?H mon_unit
R: Ring X: R -> Type
forallxy : R, ?H x -> ?H y -> ?H (sg_op x (inv y))
R: Ring X: R -> Type
R -> Type
exact (funx => merely (leftideal_generated_type X x)).
R: Ring X: R -> Type
forallx : R,
IsHProp
((funx0 : R =>
trunctype_type
(merely (leftideal_generated_type X x0))) x)
exact _.
R: Ring X: R -> Type
(funx : R =>
trunctype_type
(merely (leftideal_generated_type X x))) mon_unit
apply tr, ligt_zero.
R: Ring X: R -> Type
forallxy : R,
(funx0 : R =>
trunctype_type
(merely (leftideal_generated_type X x0))) x ->
(funx0 : R =>
trunctype_type
(merely (leftideal_generated_type X x0))) y ->
(funx0 : R =>
trunctype_type
(merely (leftideal_generated_type X x0)))
(sg_op x (inv y))
R: Ring X: R -> Type x, y: R q: leftideal_generated_type X y p: leftideal_generated_type X x
merely (leftideal_generated_type X (sg_op x (inv y)))
byapply tr, ligt_add_neg.
R: Ring X: R -> Type
IsLeftIdeal
(Build_Subgroup'
(funx : R =>
merely (leftideal_generated_type X x))
(tr ligt_zero)
(fun (xy : R)
(p : (funx0 : R =>
trunctype_type
(merely
(leftideal_generated_type X x0))) x)
(q : (funx0 : R =>
trunctype_type
(merely
(leftideal_generated_type X x0))) y)
=>
Trunc_ind
(fun_ : Trunc (-1)
(leftideal_generated_type X y) =>
(funx0 : R =>
trunctype_type
(merely (leftideal_generated_type X x0)))
(sg_op x (inv y)))
(funq0 : leftideal_generated_type X y =>
Trunc_ind
(fun_ : Trunc (-1)
(leftideal_generated_type X x) =>
merely
(leftideal_generated_type X
(sg_op x (inv y))))
(funp0 : leftideal_generated_type X x =>
tr (ligt_add_neg p0 q0)) p) q))
R: Ring X: R -> Type r, x: R
leftideal_generated_type X x ->
leftideal_generated_type X (r * x)
exact ligt_mul.Defined.(** Right ideal generated by a subset. *)Definitionrightideal_generated@{u v} {R : Ring@{u}} (X : R -> Type@{v}) : RightIdeal@{u v} R
:= Build_RightIdeal R (leftideal_generated (R:=rng_op R) X) _.(** Underlying type family of a two-sided ideal generated by subset. *)Inductiveideal_generated_type (R : Ring) (X : R -> Type) : R -> Type :=
(** It should contain all elements of the original family. *)
| igt_in (r : R) : X r -> ideal_generated_type R X r
(** It should contain zero. *)
| igt_zero : ideal_generated_type R X ring_zero
(** It should be closed under negation and addition. *)
| igt_add_neg (r s : R)
: ideal_generated_type R X r
-> ideal_generated_type R X s
-> ideal_generated_type R X (r - s)
(** And finally, it should be closed under left and right multiplication. *)
| igt_mul_l (r s : R)
: ideal_generated_type R X s
-> ideal_generated_type R X (r * s)
| igt_mul_r (r s : R)
: ideal_generated_type R X r
-> ideal_generated_type R X (r * s)
.Arguments ideal_generated_type {R} X r.Arguments igt_in {R X r}.Arguments igt_zero {R X}.Arguments igt_add_neg {R X r s}.Arguments igt_mul_l {R X r s}.Arguments igt_mul_r {R X r s}.(** Two-sided ideal generated by a subset. *)
R: Ring X: R -> Type
Ideal R
R: Ring X: R -> Type
Ideal R
R: Ring X: R -> Type
Subgroup R
R: Ring X: R -> Type
IsLeftIdeal ?ideal_subgroup
R: Ring X: R -> Type
IsRightIdeal ?ideal_subgroup
R: Ring X: R -> Type
Subgroup R
R: Ring X: R -> Type
R -> Type
R: Ring X: R -> Type
forallx : R, IsHProp (?H x)
R: Ring X: R -> Type
?H mon_unit
R: Ring X: R -> Type
forallxy : R, ?H x -> ?H y -> ?H (sg_op x (inv y))
R: Ring X: R -> Type
R -> Type
exact (funx => merely (ideal_generated_type X x)).
R: Ring X: R -> Type
forallx : R,
IsHProp
((funx0 : R =>
trunctype_type
(merely (ideal_generated_type X x0))) x)
exact _.
R: Ring X: R -> Type
(funx : R =>
trunctype_type (merely (ideal_generated_type X x)))
mon_unit
apply tr, igt_zero.
R: Ring X: R -> Type
forallxy : R,
(funx0 : R =>
trunctype_type (merely (ideal_generated_type X x0)))
x ->
(funx0 : R =>
trunctype_type (merely (ideal_generated_type X x0)))
y ->
(funx0 : R =>
trunctype_type (merely (ideal_generated_type X x0)))
(sg_op x (inv y))
R: Ring X: R -> Type x, y: R q: ideal_generated_type X y p: ideal_generated_type X x
merely (ideal_generated_type X (sg_op x (inv y)))
byapply tr, igt_add_neg.
R: Ring X: R -> Type
IsLeftIdeal
(Build_Subgroup'
(funx : R => merely (ideal_generated_type X x))
(tr igt_zero)
(fun (xy : R)
(p : (funx0 : R =>
trunctype_type
(merely (ideal_generated_type X x0)))
x)
(q : (funx0 : R =>
trunctype_type
(merely (ideal_generated_type X x0)))
y) =>
Trunc_ind
(fun_ : Trunc (-1) (ideal_generated_type X y)
=>
(funx0 : R =>
trunctype_type
(merely (ideal_generated_type X x0)))
(sg_op x (inv y)))
(funq0 : ideal_generated_type X y =>
Trunc_ind
(fun_ : Trunc (-1)
(ideal_generated_type X x) =>
merely
(ideal_generated_type X
(sg_op x (inv y))))
(funp0 : ideal_generated_type X x =>
tr (igt_add_neg p0 q0)) p) q))
R: Ring X: R -> Type r, x: R
ideal_generated_type X x ->
ideal_generated_type X (r * x)
exact igt_mul_l.
R: Ring X: R -> Type
IsRightIdeal
(Build_Subgroup'
(funx : R => merely (ideal_generated_type X x))
(tr igt_zero)
(fun (xy : R)
(p : (funx0 : R =>
trunctype_type
(merely (ideal_generated_type X x0)))
x)
(q : (funx0 : R =>
trunctype_type
(merely (ideal_generated_type X x0)))
y) =>
Trunc_ind
(fun_ : Trunc (-1) (ideal_generated_type X y)
=>
(funx0 : R =>
trunctype_type
(merely (ideal_generated_type X x0)))
(sg_op x (inv y)))
(funq0 : ideal_generated_type X y =>
Trunc_ind
(fun_ : Trunc (-1)
(ideal_generated_type X x) =>
merely
(ideal_generated_type X
(sg_op x (inv y))))
(funp0 : ideal_generated_type X x =>
tr (igt_add_neg p0 q0)) p) q))
R: Ring X: R -> Type x, r: rng_op R
ideal_generated_type X r ->
ideal_generated_type X (x * r)
exact (hfiber X).Defined.(** *** Principal ideals *)(** A principal ideal is an ideal generated by a single element. *)Definitionideal_principal {R : Ring} (x : R) : Ideal R
:= ideal_generated (funr => x = r).(** *** Ideal equality *)(** Classically, set based equality suffices for ideals. Since we are talking about predicates, we use pointwise iffs. This can of course be shown to be equivalent to the identity type. *)Definitionideal_eq {R : Ring} (IJ : Subgroup R) := forallx, I x <-> J x.(** With univalence we can characterize equality of ideals. *)
H: Univalence R: Ring I, J: Ideal R
ideal_eq I J <~> I = J
H: Univalence R: Ring I, J: Ideal R
ideal_eq I J <~> I = J
H: Univalence R: Ring I, J: Ideal R
ideal_eq I J <~>
(issig_Ideal R)^-1%equiv I =
(issig_Ideal R)^-1%equiv J
rapply equiv_path_subgroup'.Defined.(** Under funext, ideal equality is a proposition. *)Instanceishprop_ideal_eq `{Funext} {R : Ring} (I J : Ideal R)
: IsHProp (ideal_eq I J) := _.(** Ideal equality is reflexive. *)
R: Ring
Reflexive ideal_eq
R: Ring
Reflexive ideal_eq
intros I x; bysplit.Defined.(** Ideal equality is symmetric. *)
R: Ring
Symmetric ideal_eq
R: Ring
Symmetric ideal_eq
intros I J p x; specialize (p x); bysymmetry.Defined.(** Ideal equality is transitive. *)
R: Ring
Transitive ideal_eq
R: Ring
Transitive ideal_eq
intros I J K p q x; specialize (p x); specialize (q x); bytransitivity (J x).Defined.(** *** Subset relation on ideals *)(** We define the subset relation on ideals in the usual way: *)Definitionideal_subset {R : Ring} (IJ : Subgroup R) := (forallx, I x -> J x).(** The subset relation is reflexive. *)Instancereflexive_ideal_subset {R : Ring} : Reflexive (@ideal_subset R)
:= fun__ => idmap.(** The subset relation is transitive. *)
R: Ring
Transitive ideal_subset
R: Ring
Transitive ideal_subset
R: Ring x, y, z: Subgroup R p: ideal_subset x y q: ideal_subset y z a: R
x a -> z a
exact (q a o p a).Defined.(** We can coerce equality to the subset relation, since equality is defined to be the subset relation in each direction. *)
R: Ring I, J: Subgroup R
ideal_eq I J -> ideal_subset I J
R: Ring I, J: Subgroup R
ideal_eq I J -> ideal_subset I J
intros f x; apply f.Defined.(** *** Quotient (a.k.a colon) ideals *)(** The definitions here are not entirely standard, but will become so when considering only commutative rings. For the non-commutative case there isn't a lot written about ideal quotients. *)(** The subgroup corresponding to the left ideal quotient. *)
R: Ring I, J: Subgroup R
Subgroup R
R: Ring I, J: Subgroup R
Subgroup R
R: Ring I, J: Subgroup R
R -> Type
R: Ring I, J: Subgroup R
forallx : R, IsHProp (?H x)
R: Ring I, J: Subgroup R
?H mon_unit
R: Ring I, J: Subgroup R
forallxy : R, ?H x -> ?H y -> ?H (sg_op x (inv y))
R: Ring I, J: Subgroup R
R -> Type
exact (funr => merely (forallx, J x -> I (r * x))).
(funr : R =>
trunctype_type
(merely (forallx : R, J x -> I (r * x)))) mon_unit
R: Ring I, J: Subgroup R
forallx : R, J x -> I (mon_unit * x)
R: Ring I, J: Subgroup R r: R p: J r
I (mon_unit * r)
R: Ring I, J: Subgroup R r: R p: J r
I 0
apply ideal_in_zero.
R: Ring I, J: Subgroup R
forallxy : R,
(funr : R =>
trunctype_type
(merely (forallx0 : R, J x0 -> I (r * x0)))) x ->
(funr : R =>
trunctype_type
(merely (forallx0 : R, J x0 -> I (r * x0)))) y ->
(funr : R =>
trunctype_type
(merely (forallx0 : R, J x0 -> I (r * x0))))
(sg_op x (inv y))
R: Ring I, J: Subgroup R x, y: R p: (funr : R =>
trunctype_type
(merely (forallx : R, J x -> I (r * x)))) x q: (funr : R =>
trunctype_type
(merely (forallx : R, J x -> I (r * x)))) y
(funr : R =>
trunctype_type
(merely (forallx : R, J x -> I (r * x))))
(sg_op x (inv y))
R: Ring I, J: Subgroup R x, y: R q: forallx : R, J x -> I (y * x) p: forallx0 : R, J x0 -> I (x * x0)
forallx0 : R, J x0 -> I (sg_op x (inv y) * x0)
R: Ring I, J: Subgroup R x, y: R q: forallx : R, J x -> I (y * x) p: forallx0 : R, J x0 -> I (x * x0) s: R j: J s
I (sg_op x (inv y) * s)
R: Ring I, J: Subgroup R x, y: R q: forallx : R, J x -> I (y * x) p: forallx0 : R, J x0 -> I (x * x0) s: R j: J s
I (x * s + inv y * s)
R: Ring I, J: Subgroup R x, y: R q: forallx : R, J x -> I (y * x) p: forallx0 : R, J x0 -> I (x * x0) s: R j: J s
I (x * s - y * s)
R: Ring I, J: Subgroup R x, y: R q: forallx : R, J x -> I (y * x) p: forallx0 : R, J x0 -> I (x * x0) s: R j: J s
I (x * s)
R: Ring I, J: Subgroup R x, y: R q: forallx : R, J x -> I (y * x) p: forallx0 : R, J x0 -> I (x * x0) s: R j: J s
I (y * s)
R: Ring I, J: Subgroup R x, y: R q: forallx : R, J x -> I (y * x) p: forallx0 : R, J x0 -> I (x * x0) s: R j: J s
I (x * s)
byapply p.
R: Ring I, J: Subgroup R x, y: R q: forallx : R, J x -> I (y * x) p: forallx0 : R, J x0 -> I (x * x0) s: R j: J s
I (y * s)
byapply q.Defined.(** The left ideal quotient of a left ideal is a left ideal. *)
R: Ring I, J: Subgroup R H: IsLeftIdeal I
IsLeftIdeal (subgroup_leftideal_quotient I J)
R: Ring I, J: Subgroup R H: IsLeftIdeal I
IsLeftIdeal (subgroup_leftideal_quotient I J)
R: Ring I, J: Subgroup R H: IsLeftIdeal I r, x: R p: subgroup_leftideal_quotient I J x
subgroup_leftideal_quotient I J (r * x)
R: Ring I, J: Subgroup R H: IsLeftIdeal I r, x: R p: forallx0 : R, J x0 -> I (x * x0)
forallx0 : R, J x0 -> I (r * x * x0)
R: Ring I, J: Subgroup R H: IsLeftIdeal I r, x: R p: forallx0 : R, J x0 -> I (x * x0) s: R j: J s
I (r * x * s)
R: Ring I, J: Subgroup R H: IsLeftIdeal I r, x: R p: forallx0 : R, J x0 -> I (x * x0) s: R j: J s
I (r * (x * s))
R: Ring I, J: Subgroup R H: IsLeftIdeal I r, x: R p: forallx0 : R, J x0 -> I (x * x0) s: R j: J s
I (x * s)
by napply p.Defined.(** The left ideal quotient of a right ideal by a left ideal is a right ideal. *)
R: Ring I, J: Subgroup R H: IsRightIdeal I H0: IsLeftIdeal J
IsRightIdeal (subgroup_leftideal_quotient I J)
R: Ring I, J: Subgroup R H: IsRightIdeal I H0: IsLeftIdeal J
IsRightIdeal (subgroup_leftideal_quotient I J)
R: Ring I, J: Subgroup R H: IsRightIdeal I H0: IsLeftIdeal J r, x: rng_op R p: subgroup_leftideal_quotient I J x
subgroup_leftideal_quotient I J (r * x)
R: Ring I, J: Subgroup R H: IsRightIdeal I H0: IsLeftIdeal J r, x: rng_op R p: forallx0 : R, J x0 -> I (x * x0)
forallx0 : R, J x0 -> I (r * x * x0)
R: Ring I, J: Subgroup R H: IsRightIdeal I H0: IsLeftIdeal J r, x: rng_op R p: forallx0 : R, J x0 -> I (x * x0) s: R j: J s
I (r * x * s)
R: Ring I, J: Subgroup R H: IsRightIdeal I H0: IsLeftIdeal J r, x: R p: forallx0 : R, J x0 -> I (x * x0) s: R j: J s
I (ring_mult x r * s)
R: Ring I, J: Subgroup R H: IsRightIdeal I H0: IsLeftIdeal J r, x: R p: forallx0 : R, J x0 -> I (x * x0) s: R j: J s
I (x * (r * s))
R: Ring I, J: Subgroup R H: IsRightIdeal I H0: IsLeftIdeal J r, x: R p: forallx0 : R, J x0 -> I (x * x0) s: R j: J s
J (r * s)
by rapply isleftideal.Defined.(** We define the left ideal quotient as a left ideal. *)Definitionleftideal_quotient {R : Ring}
: LeftIdeal R -> Subgroup R -> LeftIdeal R
:= funIJ => Build_LeftIdeal R (subgroup_leftideal_quotient I J) _.Definitionsubgroup_rightideal_quotient {R : Ring} (IJ : Subgroup R) : Subgroup R
:= subgroup_leftideal_quotient (R:=rng_op R) I J.Instanceisrightideal_subgroup_rightideal_quotient {R : Ring}
(IJ : Subgroup R) `{IsRightIdeal R I}
: IsRightIdeal (subgroup_rightideal_quotient I J)
:= isleftideal_subgroup_leftideal_quotient (R:=rng_op R) I J.
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsRightIdeal J
IsLeftIdeal (subgroup_rightideal_quotient I J)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsRightIdeal J
IsLeftIdeal (subgroup_rightideal_quotient I J)
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsRightIdeal J
IsRightIdeal I
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsRightIdeal J
IsLeftIdeal J
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsRightIdeal J
IsRightIdeal I
exact H.
R: Ring I, J: Subgroup R H: IsLeftIdeal I H0: IsRightIdeal J
IsLeftIdeal J
exact _.Defined.(** We define the right ideal quotient as a right ideal. *)Definitionrightideal_quotient {R : Ring}
: RightIdeal R -> Subgroup R -> RightIdeal R
:= funIJ => Build_RightIdeal R (subgroup_rightideal_quotient (R:=R) I J) _.(** The ideal quotient is then the intersection of a left and right quotient of both two sided ideals. *)Definitionideal_quotient {R : Ring}
: Ideal R -> Ideal R -> Ideal R
:= funIJ =>
Build_Ideal R
(subgroup_intersection
(leftideal_quotient I J)
(rightideal_quotient I J))
(Build_IsIdeal _ _ _ _).(** *** Annihilator *)(** The left annihilator of a subset is the set of elements that annihilate the subgroup with left multiplication. *)
R: Ring S: R -> Type
Subgroup R
R: Ring S: R -> Type
Subgroup R
R: Ring S: R -> Type
R -> Type
R: Ring S: R -> Type
forallx : R, IsHProp (?H x)
R: Ring S: R -> Type
?H mon_unit
R: Ring S: R -> Type
forallxy : R, ?H x -> ?H y -> ?H (sg_op x (inv y))
(** If we assume [Funext], then it isn't necessary to use [merely] here. *)
R: Ring S: R -> Type
R -> Type
exact (funr => merely (forallx, S x -> r * x = ring_zero)).
R: Ring S: R -> Type
forallx : R,
IsHProp
((funr : R =>
trunctype_type
(merely
(forallx0 : R, S x0 -> r * x0 = ring_zero)))
x)
exact _.
R: Ring S: R -> Type
(funr : R =>
trunctype_type
(merely (forallx : R, S x -> r * x = ring_zero)))
mon_unit
R: Ring S: R -> Type
forallx : R, S x -> mon_unit * x = ring_zero
R: Ring S: R -> Type r: R p: S r
mon_unit * r = ring_zero
apply rng_mult_zero_l.
R: Ring S: R -> Type
forallxy : R,
(funr : R =>
trunctype_type
(merely (forallx0 : R, S x0 -> r * x0 = ring_zero)))
x ->
(funr : R =>
trunctype_type
(merely (forallx0 : R, S x0 -> r * x0 = ring_zero)))
y ->
(funr : R =>
trunctype_type
(merely (forallx0 : R, S x0 -> r * x0 = ring_zero)))
(sg_op x (inv y))
R: Ring S: R -> Type x, y: R p: (funr : R =>
trunctype_type
(merely
(forallx : R, S x -> r * x = ring_zero))) x q: (funr : R =>
trunctype_type
(merely
(forallx : R, S x -> r * x = ring_zero))) y
(funr : R =>
trunctype_type
(merely (forallx : R, S x -> r * x = ring_zero)))
(sg_op x (inv y))
R: Ring S: R -> Type x, y: R q: forallx : R, S x -> y * x = ring_zero p: forallx0 : R, S x0 -> x * x0 = ring_zero
forallx0 : R,
S x0 -> sg_op x (inv y) * x0 = ring_zero
R: Ring S: R -> Type x, y: R q: forallx : R, S x -> y * x = ring_zero p: forallx0 : R, S x0 -> x * x0 = ring_zero r: R s: S r
sg_op x (inv y) * r = ring_zero
R: Ring S: R -> Type x, y: R q: forallx : R, S x -> y * x = ring_zero p: forallx0 : R, S x0 -> x * x0 = ring_zero r: R s: S r
x * r + inv y * r = ring_zero
R: Ring S: R -> Type x, y: R q: forallx : R, S x -> y * x = ring_zero p: forallx0 : R, S x0 -> x * x0 = ring_zero r: R s: S r
ring_zero + inv y * r = ring_zero
R: Ring S: R -> Type x, y: R q: forallx : R, S x -> y * x = ring_zero p: forallx0 : R, S x0 -> x * x0 = ring_zero r: R s: S r
ring_zero - y * r = ring_zero
R: Ring S: R -> Type x, y: R q: forallx : R, S x -> y * x = ring_zero p: forallx0 : R, S x0 -> x * x0 = ring_zero r: R s: S r
ring_zero - ring_zero = ring_zero
R: Ring S: R -> Type x, y: R q: forallx : R, S x -> y * x = ring_zero p: forallx0 : R, S x0 -> x * x0 = ring_zero r: R s: S r
ring_zero + -1 * ring_zero = ring_zero
R: Ring S: R -> Type x, y: R q: forallx : R, S x -> y * x = ring_zero p: forallx0 : R, S x0 -> x * x0 = ring_zero r: R s: S r
ring_zero + 0 = ring_zero
apply left_identity.Defined.(** The left annihilator of a subgroup of a ring is a left ideal of the ring. *)
R: Ring I: R -> Type
IsLeftIdeal (subgroup_ideal_left_annihilator I)
R: Ring I: R -> Type
IsLeftIdeal (subgroup_ideal_left_annihilator I)
R: Ring I: R -> Type r, x: R p: subgroup_ideal_left_annihilator I x
subgroup_ideal_left_annihilator I (r * x)
R: Ring I: R -> Type r, x: R p: forallx0 : R, I x0 -> x * x0 = ring_zero
forallx0 : R, I x0 -> r * x * x0 = ring_zero
R: Ring I: R -> Type r, x: R p: forallx0 : R, I x0 -> x * x0 = ring_zero s: R i: I s
r * x * s = ring_zero
R: Ring I: R -> Type r, x: R p: forallx0 : R, I x0 -> x * x0 = ring_zero s: R i: I s
r * ring_zero = ring_zero
apply rng_mult_zero_r.Defined.(** The left annihilator of a left ideal also happens to be a right ideal. In fact, left ideal could be weakened to subset closed under multiplication, however we don't need this generality currently. *)
R: Ring I: Subgroup R H: IsLeftIdeal I
IsRightIdeal (subgroup_ideal_left_annihilator I)
R: Ring I: Subgroup R H: IsLeftIdeal I
IsRightIdeal (subgroup_ideal_left_annihilator I)
R: Ring I: Subgroup R H: IsLeftIdeal I r, x: rng_op R p: subgroup_ideal_left_annihilator I x
subgroup_ideal_left_annihilator I (r * x)
R: Ring I: Subgroup R H: IsLeftIdeal I r, x: rng_op R p: forallx0 : R, I x0 -> x * x0 = ring_zero
forallx0 : R, I x0 -> r * x * x0 = ring_zero
R: Ring I: Subgroup R H: IsLeftIdeal I r, x: rng_op R p: forallx0 : R, I x0 -> x * x0 = ring_zero s: R i: I s
ring_mult x r * s = ring_zero
R: Ring I: Subgroup R H: IsLeftIdeal I r, x: rng_op R p: forallx0 : R, I x0 -> x * x0 = ring_zero s: R i: I s
x * (r * s) = ring_zero
byapply p, isleftideal.Defined.(** Therefore the annihilator of a left ideal is an ideal. *)Instanceisideal_ideal_left_annihilator {R : Ring} (I : Subgroup R)
`{IsLeftIdeal R I}
: IsIdeal (subgroup_ideal_left_annihilator I)
:= {}.(** The left annihilator of a left ideal. *)Definitionideal_left_annihilator {R : Ring} (I : LeftIdeal R) : Ideal R
:= Build_Ideal R (subgroup_ideal_left_annihilator I) _.(** The right annihilator of a subset of a ring is the set of elements that annihilate the elements of the subset with right multiplication. *)Definitionsubgroup_ideal_right_annihilator {R : Ring} (I : R -> Type)
: Subgroup R
:= subgroup_ideal_left_annihilator (R:=rng_op R) I.(** When the subset is a right ideal the right annihilator is a left ideal of the ring. This can be strengthened. See the comment in the left ideal version of this lemma above. *)Instanceisleftideal_ideal_right_annihilator {R : Ring} (I : Subgroup R)
`{IsRightIdeal R I}
: IsLeftIdeal (subgroup_ideal_right_annihilator I)
:= isrightideal_ideal_left_annihilator (R:=rng_op R) I.(** The right annihilator is a right ideal of the ring. *)Instanceisrightideal_ideal_right_annihilator {R : Ring} (I : R -> Type)
: IsRightIdeal (subgroup_ideal_right_annihilator (R:=R) I)
:= isleftideal_ideal_left_annihilator (R:=rng_op R) I.(** Therefore the annihilator of a right ideal is an ideal. *)Instanceisideal_ideal_right_annihilator {R : Ring} (I : Subgroup R)
`{IsRightIdeal R I}
: IsIdeal (subgroup_ideal_right_annihilator (R:=R) I)
:= {}.(** The right annihilator of a right ideal. *)Definitionideal_right_annihilator {R : Ring} (I : RightIdeal R) : Ideal R
:= Build_Ideal R (subgroup_ideal_right_annihilator (R:=R) I)
(isideal_ideal_right_annihilator (R:=R) I).(** The annihilator of an ideal is the intersection of the left and right annihilators. *)Definitionideal_annihilator {R : Ring} (I : Ideal R) : Ideal R
:= ideal_intersection (ideal_left_annihilator I) (ideal_right_annihilator I).(** ** Properties of ideals *)(** *** Coprime ideals *)(** Two ideals are coprime if their sum is the unit ideal. *)DefinitionCoprime {R : Ring} (IJ : Ideal R) : Type
:= ideal_eq (ideal_sum I J) (ideal_unit R).Existing ClassCoprime.
H: Funext R: Ring I, J: Ideal R
IsHProp (Coprime I J)
H: Funext R: Ring I, J: Ideal R
IsHProp (Coprime I J)
H: Funext R: Ring I, J: Ideal R
IsHProp (ideal_eq (ideal_sum I J) (ideal_unit R))
exact _.Defined.
H: Funext R: Ring I, J: Ideal R
Coprime I J <~>
hexists
(funpat : {x : _ & I x} * {x : _ & J x} =>
letx := pat inletfst := fst x inletsnd := snd x inletfst0 := fst inleti := fst0.1inletp := fst0.2inletsnd0 := snd inletj := snd0.1inletq := snd0.2in i + j = ring_one)
H: Funext R: Ring I, J: Ideal R
Coprime I J <~>
hexists
(funpat : {x : _ & I x} * {x : _ & J x} =>
letx := pat inletfst := fst x inletsnd := snd x inletfst0 := fst inleti := fst0.1inletp := fst0.2inletsnd0 := snd inletj := snd0.1inletq := snd0.2in i + j = ring_one)
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g IHd2: {pat : {x : _ & I x} * {x : _ & J x} &
(fst pat).1 + (snd pat).1 = h}
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
R
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
I ?proj1
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
R
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
J ?proj10
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
R
exact (x - w).
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
I (x - w)
byapply ideal_in_plus_negate.
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
R
exact (y - z).
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
J (y - z)
byapply ideal_in_plus_negate.
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
(funpat : {x : _ & I x} * {x : _ & J x} =>
(fst pat).1 + (snd pat).1 = sg_op g (inv h))
((x - w; ideal_in_plus_negate I x w xi wi),
(y - z; ideal_in_plus_negate J y z yj zj))
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
x - w + (y - z) = sg_op g (inv h)
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
x - w + (y - z) = x + y - (w + z)
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
x + (- w + (y - z)) = x + y - (w + z)
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
x + (- w + (y - z)) = x + (y - (w + z))
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
- w + (y - z) = y - (w + z)
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
- w + (y - z) = y + (- w - z)
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
- w + (y - z) = - w - z + y
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
- w + (y - z) = - w + (- z + y)
H: Funext R: Ring I, J: Ideal R g, h: R d1: subgroup_generated_type
(funx : R => (I x + J x)%type) g d2: subgroup_generated_type
(funx : R => (I x + J x)%type) h x: R xi: I x y: R yj: J y p: x + y = g w: R wi: I w z: R zj: J z q: w + z = h
H: Funext R: Ring I, J: Ideal R x: Tr (-1)
{pat : {x : _ & I x} * {x : _ & J x} &
(fst pat).1 + (snd pat).1 = ring_one}
Coprime I J
H: Funext R: Ring I, J: Ideal R x: {pat : {x : _ & I x} * {x : _ & J x} &
(fst pat).1 + (snd pat).1 = ring_one}
Coprime I J
H: Funext R: Ring I, J: Ideal R x: {pat : {x : _ & I x} * {x : _ & J x} &
(fst pat).1 + (snd pat).1 = ring_one} r: R
ideal_sum I J r <-> ideal_unit R r
H: Funext R: Ring I, J: Ideal R x: {pat : {x : _ & I x} * {x : _ & J x} &
(fst pat).1 + (snd pat).1 = ring_one} r: R
ideal_unit R r -> ideal_sum I J r
H: Funext R: Ring I, J: Ideal R x: {pat : {x : _ & I x} * {x : _ & J x} &
(fst pat).1 + (snd pat).1 = ring_one} r: R
ideal_sum I J r
H: Funext R: Ring I, J: Ideal R x: R xi: I x y: R yj: J y p: x + y = ring_one r: R
ideal_sum I J r
H: Funext R: Ring I, J: Ideal R x: R xi: I x y: R yj: J y p: x + y = ring_one r: R
ideal_sum I J (r * 1)
H: Funext R: Ring I, J: Ideal R x: R xi: I x y: R yj: J y p: x + y = 1 r: R
ideal_sum I J (r * 1)
H: Funext R: Ring I, J: Ideal R x: R xi: I x y: R yj: J y p: x + y = 1 r: R
ideal_sum I J (r * (x + y))
H: Funext R: Ring I, J: Ideal R x: R xi: I x y: R yj: J y p: x + y = 1 r: R
ideal_sum I J (r * x + r * y)
H: Funext R: Ring I, J: Ideal R x: R xi: I x y: R yj: J y p: x + y = 1 r: R
subgroup_generated_type
(funx : R => (I x + J x)%type) (r * x + r * y)
H: Funext R: Ring I, J: Ideal R x: R xi: I x y: R yj: J y p: x + y = 1 r: R
subgroup_generated_type
(funx : R => (I x + J x)%type) (r * x)
H: Funext R: Ring I, J: Ideal R x: R xi: I x y: R yj: J y p: x + y = 1 r: R
subgroup_generated_type
(funx : R => (I x + J x)%type) (r * y)
H: Funext R: Ring I, J: Ideal R x: R xi: I x y: R yj: J y p: x + y = 1 r: R
subgroup_generated_type
(funx : R => (I x + J x)%type) (r * x)
H: Funext R: Ring I, J: Ideal R x: R xi: I x y: R yj: J y p: x + y = 1 r: R
(I (mult r x) + J (mult r x))%type
H: Funext R: Ring I, J: Ideal R x: R xi: I x y: R yj: J y p: x + y = 1 r: R
I (r * x)
byapply isleftideal.
H: Funext R: Ring I, J: Ideal R x: R xi: I x y: R yj: J y p: x + y = 1 r: R
subgroup_generated_type
(funx : R => (I x + J x)%type) (r * y)
H: Funext R: Ring I, J: Ideal R x: R xi: I x y: R yj: J y p: x + y = 1 r: R
(I (mult r y) + J (mult r y))%type
H: Funext R: Ring I, J: Ideal R x: R xi: I x y: R yj: J y p: x + y = 1 r: R
J (r * y)
byapply isleftideal.Defined.(** *** Ideal notations *)(** We declare and import a module for various (Unicode) ideal notations. These exist in their own special case, and can be imported and used in other files when needing to reason about ideals. *)ModuleImportNotation.Infix"⊆" := ideal_subset : ideal_scope.Infix"↔" := ideal_eq : ideal_scope.Infix"+" := ideal_sum : ideal_scope.Infix"⋅" := ideal_product : ideal_scope.Infix"∩" := ideal_intersection : ideal_scope.Infix"::" := ideal_quotient : ideal_scope.Notation"〈 X 〉" := (ideal_generated X) : ideal_scope.NotationAnn := ideal_annihilator.EndNotation.(** *** Ideal lemmas *)SectionIdealLemmas.Context {R : Ring}.(** Subset relation is antisymmetric. *)
R: Ring I, J: Subgroup R
I ⊆ J -> J ⊆ I -> I ↔ J
R: Ring I, J: Subgroup R
I ⊆ J -> J ⊆ I -> I ↔ J
intros p q x; split; byrevert x.Defined.(** The zero ideal is contained in all ideals. *)
R: Ring I: Subgroup R
ideal_zero R ⊆ I
R: Ring I: Subgroup R
ideal_zero R ⊆ I
intros x p; rewrite p; apply ideal_in_zero.Defined.(** The unit ideal contains all ideals. *)
R: Ring I: Subgroup R
I ⊆ ideal_unit R
R: Ring I: Subgroup R
I ⊆ ideal_unit R
hnf; cbn; trivial.Defined.(** Intersection includes into the left *)
R: Ring I, J: Ideal R
I ∩ J ⊆ I
R: Ring I, J: Ideal R
I ∩ J ⊆ I
intro; exact fst.Defined.(** Intersection includes into the right *)
R: Ring I, J: Ideal R
I ∩ J ⊆ J
R: Ring I, J: Ideal R
I ∩ J ⊆ J
intro; exact snd.Defined.(** Subsets of intersections *)
R: Ring I, J, K: Ideal R
K ⊆ I -> K ⊆ J -> K ⊆ I ∩ J
R: Ring I, J, K: Ideal R
K ⊆ I -> K ⊆ J -> K ⊆ I ∩ J
intros p q x r; specialize (p x r); specialize (q x r); bysplit.Defined.(** Ideals include into their sum on the left *)
R: Ring I, J: Ideal R
I ⊆ (I + J)
R: Ring I, J: Ideal R
I ⊆ (I + J)
R: Ring I, J: Ideal R x: R p: I x
(I + J) x
R: Ring I, J: Ideal R x: R p: I x
(I x + J x)%type
left; exact p.Defined.(** Ideals include into their sum on the right *)
R: Ring I, J: Ideal R
J ⊆ (I + J)
R: Ring I, J: Ideal R
J ⊆ (I + J)
R: Ring I, J: Ideal R x: R p: J x
(I + J) x
R: Ring I, J: Ideal R x: R p: J x
(I x + J x)%type
right; exact p.Defined.#[local] Hint Extern4 => progress (cbv beta iota) : typeclass_instances.(** Products of ideals are included in their left factor *)
R: Ring I, J: Ideal R
I ⋅ J ⊆ I
R: Ring I, J: Ideal R
I ⋅ J ⊆ I
R: Ring I, J: Ideal R r: R p: (I ⋅ J) r
I r
R: Ring I, J: Ideal R r: R p: subgroup_generated_type
(ideal_product_naive_type I J) r
I r
R: Ring I, J: Ideal R r: R i: ideal_product_naive_type I J r
I r
R: Ring I, J: Ideal R
I mon_unit
R: Ring I, J: Ideal R r, s: R p1: subgroup_generated_type
(ideal_product_naive_type I J) r p2: subgroup_generated_type
(ideal_product_naive_type I J) s IHp1: I r IHp2: I s
I (sg_op r (inv s))
R: Ring I, J: Ideal R r: R i: ideal_product_naive_type I J r
I r
R: Ring I, J: Ideal R s, t: R s0: I s s1: J t
I (s * t)
by rapply isrightideal.
R: Ring I, J: Ideal R
I mon_unit
rapply ideal_in_zero.
R: Ring I, J: Ideal R r, s: R p1: subgroup_generated_type
(ideal_product_naive_type I J) r p2: subgroup_generated_type
(ideal_product_naive_type I J) s IHp1: I r IHp2: I s
I (sg_op r (inv s))
by rapply ideal_in_plus_negate.Defined.(** Products of ideals are included in their right factor. *)
R: Ring I, J: Ideal R
I ⋅ J ⊆ J
R: Ring I, J: Ideal R
I ⋅ J ⊆ J
R: Ring I, J: Ideal R r: R p: (I ⋅ J) r
J r
R: Ring I, J: Ideal R r: R p: subgroup_generated_type
(ideal_product_naive_type I J) r
J r
R: Ring I, J: Ideal R r: R i: ideal_product_naive_type I J r
J r
R: Ring I, J: Ideal R
J mon_unit
R: Ring I, J: Ideal R r, s: R p1: subgroup_generated_type
(ideal_product_naive_type I J) r p2: subgroup_generated_type
(ideal_product_naive_type I J) s IHp1: J r IHp2: J s
J (sg_op r (inv s))
R: Ring I, J: Ideal R r: R i: ideal_product_naive_type I J r
J r
R: Ring I, J: Ideal R s, t: R s0: I s s1: J t
J (s * t)
byapply isleftideal.
R: Ring I, J: Ideal R
J mon_unit
rapply ideal_in_zero.
R: Ring I, J: Ideal R r, s: R p1: subgroup_generated_type
(ideal_product_naive_type I J) r p2: subgroup_generated_type
(ideal_product_naive_type I J) s IHp1: J r IHp2: J s
J (sg_op r (inv s))
by rapply ideal_in_plus_negate.Defined.(** Products of ideals preserve subsets on the left *)
R: Ring I, J, K: Ideal R
I ⊆ J -> I ⋅ K ⊆ J ⋅ K
R: Ring I, J, K: Ideal R
I ⊆ J -> I ⋅ K ⊆ J ⋅ K
R: Ring I, J, K: Ideal R p: I ⊆ J r: R q: (I ⋅ K) r
(J ⋅ K) r
R: Ring I, J, K: Ideal R p: I ⊆ J r: R q: subgroup_generated_type
(ideal_product_naive_type I K) r
(J ⋅ K) r
R: Ring I, J, K: Ideal R p: I ⊆ J r: R i: ideal_product_naive_type I K r
(J ⋅ K) r
R: Ring I, J, K: Ideal R p: I ⊆ J
(J ⋅ K) mon_unit
R: Ring I, J, K: Ideal R p: I ⊆ J r, s: R q1: subgroup_generated_type
(ideal_product_naive_type I K) r q2: subgroup_generated_type
(ideal_product_naive_type I K) s IHq1: (J ⋅ K) r IHq2: (J ⋅ K) s
(J ⋅ K) (sg_op r (inv s))
R: Ring I, J, K: Ideal R p: I ⊆ J r: R i: ideal_product_naive_type I K r
(J ⋅ K) r
R: Ring I, J, K: Ideal R p: I ⊆ J x, y: R s: I x s0: K y
(J ⋅ K) (x * y)
R: Ring I, J, K: Ideal R p: I ⊆ J x, y: R s: I x s0: K y
J x
R: Ring I, J, K: Ideal R p: I ⊆ J x, y: R s: I x s0: K y
K y
R: Ring I, J, K: Ideal R p: I ⊆ J x, y: R s: I x s0: K y
I x
R: Ring I, J, K: Ideal R p: I ⊆ J x, y: R s: I x s0: K y
K y
1,2: assumption.
R: Ring I, J, K: Ideal R p: I ⊆ J
(J ⋅ K) mon_unit
apply ideal_in_zero.
R: Ring I, J, K: Ideal R p: I ⊆ J r, s: R q1: subgroup_generated_type
(ideal_product_naive_type I K) r q2: subgroup_generated_type
(ideal_product_naive_type I K) s IHq1: (J ⋅ K) r IHq2: (J ⋅ K) s
(J ⋅ K) (sg_op r (inv s))
byapply ideal_in_plus_negate.Defined.(** Products of ideals preserve subsets on the right *)
R: Ring I, J, K: Ideal R
I ⊆ J -> K ⋅ I ⊆ K ⋅ J
R: Ring I, J, K: Ideal R
I ⊆ J -> K ⋅ I ⊆ K ⋅ J
R: Ring I, J, K: Ideal R p: I ⊆ J r: R q: (K ⋅ I) r
(K ⋅ J) r
R: Ring I, J, K: Ideal R p: I ⊆ J r: R q: subgroup_generated_type
(ideal_product_naive_type K I) r
(K ⋅ J) r
R: Ring I, J, K: Ideal R p: I ⊆ J r: R i: ideal_product_naive_type K I r
(K ⋅ J) r
R: Ring I, J, K: Ideal R p: I ⊆ J
(K ⋅ J) mon_unit
R: Ring I, J, K: Ideal R p: I ⊆ J r, s: R q1: subgroup_generated_type
(ideal_product_naive_type K I) r q2: subgroup_generated_type
(ideal_product_naive_type K I) s IHq1: (K ⋅ J) r IHq2: (K ⋅ J) s
(K ⋅ J) (sg_op r (inv s))
R: Ring I, J, K: Ideal R p: I ⊆ J r: R i: ideal_product_naive_type K I r
(K ⋅ J) r
R: Ring I, J, K: Ideal R p: I ⊆ J x, y: R s: K x s0: I y
(K ⋅ J) (x * y)
R: Ring I, J, K: Ideal R p: I ⊆ J x, y: R s: K x s0: I y
K x
R: Ring I, J, K: Ideal R p: I ⊆ J x, y: R s: K x s0: I y
J y
R: Ring I, J, K: Ideal R p: I ⊆ J x, y: R s: K x s0: I y
K x
R: Ring I, J, K: Ideal R p: I ⊆ J x, y: R s: K x s0: I y
I y
1,2: assumption.
R: Ring I, J, K: Ideal R p: I ⊆ J
(K ⋅ J) mon_unit
apply ideal_in_zero.
R: Ring I, J, K: Ideal R p: I ⊆ J r, s: R q1: subgroup_generated_type
(ideal_product_naive_type K I) r q2: subgroup_generated_type
(ideal_product_naive_type K I) s IHq1: (K ⋅ J) r IHq2: (K ⋅ J) s
(K ⋅ J) (sg_op r (inv s))
byapply ideal_in_plus_negate.Defined.(** TODO: *)(** The product of ideals is an associative operation. *)(* Lemma ideal_product_assoc (I J K : Ideal R) : I ⋅ (J ⋅ K) ↔ (I ⋅ J) ⋅ K. Proof. intros r; split; exact Trunc_functor. Abort. *)(** Products of ideals are subsets of their intersection. *)
R: Ring I, J: Ideal R
I ⋅ J ⊆ I ∩ J
R: Ring I, J: Ideal R
I ⋅ J ⊆ I ∩ J
R: Ring I, J: Ideal R
I ⋅ J ⊆ I
R: Ring I, J: Ideal R
I ⋅ J ⊆ J
R: Ring I, J: Ideal R
I ⋅ J ⊆ I
apply ideal_product_subset_l.
R: Ring I, J: Ideal R
I ⋅ J ⊆ J
apply ideal_product_subset_r.Defined.(** Sums of ideals are the smallest ideal containing the summands. *)
R: Ring I, J, K: Ideal R
I ⊆ K -> J ⊆ K -> (I + J) ⊆ K
R: Ring I, J, K: Ideal R
I ⊆ K -> J ⊆ K -> (I + J) ⊆ K
R: Ring I, J, K: Ideal R p: I ⊆ K q: J ⊆ K
(I + J) ⊆ K
R: Ring I, J, K: Ideal R p: I ⊆ K q: J ⊆ K
K mon_unit
R: Ring I, J, K: Ideal R p: I ⊆ K q: J ⊆ K
forallxy : R,
subgroup_generated_type
(funx0 : R => (I x0 + J x0)%type) x ->
subgroup_generated_type
(funx0 : R => (I x0 + J x0)%type) y ->
K x -> K y -> K (x - y)
R: Ring I, J, K: Ideal R p: I ⊆ K q: J ⊆ K
forallxy : R,
subgroup_generated_type
(funx0 : R => (I x0 + J x0)%type) x ->
subgroup_generated_type
(funx0 : R => (I x0 + J x0)%type) y ->
K x -> K y -> K (x - y)
R: Ring I, J, K: Ideal R p: I ⊆ K q: J ⊆ K y, z: R s: subgroup_generated_type
(funx : R => (I x + J x)%type) y t: subgroup_generated_type
(funx : R => (I x + J x)%type) z
K y -> K z -> K (y - z)
rapply ideal_in_plus_negate.Defined.(** Ideals absorb themselves under sum. *)
R: Ring I: Ideal R
I + I ↔ I
R: Ring I: Ideal R
I + I ↔ I
R: Ring I: Ideal R
(I + I) ⊆ I
R: Ring I: Ideal R
I ⊆ (I + I)
R: Ring I: Ideal R
I ⊆ (I + I)
rapply ideal_sum_subset_l.Defined.(** Sums preserve inclusions in the left summand. *)
R: Ring I, J, K: Ideal R
I ⊆ J -> (I + K) ⊆ (J + K)
R: Ring I, J, K: Ideal R
I ⊆ J -> (I + K) ⊆ (J + K)
R: Ring I, J, K: Ideal R p: I ⊆ J
(I + K) ⊆ (J + K)
R: Ring I, J, K: Ideal R p: I ⊆ J
I ⊆ (J + K)
R: Ring I, J, K: Ideal R p: I ⊆ J
K ⊆ (J + K)
R: Ring I, J, K: Ideal R p: I ⊆ J
I ⊆ (J + K)
R: Ring I, J, K: Ideal R p: I ⊆ J
I ⊆ J
R: Ring I, J, K: Ideal R p: I ⊆ J
J ⊆ (J + K)
R: Ring I, J, K: Ideal R p: I ⊆ J
J ⊆ (J + K)
apply ideal_sum_subset_l.
R: Ring I, J, K: Ideal R p: I ⊆ J
K ⊆ (J + K)
apply ideal_sum_subset_r.Defined.(** Sums preserve inclusions in the right summand. *)
R: Ring I, J, K: Ideal R
I ⊆ J -> (K + I) ⊆ (K + J)
R: Ring I, J, K: Ideal R
I ⊆ J -> (K + I) ⊆ (K + J)
R: Ring I, J, K: Ideal R p: I ⊆ J
(K + I) ⊆ (K + J)
R: Ring I, J, K: Ideal R p: I ⊆ J
K ⊆ (K + J)
R: Ring I, J, K: Ideal R p: I ⊆ J
I ⊆ (K + J)
R: Ring I, J, K: Ideal R p: I ⊆ J
I ⊆ (K + J)
R: Ring I, J, K: Ideal R p: I ⊆ J
I ⊆ J
R: Ring I, J, K: Ideal R p: I ⊆ J
J ⊆ (K + J)
R: Ring I, J, K: Ideal R p: I ⊆ J
J ⊆ (K + J)
apply ideal_sum_subset_r.Defined.(** Products left distribute over sums *)(** Note that this follows from left adjoints preserving colimits. The product of ideals is a functor whose right adjoint is the quotient ideal. *)
R: Ring I, J, K: Ideal R
I ⋅ (J + K) ↔ I ⋅ J + I ⋅ K
R: Ring I, J, K: Ideal R
I ⋅ (J + K) ↔ I ⋅ J + I ⋅ K
(** We split into two directions. *)
R: Ring I, J, K: Ideal R
I ⋅ (J + K) ⊆ (I ⋅ J + I ⋅ K)
R: Ring I, J, K: Ideal R
(I ⋅ J + I ⋅ K) ⊆ I ⋅ (J + K)
(** We deal with the difficult inclusion first. The proof comes down to breaking down the definition and reassembling into the right. *)
R: Ring I, J, K: Ideal R
I ⋅ (J + K) ⊆ (I ⋅ J + I ⋅ K)
R: Ring I, J, K: Ideal R r: R p: (I ⋅ (J + K)) r
(I ⋅ J + I ⋅ K) r
R: Ring I, J, K: Ideal R r: R p: subgroup_generated_type
(ideal_product_naive_type I (J + K)) r
(I ⋅ J + I ⋅ K) r
R: Ring I, J, K: Ideal R r: R i: ideal_product_naive_type I (J + K) r
(I ⋅ J + I ⋅ K) r
R: Ring I, J, K: Ideal R
(I ⋅ J + I ⋅ K) mon_unit
R: Ring I, J, K: Ideal R r, s: R p1: subgroup_generated_type
(ideal_product_naive_type I (J + K)) r p2: subgroup_generated_type
(ideal_product_naive_type I (J + K)) s IHp1: (I ⋅ J + I ⋅ K) r IHp2: (I ⋅ J + I ⋅ K) s
(I ⋅ J + I ⋅ K) (sg_op r (inv s))
R: Ring I, J, K: Ideal R r: R i: ideal_product_naive_type I (J + K) r
(I ⋅ J + I ⋅ K) r
R: Ring I, J, K: Ideal R r, s: R p: I r q: (J + K) s
(I ⋅ J + I ⋅ K) (r * s)
R: Ring I, J, K: Ideal R r, s: R p: I r q: subgroup_generated_type
(funx : R => (J x + K x)%type) s
(I ⋅ J + I ⋅ K) (r * s)
R: Ring I, J, K: Ideal R r: R p: I r t: R k: (J t + K t)%type
(I ⋅ J + I ⋅ K) (r * t)
R: Ring I, J, K: Ideal R r: R p: I r
(I ⋅ J + I ⋅ K) (r * mon_unit)
R: Ring I, J, K: Ideal R r: R p: I r t, k: R p1: subgroup_generated_type
(funx : R => (J x + K x)%type) t p2: subgroup_generated_type
(funx : R => (J x + K x)%type) k IHp1: (I ⋅ J + I ⋅ K) (r * t) IHp2: (I ⋅ J + I ⋅ K) (r * k)
(I ⋅ J + I ⋅ K) (r * sg_op t (inv k))
R: Ring I, J, K: Ideal R r: R p: I r t: R k: (J t + K t)%type
(I ⋅ J + I ⋅ K) (r * t)
R: Ring I, J, K: Ideal R r: R p: I r t: R k: (J t + K t)%type
((I ⋅ J) (mult r t) + (I ⋅ K) (mult r t))%type
R: Ring I, J, K: Ideal R r: R p: I r t: R j: J t
((I ⋅ J) (mult r t) + (I ⋅ K) (mult r t))%type
R: Ring I, J, K: Ideal R r: R p: I r t: R k: K t
((I ⋅ J) (mult r t) + (I ⋅ K) (mult r t))%type
R: Ring I, J, K: Ideal R r: R p: I r t: R j: J t
((I ⋅ J) (mult r t) + (I ⋅ K) (mult r t))%type
left; byapply tr, sgt_in, ipn_in.
R: Ring I, J, K: Ideal R r: R p: I r t: R k: K t
((I ⋅ J) (mult r t) + (I ⋅ K) (mult r t))%type
right; byapply tr, sgt_in, ipn_in.
R: Ring I, J, K: Ideal R r: R p: I r
(I ⋅ J + I ⋅ K) (r * mon_unit)
R: Ring I, J, K: Ideal R r: R p: I r
(I ⋅ J) (r * mon_unit)
R: Ring I, J, K: Ideal R r: R p: I r
(I ⋅ J) 0
apply ideal_in_zero.
R: Ring I, J, K: Ideal R r: R p: I r t, k: R p1: subgroup_generated_type
(funx : R => (J x + K x)%type) t p2: subgroup_generated_type
(funx : R => (J x + K x)%type) k IHp1: (I ⋅ J + I ⋅ K) (r * t) IHp2: (I ⋅ J + I ⋅ K) (r * k)
(I ⋅ J + I ⋅ K) (r * sg_op t (inv k))
R: Ring I, J, K: Ideal R r: R p: I r t, k: R p1: subgroup_generated_type
(funx : R => (J x + K x)%type) t p2: subgroup_generated_type
(funx : R => (J x + K x)%type) k IHp1: (I ⋅ J + I ⋅ K) (r * t) IHp2: (I ⋅ J + I ⋅ K) (r * k)
(I ⋅ J + I ⋅ K) (plus (r * t) (r * inv k))
R: Ring I, J, K: Ideal R r: R p: I r t, k: R p1: subgroup_generated_type
(funx : R => (J x + K x)%type) t p2: subgroup_generated_type
(funx : R => (J x + K x)%type) k IHp1: (I ⋅ J + I ⋅ K) (r * t) IHp2: (I ⋅ J + I ⋅ K) (r * k)
(I ⋅ J + I ⋅ K) (r * t - r * k)
byapply ideal_in_plus_negate.
R: Ring I, J, K: Ideal R
(I ⋅ J + I ⋅ K) mon_unit
apply ideal_in_zero.
R: Ring I, J, K: Ideal R r, s: R p1: subgroup_generated_type
(ideal_product_naive_type I (J + K)) r p2: subgroup_generated_type
(ideal_product_naive_type I (J + K)) s IHp1: (I ⋅ J + I ⋅ K) r IHp2: (I ⋅ J + I ⋅ K) s
(I ⋅ J + I ⋅ K) (sg_op r (inv s))
byapply ideal_in_plus_negate.
R: Ring I, J, K: Ideal R
(I ⋅ J + I ⋅ K) ⊆ I ⋅ (J + K)
(** This is the easy direction which can use previous lemmas. *)
R: Ring I, J, K: Ideal R
I ⋅ J ⊆ I ⋅ (J + K)
R: Ring I, J, K: Ideal R
I ⋅ K ⊆ I ⋅ (J + K)
R: Ring I, J, K: Ideal R
J ⊆ (J + K)
R: Ring I, J, K: Ideal R
K ⊆ (J + K)
R: Ring I, J, K: Ideal R
K ⊆ (J + K)
apply ideal_sum_subset_r.Defined.(** Products distribute over sums on the right. *)(** The proof is very similar to the left version *)
R: Ring I, J, K: Ideal R
(I + J) ⋅ K ↔ I ⋅ K + J ⋅ K
R: Ring I, J, K: Ideal R
(I + J) ⋅ K ↔ I ⋅ K + J ⋅ K
R: Ring I, J, K: Ideal R
(I + J) ⋅ K ⊆ (I ⋅ K + J ⋅ K)
R: Ring I, J, K: Ideal R
(I ⋅ K + J ⋅ K) ⊆ (I + J) ⋅ K
R: Ring I, J, K: Ideal R
(I + J) ⋅ K ⊆ (I ⋅ K + J ⋅ K)
R: Ring I, J, K: Ideal R r: R p: ((I + J) ⋅ K) r
(I ⋅ K + J ⋅ K) r
R: Ring I, J, K: Ideal R r: R p: subgroup_generated_type
(ideal_product_naive_type (I + J) K) r
(I ⋅ K + J ⋅ K) r
R: Ring I, J, K: Ideal R r: R i: ideal_product_naive_type (I + J) K r
(I ⋅ K + J ⋅ K) r
R: Ring I, J, K: Ideal R
(I ⋅ K + J ⋅ K) mon_unit
R: Ring I, J, K: Ideal R r, s: R p1: subgroup_generated_type
(ideal_product_naive_type (I + J) K) r p2: subgroup_generated_type
(ideal_product_naive_type (I + J) K) s IHp1: (I ⋅ K + J ⋅ K) r IHp2: (I ⋅ K + J ⋅ K) s
(I ⋅ K + J ⋅ K) (sg_op r (inv s))
R: Ring I, J, K: Ideal R r: R i: ideal_product_naive_type (I + J) K r
(I ⋅ K + J ⋅ K) r
R: Ring I, J, K: Ideal R r, s: R p: (I + J) r q: K s
(I ⋅ K + J ⋅ K) (r * s)
R: Ring I, J, K: Ideal R r, s: R q: K s p: subgroup_generated_type
(funx : R => (I x + J x)%type) r
(I ⋅ K + J ⋅ K) (r * s)
R: Ring I, J, K: Ideal R s: R q: K s t: R k: (I t + J t)%type
(I ⋅ K + J ⋅ K) (t * s)
R: Ring I, J, K: Ideal R s: R q: K s
(I ⋅ K + J ⋅ K) (mon_unit * s)
R: Ring I, J, K: Ideal R s: R q: K s t, k: R p1: subgroup_generated_type
(funx : R => (I x + J x)%type) t p2: subgroup_generated_type
(funx : R => (I x + J x)%type) k IHp1: (I ⋅ K + J ⋅ K) (t * s) IHp2: (I ⋅ K + J ⋅ K) (k * s)
(I ⋅ K + J ⋅ K) (sg_op t (inv k) * s)
R: Ring I, J, K: Ideal R s: R q: K s t: R k: (I t + J t)%type
(I ⋅ K + J ⋅ K) (t * s)
R: Ring I, J, K: Ideal R s: R q: K s t: R k: (I t + J t)%type
((I ⋅ K) (mult t s) + (J ⋅ K) (mult t s))%type
R: Ring I, J, K: Ideal R s: R q: K s t: R j: I t
((I ⋅ K) (mult t s) + (J ⋅ K) (mult t s))%type
R: Ring I, J, K: Ideal R s: R q: K s t: R k: J t
((I ⋅ K) (mult t s) + (J ⋅ K) (mult t s))%type
R: Ring I, J, K: Ideal R s: R q: K s t: R j: I t
((I ⋅ K) (mult t s) + (J ⋅ K) (mult t s))%type
left; byapply tr, sgt_in, ipn_in.
R: Ring I, J, K: Ideal R s: R q: K s t: R k: J t
((I ⋅ K) (mult t s) + (J ⋅ K) (mult t s))%type
right; byapply tr, sgt_in, ipn_in.
R: Ring I, J, K: Ideal R s: R q: K s
(I ⋅ K + J ⋅ K) (mon_unit * s)
R: Ring I, J, K: Ideal R s: R q: K s
(I ⋅ K) (mon_unit * s)
R: Ring I, J, K: Ideal R s: R q: K s
(I ⋅ K) 0
apply ideal_in_zero.
R: Ring I, J, K: Ideal R s: R q: K s t, k: R p1: subgroup_generated_type
(funx : R => (I x + J x)%type) t p2: subgroup_generated_type
(funx : R => (I x + J x)%type) k IHp1: (I ⋅ K + J ⋅ K) (t * s) IHp2: (I ⋅ K + J ⋅ K) (k * s)
(I ⋅ K + J ⋅ K) (sg_op t (inv k) * s)
R: Ring I, J, K: Ideal R s: R q: K s t, k: R p1: subgroup_generated_type
(funx : R => (I x + J x)%type) t p2: subgroup_generated_type
(funx : R => (I x + J x)%type) k IHp1: (I ⋅ K + J ⋅ K) (t * s) IHp2: (I ⋅ K + J ⋅ K) (k * s)
(I ⋅ K + J ⋅ K) (plus (t * s) (inv k * s))
R: Ring I, J, K: Ideal R s: R q: K s t, k: R p1: subgroup_generated_type
(funx : R => (I x + J x)%type) t p2: subgroup_generated_type
(funx : R => (I x + J x)%type) k IHp1: (I ⋅ K + J ⋅ K) (t * s) IHp2: (I ⋅ K + J ⋅ K) (k * s)
(I ⋅ K + J ⋅ K) (t * s - k * s)
byapply ideal_in_plus_negate.
R: Ring I, J, K: Ideal R
(I ⋅ K + J ⋅ K) mon_unit
apply ideal_in_zero.
R: Ring I, J, K: Ideal R r, s: R p1: subgroup_generated_type
(ideal_product_naive_type (I + J) K) r p2: subgroup_generated_type
(ideal_product_naive_type (I + J) K) s IHp1: (I ⋅ K + J ⋅ K) r IHp2: (I ⋅ K + J ⋅ K) s
(I ⋅ K + J ⋅ K) (sg_op r (inv s))
byapply ideal_in_plus_negate.
R: Ring I, J, K: Ideal R
(I ⋅ K + J ⋅ K) ⊆ (I + J) ⋅ K
R: Ring I, J, K: Ideal R
I ⋅ K ⊆ (I + J) ⋅ K
R: Ring I, J, K: Ideal R
J ⋅ K ⊆ (I + J) ⋅ K
R: Ring I, J, K: Ideal R
I ⊆ (I + J)
R: Ring I, J, K: Ideal R
J ⊆ (I + J)
R: Ring I, J, K: Ideal R
J ⊆ (I + J)
apply ideal_sum_subset_r.Defined.(** Ideal sums are commutative *)
R: Ring I, J: Ideal R
I + J ↔ J + I
R: Ring I, J: Ideal R
I + J ↔ J + I
R: Ring I, J: Ideal R
I ⊆ (J + I)
R: Ring I, J: Ideal R
J ⊆ (J + I)
R: Ring I, J: Ideal R
J ⊆ (I + J)
R: Ring I, J: Ideal R
I ⊆ (I + J)
R: Ring I, J: Ideal R
J ⊆ (J + I)
R: Ring I, J: Ideal R
I ⊆ (I + J)
1,2: apply ideal_sum_subset_l.Defined.(** Zero ideal is left additive identity. *)
R: Ring I: Ideal R
ideal_zero R + I ↔ I
R: Ring I: Ideal R
ideal_zero R + I ↔ I
R: Ring I: Ideal R
(ideal_zero R + I) ⊆ I
R: Ring I: Ideal R
I ⊆ (ideal_zero R + I)
R: Ring I: Ideal R
ideal_zero R ⊆ I
R: Ring I: Ideal R
I ⊆ I
R: Ring I: Ideal R
I ⊆ (ideal_zero R + I)
R: Ring I: Ideal R
I ⊆ I
R: Ring I: Ideal R
I ⊆ (ideal_zero R + I)
R: Ring I: Ideal R
I ⊆ (ideal_zero R + I)
apply ideal_sum_subset_r.Defined.(** Zero ideal is right additive identity. *)
R: Ring I: Ideal R
I + ideal_zero R ↔ I
R: Ring I: Ideal R
I + ideal_zero R ↔ I
R: Ring I: Ideal R
(I + ideal_zero R) ⊆ I
R: Ring I: Ideal R
I ⊆ (I + ideal_zero R)
R: Ring I: Ideal R
I ⊆ I
R: Ring I: Ideal R
ideal_zero R ⊆ I
R: Ring I: Ideal R
I ⊆ (I + ideal_zero R)
R: Ring I: Ideal R
ideal_zero R ⊆ I
R: Ring I: Ideal R
I ⊆ (I + ideal_zero R)
R: Ring I: Ideal R
I ⊆ (I + ideal_zero R)
apply ideal_sum_subset_l.Defined.(** Unit ideal is left multiplicative identity. *)
R: Ring I: Ideal R
ideal_unit R ⋅ I ↔ I
R: Ring I: Ideal R
ideal_unit R ⋅ I ↔ I
R: Ring I: Ideal R
ideal_unit R ⋅ I ⊆ I
R: Ring I: Ideal R
I ⊆ ideal_unit R ⋅ I
R: Ring I: Ideal R
I ⊆ ideal_unit R ⋅ I
R: Ring I: Ideal R r: R p: I r
(ideal_unit R ⋅ I) r
R: Ring I: Ideal R r: R p: I r
(ideal_unit R ⋅ I) (1 * r)
byapply tr, sgt_in, ipn_in.Defined.(** Unit ideal is right multiplicative identity. *)
R: Ring I: Ideal R
I ⋅ ideal_unit R ↔ I
R: Ring I: Ideal R
I ⋅ ideal_unit R ↔ I
R: Ring I: Ideal R
I ⋅ ideal_unit R ⊆ I
R: Ring I: Ideal R
I ⊆ I ⋅ ideal_unit R
R: Ring I: Ideal R
I ⊆ I ⋅ ideal_unit R
R: Ring I: Ideal R r: R p: I r
(I ⋅ ideal_unit R) r
R: Ring I: Ideal R r: R p: I r
(I ⋅ ideal_unit R) (r * 1)
byapply tr, sgt_in, ipn_in.Defined.(** Intersecting with unit ideal on the left does nothing. *)
R: Ring I: Ideal R
ideal_unit R ∩ I ↔ I
R: Ring I: Ideal R
ideal_unit R ∩ I ↔ I
R: Ring I: Ideal R
ideal_unit R ∩ I ⊆ I
R: Ring I: Ideal R
I ⊆ ideal_unit R ∩ I
R: Ring I: Ideal R
I ⊆ ideal_unit R ∩ I
R: Ring I: Ideal R
I ⊆ ideal_unit R
R: Ring I: Ideal R
I ⊆ I
R: Ring I: Ideal R
I ⊆ I
reflexivity.Defined.(** Intersecting with unit ideal on right does nothing. *)
R: Ring I: Ideal R
I ∩ ideal_unit R ↔ I
R: Ring I: Ideal R
I ∩ ideal_unit R ↔ I
R: Ring I: Ideal R
I ∩ ideal_unit R ⊆ I
R: Ring I: Ideal R
I ⊆ I ∩ ideal_unit R
R: Ring I: Ideal R
I ⊆ I ∩ ideal_unit R
R: Ring I: Ideal R
I ⊆ I
R: Ring I: Ideal R
I ⊆ ideal_unit R
R: Ring I: Ideal R
I ⊆ ideal_unit R
apply ideal_unit_subset.Defined.(** Product of intersection and sum is subset of sum of products *)
R: Ring I, J: Ideal R
(I ∩ J) ⋅ (I + J) ⊆ (I ⋅ J + J ⋅ I)
R: Ring I, J: Ideal R
(I ∩ J) ⋅ (I + J) ⊆ (I ⋅ J + J ⋅ I)
R: Ring I, J: Ideal R
(I ∩ J) ⋅ (I + J) ⊆ ?Goal
R: Ring I, J: Ideal R
?Goal ⊆ (I ⋅ J + J ⋅ I)
R: Ring I, J: Ideal R
((I ∩ J) ⋅ I + (I ∩ J) ⋅ J) ⊆ (I ⋅ J + J ⋅ I)
R: Ring I, J: Ideal R
((I ∩ J) ⋅ I + (I ∩ J) ⋅ J) ⊆ ?Goal
R: Ring I, J: Ideal R
?Goal ⊆ (I ⋅ J + J ⋅ I)
R: Ring I, J: Ideal R
(I ∩ J) ⋅ J ⊆ ?Goal0
R: Ring I, J: Ideal R
((I ∩ J) ⋅ I + ?Goal0) ⊆ (I ⋅ J + J ⋅ I)
R: Ring I, J: Ideal R
I ∩ J ⊆ ?Goal0
R: Ring I, J: Ideal R
((I ∩ J) ⋅ I + ?Goal0 ⋅ J) ⊆ (I ⋅ J + J ⋅ I)
R: Ring I, J: Ideal R
((I ∩ J) ⋅ I + I ⋅ J) ⊆ (I ⋅ J + J ⋅ I)
R: Ring I, J: Ideal R
((I ∩ J) ⋅ I + I ⋅ J) ⊆ ?Goal
R: Ring I, J: Ideal R
?Goal ⊆ (I ⋅ J + J ⋅ I)
R: Ring I, J: Ideal R
(I ∩ J) ⋅ I ⊆ ?Goal0
R: Ring I, J: Ideal R
(?Goal0 + I ⋅ J) ⊆ (I ⋅ J + J ⋅ I)
R: Ring I, J: Ideal R
I ∩ J ⊆ ?Goal0
R: Ring I, J: Ideal R
(?Goal0 ⋅ I + I ⋅ J) ⊆ (I ⋅ J + J ⋅ I)
R: Ring I, J: Ideal R
(J ⋅ I + I ⋅ J) ⊆ (I ⋅ J + J ⋅ I)
rapply ideal_sum_comm.Defined.(** Ideals are subsets of their ideal quotients *)
R: Ring I, J: Ideal R
I ⊆ (I :: J)
R: Ring I, J: Ideal R
I ⊆ (I :: J)
R: Ring I, J: Ideal R x: R i: I x r: R j: J r
I (x * r)
R: Ring I, J: Ideal R x: R i: I x r: rng_op R j: J r
I (ring_mult r x)
R: Ring I, J: Ideal R x: R i: I x r: R j: J r
I (x * r)
by rapply isrightideal.
R: Ring I, J: Ideal R x: R i: I x r: rng_op R j: J r
I (ring_mult r x)
by rapply isleftideal.Defined.(** If J divides I then the ideal quotient of J by I is trivial. *)
R: Ring I, J: Ideal R
I ⊆ J -> J :: I ↔ ideal_unit R
R: Ring I, J: Ideal R
I ⊆ J -> J :: I ↔ ideal_unit R
R: Ring I, J: Ideal R p: I ⊆ J
J :: I ↔ ideal_unit R
R: Ring I, J: Ideal R p: I ⊆ J
(J :: I) ⊆ ideal_unit R
R: Ring I, J: Ideal R p: I ⊆ J
ideal_unit R ⊆ (J :: I)
R: Ring I, J: Ideal R p: I ⊆ J
ideal_unit R ⊆ (J :: I)
R: Ring I, J: Ideal R p: I ⊆ J r, x: R q: I x
J (r * x)
R: Ring I, J: Ideal R p: I ⊆ J r: R x: rng_op R q: I x
J (ring_mult x r)
R: Ring I, J: Ideal R p: I ⊆ J r, x: R q: I x
J (r * x)
byapply isleftideal, p.
R: Ring I, J: Ideal R p: I ⊆ J r: R x: rng_op R q: I x
J (ring_mult x r)
R: Ring I, J: Ideal R p: I ⊆ J r: R x: rng_op R q: I x
J x
byapply p.Defined.(** The ideal quotient of I by unit is I. *)
R: Ring I: Ideal R
I :: ideal_unit R ↔ I
R: Ring I: Ideal R
I :: ideal_unit R ↔ I
R: Ring I: Ideal R
(I :: ideal_unit R) ⊆ I
R: Ring I: Ideal R
I ⊆ (I :: ideal_unit R)
R: Ring I: Ideal R
(I :: ideal_unit R) ⊆ I
R: Ring I: Ideal R r: R p: leftideal_quotient I (ideal_unit R) r q: rightideal_quotient I (ideal_unit R) r
I r
R: Ring I: Ideal R r: R q: forallx : rng_op R, ideal_unit R x -> I (r * x) p: forallx : R, ideal_unit R x -> I (r * x)
I r
R: Ring I: Ideal R r: R q: forallx : rng_op R, ideal_unit R x -> I (r * x) p: forallx : R, ideal_unit R x -> I (r * x)
I (r * 1)
exact (p ring_one tt).
R: Ring I: Ideal R
I ⊆ (I :: ideal_unit R)
apply ideal_quotient_subset.Defined.(** The ideal quotient of unit by I is unit. *)
R: Ring I: Ideal R
ideal_unit R :: I ↔ ideal_unit R
R: Ring I: Ideal R
ideal_unit R :: I ↔ ideal_unit R
R: Ring I: Ideal R x: R
(ideal_unit R :: I) x -> ideal_unit R x
R: Ring I: Ideal R x: R
ideal_unit R x -> (ideal_unit R :: I) x
R: Ring I: Ideal R x: R
(ideal_unit R :: I) x -> ideal_unit R x
cbn; trivial.
R: Ring I: Ideal R x: R
ideal_unit R x -> (ideal_unit R :: I) x
intros ?; split; apply tr;
cbn; split; trivial.Defined.(** The ideal quotient by a sum is an intersection of ideal quotients. *)
R: Ring I, J, K: Ideal R
I :: J + K ↔ (I :: J) ∩ (I :: K)
R: Ring I, J, K: Ideal R
I :: J + K ↔ (I :: J) ∩ (I :: K)
R: Ring I, J, K: Ideal R
(I :: J + K) ⊆ (I :: J) ∩ (I :: K)
R: Ring I, J, K: Ideal R
(I :: J) ∩ (I :: K) ⊆ (I :: J + K)
R: Ring I, J, K: Ideal R
(I :: J + K) ⊆ (I :: J) ∩ (I :: K)
R: Ring I, J, K: Ideal R r: R q: forallx : rng_op R, (J + K)%ideal x -> I (r * x) p: forallx : R, (J + K)%ideal x -> I (r * x) x: R jk: J x
I (r * x)
R: Ring I, J, K: Ideal R r: R q: forallx : rng_op R, (J + K)%ideal x -> I (r * x) p: forallx : R, (J + K)%ideal x -> I (r * x) x: rng_op R jk: J x
I (r * x)
R: Ring I, J, K: Ideal R r: R q: forallx : rng_op R, (J + K)%ideal x -> I (r * x) p: forallx : R, (J + K)%ideal x -> I (r * x) x: R jk: K x
I (r * x)
R: Ring I, J, K: Ideal R r: R q: forallx : rng_op R, (J + K)%ideal x -> I (r * x) p: forallx : R, (J + K)%ideal x -> I (r * x) x: rng_op R jk: K x
I (r * x)
R: Ring I, J, K: Ideal R r: R q: forallx : rng_op R, (J + K)%ideal x -> I (r * x) p: forallx : R, (J + K)%ideal x -> I (r * x) x: R jk: J x
I (r * x)
by rapply p; rapply ideal_sum_subset_l.
R: Ring I, J, K: Ideal R r: R q: forallx : rng_op R, (J + K)%ideal x -> I (r * x) p: forallx : R, (J + K)%ideal x -> I (r * x) x: rng_op R jk: J x
I (r * x)
by rapply q; rapply ideal_sum_subset_l.
R: Ring I, J, K: Ideal R r: R q: forallx : rng_op R, (J + K)%ideal x -> I (r * x) p: forallx : R, (J + K)%ideal x -> I (r * x) x: R jk: K x
I (r * x)
by rapply p; rapply ideal_sum_subset_r.
R: Ring I, J, K: Ideal R r: R q: forallx : rng_op R, (J + K)%ideal x -> I (r * x) p: forallx : R, (J + K)%ideal x -> I (r * x) x: rng_op R jk: K x
I (r * x)
by rapply q; rapply ideal_sum_subset_r.
R: Ring I, J, K: Ideal R
(I :: J) ∩ (I :: K) ⊆ (I :: J + K)
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) x: R jk: subgroup_generated_type
(funx : R => (J x + K x)%type) x
I (r * x)
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) x: rng_op R jk: subgroup_generated_type
(funx : R => (J x + K x)%type) x
I (r * x)
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) x: R jk: subgroup_generated_type
(funx : R => (J x + K x)%type) x
I (r * x)
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) g: R s: J g
I (r * g)
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) g: R s: K g
I (r * g)
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x)
I (r * mon_unit)
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) g, h: R jk1: subgroup_generated_type (funx : R => (J x + K x)%type) g jk2: subgroup_generated_type (funx : R => (J x + K x)%type) h IHjk1: I (r * g) IHjk2: I (r * h)
I (r * sg_op g (inv h))
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) g: R s: J g
I (r * g)
byapply p.
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) g: R s: K g
I (r * g)
byapply u.
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x)
I (r * mon_unit)
apply u, ideal_in_zero.
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) g, h: R jk1: subgroup_generated_type (funx : R => (J x + K x)%type) g jk2: subgroup_generated_type (funx : R => (J x + K x)%type) h IHjk1: I (r * g) IHjk2: I (r * h)
I (r * sg_op g (inv h))
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) g, h: R jk1: subgroup_generated_type (funx : R => (J x + K x)%type) g jk2: subgroup_generated_type (funx : R => (J x + K x)%type) h IHjk1: I (r * g) IHjk2: I (r * h)
I (plus (r * g) (r * inv h))
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) g, h: R jk1: subgroup_generated_type (funx : R => (J x + K x)%type) g jk2: subgroup_generated_type (funx : R => (J x + K x)%type) h IHjk1: I (r * g) IHjk2: I (r * h)
I (r * g - r * h)
byapply ideal_in_plus_negate.
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) x: rng_op R jk: subgroup_generated_type
(funx : R => (J x + K x)%type) x
I (r * x)
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) g: R s: J g
I (r * g)
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) g: R s: K g
I (r * g)
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x)
I (r * mon_unit)
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) g, h: R jk1: subgroup_generated_type (funx : R => (J x + K x)%type) g jk2: subgroup_generated_type (funx : R => (J x + K x)%type) h IHjk1: I (r * g) IHjk2: I (r * h)
I (r * sg_op g (inv h))
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) g: R s: J g
I (r * g)
byapply q.
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) g: R s: K g
I (r * g)
byapply v.
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x)
I (r * mon_unit)
apply v, ideal_in_zero.
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) g, h: R jk1: subgroup_generated_type (funx : R => (J x + K x)%type) g jk2: subgroup_generated_type (funx : R => (J x + K x)%type) h IHjk1: I (r * g) IHjk2: I (r * h)
I (r * sg_op g (inv h))
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) g, h: R jk1: subgroup_generated_type (funx : R => (J x + K x)%type) g jk2: subgroup_generated_type (funx : R => (J x + K x)%type) h IHjk1: I (r * g) IHjk2: I (r * h)
I ((g - h) * r)
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) g, h: R jk1: subgroup_generated_type (funx : R => (J x + K x)%type) g jk2: subgroup_generated_type (funx : R => (J x + K x)%type) h IHjk1: I (r * g) IHjk2: I (r * h)
I (plus (g * r) (- h * r))
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> I (r * x) u: forallx : R, K x -> I (r * x) q: forallx : rng_op R, J x -> I (r * x) p: forallx : R, J x -> I (r * x) g, h: R jk1: subgroup_generated_type (funx : R => (J x + K x)%type) g jk2: subgroup_generated_type (funx : R => (J x + K x)%type) h IHjk1: I (r * g) IHjk2: I (r * h)
I (g * r - h * r)
byapply ideal_in_plus_negate.Defined.(** Ideal quotients distribute over intersections. *)
R: Ring I, J, K: Ideal R
I ∩ J :: K ↔ (I :: K) ∩ (J :: K)
R: Ring I, J, K: Ideal R
I ∩ J :: K ↔ (I :: K) ∩ (J :: K)
R: Ring I, J, K: Ideal R
(I ∩ J :: K) ⊆ (I :: K) ∩ (J :: K)
R: Ring I, J, K: Ideal R
(I :: K) ∩ (J :: K) ⊆ (I ∩ J :: K)
R: Ring I, J, K: Ideal R
(I ∩ J :: K) ⊆ (I :: K) ∩ (J :: K)
R: Ring I, J, K: Ideal R r: R q: forallx : rng_op R, K x -> (I ∩ J) (r * x) p: forallx : R, K x -> (I ∩ J) (r * x) x: R k: K x
I (r * x)
R: Ring I, J, K: Ideal R r: R q: forallx : rng_op R, K x -> (I ∩ J) (r * x) p: forallx : R, K x -> (I ∩ J) (r * x) x: rng_op R k: K x
I (r * x)
R: Ring I, J, K: Ideal R r: R q: forallx : rng_op R, K x -> (I ∩ J) (r * x) p: forallx : R, K x -> (I ∩ J) (r * x) x: R k: K x
J (r * x)
R: Ring I, J, K: Ideal R r: R q: forallx : rng_op R, K x -> (I ∩ J) (r * x) p: forallx : R, K x -> (I ∩ J) (r * x) x: rng_op R k: K x
J (r * x)
R: Ring I, J, K: Ideal R r: R q: forallx : rng_op R, K x -> (I ∩ J) (r * x) p: forallx : R, K x -> (I ∩ J) (r * x) x: rng_op R k: K x
I (r * x)
R: Ring I, J, K: Ideal R r: R q: forallx : rng_op R, K x -> (I ∩ J) (r * x) p: forallx : R, K x -> (I ∩ J) (r * x) x: rng_op R k: K x
J (r * x)
1,2: byapply q.
R: Ring I, J, K: Ideal R
(I :: K) ∩ (J :: K) ⊆ (I ∩ J :: K)
R: Ring I, J, K: Ideal R r: R p: leftideal_quotient I K r q: rightideal_quotient I K r u: leftideal_quotient J K r v: rightideal_quotient J K r
(I ∩ J :: K) r
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> J (r * x) u: forallx : R, K x -> J (r * x) q: forallx : rng_op R, K x -> I (r * x) p: forallx : R, K x -> I (r * x) x: R k: K x
I (r * x)
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> J (r * x) u: forallx : R, K x -> J (r * x) q: forallx : rng_op R, K x -> I (r * x) p: forallx : R, K x -> I (r * x) x: R k: K x
J (r * x)
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> J (r * x) u: forallx : R, K x -> J (r * x) q: forallx : rng_op R, K x -> I (r * x) p: forallx : R, K x -> I (r * x) x: rng_op R k: K x
I (r * x)
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> J (r * x) u: forallx : R, K x -> J (r * x) q: forallx : rng_op R, K x -> I (r * x) p: forallx : R, K x -> I (r * x) x: rng_op R k: K x
J (r * x)
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> J (r * x) u: forallx : R, K x -> J (r * x) q: forallx : rng_op R, K x -> I (r * x) p: forallx : R, K x -> I (r * x) x: R k: K x
I (r * x)
byapply p.
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> J (r * x) u: forallx : R, K x -> J (r * x) q: forallx : rng_op R, K x -> I (r * x) p: forallx : R, K x -> I (r * x) x: R k: K x
J (r * x)
byapply u.
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> J (r * x) u: forallx : R, K x -> J (r * x) q: forallx : rng_op R, K x -> I (r * x) p: forallx : R, K x -> I (r * x) x: rng_op R k: K x
I (r * x)
byapply q.
R: Ring I, J, K: Ideal R r: R v: forallx : rng_op R, K x -> J (r * x) u: forallx : R, K x -> J (r * x) q: forallx : rng_op R, K x -> I (r * x) p: forallx : R, K x -> I (r * x) x: rng_op R k: K x
J (r * x)
byapply v.Defined.(** Annihilators reverse the order of inclusion. *)
R: Ring I, J: Ideal R
I ⊆ J -> Ann J ⊆ Ann I
R: Ring I, J: Ideal R
I ⊆ J -> Ann J ⊆ Ann I
R: Ring I, J: Ideal R p: I ⊆ J x: R q': forallx0 : rng_op R, J x0 -> x * x0 = ring_zero q: forallx0 : R, J x0 -> x * x0 = ring_zero y: R i: I y
x * y = ring_zero
R: Ring I, J: Ideal R p: I ⊆ J x: R q': forallx0 : rng_op R, J x0 -> x * x0 = ring_zero q: forallx0 : R, J x0 -> x * x0 = ring_zero y: rng_op R i: I y
x * y = ring_zero
R: Ring I, J: Ideal R p: I ⊆ J x: R q': forallx0 : rng_op R, J x0 -> x * x0 = ring_zero q: forallx0 : R, J x0 -> x * x0 = ring_zero y: R i: I y
x * y = ring_zero
byapply q, p.
R: Ring I, J: Ideal R p: I ⊆ J x: R q': forallx0 : rng_op R, J x0 -> x * x0 = ring_zero q: forallx0 : R, J x0 -> x * x0 = ring_zero y: rng_op R i: I y
x * y = ring_zero
byapply q', p.Defined.(** The annihilator of an ideal is equal to a quotient of zero. *)
R: Ring I: Ideal R
Ann I ↔ ideal_zero R :: I
R: Ring I: Ideal R
Ann I ↔ ideal_zero R :: I
R: Ring I: Ideal R x: R
Ann I x -> (ideal_zero R :: I) x
R: Ring I: Ideal R x: R
(ideal_zero R :: I) x -> Ann I x
R: Ring I: Ideal R x: R
Ann I x -> (ideal_zero R :: I) x
R: Ring I: Ideal R x: R q: forallx0 : rng_op R, I x0 -> x * x0 = ring_zero p: forallx0 : R, I x0 -> x * x0 = ring_zero y: R i: I y
ideal_zero R (x * y)
R: Ring I: Ideal R x: R q: forallx0 : rng_op R, I x0 -> x * x0 = ring_zero p: forallx0 : R, I x0 -> x * x0 = ring_zero y: rng_op R i: I y
ideal_zero R (x * y)
R: Ring I: Ideal R x: R q: forallx0 : rng_op R, I x0 -> x * x0 = ring_zero p: forallx0 : R, I x0 -> x * x0 = ring_zero y: R i: I y
ideal_zero R (x * y)
exact (p y i).
R: Ring I: Ideal R x: R q: forallx0 : rng_op R, I x0 -> x * x0 = ring_zero p: forallx0 : R, I x0 -> x * x0 = ring_zero y: rng_op R i: I y
ideal_zero R (x * y)
exact (q y i).
R: Ring I: Ideal R x: R
(ideal_zero R :: I) x -> Ann I x
R: Ring I: Ideal R x: R q: forallx0 : rng_op R,
I x0 -> ideal_zero R (x * x0) p: forallx0 : R, I x0 -> ideal_zero R (x * x0) y: R i: I y
x * y = ring_zero
R: Ring I: Ideal R x: R q: forallx0 : rng_op R,
I x0 -> ideal_zero R (x * x0) p: forallx0 : R, I x0 -> ideal_zero R (x * x0) y: rng_op R i: I y
x * y = ring_zero
R: Ring I: Ideal R x: R q: forallx0 : rng_op R,
I x0 -> ideal_zero R (x * x0) p: forallx0 : R, I x0 -> ideal_zero R (x * x0) y: R i: I y
x * y = ring_zero
exact (p y i).
R: Ring I: Ideal R x: R q: forallx0 : rng_op R,
I x0 -> ideal_zero R (x * x0) p: forallx0 : R, I x0 -> ideal_zero R (x * x0) y: rng_op R i: I y
x * y = ring_zero
exact (q y i).Defined.EndIdealLemmas.(** ** Preimage of ideals under ring homomorphisms *)(** The preimage of an ideal under a ring homomorphism is also itself an ideal. This is also known as the contraction of an ideal. *)
R, S: Ring f: R $-> S I: Subgroup S H: IsLeftIdeal I
IsLeftIdeal (subgroup_preimage f I)
R, S: Ring f: R $-> S I: Subgroup S H: IsLeftIdeal I
IsLeftIdeal (subgroup_preimage f I)
R, S: Ring f: R $-> S I: Subgroup S H: IsLeftIdeal I r, x: R Ifx: subgroup_preimage f I x
subgroup_preimage f I (r * x)
R, S: Ring f: R $-> S I: Subgroup S H: IsLeftIdeal I r, x: R Ifx: subgroup_preimage f I x
I (f r * f x)
R, S: Ring f: R $-> S I: Subgroup S H: IsLeftIdeal I r, x: R Ifx: subgroup_preimage f I x
I (f x)
exact Ifx.Defined.Instanceisrightideal_preimage {RS : Ring} (f : R $-> S)
(I : Subgroup S) `{IsRightIdeal S I}
: IsRightIdeal (subgroup_preimage f I)
:= isleftideal_preimage (R:=rng_op R) (S:=rng_op S)
(fmap rng_op f) I.Instanceisideal_preimage {RS : Ring} (f : R $-> S)
(I : Subgroup S) `{IsIdeal S I}
: IsIdeal (subgroup_preimage f I)
:= {}.Definitionideal_preimage {RS : Ring} (f : R $-> S) (I : Ideal S)
: Ideal R
:= Build_Ideal R (subgroup_preimage f I) _.(** ** Extensions of ideals *)(** The extension of an ideal under a ring homomorphism is the ideal generated by the image of the ideal. *)Definitionideal_extension {RS : Ring} (f : R $-> S) (I : Ideal R) : Ideal S
:= ideal_generated (funs => existsr, I r /\ f r = s).(** The extension of a preimage is always a subset of the original ideal. *)
R, S: Ring f: R $-> S I: Ideal S
ideal_extension f (ideal_preimage f I) ⊆ I
R, S: Ring f: R $-> S I: Ideal S
ideal_extension f (ideal_preimage f I) ⊆ I
R, S: Ring f: R $-> S I: Ideal S x: S
ideal_extension f (ideal_preimage f I) x -> I x
R, S: Ring f: R $-> S I: Ideal S x: S
ideal_generated_type
(funs : S =>
{r : R & (ideal_preimage f I r * (f r = s))%type})
x -> I x
R, S: Ring f: R $-> S I: Ideal S x: S y: ideal_generated_type
(funs : S =>
{r : R &
(ideal_preimage f I r * (f r = s))%type}) x
I x
R, S: Ring f: R $-> S I: Ideal S r: S x: {r0 : R &
(ideal_preimage f I r0 * (f r0 = r))%type}
I r
R, S: Ring f: R $-> S I: Ideal S
I ring_zero
R, S: Ring f: R $-> S I: Ideal S r, s: S y1: ideal_generated_type
(funs : S =>
{r : R &
(ideal_preimage f I r * (f r = s))%type}) r y2: ideal_generated_type
(funs : S =>
{r : R &
(ideal_preimage f I r * (f r = s))%type}) s IHy1: I r IHy2: I s
I (r - s)
R, S: Ring f: R $-> S I: Ideal S r, s: S y: ideal_generated_type
(funs : S =>
{r : R &
(ideal_preimage f I r * (f r = s))%type}) s IHy: I s
I (r * s)
R, S: Ring f: R $-> S I: Ideal S r, s: S y: ideal_generated_type
(funs : S =>
{r : R &
(ideal_preimage f I r * (f r = s))%type}) r IHy: I r
I (r * s)
R, S: Ring f: R $-> S I: Ideal S r: S x: {r0 : R &
(ideal_preimage f I r0 * (f r0 = r))%type}
I r
R, S: Ring f: R $-> S I: Ideal S r: S s: R p: ideal_preimage f I s q: f s = r
I r
destruct q; exact p.
R, S: Ring f: R $-> S I: Ideal S
I ring_zero
apply ideal_in_zero.
R, S: Ring f: R $-> S I: Ideal S r, s: S y1: ideal_generated_type
(funs : S =>
{r : R &
(ideal_preimage f I r * (f r = s))%type}) r y2: ideal_generated_type
(funs : S =>
{r : R &
(ideal_preimage f I r * (f r = s))%type}) s IHy1: I r IHy2: I s
I (r - s)
byapply ideal_in_plus_negate.
R, S: Ring f: R $-> S I: Ideal S r, s: S y: ideal_generated_type
(funs : S =>
{r : R &
(ideal_preimage f I r * (f r = s))%type}) s IHy: I s
I (r * s)
by rapply isleftideal.
R, S: Ring f: R $-> S I: Ideal S r, s: S y: ideal_generated_type
(funs : S =>
{r : R &
(ideal_preimage f I r * (f r = s))%type}) r IHy: I r
I (r * s)
by rapply isrightideal.Defined.(** TODO: Maximal ideals *)(** TODO: Principal ideal *)(** TODO: Prime ideals *)(** TODO: Radical ideals *)(** TODO: Minimal ideals *)(** TODO: Primary ideals *)