Module Type ZEuclid (Z:ZAxiomsSig) := NZDiv.NZDiv Z <+ EuclidSpec Z.Infix "/" := D.div : euclid.Infix "mod" := D.modulo : euclid.Module Import Private_NZDiv := Nop <+ NZDivProp A D B.Ltac pos_or_neg a :=
 let LT := fresh "LT" in
 let LE := fresh "LE" in
 destruct (le_gt_cases 0 a) as [LE|LT]; [|rewrite <- opp_pos_neg in LT].

(* Specifications: *)
Theorem div_pos : forall a b, 0<=a -> 0<b -> 0<= a/b.
Lemma div_str_pos : forall a b, 0<b<=a -> 0 < a/b.
Lemma div_lt : forall a b, 0<a -> 1<b -> a/b < a.
Lemma div_le_mono : forall a b c, 0<c -> a<=b -> a/c <= b/c.
Lemma mul_succ_div_gt: forall a b, 0<b -> a < b*(S (a/b)).
Lemma mul_pred_div_gt: forall a b, b<0 -> a < b*(P (a/b)).
Theorem div_lt_upper_bound: forall a b q, 0<b -> a < b*q -> a/b < q.
Theorem div_le_upper_bound: forall a b q, 0<b -> a <= b*q -> a/b <= q.
Theorem div_le_lower_bound: forall a b q, 0<b -> b*q <= a -> q <= a/b.
Lemma div_le_compat_l: forall p q r, 0<=p -> 0<q<=r -> p/r <= p/q.
Theorem div_mul_le: forall a b c, 0<=a -> 0<b -> 0<=c -> c*(a/b) <= (c*a)/b.