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]
LocalOpen Scope mc_scope.(** * Localization of commutative rings *)(** Localization is a way to make elements in a commutative ring invertible by adding inverses, in the most minimal way possible. It generalizes the familiar operation of a field of fractions. *)(** ** Multiplicative subsets *)(** A multiplicative subset is formally a submonoid of the multiplicative monoid of a ring. Essentially it is a subset closed under finite products. *)(** *** Definition *)(** Multiplicative subsets of a ring [R] consist of: *)ClassIsMultiplicativeSubset {R : CRing} (S : R -> Type) : Type := {
(** Contains one *)
mss_one : S 1 ;
(** Closed under multiplication *)
mss_mult : forallxy, S x -> S y -> S (x * y) ;
}.Arguments mss_one {R _ _}.Arguments mss_mult {R _ _ _ _}.(** *** Examples *)(** The multiplicative subset of powers of a ring element. *)
R: CRing x: R
IsMultiplicativeSubset
(funr : R => {n : nat & rng_power x n = r})
R: CRing x: R
IsMultiplicativeSubset
(funr : R => {n : nat & rng_power x n = r})
R: CRing x: R
{n : nat & rng_power x n = 1}
R: CRing x: R
forallx0y : R,
{n : nat & rng_power x n = x0} ->
{n : nat & rng_power x n = y} ->
{n : nat & rng_power x n = x0 * y}
R: CRing x: R
forallx0y : R,
{n : nat & rng_power x n = x0} ->
{n : nat & rng_power x n = y} ->
{n : nat & rng_power x n = x0 * y}
R: CRing x, a, b: R np: {n : nat & rng_power x n = a} mq: {n : nat & rng_power x n = b}
{n : nat & rng_power x n = a * b}
R: CRing x, a, b: R n: nat p: rng_power x n = a m: nat q: rng_power x m = b
{n : nat & rng_power x n = a * b}
R: CRing x, a, b: R n: nat p: rng_power x n = a m: nat q: rng_power x m = b
rng_power x (n + m) = a * b
R: CRing x, a, b: R n: nat p: rng_power x n = a m: nat q: rng_power x m = b
rng_power x n * rng_power x m = a * b
f_ap.Defined.(** Invertible elements of a ring form a multiplicative subset. *)Instanceismultiplicative_isinvertible (R : CRing)
: IsMultiplicativeSubset (@IsInvertible R) := {}.(** TODO: Property of being a localization. *)(** ** Construction of localization *)SectionLocalization.(** We now construct the localization of a ring at a multiplicative subset as the following HIT:<< HIT (Quotient fraction_eq) (R : CRing) (S : R -> Type) `{IsMultiplicativeSubset R} := | loc_frac (n d : R) (p : S d) : Localization R S | loc_frac_eq (n1 d1 n2 d2 : R) (p1 : S d1) (p2 : S d2) (x : R) (q : S x) (r : x * (d2 * n1 - n2 * d1) = 0) : loc_frac n1 d1 p1 = loc_frac n2 d2 p2 .>> along with the condition that this HIT be a set. We will implement this HIT by writing it as a set quotient. From now on, [loc_frac] will be implemented as [class_of fraction_eq] and [loc_frac_eq] will be implemented as [qglue]. *)Context (R : CRing) (S : R -> Type) `{!IsMultiplicativeSubset S}.(** *** Construction of underlying Localization type *)(** The base type will be the type of fractions with respect to a multiplicative subset. This consists of pairs of elements of a ring [R] where the [denominator] is in the multiplicative subset [S]. *)RecordFraction := {
numerator : R ;
denominator : R ;
in_mult_subset_denominator : S denominator ;
}.(** We consider two fractions to be equal if we can rearrange the fractions as products and ask for equality up to some scaling factor from the multiplicative subset [S]. *)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Relation Fraction
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Relation Fraction
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S n1, d1: R in_mult_subset_denominator0: S d1 n2, d2: R in_mult_subset_denominator1: S d2
Type
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S n1, d1: R in_mult_subset_denominator0: S d1 n2, d2: R in_mult_subset_denominator1: S d2 x: R
Type
exact (x * n1 * d2 = x * n2 * d1).Defined.(** It is convenient to produce elements of this relation specialized to when the scaling factor is [1]. *)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2: Fraction p: numerator f1 * denominator f2 =
numerator f2 * denominator f1
fraction_eq f1 f2
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2: Fraction p: numerator f1 * denominator f2 =
numerator f2 * denominator f1
fraction_eq f1 f2
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2: Fraction p: numerator f1 * denominator f2 =
numerator f2 * denominator f1
(S 1 *
(mult (mult 1 (numerator f1)) (denominator f2) =
mult (mult 1 (numerator f2)) (denominator f1)))%type
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2: Fraction p: numerator f1 * denominator f2 =
numerator f2 * denominator f1
1 * numerator f1 * denominator f2 =
1 * numerator f2 * denominator f1
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2: Fraction p: numerator f1 * denominator f2 =
numerator f2 * denominator f1
1 * (numerator f1 * denominator f2) =
1 * numerator f2 * denominator f1
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2: Fraction p: numerator f1 * denominator f2 =
numerator f2 * denominator f1
exact (ap (1 *.) p).Defined.(** Fraction equality is a reflexive relation. *)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1: Fraction
fraction_eq f1 f1
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1: Fraction
fraction_eq f1 f1
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1: Fraction
numerator f1 * denominator f1 =
numerator f1 * denominator f1
reflexivity.Defined.(** Elements of [R] can be considered fractions. *)Definitionfrac_in : R -> Fraction
:= funr => Build_Fraction r 1 mss_one.(** Now that we have defined the HIT as above, we can define the ring structure. *)(** *** Addition operation *)(** Fraction addition is the usual addition of fractions. *)Definitionfrac_add : Fraction -> Fraction -> Fraction :=
fun '(Build_Fraction n1 d1 p1) '(Build_Fraction n2 d2 p2)
=> Build_Fraction (n1 * d2 + n2 * d1) (d1 * d2) (mss_mult p1 p2).(** Fraction addition is well-defined up to equality of fractions. *)(** It is easier to prove well-definedness as a function of both arguments at once. *)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f1', f2, f2': Fraction p: fraction_eq f1 f1' q: fraction_eq f2 f2'
fraction_eq (frac_add f1 f2) (frac_add f1' f2')
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f1', f2, f2': Fraction p: fraction_eq f1 f1' q: fraction_eq f2 f2'
fraction_eq (frac_add f1 f2) (frac_add f1' f2')
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
x * y * (a * t + b * s) * (s' * t') =
x * y * (a' * t' + b' * s') * (s * t)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
x * y * (a * t) * (s' * t') +
x * y * (b * s) * (s' * t') =
x * y * (a' * t') * (s * t) +
x * y * (b' * s') * (s * t)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
x * y * (a * t) * (s' * t') =
x * y * (a' * t') * (s * t)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
x * y * (b * s) * (s' * t') =
x * y * (b' * s') * (s * t)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
x * y * (a * t) * (s' * t') =
x * y * (a' * t') * (s * t)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
x * y * a * t * s' * t' = x * y * a' * t' * s * t
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
x * a * t * s' * t' * y = x * a' * t' * s * t * y
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
x * a * t * s' * t' = x * a' * t' * s * t
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
x * a * s' * t' * t = x * a' * t' * s * t
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
x * a * s' * t' = x * a' * t' * s
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
x * a * s' * t' = x * a' * s * t'
f_ap.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
x * y * (b * s) * (s' * t') =
x * y * (b' * s') * (s * t)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
x * (y * (b * s * (s' * t'))) =
x * y * (b' * s') * (s * t)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
x * (y * (b * s * (s' * t'))) =
x * (y * (b' * s' * (s * t)))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
y * (b * s * (s' * t')) = y * (b' * s' * (s * t))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
y * b * s * s' * t' = y * b' * s' * s * t
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
y * b * t' * s * s' = y * b' * s' * s * t
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
y * b * t' * s * s' = y * b' * t * s' * s
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
y * b * t' * (s * s') = y * b' * t * s' * s
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S a, s: R ss: S s a', s': R ss': S s' b, t: R st: S t b', t': R st': S t' x: R sx: S x p: x * a * s' = x * a' * s y: R sy: S y q: y * b * t' = y * b' * t
y * b * t' * (s * s') = y * b' * t * (s' * s)
f_ap; apply rng_mult_comm.Defined.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f1', f2: Fraction p: fraction_eq f1 f1'
fraction_eq (frac_add f1 f2) (frac_add f1' f2)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f1', f2: Fraction p: fraction_eq f1 f1'
fraction_eq (frac_add f1 f2) (frac_add f1' f2)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f1', f2: Fraction p: fraction_eq f1 f1' f:= fraction_eq_refl f2: fraction_eq f2 f2
fraction_eq (frac_add f1 f2) (frac_add f1' f2)
byapply frac_add_wd.Defined.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2, f2': Fraction p: fraction_eq f2 f2'
fraction_eq (frac_add f1 f2) (frac_add f1 f2')
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2, f2': Fraction p: fraction_eq f2 f2'
fraction_eq (frac_add f1 f2) (frac_add f1 f2')
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2, f2': Fraction p: fraction_eq f2 f2' f:= fraction_eq_refl f1: fraction_eq f1 f1
fraction_eq (frac_add f1 f2) (frac_add f1 f2')
byapply frac_add_wd.Defined.(** The addition operation on the localization is induced from the addition operation for fractions. *)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Plus (Quotient fraction_eq)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Plus (Quotient fraction_eq)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Fraction -> Fraction -> Quotient fraction_eq
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
forallaa'b : Fraction,
fraction_eq a a' -> ?dclass a b = ?dclass a' b
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
forallabb' : Fraction,
fraction_eq b b' -> ?dclass a b = ?dclass a b'
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Fraction -> Fraction -> Quotient fraction_eq
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Fraction -> Fraction -> Quotient fraction_eq
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2: Fraction
Quotient fraction_eq
exact (class_of _ (frac_add f1 f2)).
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
forallaa'b : Fraction,
fraction_eq a a' ->
((funf1f2 : Fraction =>
class_of fraction_eq (frac_add f1 f2))
:
Fraction -> Fraction -> Quotient fraction_eq) a b =
((funf1f2 : Fraction =>
class_of fraction_eq (frac_add f1 f2))
:
Fraction -> Fraction -> Quotient fraction_eq) a' b
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f1', f2: Fraction p: fraction_eq f1 f1'
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f1', f2: Fraction p: fraction_eq f1 f1'
fraction_eq (frac_mult f1 f2) (frac_mult f1' f2)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f1', f2: Fraction p: fraction_eq f1 f1'
fraction_eq (frac_mult f1 f2) (frac_mult f1' f2)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f1', f2: Fraction x: R s: S x p: x * numerator f1 * denominator f1' =
x * numerator f1' * denominator f1
fraction_eq (frac_mult f1 f2) (frac_mult f1' f2)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f1', f2: Fraction x: R s: S x p: x * numerator f1 * denominator f1' =
x * numerator f1' * denominator f1
x * (numerator f1 * numerator f2) *
(denominator f1' * denominator f2) =
x * (numerator f1' * numerator f2) *
(denominator f1 * denominator f2)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f1', f2: Fraction x: R s: S x p: x * numerator f1 * denominator f1' =
x * numerator f1' * denominator f1
x * numerator f1 * numerator f2 * denominator f1' *
denominator f2 =
x * numerator f1' * numerator f2 * denominator f1 *
denominator f2
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f1', f2: Fraction x: R s: S x p: x * numerator f1 * denominator f1' =
x * numerator f1' * denominator f1
x * numerator f1 * denominator f1' * numerator f2 *
denominator f2 =
x * numerator f1' * numerator f2 * denominator f1 *
denominator f2
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f1', f2: Fraction x: R s: S x p: x * numerator f1 * denominator f1' =
x * numerator f1' * denominator f1
x * numerator f1 * denominator f1' * numerator f2 *
denominator f2 =
x * numerator f1' * denominator f1 * numerator f2 *
denominator f2
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f1', f2: Fraction x: R s: S x p: x * numerator f1 * denominator f1' =
x * numerator f1' * denominator f1
x * numerator f1 * denominator f1' *
(numerator f2 * denominator f2) =
x * numerator f1' * denominator f1 * numerator f2 *
denominator f2
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f1', f2: Fraction x: R s: S x p: x * numerator f1 * denominator f1' =
x * numerator f1' * denominator f1
x * numerator f1 * denominator f1' *
(numerator f2 * denominator f2) =
x * numerator f1' * denominator f1 *
(numerator f2 * denominator f2)
f_ap.Defined.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2, f2': Fraction p: fraction_eq f2 f2'
fraction_eq (frac_mult f1 f2) (frac_mult f1 f2')
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2, f2': Fraction p: fraction_eq f2 f2'
fraction_eq (frac_mult f1 f2) (frac_mult f1 f2')
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2, f2': Fraction x: R s: S x p: x * numerator f2 * denominator f2' =
x * numerator f2' * denominator f2
fraction_eq (frac_mult f1 f2) (frac_mult f1 f2')
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2, f2': Fraction x: R s: S x p: x * numerator f2 * denominator f2' =
x * numerator f2' * denominator f2
x * (numerator f1 * numerator f2) *
(denominator f1 * denominator f2') =
x * (numerator f1 * numerator f2') *
(denominator f1 * denominator f2)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2, f2': Fraction x: R s: S x p: x * numerator f2 * denominator f2' =
x * numerator f2' * denominator f2
x * numerator f1 * numerator f2 * denominator f1 *
denominator f2' =
x * numerator f1 * numerator f2' * denominator f1 *
denominator f2
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2, f2': Fraction x: R s: S x p: x * numerator f2 * denominator f2' =
x * numerator f2' * denominator f2
x * numerator f2 * numerator f1 * denominator f1 *
denominator f2' =
x * numerator f1 * numerator f2' * denominator f1 *
denominator f2
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2, f2': Fraction x: R s: S x p: x * numerator f2 * denominator f2' =
x * numerator f2' * denominator f2
x * numerator f2 * denominator f2' * numerator f1 *
denominator f1 =
x * numerator f1 * numerator f2' * denominator f1 *
denominator f2
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2, f2': Fraction x: R s: S x p: x * numerator f2 * denominator f2' =
x * numerator f2' * denominator f2
x * numerator f2 * denominator f2' * numerator f1 *
denominator f1 =
x * numerator f2' * numerator f1 * denominator f1 *
denominator f2
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2, f2': Fraction x: R s: S x p: x * numerator f2 * denominator f2' =
x * numerator f2' * denominator f2
x * numerator f2 * denominator f2' * numerator f1 *
denominator f1 =
x * numerator f2' * denominator f2 * numerator f1 *
denominator f1
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2, f2': Fraction x: R s: S x p: x * numerator f2 * denominator f2' =
x * numerator f2' * denominator f2
x * numerator f2 * denominator f2' *
(numerator f1 * denominator f1) =
x * numerator f2' * denominator f2 * numerator f1 *
denominator f1
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2, f2': Fraction x: R s: S x p: x * numerator f2 * denominator f2' =
x * numerator f2' * denominator f2
x * numerator f2 * denominator f2' *
(numerator f1 * denominator f1) =
x * numerator f2' * denominator f2 *
(numerator f1 * denominator f1)
f_ap.Defined.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Mult (Quotient fraction_eq)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Mult (Quotient fraction_eq)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Fraction -> Fraction -> Quotient fraction_eq
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
forallaa'b : Fraction,
fraction_eq a a' -> ?dclass a b = ?dclass a' b
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
forallabb' : Fraction,
fraction_eq b b' -> ?dclass a b = ?dclass a b'
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Fraction -> Fraction -> Quotient fraction_eq
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Fraction -> Fraction -> Quotient fraction_eq
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2: Fraction
Quotient fraction_eq
exact (class_of _ (frac_mult f1 f2)).
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
forallaa'b : Fraction,
fraction_eq a a' ->
((funf1f2 : Fraction =>
class_of fraction_eq (frac_mult f1 f2))
:
Fraction -> Fraction -> Quotient fraction_eq) a b =
((funf1f2 : Fraction =>
class_of fraction_eq (frac_mult f1 f2))
:
Fraction -> Fraction -> Quotient fraction_eq) a' b
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f1', f2: Fraction p: fraction_eq f1 f1'
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
forallabb' : Fraction,
fraction_eq b b' ->
((funf1f2 : Fraction =>
class_of fraction_eq (frac_mult f1 f2))
:
Fraction -> Fraction -> Quotient fraction_eq) a b =
((funf1f2 : Fraction =>
class_of fraction_eq (frac_mult f1 f2))
:
Fraction -> Fraction -> Quotient fraction_eq) a b'
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2, f2': Fraction q: fraction_eq f2 f2'
class_of fraction_eq (frac_mult f1 f2) =
class_of fraction_eq (frac_mult f1 f2')
byapply qglue, frac_mult_wd_r.Defined.(** *** Zero element *)Instancezero_rng_localization : Zero (Quotient fraction_eq)
:= class_of _ (Build_Fraction 01 mss_one).(** *** One element *)Instanceone_rng_localization : One (Quotient fraction_eq)
:= class_of _(Build_Fraction 11 mss_one).(** *** Negation operation *)Definitionfrac_negate : Fraction -> Fraction
:= fun '(Build_Fraction n d p) => Build_Fraction (- n) d p.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2: Fraction p: fraction_eq f1 f2
fraction_eq (frac_negate f1) (frac_negate f2)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2: Fraction p: fraction_eq f1 f2
fraction_eq (frac_negate f1) (frac_negate f2)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2: Fraction x: R s: S x p: x * numerator f1 * denominator f2 =
x * numerator f2 * denominator f1
fraction_eq (frac_negate f1) (frac_negate f2)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2: Fraction x: R s: S x p: x * numerator f1 * denominator f2 =
x * numerator f2 * denominator f1
x * - numerator f1 * denominator f2 =
x * - numerator f2 * denominator f1
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f1, f2: Fraction x: R s: S x p: x * numerator f1 * denominator f2 =
x * numerator f2 * denominator f1
byapply qglue, frac_negate_wd.Defined.(** *** Ring laws *)(** Commutativity of addition *)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Commutative plus_rng_localization
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Commutative plus_rng_localization
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y: Fraction
(funxy : Quotient fraction_eq =>
plus_rng_localization x y = plus_rng_localization y x)
(class_of fraction_eq x) (class_of fraction_eq y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y: Fraction
(numerator x * denominator y +
numerator y * denominator x) *
(denominator y * denominator x) =
(numerator y * denominator x +
numerator x * denominator y) *
(denominator x * denominator y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y: Fraction
(numerator x * denominator y +
numerator y * denominator x) *
(denominator x * denominator y) =
(numerator y * denominator x +
numerator x * denominator y) *
(denominator x * denominator y)
f_ap; apply rng_plus_comm.Defined.(** Left additive identity *)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f: Fraction
(- numerator f * denominator f +
numerator f * denominator f) * 1 =
0 * (denominator f * denominator f)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f: Fraction
- numerator f * denominator f +
numerator f * denominator f =
0 * (denominator f * denominator f)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f: Fraction
- numerator f * denominator f +
numerator f * denominator f = 0
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f: Fraction
- (numerator f * denominator f) +
numerator f * denominator f = 0
apply rng_plus_negate_l.Defined.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Associative plus_rng_localization
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Associative plus_rng_localization
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
(funxyz : Quotient fraction_eq =>
plus_rng_localization x (plus_rng_localization y z) =
plus_rng_localization (plus_rng_localization x y) z)
(class_of fraction_eq x) (class_of fraction_eq y)
(class_of fraction_eq z)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
numerator (frac_add x (frac_add y z)) *
denominator (frac_add (frac_add x y) z) =
numerator (frac_add (frac_add x y) z) *
denominator (frac_add x (frac_add y z))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
(numerator x * (denominator y * denominator z) +
(numerator y * denominator z +
numerator z * denominator y) * denominator x) *
(denominator x * denominator y * denominator z) =
((numerator x * denominator y +
numerator y * denominator x) * denominator z +
numerator z * (denominator x * denominator y)) *
(denominator x * (denominator y * denominator z))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
numerator x * (denominator y * denominator z) *
(denominator x * denominator y * denominator z) +
(numerator y * denominator z * denominator x *
(denominator x * denominator y * denominator z) +
numerator z * denominator y * denominator x *
(denominator x * denominator y * denominator z)) =
numerator x * denominator y * denominator z *
(denominator x * (denominator y * denominator z)) +
numerator y * denominator x * denominator z *
(denominator x * (denominator y * denominator z)) +
numerator z * (denominator x * denominator y) *
(denominator x * (denominator y * denominator z))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
numerator x * denominator y * denominator z *
denominator x * denominator y * denominator z +
(numerator y * denominator z * denominator x *
denominator x * denominator y * denominator z +
numerator z * denominator y * denominator x *
denominator x * denominator y * denominator z) =
numerator x * denominator y * denominator z *
denominator x * denominator y * denominator z +
numerator y * denominator x * denominator z *
denominator x * denominator y * denominator z +
numerator z * denominator x * denominator y *
denominator x * denominator y * denominator z
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
numerator x * denominator y * denominator z *
denominator x * denominator y * denominator z +
numerator y * denominator z * denominator x *
denominator x * denominator y * denominator z +
numerator z * denominator y * denominator x *
denominator x * denominator y * denominator z =
numerator x * denominator y * denominator z *
denominator x * denominator y * denominator z +
numerator y * denominator x * denominator z *
denominator x * denominator y * denominator z +
numerator z * denominator x * denominator y *
denominator x * denominator y * denominator z
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
numerator y * denominator z * denominator x *
denominator x =
numerator y * denominator x * denominator z *
denominator x
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
numerator z * denominator y * denominator x =
numerator z * denominator x * denominator y
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
numerator y *
(denominator z * (denominator x * denominator x)) =
numerator y *
(denominator x * (denominator z * denominator x))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
numerator z * (denominator y * denominator x) =
numerator z * (denominator x * denominator y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
denominator z * (denominator x * denominator x) =
denominator x * (denominator z * denominator x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
denominator y * denominator x =
denominator x * denominator y
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
denominator z * (denominator x * denominator x) =
denominator x * (denominator z * denominator x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
denominator z * denominator x * denominator x =
denominator x * (denominator z * denominator x)
apply rng_mult_comm.Defined.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f: Fraction
1 * numerator f * denominator f =
numerator f * (1 * denominator f)
f_ap; [|symmetry]; apply rng_mult_one_l.Defined.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Associative mult_rng_localization
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Associative mult_rng_localization
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
(funxyz : Quotient fraction_eq =>
mult_rng_localization x (mult_rng_localization y z) =
mult_rng_localization (mult_rng_localization x y) z)
(class_of fraction_eq x) (class_of fraction_eq y)
(class_of fraction_eq z)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
numerator (frac_mult x (frac_mult y z)) *
denominator (frac_mult (frac_mult x y) z) =
numerator (frac_mult (frac_mult x y) z) *
denominator (frac_mult x (frac_mult y z))
f_ap; [|symmetry]; apply rng_mult_assoc.Defined.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Commutative mult_rng_localization
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Commutative mult_rng_localization
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y: Fraction
(funxy : Quotient fraction_eq =>
mult_rng_localization x y = mult_rng_localization y x)
(class_of fraction_eq x) (class_of fraction_eq y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y: Fraction
numerator x * numerator y *
(denominator y * denominator x) =
numerator y * numerator x *
(denominator x * denominator y)
f_ap; rapply rng_mult_comm.Defined.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
(funxyz : Quotient fraction_eq =>
mult_rng_localization x (plus_rng_localization y z) =
plus_rng_localization (mult_rng_localization x y)
(mult_rng_localization x z))
(class_of fraction_eq x) (class_of fraction_eq y)
(class_of fraction_eq z)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
numerator (frac_mult x (frac_add y z)) *
denominator (frac_add (frac_mult x y) (frac_mult x z)) =
numerator (frac_add (frac_mult x y) (frac_mult x z)) *
denominator (frac_mult x (frac_add y z))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
numerator x *
(numerator y * denominator z +
numerator z * denominator y) *
(denominator x * denominator y *
(denominator x * denominator z)) =
(numerator x * numerator y *
(denominator x * denominator z) +
numerator x * numerator z *
(denominator x * denominator y)) *
(denominator x * (denominator y * denominator z))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
numerator x * (numerator y * denominator z) *
(denominator x * denominator y *
(denominator x * denominator z)) +
numerator x * (numerator z * denominator y) *
(denominator x * denominator y *
(denominator x * denominator z)) =
numerator x * numerator y *
(denominator x * denominator z) *
(denominator x * (denominator y * denominator z)) +
numerator x * numerator z *
(denominator x * denominator y) *
(denominator x * (denominator y * denominator z))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
numerator x * numerator y * denominator z *
denominator x * denominator y * denominator x *
denominator z +
numerator x * numerator z * denominator y *
denominator x * denominator y * denominator x *
denominator z =
numerator x * numerator y * denominator x *
denominator z * denominator x * denominator y *
denominator z +
numerator x * numerator z * denominator x *
denominator y * denominator x * denominator y *
denominator z
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
numerator x * numerator y * denominator z *
denominator x * denominator y * denominator x =
numerator x * numerator y * denominator x *
denominator z * denominator x * denominator y
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
numerator x * numerator z * denominator y *
denominator x *
denominator y *
denominator x =
numerator x * numerator z * denominator x *
denominator y *
denominator x *
denominator y
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
numerator x *
(numerator y *
(denominator z *
(denominator x * (denominator y * denominator x)))) =
numerator x *
(numerator y *
(denominator x *
(denominator z * (denominator x * denominator y))))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
numerator x *
(numerator z *
(denominator y *
(denominator x * (denominator y * denominator x)))) =
numerator x *
(numerator z *
(denominator x *
(denominator y * (denominator x * denominator y))))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
denominator z *
(denominator x * (denominator y * denominator x)) =
denominator x *
(denominator z * (denominator x * denominator y))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
denominator y *
(denominator x * (denominator y * denominator x)) =
denominator x *
(denominator y * (denominator x * denominator y))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
denominator z * denominator x * denominator y *
denominator x =
denominator x * denominator z * denominator x *
denominator y
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
denominator y * denominator x * denominator y *
denominator x =
denominator x * denominator y * denominator x *
denominator y
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
denominator x * denominator z * denominator y *
denominator x =
denominator x * denominator z * denominator x *
denominator y
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
denominator x * denominator y * denominator y *
denominator x =
denominator x * denominator y * denominator x *
denominator y
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
denominator x *
(denominator z * (denominator y * denominator x)) =
denominator x *
(denominator z * (denominator x * denominator y))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
denominator x *
(denominator y * (denominator y * denominator x)) =
denominator x *
(denominator y * (denominator x * denominator y))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
denominator z * (denominator y * denominator x) =
denominator z * (denominator x * denominator y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
denominator y * (denominator y * denominator x) =
denominator y * (denominator x * denominator y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
denominator z * (denominator x * denominator y) =
denominator z * (denominator x * denominator y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
denominator y * (denominator x * denominator y) =
denominator y * (denominator x * denominator y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
denominator z * (denominator x * denominator y) =
denominator z * (denominator x * denominator y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y, z: Fraction
denominator y * (denominator x * denominator y) =
denominator y * (denominator x * denominator y)
all: f_ap.Defined.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
CRing
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
CRing
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
AbGroup
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
One ?R
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Mult ?R
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Commutative mult
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Associative mult
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
LeftDistribute mult plus
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
LeftIdentity mult 1
(* All of the laws can be found by typeclass search, but it's slightly faster if we fill them in: *)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
One
(Build_AbGroup' (Quotient fraction_eq)
commutative_plus_rng_localization
associative_plus_rng_localization
leftidentity_plus_rng_localization
leftinverse_plus_rng_localization)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Mult
(Build_AbGroup'
(Quotient fraction_eq)
commutative_plus_rng_localization
associative_plus_rng_localization
leftidentity_plus_rng_localization
leftinverse_plus_rng_localization)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Commutative mult
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
Associative mult
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
LeftDistribute mult plus
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
LeftIdentity mult 1
all: exact _.Defined.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
R $-> rng_localization
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
R $-> rng_localization
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
R -> rng_localization
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
IsSemiRingPreserving ?rng_homo_map
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
IsSemiRingPreserving (class_of fraction_eq o frac_in)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
IsMonoidPreserving
(funx : R => class_of fraction_eq (frac_in x))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
IsMonoidPreserving
(funx : R => class_of fraction_eq (frac_in x))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
IsMonoidPreserving
(funx : R => class_of fraction_eq (frac_in x))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
IsSemiGroupPreserving
(funx : R => class_of fraction_eq (frac_in x))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
IsUnitPreserving
(funx : R => class_of fraction_eq (frac_in x))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
IsSemiGroupPreserving
(funx : R => class_of fraction_eq (frac_in x))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x, y: R
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S
IsUnitPreserving
(funx : R => class_of fraction_eq (frac_in x))
reflexivity.Defined.SectionRec.Context (T : CRing) (f : R $-> T)
(H : forallx, S x -> IsInvertible T (f x)).
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
rng_localization -> T
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
rng_localization -> T
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
Fraction -> T
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
forallab : Fraction,
fraction_eq a b -> ?pclass a = ?pclass b
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
Fraction -> T
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) n, d: R sd: S d
T
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) n, d: R sd: S d
IsInvertible T (f d)
exact (H d sd).
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
forallab : Fraction,
fraction_eq a b ->
(funX : Fraction =>
(fun (nd : R) (sd : S d) => f n * inverse_elem (f d))
(numerator X) (denominator X)
(in_mult_subset_denominator X)) a =
(funX : Fraction =>
(fun (nd : R) (sd : S d) => f n * inverse_elem (f d))
(numerator X) (denominator X)
(in_mult_subset_denominator X)) b
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
forallab : Fraction,
fraction_eq a b ->
f (numerator a) * inverse_elem (f (denominator a)) =
f (numerator b) * inverse_elem (f (denominator b))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
f (numerator x) * inverse_elem (f (denominator x)) =
f (numerator y) * inverse_elem (f (denominator y))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
f (numerator x) =
f (numerator y) * inverse_elem (f (denominator y)) *
f (denominator x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
f (numerator x) =
inverse_elem (f (denominator y)) * f (numerator y) *
f (denominator x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
f (numerator x) =
inverse_elem (f (denominator y)) *
(f (numerator y) * f (denominator x))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
f (denominator y) * f (numerator x) =
f (numerator y) * f (denominator x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
f (denominator y * numerator x) =
f (numerator y) * f (denominator x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
f (denominator y * numerator x) =
f (numerator y * denominator x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
IsEquiv (mult (f z.1))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
f z.1 * f (denominator y * numerator x) =
f z.1 * f (numerator y * denominator x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
IsEquiv (mult (f z.1))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
IsInvertible T (f z.1)
exact (H _ (fst z.2)).
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
f z.1 * f (denominator y * numerator x) =
f z.1 * f (numerator y * denominator x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
f (z.1 * (denominator y * numerator x)) =
f z.1 * f (numerator y * denominator x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
f (z.1 * (denominator y * numerator x)) =
f (z.1 * (numerator y * denominator x))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
z.1 * (denominator y * numerator x) = ?Goal
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
f ?Goal = f (z.1 * (numerator y * denominator x))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
z.1 * denominator y * numerator x = ?Goal
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
f ?Goal = f (z.1 * (numerator y * denominator x))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
f (z.1 * numerator x * denominator y) =
f (z.1 * (numerator y * denominator x))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
f (z.1 * numerator x * denominator y) = f ?Goal
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
z.1 * (numerator y * denominator x) = ?Goal
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction z: fraction_eq x y
f (z.1 * numerator x * denominator y) =
f (z.1 * numerator y * denominator x)
exact (ap f (snd z.2)).Defined.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
IsSemiRingPreserving rng_localization_rec_map
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
IsSemiRingPreserving rng_localization_rec_map
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
IsMonoidPreserving rng_localization_rec_map
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
IsMonoidPreserving rng_localization_rec_map
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
IsMonoidPreserving rng_localization_rec_map
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
IsSemiGroupPreserving rng_localization_rec_map
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
IsUnitPreserving rng_localization_rec_map
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
IsSemiGroupPreserving rng_localization_rec_map
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
forallab : Fraction,
(funxy : Quotient fraction_eq =>
rng_localization_rec_map (sg_op x y) =
sg_op (rng_localization_rec_map x)
(rng_localization_rec_map y))
(class_of fraction_eq a) (class_of fraction_eq b)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
f
(numerator x * denominator y +
numerator y * denominator x) *
inverse_elem (f (denominator x * denominator y)) =
sg_op
(f (numerator x) * inverse_elem (f (denominator x)))
(f (numerator y) * inverse_elem (f (denominator y)))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
f
(numerator x * denominator y +
numerator y * denominator x) =
sg_op
(f (numerator x) * inverse_elem (f (denominator x)))
(f (numerator y) * inverse_elem (f (denominator y))) *
f (denominator x * denominator y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
f
(numerator x * denominator y +
numerator y * denominator x) =
f (numerator x) * inverse_elem (f (denominator x)) *
f (denominator x * denominator y) +
f (numerator y) * inverse_elem (f (denominator y)) *
f (denominator x * denominator y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
f (numerator x * denominator y) +
f (numerator y * denominator x) =
f (numerator x) * inverse_elem (f (denominator x)) *
f (denominator x * denominator y) +
f (numerator y) * inverse_elem (f (denominator y)) *
f (denominator x * denominator y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
f (numerator x) * f (denominator y) +
f (numerator y) * f (denominator x) =
f (numerator x) * inverse_elem (f (denominator x)) *
(f (denominator x) * f (denominator y)) +
f (numerator y) * inverse_elem (f (denominator y)) *
(f (denominator x) * f (denominator y))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
f (numerator x) * f (denominator y) =
f (numerator x) * inverse_elem (f (denominator x)) *
(f (denominator x) * f (denominator y))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
f (numerator y) * f (denominator x) =
f (numerator y) * inverse_elem (f (denominator y)) *
(f (denominator x) * f (denominator y))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
f (numerator x) * f (denominator y) =
f (numerator x) *
(inverse_elem (f (denominator x)) *
(f (denominator x) * f (denominator y)))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
f (numerator y) * f (denominator x) =
f (numerator y) *
(inverse_elem (f (denominator y)) *
(f (denominator x) * f (denominator y)))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
f (denominator y) =
inverse_elem (f (denominator x)) *
(f (denominator x) * f (denominator y))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
f (denominator x) =
inverse_elem (f (denominator y)) *
(f (denominator x) * f (denominator y))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
1 * f (denominator y) =
inverse_elem (f (denominator x)) *
(f (denominator x) * f (denominator y))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
1 * f (denominator x) =
inverse_elem (f (denominator y)) *
(f (denominator x) * f (denominator y))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
1 * f (denominator y) =
inverse_elem (f (denominator x)) * f (denominator x) *
f (denominator y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
1 * f (denominator x) =
inverse_elem (f (denominator y)) * f (denominator x) *
f (denominator y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
1 * f (denominator y) =
inverse_elem (f (denominator x)) * f (denominator x) *
f (denominator y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
1 * f (denominator x) =
f (denominator y) *
(inverse_elem (f (denominator y)) * f (denominator x))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
1 * f (denominator y) =
inverse_elem (f (denominator x)) * f (denominator x) *
f (denominator y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
1 * f (denominator x) =
f (denominator y) * inverse_elem (f (denominator y)) *
f (denominator x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
1 =
inverse_elem (f (denominator x)) * f (denominator x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
1 =
f (denominator y) * inverse_elem (f (denominator y))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
inverse_elem (f (denominator x)) * f (denominator x) =
1
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
f (denominator y) * inverse_elem (f (denominator y)) =
1
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
inverse_elem (f (denominator x)) * f (denominator x) =
1
apply rng_inv_l.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
f (denominator y) * inverse_elem (f (denominator y)) =
1
apply rng_inv_r.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
IsUnitPreserving rng_localization_rec_map
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
f 0 * inverse_elem (f 1) = mon_unit
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
0 * inverse_elem (f 1) = mon_unit
napply rng_mult_zero_l.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
IsMonoidPreserving rng_localization_rec_map
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
IsSemiGroupPreserving rng_localization_rec_map
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
IsUnitPreserving rng_localization_rec_map
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
IsSemiGroupPreserving rng_localization_rec_map
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
forallab : Fraction,
(funxy : Quotient fraction_eq =>
rng_localization_rec_map (sg_op x y) =
sg_op (rng_localization_rec_map x)
(rng_localization_rec_map y))
(class_of fraction_eq a) (class_of fraction_eq b)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x) x, y: Fraction
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f: Fraction
S (denominator f)
exact (in_mult_subset_denominator f).Defined.(** Elements that were invertible in the original ring [R], continue to be invertible in [rng_localization R S]. Since [loc_in] is a ring homomorphism this is automatic. *)Definitionisinvertible_rng_localization_preserved (x : R)
: IsInvertible R x -> IsInvertible rng_localization (loc_in x)
:= _.(** We can factor any fraction as the multiplication of the numerator and the inverse of the denominator. *)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S f: Fraction
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S P: rng_localization -> Type H: forallx : rng_localization, IsHProp (P x) Hin: forallx : R, P (loc_in x) Hinv: forall (x : rng_localization)
(H : IsInvertible rng_localization x),
P x -> P (inverse_elem x) Hmul: forallxy : rng_localization,
P x -> P y -> P (x * y)
forallx : rng_localization, P x
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S P: rng_localization -> Type H: forallx : rng_localization, IsHProp (P x) Hin: forallx : R, P (loc_in x) Hinv: forall (x : rng_localization)
(H : IsInvertible rng_localization x),
P x -> P (inverse_elem x) Hmul: forallxy : rng_localization,
P x -> P y -> P (x * y)
forallx : rng_localization, P x
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S P: rng_localization -> Type H: forallx : rng_localization, IsHProp (P x) Hin: forallx : R, P (loc_in x) Hinv: forall (x : rng_localization)
(H : IsInvertible rng_localization x),
P x -> P (inverse_elem x) Hmul: forallxy : rng_localization,
P x -> P y -> P (x * y)
forallx : Quotient fraction_eq, IsHSet (P x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S P: rng_localization -> Type H: forallx : rng_localization, IsHProp (P x) Hin: forallx : R, P (loc_in x) Hinv: forall (x : rng_localization)
(H : IsInvertible rng_localization x),
P x -> P (inverse_elem x) Hmul: forallxy : rng_localization,
P x -> P y -> P (x * y)
foralla : Fraction, P (class_of fraction_eq a)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S P: rng_localization -> Type H: forallx : rng_localization, IsHProp (P x) Hin: forallx : R, P (loc_in x) Hinv: forall (x : rng_localization)
(H : IsInvertible rng_localization x),
P x -> P (inverse_elem x) Hmul: forallxy : rng_localization,
P x -> P y -> P (x * y)
forall (ab : Fraction)
(H0 : fraction_eq a b),
transport P (qglue H0) (?pclass a) = ?pclass b
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S P: rng_localization -> Type H: forallx : rng_localization, IsHProp (P x) Hin: forallx : R, P (loc_in x) Hinv: forall (x : rng_localization)
(H : IsInvertible rng_localization x),
P x -> P (inverse_elem x) Hmul: forallxy : rng_localization,
P x -> P y -> P (x * y)
forallx : Quotient fraction_eq, IsHSet (P x)
exact _.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S P: rng_localization -> Type H: forallx : rng_localization, IsHProp (P x) Hin: forallx : R, P (loc_in x) Hinv: forall (x : rng_localization)
(H : IsInvertible rng_localization x),
P x -> P (inverse_elem x) Hmul: forallxy : rng_localization,
P x -> P y -> P (x * y)
foralla : Fraction, P (class_of fraction_eq a)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S P: rng_localization -> Type H: forallx : rng_localization, IsHProp (P x) Hin: forallx : R, P (loc_in x) Hinv: forall (x : rng_localization)
(H : IsInvertible rng_localization x),
P x -> P (inverse_elem x) Hmul: forallxy : rng_localization,
P x -> P y -> P (x * y) f: Fraction
P (class_of fraction_eq f)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S P: rng_localization -> Type H: forallx : rng_localization, IsHProp (P x) Hin: forallx : R, P (loc_in x) Hinv: forall (x : rng_localization)
(H : IsInvertible rng_localization x),
P x -> P (inverse_elem x) Hmul: forallxy : rng_localization,
P x -> P y -> P (x * y) f: Fraction
P
(loc_in (numerator f) *
inverse_elem (loc_in (denominator f)))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S P: rng_localization -> Type H: forallx : rng_localization, IsHProp (P x) Hin: forallx : R, P (loc_in x) Hinv: forall (x : rng_localization)
(H : IsInvertible rng_localization x),
P x -> P (inverse_elem x) Hmul: forallxy : rng_localization,
P x -> P y -> P (x * y) f: Fraction
P (loc_in (numerator f))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S P: rng_localization -> Type H: forallx : rng_localization, IsHProp (P x) Hin: forallx : R, P (loc_in x) Hinv: forall (x : rng_localization)
(H : IsInvertible rng_localization x),
P x -> P (inverse_elem x) Hmul: forallxy : rng_localization,
P x -> P y -> P (x * y) f: Fraction
P (inverse_elem (loc_in (denominator f)))
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S P: rng_localization -> Type H: forallx : rng_localization, IsHProp (P x) Hin: forallx : R, P (loc_in x) Hinv: forall (x : rng_localization)
(H : IsInvertible rng_localization x),
P x -> P (inverse_elem x) Hmul: forallxy : rng_localization,
P x -> P y -> P (x * y) f: Fraction
P (loc_in (numerator f))
apply Hin.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S P: rng_localization -> Type H: forallx : rng_localization, IsHProp (P x) Hin: forallx : R, P (loc_in x) Hinv: forall (x : rng_localization)
(H : IsInvertible rng_localization x),
P x -> P (inverse_elem x) Hmul: forallxy : rng_localization,
P x -> P y -> P (x * y) f: Fraction
P (inverse_elem (loc_in (denominator f)))
apply Hinv, Hin.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S P: rng_localization -> Type H: forallx : rng_localization, IsHProp (P x) Hin: forallx : R, P (loc_in x) Hinv: forall (x : rng_localization)
(H : IsInvertible rng_localization x),
P x -> P (inverse_elem x) Hmul: forallxy : rng_localization,
P x -> P y -> P (x * y)
forall (ab : Fraction) (H : fraction_eq a b),
transport P (qglue H)
((funf : Fraction =>
transport P (fraction_decompose f)^
(Hmul (loc_in (numerator f))
(inverse_elem (loc_in (denominator f)))
(Hin (numerator f))
(Hinv (loc_in (denominator f))
(isinvertible_denominator f)
(Hin (denominator f))))) a) =
(funf : Fraction =>
transport P (fraction_decompose f)^
(Hmul (loc_in (numerator f))
(inverse_elem (loc_in (denominator f)))
(Hin (numerator f))
(Hinv (loc_in (denominator f))
(isinvertible_denominator f)
(Hin (denominator f))))) b
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S P: rng_localization -> Type H: forallx : rng_localization, IsHProp (P x) Hin: forallx : R, P (loc_in x) Hinv: forall (x : rng_localization)
(H : IsInvertible rng_localization x),
P x -> P (inverse_elem x) Hmul: forallxy : rng_localization,
P x -> P y -> P (x * y) f1, f2: Fraction p: fraction_eq f1 f2
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f, g: rng_localization $-> T p: f $o loc_in $== g $o loc_in
f $== g
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f, g: rng_localization $-> T p: f $o loc_in $== g $o loc_in
f $== g
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f, g: rng_localization $-> T p: f $o loc_in $== g $o loc_in
forallx : R,
(funx0 : rng_localization =>
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) f x0 =
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) g x0) (loc_in x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f, g: rng_localization $-> T p: f $o loc_in $== g $o loc_in
forall (x : rng_localization)
(H : IsInvertible rng_localization x),
(funx0 : rng_localization =>
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) f x0 =
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) g x0) x ->
(funx0 : rng_localization =>
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) f x0 =
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) g x0)
(inverse_elem x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f, g: rng_localization $-> T p: f $o loc_in $== g $o loc_in
forallxy : rng_localization,
(funx0 : rng_localization =>
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) f x0 =
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) g x0) x ->
(funx0 : rng_localization =>
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) f x0 =
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) g x0) y ->
(funx0 : rng_localization =>
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) f x0 =
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) g x0)
(x * y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f, g: rng_localization $-> T p: f $o loc_in $== g $o loc_in
forallx : R,
(funx0 : rng_localization =>
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) f x0 =
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) g x0) (loc_in x)
exact p.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f, g: rng_localization $-> T p: f $o loc_in $== g $o loc_in
forall (x : rng_localization)
(H : IsInvertible rng_localization x),
(funx0 : rng_localization =>
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) f x0 =
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) g x0) x ->
(funx0 : rng_localization =>
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) f x0 =
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) g x0) (inverse_elem x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f, g: rng_localization $-> T p: f $o loc_in $== g $o loc_in x: rng_localization H: IsInvertible rng_localization x q: f x = g x
f (inverse_elem x) = g (inverse_elem x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f, g: rng_localization $-> T p: f $o loc_in $== g $o loc_in x: rng_localization H: IsInvertible rng_localization x q: f x = g x
inverse_elem (f x) = inverse_elem (g x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f, g: rng_localization $-> T p: f $o loc_in $== g $o loc_in x: rng_localization H: IsInvertible rng_localization x q: f x = g x
f x = g x
exact q.
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f, g: rng_localization $-> T p: f $o loc_in $== g $o loc_in
forallxy : rng_localization,
(funx0 : rng_localization =>
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) f x0 =
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) g x0) x ->
(funx0 : rng_localization =>
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) f x0 =
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) g x0) y ->
(funx0 : rng_localization =>
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) f x0 =
(rng_homo_map rng_localization T
:
RingHomomorphism rng_localization T ->
rng_localization $-> T) g x0) (x * y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f, g: rng_localization $-> T p: f $o loc_in $== g $o loc_in x, y: rng_localization q: f x = g x r: f y = g y
f (x * y) = g (x * y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f, g: rng_localization $-> T p: f $o loc_in $== g $o loc_in x, y: rng_localization q: f x = g x r: f y = g y
f x * f y = g (x * y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f, g: rng_localization $-> T p: f $o loc_in $== g $o loc_in x, y: rng_localization q: f x = g x r: f y = g y
f x * f y = g x * g y
f_ap.Defined.EndLocalization.(** TODO: Show construction is a localization. *)