(************************************************************************)
(*         *      The Rocq Prover / The Rocq Development Team           *)
(*  v      *         Copyright INRIA, CNRS and contributors             *)
(* <O___,, * (see version control and CREDITS file for authors & dates) *)
(*   \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)         *)
(************************************************************************)
(*                      Evgeny Makarov, INRIA, 2007                     *)
(************************************************************************)
(** * Some properties of the addition for modules implementing [NZBasicFunsSig']  This file defines the [NZAddProp] functor type. This functor type is meant to be [Include]d in a module implementing [NZBasicFunsSig'].  This gives the following lemmas: - [add_0_r], [add_1_l], [add_1_r] - [add_succ_r], [add_succ_comm], [add_comm] - [add_assoc] - [add_cancel_l], [add_cancel_r] - [add_shuffle0],  [add_shuffle3] to rearrange sums of 3 elements - [add_shuffle1],  [add_shuffle2] to rearrange sums of 4 elements - [sub_1_r] *)
From Stdlib.Numbers.NatInt Require Import NZAxioms NZBase.
Module Type NZAddProp (Import NZ : NZBasicFunsSig')(Import NZBase : NZBaseProp NZ).
Global Hint Rewrite
pred_succ add_0_l add_succ_l mul_0_l mul_succ_l sub_0_r sub_succ_r : nz.
Global Hint Rewrite one_succ two_succ : nz'.
Ltac nzsimpl := autorewrite with nz.
Ltac nzsimpl' := autorewrite with nz nz'.

Theorem add_shuffle2 : forall n m p q, (n + m) + (p + q) == (n + q) + (m + p).