(************************************************************************)
(*         *   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.
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.
by move=> x y f E; rewrite {1}[X in (f X _)]addnC.
Qed.
by move=> x y f E; rewrite {1}[in X in (f X X)]E.
Qed.
by move=> x y f E; rewrite [in X in (f X X)]E.
Qed.
by move=> x y f E; rewrite -[X in (f X X)]E.
Qed.
by move=> x y f; rewrite [(x + y) in X in (f X)]addnC.
Qed.
by move=> x y f; rewrite [(x.+1 + y) as X in (f X)]addnC.
Qed.

Lemma manual x y z (f : nat -> nat -> nat) : (x + y).+1 + f (x.+1 + y) (z + (x + y).+1) = 0.