Fround.v
(****************************************************************************
IEEE754 : Fround
Laurent Thery
*****************************************************************************
*)
Require Export Float.
Require Export Fnorm.
Require Export Fop.
Require Export Fcomp.
Require Export FSucc.
Require Export FPred.
Require Export Fmin.
Require Export Fodd.
Require Export Fprop.
Section FRound.
Variable b:Fbound.
Variable radix:nat.
Variable precision:nat.
Local FtoRradix := (FtoR radix).
Coercion FtoRradix : float >-> R.
Hypothesis radixMoreThanOne:(lt (S O) radix).
Hypothesis precisionGreaterThanOne:(lt (1) precision).
Hypothesis pGivesBound:(vNum b)=(minus (exp radix precision) (1)).
Definition
TotalP := [P:R -> float ->Prop] (r:R)(Ex [p:float] (P r p)).
Definition
UniqueP :=
[P:R -> float ->Prop] (r:R) (p, q:float) (P r p) -> (P r q) -><R> p==q.
Definition
CompatibleP :=
[P:R -> float ->Prop]
(r1, r2:R) (p, q:float) (P r1 p) -> r1==r2 -> <R> p==q -> (Fbounded b q) ->
(P r2 q).
Definition
MinOrMaxP :=
[P:R -> float ->Prop] (r:R) (p:float) (P r p) ->
(isMin b radix r p) \/ (isMax b radix r p).
Definition
RoundedModeP :=
[P:R -> float ->Prop]
(TotalP P) /\ ((CompatibleP P) /\ ((MinOrMaxP P) /\ (MonotoneP radix P))).
Theorem
RoundedProjector: (P:?) (RoundedModeP P) ->(ProjectorP b radix P).
Intros P H'; Red.
Intros p q H'0 H'1.
Red in H'.
Elim H'; Intros H'2 H'3; Elim H'3; Intros H'4 H'5; Elim H'5; Intros H'6 H'7;
Case (H'6 p q); Clear H'5 H'3 H'; Auto.
Intros H'; Apply (ProjectMin b radix p); Auto.
Intros H'; Apply (ProjectMax b radix p); Auto.
Qed.
Theorem
MinCompatible: (CompatibleP (isMin b radix)).
Red.
Intros r1 r2 p q H' H'0 H'1 H'2; Split; Auto.
Rewrite <- H'0; Unfold FtoRradix in H'1; Rewrite <- H'1; Auto; Intuition.
Qed.
Theorem
MinRoundedModeP: (RoundedModeP (isMin b radix)).
Split; Try Red.
Intros r; Apply MinEx with precision := precision; Auto with arith.
Split; Try Exact MinCompatible.
Split; Try Apply MonotoneMin; Red; Auto.
Qed.
Theorem
MaxCompatible: (CompatibleP (isMax b radix)).
Red.
Intros r1 r2 p q H' H'0 H'1 H'2; Split; Auto.
Rewrite <- H'0; Unfold FtoRradix in H'1; Rewrite <- H'1; Auto; Intuition.
Qed.
Theorem
MaxRoundedModeP: (RoundedModeP (isMax b radix)).
Split; Try Red.
Intros r; Apply MaxEx with precision := precision; Auto with arith.
Split; Try Exact MaxCompatible.
Split; Try Apply MonotoneMax; Red; Auto.
Qed.
Definition
ToZeroP :=
[r:R] [p:float]
(Rle R0 r) /\ (isMin b radix r p) \/ (Rle r R0) /\ (isMax b radix r p).
Theorem
ToZeroTotal: (TotalP ToZeroP).
Red; Intros r; Case (Rle_or_lt r R0); Intros H1.
Case MaxEx with r := r 3 := pGivesBound; Auto with arith.
Intros x H'; Exists x; Red; Auto.
Case MinEx with r := r 3 := pGivesBound; Auto with arith.
Intros x H'; Exists x; Red; Left; Split; Auto.
Apply Rlt_le; Auto.
Qed.
Theorem
ToZeroCompatible: (CompatibleP ToZeroP).
Red.
Intros r1 r2 p q H'; Case H'.
Intros H'0 H'1 H'2; Left; Split; Try Apply MinCompatible with p := p r1 := r1;
Try Rewrite <- H'1; Auto; Intuition.
Intros H'0 H'1 H'2; Right; Split; Try Apply MaxCompatible with p := p r1 := r1;
Try Rewrite <- H'1; Auto; Intuition.
Qed.
Theorem
ToZeroMinOrMax: (MinOrMaxP ToZeroP).
Red.
Intros r p H'; Case H'; Clear H'; Intros H'.
Left; Intuition.
Right; Intuition.
Qed.
Theorem
ToZeroMonotone: (MonotoneP radix ToZeroP).
Red.
Cut (FtoR radix (Fzero (Zopp (dExp b))))==R0;
[Intros Eq0 | Unfold FtoR; Simpl; AutoRewrite [Rsimpl]]; Auto.
Intros p q p' q' H' H'0; Case H'0; Clear H'0.
Intros H'0; Elim H'0; Intros H'1 H'2; Clear H'0; Intros H'0.
Case H'0; Intros H'3; Elim H'3; Clear H'3; Auto.
Intros H'3 H'4.
Apply (MonotoneMin b radix) with p := p q := q; Auto.
Intros H'3 H'4.
Apply Rle_trans with p; [Intuition | Idtac].
Apply Rle_trans with q; [Auto | Intuition].
Apply Rlt_le; Auto.
Intros H'0; Elim H'0; Intros H'1 H'2; Clear H'0.
Intros H'0; Case H'0; Clear H'0; Intros H'0; Case H'0; Intros H'3 H'4; Clear H'0.
Apply Rle_trans with (FtoRradix (Fzero (Zopp (dExp b)))); Auto.
Elim H'2.
Intros H'0 H'5; Elim H'5; Intros H'6 H'7; Apply H'7; Clear H'5; Auto.
Repeat Split; Simpl; Auto with zarith.
Rewrite Eq0; Auto.
Elim H'4.
Intros H'0 H'5; Elim H'5; Intros H'6 H'7; Apply H'7; Clear H'5; Auto.
Repeat Split; Simpl; Auto with zarith.
Rewrite Eq0; Auto.
Apply (MonotoneMax b radix) with p := p q := q; Auto.
Qed.
Theorem
ToZeroRoundedModeP: (RoundedModeP ToZeroP).
Repeat Split.
Try Exact ToZeroTotal.
Try Exact ToZeroCompatible.
Try Exact ToZeroMinOrMax.
Try Exact ToZeroMonotone.
Qed.
Definition
ToInfinityP :=
[r:R] [p:float]
(Rle r R0) /\ (isMin b radix r p) \/ (Rle R0 r) /\ (isMax b radix r p).
Theorem
ToInfinityTotal: (TotalP ToInfinityP).
Red; Intros r; Case (Rle_or_lt r R0); Intros H1.
Case MinEx with r := r 3 := pGivesBound; Auto with arith.
Intros x H'; Exists x; Red; Auto.
Case MaxEx with r := r 3 := pGivesBound; Auto with arith.
Intros x H'; Exists x; Red; Right; Split; Auto.
Apply Rlt_le; Auto.
Qed.
Theorem
ToInfinityCompatible: (CompatibleP ToInfinityP).
Red.
Intros r1 r2 p q H'; Case H'.
Intros H'0 H'1 H'2; Left; Split; Try Apply MinCompatible with p := p r1 := r1;
Try Rewrite <- H'1; Intuition.
Intros H'0 H'1 H'2; Right; Split; Try Apply MaxCompatible with p := p r1 := r1;
Try Rewrite <- H'1; Intuition.
Qed.
Theorem
ToInfinityMinOrMax: (MinOrMaxP ToInfinityP).
Red.
Intros r p H'; Case H'; Clear H'; Intros H'.
Left; Intuition.
Right; Intuition.
Qed.
Theorem
ToInfinityMonotone: (MonotoneP radix ToInfinityP).
Red.
Cut (FtoR radix (Fzero (Zopp (dExp b))))==R0;
[Intros Eq0 | Unfold FtoR; Simpl; AutoRewrite [Rsimpl]]; Auto.
Intros p q p' q' H' H'0; Case H'0; Clear H'0.
Intros H'0; Elim H'0; Intros H'1 H'2; Clear H'0; Intros H'0.
Case H'0; Intros H'3; Elim H'3; Clear H'3; Auto.
Intros H'3 H'4.
Apply (MonotoneMin b radix) with p := p q := q; Auto.
Intros H'3 H'4.
Apply Rle_trans with p; [Intuition | Idtac].
Apply Rle_trans with q; [Auto | Intuition].
Apply Rlt_le; Auto.
Intros H'0; Elim H'0; Intros H'1 H'2; Clear H'0.
Intros H'0; Case H'0; Clear H'0; Intros H'0; Case H'0; Intros H'3 H'4; Clear H'0.
2:Apply (MonotoneMax b radix) with p := p q := q; Auto.
Apply Rle_trans with (FtoRradix (Fzero (Zopp (dExp b)))); Auto.
Elim H'2.
Intros H'0 H'5; Elim H'5; Intros H'6 H'7; Apply H'7; Clear H'5; Auto.
Repeat Split; Simpl; Auto with zarith.
Apply Rle_trans with q; Auto.
Apply Rlt_le; Auto.
Rewrite Eq0; Auto.
Elim H'4.
Intros H'0 H'5; Elim H'5; Intros H'6 H'7; Apply H'7; Clear H'5; Auto.
Repeat Split; Simpl; Auto with zarith.
Apply Rle_trans with p; Auto.
Rewrite Eq0; Auto.
Apply Rlt_le; Auto.
Qed.
Theorem
ToInfinityRoundedModeP: (RoundedModeP ToInfinityP).
Repeat Split.
Try Exact ToInfinityTotal.
Try Exact ToInfinityCompatible.
Try Exact ToInfinityMinOrMax.
Try Exact ToInfinityMonotone.
Qed.
Theorem
MinUniqueP: (UniqueP (isMin b radix)).
Red.
Intros r p q H' H'0.
Unfold FtoRradix; Apply MinEq with 1 := H'; Auto.
Qed.
Theorem
MaxUniqueP: (UniqueP (isMax b radix)).
Red.
Intros r p q H' H'0.
Unfold FtoRradix; Apply MaxEq with 1 := H'; Auto.
Qed.
Theorem
ToZeroUniqueP: (UniqueP ToZeroP).
Red.
Intros r p q H' H'0.
Inversion H'; Inversion H'0; Elim H0; Elim H; Clear H0 H; Intros H'1 H'2 H'3 H'4.
Apply (MinUniqueP r); Auto.
Cut <R> r==(Fzero (Zopp (dExp b)));
[Intros Eq0 |
Apply Rle_antisym; Unfold FtoRradix Fzero FtoR; Simpl; AutoRewrite [Rsimpl]];
Auto.
Apply trans_eqT with (FtoRradix (Fzero (Zopp (dExp b)))).
Apply sym_eqT; Unfold FtoRradix; Apply (RoundedProjector ? ToZeroRoundedModeP);
Auto with float.
Unfold FtoRradix in Eq0; Rewrite <- Eq0; Auto.
Unfold FtoRradix; Apply (RoundedProjector ? ToZeroRoundedModeP); Auto with float.
Unfold FtoRradix in Eq0; Rewrite <- Eq0; Auto.
Cut <R> r==(Fzero (Zopp (dExp b)));
[Intros Eq0 |
Apply Rle_antisym; Unfold FtoRradix Fzero FtoR; Simpl; AutoRewrite [Rsimpl]];
Auto.
Apply trans_eqT with (FtoRradix (Fzero (Zopp (dExp b)))).
Apply sym_eqT; Unfold FtoRradix; Apply (RoundedProjector ? ToZeroRoundedModeP);
Auto with float.
Unfold FtoRradix in Eq0; Rewrite <- Eq0; Auto.
Unfold FtoRradix; Apply (RoundedProjector ? ToZeroRoundedModeP); Auto with float.
Unfold FtoRradix in Eq0; Rewrite <- Eq0; Auto.
Apply (MaxUniqueP r); Auto.
Qed.
Theorem
ToInfinityUniqueP: (UniqueP ToInfinityP).
Red.
Intros r p q H' H'0.
Inversion H'; Inversion H'0; Elim H0; Elim H; Clear H0 H; Intros H'1 H'2 H'3 H'4.
Apply (MinUniqueP r); Auto.
Cut <R> r==(Fzero (Zopp (dExp b)));
[Intros Eq0 |
Apply Rle_antisym; Unfold FtoRradix Fzero FtoR; Simpl; AutoRewrite [Rsimpl]];
Auto.
Apply trans_eqT with (FtoRradix (Fzero (Zopp (dExp b)))).
Apply sym_eqT; Unfold FtoRradix;
Apply (RoundedProjector ? ToInfinityRoundedModeP); Auto.
Apply FboundedFzero; Auto.
Unfold FtoRradix in Eq0; Rewrite <- Eq0; Auto.
Unfold FtoRradix; Apply (RoundedProjector ? ToInfinityRoundedModeP); Auto.
Apply FboundedFzero; Auto.
Unfold FtoRradix in Eq0; Rewrite <- Eq0; Auto.
Cut <R> r==(Fzero (Zopp (dExp b)));
[Intros Eq0 |
Apply Rle_antisym; Unfold FtoRradix Fzero FtoR; Simpl; AutoRewrite [Rsimpl]];
Auto.
Apply trans_eqT with (FtoRradix (Fzero (Zopp (dExp b)))).
Apply sym_eqT; Unfold FtoRradix;
Apply (RoundedProjector ? ToInfinityRoundedModeP); Auto.
Apply FboundedFzero; Auto.
Unfold FtoRradix in Eq0; Rewrite <- Eq0; Auto.
Unfold FtoRradix; Apply (RoundedProjector ? ToInfinityRoundedModeP); Auto.
Apply FboundedFzero; Auto.
Unfold FtoRradix in Eq0; Rewrite <- Eq0; Auto.
Apply (MaxUniqueP r); Auto.
Qed.
Theorem
FnOddNEven:
(n:float) (FNodd b radix precision n) ->~ (FNeven b radix precision n).
Intros n H'; Unfold FNeven Feven; Apply OddNEven; Auto.
Qed.
Theorem
MinOrMaxRep:
(P:?) (MinOrMaxP P) ->
(p, q:float) (P p q) ->(Ex [m:Z] <R> q==(Float m (Fexp p))).
Intros P H' p q H'0; Case (H' p q); Auto; Intros H'1.
Apply FminRep with 3 := pGivesBound; Auto with arith.
Apply FmaxRep with 3 := pGivesBound; Auto with arith.
Qed.
Theorem
RoundedModeRep:
(P:?) (RoundedModeP P) ->
(p, q:float) (P p q) ->(Ex [m:Z] <R> q==(Float m (Fexp p))).
Intros P H' p q H'0.
Apply MinOrMaxRep with P := P; Auto.
Intuition; Auto.
Qed.
Definition
SymmetricP :=
[P:R -> float ->Prop] (r:R) (p:float) (P r p) ->(P (Ropp r) (Fopp p)).
Theorem
ToZeroSymmetric: (SymmetricP ToZeroP).
Red; Intros r p H'; Case H'; Clear H'; Intros H'; Case H'; Intros H'1 H'2.
Right; Split; Auto.
Replace R0 with (Ropp R0); Auto with real.
Apply MinOppMax; Auto.
Left; Split; Auto.
Replace R0 with (Ropp R0); Auto with real.
Apply MaxOppMin; Auto.
Qed.
Theorem
ToInfinitySymmetric: (SymmetricP ToInfinityP).
Red; Intros r p H'; Case H'; Clear H'; Intros H'; Case H'; Intros H'1 H'2.
Right; Split; Auto.
Replace R0 with (Ropp R0); Auto with real.
Apply MinOppMax; Auto.
Left; Split; Auto.
Replace R0 with (Ropp R0); Auto with real.
Apply MaxOppMin; Auto.
Qed.
End FRound.
Hints Resolve
RoundedProjector MinCompatible MinRoundedModeP MaxCompatible MaxRoundedModeP
ToZeroTotal ToZeroCompatible ToZeroMinOrMax ToZeroMonotone ToZeroRoundedModeP
ToInfinityTotal ToInfinityCompatible ToInfinityMinOrMax ToInfinityMonotone
ToInfinityRoundedModeP MinUniqueP MaxUniqueP ToZeroUniqueP ToInfinityUniqueP
FnOddNEven ToZeroSymmetric ToInfinitySymmetric :float.
14/12/100, 15:43