Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Algebra.Congruence. Require Import Algebra.AbGroups. Require Import Classes.interfaces.abstract_algebra. Require Import Algebra.Rings.Ring. Require Import Algebra.Rings.Ideal. (** * Quotient Rings *) (** In this file we define the quotient of a ring by an ideal. *) Import Ideal.Notation. Local Open Scope ring_scope. Local Open Scope wc_iso_scope. Section QuotientRing. Context (R : Ring) (I : Ideal R). Instance plus_quotient_group : Plus (QuotientAbGroup R I) := group_sgop.
R: Ring
I: Ideal R

IsCongruence (in_cosetL I)
R: Ring
I: Ideal R

IsCongruence (in_cosetL I)
R: Ring
I: Ideal R

forall x x' y y' : R, in_cosetL I x x' -> in_cosetL I y y' -> in_cosetL I (sg_op x y) (sg_op x' y')
R: Ring
I: Ideal R
x, x', y, y': R
p: in_cosetL I x x'
q: in_cosetL I y y'

in_cosetL I (sg_op x y) (sg_op x' y')
R: Ring
I: Ideal R
x, x', y, y': R
p: in_cosetL I x x'
q: in_cosetL I y y'

I (- (x * y) + x' * y')
R: Ring
I: Ideal R
x, x', y, y': R
p: in_cosetL I x x'
q: in_cosetL I y y'

I (- (x * y) + (0 + x' * y'))
R: Ring
I: Ideal R
x, x', y, y': R
p: in_cosetL I x x'
q: in_cosetL I y y'

I (- (x * y) + (x' * y - x' * y + x' * y'))
R: Ring
I: Ideal R
x, x', y, y': R
p: in_cosetL I x x'
q: in_cosetL I y y'

I (- (x * y) + x' * y - x' * y + x' * y')
R: Ring
I: Ideal R
x, x', y, y': R
p: in_cosetL I x x'
q: in_cosetL I y y'

I (- x * y + x' * y - x' * y + x' * y')
R: Ring
I: Ideal R
x, x', y, y': R
p: in_cosetL I x x'
q: in_cosetL I y y'

I ((- x + x') * y - x' * y + x' * y')
R: Ring
I: Ideal R
x, x', y, y': R
p: in_cosetL I x x'
q: in_cosetL I y y'

I ((- x + x') * y + (- (x' * y) + x' * y'))
R: Ring
I: Ideal R
x, x', y, y': R
p: in_cosetL I x x'
q: in_cosetL I y y'

I ((- x + x') * y + (x' * - y + x' * y'))
R: Ring
I: Ideal R
x, x', y, y': R
p: in_cosetL I x x'
q: in_cosetL I y y'

I ((- x + x') * y + x' * (- y + y'))
R: Ring
I: Ideal R
x, x', y, y': R
p: in_cosetL I x x'
q: in_cosetL I y y'

I ((- x + x') * y)
R: Ring
I: Ideal R
x, x', y, y': R
p: in_cosetL I x x'
q: in_cosetL I y y'
I (x' * (- y + y'))
R: Ring
I: Ideal R
x, x', y, y': R
p: in_cosetL I x x'
q: in_cosetL I y y'

I ((- x + x') * y)
by rapply isrightideal.
R: Ring
I: Ideal R
x, x', y, y': R
p: in_cosetL I x x'
q: in_cosetL I y y'

I (x' * (- y + y'))
by rapply isleftideal. Defined.
R: Ring
I: Ideal R

Mult (QuotientAbGroup R I)
R: Ring
I: Ideal R

Mult (QuotientAbGroup R I)
R: Ring
I: Ideal R
x: QuotientAbGroup R I

QuotientAbGroup R I -> QuotientAbGroup R I
R: Ring
I: Ideal R
x: QuotientAbGroup R I

R -> QuotientAbGroup R I
R: Ring
I: Ideal R
x: QuotientAbGroup R I
forall x0 y : R, in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} x0 y -> ?pclass x0 = ?pclass y
R: Ring
I: Ideal R
x: QuotientAbGroup R I

R -> QuotientAbGroup R I
R: Ring
I: Ideal R
y: R

QuotientAbGroup R I -> QuotientAbGroup R I
R: Ring
I: Ideal R
y: R

R -> QuotientAbGroup R I
R: Ring
I: Ideal R
y: R
forall x y0 : R, in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} x y0 -> ?pclass x = ?pclass y0
R: Ring
I: Ideal R
y: R

R -> QuotientAbGroup R I
R: Ring
I: Ideal R
y, x: R

QuotientAbGroup R I
R: Ring
I: Ideal R
y, x: R

R
exact (x * y).
R: Ring
I: Ideal R
y: R

forall x y0 : R, in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} x y0 -> (fun x0 : R => class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (x0 * y)) x = (fun x0 : R => class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (x0 * y)) y0
R: Ring
I: Ideal R
y, x, x': R
p: in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} x x'

(fun x : R => class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (x * y)) x = (fun x : R => class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (x * y)) x'
R: Ring
I: Ideal R
y, x, x': R
p: in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} x x'

in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} (x * y) (x' * y)
by rapply iscong.
R: Ring
I: Ideal R
x: QuotientAbGroup R I

forall x0 y : R, in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} x0 y -> (fun y0 : R => Quotient_rec (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (QuotientAbGroup R I) (fun x : R => class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (x * y0)) (fun (x x' : R) (p : in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} x x') => qglue (iscong p (reflexive_in_cosetL I y0))) x) x0 = (fun y0 : R => Quotient_rec (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (QuotientAbGroup R I) (fun x : R => class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (x * y0)) (fun (x x' : R) (p : in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} x x') => qglue (iscong p (reflexive_in_cosetL I y0))) x) y
R: Ring
I: Ideal R
x: QuotientAbGroup R I
y, y': R
q: in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} y y'

(fun y : R => Quotient_rec (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (QuotientAbGroup R I) (fun x : R => class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (x * y)) (fun (x x' : R) (p : in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} x x') => qglue (iscong p (reflexive_in_cosetL I y))) x) y = (fun y : R => Quotient_rec (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (QuotientAbGroup R I) (fun x : R => class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (x * y)) (fun (x x' : R) (p : in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} x x') => qglue (iscong p (reflexive_in_cosetL I y))) x) y'
R: Ring
I: Ideal R
y, y': R
q: in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} y y'

forall x : QuotientAbGroup R I, (fun y : R => Quotient_rec (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (QuotientAbGroup R I) (fun x0 : R => class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (x0 * y)) (fun (x0 x' : R) (p : in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} x0 x') => qglue (iscong p (reflexive_in_cosetL I y))) x) y = (fun y : R => Quotient_rec (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (QuotientAbGroup R I) (fun x0 : R => class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (x0 * y)) (fun (x0 x' : R) (p : in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} x0 x') => qglue (iscong p (reflexive_in_cosetL I y))) x) y'
R: Ring
I: Ideal R
y, y': R
q: in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} y y'

forall x : R, (fun q : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => (fun y : R => Quotient_rec (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (QuotientAbGroup R I) (fun x0 : R => class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (x0 * y)) (fun (x0 x' : R) (p : in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} x0 x') => qglue (iscong p (reflexive_in_cosetL I y))) q) y = (fun y : R => Quotient_rec (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (QuotientAbGroup R I) (fun x0 : R => class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (x0 * y)) (fun (x0 x' : R) (p : in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} x0 x') => qglue (iscong p (reflexive_in_cosetL I y))) q) y') (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) x)
R: Ring
I: Ideal R
y, y': R
q: in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} y y'
x: R

(fun q : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => (fun y : R => Quotient_rec (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (QuotientAbGroup R I) (fun x : R => class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (x * y)) (fun (x x' : R) (p : in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} x x') => qglue (iscong p (reflexive_in_cosetL I y))) q) y = (fun y : R => Quotient_rec (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (QuotientAbGroup R I) (fun x : R => class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (x * y)) (fun (x x' : R) (p : in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} x x') => qglue (iscong p (reflexive_in_cosetL I y))) q) y') (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) x)
R: Ring
I: Ideal R
y, y': R
q: in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} y y'
x: R

class_of (fun x y : R => I (sg_op (- x) y)) (x * y) = class_of (fun x y : R => I (sg_op (- x) y)) (x * y')
R: Ring
I: Ideal R
y, y': R
q: in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} y y'
x: R

I (sg_op (- (x * y)) (x * y'))
by rapply iscong. Defined. Instance one_quotient_abgroup : One (QuotientAbGroup R I) := class_of _ one.
R: Ring
I: Ideal R

IsRing (QuotientAbGroup R I)
R: Ring
I: Ideal R

IsRing (QuotientAbGroup R I)
R: Ring
I: Ideal R

IsAbGroup (QuotientAbGroup R I)
R: Ring
I: Ideal R
IsMonoid (QuotientAbGroup R I)
R: Ring
I: Ideal R
LeftDistribute mult plus
R: Ring
I: Ideal R
RightDistribute mult plus
R: Ring
I: Ideal R

IsMonoid (QuotientAbGroup R I)
R: Ring
I: Ideal R
LeftDistribute mult plus
R: Ring
I: Ideal R
RightDistribute mult plus
R: Ring
I: Ideal R

IsHSet (QuotientAbGroup R I)
R: Ring
I: Ideal R
Associative sg_op
R: Ring
I: Ideal R
LeftIdentity sg_op mon_unit
R: Ring
I: Ideal R
RightIdentity sg_op mon_unit
R: Ring
I: Ideal R
LeftDistribute mult plus
R: Ring
I: Ideal R
RightDistribute mult plus
R: Ring
I: Ideal R

Associative sg_op
R: Ring
I: Ideal R
LeftIdentity sg_op mon_unit
R: Ring
I: Ideal R
RightIdentity sg_op mon_unit
R: Ring
I: Ideal R
LeftDistribute mult plus
R: Ring
I: Ideal R
RightDistribute mult plus
(** Associativity follows from the underlying operation *)
R: Ring
I: Ideal R

Associative sg_op
R: Ring
I: Ideal R
x, y: QuotientAbGroup R I

forall z : QuotientAbGroup R I, sg_op x (sg_op y z) = sg_op (sg_op x y) z
R: Ring
I: Ideal R
x: QuotientAbGroup R I
z: R

forall y : QuotientAbGroup R I, (fun q : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => sg_op x (sg_op y q) = sg_op (sg_op x y) q) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) z)
R: Ring
I: Ideal R
z, y: R

forall x : QuotientAbGroup R I, (fun q : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => (fun q0 : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => sg_op x (sg_op q q0) = sg_op (sg_op x q) q0) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) z)) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) y)
R: Ring
I: Ideal R
z, y, x: R

(fun q : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => (fun q0 : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => (fun q1 : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => sg_op q (sg_op q0 q1) = sg_op (sg_op q q0) q1) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) z)) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) y)) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) x)
R: Ring
I: Ideal R
z, y, x: R

class_of (fun x y : R => I (sg_op (- x) y)) (x * (y * z)) = class_of (fun x y : R => I (sg_op (- x) y)) (x * y * z)
R: Ring
I: Ideal R
z, y, x: R

x * (y * z) = x * y * z
apply associativity.
R: Ring
I: Ideal R

LeftIdentity sg_op mon_unit
R: Ring
I: Ideal R
RightIdentity sg_op mon_unit
R: Ring
I: Ideal R
LeftDistribute mult plus
R: Ring
I: Ideal R
RightDistribute mult plus
(* Left and right identity follow from the underlying structure *)
R: Ring
I: Ideal R
x: R

(fun q : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => sg_op mon_unit q = q) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) x)
R: Ring
I: Ideal R
x: R
(fun q : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => sg_op q mon_unit = q) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) x)
R: Ring
I: Ideal R
LeftDistribute mult plus
R: Ring
I: Ideal R
RightDistribute mult plus
R: Ring
I: Ideal R
x: R

class_of (fun x y : R => I (sg_op (- x) y)) (1 * x) = class_of (fun x y : R => I (sg_op (- x) y)) x
R: Ring
I: Ideal R
x: R
class_of (fun x y : R => I (sg_op (- x) y)) (x * 1) = class_of (fun x y : R => I (sg_op (- x) y)) x
R: Ring
I: Ideal R
LeftDistribute mult plus
R: Ring
I: Ideal R
RightDistribute mult plus
R: Ring
I: Ideal R
x: R

1 * x = x
R: Ring
I: Ideal R
x: R
x * 1 = x
R: Ring
I: Ideal R
LeftDistribute mult plus
R: Ring
I: Ideal R
RightDistribute mult plus
R: Ring
I: Ideal R
x: R

x * 1 = x
R: Ring
I: Ideal R
LeftDistribute mult plus
R: Ring
I: Ideal R
RightDistribute mult plus
R: Ring
I: Ideal R

LeftDistribute mult plus
R: Ring
I: Ideal R
RightDistribute mult plus
(** Finally distributivity also follows *)
R: Ring
I: Ideal R

LeftDistribute mult plus
R: Ring
I: Ideal R
x, y: QuotientAbGroup R I

forall c : QuotientAbGroup R I, x * (y + c) = x * y + x * c
R: Ring
I: Ideal R
x: QuotientAbGroup R I
z: R

forall y : QuotientAbGroup R I, (fun q : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => x * (y + q) = x * y + x * q) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) z)
R: Ring
I: Ideal R
z, y: R

forall x : QuotientAbGroup R I, (fun q : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => (fun q0 : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => x * (q + q0) = x * q + x * q0) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) z)) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) y)
R: Ring
I: Ideal R
z, y, x: R

(fun q : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => (fun q0 : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => (fun q1 : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => q * (q0 + q1) = q * q0 + q * q1) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) z)) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) y)) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) x)
R: Ring
I: Ideal R
z, y, x: R

class_of (fun x y : R => I (sg_op (- x) y)) (ring_mult x (sg_op y z)) = class_of (fun x y : R => I (sg_op (- x) y)) (sg_op (ring_mult x y) (ring_mult x z))
R: Ring
I: Ideal R
z, y, x: R

ring_mult x (sg_op y z) = sg_op (ring_mult x y) (ring_mult x z)
apply simple_distribute_l.
R: Ring
I: Ideal R

RightDistribute mult plus
R: Ring
I: Ideal R

RightDistribute mult plus
R: Ring
I: Ideal R
x, y: QuotientAbGroup R I

forall c : QuotientAbGroup R I, (x + y) * c = x * c + y * c
R: Ring
I: Ideal R
x: QuotientAbGroup R I
z: R

forall y : QuotientAbGroup R I, (fun q : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => (x + y) * q = x * q + y * q) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) z)
R: Ring
I: Ideal R
z, y: R

forall x : QuotientAbGroup R I, (fun q : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => (fun q0 : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => (x + q) * q0 = x * q0 + q * q0) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) z)) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) y)
R: Ring
I: Ideal R
z, y, x: R

(fun q : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => (fun q0 : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => (fun q1 : Quotient (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) => (q + q0) * q1 = q * q1 + q0 * q1) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) z)) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) y)) (class_of (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) x)
R: Ring
I: Ideal R
z, y, x: R

class_of (fun x y : R => I (sg_op (- x) y)) (ring_mult (sg_op x y) z) = class_of (fun x y : R => I (sg_op (- x) y)) (sg_op (ring_mult x z) (ring_mult y z))
R: Ring
I: Ideal R
z, y, x: R

ring_mult (sg_op x y) z = sg_op (ring_mult x z) (ring_mult y z)
apply simple_distribute_r. } Defined. Definition QuotientRing : Ring := Build_Ring (QuotientAbGroup R I) _ _ _ _ _. End QuotientRing. Infix "/" := QuotientRing : ring_scope. (** Quotient map *)
R: Ring
I: Ideal R

RingHomomorphism R (R / I)
R: Ring
I: Ideal R

RingHomomorphism R (R / I)
R: Ring
I: Ideal R

GroupHomomorphism R (R / I)
R: Ring
I: Ideal R
IsMonoidPreserving ?map
R: Ring
I: Ideal R

IsMonoidPreserving grp_quotient_map
repeat split. Defined.
R: Ring
I: Ideal R

ReflectiveSubuniverse.IsConnMap (Tr (-1)) (rng_quotient_map I)
R: Ring
I: Ideal R

ReflectiveSubuniverse.IsConnMap (Tr (-1)) (rng_quotient_map I)
exact _. Defined. (** *** Specialized induction principles *) (** We provide some specialized induction principes for [QuotientRing] that require cleaner hypotheses than the ones given by [Quotient_ind]. *) Definition QuotientRing_ind {R : Ring} {I : Ideal R} (P : R / I -> Type) `{forall x, IsHSet (P x)} (c : forall (x : R), P (rng_quotient_map I x)) (g : forall (x y : R) (h : I (- x + y)), qglue h # c x = c y) : forall (r : R / I), P r := Quotient_ind _ P c g. (** And a version eliminating into hprops. This one is especially useful. *) Definition QuotientRing_ind_hprop {R : Ring} {I : Ideal R} (P : R / I -> Type) `{forall x, IsHProp (P x)} (c : forall (x : R), P (rng_quotient_map I x)) : forall (r : R / I), P r := Quotient_ind_hprop _ P c. (** ** Quotient thoery *) (** First isomorphism theorem for commutative rings *)
H: Funext
A, B: Ring
f: A $-> B

A / ideal_kernel f ≅ rng_image f
H: Funext
A, B: Ring
f: A $-> B

A / ideal_kernel f ≅ rng_image f
H: Funext
A, B: Ring
f: A $-> B

GroupIsomorphism (A / ideal_kernel f) (rng_image f)
H: Funext
A, B: Ring
f: A $-> B
IsMonoidPreserving ?e
H: Funext
A, B: Ring
f: A $-> B

IsMonoidPreserving (abgroup_first_iso f)
H: Funext
A, B: Ring
f: A $-> B

IsSemiGroupPreserving (abgroup_first_iso f)
H: Funext
A, B: Ring
f: A $-> B
IsUnitPreserving (abgroup_first_iso f)
H: Funext
A, B: Ring
f: A $-> B

IsSemiGroupPreserving (abgroup_first_iso f)
H: Funext
A, B: Ring
f: A $-> B
x, y: A / ideal_kernel f

abgroup_first_iso f (sg_op x y) = sg_op (abgroup_first_iso f x) (abgroup_first_iso f y)
H: Funext
A, B: Ring
f: A $-> B
x: A / ideal_kernel f
y: A

(fun r : A / ideal_kernel f => abgroup_first_iso f (sg_op x r) = sg_op (abgroup_first_iso f x) (abgroup_first_iso f r)) (rng_quotient_map (ideal_kernel f) y)
H: Funext
A, B: Ring
f: A $-> B
y, x: A

(fun r : A / ideal_kernel f => (fun r0 : A / ideal_kernel f => abgroup_first_iso f (sg_op r r0) = sg_op (abgroup_first_iso f r) (abgroup_first_iso f r0)) (rng_quotient_map (ideal_kernel f) y)) (rng_quotient_map (ideal_kernel f) x)
H: Funext
A, B: Ring
f: A $-> B
y, x: A

(abgroup_first_iso f (sg_op (rng_quotient_map (ideal_kernel f) x) (rng_quotient_map (ideal_kernel f) y))).1 = (sg_op (abgroup_first_iso f (rng_quotient_map (ideal_kernel f) x)) (abgroup_first_iso f (rng_quotient_map (ideal_kernel f) y))).1
exact (rng_homo_mult _ _ _).
H: Funext
A, B: Ring
f: A $-> B

IsUnitPreserving (abgroup_first_iso f)
H: Funext
A, B: Ring
f: A $-> B

(abgroup_first_iso f mon_unit).1 = mon_unit.1
exact (rng_homo_one _). Defined. (** Invariance of equal ideals *)
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal

R / I ≅ R / J
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal

R / I ≅ R / J
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal

R / I <~> R / J
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
IsSemiRingPreserving ?e
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal

R / I <~> R / J
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal

R <~> R
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
forall x y : R, in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} x y <-> in_cosetL {| normalsubgroup_subgroup := J; normalsubgroup_isnormal := isnormal_ab_subgroup R J |} (?f x) (?f y)
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal

forall x y : R, in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} x y <-> in_cosetL {| normalsubgroup_subgroup := J; normalsubgroup_isnormal := isnormal_ab_subgroup R J |} (1%equiv x) (1%equiv y)
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
x, y: R

I (sg_op (- x) y) <-> J (sg_op (- x) y)
apply p.
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal

IsSemiRingPreserving (equiv_quotient_functor' (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (in_cosetL {| normalsubgroup_subgroup := J; normalsubgroup_isnormal := isnormal_ab_subgroup R J |}) 1 (fun x y : R => p (sg_op (- x) y) : in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |} x y <-> in_cosetL {| normalsubgroup_subgroup := J; normalsubgroup_isnormal := isnormal_ab_subgroup R J |} (1%equiv x) (1%equiv y)))
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal

IsSemiGroupPreserving (equiv_quotient_functor' (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (in_cosetL {| normalsubgroup_subgroup := J; normalsubgroup_isnormal := isnormal_ab_subgroup R J |}) 1 (fun x y : R => p (sg_op (- x) y)))
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
IsSemiGroupPreserving (equiv_quotient_functor' (in_cosetL {| normalsubgroup_subgroup := I; normalsubgroup_isnormal := isnormal_ab_subgroup R I |}) (in_cosetL {| normalsubgroup_subgroup := J; normalsubgroup_isnormal := isnormal_ab_subgroup R J |}) 1 (fun x y : R => p (sg_op (- x) y)))
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
x: R / I

forall y : Quotient (fun x y : R => I (sg_op (- x) y)), Quotient_functor (fun x y0 : R => I (sg_op (- x) y0)) (fun x y0 : R => J (sg_op (- x) y0)) idmap (fun x y0 : R => fst (p (sg_op (- x) y0))) (sg_op x y) = sg_op (Quotient_functor (fun x y0 : R => I (sg_op (- x) y0)) (fun x y0 : R => J (sg_op (- x) y0)) idmap (fun x y0 : R => fst (p (sg_op (- x) y0))) x) (Quotient_functor (fun x y0 : R => I (sg_op (- x) y0)) (fun x y0 : R => J (sg_op (- x) y0)) idmap (fun x y0 : R => fst (p (sg_op (- x) y0))) y)
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
x: R / I
forall y : Quotient (fun x y : R => I (sg_op (- x) y)), Quotient_functor (fun x y0 : R => I (sg_op (- x) y0)) (fun x y0 : R => J (sg_op (- x) y0)) idmap (fun x y0 : R => fst (p (sg_op (- x) y0))) (sg_op x y) = sg_op (Quotient_functor (fun x y0 : R => I (sg_op (- x) y0)) (fun x y0 : R => J (sg_op (- x) y0)) idmap (fun x y0 : R => fst (p (sg_op (- x) y0))) x) (Quotient_functor (fun x y0 : R => I (sg_op (- x) y0)) (fun x y0 : R => J (sg_op (- x) y0)) idmap (fun x y0 : R => fst (p (sg_op (- x) y0))) y)
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
x: R / I

forall x0 : R, (fun r : R / I => Quotient_functor (fun x y : R => I (sg_op (- x) y)) (fun x y : R => J (sg_op (- x) y)) idmap (fun x y : R => fst (p (sg_op (- x) y))) (sg_op x r) = sg_op (Quotient_functor (fun x y : R => I (sg_op (- x) y)) (fun x y : R => J (sg_op (- x) y)) idmap (fun x y : R => fst (p (sg_op (- x) y))) x) (Quotient_functor (fun x y : R => I (sg_op (- x) y)) (fun x y : R => J (sg_op (- x) y)) idmap (fun x y : R => fst (p (sg_op (- x) y))) r)) (rng_quotient_map I x0)
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
x: R / I
forall x0 : R, (fun r : R / I => Quotient_functor (fun x y : R => I (sg_op (- x) y)) (fun x y : R => J (sg_op (- x) y)) idmap (fun x y : R => fst (p (sg_op (- x) y))) (sg_op x r) = sg_op (Quotient_functor (fun x y : R => I (sg_op (- x) y)) (fun x y : R => J (sg_op (- x) y)) idmap (fun x y : R => fst (p (sg_op (- x) y))) x) (Quotient_functor (fun x y : R => I (sg_op (- x) y)) (fun x y : R => J (sg_op (- x) y)) idmap (fun x y : R => fst (p (sg_op (- x) y))) r)) (rng_quotient_map I x0)
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
y: R

forall x : R / I, (fun r : R / I => Quotient_functor (fun x0 y : R => I (sg_op (- x0) y)) (fun x0 y : R => J (sg_op (- x0) y)) idmap (fun x0 y : R => fst (p (sg_op (- x0) y))) (sg_op x r) = sg_op (Quotient_functor (fun x0 y : R => I (sg_op (- x0) y)) (fun x0 y : R => J (sg_op (- x0) y)) idmap (fun x0 y : R => fst (p (sg_op (- x0) y))) x) (Quotient_functor (fun x0 y : R => I (sg_op (- x0) y)) (fun x0 y : R => J (sg_op (- x0) y)) idmap (fun x0 y : R => fst (p (sg_op (- x0) y))) r)) (rng_quotient_map I y)
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
y: R
forall x : R / I, (fun r : R / I => Quotient_functor (fun x0 y : R => I (sg_op (- x0) y)) (fun x0 y : R => J (sg_op (- x0) y)) idmap (fun x0 y : R => fst (p (sg_op (- x0) y))) (sg_op x r) = sg_op (Quotient_functor (fun x0 y : R => I (sg_op (- x0) y)) (fun x0 y : R => J (sg_op (- x0) y)) idmap (fun x0 y : R => fst (p (sg_op (- x0) y))) x) (Quotient_functor (fun x0 y : R => I (sg_op (- x0) y)) (fun x0 y : R => J (sg_op (- x0) y)) idmap (fun x0 y : R => fst (p (sg_op (- x0) y))) r)) (rng_quotient_map I y)
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
y: R

forall x : R, (fun r : R / I => (fun r0 : R / I => Quotient_functor (fun x0 y : R => I (sg_op (- x0) y)) (fun x0 y : R => J (sg_op (- x0) y)) idmap (fun x0 y : R => fst (p (sg_op (- x0) y))) (sg_op r r0) = sg_op (Quotient_functor (fun x0 y : R => I (sg_op (- x0) y)) (fun x0 y : R => J (sg_op (- x0) y)) idmap (fun x0 y : R => fst (p (sg_op (- x0) y))) r) (Quotient_functor (fun x0 y : R => I (sg_op (- x0) y)) (fun x0 y : R => J (sg_op (- x0) y)) idmap (fun x0 y : R => fst (p (sg_op (- x0) y))) r0)) (rng_quotient_map I y)) (rng_quotient_map I x)
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
y: R
forall x : R, (fun r : R / I => (fun r0 : R / I => Quotient_functor (fun x0 y : R => I (sg_op (- x0) y)) (fun x0 y : R => J (sg_op (- x0) y)) idmap (fun x0 y : R => fst (p (sg_op (- x0) y))) (sg_op r r0) = sg_op (Quotient_functor (fun x0 y : R => I (sg_op (- x0) y)) (fun x0 y : R => J (sg_op (- x0) y)) idmap (fun x0 y : R => fst (p (sg_op (- x0) y))) r) (Quotient_functor (fun x0 y : R => I (sg_op (- x0) y)) (fun x0 y : R => J (sg_op (- x0) y)) idmap (fun x0 y : R => fst (p (sg_op (- x0) y))) r0)) (rng_quotient_map I y)) (rng_quotient_map I x)
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
y, x: R

J (sg_op (- sg_op x y) (sg_op x y))
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
y, x: R
J (sg_op (- (x * y)) (x * y))
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
y, x: R

J (- (x + y) + (x + y))
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
y, x: R
J (sg_op (- (x * y)) (x * y))
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
y, x: R

J (- (x + y) + (x + y))
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
y, x: R
J (- (x * y) + x * y)
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
y, x: R

J 0
R: Ring
I, J: Ideal R
p: (I ↔ J)%ideal
y, x: R
J 0
1,2: apply ideal_in_zero. Defined. (** We phrase the first ring isomorphism theroem in a slightly differnt way so that it is easier to use. This form specifically asks for a surjective map *)
H: Funext
A, B: Ring
f: A $-> B
issurj_f: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f
I: Ideal A
p: (I ↔ ideal_kernel f)%ideal

A / I ≅ B
H: Funext
A, B: Ring
f: A $-> B
issurj_f: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f
I: Ideal A
p: (I ↔ ideal_kernel f)%ideal

A / I ≅ B
H: Funext
A, B: Ring
f: A $-> B
issurj_f: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f
I: Ideal A
p: (I ↔ ideal_kernel f)%ideal

A / I ≅ ?Goal
H: Funext
A, B: Ring
f: A $-> B
issurj_f: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f
I: Ideal A
p: (I ↔ ideal_kernel f)%ideal
?Goal ≅ B
H: Funext
A, B: Ring
f: A $-> B
issurj_f: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f
I: Ideal A
p: (I ↔ ideal_kernel f)%ideal

A / ideal_kernel f ≅ B
H: Funext
A, B: Ring
f: A $-> B
issurj_f: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f
I: Ideal A
p: (I ↔ ideal_kernel f)%ideal

A / ideal_kernel f ≅ ?Goal
H: Funext
A, B: Ring
f: A $-> B
issurj_f: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f
I: Ideal A
p: (I ↔ ideal_kernel f)%ideal
?Goal ≅ B
H: Funext
A, B: Ring
f: A $-> B
issurj_f: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f
I: Ideal A
p: (I ↔ ideal_kernel f)%ideal

A / ideal_kernel f ≅ rng_image f
apply rng_first_iso. Defined.