Top source

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.").

# Positive, non-negative numbers, etc. This file develops tools to make the manipulation of numbers with a known sign easier, thanks to canonical structures. This adds types like {posnum R} for positive values in R, a notation e%:pos that infers the positivity of expression e according to existing canonical instances and %:num to cast back from type {posnum R} to R. For instance, given x, y : {posnum R}, we have ((x%:num + y%:num) / 2)%:pos : {posnum R} automatically inferred. ## Types for values with known sign ``` {posnum R} == interface type for elements in R that are positive; R must have a zmodType structure. Allows to solve automatically goals of the form x > 0 if x is canonically a {posnum R}. {posnum R} is canonically stable by common operations. All positive natural numbers ((n.+1)%:R) are also canonically in {posnum R} {nonneg R} == interface types for elements in R that are non-negative; R must have a zmodType structure. Automatically solves goals of the form x >= 0. {nonneg R} is stable by common operations. All natural numbers n%:R are also canonically in {nonneg R}. {compare x0 & nz & cond} == more generic type of values comparing to x0 : T according to nz and cond (see below). T must have a porderType structure. This type is shown to be a porderType. It is also an orderTpe, as soon as T is a numDomainType. {num R & nz & cond} == {compare 0%R : R & nz & cond}. T must have a zmodType structure. {= x0} == {compare x0 & ?=0 & =0} {= x0 : T} == same with an explicit type T {> x0} == {compare x0 & !=0 & >=0} {> x0 : T} == same with an explicit type T {< x0} == {compare x0 & !=0 & <=0} {< x0 : T} == same with an explicit type T {>= x0} == {compare x0 & ?=0 & >=0} {>= x0 : T} == same with an explicit type T {<= x0} == {compare x0 & ?=0 & <=0} {<= x0 : T} == same with an explicit type T {>=< x0} == {compare x0 & ?=0 & >=<0} {>=< x0 : T} == same with an explicit type T {>< x0} == {compare x0 & !=0 & >=<0} {>< x0 : T} == same with an explicit type T {!= x0} == {compare x0 & !=0 & >?<0} {!= x0 : T} == same with an explicit type T {?= x0} == {compare x0 & ?=0 & >?<0} {?= x0 : T} == same with an explicit type T ``` ## Casts from/to values with known sign ``` x%:pos == explicitly casts x to {posnum R}, triggers the inference of a {posnum R} structure for x. x%:nng == explicitly casts x to {nonneg R}, triggers the inference of a {nonneg R} structure for x. x%:sgn == explicitly casts x to the most precise known {compare x0 & nz & cond} according to existing canonical instances. x%:num == explicit cast from {compare x0 & nz & cond} to R. In particular this works from {posnum R} and {nonneg R} to R. x%:posnum == explicit cast from {posnum R} to R. x%:nngnum == explicit cast from {nonneg R} to R. ``` ## Nullity conditions nz All nz above can be the following (in scope snum_nullity_scope delimited by %snum_nullity) ``` !=0 == to encode x != 0 ?=0 == unknown nullity ``` ## Reality conditions cond All cond above can be the following (in scope snum_sign_scope delimited by by %snum_sign) ``` =0 == to encode x == 0 >=0 == to encode x >= 0 <=0 == to encode x <= 0 >=<0 == to encode x >=< 0 >?<0 == unknown reality ``` ## Sign proofs ``` [sgn of x] == proof that x is of sign inferred by x%:sgn [gt0 of x] == proof that x > 0 [lt0 of x] == proof that x < 0 [ge0 of x] == proof that x >= 0 [le0 of x] == proof that x <= 0 [cmp0 of x] == proof that 0 >=< x [neq0 of x] == proof that x != 0 ``` ## Constructors ``` PosNum xgt0 == builds a {posnum R} from a proof xgt0 : x > 0 where x : R NngNum xge0 == builds a {posnum R} from a proof xgt0 : x >= 0 where x : R Signed.mk p == builds a {compare x0 & nz & cond} from a proof p that some x satisfies sign conditions encoded by nz and cond ``` ## Misc. ``` !! x == triggers pretyping to fill the holes of the term x. The main use case is to trigger typeclass inference in the body of a ssreflect have := !! body. Credits: Enrico Tassi. ``` A number of canonical instances are provided for common operations, if your favorite operator is missing, look below for examples on how to add the appropriate Canonical. Canonical instances are also provided according to types, as a fallback when no known operator appears in the expression. Look to nat_snum below for an example on how to add your favorite type.

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 := (ltac:(refine x)) (only parsing).
Class ( : Prop) := : P.
#[global] Hint Mode infer ! : typeclass_instances.
#[global] Hint Extern 0 (infer _) => (exact) : typeclass_instances.
Lemma ( : Prop) : P -> infer P
Proof.
by []. Qed.

Module Import
KnownSign
Source code
.
Variant := |
MaybeZero
Source code
.
Coercion
nullity_bool
Source code
:= if nz is NonZero then true else false.
Definition
nz_of_bool
Source code
:= if b then NonZero else MaybeZero.

Variant := | | .
Variant := of sign | .
Variant := of real |
Arbitrary
Source code
.

Definition
wider_nullity
Source code
:=
  match xnz, ynz with
  | MaybeZero, _
  | NonZero, NonZero => true
  | NonZero, MaybeZero => false
  end.
Definition
wider_sign
Source code
:=
  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
wider_real
Source code
:=
  match xr, yr with
  | AnySign, _ => true
  | Sign sx, Sign sy => wider_sign sx sy
  | Sign _, AnySign => false
  end.
Definition
wider_reality
Source code
:=
  match xr, yr with
  | Arbitrary, _ => true
  | Real xr, Real yr => wider_real xr yr
  | Real _, Arbitrary => false
  end.
End KnownSign.

Module .
Section Signed.
Context ( : Order.disp_t) ( : porderType disp) ( : T).

Local Coercion := if r is Real _ then true else false.
Definition
reality_cond

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


Source code
( : reality) ( : T) :=
  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 ( : nullity) ( : reality) := Def {
   :> T;
  #[canonical=no]
   : (nz ==> (r != x0)) && reality_cond cond r
}.

End Signed.

Notation x0 nz cond x :=
  ((nullity_bool nz%snum_nullity ==> (x != x0))
   && (reality_cond x0 cond%snum_sign x)).

Record := Typ {
   : porderType d;
  #[canonical=no]
   : sort;
  #[canonical=no]
   : forall : sort, spec sort_x0 nz cond x
}.

Definition
mk

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


Source code
{ } : @def d T x0 nz cond :=
  @Def d T x0 nz cond r P.

Definition
from

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


Source code
{ }
  { : @def d T x0 nz cond} ( : phantom T x) := x.

Definition
fromP

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


Source code
{ }
  { : @def d T x0 nz cond} ( : phantom T x) := P x.

Module .
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 := EqZero : snum_sign_scope.
Notation := NonNeg : snum_sign_scope.
Notation := NonPos : snum_sign_scope.
Notation := AnySign : snum_sign_scope.
Notation := Arbitrary : snum_sign_scope.
Notation := NonZero : snum_nullity_scope.
Notation := MaybeZero : snum_nullity_scope.
Notation
"{ 'compare' x0 & nz & cond }"
Source code
:= (def x0 nz cond) : type_scope.
Notation
"{ 'num' R & nz & cond }"
Source code
:= (def (0%R : R) nz cond) : ring_scope.
Notation
"{ = x0 : T }"
Source code
:= (def (x0 : T) MaybeZero EqZero) : type_scope.
Notation
"{ > x0 : T }"
Source code
:= (def (x0 : T) NonZero NonNeg) : type_scope.
Notation
"{ < x0 : T }"
Source code
:= (def (x0 : T) NonZero NonPos) : type_scope.
Notation
"{ >= x0 : T }"
Source code
:= (def (x0 : T) MaybeZero NonNeg) : type_scope.
Notation
"{ <= x0 : T }"
Source code
:= (def (x0 : T) MaybeZero NonPos) : type_scope.
Notation
"{ >< x0 : T }"
Source code
:= (def (x0 : T) NonZero Real) : type_scope.
Notation
"{ >=< x0 : T }"
Source code
:= (def (x0 : T) MaybeZero Real) : type_scope.
Notation
"{ != x0 : T }"
Source code
:= (def (x0 : T) NonZero Arbitrary) : type_scope.
Notation
"{ ?= x0 : T }"
Source code
:= (def (x0 : T) MaybeZero Arbitrary) : type_scope.
Notation
"{ = x0 }"
Source code
:= (def x0 MaybeZero EqZero) : type_scope.
Notation
"{ > x0 }"
Source code
:= (def x0 NonZero NonNeg) : type_scope.
Notation
"{ < x0 }"
Source code
:= (def x0 NonZero NonPos) : type_scope.
Notation
"{ >= x0 }"
Source code
:= (def x0 MaybeZero NonNeg) : type_scope.
Notation
"{ <= x0 }"
Source code
:= (def x0 MaybeZero NonPos) : type_scope.
Notation
"{ >< x0 }"
Source code
:= (def x0 NonZero Real) : type_scope.
Notation
"{ >=< x0 }"
Source code
:= (def x0 MaybeZero Real) : type_scope.
Notation
"{ != x0 }"
Source code
:= (def x0 NonZero Arbitrary) : type_scope.
Notation
"{ ?= x0 }"
Source code
:= (def x0 MaybeZero Arbitrary) : type_scope.
Notation
"x %:sgn"
Source code
:= (from (Phantom _ x)) : ring_scope.
Notation
"[ 'sgn' 'of' x ]"
Source code
:= (fromP (Phantom _ x)) : ring_scope.
Notation := r.
Notation
"x %:num"
Source code
:= (r x) : ring_scope.
Definition
posnum

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


Source code
( : numDomainType) & phant R := {> 0%R : R}.
Notation
"{ 'posnum' R }"
Source code
:= (@posnum _ (Phant R)) : ring_scope.
Notation
"x %:posnum"
Source code
:= (@num _ _ 0%R !=0 >=0 x) : ring_scope.
Definition
nonneg

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


Source code
( : numDomainType) & phant R := {>= 0%R : R}.
Notation
"{ 'nonneg' R }"
Source code
:= (@nonneg _ (Phant R)) : ring_scope.
Notation
"x %:nngnum"
Source code
:= (@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 ( : Order.disp_t) ( : porderType d).
Variables ( : T) ( : nullity) ( : reality).
Local Notation := {compare x0 & nz & cond}.
.
instance
Source code
Definition
Source code
for @Signed.r d T x0 nz cond].
.
instance
Source code
Definition
Source code
.POrder d sT := [POrder of sT by <:].
End POrder.

Lemma
top_typ_subproof
Source code
( : porderType d) ( : T) :
  Signed.spec x0 ?=0 >?<0 x.
Proof.
by []. Qed.

Canonical
top_typ

Signed.reality_cond : forall [disp : 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


Source code
( : porderType d) ( : T) :=
  Signed.Typ (top_typ_subproof x0).

Lemma
real_domain_typ_subproof
Source code
( : realDomainType) ( : R) :
  Signed.spec 0%R ?=0 >=<0 x.
Proof.
by rewrite /= -realE num_real. Qed.

Canonical
real_domain_typ

Signed.mk : forall {d : 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


Source code
( : realDomainType) :=
  Signed.Typ (@real_domain_typ_subproof R).

Lemma
real_field_typ_subproof
Source code
( : realFieldType) ( : R) :
  Signed.spec 0%R ?=0 >=<0 x.
Proof.

Canonical
real_field_typ

Signed.from : forall {d : 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


Source code
( : realFieldType) :=
  Signed.Typ (@real_field_typ_subproof R).

Lemma
nat_typ_subproof
Source code
( : nat) : Signed.spec 0%N ?=0 >=0 x.
Proof.
by []. Qed.

Canonical
nat_typ

Signed.fromP : forall {d : 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


Source code
:= Signed.Typ nat_typ_subproof.

Lemma
typ_snum_subproof
Source code
( : Signed.typ d nz cond)
    ( : Signed.sort xt) :
  Signed.spec (Signed.sort_x0 xt) nz cond x.
Proof.
by move: xt x => []. Qed.

This adds _ <- Signed.r ( typ_snum ) to canonical projections (c.f., Print Canonical Projections Signed.r) meaning that if no other canonical instance (with a registered head symbol) is found, a canonical instance of Signed.typ, like the ones above, will be looked for.
Canonical
typ_snum

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


Source code
( : Signed.typ d nz cond) ( : Signed.sort xt) :=
  Signed.mk (typ_snum_subproof x).





Class {} ( : T) := : f x y = true.
#[global] Hint Mode unify - - - + : typeclass_instances.
Class {} ( : T) := : f x y = true.
#[global] Instance {} ( : T) : unify' f x y -> unify f x y := id.
#[global]
Hint Extern 0 (unify' _ _ _) => vm_compute; reflexivity : typeclass_instances.

Notation
unify_nz
Source code
nzx nzy :=
  (unify wider_nullity nzx%snum_nullity nzy%snum_nullity).
Notation rx ry :=
  (unify wider_reality rx%snum_sign ry%snum_sign).

#[global] Instance
anysign_wider_real
Source code
: unify_r (Real AnySign) (Real sign).
Proof.
by []. Qed.

#[global] Instance
any_reality_wider_eq0
Source code
: unify_r cond =0.
Proof.
by case: cond => [[[]|]|]. Qed.

Section Theory.
Context { : Order.disp_t} { : porderType d} { : T}.
Context { : nullity} { : reality}.
Local Notation := {compare x0 & nz & cond}.
Implicit Type x : sT.

Lemma
signed_intro
Source code
{} : x%:num = x%:num :> T
Proof.
by []. Qed.

Lemma : unify_nz !=0 nz -> unify_r =0 cond -> False.
Proof.
by move: x => [x /= /andP[]]; move: cond nz => [[[]|]|] [] //= /[swap] ->.
Qed.

Lemma : unify_nz !=0 nz -> unify_r >=0 cond -> x0 < x%:num :> T.
Proof.
move: x => [x /= /andP[]].
by move: cond nz => [[[]|]|] [] //=; rewrite lt_def => -> // /eqP -> /=.
Qed.

Lemma : unify_nz !=0 nz -> unify_r >=0 cond -> x%:num <= x0 :> T = false.
Proof.
by move=> ? ?; rewrite lt_geF//; apply: gt0. Qed.

Lemma : unify_nz !=0 nz -> unify_r <=0 cond -> x%:num < x0 :> T.
Proof.
move: x => [x /= /andP[]].
move: cond nz => [[[]|]|] [] //=; rewrite lt_def [x0 == _]eq_sym => -> //.
by move=> /eqP -> /=.
Qed.

Lemma : unify_nz !=0 nz -> unify_r <=0 cond -> x0 <= x%:num :> T = false.
Proof.
by move=> ? ?; rewrite lt_geF//; apply: lt0. Qed.

Lemma : unify_r >=0 cond -> x0 <= x%:num :> T.
Proof.
by case: x => [x /= /andP[]]; move: cond nz => [[[]|]|] [] //= _ /eqP ->.
Qed.

Lemma : unify_r >=0 cond -> x%:num < x0 :> T = false.
Proof.
by move=> ?; rewrite le_gtF//; apply: ge0. Qed.

Lemma : unify_r <=0 cond -> x0 >= x%:num :> T.
Proof.
by case: x => [x /= /andP[]]; move: cond nz => [[[]|]|] [] //= _ /eqP ->.
Qed.

Lemma : unify_r <=0 cond -> x0 < x%:num :> T = false.
Proof.
by move=> ?; rewrite le_gtF//; apply: le0. Qed.

Lemma : unify_r (Real AnySign) cond -> (x0 >=< x%:num).
Proof.
case: x => [x /= /andP[]].
by move: cond nz => [[[]|]|] [] //= _;
  do ?[by move=> /eqP ->; rewrite comparablexx];
  move=> sx; rewrite /Order.comparable sx// orbT.
Qed.

Lemma : unify_nz !=0 nz -> x%:num != x0 :> T.
Proof.
by case: x => [x /= /andP[]]; move: cond nz => [[[]|]|] []. Qed.

Lemma : unify_nz !=0 nz -> x%:num == x0 :> T = false.
Proof.
by move=> /neq0-/(_ x)/negPf->. Qed.

Lemma : unify_r =0 cond -> x%:num = x0.
Proof.
by case: x => [x /= /andP[_]]; move: cond nz => [[[]|]|] [] //= /eqP ->.
Qed.

Lemma
widen_signed_subproof
Source code
:
  unify_nz nz' nz -> unify_r cond' cond ->
  Signed.spec x0 nz' cond' x%:num.
Proof.
case: x => [x /= /andP[]].
by case: cond nz cond' nz' => [[[]|]|] [] [[[]|]|] [] //= nz'' cond'';
   rewrite ?nz'' ?cond'' ?orbT //; move: cond'' nz'' => /eqP ->; rewrite lexx.
Qed.

Definition
widen_signed

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


Source code

    ( : unify_nz nz' nz) ( : unify_r cond' cond) :=
  Signed.mk (widen_signed_subproof x unz ucond).

Lemma
widen_signedE
Source code
( : unify_nz nz nz) ( : unify_r cond cond) :
  @widen_signed x nz cond unz ucond = x.
Proof.
exact/val_inj. Qed.

Lemma ( : sT) ( : unify_nz !=0 nz) ( : unify_r >=0 cond) :
  (widen_signed x%:num%:sgn unz ucond)%:num = x%:num.
Proof.
by []. Qed.

Lemma ( : sT) ( : unify_nz ?=0 nz) ( : unify_r >=0 cond) :
  (widen_signed x%:num%:sgn unz ucond)%:num = x%:num.
Proof.
by []. Qed.

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 ]"
Source code
:= (ltac:(refine (gt0 x%:sgn))).
Notation
"[ 'lt0' 'of' x ]"
Source code
:= (ltac:(refine (lt0 x%:sgn))).
Notation
"[ 'ge0' 'of' x ]"
Source code
:= (ltac:(refine (ge0 x%:sgn))).
Notation
"[ 'le0' 'of' x ]"
Source code
:= (ltac:(refine (le0 x%:sgn))).
Notation
"[ 'cmp0' 'of' x ]"
Source code
:= (ltac:(refine (cmp0 x%:sgn))).
Notation
"[ 'neq0' 'of' x ]"
Source code
:= (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"
Source code
:= (widen_signed x%:sgn : {posnum _}) (only parsing)
  : ring_scope.
Notation
"x %:nng"
Source code
:= (widen_signed x%:sgn : {nonneg _}) (only parsing)
  : ring_scope.
Notation
"x %:pos"
Source code
:= (@widen_signed _ _ _ _ _
    (@Signed.from _ _ _ _ _ _ (Phantom _ x)) !=0 (Real (Sign >=0)) _ _)
  (only printing) : ring_scope.
Notation
"x %:nng"
Source code
:= (@widen_signed _ _ _ _ _
    (@Signed.from _ _ _ _ _ _ (Phantom _ x)) ?=0 (Real (Sign >=0)) _ _)
  (only printing) : ring_scope.

Local Open Scope ring_scope.

Section Order.
Variables ( : numDomainType) ( : nullity) ( : real).
Local Notation := {num R & nz & r}.

Lemma
signed_le_total
Source code
: total (<=%O : rel nR).
Proof.
by move=> x y; apply: real_comparable => /=. Qed.

.
instance
Source code
Definition
Source code
.POrder_isTotal.Build ring_display nR
  signed_le_total.

End Order.

Section POrderStability.
Context { : Order.disp_t} { : porderType disp} { : T}.

Definition
min_nonzero_subdef

top_typ : forall [d : 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


Source code
( : nullity) ( : reality) :=
  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

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


Source code
( : nullity) ( : reality) : reality :=
  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
Source code
( : nullity) ( : reality)
    ( : {compare x0 & xnz & xr}) ( : {compare x0 & ynz & yr})
    ( := min_nonzero_subdef xnz ynz xr yr)
    ( := min_reality_subdef xnz ynz xr yr) :
  Signed.spec x0 rnz rrl (Order.min x%:num y%:num).
Proof.
rewrite {}/rnz {}/rrl; apply/andP; split.
  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

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


Source code
( : nullity) ( : reality)
    ( : {compare x0 & xnz & xr}) ( : {compare x0 & ynz & yr}) :=
  Signed.mk (min_snum_subproof x y).

Definition
max_nonzero_subdef

nat_typ : Signed.typ 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


Source code
( : nullity) ( : reality) :=
  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

typ_snum : forall [d : 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


Source code
( : nullity) ( : reality) : reality :=
  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
Source code
( : nullity) ( : reality)
    ( : {compare x0 & xnz & xr}) ( : {compare x0 & ynz & yr})
    ( := max_nonzero_subdef xnz ynz xr yr)
    ( := max_reality_subdef xnz ynz xr yr) :
  Signed.spec x0 rnz rrl (Order.max x%:num y%:num).
Proof.
rewrite {}/rnz {}/rrl; apply/andP; split.
  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

widen_signed : forall {d : 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


Source code
( : nullity) ( : reality)
    ( : {compare x0 & xnz & xr}) ( : {compare x0 & ynz & yr}) :=
  Signed.mk (max_snum_subproof x y).

End POrderStability.

Section NumDomainStability.
Context { : numDomainType}.

Lemma
zero_snum_subproof
Source code
: Signed.spec 0 ?=0 =0 (0 : R).
Proof.
exact: eqxx. Qed.

Canonical
zero_snum

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


Source code
:= Signed.mk zero_snum_subproof.

Lemma
one_snum_subproof
Source code
: Signed.spec 0 !=0 >=0 (1 : R).
Proof.
by rewrite /= oner_eq0 ler01. Qed.

Canonical
one_snum

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


Source code
:= Signed.mk one_snum_subproof.

Definition
opp_reality_subdef

min_snum : forall {disp : 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


Source code
( : nullity) ( : reality) : reality :=
  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
Source code
( : nullity) ( : reality)
    ( : {num R & xnz & xr}) ( := opp_reality_subdef xnz xr) :
  Signed.spec 0 xnz r (- x%:num).
Proof.
by rewrite {}/r; case: xr x => [[[]|]|]//= [r]/=;
   rewrite oppr_eq0 ?(oppr_ge0, oppr_le0)// orbC.
Qed.

Canonical
opp_snum

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


Source code
( : nullity) ( : reality) ( : {num R & xnz & xr}) :=
  Signed.mk (opp_snum_subproof x).

Definition
add_samesign_subdef

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


Source code
( : nullity) ( : reality) :=
  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

max_snum : forall {disp : 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


Source code
( : nullity) ( : reality) :=
  nz_of_bool (add_samesign_subdef xnz ynz xr yr && (xnz || ynz)).
Arguments add_nonzero_subdef /.

Definition
add_reality_subdef

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


Source code
( : nullity) ( : reality) : reality :=
  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
Source code
( : nullity) ( : reality)
    ( : {num R & xnz & xr}) ( : {num R & ynz & yr})
    ( := add_nonzero_subdef xnz ynz xr yr)
    ( := add_reality_subdef xnz ynz xr yr) :
  Signed.spec 0 rnz rrl (x%:num + y%:num).
Proof.
rewrite {}/rnz {}/rrl; apply/andP; split.
  move: xr yr xnz ynz x y => [[[]|]|] [[[]|]|] [] []//= x y;
  by rewrite 1?addr_ss_eq0 ?(eq0F, ge0, le0, andbF, orbT).
have addr_le0 ( : 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

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


Source code
( : nullity) ( : reality)
    ( : {num R & xnz & xr}) ( : {num R & ynz & yr}) :=
  Signed.mk (add_snum_subproof x y).

Definition
mul_nonzero_subdef

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


Source code
( : nullity) ( : reality) :=
  nz_of_bool (xnz && ynz).
Arguments mul_nonzero_subdef /.

Definition
mul_reality_subdef

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


Source code
( : nullity) ( : reality) : reality :=
  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
Source code
( : nullity) ( : reality)
    ( : {num R & xnz & xr}) ( : {num R & ynz & yr})
    ( := mul_nonzero_subdef xnz ynz xr yr)
    ( := mul_reality_subdef xnz ynz xr yr) :
  Signed.spec 0 rnz rrl (x%:num * y%:num).
Proof.
rewrite {}/rnz {}/rrl; apply/andP; split.
  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

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


Source code
( : nullity) ( : reality)
    ( : {num R & xnz & xr}) ( : {num R & ynz & yr}) :=
  Signed.mk (mul_snum_subproof x y).

Lemma
natmul_snum_subproof
Source code
( : nullity) ( : reality)
    ( : {num R & xnz & xr}) ( : {compare 0%N & nnz & nr})
    ( := mul_nonzero_subdef xnz nnz xr nr)
    ( := mul_reality_subdef xnz nnz xr nr) :
  Signed.spec 0 rnz rrl (x%:num *+ n%:num).
Proof.
rewrite {}/rnz {}/rrl; apply/andP; split.
  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

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


Source code
( : nullity) ( : reality)
    ( : {num R & xnz & xr}) ( : {compare 0%N & nnz & nr}) :=
  Signed.mk (natmul_snum_subproof x n).

Lemma
intmul_snum_subproof
Source code
( : nullity) ( : reality)
    ( : {num R & xnz & xr}) ( : {num int & nnz & nr})
    ( := mul_nonzero_subdef xnz nnz xr nr)
    ( := mul_reality_subdef xnz nnz xr nr) :
  Signed.spec 0 rnz rrl (x%:num *~ n%:num).
Proof.
rewrite {}/rnz {}/rrl; apply/andP; split.
  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

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


Source code
( : nullity) ( : reality)
    ( : {num R & xnz & xr}) ( : {num int & nnz & nr}) :=
  Signed.mk (intmul_snum_subproof x n).

Lemma
inv_snum_subproof
Source code
( : nullity) ( : reality)
    ( : {num R & xnz & xr}) :
  Signed.spec 0 xnz xr (x%:num^-1 : R).
Proof.
by case: xr x => [[[]|]|]//= [r]/=;
   rewrite invr_eq0 ?(invr_ge0, invr_le0) ?realV.
Qed.

Canonical
inv_snum

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


Source code
( : nullity) ( : reality) ( : {num R & xnz & xr}) :=
  Signed.mk (inv_snum_subproof x).

Definition
exprn_nonzero_subdef

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


Source code
( : nullity)
    ( : reality) : nullity :=
  nz_of_bool (xnz || match nr with Real (Sign =0) => true | _ => false end).
Arguments exprn_nonzero_subdef /.

Definition
exprn_reality_subdef

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


Source code
( : nullity)
    ( : 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
Source code
( : nullity) ( : reality)
    ( : {num R & xnz & xr}) ( : {compare 0%N & nnz & nr})
    ( := exprn_nonzero_subdef xnz nnz xr nr)
    ( := exprn_reality_subdef xnz nnz xr nr) :
  Signed.spec 0 rnz rrl (x%:num ^+ n%:num).
Proof.
rewrite {}/rnz {}/rrl; apply/andP; split.
  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

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


Source code
( : nullity) ( : reality)
    ( : {num R & xnz & xr}) ( : {compare 0%N & nnz & nr}) :=
  Signed.mk (exprn_snum_subproof x n).

Lemma
norm_snum_subproof
Source code
{ : normedZmodType R} ( : V) :
  Signed.spec 0 ?=0 >=0 `|x|.
Proof.
by rewrite /=. Qed.

Canonical
norm_snum

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


Source code
{ : normedZmodType R} ( : V) :=
  Signed.mk (norm_snum_subproof x).

End NumDomainStability.

Section RcfStability.
Context { : rcfType}.

Definition
sqrt_nonzero_subdef

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


Source code
( : nullity) ( : reality) :=
  if xr is Real (Sign >=0) then xnz else MaybeZero.
Arguments sqrt_nonzero_subdef /.

Lemma
sqrt_snum_subproof
Source code
( : {num R & xnz & xr})
    ( := sqrt_nonzero_subdef xnz xr) :
  Signed.spec 0 nz >=0 (Num.sqrt x%:num).
Proof.
by rewrite {}/nz; case: xnz xr x => -[[[]|]|]//= x;
   rewrite /= sqrtr_ge0// andbT sqrtr_eq0 le0F.
Qed.

Canonical
sqrt_snum

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


Source code
( : {num R & xnz & xr}) :=
  Signed.mk (sqrt_snum_subproof x).

End RcfStability.

Section NumClosedStability.
Context { : numClosedFieldType}.

Definition
sqrtC_reality_subdef

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


Source code
( : nullity) ( : reality) : reality :=
  match xr with
  | Real (Sign =0) => =0
  | Real (Sign >=0) => >=0
  | _ => >?<0
  end.
Arguments sqrtC_reality_subdef /.

Lemma
sqrtC_snum_subproof
Source code
( : {num R & xnz & xr})
    ( := sqrtC_reality_subdef xnz xr) :
  Signed.spec 0 xnz r (sqrtC x%:num).
Proof.
rewrite {}/r; apply/andP; split.
  by rewrite sqrtC_eq0; case: xr xnz x => [[[]|]|] [] /=.
by case: xr xnz x => [[[]|]|] []//= x; rewrite ?sqrtC_ge0// sqrtC_eq0 eq0.
Qed.

Canonical
sqrtC_snum

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


Source code
( : {num R & xnz & xr}) :=
  Signed.mk (sqrtC_snum_subproof x).

End NumClosedStability.

Section NatStability.
Local Open Scope nat_scope.
Implicit Type (n : nat).

Lemma
zeron_snum_subproof
Source code
: Signed.spec 0 ?=0 =0 0.
Proof.
by []. Qed.

Canonical
zeron_snum

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


Source code
:= Signed.mk zeron_snum_subproof.

Lemma
succn_snum_subproof
Source code
: Signed.spec 0 !=0 >=0 n.+1.
Proof.
by []. Qed.

Canonical
succn_snum

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


Source code
:= Signed.mk (succn_snum_subproof n).

Lemma
double_snum_subproof
Source code
( : {compare 0 & nz & r}) :
  Signed.spec 0 nz r x%:num.*2.
Proof.
by move: nz r x => [] [[[]|]|] [[|n]]. Qed.

Canonical
double_snum

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


Source code
:=
  Signed.mk (@double_snum_subproof nz r x).

Lemma
addn_snum_subproof
Source code
( : nullity) ( : reality)
    ( : {compare 0 & xnz & xr}) ( : {compare 0 & ynz & yr})
    ( := add_nonzero_subdef xnz ynz xr yr)
    ( := add_reality_subdef xnz ynz xr yr) :
  Signed.spec 0 rnz rrl (x%:num + y%:num).
Proof.
rewrite {}/rnz {}/rrl; apply/andP; split;
by move: xr yr xnz ynz x y => [[[]|]|] [[[]|]|] [] []//= [[|x]//= _] [[|y]].
Qed.

Canonical
addn_snum

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


Source code
( : nullity) ( : reality)
    ( : {compare 0 & xnz & xr}) ( : {compare 0 & ynz & yr}) :=
  Signed.mk (addn_snum_subproof x y).

Lemma
muln_snum_subproof
Source code
( : nullity) ( : reality)
    ( : {compare 0 & xnz & xr}) ( : {compare 0 & ynz & yr})
    ( := mul_nonzero_subdef xnz ynz xr yr)
    ( := mul_reality_subdef xnz ynz xr yr) :
  Signed.spec 0 rnz rrl (x%:num * y%:num).
Proof.
rewrite {}/rnz {}/rrl; apply/andP; split;
move: xr yr xnz ynz x y => [[[]|]|] [[[]|]|] [] []//=;
by move=> [[|x]//= _] [[|y]//= _]; rewrite muln0.
Qed.

Canonical
muln_snum

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


Source code
( : nullity) ( : reality)
    ( : {compare 0 & xnz & xr}) ( : {compare 0 & ynz & yr}) :=
  Signed.mk (muln_snum_subproof x y).

Lemma
expn_snum_subproof
Source code
( : nullity) ( : reality)
    ( : {compare 0 & xnz & xr}) ( : {compare 0 & nnz & nr})
    ( := exprn_nonzero_subdef xnz nnz xr nr)
    ( := exprn_reality_subdef xnz nnz xr nr) :
  Signed.spec 0 rnz rrl (x%:num ^ n%:num).
Proof.
rewrite {}/rnz {}/rrl; apply/andP; split.
  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

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


Source code
( : nullity) ( : reality)
    ( : {compare 0 & xnz & xr}) ( : {compare 0 & nnz & nr}) :=
  Signed.mk (expn_snum_subproof x n).

Lemma
minn_snum_subproof
Source code
( : nullity) ( : reality)
    ( : {compare 0 & xnz & xr}) ( : {compare 0 & ynz & yr})
    ( := min_nonzero_subdef xnz ynz xr yr)
    ( := min_reality_subdef xnz ynz xr yr) :
  Signed.spec 0 rnz rrl (min x%:num y%:num).
Proof.
rewrite {}/rnz {}/rrl; apply/andP; split;
by move: xr yr xnz ynz x y => [[[]|]|] [[[]|]|] [] []//= [[|x]//= _] [[|y]].
Qed.

Canonical
minn_snum

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


Source code
( : nullity) ( : reality)
    ( : {compare 0 & xnz & xr}) ( : {compare 0 & ynz & yr}) :=
  Signed.mk (minn_snum_subproof x y).

Lemma
maxn_snum_subproof
Source code
( : nullity) ( : reality)
    ( : {compare 0 & xnz & xr}) ( : {compare 0 & ynz & yr})
    ( := max_nonzero_subdef xnz ynz xr yr)
    ( := max_reality_subdef xnz ynz xr yr) :
  Signed.spec 0 rnz rrl (maxn x%:num y%:num).
Proof.
rewrite {}/rnz {}/rrl; apply/andP; split;
move: xr yr xnz ynz x y => [[[]|]|] [[[]|]|] [] []//=;
by move=> [[|x]//= _] [[|y]//= _]; rewrite maxnSS.
Qed.

Canonical
maxn_snum

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


Source code
( : nullity) ( : reality)
    ( : {compare 0 & xnz & xr}) ( : {compare 0 & ynz & yr}) :=
  Signed.mk (maxn_snum_subproof x y).

End NatStability.

Section IntStability.

Lemma
Posz_snum_subproof
Source code
( : nullity) ( : reality)
    ( : {compare 0%N & xnz & xr}) :
  Signed.spec 0%Z xnz xr (Posz x%:num).
Proof.
by apply/andP; split; move: xr xnz x => [[[]|]|] []//=; move=> [[|x]//= _].
Qed.

Canonical
Posz_snum

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


Source code
( : nullity) ( : reality)
    ( : {compare 0%N & xnz & xr}) :=
  Signed.mk (Posz_snum_subproof x).

Lemma
Negz_snum_subproof
Source code
( : nat) : Signed.spec 0%Z !=0 <=0 (Negz n).
Proof.
by []. Qed.

Canonical
Negz_snum

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


Source code
:= Signed.mk (Negz_snum_subproof n).

End IntStability.

Section Morph0.
Context { : numDomainType} { : reality}.
Local Notation := {num R & ?=0 & cond}.
Implicit Types x y : nR.
Local Notation := (@num _ _ (0 : R) ?=0 cond).

Lemma : (x%:num == 0) = (x == (widen_signed 0%:sgn : nR)).
Proof.
by []. Qed.

End Morph0.

Section Morph.
Context { : Order.disp_t} { : porderType d}.
Context { : T} { : nullity} { : reality}.
Local Notation := {compare x0 & nz & cond}.
Implicit Types x y : sT.
Local Notation := (@num _ _ x0 nz cond).

Lemma : {mono num : / x == y}
Proof.
by []. Qed.
Lemma : {mono num : / (x <= y)%O}
Proof.
by []. Qed.
Lemma : {mono num : / (x < y)%O}
Proof.
by []. Qed.
Lemma : {morph num : / Order.min x y}.
Proof.
by move=> x y; rewrite !minEle num_le -fun_if. Qed.
Lemma : {morph num : / Order.max x y}.
Proof.
by move=> x y; rewrite !maxEle num_le -fun_if. Qed.

End Morph.

Section MorphNum.
Context { : numDomainType} { : nullity} { : reality}.
Local Notation := {num R & nz & cond}.
Implicit Types (a : R) (x y : nR).
Local Notation := (@num _ _ (0 : R) nz cond).

Lemma
num_abs_eq0
Source code
: (`|a|%:nng == 0%:nng) = (a == 0).
Proof.
by rewrite -normr_eq0. Qed.

End MorphNum.

Section MorphReal.
Context { : numDomainType} { : nullity} { : real}.
Local Notation := {num R & nz & r}.
Implicit Type x y : nR.
Local Notation := (@num _ _ (0 : R) nz r).

Lemma
num_le_max
Source code
:
  a <= Num.max x%:num y%:num = (a <= x%:num) || (a <= y%:num).
Proof.
by rewrite -comparable_le_max// real_comparable. Qed.

Lemma
num_ge_max
Source code
:
  Num.max x%:num y%:num <= a = (x%:num <= a) && (y%:num <= a).
Proof.
by rewrite -comparable_ge_max// real_comparable. Qed.

Lemma
num_le_min
Source code
:
  a <= Num.min x%:num y%:num = (a <= x%:num) && (a <= y%:num).
Proof.
by rewrite -comparable_le_min// real_comparable. Qed.

Lemma
num_ge_min
Source code
:
  Num.min x%:num y%:num <= a = (x%:num <= a) || (y%:num <= a).
Proof.
by rewrite -comparable_ge_min// real_comparable. Qed.

Lemma
num_lt_max
Source code
:
  a < Num.max x%:num y%:num = (a < x%:num) || (a < y%:num).
Proof.
by rewrite -comparable_lt_max// real_comparable. Qed.

Lemma
num_gt_max
Source code
:
  Num.max x%:num y%:num < a = (x%:num < a) && (y%:num < a).
Proof.
by rewrite -comparable_gt_max// real_comparable. Qed.

Lemma
num_lt_min
Source code
:
  a < Num.min x%:num y%:num = (a < x%:num) && (a < y%:num).
Proof.
by rewrite -comparable_lt_min// real_comparable. Qed.

Lemma
num_gt_min
Source code
:
  Num.min x%:num y%:num < a = (x%:num < a) || (y%:num < a).
Proof.
by rewrite -comparable_gt_min// real_comparable. Qed.

End MorphReal.

Section MorphGe0.
Context { : numDomainType} { : nullity}.
Local Notation := {num R & ?=0 & >=0}.
Implicit Type x y : nR.
Local Notation := (@num _ _ (0 : R) ?=0 >=0).

Lemma
num_abs_le
Source code
: 0 <= a -> (`|a|%:nng <= x) = (a <= x%:num).
Proof.
by move=> a0; rewrite -num_le//= ger0_norm. Qed.

Lemma
num_abs_lt
Source code
: 0 <= a -> (`|a|%:nng < x) = (a < x%:num).
Proof.
by move=> a0; rewrite -num_lt/= ger0_norm. Qed.
End MorphGe0.

Section Posnum.
Context ( : numDomainType) ( : R) ( : 0 < x).
Lemma
posnum_subdef
Source code
: (x != 0) && (0 <= x)
Proof.
by rewrite -lt_def. Qed.
Definition
PosNum

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


Source code
: {posnum R} := @Signed.mk _ _ 0 !=0 >=0 _ posnum_subdef.
End Posnum.
Definition
NngNum

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


Source code
( : numDomainType) ( : R) ( : 0 <= x) : {nonneg R} :=
  (@Signed.mk _ _ 0 ?=0 >=0 x x_ge0).

CoInductive
posnum_spec
Source code
( : numDomainType) ( : R) :
  R -> bool -> bool -> bool -> Type :=
|
IsPosnum
Source code
( : {posnum R}) : posnum_spec x (p%:num) false true true.

Lemma ( : numDomainType) ( : R) : 0 < x ->
  posnum_spec x x (x == 0) (0 <= x) (0 < x).
Proof.
move=> x_gt0; case: real_ltgt0P (x_gt0) => []; rewrite ?gtr0_real // => _ _.
by rewrite -[x]/(PosNum x_gt0)%:num; constructor.
Qed.

CoInductive
nonneg_spec
Source code
( : numDomainType) ( : R) : R -> bool -> Type :=
|
IsNonneg
Source code
( : {nonneg R}) : nonneg_spec x (p%:num) true.

Lemma ( : numDomainType) ( : R) : 0 <= x -> nonneg_spec x x (0 <= x).
Proof.
by move=> xge0; rewrite xge0 -[x]/(NngNum xge0)%:num; constructor. Qed.









These proofs help integrate more arithmetic with signed.v. The issue is Terms like `0 < 1-q` with subtraction don't work well. So we hide the subtractions behind `PosNum` and `NngNum` constructors, see sequences.v for examples.
Section onem_signed.
Variable : numDomainType.
Implicit Types r : R.

Lemma
onem_PosNum
Source code
( : r < 1) : r.~ = (PosNum (onem_gt0 r1))%:num.
Proof.
by []. Qed.

Lemma
onemX_NngNum
Source code
( : r <= 1) ( : 0 <= r) :
  (r ^+ n).~ = (NngNum (onemX_ge0 n r0 r1))%:num.
Proof.
by []. Qed.

Lemma
onem_nonneg_proof
Source code
( : {nonneg R}) : p%:num <= 1 -> 0 <= (p%:num).~.
Proof.
by rewrite /onem/= subr_ge0. Qed.

Definition
onem_nonneg

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


Source code
( : {nonneg R}) ( : p%:num <= 1) :=
  NngNum (onem_nonneg_proof p1).

End onem_signed.