FexpPlus.v


Require Export Fexp.
Section mf.
Variable radix:nat.
Hypothesis radixMoreThanOne:(lt (1) radix).

Local FtoRradix := (FtoR radix).
Coercion FtoRradix : float >-> R.
Require Import PolyList.
Require Import ClosestPlus.
Variable b:Fbound.
Variable precision:nat.
Hypothesis precisionGreaterThanOne:(lt (1) precision).
Hypothesis pGivesBound:(vNum b)=(minus (exp radix precision) (1)).
Variable TwoSum:float -> float ->float * float.
Hypothesis TwoSum1:
           (p, q:float) (Fbounded b p) -> (Fbounded b q) ->
           (Closest b radix (Rplus p q) (Fst (TwoSum p q))).
Hypothesis TwoSum2:
           (p, q:float) (Fbounded b p) -> (Fbounded b q) ->
           <R> (Snd (TwoSum p q))==(Rminus (Rplus p q) (Fst (TwoSum p q))).
Hypothesis TwoSum3:
           (p, q:float) (Fbounded b p) -> (Fbounded b q) ->
           (Fbounded b (Fst (TwoSum p q))).
Hypothesis TwoSum4:
           (p, q:float) (Fbounded b p) -> (Fbounded b q) ->
           (Fbounded b (Snd (TwoSum p q))).
Hypothesis TwoSumEq1:
           (p, q, r, s:float)
           (Fbounded b p) ->
           (Fbounded b q) ->
           (Fbounded b r) -> (Fbounded b s) -> <R> p==q -> <R> r==s ->
           <R> (Fst (TwoSum p r))==(Fst (TwoSum q s)).
Hypothesis TwoSumEq2:
           (p, q, r, s:float)
           (Fbounded b p) ->
           (Fbounded b q) ->
           (Fbounded b r) -> (Fbounded b s) -> <R> p==q -> <R> r==s ->
           <R> (Snd (TwoSum p r))==(Snd (TwoSum q s)).

Fixpoint growExp[p:float; L:(list float)]: (list float) :=
   Cases L of
       nil => (cons p (nil ?))
      | (cons x L1) => Cases (TwoSum p x) of
                           (pair h c) => (cons c (growExp h L1))
                       end
   end.

Theorem TwoSumExp:
  (p, q:
float) (Fbounded b p) -> (Fbounded b q) ->
  (IsExpansion
     b radix (cons (Snd (TwoSum p q)) (cons (Fst (TwoSum p q)) (nil ?)))).

Theorem TwoSumOl1:
  (p, q:
float) (Fbounded b p) -> (Fbounded b q) -> (is_Fzero q) ->
  <R> (Fst (TwoSum p q))==p.

Theorem TwoSumOl2:
  (p, q:
float) (Fbounded b p) -> (Fbounded b q) -> (is_Fzero q) ->
  <R> (Snd (TwoSum p q))==R0.

Theorem TwoSumOr1:
  (p, q:
float) (Fbounded b p) -> (Fbounded b q) -> (is_Fzero p) ->
  <R> (Fst (TwoSum p q))==q.

Theorem TwoSumOr2:
  (p, q:
float) (Fbounded b p) -> (Fbounded b q) -> (is_Fzero p) ->
  <R> (Snd (TwoSum p q))==R0.

Theorem growExpIsVal:
  (L:(list
float)) (IsExpansion b radix L) ->
  (p:float) (Fbounded b p) ->
  <R> (expValue radix (growExp p L))==(Rplus p (expValue radix L)).

Theorem IsExpansionCons:
  (L:(list
float)) (IsExpansion b radix L) ->
  (p:float)
  ~ (is_Fzero p) ->
  (Fbounded b p) ->
  ((q:float) (In q L) -> ~ (is_Fzero q) ->(Zlt (MSB radix p) (LSB radix q))) ->
  (IsExpansion b radix (cons p L)).

Theorem IsExpansionConsInvAux:
  (L:(list
float)) (IsExpansion b radix L) ->
  (L':(list float))
  (p, q:float) ~ (is_Fzero p) -> L=(cons p L') -> (In q L') -> ~ (is_Fzero q) ->
  (Zlt (MSB radix p) (LSB radix q)).

Theorem IsExpansionConsInv:
  (L:(list
float))
  (p, q:float)
  ~ (is_Fzero p) ->
  (IsExpansion b radix (cons p L)) -> (In q L) -> ~ (is_Fzero q) ->
  (Zlt (MSB radix p) (LSB radix q)).

Theorem IsExpansionSkip:
  (L:(list
float)) (p, q:float) (IsExpansion b radix (cons p (cons q L))) ->
  (IsExpansion b radix (cons p L)).

Theorem TwoSumLt1:
  (p, q:
float)
  (Fbounded b p) ->
  (Fbounded b q) ->
  ~ (is_Fzero p) -> ~ (is_Fzero q) -> ~ (is_Fzero (Fst (TwoSum p q))) ->
  (Zle (Zmin (LSB radix p) (LSB radix q)) (LSB radix (Fst (TwoSum p q)))).

Theorem TwoSumLt2:
  (p, q:
float)
  (Fbounded b p) ->
  (Fbounded b q) ->
  ~ (is_Fzero p) -> ~ (is_Fzero q) -> ~ (is_Fzero (Snd (TwoSum p q))) ->
  (Zle (Zmin (LSB radix p) (LSB radix q)) (LSB radix (Snd (TwoSum p q)))).

Theorem IsExpansionGrowConsInvAux:
  (L:(list
float)) (IsExpansion b radix L) ->
  (L':(list float))
  (p, q, r:float)
  (Fbounded b r) ->
  ~ (is_Fzero p) -> L=(cons p L') -> (In q (growExp r L')) -> ~ (is_Fzero q) ->
  ((is_Fzero r) ->(Zlt (MSB radix p) (LSB radix q))) /\
  (~ (is_Fzero r) ->
   (Zlt (MSB radix p) (LSB radix q)) \/ (Zle (LSB radix r) (LSB radix q))).

Theorem growExpIsExp:
  (L:(list
float)) (IsExpansion b radix L) ->
  (p:float) (Fbounded b p) ->(IsExpansion b radix (growExp p L)).

Fixpoint addExp[L1:(list float)]: (list float) ->(list float) :=
   [L2:(list float)]
      Cases L1 of
          nil => L2
         | (cons x L'1) => Cases (growExp x L2) of
                               nil => L'1
                              | (cons y L'2) => (cons y (addExp L'1 L'2))
                           end
      end.

Theorem addExpIsVal:
  (L1, L2:(list
float)) (IsExpansion b radix L1) -> (IsExpansion b radix L2) ->
  <R>
    (expValue radix (addExp L1 L2))==
    (Rplus (expValue radix L1) (expValue radix L2)).

Theorem IsExpansionAddInv:
  (L1, L2:(list
float))
  (p, q:float)
  ~ (is_Fzero p) ->
  ~ (is_Fzero q) ->
  (IsExpansion b radix (cons p L1)) ->
  (IsExpansion b radix (cons p L2)) -> (In q (addExp L1 L2)) ->
  (Zlt (MSB radix p) (LSB radix q)).

Theorem addExpIsExp:
  (L1, L2:(list
float)) (IsExpansion b radix L1) -> (IsExpansion b radix L2) ->
  (IsExpansion b radix (addExp L1 L2)).
End mf.

30/05/01, 17:54