#[global]
Instance Inj_comparison_Z : InjTyp comparison Z :=
  { inj := Z_of_comparison ; pred :=(fun x => -1 <= x <= 1) ; cstr := Z_of_comparison_bound}.Definition ZcompareZ (x y : Z) :=
  Z_of_comparison (Z.compare x y).#[global]
Program Instance BinOp_Zcompare : BinOp Z.compare :=
  { TBOp := ZcompareZ }.#[global]
Instance Op_eq_comparison : BinRel (@eq comparison) :=
  {TR := @eq Z ; TRInj := ltac:(intros [] []; simpl ; intuition congruence) }.#[global]
Instance Op_Eq : CstOp Eq :=
  { TCst := 0 ; TCstInj := eq_refl }.#[global]
Instance Op_Lt : CstOp Lt :=
  { TCst := -1 ; TCstInj := eq_refl }.#[global]
Instance Op_Gt : CstOp Gt :=
  { TCst := 1 ; TCstInj := eq_refl }.

(* Specifications: *)
Lemma Zcompare_spec : forall x y, (x = y -> ZcompareZ x y = 0) /\ (x > y -> ZcompareZ x y = 1) /\ (x < y -> ZcompareZ x y = -1).