Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Basics.Equivalences Basics.Trunc Types.Sigma WildCat.Core.Require Import Nat.Core Rings.Ring.LocalOpen Scope mc_scope.(** * Idempotent elements of rings *)(** ** Definition *)ClassIsIdempotent (R : Ring) (e : R)
:= rng_idem : e * e = e.
R: Ring e: R
IsHProp (IsIdempotent R e)
R: Ring e: R
IsHProp (IsIdempotent R e)
unfold IsIdempotent; exact _.Defined.(** *** Examples *)(** Zero is idempotent. *)Instanceisidempotent_zero (R : Ring) : IsIdempotent R 0
:= rng_mult_zero_r 0.(** One is idempotent. *)Instanceisidempotent_one (R : Ring) : IsIdempotent R 1
:= rng_mult_one_r 1.(** If [e] is idempotent, then [1 - e] is idempotent. *)
R: Ring e: R H: IsIdempotent R e
IsIdempotent R (1 - e)
R: Ring e: R H: IsIdempotent R e
IsIdempotent R (1 - e)
R: Ring e: R H: IsIdempotent R e
(1 - e) * (1 - e) = 1 - e
R: Ring e: R H: IsIdempotent R e
(1 - e) * 1 - (1 - e) * e = 1 - e
R: Ring e: R H: IsIdempotent R e
1 * 1 - e * 1 - (1 * e - e * e) = 1 - e
R: Ring e: R H: IsIdempotent R e
1 - e * 1 - (e - e * e) = 1 - e
R: Ring e: R H: IsIdempotent R e
1 - e - (e - e * e) = 1 - e
R: Ring e: R H: IsIdempotent R e
1 - e - (e - e) = 1 - e
R: Ring e: R H: IsIdempotent R e
1 - e - 0 = 1 - e
R: Ring e: R H: IsIdempotent R e
1 - e + 0 = 1 - e
napply rng_plus_zero_r.Defined.(** If [e] is idempotent, then it is also an idempotent element of the opposite ring. *)Instanceisidempotent_op (R : Ring) (e : R) `{i : IsIdempotent R e}
: IsIdempotent (rng_op R) e
:= i.(** Any positive power of an idempotent element [e] is [e]. *)
R: Ring e: R H: IsIdempotent R e n: nat
(1 <= n)%nat -> rng_power e n = e
R: Ring e: R H: IsIdempotent R e n: nat
(1 <= n)%nat -> rng_power e n = e
R: Ring e: R H: IsIdempotent R e
rng_power e 1 = e
R: Ring e: R H: IsIdempotent R e m: nat L: (1 <= m)%nat IHL: rng_power e m = e
rng_power e m.+1 = e
R: Ring e: R H: IsIdempotent R e
rng_power e 1 = e
snapply rng_mult_one_r.
R: Ring e: R H: IsIdempotent R e m: nat L: (1 <= m)%nat IHL: rng_power e m = e
rng_power e m.+1 = e
R: Ring e: R H: IsIdempotent R e m: nat L: (1 <= m)%nat IHL: rng_power e m = e
rng_power e m.+1 = e * e
exact (ap (e *.) IHL).Defined.(** Ring homomorphisms preserve idempotent elements. *)
R, S: Ring f: R $-> S e: R
IsIdempotent R e -> IsIdempotent S (f e)
R, S: Ring f: R $-> S e: R
IsIdempotent R e -> IsIdempotent S (f e)
R, S: Ring f: R $-> S e: R p: IsIdempotent R e
IsIdempotent S (f e)
R, S: Ring f: R $-> S e: R p: IsIdempotent R e
f (e * e) = f e
exact (ap f p).Defined.(** ** Orthogonal idempotent elements *)(** Two idempotent elements [e] and [f] are orthogonal if both [e * f = 0] and [f * e = 0]. *)ClassIsOrthogonal (R : Ring) (ef : R)
`{!IsIdempotent R e, !IsIdempotent R f} := {
rng_idem_orth : e * f = 0 ;
rng_idem_orth' : f * e = 0 ;
}.Definitionissig_IsOrthogonal {R : Ring} {ef : R}
`{IsIdempotent R e, IsIdempotent R f}
: _ <~> IsOrthogonal R e f
:= ltac:(issig).
R: Ring e, f: R H: IsIdempotent R e H0: IsIdempotent R f
IsHProp (IsOrthogonal R e f)
R: Ring e, f: R H: IsIdempotent R e H0: IsIdempotent R f
IsHProp (IsOrthogonal R e f)
exact (istrunc_equiv_istrunc _ issig_IsOrthogonal).Defined.(** *** Properties *)(** Two idempotents being orthogonal is a symmetric relation. *)Definitionisorthogonal_swap (R : Ring) (ef : R) `{IsOrthogonal R e f}
: IsOrthogonal R f e
:= {| rng_idem_orth := rng_idem_orth' ; rng_idem_orth' := rng_idem_orth |}.Hint Immediate isorthogonal_swap : typeclass_instances.(** If [e] and [f] are orthogonal idempotents, then they are also orthogonal idempotents in the opposite ring. *)
R: Ring e, f: R IsIdempotent0: IsIdempotent R e IsIdempotent1: IsIdempotent R f r: IsOrthogonal R e f
IsOrthogonal (rng_op R) e f
R: Ring e, f: R IsIdempotent0: IsIdempotent R e IsIdempotent1: IsIdempotent R f r: IsOrthogonal R e f
IsOrthogonal (rng_op R) e f
R: Ring e, f: R IsIdempotent0: IsIdempotent R e IsIdempotent1: IsIdempotent R f r: IsOrthogonal R e f
e * f = 0
R: Ring e, f: R IsIdempotent0: IsIdempotent R e IsIdempotent1: IsIdempotent R f r: IsOrthogonal R e f
f * e = 0
R: Ring e, f: R IsIdempotent0: IsIdempotent R e IsIdempotent1: IsIdempotent R f r: IsOrthogonal R e f
e * f = 0
exact (rng_idem_orth' (R:=R)).
R: Ring e, f: R IsIdempotent0: IsIdempotent R e IsIdempotent1: IsIdempotent R f r: IsOrthogonal R e f
f * e = 0
exact (rng_idem_orth (R:=R)).Defined.(** If [e] and [f] are orthogonal idempotents, then [e + f] is idempotent. *)
R: Ring e, f: R IsIdempotent0: IsIdempotent R e IsIdempotent1: IsIdempotent R f H: IsOrthogonal R e f
IsIdempotent R (e + f)
R: Ring e, f: R IsIdempotent0: IsIdempotent R e IsIdempotent1: IsIdempotent R f H: IsOrthogonal R e f
IsIdempotent R (e + f)
R: Ring e, f: R IsIdempotent0: IsIdempotent R e IsIdempotent1: IsIdempotent R f H: IsOrthogonal R e f
(e + f) * (e + f) = e + f
R: Ring e, f: R IsIdempotent0: IsIdempotent R e IsIdempotent1: IsIdempotent R f H: IsOrthogonal R e f
(e + f) * e + (e + f) * f = e + f
R: Ring e, f: R IsIdempotent0: IsIdempotent R e IsIdempotent1: IsIdempotent R f H: IsOrthogonal R e f
e * e + f * e + (e * f + f * f) = e + f
R: Ring e, f: R IsIdempotent0: IsIdempotent R e IsIdempotent1: IsIdempotent R f H: IsOrthogonal R e f
e + f * e + (e * f + f) = e + f
R: Ring e, f: R IsIdempotent0: IsIdempotent R e IsIdempotent1: IsIdempotent R f H: IsOrthogonal R e f
e + 0 + (0 + f) = e + f
byrewrite rng_plus_zero_r, rng_plus_zero_l.Defined.(** An idempotent element [e] is orthogonal to its complement [1 - e]. *)