intros x H; unfold FPred, FSucc in |- *.
cut (Fbounded b x); [ intros Fb0 | apply FcanonicBound with (1 := H) ].
generalize (Z_eq_bool_correct (Fnum x) (- pPred (vNum b)));
case (Z_eq_bool (Fnum x) (- pPred (vNum b))); simpl in |- *.
generalize (Z_eq_bool_correct (- nNormMin radix precision) (pPred (vNum b)));
case (Z_eq_bool (- nNormMin radix precision) (pPred (vNum b)));
simpl in |- *.
intros H'; Contradict H'; apply Zlt_not_eq; auto.
rewrite <- (Zopp_involutive (pPred (vNum b))); apply Zlt_Zopp.
apply Zlt_le_trans with (- 0%nat)%Z.
apply Zlt_Zopp; unfold pPred in |- *; apply Zlt_succ_pred; simpl in |- *.
apply (vNumbMoreThanOne radix) with (precision := precision); auto.
simpl in |- *; apply Zlt_le_weak; apply nNormPos; auto with zarith arith.
generalize
(Z_eq_bool_correct (- nNormMin radix precision) (- nNormMin radix precision));
case (Z_eq_bool (- nNormMin radix precision) (- nNormMin radix precision));
simpl in |- *.
generalize (Z_eq_bool_correct (Zsucc (Fexp x)) (- dExp b));
case (Z_eq_bool (Zsucc (Fexp x)) (- dExp b)); simpl in |- *.
intros H' H'0 H'1 H'2; absurd (- dExp b <= Fexp x)%Z; auto with float.
rewrite <- H'; auto with zarith.
intros H' H'0 H'1 H'2; rewrite <- H'2; apply floatEq; simpl in |- *; auto;
unfold Zsucc, Zpred in |- *; ring.
intros H'; case H'; auto.
generalize (Z_eq_bool_correct (Fnum x) (nNormMin radix precision));
case (Z_eq_bool (Fnum x) (nNormMin radix precision));
simpl in |- *.
generalize (Z_eq_bool_correct (Fexp x) (- dExp b));
case (Z_eq_bool (Fexp x) (- dExp b)); simpl in |- *.
generalize (Z_eq_bool_correct (Zpred (Fnum x)) (pPred (vNum b)));
case (Z_eq_bool (Zpred (Fnum x)) (pPred (vNum b)));
simpl in |- *.
intros H' H'0 H'1 H'2; absurd (nNormMin radix precision <= pPred (vNum b))%Z;
auto with float.
rewrite <- H'; rewrite H'1; auto with zarith.
rewrite <- H'1; auto with float.
apply Zle_Zabs_inv2; auto with float zarith.
unfold pPred in |- *; apply Zle_Zpred; auto with float.
generalize (Z_eq_bool_correct (Zpred (Fnum x)) (- nNormMin radix precision));
case (Z_eq_bool (Zpred (Fnum x)) (- nNormMin radix precision));
simpl in |- *.
intros H' H'0 H'1 H'2 H'3;
absurd (Zpred (nNormMin radix precision) = (- nNormMin radix precision)%Z);
auto with zarith.
intros H' H'0 H'1 H'2 H'3; apply floatEq; simpl in |- *; auto;
unfold Zpred, Zsucc in |- *; ring.
generalize (Z_eq_bool_correct (pPred (vNum b)) (pPred (vNum b)));
case (Z_eq_bool (pPred (vNum b)) (pPred (vNum b)));
auto.
intros H' H'0 H'1 H'2; rewrite <- H'1; apply floatEq; simpl in |- *; auto;
unfold Zpred, Zsucc in |- *; ring.
intros H'; case H'; auto.
generalize (Z_eq_bool_correct (Zpred (Fnum x)) (pPred (vNum b)));
case (Z_eq_bool (Zpred (Fnum x)) (pPred (vNum b)));
simpl in |- *.
intros H'; absurd (Fnum x <= pPred (vNum b))%Z; auto with float.
rewrite <- H'.
apply Zlt_not_le; apply Zlt_pred; auto.
apply Zle_Zabs_inv2; unfold pPred in |- *; apply Zle_Zpred; auto with float.
generalize (Z_eq_bool_correct (Zpred (Fnum x)) (- nNormMin radix precision));
case (Z_eq_bool (Zpred (Fnum x)) (- nNormMin radix precision));
simpl in |- *.
generalize (Z_eq_bool_correct (Fexp x) (- dExp b));
case (Z_eq_bool (Fexp x) (- dExp b)); simpl in |- *.
intros H' H'0 H'1 H'2 H'3; apply floatEq; simpl in |- *; auto;
unfold Zsucc, Zpred in |- *; ring.
intros H' H'0 H'1 H'2 H'3; case H; intros C0.
absurd (nNormMin radix precision <= Zabs (Fnum x))%Z; auto with float.
replace (Fnum x) with (Zsucc (Zpred (Fnum x)));
[ idtac | unfold Zsucc, Zpred in |- *; ring ].
rewrite H'0.
rewrite <- Zopp_Zpred_Zs; rewrite Zabs_Zopp.
rewrite Zabs_eq; auto with zarith.
apply Zle_Zpred; simpl in |- *; apply nNormPos; auto with float zarith.
apply pNormal_absolu_min with (b := b); auto.
Contradict H'; apply FsubnormalFexp with (1 := C0).
intros H' H'0 H'1 H'2; apply floatEq; simpl in |- *; auto.
unfold Zpred, Zsucc in |- *; ring.
Qed.

(* Specifications: *)
Theorem FNPredSuc :
forall x : float,
Fbounded b x -> FNPred (FNSucc b radix precision x) = x :>R.