Require Import ssreflect.
Require Import Reals.

Open Scope R_scope.

Lemma IMO : forall f g,
  (forall x y, f (x + y) + f (x - y) = 2 * f x * g y) ->
  ~ (forall x, f x = 0) ->
  (forall x, Rabs (f x) <= 1) ->
  forall y, Rabs (g y) <= 1.
Proof.
move=> f g Efg Hf0 Hf1 y; apply Rnot_lt_le => Hy1.
have Hy0:= Rlt_trans _ _ _ Rlt_0_1 Hy1.
have Ey0: g y <> 0 by move=> Dy; case/Rlt_not_eq: Hy0; rewrite Dy Rabs_R0.
case Hf0 => x; apply cond_eq => k; case/(pow_lt_1_zero (/ g y)) => [|n Hn].
  by apply: Rmult_lt_reg_l Hy0 _; rewrite -Rabs_mult Rmult_1_r Rinv_r // Rabs_R1.
rewrite Rminus_0_r; apply: Rle_lt_trans {Hn}(Hn n (le_n n)).
elim: n x => [|n IHn] x /=; [ by rewrite Rabs_R1 | apply: Rmult_le_reg_l Hy0 _].
rewrite -!Rabs_mult Rmult_comm -Rmult_assoc Rinv_r // Rmult_1_l.
apply: Rmult_le_reg_l Rlt_R0_R2 _.
rewrite -{1}[2](Rabs_Zabs 2) -Rabs_mult -Rmult_assoc -Efg double.
apply: Rle_trans (Rabs_triang _ _) _; exact: Rplus_le_compat.
Qed.
