Module mathcomp.reals.signed
From HB Require Import structures.From mathcomp Require Import ssreflect ssrfun ssrbool.
From mathcomp Require Import ssrnat eqtype choice order ssralg ssrnum ssrint.
#[warning="-warn-library-file-internal-analysis"]
From mathcomp Require Import unstable.
From mathcomp Require Import mathcomp_extra.
Attributes deprecated(since="mathcomp-analysis 1.9.0",
note="Use ""From mathcomp Require Import interval_inference."" instead.").
Reserved Notation "{ 'compare' x0 & nz & cond }"
(format "{ 'compare' x0 & nz & cond }").
Reserved Notation "{ 'num' R & nz & cond }"
(format "{ 'num' R & nz & cond }").
Reserved Notation "{ = x0 }" (format "{ = x0 }").
Reserved Notation "{ > x0 }" (format "{ > x0 }").
Reserved Notation "{ < x0 }" (format "{ < x0 }").
Reserved Notation "{ >= x0 }" (format "{ >= x0 }").
Reserved Notation "{ <= x0 }" (format "{ <= x0 }").
Reserved Notation "{ >=< x0 }" (format "{ >=< x0 }").
Reserved Notation "{ >< x0 }" (format "{ >< x0 }").
Reserved Notation "{ != x0 }" (format "{ != x0 }").
Reserved Notation "{ ?= x0 }" (format "{ ?= x0 }").
Reserved Notation "{ = x0 : T }" (format "{ = x0 : T }").
Reserved Notation "{ > x0 : T }" (format "{ > x0 : T }").
Reserved Notation "{ < x0 : T }" (format "{ < x0 : T }").
Reserved Notation "{ >= x0 : T }" (format "{ >= x0 : T }").
Reserved Notation "{ <= x0 : T }" (format "{ <= x0 : T }").
Reserved Notation "{ >=< x0 : T }" (format "{ >=< x0 : T }").
Reserved Notation "{ >< x0 : T }" (format "{ >< x0 : T }").
Reserved Notation "{ != x0 : T }" (format "{ != x0 : T }").
Reserved Notation "{ ?= x0 : T }" (format "{ ?= x0 : T }").
Reserved Notation "=0" (format "=0").
Reserved Notation ">=0" (format ">=0").
Reserved Notation "<=0" (format "<=0").
Reserved Notation ">=<0" (format ">=<0").
Reserved Notation ">?<0" (format ">?<0").
Reserved Notation "!=0" (format "!=0").
Reserved Notation "?=0" (format "?=0").
Reserved Notation "x %:sgn" (format "x %:sgn").
Reserved Notation "x %:num" (format "x %:num").
Reserved Notation "x %:posnum" (format "x %:posnum").
Reserved Notation "x %:nngnum" (format "x %:nngnum").
Reserved Notation "[ 'sgn' 'of' x ]" (format "[ 'sgn' 'of' x ]").
Reserved Notation "[ 'gt0' 'of' x ]" (format "[ 'gt0' 'of' x ]").
Reserved Notation "[ 'lt0' 'of' x ]" (format "[ 'lt0' 'of' x ]").
Reserved Notation "[ 'ge0' 'of' x ]" (format "[ 'ge0' 'of' x ]").
Reserved Notation "[ 'le0' 'of' x ]" (format "[ 'le0' 'of' x ]").
Reserved Notation "[ 'cmp0' 'of' x ]" (format "[ 'cmp0' 'of' x ]").
Reserved Notation "[ 'neq0' 'of' x ]" (format "[ 'neq0' 'of' x ]").
Reserved Notation "{ 'posnum' R }" (format "{ 'posnum' R }").
Reserved Notation "{ 'nonneg' R }" (format "{ 'nonneg' R }").
Reserved Notation "x %:pos" (format "x %:pos").
Reserved Notation "x %:nng" (format "x %:nng").
Reserved Notation "!! x" (at level 100, only parsing).
Set SsrOldRewriteGoalsOrder.
Set Implicit Arguments.
Unset Strict Implicit.
Unset Printing Implicit Defensive.
Import Order.TTheory Order.Syntax.
Import GRing.Theory Num.Theory.
Local Open Scope ring_scope.
Local Open Scope order_scope.
Declare Scope snum_scope.
Delimit Scope snum_scope with snum.
Declare Scope snum_sign_scope.
Delimit Scope snum_sign_scope with snum_sign.
Declare Scope snum_nullity_scope.
Delimit Scope snum_nullity_scope with snum_nullity.
Notation "!! x" := (ltac:(refine x)) (only parsing).
Class infer (P : Prop) := Infer : P.
#[global] Hint Mode infer ! : typeclass_instances.
#[global] Hint Extern 0 (infer _) => (exact) : typeclass_instances.
Lemma inferP (P : Prop) : P -> infer P
Proof.
Module Import KnownSign.
Variant nullity := NonZero | MaybeZero.
Coercion
KnownSign.nullity_bool : KnownSign.nullity -> bool KnownSign.nullity_bool is not universe polymorphic Arguments KnownSign.nullity_bool nz%_snum_nullity_scope KnownSign.nullity_bool is transparent Expands to: Constant mathcomp.reals.signed.KnownSign.nullity_bool Declared in library mathcomp.reals.signed, line 208, characters 9-21
Definition
KnownSign.nz_of_bool : bool -> KnownSign.nullity KnownSign.nz_of_bool is not universe polymorphic Arguments KnownSign.nz_of_bool b%_bool_scope KnownSign.nz_of_bool is transparent Expands to: Constant mathcomp.reals.signed.KnownSign.nz_of_bool Declared in library mathcomp.reals.signed, line 209, characters 11-21
Variant sign := EqZero | NonNeg | NonPos.
Variant real := Sign of sign | AnySign.
Variant reality := Real of real | Arbitrary.
Definition
KnownSign.wider_nullity : KnownSign.nullity -> KnownSign.nullity -> bool KnownSign.wider_nullity is not universe polymorphic Arguments KnownSign.wider_nullity (xnz ynz)%_snum_nullity_scope KnownSign.wider_nullity is transparent Expands to: Constant mathcomp.reals.signed.KnownSign.wider_nullity Declared in library mathcomp.reals.signed, line 215, characters 11-24
match xnz, ynz with
| MaybeZero, _
| NonZero, NonZero => true
| NonZero, MaybeZero => false
end.
Definition
KnownSign.wider_sign : KnownSign.sign -> KnownSign.sign -> bool KnownSign.wider_sign is not universe polymorphic Arguments KnownSign.wider_sign (xs ys)%_snum_sign_scope KnownSign.wider_sign is transparent Expands to: Constant mathcomp.reals.signed.KnownSign.wider_sign Declared in library mathcomp.reals.signed, line 221, characters 11-21
match xs, ys with
| NonNeg, NonNeg | NonNeg, EqZero
| NonPos, NonPos | NonPos, EqZero
| EqZero, EqZero => true
| NonNeg, NonPos | NonPos, NonNeg
| EqZero, NonPos | EqZero, NonNeg => false
end.
Definition
KnownSign.wider_real : KnownSign.real -> KnownSign.real -> bool KnownSign.wider_real is not universe polymorphic Arguments KnownSign.wider_real xr yr KnownSign.wider_real is transparent Expands to: Constant mathcomp.reals.signed.KnownSign.wider_real Declared in library mathcomp.reals.signed, line 229, characters 11-21
match xr, yr with
| AnySign, _ => true
| Sign sx, Sign sy => wider_sign sx sy
| Sign _, AnySign => false
end.
Definition
KnownSign.wider_reality : KnownSign.reality -> KnownSign.reality -> bool KnownSign.wider_reality is not universe polymorphic Arguments KnownSign.wider_reality (xr yr)%_snum_sign_scope KnownSign.wider_reality is transparent Expands to: Constant mathcomp.reals.signed.KnownSign.wider_reality Declared in library mathcomp.reals.signed, line 235, characters 11-24
match xr, yr with
| Arbitrary, _ => true
| Real xr, Real yr => wider_real xr yr
| Real _, Arbitrary => false
end.
End KnownSign.
Module Signed.
Section Signed.
Context (disp : Order.disp_t) (T : porderType disp) (x0 : T).
Local Coercion
Signed.is_real not a defined object.
Definition
Signed.reality_cond : forall [disp : Order.disp_t] [T : porderType disp], T -> KnownSign.reality -> T -> bool Signed.reality_cond is not universe polymorphic Arguments Signed.reality_cond [disp T] x0 n%_snum_sign_scope x Signed.reality_cond is transparent Expands to: Constant mathcomp.reals.signed.Signed.reality_cond Declared in library mathcomp.reals.signed, line 248, characters 11-23
match n with
| Real (Sign EqZero) => x == x0
| Real (Sign NonNeg) => x >= x0
| Real (Sign NonPos) => x <= x0
| Real AnySign => (x0 <= x) || (x <= x0)
| Arbitrary => true
end.
Record def (nz : nullity) (cond : reality) := Def {
r :> T;
#[canonical=no]
P : (nz ==> (r != x0)) && reality_cond cond r
}.
End Signed.
Notation spec x0 nz cond x :=
((nullity_bool nz%snum_nullity ==> (x != x0))
&& (reality_cond x0 cond%snum_sign x)).
Record typ d nz cond := Typ {
sort : porderType d;
#[canonical=no]
sort_x0 : sort;
#[canonical=no]
allP : forall x : sort, spec sort_x0 nz cond x
}.
Definition
Signed.mk : forall {d : Order.disp_t} {T : porderType d} [x0 : T] [nz : KnownSign.nullity] [cond : KnownSign.reality] [r : T], Signed.spec x0 nz cond r -> {compare x0 & nz & cond} Signed.mk is not universe polymorphic Arguments Signed.mk {d T} [x0] [nz]%_snum_nullity_scope [cond]%_snum_sign_scope [r] P Signed.mk is transparent Expands to: Constant mathcomp.reals.signed.Signed.mk Declared in library mathcomp.reals.signed, line 277, characters 11-13
@Def d T x0 nz cond r P.
Definition
Signed.from : forall {d : Order.disp_t} {T : porderType d} {x0 : T} {nz : KnownSign.nullity} {cond : KnownSign.reality} {x : {compare x0 & nz & cond}}, phantom T x%:num%R -> {compare x0 & nz & cond} Signed.from is not universe polymorphic Arguments Signed.from {d T x0} {nz}%_snum_nullity_scope {cond}%_snum_sign_scope {x} phx Signed.from is transparent Expands to: Constant mathcomp.reals.signed.Signed.from Declared in library mathcomp.reals.signed, line 280, characters 11-15
{x : @def d T x0 nz cond} (phx : phantom T x) := x.
Definition
Signed.fromP : forall {d : Order.disp_t} {T : porderType d} {x0 : T} {nz : KnownSign.nullity} {cond : KnownSign.reality} {x : {compare x0 & nz & cond}}, phantom T x%:num%R -> Signed.spec x0 nz cond x%:num%R Signed.fromP is not universe polymorphic Arguments Signed.fromP {d T x0} {nz}%_snum_nullity_scope {cond}%_snum_sign_scope {x} phx Signed.fromP is transparent Expands to: Constant mathcomp.reals.signed.Signed.fromP Declared in library mathcomp.reals.signed, line 283, characters 11-16
{x : @def d T x0 nz cond} (phx : phantom T x) := P x.
Module Exports.
Coercion Sign : sign >-> real.
Coercion Real : real >-> reality.
Coercion is_real : reality >-> bool.
Bind Scope snum_sign_scope with sign.
Bind Scope snum_sign_scope with reality.
Bind Scope snum_nullity_scope with nullity.
Notation "=0" := EqZero : snum_sign_scope.
Notation ">=0" := NonNeg : snum_sign_scope.
Notation "<=0" := NonPos : snum_sign_scope.
Notation ">=<0" := AnySign : snum_sign_scope.
Notation ">?<0" := Arbitrary : snum_sign_scope.
Notation "!=0" := NonZero : snum_nullity_scope.
Notation "?=0" := MaybeZero : snum_nullity_scope.
Notation "{ 'compare' x0 & nz & cond }" := (def x0 nz cond) : type_scope.
Notation "{ 'num' R & nz & cond }" := (def (0%R : R) nz cond) : ring_scope.
Notation "{ = x0 : T }" := (def (x0 : T) MaybeZero EqZero) : type_scope.
Notation "{ > x0 : T }" := (def (x0 : T) NonZero NonNeg) : type_scope.
Notation "{ < x0 : T }" := (def (x0 : T) NonZero NonPos) : type_scope.
Notation "{ >= x0 : T }" := (def (x0 : T) MaybeZero NonNeg) : type_scope.
Notation "{ <= x0 : T }" := (def (x0 : T) MaybeZero NonPos) : type_scope.
Notation "{ >< x0 : T }" := (def (x0 : T) NonZero Real) : type_scope.
Notation "{ >=< x0 : T }" := (def (x0 : T) MaybeZero Real) : type_scope.
Notation "{ != x0 : T }" := (def (x0 : T) NonZero Arbitrary) : type_scope.
Notation "{ ?= x0 : T }" := (def (x0 : T) MaybeZero Arbitrary) : type_scope.
Notation "{ = x0 }" := (def x0 MaybeZero EqZero) : type_scope.
Notation "{ > x0 }" := (def x0 NonZero NonNeg) : type_scope.
Notation "{ < x0 }" := (def x0 NonZero NonPos) : type_scope.
Notation "{ >= x0 }" := (def x0 MaybeZero NonNeg) : type_scope.
Notation "{ <= x0 }" := (def x0 MaybeZero NonPos) : type_scope.
Notation "{ >< x0 }" := (def x0 NonZero Real) : type_scope.
Notation "{ >=< x0 }" := (def x0 MaybeZero Real) : type_scope.
Notation "{ != x0 }" := (def x0 NonZero Arbitrary) : type_scope.
Notation "{ ?= x0 }" := (def x0 MaybeZero Arbitrary) : type_scope.
Notation "x %:sgn" := (from (Phantom _ x)) : ring_scope.
Notation "[ 'sgn' 'of' x ]" := (fromP (Phantom _ x)) : ring_scope.
Notation num := r.
Notation "x %:num" := (r x) : ring_scope.
Definition
posnum : forall [R : numDomainType], phant R -> Type posnum is not universe polymorphic Arguments posnum [R] _ posnum is transparent Expands to: Constant mathcomp.reals.signed.Signed.Exports.posnum Declared in library mathcomp.reals.signed, line 324, characters 11-17
Notation "{ 'posnum' R }" := (@posnum _ (Phant R)) : ring_scope.
Notation "x %:posnum" := (@num _ _ 0%R !=0 >=0 x) : ring_scope.
Definition
nonneg : forall [R : numDomainType], phant R -> Type nonneg is not universe polymorphic Arguments nonneg [R] _ nonneg is transparent Expands to: Constant mathcomp.reals.signed.Signed.Exports.nonneg Declared in library mathcomp.reals.signed, line 327, characters 11-17
Notation "{ 'nonneg' R }" := (@nonneg _ (Phant R)) : ring_scope.
Notation "x %:nngnum" := (@num _ _ 0%R ?=0 >=0 x) : ring_scope.
Arguments r {disp T x0 nz cond}.
End Exports.
End Signed.
Export Signed.Exports.
Section POrder.
Variables (d : Order.disp_t) (T : porderType d).
Variables (x0 : T) (nz : nullity) (cond : reality).
Local Notation sT := {compare x0 & nz & cond}.
HB.instance Definition _ := [isSub for @Signed.r d T x0 nz cond].
HB.instance Definition _ : Order.POrder d sT := [POrder of sT by <:].
End POrder.
Lemma top_typ_subproof d (T : porderType d) (x0 x : T) :
Signed.spec x0 ?=0 >?<0 x.
Proof.
Canonical
top_typ : forall [d : Order.disp_t] [T : porderType d], T -> Signed.typ d ?=0 >?<0 top_typ is not universe polymorphic Arguments top_typ [d T] x0 top_typ is transparent Expands to: Constant mathcomp.reals.signed.top_typ Declared in library mathcomp.reals.signed, line 347, characters 10-17
Signed.Typ (top_typ_subproof x0).
Lemma real_domain_typ_subproof (R : realDomainType) (x : R) :
Signed.spec 0%R ?=0 >=<0 x.
Canonical
real_domain_typ : realDomainType -> Signed.typ ring_display ?=0 >=<0 real_domain_typ is not universe polymorphic Arguments real_domain_typ R real_domain_typ is transparent Expands to: Constant mathcomp.reals.signed.real_domain_typ Declared in library mathcomp.reals.signed, line 354, characters 10-25
Signed.Typ (@real_domain_typ_subproof R).
Lemma real_field_typ_subproof (R : realFieldType) (x : R) :
Signed.spec 0%R ?=0 >=<0 x.
Proof.
Canonical
real_field_typ : realFieldType -> Signed.typ ring_display ?=0 >=<0 real_field_typ is not universe polymorphic Arguments real_field_typ R real_field_typ is transparent Expands to: Constant mathcomp.reals.signed.real_field_typ Declared in library mathcomp.reals.signed, line 361, characters 10-24
Signed.Typ (@real_field_typ_subproof R).
Lemma nat_typ_subproof (x : nat) : Signed.spec 0%N ?=0 >=0 x.
Proof.
Canonical
nat_typ : Signed.typ Order.NatOrder.nat_display ?=0 >=0 nat_typ is not universe polymorphic nat_typ is transparent Expands to: Constant mathcomp.reals.signed.nat_typ Declared in library mathcomp.reals.signed, line 367, characters 10-17
Lemma typ_snum_subproof d nz cond (xt : Signed.typ d nz cond)
(x : Signed.sort xt) :
Signed.spec (Signed.sort_x0 xt) nz cond x.
Proof.
typ_snum : forall [d : Order.disp_t] [nz : KnownSign.nullity] [cond : KnownSign.reality] [xt : Signed.typ d nz cond], Signed.sort xt -> {compare Signed.sort_x0 xt & nz & cond} typ_snum is not universe polymorphic Arguments typ_snum [d] [nz]%_snum_nullity_scope [cond]%_snum_sign_scope [xt] x typ_snum is transparent Expands to: Constant mathcomp.reals.signed.typ_snum Declared in library mathcomp.reals.signed, line 379, characters 10-18
Signed.mk (typ_snum_subproof x).
Class unify {T} f (x y : T) := Unify : f x y = true.
#[global] Hint Mode unify - - - + : typeclass_instances.
Class unify' {T} f (x y : T) := Unify' : f x y = true.
#[global] Instance unify'P {T} f (x y : T) : unify' f x y -> unify f x y := id.
#[global]
Hint Extern 0 (unify' _ _ _) => vm_compute; reflexivity : typeclass_instances.
Notation unify_nz nzx nzy :=
(unify wider_nullity nzx%snum_nullity nzy%snum_nullity).
Notation unify_r rx ry :=
(unify wider_reality rx%snum_sign ry%snum_sign).
#[global] Instance anysign_wider_real sign : unify_r (Real AnySign) (Real sign).
Proof.
#[global] Instance any_reality_wider_eq0 cond : unify_r cond =0.
Proof.
Section Theory.
Context {d : Order.disp_t} {T : porderType d} {x0 : T}.
Context {nz : nullity} {cond : reality}.
Local Notation sT := {compare x0 & nz & cond}.
Implicit Type x : sT.
Lemma signed_intro {x} : x%:num = x%:num :> T
Proof.
Lemma bottom x : unify_nz !=0 nz -> unify_r =0 cond -> False.
Lemma gt0 x : unify_nz !=0 nz -> unify_r >=0 cond -> x0 < x%:num :> T.
Proof.
Lemma le0F x : unify_nz !=0 nz -> unify_r >=0 cond -> x%:num <= x0 :> T = false.
Lemma lt0 x : unify_nz !=0 nz -> unify_r <=0 cond -> x%:num < x0 :> T.
Proof.
Lemma ge0F x : unify_nz !=0 nz -> unify_r <=0 cond -> x0 <= x%:num :> T = false.
Lemma ge0 x : unify_r >=0 cond -> x0 <= x%:num :> T.
Lemma lt0F x : unify_r >=0 cond -> x%:num < x0 :> T = false.
Lemma le0 x : unify_r <=0 cond -> x0 >= x%:num :> T.
Lemma gt0F x : unify_r <=0 cond -> x0 < x%:num :> T = false.
Lemma cmp0 x : unify_r (Real AnySign) cond -> (x0 >=< x%:num).
Proof.
by move: cond nz => [[[]|]|] [] //= _;
do ?[by move=> /eqP ->; rewrite comparablexx];
move=> sx; rewrite /Order.comparable sx// orbT.
Qed.
Lemma neq0 x : unify_nz !=0 nz -> x%:num != x0 :> T.
Lemma eq0F x : unify_nz !=0 nz -> x%:num == x0 :> T = false.
Lemma eq0 x : unify_r =0 cond -> x%:num = x0.
Lemma widen_signed_subproof x nz' cond' :
unify_nz nz' nz -> unify_r cond' cond ->
Signed.spec x0 nz' cond' x%:num.
Proof.
Definition
widen_signed : forall {d : Order.disp_t} {T : porderType d} {x0 : T} {nz : KnownSign.nullity} {cond : KnownSign.reality}, {compare x0 & nz & cond} -> forall {nz' : KnownSign.nullity} {cond' : KnownSign.reality}, unify_nz nz' nz -> unify_r cond' cond -> {compare x0 & nz' & cond'} widen_signed is not universe polymorphic Arguments widen_signed {d T x0} {nz}%_snum_nullity_scope {cond}%_snum_sign_scope x {nz'}%_snum_nullity_scope {cond'}%_snum_sign_scope {unz ucond} widen_signed is transparent Expands to: Constant mathcomp.reals.signed.widen_signed Declared in library mathcomp.reals.signed, line 489, characters 11-23
(unz : unify_nz nz' nz) (ucond : unify_r cond' cond) :=
Signed.mk (widen_signed_subproof x unz ucond).
Lemma widen_signedE x (unz : unify_nz nz nz) (ucond : unify_r cond cond) :
@widen_signed x nz cond unz ucond = x.
Proof.
Lemma posE (x : sT) (unz : unify_nz !=0 nz) (ucond : unify_r >=0 cond) :
(widen_signed x%:num%:sgn unz ucond)%:num = x%:num.
Proof.
Lemma nngE (x : sT) (unz : unify_nz ?=0 nz) (ucond : unify_r >=0 cond) :
(widen_signed x%:num%:sgn unz ucond)%:num = x%:num.
Proof.
End Theory.
Arguments bottom {d T x0 nz cond} _ {_ _}.
Arguments gt0 {d T x0 nz cond} _ {_ _}.
Arguments le0F {d T x0 nz cond} _ {_ _}.
Arguments lt0 {d T x0 nz cond} _ {_ _}.
Arguments ge0F {d T x0 nz cond} _ {_ _}.
Arguments ge0 {d T x0 nz cond} _ {_}.
Arguments lt0F {d T x0 nz cond} _ {_}.
Arguments le0 {d T x0 nz cond} _ {_}.
Arguments gt0F {d T x0 nz cond} _ {_}.
Arguments cmp0 {d T x0 nz cond} _ {_}.
Arguments neq0 {d T x0 nz cond} _ {_}.
Arguments eq0F {d T x0 nz cond} _ {_}.
Arguments eq0 {d T x0 nz cond} _ {_}.
Arguments widen_signed {d T x0 nz cond} _ {_ _ _ _}.
Arguments widen_signedE {d T x0 nz cond} _ {_ _}.
Arguments posE {d T x0 nz cond} _ {_ _}.
Arguments nngE {d T x0 nz cond} _ {_ _}.
Notation "[ 'gt0' 'of' x ]" := (ltac:(refine (gt0 x%:sgn))).
Notation "[ 'lt0' 'of' x ]" := (ltac:(refine (lt0 x%:sgn))).
Notation "[ 'ge0' 'of' x ]" := (ltac:(refine (ge0 x%:sgn))).
Notation "[ 'le0' 'of' x ]" := (ltac:(refine (le0 x%:sgn))).
Notation "[ 'cmp0' 'of' x ]" := (ltac:(refine (cmp0 x%:sgn))).
Notation "[ 'neq0' 'of' x ]" := (ltac:(refine (neq0 x%:sgn))).
#[global] Hint Extern 0 (is_true (0%R < _)%O) => solve [apply: gt0] : core.
#[global] Hint Extern 0 (is_true (_ < 0%R)%O) => solve [apply: lt0] : core.
#[global] Hint Extern 0 (is_true (0%R <= _)%O) => solve [apply: ge0] : core.
#[global] Hint Extern 0 (is_true (_ <= 0%R)%O) => solve [apply: le0] : core.
#[global] Hint Extern 0 (is_true (_ \is Num.real)) => solve [apply: cmp0] : core.
#[global] Hint Extern 0 (is_true (0%R >=< _)%O) => solve [apply: cmp0] : core.
#[global] Hint Extern 0 (is_true (_ != 0%R)%O) => solve [apply: neq0] : core.
Notation "x %:pos" := (widen_signed x%:sgn : {posnum _}) (only parsing)
: ring_scope.
Notation "x %:nng" := (widen_signed x%:sgn : {nonneg _}) (only parsing)
: ring_scope.
Notation "x %:pos" := (@widen_signed _ _ _ _ _
(@Signed.from _ _ _ _ _ _ (Phantom _ x)) !=0 (Real (Sign >=0)) _ _)
(only printing) : ring_scope.
Notation "x %:nng" := (@widen_signed _ _ _ _ _
(@Signed.from _ _ _ _ _ _ (Phantom _ x)) ?=0 (Real (Sign >=0)) _ _)
(only printing) : ring_scope.
Local Open Scope ring_scope.
Section Order.
Variables (R : numDomainType) (nz : nullity) (r : real).
Local Notation nR := {num R & nz & r}.
Lemma signed_le_total : total (<=%O : rel nR).
Proof.
HB.instance Definition _ := Order.POrder_isTotal.Build ring_display nR
signed_le_total.
End Order.
Section POrderStability.
Context {disp : Order.disp_t} {T : porderType disp} {x0 : T}.
Definition
min_nonzero_subdef : KnownSign.nullity -> KnownSign.nullity -> KnownSign.reality -> KnownSign.reality -> KnownSign.nullity min_nonzero_subdef is not universe polymorphic Arguments min_nonzero_subdef (xnz ynz)%_snum_nullity_scope (xr yr)%_snum_sign_scope min_nonzero_subdef is transparent Expands to: Constant mathcomp.reals.signed.min_nonzero_subdef Declared in library mathcomp.reals.signed, line 568, characters 11-29
nz_of_bool
(xnz && ynz
|| xnz && yr && match xr with Real (Sign <=0) => true | _ => false end
|| ynz && match yr with Real (Sign <=0) => true | _ => false end).
Arguments min_nonzero_subdef /.
Definition
min_reality_subdef : KnownSign.nullity -> KnownSign.nullity -> KnownSign.reality -> KnownSign.reality -> KnownSign.reality min_reality_subdef is not universe polymorphic Arguments min_reality_subdef (xnz ynz)%_snum_nullity_scope (xr yr)%_snum_sign_scope min_reality_subdef is transparent Expands to: Constant mathcomp.reals.signed.min_reality_subdef Declared in library mathcomp.reals.signed, line 575, characters 11-29
match xr, yr with
| Real (Sign =0), Real (Sign =0)
| Real (Sign =0), Real (Sign >=0)
| Real (Sign >=0), Real (Sign =0) => =0
| Real (Sign >=0), Real (Sign >=0) => >=0
| Real (Sign <=0), Real _
| Real _, Real (Sign <=0) => <=0
| Real _, Real _ => >=<0
| _, _ => >?<0
end.
Arguments min_reality_subdef /.
Lemma min_snum_subproof (xnz ynz : nullity) (xr yr : reality)
(x : {compare x0 & xnz & xr}) (y : {compare x0 & ynz & yr})
(rnz := min_nonzero_subdef xnz ynz xr yr)
(rrl := min_reality_subdef xnz ynz xr yr) :
Signed.spec x0 rnz rrl (Order.min x%:num y%:num).
Proof.
move: xr yr xnz ynz x y => [[[]|]|] [[[]|]|] [] []//= x y; rewrite /Order.min;
do ?[by case: (bottom x)|by case: (bottom y)
|by case: ifP; rewrite ?eq0F// => xlty;
have := !! lt_trans xlty (lt0 y); rewrite lt_neqAle => /andP[]
|by rewrite ifT ?eq0F//; apply: lt_le_trans (ge0 y); exact: lt0
|by have := !! le0 y;
rewrite le_eqVlt => /predU1P[->|]; rewrite ?lt0 ?eq0F//;
case: ifP => _; rewrite ?eq0F// lt_neqAle => /andP[]].
have /orP[x0ley|] := !! cmp0 y.
by rewrite ifT ?eq0F//; apply: lt_le_trans x0ley; exact: lt0.
rewrite le_eqVlt => /predU1P[->|]; rewrite ?lt0 ?eq0F//.
by case: ifP => _; rewrite ?eq0F// lt_neqAle => /andP[].
move: xr yr xnz ynz x y => [[[]|]|] [[[]|]|] [] []//= x y;
do ?[by case: (bottom x)|by case: (bottom y)
|by apply: comparable_minr; exact: cmp0
|by rewrite minEle; case: ifP; rewrite ge0
|by rewrite ?eq0 minEle ?ge0
|by rewrite ?eq0 minElt; case: ifP; rewrite ?eq0// lt0F
|by rewrite minEle; case: ifP => [xlty|]; rewrite ?le0//;
apply: (le_trans xlty); rewrite le0
|by have /orP[x0ley|] := !! cmp0 y;
[rewrite minEle ifT ?le0//; apply: le_trans x0ley; exact: le0
|rewrite minEle; case: ifP => //; exact: le_trans]].
Qed.
Canonical
min_snum : forall {disp : Order.disp_t} {T : porderType disp} {x0 : T} [xnz ynz : KnownSign.nullity] [xr yr : KnownSign.reality], {compare x0 & xnz & xr} -> {compare x0 & ynz & yr} -> {compare x0 & min_nonzero_subdef xnz ynz xr yr & min_reality_subdef xnz ynz xr yr} min_snum is not universe polymorphic Arguments min_snum {disp T x0} [xnz ynz]%_snum_nullity_scope [xr yr]%_snum_sign_scope x y min_snum is transparent Expands to: Constant mathcomp.reals.signed.min_snum Declared in library mathcomp.reals.signed, line 620, characters 10-18
(x : {compare x0 & xnz & xr}) (y : {compare x0 & ynz & yr}) :=
Signed.mk (min_snum_subproof x y).
Definition
max_nonzero_subdef : KnownSign.nullity -> KnownSign.nullity -> KnownSign.reality -> KnownSign.reality -> KnownSign.nullity max_nonzero_subdef is not universe polymorphic Arguments max_nonzero_subdef (xnz ynz)%_snum_nullity_scope (xr yr)%_snum_sign_scope max_nonzero_subdef is transparent Expands to: Constant mathcomp.reals.signed.max_nonzero_subdef Declared in library mathcomp.reals.signed, line 624, characters 11-29
nz_of_bool
(xnz && ynz
|| xnz && match xr with Real (Sign >=0) => true | _ => false end
|| ynz && xr && match yr with Real (Sign >=0) => true | _ => false end).
Arguments max_nonzero_subdef /.
Definition
max_reality_subdef : KnownSign.nullity -> KnownSign.nullity -> KnownSign.reality -> KnownSign.reality -> KnownSign.reality max_reality_subdef is not universe polymorphic Arguments max_reality_subdef (xnz ynz)%_snum_nullity_scope (xr yr)%_snum_sign_scope max_reality_subdef is transparent Expands to: Constant mathcomp.reals.signed.max_reality_subdef Declared in library mathcomp.reals.signed, line 631, characters 11-29
match xr, yr with
| Real (Sign =0), Real (Sign =0)
| Real (Sign =0), Real (Sign <=0)
| Real (Sign <=0), Real (Sign =0) => =0
| Real (Sign <=0), Real (Sign <=0) => <=0
| Real (Sign >=0), Real _
| Real _, Real (Sign >=0) => >=0
| Real _, Real _ => >=<0
| _, _ => >?<0
end.
Arguments max_reality_subdef /.
Lemma max_snum_subproof (xnz ynz : nullity) (xr yr : reality)
(x : {compare x0 & xnz & xr}) (y : {compare x0 & ynz & yr})
(rnz := max_nonzero_subdef xnz ynz xr yr)
(rrl := max_reality_subdef xnz ynz xr yr) :
Signed.spec x0 rnz rrl (Order.max x%:num y%:num).
Proof.
move: xr yr xnz ynz x y => [[[]|]|] [[[]|]|] [] []//= x y; rewrite maxElt;
do ?[by case: (bottom x)|by case: (bottom y)
|by case: ifP => [xlty|]; rewrite ?eq0F//;
do [suff : (x0 < y%:num)%O by rewrite lt_def => /andP[]];
apply: le_lt_trans xlty; exact: ge0
|by rewrite ifT ?eq0F//; apply: le_lt_trans (gt0 y); exact: le0
|by have := !! ge0 x;
rewrite le_eqVlt => /predU1P[<-|]; rewrite ?gt0 ?eq0F//;
case: ifP => _; rewrite ?eq0F// lt_def => /andP[]].
have /orP[|xlex0] := !! cmp0 x.
rewrite le_eqVlt => /predU1P[<-|]; rewrite ?gt0 ?eq0F//.
by case: ifP => _; rewrite ?eq0F// lt_def => /andP[].
by rewrite ifT ?eq0F//; apply: (le_lt_trans xlex0); exact: gt0.
move: xr yr xnz ynz x y => [[[]|]|] [[[]|]|] [] []//= x y;
do ?[by case: (bottom x)|by case: (bottom y)
|by apply: comparable_maxr; exact: cmp0
|by rewrite ?eq0 maxEle ?le0
|by rewrite ?eq0 maxElt ifF// le_gtF// le0
|by rewrite maxEle; case: ifP; rewrite ?ge0//; exact/le_trans/ge0
|by rewrite maxElt; case: ifP => [xlty|]; rewrite ?le0//
|by have /orP[|xlex0] := !! cmp0 x;
[rewrite maxEle; case: ifP => // /[swap]; exact: le_trans
|rewrite maxEle ifT ?ge0//; apply: (le_trans xlex0); exact: ge0]].
Qed.
Canonical
max_snum : forall {disp : Order.disp_t} {T : porderType disp} {x0 : T} [xnz ynz : KnownSign.nullity] [xr yr : KnownSign.reality], {compare x0 & xnz & xr} -> {compare x0 & ynz & yr} -> {compare x0 & max_nonzero_subdef xnz ynz xr yr & max_reality_subdef xnz ynz xr yr} max_snum is not universe polymorphic Arguments max_snum {disp T x0} [xnz ynz]%_snum_nullity_scope [xr yr]%_snum_sign_scope x y max_snum is transparent Expands to: Constant mathcomp.reals.signed.max_snum Declared in library mathcomp.reals.signed, line 676, characters 10-18
(x : {compare x0 & xnz & xr}) (y : {compare x0 & ynz & yr}) :=
Signed.mk (max_snum_subproof x y).
End POrderStability.
Section NumDomainStability.
Context {R : numDomainType}.
Lemma zero_snum_subproof : Signed.spec 0 ?=0 =0 (0 : R).
Proof.
Canonical
zero_snum : forall {R : numDomainType}, {compare 0%R & ?=0 & =0} zero_snum is not universe polymorphic Arguments zero_snum {R} zero_snum is transparent Expands to: Constant mathcomp.reals.signed.zero_snum Declared in library mathcomp.reals.signed, line 688, characters 10-19
Lemma one_snum_subproof : Signed.spec 0 !=0 >=0 (1 : R).
Canonical
one_snum : forall {R : numDomainType}, {compare 0%R & !=0 & >=0} one_snum is not universe polymorphic Arguments one_snum {R} one_snum is transparent Expands to: Constant mathcomp.reals.signed.one_snum Declared in library mathcomp.reals.signed, line 693, characters 10-18
Definition
opp_reality_subdef : KnownSign.nullity -> KnownSign.reality -> KnownSign.reality opp_reality_subdef is not universe polymorphic Arguments opp_reality_subdef xnz%_snum_nullity_scope xr%_snum_sign_scope opp_reality_subdef is transparent Expands to: Constant mathcomp.reals.signed.opp_reality_subdef Declared in library mathcomp.reals.signed, line 695, characters 11-29
match xr with
| Real (Sign =0) => =0
| Real (Sign >=0) => <=0
| Real (Sign <=0) => >=0
| Real AnySign => >=<0
| Arbitrary => >?<0
end.
Lemma opp_snum_subproof (xnz : nullity) (xr : reality)
(x : {num R & xnz & xr}) (r := opp_reality_subdef xnz xr) :
Signed.spec 0 xnz r (- x%:num).
Proof.
Canonical
opp_snum : forall {R : numDomainType} [xnz : KnownSign.nullity] [xr : KnownSign.reality], {num R & xnz & xr}%R -> {compare 0%R & xnz & opp_reality_subdef xnz xr} opp_snum is not universe polymorphic Arguments opp_snum {R} [xnz]%_snum_nullity_scope [xr]%_snum_sign_scope x opp_snum is transparent Expands to: Constant mathcomp.reals.signed.opp_snum Declared in library mathcomp.reals.signed, line 712, characters 10-18
Signed.mk (opp_snum_subproof x).
Definition
add_samesign_subdef : KnownSign.nullity -> KnownSign.nullity -> KnownSign.reality -> KnownSign.reality -> bool add_samesign_subdef is not universe polymorphic Arguments add_samesign_subdef (xnz ynz)%_snum_nullity_scope (xr yr)%_snum_sign_scope add_samesign_subdef is transparent Expands to: Constant mathcomp.reals.signed.add_samesign_subdef Declared in library mathcomp.reals.signed, line 715, characters 11-30
match xr, yr with
| Real (Sign >=0), Real (Sign =0)
| Real (Sign =0), Real (Sign >=0)
| Real (Sign <=0), Real (Sign =0)
| Real (Sign =0), Real (Sign <=0)
| Real (Sign =0), Real (Sign =0)
| Real (Sign >=0), Real (Sign >=0)
| Real (Sign <=0), Real (Sign <=0) => true
| _, _ => false
end.
Definition
add_nonzero_subdef : KnownSign.nullity -> KnownSign.nullity -> KnownSign.reality -> KnownSign.reality -> KnownSign.nullity add_nonzero_subdef is not universe polymorphic Arguments add_nonzero_subdef (xnz ynz)%_snum_nullity_scope (xr yr)%_snum_sign_scope add_nonzero_subdef is transparent Expands to: Constant mathcomp.reals.signed.add_nonzero_subdef Declared in library mathcomp.reals.signed, line 727, characters 11-29
nz_of_bool (add_samesign_subdef xnz ynz xr yr && (xnz || ynz)).
Arguments add_nonzero_subdef /.
Definition
add_reality_subdef : KnownSign.nullity -> KnownSign.nullity -> KnownSign.reality -> KnownSign.reality -> KnownSign.reality add_reality_subdef is not universe polymorphic Arguments add_reality_subdef (xnz ynz)%_snum_nullity_scope (xr yr)%_snum_sign_scope add_reality_subdef is transparent Expands to: Constant mathcomp.reals.signed.add_reality_subdef Declared in library mathcomp.reals.signed, line 731, characters 11-29
match xr, yr with
| Real (Sign =0), Real (Sign =0) => =0
| Real (Sign >=0), Real (Sign =0)
| Real (Sign =0), Real (Sign >=0)
| Real (Sign >=0), Real (Sign >=0) => >=0
| Real (Sign <=0), Real (Sign =0)
| Real (Sign =0), Real (Sign <=0)
| Real (Sign <=0), Real (Sign <=0) => <=0
| Real _, Real _ => >=<0
| _, _ => >?<0
end.
Arguments add_reality_subdef /.
Lemma add_snum_subproof (xnz ynz : nullity) (xr yr : reality)
(x : {num R & xnz & xr}) (y : {num R & ynz & yr})
(rnz := add_nonzero_subdef xnz ynz xr yr)
(rrl := add_reality_subdef xnz ynz xr yr) :
Signed.spec 0 rnz rrl (x%:num + y%:num).
Proof.
move: xr yr xnz ynz x y => [[[]|]|] [[[]|]|] [] []//= x y;
by rewrite 1?addr_ss_eq0 ?(eq0F, ge0, le0, andbF, orbT).
have addr_le0 (a b : R) : a <= 0 -> b <= 0 -> a + b <= 0.
by rewrite -!oppr_ge0 opprD; apply: addr_ge0.
move: xr yr xnz ynz x y => [[[]|]|] [[[]|]|] [] []//= x y;
do ?[by rewrite addr_ge0|by rewrite addr_le0|by rewrite -realE realD
|by case: (bottom x)|by case: (bottom y)|by rewrite !eq0 addr0].
Qed.
Canonical
add_snum : forall {R : numDomainType} [xnz ynz : KnownSign.nullity] [xr yr : KnownSign.reality], {num R & xnz & xr}%R -> {num R & ynz & yr}%R -> {compare 0%R & add_nonzero_subdef xnz ynz xr yr & add_reality_subdef xnz ynz xr yr} add_snum is not universe polymorphic Arguments add_snum {R} [xnz ynz]%_snum_nullity_scope [xr yr]%_snum_sign_scope x y add_snum is transparent Expands to: Constant mathcomp.reals.signed.add_snum Declared in library mathcomp.reals.signed, line 761, characters 10-18
(x : {num R & xnz & xr}) (y : {num R & ynz & yr}) :=
Signed.mk (add_snum_subproof x y).
Definition
mul_nonzero_subdef : KnownSign.nullity -> KnownSign.nullity -> KnownSign.reality -> KnownSign.reality -> KnownSign.nullity mul_nonzero_subdef is not universe polymorphic Arguments mul_nonzero_subdef (xnz ynz)%_snum_nullity_scope (xr yr)%_snum_sign_scope mul_nonzero_subdef is transparent Expands to: Constant mathcomp.reals.signed.mul_nonzero_subdef Declared in library mathcomp.reals.signed, line 765, characters 11-29
nz_of_bool (xnz && ynz).
Arguments mul_nonzero_subdef /.
Definition
mul_reality_subdef : KnownSign.nullity -> KnownSign.nullity -> KnownSign.reality -> KnownSign.reality -> KnownSign.reality mul_reality_subdef is not universe polymorphic Arguments mul_reality_subdef (xnz ynz)%_snum_nullity_scope (xr yr)%_snum_sign_scope mul_reality_subdef is transparent Expands to: Constant mathcomp.reals.signed.mul_reality_subdef Declared in library mathcomp.reals.signed, line 769, characters 11-29
match xr, yr with
| Real (Sign =0), _ | _, Real (Sign =0) => =0
| Real (Sign >=0), Real (Sign >=0)
| Real (Sign <=0), Real (Sign <=0) => >=0
| Real (Sign >=0), Real (Sign <=0)
| Real (Sign <=0), Real (Sign >=0) => <=0
| Real _, Real _ => >=<0
| _ , _ => >?<0
end.
Arguments mul_reality_subdef /.
Lemma mul_snum_subproof (xnz ynz : nullity) (xr yr : reality)
(x : {num R & xnz & xr}) (y : {num R & ynz & yr})
(rnz := mul_nonzero_subdef xnz ynz xr yr)
(rrl := mul_reality_subdef xnz ynz xr yr) :
Signed.spec 0 rnz rrl (x%:num * y%:num).
Proof.
by move: xr yr xnz ynz x y => [[[]|]|] [[[]|]|] [] []// x y;
rewrite mulf_neq0.
by move: xr yr xnz ynz x y => [[[]|]|] [[[]|]|] [] []/= x y //;
do ?[by rewrite mulr_ge0|by rewrite mulr_le0_ge0
|by rewrite mulr_ge0_le0|by rewrite mulr_le0|by rewrite -realE realM
|by case: (bottom x)|by case: (bottom y)|by rewrite eq0 ?mulr0// mul0r].
Qed.
Canonical
mul_snum : forall {R : numDomainType} [xnz ynz : KnownSign.nullity] [xr yr : KnownSign.reality], {num R & xnz & xr}%R -> {num R & ynz & yr}%R -> {compare 0%R & mul_nonzero_subdef xnz ynz xr yr & mul_reality_subdef xnz ynz xr yr} mul_snum is not universe polymorphic Arguments mul_snum {R} [xnz ynz]%_snum_nullity_scope [xr yr]%_snum_sign_scope x y mul_snum is transparent Expands to: Constant mathcomp.reals.signed.mul_snum Declared in library mathcomp.reals.signed, line 796, characters 10-18
(x : {num R & xnz & xr}) (y : {num R & ynz & yr}) :=
Signed.mk (mul_snum_subproof x y).
Lemma natmul_snum_subproof (xnz nnz : nullity) (xr nr : reality)
(x : {num R & xnz & xr}) (n : {compare 0%N & nnz & nr})
(rnz := mul_nonzero_subdef xnz nnz xr nr)
(rrl := mul_reality_subdef xnz nnz xr nr) :
Signed.spec 0 rnz rrl (x%:num *+ n%:num).
Proof.
by move: xr nr xnz nnz x n => [[[]|]|] [[[]|]|] [] []// x n;
rewrite mulrn_eq0//= ?eq0F.
move: xr nr xnz nnz x n => [[[]|]|] [[[]|]|] [] []/= x [[|n]//= _] //;
do ?[by case: (bottom x)|by case: (bottom n)
|by rewrite mulrn_wge0|by rewrite mulrn_wle0|by rewrite eq0 mul0rn
|by apply: real_comparable; rewrite ?real0 ?realrMn].
Qed.
Canonical
natmul_snum : forall {R : numDomainType} [xnz nnz : KnownSign.nullity] [xr nr : KnownSign.reality], {num R & xnz & xr}%R -> {compare 0 & nnz & nr} -> {compare 0%R & mul_nonzero_subdef xnz nnz xr nr & mul_reality_subdef xnz nnz xr nr} natmul_snum is not universe polymorphic Arguments natmul_snum {R} [xnz nnz]%_snum_nullity_scope [xr nr]%_snum_sign_scope x n natmul_snum is transparent Expands to: Constant mathcomp.reals.signed.natmul_snum Declared in library mathcomp.reals.signed, line 815, characters 10-21
(x : {num R & xnz & xr}) (n : {compare 0%N & nnz & nr}) :=
Signed.mk (natmul_snum_subproof x n).
Lemma intmul_snum_subproof (xnz nnz : nullity) (xr nr : reality)
(x : {num R & xnz & xr}) (n : {num int & nnz & nr})
(rnz := mul_nonzero_subdef xnz nnz xr nr)
(rrl := mul_reality_subdef xnz nnz xr nr) :
Signed.spec 0 rnz rrl (x%:num *~ n%:num).
Proof.
by move: xr nr xnz nnz x n => [[[]|]|] [[[]|]|] [] []// x n;
rewrite mulrz_neq0//= ?neq0.
move: xr nr xnz nnz x n => [[[]|]|] [[[]|]|] [] []/= x n //;
do ?[by case: (bottom x)|by case: (bottom n)
|by rewrite mulrz_ge0|by rewrite mulrz_le0_ge0|by rewrite eq0 mul0rz
|by rewrite mulrz_ge0_le0|by rewrite mulrz_le0|by rewrite eq0 mulr0z
|by rewrite -realE rpredMz//; apply: cmp0].
Qed.
Canonical
intmul_snum : forall {R : numDomainType} [xnz nnz : KnownSign.nullity] [xr nr : KnownSign.reality], {num R & xnz & xr}%R -> {num int & nnz & nr}%R -> {compare 0%R & mul_nonzero_subdef xnz nnz xr nr & mul_reality_subdef xnz nnz xr nr} intmul_snum is not universe polymorphic Arguments intmul_snum {R} [xnz nnz]%_snum_nullity_scope [xr nr]%_snum_sign_scope x n intmul_snum is transparent Expands to: Constant mathcomp.reals.signed.intmul_snum Declared in library mathcomp.reals.signed, line 835, characters 10-21
(x : {num R & xnz & xr}) (n : {num int & nnz & nr}) :=
Signed.mk (intmul_snum_subproof x n).
Lemma inv_snum_subproof (xnz : nullity) (xr : reality)
(x : {num R & xnz & xr}) :
Signed.spec 0 xnz xr (x%:num^-1 : R).
Canonical
inv_snum : forall {R : numDomainType} [xnz : KnownSign.nullity] [xr : KnownSign.reality], {num R & xnz & xr}%R -> {compare 0%R & xnz & xr} inv_snum is not universe polymorphic Arguments inv_snum {R} [xnz]%_snum_nullity_scope [xr]%_snum_sign_scope x inv_snum is transparent Expands to: Constant mathcomp.reals.signed.inv_snum Declared in library mathcomp.reals.signed, line 847, characters 10-18
Signed.mk (inv_snum_subproof x).
Definition
exprn_nonzero_subdef : KnownSign.nullity -> KnownSign.nullity -> KnownSign.reality -> KnownSign.reality -> KnownSign.nullity exprn_nonzero_subdef is not universe polymorphic Arguments exprn_nonzero_subdef (xnz nnz)%_snum_nullity_scope (xr nr)%_snum_sign_scope exprn_nonzero_subdef is transparent Expands to: Constant mathcomp.reals.signed.exprn_nonzero_subdef Declared in library mathcomp.reals.signed, line 850, characters 11-31
(xr nr : reality) : nullity :=
nz_of_bool (xnz || match nr with Real (Sign =0) => true | _ => false end).
Arguments exprn_nonzero_subdef /.
Definition
exprn_reality_subdef : KnownSign.nullity -> KnownSign.nullity -> KnownSign.reality -> KnownSign.reality -> KnownSign.reality exprn_reality_subdef is not universe polymorphic Arguments exprn_reality_subdef (xnz nnz)%_snum_nullity_scope (xr nr)%_snum_sign_scope exprn_reality_subdef is transparent Expands to: Constant mathcomp.reals.signed.exprn_reality_subdef Declared in library mathcomp.reals.signed, line 855, characters 11-31
(xr nr : reality) : reality :=
match xr, nr with
| _, Real (Sign =0) => >=0
| Real (Sign =0), _ => (if nnz then =0 else >=0)%snum_sign
| Real (Sign >=0), _ => >=0
| Real _, _ => >=<0
| _, _ => >?<0
end.
Arguments exprn_reality_subdef /.
Lemma exprn_snum_subproof (xnz nnz : nullity) (xr nr : reality)
(x : {num R & xnz & xr}) (n : {compare 0%N & nnz & nr})
(rnz := exprn_nonzero_subdef xnz nnz xr nr)
(rrl := exprn_reality_subdef xnz nnz xr nr) :
Signed.spec 0 rnz rrl (x%:num ^+ n%:num).
Proof.
by move: xr nr xnz nnz x n => [[[]|]|] [[[]|]|] [] []// x n;
do ?[by case: (bottom x)|by case: (bottom n)];
rewrite expf_eq0/= ?eq0// ?eq0F ?andbF//.
move: xr nr xnz nnz x n => [[[]|]|] [[[]|]|] [] []/= x [[|n]//= _] //;
do ?[by case: (bottom x)|by case: (bottom n)|by rewrite [_ || _]realX
|by rewrite eq0 expr0n|exact: exprn_ge0|by rewrite expr0 ler01].
Qed.
Canonical
exprn_snum : forall {R : numDomainType} [xnz nnz : KnownSign.nullity] [xr nr : KnownSign.reality], {num R & xnz & xr}%R -> {compare 0 & nnz & nr} -> {compare 0%R & exprn_nonzero_subdef xnz nnz xr nr & exprn_reality_subdef xnz nnz xr nr} exprn_snum is not universe polymorphic Arguments exprn_snum {R} [xnz nnz]%_snum_nullity_scope [xr nr]%_snum_sign_scope x n exprn_snum is transparent Expands to: Constant mathcomp.reals.signed.exprn_snum Declared in library mathcomp.reals.signed, line 881, characters 10-20
(x : {num R & xnz & xr}) (n : {compare 0%N & nnz & nr}) :=
Signed.mk (exprn_snum_subproof x n).
Lemma norm_snum_subproof {V : normedZmodType R} (x : V) :
Signed.spec 0 ?=0 >=0 `|x|.
Proof.
Canonical
norm_snum : forall {R : numDomainType} {V : normedZmodType R}, V -> {compare 0%R & ?=0 & >=0} norm_snum is not universe polymorphic Arguments norm_snum {R V} x%_ring_scope norm_snum is transparent Expands to: Constant mathcomp.reals.signed.norm_snum Declared in library mathcomp.reals.signed, line 889, characters 10-19
Signed.mk (norm_snum_subproof x).
End NumDomainStability.
Section RcfStability.
Context {R : rcfType}.
Definition
sqrt_nonzero_subdef : KnownSign.nullity -> KnownSign.reality -> KnownSign.nullity sqrt_nonzero_subdef is not universe polymorphic Arguments sqrt_nonzero_subdef xnz%_snum_nullity_scope xr%_snum_sign_scope sqrt_nonzero_subdef is transparent Expands to: Constant mathcomp.reals.signed.sqrt_nonzero_subdef Declared in library mathcomp.reals.signed, line 897, characters 11-30
if xr is Real (Sign >=0) then xnz else MaybeZero.
Arguments sqrt_nonzero_subdef /.
Lemma sqrt_snum_subproof xnz xr (x : {num R & xnz & xr})
(nz := sqrt_nonzero_subdef xnz xr) :
Signed.spec 0 nz >=0 (Num.sqrt x%:num).
Proof.
Canonical
sqrt_snum : forall {R : rcfType} [xnz : KnownSign.nullity] [xr : KnownSign.reality], {num R & xnz & xr}%R -> {compare 0%R & sqrt_nonzero_subdef xnz xr & >=0} sqrt_snum is not universe polymorphic Arguments sqrt_snum {R} [xnz]%_snum_nullity_scope [xr]%_snum_sign_scope x sqrt_snum is transparent Expands to: Constant mathcomp.reals.signed.sqrt_snum Declared in library mathcomp.reals.signed, line 909, characters 10-19
Signed.mk (sqrt_snum_subproof x).
End RcfStability.
Section NumClosedStability.
Context {R : numClosedFieldType}.
Definition
sqrtC_reality_subdef : KnownSign.nullity -> KnownSign.reality -> KnownSign.reality sqrtC_reality_subdef is not universe polymorphic Arguments sqrtC_reality_subdef xnz%_snum_nullity_scope xr%_snum_sign_scope sqrtC_reality_subdef is transparent Expands to: Constant mathcomp.reals.signed.sqrtC_reality_subdef Declared in library mathcomp.reals.signed, line 917, characters 11-31
match xr with
| Real (Sign =0) => =0
| Real (Sign >=0) => >=0
| _ => >?<0
end.
Arguments sqrtC_reality_subdef /.
Lemma sqrtC_snum_subproof xnz xr (x : {num R & xnz & xr})
(r := sqrtC_reality_subdef xnz xr) :
Signed.spec 0 xnz r (sqrtC x%:num).
Proof.
Canonical
sqrtC_snum : forall {R : numClosedFieldType} [xnz : KnownSign.nullity] [xr : KnownSign.reality], {num R & xnz & xr}%R -> {compare 0%R & xnz & sqrtC_reality_subdef xnz xr} sqrtC_snum is not universe polymorphic Arguments sqrtC_snum {R} [xnz]%_snum_nullity_scope [xr]%_snum_sign_scope x sqrtC_snum is transparent Expands to: Constant mathcomp.reals.signed.sqrtC_snum Declared in library mathcomp.reals.signed, line 934, characters 10-20
Signed.mk (sqrtC_snum_subproof x).
End NumClosedStability.
Section NatStability.
Local Open Scope nat_scope.
Implicit Type (n : nat).
Lemma zeron_snum_subproof : Signed.spec 0 ?=0 =0 0.
Proof.
Canonical
zeron_snum : {compare 0 & ?=0 & =0} zeron_snum is not universe polymorphic zeron_snum is transparent Expands to: Constant mathcomp.reals.signed.zeron_snum Declared in library mathcomp.reals.signed, line 946, characters 10-20
Lemma succn_snum_subproof n : Signed.spec 0 !=0 >=0 n.+1.
Proof.
Canonical
succn_snum : nat -> {compare 0 & !=0 & >=0} succn_snum is not universe polymorphic Arguments succn_snum n%_nat_scope succn_snum is transparent Expands to: Constant mathcomp.reals.signed.succn_snum Declared in library mathcomp.reals.signed, line 951, characters 10-20
Lemma double_snum_subproof nz r (x : {compare 0 & nz & r}) :
Signed.spec 0 nz r x%:num.*2.
Proof.
Canonical
double_snum : forall [nz : KnownSign.nullity] [r : KnownSign.reality], {compare 0 & nz & r} -> {compare 0 & nz & r} double_snum is not universe polymorphic Arguments double_snum [nz]%_snum_nullity_scope [r]%_snum_sign_scope x double_snum is transparent Expands to: Constant mathcomp.reals.signed.double_snum Declared in library mathcomp.reals.signed, line 957, characters 10-21
Signed.mk (@double_snum_subproof nz r x).
Lemma addn_snum_subproof (xnz ynz : nullity) (xr yr : reality)
(x : {compare 0 & xnz & xr}) (y : {compare 0 & ynz & yr})
(rnz := add_nonzero_subdef xnz ynz xr yr)
(rrl := add_reality_subdef xnz ynz xr yr) :
Signed.spec 0 rnz rrl (x%:num + y%:num).
Proof.
by move: xr yr xnz ynz x y => [[[]|]|] [[[]|]|] [] []//= [[|x]//= _] [[|y]].
Qed.
Canonical
addn_snum : forall [xnz ynz : KnownSign.nullity] [xr yr : KnownSign.reality], {compare 0 & xnz & xr} -> {compare 0 & ynz & yr} -> {compare 0 & add_nonzero_subdef xnz ynz xr yr & add_reality_subdef xnz ynz xr yr} addn_snum is not universe polymorphic Arguments addn_snum [xnz ynz]%_snum_nullity_scope [xr yr]%_snum_sign_scope x y addn_snum is transparent Expands to: Constant mathcomp.reals.signed.addn_snum Declared in library mathcomp.reals.signed, line 970, characters 10-19
(x : {compare 0 & xnz & xr}) (y : {compare 0 & ynz & yr}) :=
Signed.mk (addn_snum_subproof x y).
Lemma muln_snum_subproof (xnz ynz : nullity) (xr yr : reality)
(x : {compare 0 & xnz & xr}) (y : {compare 0 & ynz & yr})
(rnz := mul_nonzero_subdef xnz ynz xr yr)
(rrl := mul_reality_subdef xnz ynz xr yr) :
Signed.spec 0 rnz rrl (x%:num * y%:num).
Proof.
Canonical
muln_snum : forall [xnz ynz : KnownSign.nullity] [xr yr : KnownSign.reality], {compare 0 & xnz & xr} -> {compare 0 & ynz & yr} -> {compare 0 & mul_nonzero_subdef xnz ynz xr yr & mul_reality_subdef xnz ynz xr yr} muln_snum is not universe polymorphic Arguments muln_snum [xnz ynz]%_snum_nullity_scope [xr yr]%_snum_sign_scope x y muln_snum is transparent Expands to: Constant mathcomp.reals.signed.muln_snum Declared in library mathcomp.reals.signed, line 985, characters 10-19
(x : {compare 0 & xnz & xr}) (y : {compare 0 & ynz & yr}) :=
Signed.mk (muln_snum_subproof x y).
Lemma expn_snum_subproof (xnz nnz : nullity) (xr nr : reality)
(x : {compare 0 & xnz & xr}) (n : {compare 0 & nnz & nr})
(rnz := exprn_nonzero_subdef xnz nnz xr nr)
(rrl := exprn_reality_subdef xnz nnz xr nr) :
Signed.spec 0 rnz rrl (x%:num ^ n%:num).
Proof.
move: xr nr xnz nnz x n => [[[]|]|] [[[]|]|] [] []// x n;
do ?[by case: (bottom x)|by case: (bottom n)
|by rewrite ?eq0 ?expn0// expn_eq0 ?eq0F].
move: xr nr xnz nnz x n => [[[]|]|] [[[]|]|] [] []/= x [[|n]//= _] //;
do ?[by case: (bottom x)|by case: (bottom n)|by rewrite eq0 exp0n].
Qed.
Canonical
expn_snum : forall [xnz nnz : KnownSign.nullity] [xr nr : KnownSign.reality], {compare 0 & xnz & xr} -> {compare 0 & nnz & nr} -> {compare 0 & exprn_nonzero_subdef xnz nnz xr nr & exprn_reality_subdef xnz nnz xr nr} expn_snum is not universe polymorphic Arguments expn_snum [xnz nnz]%_snum_nullity_scope [xr nr]%_snum_sign_scope x n expn_snum is transparent Expands to: Constant mathcomp.reals.signed.expn_snum Declared in library mathcomp.reals.signed, line 1003, characters 10-19
(x : {compare 0 & xnz & xr}) (n : {compare 0 & nnz & nr}) :=
Signed.mk (expn_snum_subproof x n).
Lemma minn_snum_subproof (xnz ynz : nullity) (xr yr : reality)
(x : {compare 0 & xnz & xr}) (y : {compare 0 & ynz & yr})
(rnz := min_nonzero_subdef xnz ynz xr yr)
(rrl := min_reality_subdef xnz ynz xr yr) :
Signed.spec 0 rnz rrl (min x%:num y%:num).
Proof.
by move: xr yr xnz ynz x y => [[[]|]|] [[[]|]|] [] []//= [[|x]//= _] [[|y]].
Qed.
Canonical
minn_snum : forall [xnz ynz : KnownSign.nullity] [xr yr : KnownSign.reality], {compare 0 & xnz & xr} -> {compare 0 & ynz & yr} -> {compare 0 & min_nonzero_subdef xnz ynz xr yr & min_reality_subdef xnz ynz xr yr} minn_snum is not universe polymorphic Arguments minn_snum [xnz ynz]%_snum_nullity_scope [xr yr]%_snum_sign_scope x y minn_snum is transparent Expands to: Constant mathcomp.reals.signed.minn_snum Declared in library mathcomp.reals.signed, line 1017, characters 10-19
(x : {compare 0 & xnz & xr}) (y : {compare 0 & ynz & yr}) :=
Signed.mk (minn_snum_subproof x y).
Lemma maxn_snum_subproof (xnz ynz : nullity) (xr yr : reality)
(x : {compare 0 & xnz & xr}) (y : {compare 0 & ynz & yr})
(rnz := max_nonzero_subdef xnz ynz xr yr)
(rrl := max_reality_subdef xnz ynz xr yr) :
Signed.spec 0 rnz rrl (maxn x%:num y%:num).
Proof.
Canonical
maxn_snum : forall [xnz ynz : KnownSign.nullity] [xr yr : KnownSign.reality], {compare 0 & xnz & xr} -> {compare 0 & ynz & yr} -> {compare 0 & max_nonzero_subdef xnz ynz xr yr & max_reality_subdef xnz ynz xr yr} maxn_snum is not universe polymorphic Arguments maxn_snum [xnz ynz]%_snum_nullity_scope [xr yr]%_snum_sign_scope x y maxn_snum is transparent Expands to: Constant mathcomp.reals.signed.maxn_snum Declared in library mathcomp.reals.signed, line 1032, characters 10-19
(x : {compare 0 & xnz & xr}) (y : {compare 0 & ynz & yr}) :=
Signed.mk (maxn_snum_subproof x y).
End NatStability.
Section IntStability.
Lemma Posz_snum_subproof (xnz : nullity) (xr : reality)
(x : {compare 0%N & xnz & xr}) :
Signed.spec 0%Z xnz xr (Posz x%:num).
Proof.
Canonical
Posz_snum : forall [xnz : KnownSign.nullity] [xr : KnownSign.reality], {compare 0 & xnz & xr} -> {compare 0%Z & xnz & xr} Posz_snum is not universe polymorphic Arguments Posz_snum [xnz]%_snum_nullity_scope [xr]%_snum_sign_scope x Posz_snum is transparent Expands to: Constant mathcomp.reals.signed.Posz_snum Declared in library mathcomp.reals.signed, line 1047, characters 10-19
(x : {compare 0%N & xnz & xr}) :=
Signed.mk (Posz_snum_subproof x).
Lemma Negz_snum_subproof (n : nat) : Signed.spec 0%Z !=0 <=0 (Negz n).
Proof.
Canonical
Negz_snum : nat -> {compare 0%Z & !=0 & <=0} Negz_snum is not universe polymorphic Arguments Negz_snum n%_nat_scope Negz_snum is transparent Expands to: Constant mathcomp.reals.signed.Negz_snum Declared in library mathcomp.reals.signed, line 1054, characters 10-19
End IntStability.
Section Morph0.
Context {R : numDomainType} {cond : reality}.
Local Notation nR := {num R & ?=0 & cond}.
Implicit Types x y : nR.
Local Notation num := (@num _ _ (0 : R) ?=0 cond).
Lemma num_eq0 x : (x%:num == 0) = (x == (widen_signed 0%:sgn : nR)).
Proof.
End Morph0.
Section Morph.
Context {d : Order.disp_t} {T : porderType d}.
Context {x0 : T} {nz : nullity} {cond : reality}.
Local Notation sT := {compare x0 & nz & cond}.
Implicit Types x y : sT.
Local Notation num := (@num _ _ x0 nz cond).
Lemma num_eq : {mono num : x y / x == y}
Proof.
Proof.
Proof.
Lemma num_max : {morph num : x y / Order.max x y}.
End Morph.
Section MorphNum.
Context {R : numDomainType} {nz : nullity} {cond : reality}.
Local Notation nR := {num R & nz & cond}.
Implicit Types (a : R) (x y : nR).
Local Notation num := (@num _ _ (0 : R) nz cond).
Lemma num_abs_eq0 a : (`|a|%:nng == 0%:nng) = (a == 0).
Proof.
End MorphNum.
Section MorphReal.
Context {R : numDomainType} {nz : nullity} {r : real}.
Local Notation nR := {num R & nz & r}.
Implicit Type x y : nR.
Local Notation num := (@num _ _ (0 : R) nz r).
Lemma num_le_max a x y :
a <= Num.max x%:num y%:num = (a <= x%:num) || (a <= y%:num).
Proof.
Lemma num_ge_max a x y :
Num.max x%:num y%:num <= a = (x%:num <= a) && (y%:num <= a).
Proof.
Lemma num_le_min a x y :
a <= Num.min x%:num y%:num = (a <= x%:num) && (a <= y%:num).
Proof.
Lemma num_ge_min a x y :
Num.min x%:num y%:num <= a = (x%:num <= a) || (y%:num <= a).
Proof.
Lemma num_lt_max a x y :
a < Num.max x%:num y%:num = (a < x%:num) || (a < y%:num).
Proof.
Lemma num_gt_max a x y :
Num.max x%:num y%:num < a = (x%:num < a) && (y%:num < a).
Proof.
Lemma num_lt_min a x y :
a < Num.min x%:num y%:num = (a < x%:num) && (a < y%:num).
Proof.
Lemma num_gt_min a x y :
Num.min x%:num y%:num < a = (x%:num < a) || (y%:num < a).
Proof.
End MorphReal.
Section MorphGe0.
Context {R : numDomainType} {nz : nullity}.
Local Notation nR := {num R & ?=0 & >=0}.
Implicit Type x y : nR.
Local Notation num := (@num _ _ (0 : R) ?=0 >=0).
Lemma num_abs_le a x : 0 <= a -> (`|a|%:nng <= x) = (a <= x%:num).
Lemma num_abs_lt a x : 0 <= a -> (`|a|%:nng < x) = (a < x%:num).
End MorphGe0.
Section Posnum.
Context (R : numDomainType) (x : R) (x_gt0 : 0 < x).
Lemma posnum_subdef : (x != 0) && (0 <= x)
Proof.
PosNum : forall [R : numDomainType] [x : R], (0 < x)%R -> {posnum R}%R PosNum is not universe polymorphic Arguments PosNum [R] [x]%_ring_scope x_gt0 PosNum is transparent Expands to: Constant mathcomp.reals.signed.PosNum Declared in library mathcomp.reals.signed, line 1153, characters 11-17
End Posnum.
Definition
NngNum : forall [R : numDomainType] [x : R], (0 <= x)%R -> {nonneg R}%R NngNum is not universe polymorphic Arguments NngNum [R] [x]%_ring_scope x_ge0 NngNum is transparent Expands to: Constant mathcomp.reals.signed.NngNum Declared in library mathcomp.reals.signed, line 1155, characters 11-17
(@Signed.mk _ _ 0 ?=0 >=0 x x_ge0).
CoInductive posnum_spec (R : numDomainType) (x : R) :
R -> bool -> bool -> bool -> Type :=
| IsPosnum (p : {posnum R}) : posnum_spec x (p%:num) false true true.
Lemma posnumP (R : numDomainType) (x : R) : 0 < x ->
posnum_spec x x (x == 0) (0 <= x) (0 < x).
Proof.
by rewrite -[x]/(PosNum x_gt0)%:num; constructor.
Qed.
CoInductive nonneg_spec (R : numDomainType) (x : R) : R -> bool -> Type :=
| IsNonneg (p : {nonneg R}) : nonneg_spec x (p%:num) true.
Lemma nonnegP (R : numDomainType) (x : R) : 0 <= x -> nonneg_spec x x (0 <= x).
Variable R : numDomainType.
Implicit Types r : R.
Lemma onem_PosNum r (r1 : r < 1) : r.~ = (PosNum (onem_gt0 r1))%:num.
Proof.
Lemma onemX_NngNum r (r1 : r <= 1) (r0 : 0 <= r) n :
(r ^+ n).~ = (NngNum (onemX_ge0 n r0 r1))%:num.
Proof.
Lemma onem_nonneg_proof (p : {nonneg R}) : p%:num <= 1 -> 0 <= (p%:num).~.
Definition
onem_nonneg : forall [R : numDomainType] [p : {nonneg R}%R], (p%:num <= 1)%R -> {nonneg R}%R onem_nonneg is not universe polymorphic Arguments onem_nonneg [R p] p1 onem_nonneg is transparent Expands to: Constant mathcomp.reals.signed.onem_nonneg Declared in library mathcomp.reals.signed, line 1219, characters 11-22
NngNum (onem_nonneg_proof p1).
End onem_signed.