Built with Alectryon. 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.
Require Import Basics.Overture Basics.Trunc Basics.Tactics Colimits.QuotientRequire Import Basics.Overture Basics.Trunc Basics.Tactics Colimits.Quotient
abstract_algebra Rings.CRing Truncations.Core Nat.Core
Rings.QuotientRing WildCat.Core WildCat.Equiv.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
{n0 : nat & rng_power x n0 = 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 * (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
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
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 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 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
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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) 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: forallx0 : R, S x0 -> IsInvertible T (f x0) x, y: Fraction
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx0 : R, S x0 -> IsInvertible T (f x0) x, y: Fraction
f (numerator x * numerator y) =
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: forallx0 : R, S x0 -> IsInvertible T (f x0) x, y: Fraction
f (numerator x) * f (numerator y) =
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: forallx0 : R, S x0 -> IsInvertible T (f x0) x, y: Fraction
f (numerator x) * f (numerator y) =
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: forallx0 : R, S x0 -> IsInvertible T (f x0) x, y: Fraction
f (numerator x) * f (numerator y) =
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: forallx0 : R, S x0 -> IsInvertible T (f x0) x, y: Fraction
f (numerator y) =
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: forallx0 : R, S x0 -> IsInvertible T (f x0) x, y: Fraction
f (denominator x) * f (numerator 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: forallx0 : R, S x0 -> IsInvertible T (f x0) x, y: Fraction
f (numerator y) * 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: forallx0 : R, S x0 -> IsInvertible T (f x0) x, y: Fraction
f (numerator y) * 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: forallx0 : R, S x0 -> IsInvertible T (f x0) x, y: Fraction
f (denominator x) =
inverse_elem (f (denominator y)) * f (denominator x * denominator y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx0 : R, S x0 -> IsInvertible T (f x0) x, y: Fraction
f (denominator y) * f (denominator x) = f (denominator x * denominator y)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx0 : R, S x0 -> IsInvertible T (f x0) x, y: Fraction
f (denominator x * denominator y) = f (denominator y) * f (denominator x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx0 : R, S x0 -> IsInvertible T (f x0) x, y: Fraction
f (denominator x * denominator y) = f (denominator x) * f (denominator y)
napply rng_homo_mult.
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)
mon_unit * f 1 = f 1
apply rng_mult_one_l.Defined.Definitionrng_localization_rec : rng_localization $-> T
:= Build_RingHomomorphism 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)
rng_localization_rec $o loc_in $== f
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx : R, S x -> IsInvertible T (f x)
rng_localization_rec $o loc_in $== f
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx0 : R, S x0 -> IsInvertible T (f x0) x: R
f x * inverse_elem (f 1) = f x
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx0 : R, S x0 -> IsInvertible T (f x0) x: R
f x = f x * f 1
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx0 : R, S x0 -> IsInvertible T (f x0) x: R
f x * 1 = f x * f 1
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S T: CRing f: R $-> T H: forallx0 : R, S x0 -> IsInvertible T (f x0) x: R
f 1 = 1
apply rng_homo_one.Defined.EndRec.(** Elements belonging to the multiplicative subset [S] of [R] become invertible in [rng_localization R S]. *)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x: R Sx: S x
IsInvertible rng_localization (loc_in x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x: R Sx: S x
IsInvertible rng_localization (loc_in x)
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x: R Sx: S x
rng_localization
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x: R Sx: S x
?inv * loc_in x = 1
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x: R Sx: S x
rng_localization
exact (class_of _ (Build_Fraction 1 x Sx)).
R: CRing S: R -> Type IsMultiplicativeSubset0: IsMultiplicativeSubset S x: R Sx: S x
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) (H0 : 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) (H0 : 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) (H0 : 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) (H0 : 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) (H0 : 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) (H0 : 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) (H0 : 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) (H0 : 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) (H0 : 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) (H0 : 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) (H0 : 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) (H0 : 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) (H0 : 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) (H0 : 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)
((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) (H0 : 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. *)