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

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