(** *** Some type classes about order *)
(** *** Making the generic [order] tactic *)
Definition lt_compat := lt_wd.
Definition lt_total := lt_trichotomy.
Definition le_lteq := lt_eq_cases.
Module Private_OrderTac.
Module IsTotal.
Definition eq_equiv := eq_equiv.
Definition lt_strorder := lt_strorder.
Definition lt_compat := lt_compat.
Definition lt_total := lt_total.
Definition le_lteq := le_lteq.
End IsTotal.
Module Tac := !MakeOrderTac NZ IsTotal.
End Private_OrderTac.
Ltac order := Private_OrderTac.Tac.order.
(** *** Some direct consequences of [order] *)

(* Specifications: *)
Theorem lt_neq : forall n m, n < m -> n ~= m.
Theorem lt_succ_l : forall n m, S n < m -> n < m.
Theorem le_le_succ_r : forall n m, n <= m -> n <= S m.
Theorem lt_lt_succ_r : forall n m, n < m -> n < S m.
Theorem succ_lt_mono : forall n m, n < m <-> S n < S m.
Theorem succ_le_mono : forall n m, n <= m <-> S n <= S m.
Theorem lt_0_1 : 0 < 1.
Theorem le_0_1 : 0 <= 1.
Theorem lt_1_2 : 1 < 2.
Theorem lt_0_2 : 0 < 2.
Theorem le_0_2 : 0 <= 2.
Ltac order' := generalize lt_0_1 lt_1_2; order.