Fodd.v
(****************************************************************************
IEEE754 : Fodd
Laurent Thery
*****************************************************************************
*)
Require Import ZArith.
Require Import PolyList.
Require Import Float.
Require Import Fnorm.
Require Import Fop.
Require Import Fcomp.
Require Import FSucc.
Require Import FPred.
Require Import Fmin.
Section FOdd.
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)).
(* We define the parity predicates*)
Inductive
Even: nat ->Prop :=
EvenO: (Even O)
| EvenSS: (n:nat) (Even n) ->(Even (S (S n))) .
Inductive
Odd: nat ->Prop :=
Odd1: (Odd (S O))
| OddSS: (n:nat) (Odd n) ->(Odd (S (S n))) .
Hints Resolve EvenO EvenSS Odd1 OddSS :arith.
Theorem
OddSEven: (n:nat) (Odd n) ->(Even (S n)).
Intros n H'; Elim H'; Auto with arith.
Qed.
Theorem
EvenSOdd: (n:nat) (Even n) ->(Odd (S n)).
Intros n H'; Elim H'; Auto with arith.
Qed.
Hints Resolve OddSEven EvenSOdd :arith.
Theorem
OddSEvenInv: (n:nat) (Odd (S n)) ->(Even n).
Intros n H'; Elim H'; Auto with arith.
Inversion H'; Auto with arith.
Qed.
Theorem
EvenSOddInv: (n:nat) (Even (S n)) ->(Odd n).
Intros n H'; Elim H'; Auto with arith.
Inversion H'; Auto with arith.
Qed.
Theorem
OddEvenDec: (n:nat){(Odd n)}+{(Even n)}.
Intros n; Elim n; Auto with arith.
Intros n0 H'; Case H'; Auto with arith.
Qed.
Theorem
OddNEven: (n:nat) (Odd n) ->~ (Even n).
Intros n H'; Elim H'; Auto with arith.
Red; Intros H'0; Inversion H'0.
Intros n0 H'0 H'1; Contradict H'1.
Apply OddSEvenInv.
Apply EvenSOddInv; Auto.
Qed.
Theorem
EvenNOdd: (n:nat) (Even n) ->~ (Odd n).
Intros n H'; Elim H'; Auto with arith.
Red; Intros H'0; Inversion H'0.
Intros n0 H'0 H'1; Contradict H'1.
Apply EvenSOddInv.
Apply OddSEvenInv; Auto.
Qed.
Hints Resolve OddNEven EvenNOdd :arith.
Theorem
EvenPlusAux:
(n, m:nat)
(iff (Odd (plus n m)) (Odd n) /\ (Even m) \/ (Even n) /\ (Odd m)) /\
(iff (Even (plus n m)) (Even n) /\ (Even m) \/ (Odd n) /\ (Odd m)).
Intros n; Elim n; Simpl; Auto with arith.
Intros m; Split; Auto.
Split.
Intuition.
Intros H'; Elim H'; Auto with arith.
Intros H'0; Elim H'0; Intros H'1 H'2; Inversion H'1.
Intuition.
Split.
Intuition.
Intros H'; Elim H'; Auto with arith.
Intuition.
Intros H'0; Elim H'0; Intros H'1 H'2; Inversion H'1.
Intros n0 H' m; Elim (H' m); Intros H'1 H'2; Elim H'1; Intros E1 E2; Elim H'2;
Intros E3 E4; Clear H'1 H'2.
Split; Split.
Intros H'0; Case E3.
Apply OddSEvenInv; Auto.
Intuition.
Intuition.
Intros H'0; Case H'0; Intros C0; Case C0; Intros C1 C2.
Apply EvenSOdd.
Apply E4; Left; Split; Auto with arith.
Apply OddSEvenInv; Auto.
Apply EvenSOdd.
Apply E4; Right; Split; Auto with arith.
Apply EvenSOddInv; Auto.
Intros H'0.
Case E1.
Apply EvenSOddInv; Auto.
Intuition.
Intuition.
Intros H'0; Case H'0; Intros C0; Case C0; Intros C1 C2.
Apply OddSEven.
Apply E2; Left; Split; Auto with arith.
Apply EvenSOddInv; Auto.
Apply OddSEven.
Apply E2; Right; Split; Auto with arith.
Apply OddSEvenInv; Auto.
Qed.
Theorem
EvenPlus1: (n, m:nat) (Even n) -> (Even m) ->(Even (plus n m)).
Intros n m; Generalize (EvenPlusAux n m); Intuition.
Qed.
Theorem
EvenPlus2: (n, m:nat) (Odd n) -> (Odd m) ->(Even (plus n m)).
Intros n m; Generalize (EvenPlusAux n m); Intuition.
Qed.
Theorem
EvenPlusInv1: (n, m:nat) (Even (plus n m)) -> (Even n) ->(Even m).
Intros n m H; Case (EvenPlusAux n m).
Intros H' H'0; Elim H'0.
Intros H'1; Case H'1; Auto.
Intuition.
Intros H'2 H'3 H'4; Contradict H'4; Case H'2; Auto with arith.
Qed.
Theorem
EvenPlusInv2: (n, m:nat) (Even (plus n m)) -> (Odd n) ->(Odd m).
Intros n m H; Case (EvenPlusAux n m).
Intros H' H'0; Elim H'0.
Intros H'1; Case H'1; Auto.
Intros H'2 H'3 H'4; Contradict H'4; Case H'2; Auto with arith.
Intuition.
Qed.
Hints Resolve EvenPlus1 EvenPlus2 :arith.
Theorem
OddPlus1: (n, m:nat) (Odd n) -> (Even m) ->(Odd (plus n m)).
Intros n m; Generalize (EvenPlusAux n m); Intuition.
Qed.
Theorem
OddPlus2: (n, m:nat) (Even n) -> (Odd m) ->(Odd (plus n m)).
Intros n m; Generalize (EvenPlusAux n m); Intuition.
Qed.
Theorem
OddPlusInv1: (n, m:nat) (Odd (plus n m)) -> (Odd m) ->(Even n).
Intros n m H; Case (EvenPlusAux n m).
Intros H' H'0; Elim H'.
Intros H'1; Case H'1; Auto.
Intros H'2 H'3 H'4; Contradict H'4; Case H'2; Auto with arith.
Intuition.
Qed.
Theorem
OddPlusInv2: (n, m:nat) (Odd (plus n m)) -> (Even m) ->(Odd n).
Intros n m H; Case (EvenPlusAux n m).
Intros H' H'0; Elim H'.
Intros H'1; Case H'1; Auto.
Intuition.
Intros H'2 H'3 H'4; Contradict H'4; Case H'2; Auto with arith.
Qed.
Hints Resolve OddPlus1 OddPlus2 :arith.
Theorem
EvenMultAux:
(n, m:nat)
(iff (Odd (mult n m)) (Odd n) /\ (Odd m)) /\
(iff (Even (mult n m)) (Even n) \/ (Even m)).
Intros n; Elim n; Simpl; Auto with arith.
Intros m; Split; Split; Auto with arith.
Intros H'; Inversion H'.
Intros H'; Elim H'; Auto.
Intros n0 H' m; Split; Split; Auto with arith.
Intros H'0.
Elim (EvenPlusAux m (mult n0 m)); Intros H'3 H'4; Case H'3; Intros H'1 H'2;
Case H'1; Auto.
Intros H'5; Elim H'5; Intros H'6 H'7; Auto with arith.
Split; Auto with arith.
Case (H' m).
Intros H'8 H'9; Case H'9.
Intros H'10; Case H'10; Auto with arith.
Intros H'11 H'12; Contradict H'11; Auto with arith.
Intros H'5; Elim H'5; Intros H'6 H'7; Contradict H'7.
Apply EvenNOdd.
Case (H' m).
Intros H'8 H'9; Case H'9; Intuition.
Intros H'0; Elim H'0; Intros H'1 H'2; Clear H'0.
Elim (EvenPlusAux m (mult n0 m)); Auto.
Intros H'0 H'3.
Elim H'0.
Intros H'4 H'5; Apply H'5; Auto.
Left; Split; Auto with arith.
Case (H' m).
Intros H'6 H'7; Elim H'7.
Intros H'8 H'9; Apply H'9.
Left.
Apply OddSEvenInv; Auto.
Intros H'0.
Elim (EvenPlusAux m (mult n0 m)); Intros H'3 H'4; Case H'4.
Intros H'1 H'2.
Elim H'1; Auto.
Intuition.
Intros H'5; Elim H'5; Intros H'6 H'7; Auto with arith.
Left.
Case (H' m).
Intros H'8; Elim H'8.
Intros H'9; Elim H'9; Auto with arith.
Intros H'0; Elim H'0; Intros H'1.
Case (OddEvenDec m).
Intros H'2.
Elim (EvenPlusAux m (mult n0 m)); Intros H'3 H'4; Case H'4.
Intros H'5 H'6; Apply H'6.
Right; Split; Auto with arith.
Case (H' m).
Intros H'7; Elim H'7.
Intros H'8 H'9 H'10.
Apply H'9.
Split; Auto with arith.
Apply EvenSOddInv; Auto.
Intros H'2.
Elim (EvenPlusAux m (mult n0 m)); Intros H'3 H'4; Case H'4.
Intros H'5 H'6; Apply H'6.
Left; Split; Auto with arith.
Case (H' m).
Intros H'7 H'8; Elim H'8; Auto.
Elim (EvenPlusAux m (mult n0 m)); Intros H'3 H'4; Case H'4.
Intros H'2 H'5; Apply H'5; Auto.
Left; Split; Auto with arith.
Case (H' m).
Intros H'7 H'8; Elim H'8; Auto.
Qed.
Theorem
EvenMult1: (n, m:nat) (Even n) ->(Even (mult n m)).
Intros n m; Generalize (EvenMultAux n m); Intuition.
Qed.
Theorem
EvenMult2: (n, m:nat) (Even m) ->(Even (mult n m)).
Intros n m; Generalize (EvenMultAux n m); Intuition.
Qed.
Hints Resolve EvenMult1 EvenMult2 :arith.
Theorem
EvenMultInv: (n, m:nat) (Even (mult n m)) -> (Odd n) ->(Even m).
Intros n m H' H'0.
Case (EvenMultAux n m).
Intros H'1 H'2; Elim H'2.
Intros H'3; Elim H'3; Auto.
Intros H'4; Contradict H'4; Auto with arith.
Qed.
Theorem
OddMult: (n, m:nat) (Odd n) -> (Odd m) ->(Odd (mult n m)).
Intros n m; Generalize (EvenMultAux n m); Intuition.
Qed.
Hints Resolve OddMult :arith.
Theorem
OddMultInv: (n, m:nat) (Odd (mult n m)) ->(Odd n).
Intros n m H'.
Case (EvenMultAux n m).
Intros H'1 H'2; Elim H'1.
Intros H'3; Elim H'3; Auto.
Qed.
Theorem
OddExp: (n, m:nat) (Odd n) ->(Odd (exp n m)).
Intros n m; Elim m; Simpl.
Intros H'; Apply Odd1.
Intros n0 H' H'0.
Apply OddMult; Auto.
Qed.
Theorem
EvenExp: (n, m:nat) (Even n) ->(Even (exp n (S m))).
Intros n m; Simpl; Auto with arith.
Qed.
Hints Resolve OddExp EvenExp :arith.
Definition
Feven := [p:float](Even (absolu (Fnum p))).
Definition
Fodd := [p:float](Odd (absolu (Fnum p))).
Theorem
FevenO: (p:float) (is_Fzero p) ->(Feven p).
Intros p H'; Red; Rewrite H'; Simpl; Auto with arith.
Qed.
Theorem
FevenOrFodd: (p:float)(Feven p) \/ (Fodd p).
Intros p; Case (OddEvenDec (absolu (Fnum p))); Auto.
Qed.
Theorem
FevenSucProp:
(p:float)
((Fodd p) ->(Feven (FSucc b radix precision p))) /\
((Feven p) ->(Fodd (FSucc b radix precision p))).
Intros p; Unfold FSucc Fodd Feven.
Case (Z_eq_dec (Fnum p) (vNum b)); Intros H'1.
Rewrite H'1; Simpl; Auto.
Repeat Rewrite absolu_INR.
Rewrite pGivesBound; Unfold nNormMin.
Case (OddEvenDec radix); Auto with arith.
Intros H'; Split; Intros H'0; Auto with arith.
Apply EvenMultInv with n := radix; Auto.
Replace (mult radix (exp radix (pred precision)))
with (plus (1) (minus (exp radix precision) (1))); Auto with arith.
Rewrite <- le_plus_minus; Auto.
Inversion precisionGreaterThanOne; Simpl; Auto.
Replace (1) with (exp radix O); Auto with arith.
Intros H'; Split; Intros H'0; Auto with arith.
Replace (pred precision) with (S (pred (pred precision))); Auto with arith.
Inversion precisionGreaterThanOne; Simpl; Auto.
Inversion H; Simpl; Auto.
Apply OddMultInv with m := radix.
(Rewrite mult_sym;
Replace (mult radix (exp radix (pred precision)))
with (plus (1) (minus (exp radix precision) (1)))); Auto with arith.
Rewrite <- le_plus_minus; Auto.
Inversion precisionGreaterThanOne; Simpl; Auto.
Replace (1) with (exp radix O); Auto with arith.
Case (Z_eq_dec (Fnum p) (Zopp (nNormMin radix precision))); Intros H'2.
Case (Z_eq_dec (Fexp p) (Zopp (dExp b))); Intros H'3.
Simpl; Auto with arith.
Case (Zle_or_lt ZERO (Fnum p)); Intros Zle0.
Rewrite absolu_Zs; Auto with arith.
Rewrite <- (absolu_Zs_neg (Fnum p)); Auto with arith.
Split; Intros H'.
Apply OddSEvenInv; Auto.
Apply EvenSOddInv; Auto.
Rewrite H'2; Simpl; Auto.
Repeat Rewrite absolu_Zopp; Repeat Rewrite absolu_INR.
Rewrite pGivesBound; Unfold nNormMin.
Case (OddEvenDec radix); Auto with arith.
Intros H'; Split; Intros H'0.
Apply OddPlusInv1 with m := (1); Auto with arith.
Rewrite plus_sym; Rewrite <- le_plus_minus.
Replace precision with (S (pred precision)); Simpl; Auto with arith.
Inversion precisionGreaterThanOne; Auto.
Replace (1) with (exp radix O); Auto with arith.
Contradict H'0; Auto with arith.
Intros H'; Split; Intros H'0.
Contradict H'0; Replace (pred precision) with (S (pred (pred precision)));
Auto with arith.
Inversion precisionGreaterThanOne; Simpl; Auto.
Inversion H; Simpl; Auto.
Apply EvenPlusInv2 with n := (1); Auto with arith.
Rewrite <- le_plus_minus; Auto.
Replace precision with (S (pred precision)); Auto with arith.
Inversion precisionGreaterThanOne; Simpl; Auto.
Replace (1) with (exp radix O); Auto with arith.
Simpl; Auto with arith.
Case (Zle_or_lt ZERO (Fnum p)); Intros Zle0.
Rewrite absolu_Zs; Auto with arith.
Rewrite <- (absolu_Zs_neg (Fnum p)); Auto with arith.
Split; Intros H'.
Apply OddSEvenInv; Auto.
Apply EvenSOddInv; Auto.
Qed.
Theorem
FoddSuc: (p:float) (Fodd p) ->(Feven (FSucc b radix precision p)).
Intros p H'; Case (FevenSucProp p); Auto.
Qed.
Theorem
FevenSuc: (p:float) (Feven p) ->(Fodd (FSucc b radix precision p)).
Intros p H'; Case (FevenSucProp p); Auto.
Qed.
Theorem
FevenFop: (p:float) (Feven p) ->(Feven (Fopp p)).
Intros p; Unfold Feven.
Case p; Simpl; Auto.
Intros Fnum1 Fexp1; Rewrite absolu_Zopp; Auto.
Qed.
Theorem
FoddFop: (p:float) (Fodd p) ->(Fodd (Fopp p)).
Intros p; Unfold Fodd.
Case p; Simpl; Auto.
Intros Fnum1 Fexp1; Rewrite absolu_Zopp; Auto.
Qed.
Theorem
FevenPred: (p:float) (Fodd p) ->(Feven (FPred b radix precision p)).
Intros p H'; Rewrite FPredFopFSucc; Auto with arith.
Apply FevenFop; Auto.
Apply FoddSuc; Auto.
Apply FoddFop; Auto with arith.
Qed.
Theorem
FoddPred: (p:float) (Feven p) ->(Fodd (FPred b radix precision p)).
Intros p H'; Rewrite FPredFopFSucc; Auto with arith.
Apply FoddFop; Auto.
Apply FevenSuc; Auto.
Apply FevenFop; Auto.
Qed.
Definition
FNodd := [p:float](Fodd (Fnormalize radix b precision p)).
Definition
FNeven := [p:float](Feven (Fnormalize radix b precision p)).
Theorem
FNoddEq:
(f1, f2:float)
(Fbounded b f1) -> (Fbounded b f2) -> <R> f1==f2 -> (FNodd f1) ->(FNodd f2).
Intros f1 f2 H' H'0 H'1 H'2; Red.
Rewrite FcanonicUnique with 3 := pGivesBound
p := (Fnormalize radix b precision f2)
q := (Fnormalize radix b precision f1);
Auto with float arith.
Repeat Rewrite FnormalizeCorrect; Auto.
Qed.
Theorem
FNevenEq:
(f1, f2:float)
(Fbounded b f1) -> (Fbounded b f2) -> <R> f1==f2 -> (FNeven f1) ->(FNeven f2).
Intros f1 f2 H' H'0 H'1 H'2; Red.
Rewrite FcanonicUnique with 3 := pGivesBound
p := (Fnormalize radix b precision f2)
q := (Fnormalize radix b precision f1);
Auto with float arith.
Repeat Rewrite FnormalizeCorrect; Auto.
Qed.
Theorem
FNevenFop: (p:float) (FNeven p) ->(FNeven (Fopp p)).
Intros p; Unfold FNeven.
Rewrite Fnormalize_Fopp; Auto.
Intros; Apply FevenFop; Auto.
Qed.
Theorem
FNoddFop: (p:float) (FNodd p) ->(FNodd (Fopp p)).
Intros p; Unfold FNodd.
Rewrite Fnormalize_Fopp; Auto.
Intros; Apply FoddFop; Auto.
Qed.
Theorem
FNoddSuc:
(p:float) (Fbounded b p) -> (FNodd p) ->(FNeven (FNSucc b radix precision p)).
Unfold FNodd FNeven FNSucc.
Intros p H' H'0.
Rewrite FcanonicFormalizeEq; Auto with float arith.
Apply FoddSuc; Auto with float arith.
Qed.
Theorem
FNevenSuc:
(p:float) (Fbounded b p) -> (FNeven p) ->(FNodd (FNSucc b radix precision p)).
Unfold FNodd FNeven FNSucc.
Intros p H' H'0.
Rewrite FcanonicFormalizeEq; Auto with float arith.
Apply FevenSuc; Auto.
Qed.
Theorem
FNevenPred:
(p:float) (Fbounded b p) -> (FNodd p) ->(FNeven (FNPred b radix precision p)).
Unfold FNodd FNeven FNPred.
Intros p H' H'0.
Rewrite FcanonicFormalizeEq; Auto with float arith.
Apply FevenPred; Auto.
Qed.
Theorem
FNoddPred:
(p:float) (Fbounded b p) -> (FNeven p) ->(FNodd (FNPred b radix precision p)).
Unfold FNodd FNeven FNPred.
Intros p H' H'0.
Rewrite FcanonicFormalizeEq; Auto with float arith.
Apply FoddPred; Auto.
Qed.
End FOdd.
Hints Resolve
FevenO FoddSuc FevenSuc FevenFop FoddFop FevenPred FoddPred FNevenFop FNoddFop
FNoddSuc FNevenSuc FNevenPred FNoddPred :float.
14/12/100, 15:32