(** Standard associated names *)

Notation mult_0_r_reverse := mult_n_O (only parsing).Notation mult_succ_r_reverse := mult_n_Sm (only parsing).(** Truncated subtraction: [m-n] is [0] if [n>=m] *)

Notation minus := Nat.sub (only parsing).Infix "-" := Nat.sub : nat_scope.(** Definition of the usual orders, the basic properties of [le] and [lt]
    can be found in files Le and Lt *)

Inductive le (n:nat) : nat -> Prop :=
  | le_n : n <= n
  | le_S : forall m:nat, n <= m -> n <= S m

where "n <= m" := (le n m) : nat_scope.(** Definition of the usual orders, the basic properties of [le] and [lt]
    can be found in files Le and Lt *)

Inductive le (n:nat) : nat -> Prop :=
  | le_n : n <= n
  | le_S : forall m:nat, n <= m -> n <= S m

where "n <= m" := (le n m) : nat_scope.(** Definition of the usual orders, the basic properties of [le] and [lt]
    can be found in files Le and Lt *)

Inductive le (n:nat) : nat -> Prop :=
  | le_n : n <= n
  | le_S : forall m:nat, n <= m -> n <= S m

where "n <= m" := (le n m) : nat_scope.(** Definition of the usual orders, the basic properties of [le] and [lt]
    can be found in files Le and Lt *)

Inductive le (n:nat) : nat -> Prop :=
  | le_n : n <= n
  | le_S : forall m:nat, n <= m -> n <= S m

where "n <= m" := (le n m) : nat_scope.(*i equivalent to : "Hints Resolve le_n le_S : core." i*)

Definition lt (n m:nat) := S n <= m.Infix "<" := lt : nat_scope.Definition ge (n m:nat) := m <= n.Infix ">=" := ge : nat_scope.Definition gt (n m:nat) := m < n.Infix ">" := gt : nat_scope.Notation "x <= y <= z" := (x <= y /\ y <= z) : nat_scope.Notation "x <= y < z" := (x <= y /\ y < z) : nat_scope.Notation "x < y < z" := (x < y /\ y < z) : nat_scope.Notation "x < y <= z" := (x < y /\ y <= z) : nat_scope.

Theorem nat_double_ind : forall R:nat -> nat -> Prop, (forall n:nat, R 0 n) -> (forall n:nat, R (S n) 0) -> (forall n m:nat, R n m -> R (S n) (S m)) -> forall n m:nat, R n m.