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. Local Open Scope ideal_scope. Local Open Scope predicate_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. *) Class IsLeftIdeal {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. *) Class IsRightIdeal {R : Ring} (I : Subgroup R) := isrightideal_isleftideal_op :: IsLeftIdeal (R := rng_op R) I. Definition isrightideal {R : Ring} (I : Subgroup R) (x r : 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. *) Class IsIdeal {R : Ring} (I : Subgroup R) := { ideal_isleftideal :: IsLeftIdeal I; ideal_isrightideal :: IsRightIdeal I; }. Definition issig_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. *) Record LeftIdeal (R : Ring) := { leftideal_subgroup :> Subgroup R; leftideal_isleftideal :: IsLeftIdeal leftideal_subgroup; }. Definition issig_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. *) Definition RightIdeal (R : Ring) := LeftIdeal (rng_op R). Instance isrightdeal_rightideal {R} (I : RightIdeal R) : IsRightIdeal (R:=R) I := leftideal_isleftideal _ I. Definition Build_RightIdeal (R : Ring) (I : Subgroup R) (H : IsRightIdeal I) : RightIdeal R := Build_LeftIdeal (rng_op R) I H. Definition issig_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. *) Record Ideal (R : Ring) := { ideal_subgroup :> Subgroup R; ideal_isideal :: IsIdeal ideal_subgroup; }. Definition issig_Ideal (R : Ring) : _ <~> Ideal R := ltac:(issig). Definition ideal_op (R : Ring) : Ideal R -> Ideal (rng_op R) := fun I => Build_Ideal (rng_op R) I _. Coercion ideal_op : Ideal >-> Ideal. Definition rightideal_op (R : Ring) : LeftIdeal R -> RightIdeal (rng_op R) := idmap. Definition leftideal_op (R : Ring) : RightIdeal R -> LeftIdeal (rng_op R) := idmap. (** *** Truncatedness properties *) Section IdealTrunc. (** Assuming [Funext] we can show that the ideal predicates are propositions. *) Context `{Funext}. (** Being a left ideal is a proposition. *) #[export] Instance ishprop_isleftideal {R : Ring} (I : Subgroup R) : IsHProp (IsLeftIdeal I) := ltac:(unfold IsLeftIdeal; exact _). (** Being a right ideal is a proposition. *) #[export] Instance ishprop_isrightideal `{Funext} {R : Ring} (I : Subgroup R) : IsHProp (IsRightIdeal I) := ishprop_isleftideal _. (** Being a two-sided ideal is a proposition. *) #[export] Instance ishprop_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] Instance ishset_leftideal {R : Ring} : IsHSet (LeftIdeal R) := istrunc_equiv_istrunc _ (issig_LeftIdeal R). (** The type of right ideals is a set. *) #[export] Instance ishset_rightideal {R : Ring} : IsHSet (RightIdeal R) := _. (** The type of ideals is a set. *) #[export] Instance ishset_ideal {R : Ring} : IsHSet (Ideal R) := istrunc_equiv_istrunc _ (issig_Ideal R). End IdealTrunc. (** *** Conversion between Ideals *) (** Every ideal is a left ideal. *) Definition leftideal_of_ideal {R : Ring} : Ideal R -> LeftIdeal R := fun I => Build_LeftIdeal R I _. Coercion leftideal_of_ideal : Ideal >-> LeftIdeal. (** Every ideal is a right ideal. *) Definition rightideal_of_ideal {R : Ring} : Ideal R -> RightIdeal R := fun I => Build_RightIdeal R I _. Coercion rightideal_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. *) Section IdealElements. Context {R : Ring} (I : Subgroup R) (a b : R). Definition ideal_in_zero : I ring_zero := subgroup_in_unit I. Definition ideal_in_plus : I a -> I b -> I (a + b) := subgroup_in_op I a b. Definition ideal_in_negate : I a -> I (- a) := subgroup_in_inv I a. Definition ideal_in_negate' : I (- a) -> I a := subgroup_in_inv' I a. Definition ideal_in_plus_negate : I a -> I b -> I (a - b) := subgroup_in_op_inv I a b. Definition ideal_in_negate_plus : I a -> I b -> I (-a + b) := subgroup_in_inv_op I a b. Definition ideal_in_plus_l : I (a + b) -> I b -> I a := subgroup_in_op_l I a b. Definition ideal_in_plus_r : I (a + b) -> I a -> I b := subgroup_in_op_r I a b. End IdealElements. (** *** Ideal equality *) (** With univalence we can characterize equality of ideals. *)
H: Univalence
R: Ring
I, J: Ideal R

(I ↔ J) <~> I = J
H: Univalence
R: Ring
I, J: Ideal R

(I ↔ J) <~> I = J
H: Univalence
R: Ring
I, J: Ideal R

(I ↔ J) <~> (issig_Ideal R)^-1%equiv I = (issig_Ideal R)^-1%equiv J
H: Univalence
R: Ring
I, J: Ideal R

(I ↔ J) <~> ((issig_Ideal R)^-1%equiv I).1 = ((issig_Ideal R)^-1%equiv J).1
rapply equiv_path_subgroup'. Defined. (** Under funext, ideal equality is a proposition. *) Instance ishprop_ideal_eq `{Funext} {R : Ring} (I J : Ideal R) : IsHProp (I ↔ J) := _. (** *** Invariance under subgroup equality *) (** Being a left ideal is invariant under subgroup equality. *)
R: Ring
I, J: Subgroup R
p: I ↔ J

IsLeftIdeal I -> IsLeftIdeal J
R: Ring
I, J: Subgroup R
p: I ↔ J

IsLeftIdeal I -> IsLeftIdeal J
R: Ring
I, J: Subgroup R
p: I ↔ J
i: IsLeftIdeal I
r, x: R
j: J x

J (r * x)
R: Ring
I, J: Subgroup R
p: I ↔ J
i: IsLeftIdeal I
r, x: R
j: I x

J (r * x)
R: Ring
I, J: Subgroup R
p: I ↔ J
i: IsLeftIdeal I
r, x: R
j: I x

I (r * x)
by apply i. Defined. (** Being a right ideal is invariant under subgroup equality. *) Definition isrightideal_eq {R : Ring} (I J : Subgroup R) (p : I ↔ J) : IsRightIdeal I -> IsRightIdeal J := isleftideal_eq (R := rng_op R) I J p. (** ** 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. *) Instance isrightideal_trivial_subgroup (R : Ring) : IsRightIdeal (trivial_subgroup R) := isleftideal_trivial_subgroup _. (** The trivial subgroup is an ideal. *) Instance isideal_trivial_subgroup (R : Ring) : IsIdeal (trivial_subgroup R) := {}. (** We call the trivial subgroup the "zero ideal". *) Definition ideal_zero (R : Ring) : Ideal R := Build_Ideal R (trivial_subgroup R) _. (** *** The unit ideal *) (** The maximal subgroup is a left ideal. *) Instance isleftideal_maximal_subgroup (R : Ring) : IsLeftIdeal (maximal_subgroup R) := ltac:(done). (** The maximal subgroup is a right ideal. *) Instance isrightideal_maximal_subgroup (R : Ring) : IsRightIdeal (maximal_subgroup R) := isleftideal_maximal_subgroup _. (** The maximal subgroup is an ideal. *) Instance isideal_maximal_subgroup (R : Ring) : IsIdeal (maximal_subgroup R) := {}. (** We call the maximal subgroup the "unit ideal". *) Definition ideal_unit (R : Ring) : Ideal R := Build_Ideal R _ (isideal_maximal_subgroup R). (** *** Intersection of two 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; by apply isleftideal. Defined. (** Intersections of underlying subgroups of right ideals are again right ideals. *) Instance isrightideal_subgroup_intersection (R : Ring) (I J : 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. *) Instance isideal_subgroup_intersection (R : Ring) (I J : Subgroup R) `{IsIdeal R I, IsIdeal R J} : IsIdeal (subgroup_intersection I J) := {}. (** Intersection of left ideals. *) Definition leftideal_intersection {R : Ring} : LeftIdeal R -> LeftIdeal R -> LeftIdeal R := fun I J => Build_LeftIdeal R (subgroup_intersection I J) _. (** Intersection of right ideals. *) Definition rightideal_intersection {R : Ring} : RightIdeal R -> RightIdeal R -> RightIdeal R := leftideal_intersection. (** Intersection of ideals. *) Definition ideal_intersection {R : Ring} : Ideal R -> Ideal R -> Ideal R := fun I J => Build_Ideal R (subgroup_intersection I J) _. (** *** Intersection of a family of ideals *) (** Intersections of underlying subgroups of left ideals are again left ideals. *)
R: Ring
I: Type
J: I -> Subgroup R
h: forall i : I, IsLeftIdeal (J i)

IsLeftIdeal (subgroup_intersection_family I J)
R: Ring
I: Type
J: I -> Subgroup R
h: forall i : I, IsLeftIdeal (J i)

IsLeftIdeal (subgroup_intersection_family I J)
R: Ring
I: Type
J: I -> Subgroup R
h: forall i : I, IsLeftIdeal (J i)
r, x: R

Trunc (-1) (forall i : I, J i x) -> Trunc (-1) (forall i : I, J i (r * x))
R: Ring
I: Type
J: I -> Subgroup R
h: forall i : I, IsLeftIdeal (J i)
r, x: R

(forall i : I, J i x) -> forall i : I, J i (r * x)
intros Jix i; by apply isleftideal. Defined. (** Intersections of underlying subgroups of right ideals are again right ideals. *) Instance isrightideal_subgroup_intersection_family (R : Ring) (I : Type) (J : I -> Subgroup R) {h : forall i, IsRightIdeal (J i)} : IsRightIdeal (subgroup_intersection_family I J) := isleftideal_subgroup_intersection_family _ _ _. (** Intersections of underlying subgroups of ideals are again ideals. *) Instance isideal_subgroup_intersection_family (R : Ring) (I : Type) (J : I -> Subgroup R) {h : forall i, IsIdeal (J i)} : IsIdeal (subgroup_intersection_family I J) := {}. (** Intersection of left ideals. *) Definition leftideal_intersection_family {R : Ring} (I : Type) (J : I -> LeftIdeal R) : LeftIdeal R := Build_LeftIdeal R (subgroup_intersection_family I J) _. (** Intersection of right ideals. *) Definition rightideal_intersection_family {R : Ring} (I : Type) (J : I -> RightIdeal R) : RightIdeal R := leftideal_intersection_family I J. (** Intersection of ideals. *) Definition ideal_intersection_family {R : Ring} (I : Type) (J : I -> Ideal R) : Ideal R := Build_Ideal R (subgroup_intersection_family 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

forall x : 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

I ⊆ subgroup_preimage (grp_homo_rng_left_mult r) (subgroup_product I J)
R: Ring
I, J: Subgroup R
H: IsLeftIdeal I
H0: IsLeftIdeal J
r: R
J ⊆ subgroup_preimage (grp_homo_rng_left_mult r) (subgroup_product I J)
R: Ring
I, J: Subgroup R
H: IsLeftIdeal I
H0: IsLeftIdeal J
r: R

I ⊆ (fun x : R => subgroup_product I J (r * x))
R: Ring
I, J: Subgroup R
H: IsLeftIdeal I
H0: IsLeftIdeal J
r: R
J ⊆ (fun x : R => subgroup_product I J (r * x))
R: Ring
I, J: Subgroup R
H: IsLeftIdeal I
H0: IsLeftIdeal J
r: R

I ⊆ (fun x : R => 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)
by apply subgroup_product_incl_l, isleftideal.
R: Ring
I, J: Subgroup R
H: IsLeftIdeal I
H0: IsLeftIdeal J
r: R

J ⊆ (fun x : R => 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)
by apply subgroup_product_incl_r, isleftideal. Defined. (** The subgroup product of right ideals is again an ideal. *) Instance isrightideal_subgroup_product (R : Ring) (I J : 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. *) Instance isideal_subgroup_product (R : Ring) (I J : Subgroup R) `{IsIdeal R I, IsIdeal R J} : IsIdeal (subgroup_product I J) := {}. (** Sum of left ideals. *) Definition leftideal_sum {R : Ring} : LeftIdeal R -> LeftIdeal R -> LeftIdeal R := fun I J => Build_LeftIdeal R (subgroup_product I J) _. (** Sum of right ideals. *) Definition rightideal_sum {R : Ring} : RightIdeal R -> RightIdeal R -> RightIdeal R := leftideal_sum. (** Sum of ideals. *) Definition ideal_sum {R : Ring} : Ideal R -> Ideal R -> Ideal R := fun I J => Build_Ideal R (subgroup_product I J) _. Definition ideal_sum_ind {R : Ring} (I J : Ideal R) (P : forall x, ideal_sum I J x -> Type) (P_I_in : forall x y, P x (tr (sgt_in (inl y)))) (P_J_in : forall x y, P x (tr (sgt_in (inr y)))) (P_unit : P mon_unit (tr sgt_unit)) (P_op : forall x y h k, P x (tr h) -> P y (tr k) -> P (x - y) (tr (sgt_op h k))) `{forall x y, IsHProp (P x y)} : forall x (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. *) Inductive ideal_product_naive_type {R : Ring} (I J : Subgroup R) : R -> Type := | ipn_in : forall x y, 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. *) Definition ideal_product_type {R : Ring} (I J : Subgroup R) : Subgroup R := subgroup_generated (G := R) (ideal_product_naive_type I J). (** The product ideal swapped is just the product ideal of the opposite ring. *)
R: Ring
I, J: Subgroup R

ideal_product_type I J ↔ ideal_product_type J I
R: Ring
I, J: Subgroup R

ideal_product_type I J ↔ ideal_product_type J I
R: Ring
I, J: Subgroup R

ideal_product_naive_type I J ↔ (fun x : R => ideal_product_naive_type J I (grp_iso_id x))
apply pred_subset_antisymm; cbn; intros _ []; by napply ipn_in. Defined. (** 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

forall x : 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

ideal_product_naive_type I J ⊆ (fun x : R => ideal_product_naive_type I J (grp_homo_rng_left_mult r x))
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)
by apply 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

?Goal ↔ ideal_product_type I J
R: Ring
I, J: Subgroup R
H: IsRightIdeal I
H0: IsRightIdeal J
IsRightIdeal ?Goal
R: Ring
I, J: Subgroup R
H: IsRightIdeal I
H0: IsRightIdeal J

IsRightIdeal (ideal_product_type J I)
by apply isleftideal_ideal_product_type. Defined. (** The product of ideals is an ideal. *) Instance isideal_ideal_product_type {R : Ring} (I J : Subgroup R) `{IsIdeal R I, IsIdeal R J} : IsIdeal (ideal_product_type I J) := {}. (** Product of left ideals. *) Definition leftideal_product {R : Ring} : LeftIdeal R -> LeftIdeal R -> LeftIdeal R := fun I J => Build_LeftIdeal R (ideal_product_type I J) _. (** Product of right ideals. *) Definition rightideal_product {R : Ring} : RightIdeal R -> RightIdeal R -> RightIdeal R := leftideal_product. Definition leftideal_product_op {R : Ring} (I J : RightIdeal R) : leftideal_product (leftideal_op R I) (leftideal_op R J) = rightideal_product I J := idpath. Definition rightideal_product_op {R : Ring} (I J : LeftIdeal R) : rightideal_product (rightideal_op R I) (rightideal_op R J) = leftideal_product I J := idpath. (** Product of ideals. *) Definition ideal_product {R : Ring} : Ideal R -> Ideal R -> Ideal R := fun I J => 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
by apply ap. Defined. (** The kernel of the underlying group homomorphism of a ring homomorphism is a right ideal. *) Instance isrightideal_grp_kernel {R S : 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. *) Instance isideal_grp_kernel {R S : Ring} (f : RingHomomorphism R S) : IsIdeal (grp_kernel f) := {}. (** The kernel of a ring homomorphism is an ideal. *) Definition ideal_kernel {R S : 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 analogous construction to the one done in Subgroup.v. *) (** Underlying type family of a left ideal generated by subset. *) Inductive leftideal_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
forall x : R, IsHProp (?H x)
R: Ring
X: R -> Type
?H mon_unit
R: Ring
X: R -> Type
forall x y : R, ?H x -> ?H y -> ?H (sg_op x (inv y))
R: Ring
X: R -> Type

R -> Type
exact (fun x => merely (leftideal_generated_type X x)).
R: Ring
X: R -> Type

forall x : R, IsHProp ((fun x0 : R => trunctype_type (merely (leftideal_generated_type X x0))) x)
exact _.
R: Ring
X: R -> Type

(fun x : R => trunctype_type (merely (leftideal_generated_type X x))) mon_unit
apply tr, ligt_zero.
R: Ring
X: R -> Type

forall x y : R, (fun x0 : R => trunctype_type (merely (leftideal_generated_type X x0))) x -> (fun x0 : R => trunctype_type (merely (leftideal_generated_type X x0))) y -> (fun x0 : 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)))
by apply tr, ligt_add_neg.
R: Ring
X: R -> Type

IsLeftIdeal (Build_Subgroup' (fun x : R => merely (leftideal_generated_type X x)) (tr ligt_zero) (fun (x y : R) (p : (fun x0 : R => trunctype_type (merely (leftideal_generated_type X x0))) x) (q : (fun x0 : R => trunctype_type (merely (leftideal_generated_type X x0))) y) => Trunc_ind (fun _ : Trunc (-1) (leftideal_generated_type X y) => (fun x0 : R => trunctype_type (merely (leftideal_generated_type X x0))) (sg_op x (inv y))) (fun q0 : 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)))) (fun p0 : 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. *) Definition rightideal_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. *) Inductive ideal_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
forall x : R, IsHProp (?H x)
R: Ring
X: R -> Type
?H mon_unit
R: Ring
X: R -> Type
forall x y : R, ?H x -> ?H y -> ?H (sg_op x (inv y))
R: Ring
X: R -> Type

R -> Type
exact (fun x => merely (ideal_generated_type X x)).
R: Ring
X: R -> Type

forall x : R, IsHProp ((fun x0 : R => trunctype_type (merely (ideal_generated_type X x0))) x)
exact _.
R: Ring
X: R -> Type

(fun x : R => trunctype_type (merely (ideal_generated_type X x))) mon_unit
apply tr, igt_zero.
R: Ring
X: R -> Type

forall x y : R, (fun x0 : R => trunctype_type (merely (ideal_generated_type X x0))) x -> (fun x0 : R => trunctype_type (merely (ideal_generated_type X x0))) y -> (fun x0 : 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)))
by apply tr, igt_add_neg.
R: Ring
X: R -> Type

IsLeftIdeal (Build_Subgroup' (fun x : R => merely (ideal_generated_type X x)) (tr igt_zero) (fun (x y : R) (p : (fun x0 : R => trunctype_type (merely (ideal_generated_type X x0))) x) (q : (fun x0 : R => trunctype_type (merely (ideal_generated_type X x0))) y) => Trunc_ind (fun _ : Trunc (-1) (ideal_generated_type X y) => (fun x0 : R => trunctype_type (merely (ideal_generated_type X x0))) (sg_op x (inv y))) (fun q0 : 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)))) (fun p0 : 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' (fun x : R => merely (ideal_generated_type X x)) (tr igt_zero) (fun (x y : R) (p : (fun x0 : R => trunctype_type (merely (ideal_generated_type X x0))) x) (q : (fun x0 : R => trunctype_type (merely (ideal_generated_type X x0))) y) => Trunc_ind (fun _ : Trunc (-1) (ideal_generated_type X y) => (fun x0 : R => trunctype_type (merely (ideal_generated_type X x0))) (sg_op x (inv y))) (fun q0 : 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)))) (fun p0 : 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 igt_mul_r. Defined.
R: Ring
X: R -> Type
I: Ideal R
p: X ⊆ I

ideal_generated X ⊆ I
R: Ring
X: R -> Type
I: Ideal R
p: X ⊆ I

ideal_generated X ⊆ I
R: Ring
X: R -> Type
I: Ideal R
p: X ⊆ I
x: R
q: ideal_generated_type X x

I x
R: Ring
X: R -> Type
I: Ideal R
p: X ⊆ I
r: R
x: X r

I r
R: Ring
X: R -> Type
I: Ideal R
p: X ⊆ I
I ring_zero
R: Ring
X: R -> Type
I: Ideal R
p: X ⊆ I
r, s: R
q1: ideal_generated_type X r
q2: ideal_generated_type X s
IHq1: I r
IHq2: I s
I (r - s)
R: Ring
X: R -> Type
I: Ideal R
p: X ⊆ I
r, s: R
q: ideal_generated_type X s
IHq: I s
I (r * s)
R: Ring
X: R -> Type
I: Ideal R
p: X ⊆ I
r, s: R
q: ideal_generated_type X r
IHq: I r
I (r * s)
R: Ring
X: R -> Type
I: Ideal R
p: X ⊆ I
r: R
x: X r

I r
by apply p.
R: Ring
X: R -> Type
I: Ideal R
p: X ⊆ I

I ring_zero
apply ideal_in_zero.
R: Ring
X: R -> Type
I: Ideal R
p: X ⊆ I
r, s: R
q1: ideal_generated_type X r
q2: ideal_generated_type X s
IHq1: I r
IHq2: I s

I (r - s)
by apply ideal_in_plus_negate.
R: Ring
X: R -> Type
I: Ideal R
p: X ⊆ I
r, s: R
q: ideal_generated_type X s
IHq: I s

I (r * s)
by apply isleftideal.
R: Ring
X: R -> Type
I: Ideal R
p: X ⊆ I
r, s: R
q: ideal_generated_type X r
IHq: I r

I (r * s)
by rapply isrightideal. Defined. (** *** Finitely generated ideal *) (** Finitely generated ideals *)
R: Ring
n: nat
X: Fin n -> R

Ideal R
R: Ring
n: nat
X: Fin n -> R

Ideal R
R: Ring
n: nat
X: Fin n -> R

R -> Type
exact (hfiber X). Defined. (** *** Principal ideals *) (** A principal ideal is an ideal generated by a single element. *) Definition ideal_principal {R : Ring} (x : R) : Ideal R := ideal_generated (fun r => x = r). (** *** 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 [I :: J] consists of the elements [r] in [R] such that [J x -> I (r * x)] for every [x] in [R]. *)
R: Ring
I: Subgroup R
J: R -> Type

Subgroup R
R: Ring
I: Subgroup R
J: R -> Type

Subgroup R
R: Ring
I: Subgroup R
J: R -> Type

R -> Type
R: Ring
I: Subgroup R
J: R -> Type
IsSubgroup ?subgroup_pred
(* We insert [merely] here to avoid needing [Funext]. *)
R: Ring
I: Subgroup R
J: R -> Type

R -> Type
exact (fun r => merely (J ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I)). (* This predicate is a subgroup, since it is equivalent to an intersection of a family of subgroups indexed by [sig J]. *)
R: Ring
I: Subgroup R
J: R -> Type

IsSubgroup (fun r : R => merely (J ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I))
R: Ring
I: Subgroup R
J: R -> Type

forall g : R, subgroup_intersection_family {x : _ & J x} (fun x : {x : _ & J x} => subgroup_preimage (grp_homo_rng_right_mult x.1) I) g <~> merely (J ⊆ subgroup_preimage (grp_homo_rng_left_mult g) I)
R: Ring
I: Subgroup R
J: R -> Type
r: R

Trunc (-1) (forall i : {x : _ & J x}, I (r * i.1)) <~> Trunc (-1) (J ⊆ (fun x : R => I (r * x)))
R: Ring
I: Subgroup R
J: R -> Type
r: R

(forall i : {x : _ & J x}, I (r * i.1)) <~> J ⊆ (fun x : R => I (r * x))
symmetry; napply equiv_sig_ind. Defined. (** The left ideal quotient of a left ideal is a left ideal. *)
R: Ring
I: Subgroup R
H: IsLeftIdeal I
J: R -> Type

IsLeftIdeal (subgroup_leftideal_quotient I J)
R: Ring
I: Subgroup R
H: IsLeftIdeal I
J: R -> Type

IsLeftIdeal (subgroup_leftideal_quotient I J)
R: Ring
I: Subgroup R
H: IsLeftIdeal I
J: R -> Type
r, x: R
p: subgroup_leftideal_quotient I J x

subgroup_leftideal_quotient I J (r * x)
R: Ring
I: Subgroup R
H: IsLeftIdeal I
J: R -> Type
r, x: R
p: J ⊆ subgroup_preimage (grp_homo_rng_left_mult x) I

J ⊆ subgroup_preimage (grp_homo_rng_left_mult (r * x)) I
R: Ring
I: Subgroup R
H: IsLeftIdeal I
J: R -> Type
r, x: R
p: J ⊆ subgroup_preimage (grp_homo_rng_left_mult x) I
s: R
j: J s

I (r * x * s)
R: Ring
I: Subgroup R
H: IsLeftIdeal I
J: R -> Type
r, x: R
p: J ⊆ subgroup_preimage (grp_homo_rng_left_mult x) I
s: R
j: J s

I (r * (x * s))
R: Ring
I: Subgroup R
H: IsLeftIdeal I
J: R -> Type
r, x: R
p: J ⊆ subgroup_preimage (grp_homo_rng_left_mult x) I
s: R
j: J s

I (x * s)
by napply p. Defined. (** The left ideal quotient by a left ideal is a right ideal. *)
R: Ring
I, J: Subgroup R
H: IsLeftIdeal J

IsRightIdeal (subgroup_leftideal_quotient I J)
R: Ring
I, J: Subgroup R
H: IsLeftIdeal J

IsRightIdeal (subgroup_leftideal_quotient I J)
R: Ring
I, J: Subgroup R
H: 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: IsLeftIdeal J
r, x: rng_op R
p: J ⊆ subgroup_preimage (grp_homo_rng_left_mult x) I

J ⊆ subgroup_preimage (grp_homo_rng_left_mult (r * x)) I
R: Ring
I, J: Subgroup R
H: IsLeftIdeal J
r, x: rng_op R
p: J ⊆ subgroup_preimage (grp_homo_rng_left_mult x) I
s: R
j: J s

subgroup_preimage (grp_homo_rng_left_mult (r * x)) I s
R: Ring
I, J: Subgroup R
H: IsLeftIdeal J
r, x: R
p: J ⊆ (fun x0 : R => I (x * x0))
s: R
j: J s

I (ring_mult x r * s)
R: Ring
I, J: Subgroup R
H: IsLeftIdeal J
r, x: R
p: J ⊆ (fun x0 : R => I (x * x0))
s: R
j: J s

I (x * (r * s))
R: Ring
I, J: Subgroup R
H: IsLeftIdeal J
r, x: R
p: J ⊆ (fun x0 : R => 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. *) Definition leftideal_quotient {R : Ring} : LeftIdeal R -> (R -> Type) -> LeftIdeal R := fun I J => Build_LeftIdeal R (subgroup_leftideal_quotient I J) _. Definition subgroup_rightideal_quotient {R : Ring} (I : Subgroup R) (J : R -> Type) : Subgroup R := subgroup_leftideal_quotient (R:=rng_op R) I J. Instance isrightideal_subgroup_rightideal_quotient {R : Ring} (I : Subgroup R) `{IsRightIdeal R I} (J : R -> Type) : IsRightIdeal (subgroup_rightideal_quotient I J) := isleftideal_subgroup_leftideal_quotient (R:=rng_op R) I J. Instance isleftideal_subgroup_rightideal_quotient {R : Ring} (I J : Subgroup R) `{IsRightIdeal R J} : IsLeftIdeal (subgroup_rightideal_quotient I J) := isrightideal_subgroup_leftideal_quotient (R:=rng_op R) I J. (** We define the right ideal quotient as a right ideal. *) Definition rightideal_quotient {R : Ring} : RightIdeal R -> (R -> Type) -> RightIdeal R := fun I J => 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. *) Definition ideal_quotient {R : Ring} : Ideal R -> Ideal R -> Ideal R := fun I J => 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
forall x : R, IsHProp (?H x)
R: Ring
S: R -> Type
?H mon_unit
R: Ring
S: R -> Type
forall x y : 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 (fun r => merely (forall x, S x -> r * x = ring_zero)).
R: Ring
S: R -> Type

forall x : R, IsHProp ((fun r : R => trunctype_type (merely (forall x0 : R, S x0 -> r * x0 = ring_zero))) x)
exact _.
R: Ring
S: R -> Type

(fun r : R => trunctype_type (merely (forall x : R, S x -> r * x = ring_zero))) mon_unit
R: Ring
S: R -> Type

forall x : 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

forall x y : R, (fun r : R => trunctype_type (merely (forall x0 : R, S x0 -> r * x0 = ring_zero))) x -> (fun r : R => trunctype_type (merely (forall x0 : R, S x0 -> r * x0 = ring_zero))) y -> (fun r : R => trunctype_type (merely (forall x0 : R, S x0 -> r * x0 = ring_zero))) (sg_op x (inv y))
R: Ring
S: R -> Type
x, y: R
p: (fun r : R => trunctype_type (merely (forall x : R, S x -> r * x = ring_zero))) x
q: (fun r : R => trunctype_type (merely (forall x : R, S x -> r * x = ring_zero))) y

(fun r : R => trunctype_type (merely (forall x : R, S x -> r * x = ring_zero))) (sg_op x (inv y))
R: Ring
S: R -> Type
x, y: R
q: forall x : R, S x -> y * x = ring_zero
p: forall x0 : R, S x0 -> x * x0 = ring_zero

forall x0 : R, S x0 -> sg_op x (inv y) * x0 = ring_zero
R: Ring
S: R -> Type
x, y: R
q: forall x : R, S x -> y * x = ring_zero
p: forall x0 : 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: forall x : R, S x -> y * x = ring_zero
p: forall x0 : 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: forall x : R, S x -> y * x = ring_zero
p: forall x0 : 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: forall x : R, S x -> y * x = ring_zero
p: forall x0 : 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: forall x : R, S x -> y * x = ring_zero
p: forall x0 : 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: forall x : R, S x -> y * x = ring_zero
p: forall x0 : 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: forall x : R, S x -> y * x = ring_zero
p: forall x0 : 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: forall x0 : R, I x0 -> x * x0 = ring_zero

forall x0 : R, I x0 -> r * x * x0 = ring_zero
R: Ring
I: R -> Type
r, x: R
p: forall x0 : 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: forall x0 : 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: forall x0 : R, I x0 -> x * x0 = ring_zero

forall x0 : R, I x0 -> r * x * x0 = ring_zero
R: Ring
I: Subgroup R
H: IsLeftIdeal I
r, x: rng_op R
p: forall x0 : 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: forall x0 : R, I x0 -> x * x0 = ring_zero
s: R
i: I s

x * (r * s) = ring_zero
by apply p, isleftideal. Defined. (** Therefore the annihilator of a left ideal is an ideal. *) Instance isideal_ideal_left_annihilator {R : Ring} (I : Subgroup R) `{IsLeftIdeal R I} : IsIdeal (subgroup_ideal_left_annihilator I) := {}. (** The left annihilator of a left ideal. *) Definition ideal_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. *) Definition subgroup_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. *) Instance isleftideal_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. *) Instance isrightideal_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. *) Instance isideal_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. *) Definition ideal_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. *) Definition ideal_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. *) Definition Coprime {R : Ring} (I J : Ideal R) : Type := ideal_sum I J ↔ ideal_unit R. Existing Class Coprime.
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_sum I J ↔ ideal_unit R)
exact _. Defined.
H: Funext
R: Ring
I, J: Ideal R

Coprime I J <~> hexists (fun pat : {x : _ & I x} * {x : _ & J x} => let x := pat in let fst := fst x in let snd := snd x in let fst0 := fst in let i := fst0.1 in let p := fst0.2 in let snd0 := snd in let j := snd0.1 in let q := snd0.2 in i + j = ring_one)
H: Funext
R: Ring
I, J: Ideal R

Coprime I J <~> hexists (fun pat : {x : _ & I x} * {x : _ & J x} => let x := pat in let fst := fst x in let snd := snd x in let fst0 := fst in let i := fst0.1 in let p := fst0.2 in let snd0 := snd in let j := snd0.1 in let q := snd0.2 in i + j = ring_one)
H: Funext
R: Ring
I, J: Ideal R

Coprime I J <~> Tr (-1) {pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = ring_one}
H: Funext
R: Ring
I, J: Ideal R

Coprime I J -> Tr (-1) {pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = ring_one}
H: Funext
R: Ring
I, J: Ideal R
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

Coprime I J -> Tr (-1) {pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = ring_one}
H: Funext
R: Ring
I, J: Ideal R
c: Coprime I J

Tr (-1) {pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = ring_one}
H: Funext
R: Ring
I, J: Ideal R
d: ideal_sum I J ring_one

Tr (-1) {pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = ring_one}
H: Funext
R: Ring
I, J: Ideal R
d: subgroup_generated_type (pred_or I J) ring_one

Tr (-1) {pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = ring_one}
H: Funext
R: Ring
I, J: Ideal R
d: subgroup_generated_type (pred_or I J) ring_one

{pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = ring_one}
H: Funext
R: Ring
I, J: Ideal R
g: R
x: pred_or I J g

{pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = g}
H: Funext
R: Ring
I, J: Ideal R
{pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = mon_unit}
H: Funext
R: Ring
I, J: Ideal R
g, h: R
d1: subgroup_generated_type (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) h
IHd1: {pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = g}
IHd2: {pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = h}
{pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = sg_op g (inv h)}
H: Funext
R: Ring
I, J: Ideal R
g: R
x: pred_or I J g

{pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = g}
H: Funext
R: Ring
I, J: Ideal R
g: R
s: I g

{pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = g}
H: Funext
R: Ring
I, J: Ideal R
g: R
s: J g
{pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = g}
H: Funext
R: Ring
I, J: Ideal R
g: R
s: I g

{pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = g}
H: Funext
R: Ring
I, J: Ideal R
g: R
s: I g

g + ring_zero = g
apply rng_plus_zero_r.
H: Funext
R: Ring
I, J: Ideal R
g: R
s: J g

{pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = g}
H: Funext
R: Ring
I, J: Ideal R
g: R
s: J g

ring_zero + g = g
apply rng_plus_zero_l.
H: Funext
R: Ring
I, J: Ideal R

{pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = mon_unit}
H: Funext
R: Ring
I, J: Ideal R

ring_zero + ring_zero = mon_unit
apply rng_plus_zero_l.
H: Funext
R: Ring
I, J: Ideal R
g, h: R
d1: subgroup_generated_type (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) h
IHd1: {pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = g}
IHd2: {pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = h}

{pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = sg_op g (inv h)}
H: Funext
R: Ring
I, J: Ideal R
g, h: R
d1: subgroup_generated_type (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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}

{pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = sg_op g (inv h)}
H: Funext
R: Ring
I, J: Ideal R
g, h: R
d1: subgroup_generated_type (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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

{pat : {x : _ & I x} * {x : _ & J x} & (fst pat).1 + (snd pat).1 = sg_op g (inv h)}
H: Funext
R: Ring
I, J: Ideal R
g, h: R
d1: subgroup_generated_type (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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 (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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 (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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 (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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 (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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
(fun pat : {x : _ & I x} * {x : _ & J x} => (fst pat).1 + (snd pat).1 = sg_op g (inv h)) ((?proj1; ?proj2), (?proj10; ?proj20))
H: Funext
R: Ring
I, J: Ideal R
g, h: R
d1: subgroup_generated_type (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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 (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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)
by apply ideal_in_plus_negate.
H: Funext
R: Ring
I, J: Ideal R
g, h: R
d1: subgroup_generated_type (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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 (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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)
by apply ideal_in_plus_negate.
H: Funext
R: Ring
I, J: Ideal R
g, h: R
d1: subgroup_generated_type (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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

(fun pat : {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 (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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 (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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 (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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 (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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 (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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 (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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 (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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 (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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 (pred_or I J) g
d2: subgroup_generated_type (pred_or I J) 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

y - z = - z + y
apply commutativity.
H: Funext
R: Ring
I, J: Ideal R

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: 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 (pred_or 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 (pred_or I J) (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 (pred_or I J) (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 (pred_or I J) (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

pred_or I J (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 (r * x)
by apply 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 (pred_or I J) (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

pred_or I J (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

J (r * y)
by apply 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. *) Module Import Notation. 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. Notation Ann := ideal_annihilator. End Notation. (** *** Ideal Lemmas *) (** The zero ideal is contained in all ideals. *) Definition ideal_zero_subset {R : Ring} (I : Subgroup R) : ideal_zero R ⊆ I := trivial_subgroup_rec _. (** The unit ideal contains all ideals. *) Definition ideal_unit_subset {R : Ring} (I : Subgroup R) : I ⊆ ideal_unit R := pred_unit_subset I. (** Intersection includes into the left *) Definition ideal_intersection_subset_l {R : Ring} (I J : Ideal R) : I ∩ J ⊆ I := pred_and_subset_l I J. (** Intersection includes into the right *) Definition ideal_intersection_subset_r {R : Ring} (I J : Ideal R) : I ∩ J ⊆ J := pred_and_subset_r I J. (** Subsets of intersections *) Definition ideal_intersection_subset {R : Ring} (I J K : Ideal R) : K ⊆ I -> K ⊆ J -> K ⊆ I ∩ J := pred_and_is_meet I J K. (** Intersections are commutative *) Definition ideal_intersection_comm {R : Ring} (I J : Ideal R) : I ∩ J ↔ J ∩ I := pred_and_comm I J. (** Ideals include into their sum on the left *) Definition ideal_sum_subset_l {R : Ring} (I J : Ideal R) : I ⊆ (I + J) := subgroup_product_incl_l. (** Ideals include into their sum on the right *) Definition ideal_sum_subset_r {R : Ring} (I J : Ideal R) : J ⊆ (I + J) := subgroup_product_incl_r. #[local] Hint Extern 4 => 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

ideal_product_naive_type I J ⊆ I
R: Ring
I, J: Ideal R
x, y: R
s: I x
s0: J y

I (x * y)
by rapply isrightideal. 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

ideal_product_naive_type I J ⊆ J
R: Ring
I, J: Ideal R
x, y: R
s: I x
s0: J y

J (x * y)
by rapply isleftideal. 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

I ⋅ K ⊆ J ⋅ K
R: Ring
I, J, K: Ideal R
p: I ⊆ J

ideal_product_naive_type I K ⊆ (fun x : R => ideal_product_naive_type J K (grp_iso_id x))
R: Ring
I, J, K: Ideal R
p: I ⊆ J
x, y: R
s: I x
s0: K y

ideal_product_naive_type J K (grp_iso_id (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. 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

K ⋅ I ⊆ K ⋅ J
R: Ring
I, J, K: Ideal R
p: I ⊆ J

ideal_product_naive_type K I ⊆ (fun x : R => ideal_product_naive_type K J (grp_iso_id x))
R: Ring
I, J, K: Ideal R
p: I ⊆ J
x, y: R
s: K x
s0: I y

ideal_product_naive_type K J (grp_iso_id (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. Defined. (** The product of opposite ideals is the opposite of the reversed product. *)
R: Ring
I, J: Ideal R

I ⋅ J ↔ J ⋅ I
R: Ring
I, J: Ideal R

I ⋅ J ↔ J ⋅ I
rapply ideal_product_type_op. Defined.
R: Ring
I, J, K: Ideal R

(K ⋅ J) ⋅ I ⊆ I ⋅ (J ⋅ K)
R: Ring
I, J, K: Ideal R

(K ⋅ J) ⋅ I ⊆ I ⋅ (J ⋅ K)
R: Ring
I, J, K: Ideal R
x: rng_op R
i: ((K ⋅ J) ⋅ I) x

(I ⋅ (J ⋅ K)) x
R: Ring
I, J, K: Ideal R
x: rng_op R
i: ((K ⋅ J) ⋅ I) x

((J ⋅ K) ⋅ I) x
R: Ring
I, J, K: Ideal R
x: rng_op R
i: ((K ⋅ J) ⋅ I) x

?Goal ⊆ J ⋅ K
R: Ring
I, J, K: Ideal R
x: rng_op R
i: ((K ⋅ J) ⋅ I) x
(?Goal ⋅ I) x
R: Ring
I, J, K: Ideal R
x: rng_op R
i: ((K ⋅ J) ⋅ I) x

((K ⋅ J) ⋅ I) x
apply i. Defined. (** The product of ideals is an associative operation. *)
R: Ring
I, J, K: Ideal R

I ⋅ (J ⋅ K) ↔ (I ⋅ J) ⋅ K
R: Ring
I, J, K: Ideal R

I ⋅ (J ⋅ K) ↔ (I ⋅ J) ⋅ K
R: Ring
I, J, K: Ideal R

forall (R : Ring) (I J K : Ideal R), I ⋅ (J ⋅ K) ⊆ (I ⋅ J) ⋅ K
R: Ring
I, J, K: Ideal R
f: forall (R : Ring) (I J K : Ideal R), I ⋅ (J ⋅ K) ⊆ (I ⋅ J) ⋅ K
I ⋅ (J ⋅ K) ↔ (I ⋅ J) ⋅ K
R: Ring
I, J, K: Ideal R

forall (R : Ring) (I J K : Ideal R), I ⋅ (J ⋅ K) ⊆ (I ⋅ J) ⋅ K
R: Ring
I, J, K: Ideal R

I ⋅ (J ⋅ K) ⊆ (I ⋅ J) ⋅ K
R: Ring
I, J, K: Ideal R

ideal_product_naive_type I (J ⋅ K) ⊆ (I ⋅ J) ⋅ K
R: Ring
I, J, K: Ideal R
r, s: R
IHr: I r
IHs: (J ⋅ K) s

((I ⋅ J) ⋅ K) (r * s)
R: Ring
I, J, K: Ideal R
r, s: R
IHr: I r

(J ⋅ K) s -> ((I ⋅ J) ⋅ K) (r * s)
R: Ring
I, J, K: Ideal R
r: R
IHr: I r

ideal_product_naive_type J K ⊆ (fun x : R => ideal_product_naive_type (I ⋅ J) K (grp_homo_rng_left_mult r x))
R: Ring
I, J, K: Ideal R
r: R
IHr: I r
s, t: R
IHs: J s
IHt: K t

ideal_product_naive_type (ideal_product_type I J) K (r * (s * t))
R: Ring
I, J, K: Ideal R
r: R
IHr: I r
s, t: R
IHs: J s
IHt: K t

ideal_product_naive_type (ideal_product_type I J) K (r * s * t)
by apply ipn_in; [ apply tr, sgt_in, ipn_in | ].
R: Ring
I, J, K: Ideal R
f: forall (R : Ring) (I J K : Ideal R), I ⋅ (J ⋅ K) ⊆ (I ⋅ J) ⋅ K

I ⋅ (J ⋅ K) ↔ (I ⋅ J) ⋅ K
R: Ring
I, J, K: Ideal R
f: forall (R : Ring) (I J K : Ideal R), I ⋅ (J ⋅ K) ⊆ (I ⋅ J) ⋅ K

(I ⋅ J) ⋅ K ⊆ I ⋅ (J ⋅ K)
R: Ring
I, J, K: Ideal R
f: forall (R : Ring) (I J K : Ideal R), I ⋅ (J ⋅ K) ⊆ (I ⋅ J) ⋅ K
x: R
i: ((I ⋅ J) ⋅ K) x

(I ⋅ (J ⋅ K)) x
R: Ring
I, J, K: Ideal R
f: forall (R : Ring) (I J K : Ideal R), I ⋅ (J ⋅ K) ⊆ (I ⋅ J) ⋅ K
x: R
i: ((I ⋅ J) ⋅ K) x

((K ⋅ J) ⋅ I) x
R: Ring
I, J, K: Ideal R
f: forall (R : Ring) (I J K : Ideal R), I ⋅ (J ⋅ K) ⊆ (I ⋅ J) ⋅ K
x: R
i: ((I ⋅ J) ⋅ K) x

(K ⋅ (J ⋅ I)) x
R: Ring
I, J, K: Ideal R
f: forall (R : Ring) (I J K : Ideal R), I ⋅ (J ⋅ K) ⊆ (I ⋅ J) ⋅ K
x: R
i: ((I ⋅ J) ⋅ K) x

((I ⋅ J) ⋅ K) x
exact i. Defined. (** 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. *) Definition ideal_sum_smallest {R : Ring} (I J K : Ideal R) : I ⊆ K -> J ⊆ K -> (I + J) ⊆ K := subgroup_product_smallest I J K. (** Ideals absorb themselves under sum. *) Definition ideal_sum_self {R : Ring} (I : Ideal R) : I + I ↔ I := subgroup_product_self I. (** Sums preserve inclusions in the left summand. *) Definition ideal_sum_subset_pres_l {R : Ring} (I J K : Ideal R) : I ⊆ J -> (I + K) ⊆ (J + K) := subgroup_product_subset_pres_l I J K. (** Sums preserve inclusions in the right summand. *) Definition ideal_sum_subset_pres_r {R : Ring} (I J K : Ideal R) : I ⊆ J -> (K + I) ⊆ (K + J) := subgroup_product_subset_pres_r I J K. (** Sums preserve inclusions in both summands. *) Definition ideal_sum_subset_pres {R : Ring} (I J K L : Ideal R) : I ⊆ J -> K ⊆ L -> (I + K) ⊆ (J + L) := subgroup_product_subset_pres I J K L. (** Sums preserve ideal equality in both summands. *) Definition ideal_sum_eq {R : Ring} (I J K L : Ideal R) : I ↔ J -> K ↔ L -> (I + K) ↔ (J + L) := subgroup_product_eq I J K L. (** The sum of two opposite ideals is the opposite of their sum. *) Definition ideal_sum_op {R : Ring} (I J : Ideal R) : ideal_op R I + ideal_op R J ↔ ideal_op R (I + J) := reflexivity _. (** 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

ideal_product_naive_type I (J + K) ⊆ (I ⋅ J + I ⋅ K)
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: R
p: I r

forall s : R, (J + K)%ideal s -> (I ⋅ J + I ⋅ K)%ideal (r * s)
R: Ring
I, J, K: Ideal R
r: R
p: I r

J ⊆ subgroup_preimage (grp_homo_rng_left_mult r) (I ⋅ J + I ⋅ K)
R: Ring
I, J, K: Ideal R
r: R
p: I r
K ⊆ subgroup_preimage (grp_homo_rng_left_mult r) (I ⋅ J + I ⋅ K)
R: Ring
I, J, K: Ideal R
r: R
p: I r

J ⊆ (fun x : R => subgroup_product (I ⋅ J) (I ⋅ K) (r * x))
R: Ring
I, J, K: Ideal R
r: R
p: I r
K ⊆ (fun x : R => subgroup_product (I ⋅ J) (I ⋅ K) (r * x))
R: Ring
I, J, K: Ideal R
r: R
p: I r

J ⊆ (fun x : R => subgroup_product (I ⋅ J) (I ⋅ K) (r * x))
R: Ring
I, J, K: Ideal R
r: R
p: I r
x: R
j: J x

subgroup_product (I ⋅ J) (I ⋅ K) (r * x)
R: Ring
I, J, K: Ideal R
r: R
p: I r
x: R
j: J x

(I ⋅ J) (r * x)
by apply tr, sgt_in, ipn_in.
R: Ring
I, J, K: Ideal R
r: R
p: I r

K ⊆ (fun x : R => subgroup_product (I ⋅ J) (I ⋅ K) (r * x))
R: Ring
I, J, K: Ideal R
r: R
p: I r
x: R
k: K x

subgroup_product (I ⋅ J) (I ⋅ K) (r * x)
R: Ring
I, J, K: Ideal R
r: R
p: I r
x: R
k: K x

(I ⋅ K) (r * x)
by apply tr, sgt_in, ipn_in.
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. *)
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 + 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 ↔ ?Goal
R: Ring
I, J, K: Ideal R
?Goal ↔ I ⋅ K + J ⋅ K
R: Ring
I, J, K: Ideal R

(I + J) ⋅ K ↔ K ⋅ I + K ⋅ J
R: Ring
I, J, K: Ideal R

(I + J) ⋅ K ↔ ?Goal
R: Ring
I, J, K: Ideal R
?Goal ↔ K ⋅ I + K ⋅ J
R: Ring
I, J, K: Ideal R

(I + J) ⋅ K ↔ K ⋅ (I + J)
R: Ring
I, J, K: Ideal R

(I + J) ⋅ K ↔ ?Goal
R: Ring
I, J, K: Ideal R
?Goal ↔ K ⋅ (I + J)
R: Ring
I, J, K: Ideal R

(I + J) ⋅ K ↔ (I + J) ⋅ K
reflexivity. Defined. (** Ideal sums are commutative *) Definition ideal_sum_comm {R : Ring} (I J : Ideal R) : I + J ↔ J + I := subgroup_product_comm I J. (** Zero ideal is left additive identity. *) Definition ideal_sum_zero_l {R : Ring} I : ideal_zero R + I ↔ I := subgroup_product_trivial_l I. (** Zero ideal is right additive identity. *) Definition ideal_sum_zero_r {R : Ring} I : I + ideal_zero R ↔ I := subgroup_product_trivial_r I. (** 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)
by apply 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)
by apply tr, sgt_in, ipn_in. Defined. (** Intersecting with unit ideal on the left does nothing. *) Definition ideal_intresection_unit_l {R : Ring} I : ideal_unit R ∩ I ↔ I := pred_and_unit_l I. (** Intersecting with unit ideal on right does nothing. *) Definition ideal_intersection_unit_r {R : Ring} I : I ∩ ideal_unit R ↔ I := pred_and_unit_r I. (** 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.
R: Ring
I, J, K: Ideal R
p: I ⊆ J

leftideal_quotient I K ⊆ leftideal_quotient J K
R: Ring
I, J, K: Ideal R
p: I ⊆ J

leftideal_quotient I K ⊆ leftideal_quotient J K
R: Ring
I, J, K: Ideal R
p: I ⊆ J

(fun x : R => K ⊆ subgroup_preimage (grp_homo_rng_left_mult x) I) ⊆ (fun x : R => K ⊆ subgroup_preimage (grp_homo_rng_left_mult x) J)
R: Ring
I, J, K: Ideal R
p: I ⊆ J
r: R
q: K ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I

K ⊆ subgroup_preimage (grp_homo_rng_left_mult r) J
R: Ring
I, J, K: Ideal R
p: I ⊆ J
r: R
q: K ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I

subgroup_preimage (grp_homo_rng_left_mult r) I ⊆ subgroup_preimage (grp_homo_rng_left_mult r) J
by apply functor_subgroup_preimage. Defined.
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 :: K) ⊆ (J :: K)
R: Ring
I, J, K: Ideal R
p: I ⊆ J

(I :: K) ⊆ leftideal_quotient J K
R: Ring
I, J, K: Ideal R
p: I ⊆ J
(I :: K) ⊆ rightideal_quotient J K
R: Ring
I, J, K: Ideal R
p: I ⊆ J

(I :: K) ⊆ leftideal_quotient J K
R: Ring
I, J, K: Ideal R
p: I ⊆ J

leftideal_quotient I K ⊆ leftideal_quotient J K
by apply leftideal_quotient_subset_l.
R: Ring
I, J, K: Ideal R
p: I ⊆ J

(I :: K) ⊆ rightideal_quotient J K
R: Ring
I, J, K: Ideal R
p: I ⊆ J

rightideal_quotient I K ⊆ rightideal_quotient J K
exact (leftideal_quotient_subset_l (R:=rng_op R) I J K p). 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)
by apply 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
by apply p. Defined. (** The ideal quotient of [I] by the unit ideal 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, p: ideal_unit R ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I

I r
R: Ring
I: Ideal R
r: R
q, p: ideal_unit R ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I

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 the unit ideal by [I] is the unit ideal. *)
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, p: (J + K) ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
x: R
jk: J x

subgroup_preimage (grp_homo_rng_left_mult r) I x
R: Ring
I, J, K: Ideal R
r: R
q, p: (J + K) ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
x: rng_op R
jk: J x
subgroup_preimage (grp_homo_rng_left_mult r) I x
R: Ring
I, J, K: Ideal R
r: R
q, p: (J + K) ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
x: R
jk: K x
subgroup_preimage (grp_homo_rng_left_mult r) I x
R: Ring
I, J, K: Ideal R
r: R
q, p: (J + K) ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
x: rng_op R
jk: K x
subgroup_preimage (grp_homo_rng_left_mult r) I x
R: Ring
I, J, K: Ideal R
r: R
q, p: (J + K) ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
x: R
jk: J x

subgroup_preimage (grp_homo_rng_left_mult r) I x
by rapply p; rapply ideal_sum_subset_l.
R: Ring
I, J, K: Ideal R
r: R
q, p: (J + K) ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
x: rng_op R
jk: J x

subgroup_preimage (grp_homo_rng_left_mult r) I x
by rapply q; rapply ideal_sum_subset_l.
R: Ring
I, J, K: Ideal R
r: R
q, p: (J + K) ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
x: R
jk: K x

subgroup_preimage (grp_homo_rng_left_mult r) I x
by rapply p; rapply ideal_sum_subset_r.
R: Ring
I, J, K: Ideal R
r: R
q, p: (J + K) ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
x: rng_op R
jk: K x

subgroup_preimage (grp_homo_rng_left_mult r) I 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, u: K ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
q, p: J ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I

(J + K) ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
R: Ring
I, J, K: Ideal R
r: R
v, u: K ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
q, p: J ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
(J + K) ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
R: Ring
I, J, K: Ideal R
r: R
v, u: K ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
q, p: J ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I

(J + K) ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
R: Ring
I, J, K: Ideal R
r: R
v, u: K ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
q, p: J ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I

pred_or J K ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
by napply pred_or_is_join.
R: Ring
I, J, K: Ideal R
r: R
v, u: K ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
q, p: J ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I

(J + K) ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
R: Ring
I, J, K: Ideal R
r: R
v, u: K ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
q, p: J ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I

pred_or J K ⊆ subgroup_preimage (grp_homo_rng_left_mult r) I
by napply pred_or_is_join. 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

(I ∩ J :: K) ⊆ (I :: K)
R: Ring
I, J, K: Ideal R
(I ∩ J :: K) ⊆ (J :: K)
R: Ring
I, J, K: Ideal R

(I ∩ J :: K) ⊆ (I :: K)
R: Ring
I, J, K: Ideal R

I ∩ J ⊆ I
apply pred_and_subset_l.
R: Ring
I, J, K: Ideal R

(I ∩ J :: K) ⊆ (J :: K)
R: Ring
I, J, K: Ideal R

I ∩ J ⊆ J
apply pred_and_subset_r.
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
strip_truncations; split; apply tr; by napply pred_and_is_meet. 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': forall x0 : rng_op R, J x0 -> x * x0 = ring_zero
q: forall x0 : 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': forall x0 : rng_op R, J x0 -> x * x0 = ring_zero
q: forall x0 : 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': forall x0 : rng_op R, J x0 -> x * x0 = ring_zero
q: forall x0 : R, J x0 -> x * x0 = ring_zero
y: R
i: I y

x * y = ring_zero
by apply q, p.
R: Ring
I, J: Ideal R
p: I ⊆ J
x: R
q': forall x0 : rng_op R, J x0 -> x * x0 = ring_zero
q: forall x0 : R, J x0 -> x * x0 = ring_zero
y: rng_op R
i: I y

x * y = ring_zero
by apply 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: forall x0 : rng_op R, I x0 -> x * x0 = ring_zero
p: forall x0 : R, I x0 -> x * x0 = ring_zero
y: R
i: I y

subgroup_preimage (grp_homo_rng_left_mult x) (ideal_zero R) y
R: Ring
I: Ideal R
x: R
q: forall x0 : rng_op R, I x0 -> x * x0 = ring_zero
p: forall x0 : R, I x0 -> x * x0 = ring_zero
y: rng_op R
i: I y
subgroup_preimage (grp_homo_rng_left_mult x) (ideal_zero R) y
R: Ring
I: Ideal R
x: R
q: forall x0 : rng_op R, I x0 -> x * x0 = ring_zero
p: forall x0 : R, I x0 -> x * x0 = ring_zero
y: R
i: I y

subgroup_preimage (grp_homo_rng_left_mult x) (ideal_zero R) y
exact (p y i).
R: Ring
I: Ideal R
x: R
q: forall x0 : rng_op R, I x0 -> x * x0 = ring_zero
p: forall x0 : R, I x0 -> x * x0 = ring_zero
y: rng_op R
i: I y

subgroup_preimage (grp_homo_rng_left_mult x) (ideal_zero R) 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, p: I ⊆ subgroup_preimage (grp_homo_rng_left_mult x) (ideal_zero R)
y: R
i: I y

x * y = ring_zero
R: Ring
I: Ideal R
x: R
q, p: I ⊆ subgroup_preimage (grp_homo_rng_left_mult x) (ideal_zero R)
y: rng_op R
i: I y
x * y = ring_zero
R: Ring
I: Ideal R
x: R
q, p: I ⊆ subgroup_preimage (grp_homo_rng_left_mult x) (ideal_zero R)
y: R
i: I y

x * y = ring_zero
exact (p y i).
R: Ring
I: Ideal R
x: R
q, p: I ⊆ subgroup_preimage (grp_homo_rng_left_mult x) (ideal_zero R)
y: rng_op R
i: I y

x * y = ring_zero
exact (q y i). Defined. (** ** 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. Instance isrightideal_preimage {R S : 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. Instance isideal_preimage {R S : Ring} (f : R $-> S) (I : Subgroup S) `{IsIdeal S I} : IsIdeal (subgroup_preimage f I) := {}. Definition ideal_preimage {R S : 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. *) Definition ideal_extension {R S : Ring} (f : R $-> S) (I : Ideal R) : Ideal S := ideal_generated (fun s => exists r, 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

(fun s : S => {r : R & (ideal_preimage f I r * (f r = s))%type}) ⊆ I
R, S: Ring
f: R $-> S
I: Ideal S
s: S
r: R
p: ideal_preimage f I r
q: f r = s

I s
R, S: Ring
f: R $-> S
I: Ideal S
r: R
p: ideal_preimage f I r

I (f r)
exact p. Defined. (** TODO: Maximal ideals *) (** TODO: Principal ideal *) (** TODO: Prime ideals *) (** TODO: Radical ideals *) (** TODO: Minimal ideals *) (** TODO: Primary ideals *)