Finduct.v



(****************************************************************************
                                                                             
          IEEE754  :  Finduct                                                     
                                                                             
          Laurent Thery                                                      
                                                                             
*****************************************************************************
Define an induction principle on float*)

Require Import PolyList.
Require Import Float.
Require Import Fnorm.
Require Import Fop.
Require Import Fcomp.
Require Import FSucc.
Require Import FPred.
Section finduct.
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 Fweight :=
   [p:
float](Zplus (Fnum p) (Zmult (Fexp p) (exp radix precision))).

Theorem FweightLt:
  (p, q:
float)
  (Fcanonic radix b precision p) ->
  (Fcanonic radix b precision q) -> (Rle R0 p) -> (Rlt p q) ->
  (Zlt (Fweight p) (Fweight q)).

Theorem FweightEq:
  (p, q:
float)
  (Fcanonic radix b precision p) ->
  (Fcanonic radix b precision q) -> <R> p==q ->(Fweight p)=(Fweight q).

Theorem FweightZle:
  (p, q:
float)
  (Fcanonic radix b precision p) ->
  (Fcanonic radix b precision q) -> (Rle R0 p) -> (Rle p q) ->
  (Zle (Fweight p) (Fweight q)).

Theorem FinductPosAux:
  (P:
float ->Prop)
  (p:float)
  (Rle R0 p) ->
  (Fcanonic radix b precision p) ->
  (P p) ->
  ((q:float) (Fcanonic radix b precision q) -> (Rle p q) -> (P q) ->
   (P (FSucc b radix precision q))) ->
  (x:Z) (Zle ZERO x) ->
  (q:float)
  x=(Zminus (Fweight q) (Fweight p)) ->
  (Fcanonic radix b precision q) -> (Rle p q) ->(P q).

Theorem FinductPos:
  (P:
float ->Prop)
  (p:float)
  (Rle R0 p) ->
  (Fcanonic radix b precision p) ->
  (P p) ->
  ((q:float) (Fcanonic radix b precision q) -> (Rle p q) -> (P q) ->
   (P (FSucc b radix precision q))) ->
  (q:float) (Fcanonic radix b precision q) -> (Rle p q) ->(P q).

Theorem FinductNegAux:
  (P:
float ->Prop)
  (p:float)
  (Rle R0 p) ->
  (Fcanonic radix b precision p) ->
  (P p) ->
  ((q:float)
   (Fcanonic radix b precision q) -> (Rlt R0 q) -> (Rle q p) -> (P q) ->
   (P (FPred b radix precision q))) ->
  (x:Z) (Zle ZERO x) ->
  (q:float)
  x=(Zminus (Fweight p) (Fweight q)) ->
  (Fcanonic radix b precision q) -> (Rle R0 q) -> (Rle q p) ->(P q).

Theorem FinductNeg:
  (P:
float ->Prop)
  (p:float)
  (Rle R0 p) ->
  (Fcanonic radix b precision p) ->
  (P p) ->
  ((q:float)
   (Fcanonic radix b precision q) -> (Rlt R0 q) -> (Rle q p) -> (P q) ->
   (P (FPred b radix precision q))) ->
  (q:float) (Fcanonic radix b precision q) -> (Rle R0 q) -> (Rle q p) ->(P q).

Theorem radixRangeBoundExp:
  (p, q:
float)
  (Fcanonic radix b precision p) ->
  (Fcanonic radix b precision q) ->
  (Rle R0 p) -> (Rlt p q) -> (Rlt q (Rmult radix p)) ->
  (Fexp p)=(Fexp q) \/ (Zs (Fexp p))=(Fexp q).
End finduct.

30/05/01, 17:56