intros x y H' H'0; unfold MSB, Fmult, Fdigit in |- *; simpl in |- *.
replace
(Zsucc
(Zpred (digit radix (Fnum x) + Fexp x) +
Zpred (digit radix (Fnum y) + Fexp y))) with
(Zpred (digit radix (Fnum x) + digit radix (Fnum y) + (Fexp x + Fexp y)));
[ idtac | unfold Zpred, Zsucc in |- *; ring ].
cut
(digit radix (Fnum x * Fnum y) <=
digit radix (Fnum x) + digit radix (Fnum y))%Z;
[ unfold Zpred in |- *; auto with zarith | idtac ].
rewrite <- inj_plus.
apply inj_le; auto.
rewrite <- digitAdd; auto with arith.
apply digit_monotone; auto with arith.
repeat rewrite Zabs_Zmult.
apply Zle_Zmult_comp_l; auto with zarith.
rewrite (fun x => Zabs_eq (Zpower_nat radix x)); auto with zarith.
Qed.

(* Specifications: *)
Theorem mult_le_MSB :
forall x y : float,
~ is_Fzero x ->
~ is_Fzero y ->
(Float 1%nat (MSB (Fmult x y)) <=
radix * Fmult (Float 1%nat (MSB x)) (Float 1%nat (MSB y)))%R.