(************************************************************************)
(*         *   The Coq Proof Assistant / The Coq Development Team       *)
(*  v      *   INRIA, CNRS and contributors - Copyright 1999-2018       *)
(* <O___,, *       (see CREDITS file for the list of authors)           *)
(*   \VV/  **************************************************************)
(*    //   *    This file is distributed under the terms of the         *)
(*         *     GNU Lesser General Public License Version 2.1          *)
(*         *     (see LICENSE file for the text of the license)         *)
(************************************************************************)
(* (c) Copyright 2006-2016 Microsoft Corporation and Inria.                  *)
by move=> x y f; rewrite [_.+1](addnC x.+1).
Qed.
by move=> x y f; rewrite {2}[in f _]addnC.
Qed.
by move=> x y f; rewrite [in f _](addnC y).
Qed.
by move=> x y f; rewrite {1 3}[in f _](addnC y).
Qed.
by move=> x y f; rewrite [in f _](addnC x). (* put y when bound var will be OK *)
Qed.
by move=> x y f; rewrite [in X in (f _ X)](addnC y).
Qed.
by move=> x y f E; rewrite {2 3}[in X in (f X _)]E.
Qed.
by move=> x y f E; rewrite {2}[in X in (f X _)]E.
Qed.

Lemma test4 : forall x y f, x = y -> x + f (fun _ : nat => x + x) x + f (fun _ => x + x) x =
x + f (fun _       => x + y) x + f (fun _ => y + x) x.