(************************************************************************)
(*         *      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                     *)
(************************************************************************)
(** * Basic lemmas about modules implementing [NZDomainSig']  This file defines the functor type [NZBaseProp] which adds the following lemmas: - [eq_refl], [eq_sym], [eq_trans] - [eq_sym_iff], [neq_sym], [eq_stepl] - [succ_inj], [succ_inj_wd], [succ_inj_wd_neg] - [central_induction] and the tactic notation [nzinduct]  The functor type [NZBaseProp] is meant to be [Include]d in a module implementing [NZDomainSig']. *)
From Stdlib.Numbers.NatInt Require Import NZAxioms.
Module Type NZBaseProp (Import NZ : NZDomainSig').
(** This functor from [Stdlib.Structures.Equalities] gives [eq_refl], [eq_sym] and [eq_trans]. *)
Include BackportEq NZ NZ.

(* Specifications: *)
Lemma eq_sym_iff : forall x y, x==y <-> y==x.
(* TODO: how register ~= (which is just a notation) as a Symmetric relation, hence allowing "symmetry" tac ? *)
Theorem neq_sym : forall n m, n ~= m -> m ~= n.
(** We add entries in the [stepl] and [stepr] databases. *)
Theorem eq_stepl : forall x y z, x == y -> x == z -> z == y.
Declare Left Step eq_stepl.