FSucc.v



(****************************************************************************
                                                                             
          IEEE754  :  FSucc                                                     
                                                                             
          Laurent Thery                                                      
                                                                             
*****************************************************************************
*)

Require Import PolyList.
Require Import Float.
Require Import Fnorm.
Require Import Fop.
Require Import Fcomp.
Section suc.
Variable b:Fbound.
Variable radix:nat.
Variable precision:nat.

Local FtoRradix := (FtoR radix).
Coercion FtoRradix : float >-> R.
Hypothesis radixMoreThanOne:(lt (S O) radix).
Hypothesis precisionNotZero:~ precision=O.
Hypothesis pGivesBound:(vNum b)=(minus (exp radix precision) (1)).

Definition FSucc :=
   [x:
float]
      Cases (Z_eq_dec (Fnum x) (vNum b)) of
          (left _) => (Float (nNormMin radix precision) (Zs (Fexp x)))
         | (right _) =>
             Cases (Z_eq_dec (Fnum x) (Zopp (nNormMin radix precision))) of
                 (left _) => Cases (Z_eq_dec (Fexp x) (Zopp (dExp b))) of
                                 (left _) => (Float (Zs (Fnum x)) (Fexp x))
                                | (right _) =>
                                    (Float (Zopp (vNum b)) (Zpred (Fexp x)))
                             end
                | (right _) => (Float (Zs (Fnum x)) (Fexp x))
             end
      end.

Theorem FSuccSimpl1:
  (x:
float) (Fnum x)=(vNum b) ->
  (FSucc x)=(Float (nNormMin radix precision) (Zs (Fexp x))).

Theorem FSuccSimpl2:
  (x:
float)
  (Fnum x)=(Zopp (nNormMin radix precision)) -> ~ (Fexp x)=(Zopp (dExp b)) ->
  (FSucc x)=(Float (Zopp (vNum b)) (Zpred (Fexp x))).

Theorem FSuccSimpl3:
  (
FSucc (Float (Zopp (nNormMin radix precision)) (Zopp (dExp b))))=
  (Float (Zs (Zopp (nNormMin radix precision))) (Zopp (dExp b))).

Theorem FSuccSimpl4:
  (x:
float)
  ~ (Fnum x)=(vNum b) -> ~ (Fnum x)=(Zopp (nNormMin radix precision)) ->
  (FSucc x)=(Float (Zs (Fnum x)) (Fexp x)).

Theorem FSuccDiff1:
  (x:
float) ~ (Fnum x)=(Zopp (nNormMin radix precision)) ->
  <R> (Fminus radix (FSucc x) x)==(Float (1) (Fexp x)).

Theorem FSuccDiff2:
  (x:
float)
  (Fnum x)=(Zopp (nNormMin radix precision)) -> (Fexp x)=(Zopp (dExp b)) ->
  <R> (Fminus radix (FSucc x) x)==(Float (1) (Fexp x)).

Theorem FSuccDiff3:
  (x:
float)
  (Fnum x)=(Zopp (nNormMin radix precision)) -> ~ (Fexp x)=(Zopp (dExp b)) ->
  <R> (Fminus radix (FSucc x) x)==(Float (1) (Zpred (Fexp x))).

Theorem FSuccNormPos:
  (a:
float) (Rle R0 a) -> (Fnormal radix b precision a) ->
  (Fnormal radix b precision (FSucc a)).

Theorem FSuccSubnormNotNearNormMin:
  (a:
float)
  (Fsubnormal radix b precision a) ->
  ~ (Fnum a)=(pred (nNormMin radix precision)) ->
  (Fsubnormal radix b precision (FSucc a)).

Theorem FSuccSubnormNearNormMin:
  (a:
float)
  (Fsubnormal radix b precision a) ->
  (Fnum a)=(pred (nNormMin radix precision)) ->
  (Fnormal radix b precision (FSucc a)).

Theorem FBoundedSuc: (f:float) (Fbounded b f) ->(Fbounded b (FSucc f)).

Theorem FSuccSubnormal:
  (a:
float) (Fsubnormal radix b precision a) ->
  (Fcanonic radix b precision (FSucc a)).

Theorem FSuccPosNotMax:
  (a:
float) (Rle R0 a) -> (Fcanonic radix b precision a) ->
  (Fcanonic radix b precision (FSucc a)).

Theorem FSuccNormNegNotNormMin:
  (a:
float)
  (Rle a R0) ->
  (Fnormal radix b precision a) ->
  ~ a=(Float (Zopp (nNormMin radix precision)) (Zopp (dExp b))) ->
  (Fnormal radix b precision (FSucc a)).

Theorem FSuccNormNegNormMin:
  (
Fsubnormal
     radix b precision
     (FSucc (Float (Zopp (nNormMin radix precision)) (Zopp (dExp b))))).

Theorem FSuccNegCanonic:
  (a:
float) (Rle a R0) -> (Fcanonic radix b precision a) ->
  (Fcanonic radix b precision (FSucc a)).

Theorem FSuccCanonic:
  (a:
float) (Fcanonic radix b precision a) ->
  (Fcanonic radix b precision (FSucc a)).

Theorem FSuccLt: (a:float)(Rlt a (FSucc a)).

Theorem FSuccPropPos:
  (x, y:
float)
  (Rle R0 x) ->
  (Fcanonic radix b precision x) ->
  (Fcanonic radix b precision y) -> (Rlt x y) ->(Rle (FSucc x) y).

Theorem R0RltRleSucc: (x:float) (Rlt x R0) ->(Rle (FSucc x) R0).

Theorem FSuccPropNeg:
  (x, y:
float)
  (Rlt x R0) ->
  (Fcanonic radix b precision x) ->
  (Fcanonic radix b precision y) -> (Rlt x y) ->(Rle (FSucc x) y).

Theorem FSuccProp:
  (x, y:
float)
  (Fcanonic radix b precision x) ->
  (Fcanonic radix b precision y) -> (Rlt x y) ->(Rle (FSucc x) y).

Theorem FSuccZleEq:
  (p, q:
float) (Rle p q) -> (Rlt q (FSucc p)) -> (Zle (Fexp p) (Fexp q)) ->
  <R> p==q.

Definition FNSucc := [x:?](FSucc (Fnormalize radix b precision x)).

Theorem FNSuccCanonic:
  (a:
float) (Fbounded b a) ->(Fcanonic radix b precision (FNSucc a)).

Theorem FNSuccLt: (a:float)(Rlt a (FNSucc a)).

Theorem FNSuccProp:
  (x, y:
float) (Fbounded b x) -> (Fbounded b y) -> (Rlt x y) ->
  (Rle (FNSucc x) y).

Theorem FNSuccEq:
  (p, q:
float) (Fbounded b p) -> (Fbounded b q) -> <R> p==q ->
  (FNSucc p)=(FNSucc q).
End suc.
Section suc1.
Variable b:Fbound.
Variable radix:nat.
Variable precision:nat.

Local FtoRradix := (FtoR radix).
Coercion FtoRradix : float >-> R.
Hypothesis radixMoreThanOne:(lt (S O) radix).
Hypothesis precisionNotZero:(lt (S O) precision).
Hypothesis pGivesBound:(vNum b)=(minus (exp radix precision) (1)).

Theorem nNormMimLtvNum: (lt (nNormMin radix precision) (vNum b)).

Theorem FSucFSucMid:
  (p:
float)
  ~ (Fnum (FSucc b radix precision p))=(nNormMin radix precision) ->
  ~ (Fnum (FSucc b radix precision p))=(Zopp (nNormMin radix precision)) ->
  <R>
    (Fminus
       radix (FSucc b radix precision (FSucc b radix precision p))
       (FSucc b radix precision p))==
    (Fminus radix (FSucc b radix precision p) p).

Theorem FNSuccFNSuccMid:
  (p:
float)
  (Fbounded b p) ->
  ~ (Fnum (FNSucc b radix precision p))=(nNormMin radix precision) ->
  ~ (Fnum (FNSucc b radix precision p))=(Zopp (nNormMin radix precision)) ->
  <R>
    (Fminus
       radix (FNSucc b radix precision (FNSucc b radix precision p))
       (FNSucc b radix precision p))==
    (Fminus radix (FNSucc b radix precision p) p).
End suc1.
Hints Resolve nNormMimLtvNum :float.

30/05/01, 17:35