Module Type ZDiv (Z:ZAxiomsMiniSig) := NZDiv.NZDiv Z <+ ZDivSpecific Z.
Module Type ZDiv' (Z:ZAxiomsMiniSig) := NZDiv.NZDiv' Z <+ ZDivSpecific Z.
(** Then, the Truncated-Toward-Zero convention. For not colliding with Floor operations, we use different names *)
Module Type QuotRem (Import A : Typ).
Parameters Inline quot rem : t -> t -> t.
End QuotRem.
Module Type QuotRemNotation (A : Typ)(Import B : QuotRem A).
Infix "÷" := quot (at level 40, left associativity).
Infix "rem" := rem (at level 40, no associativity).
End QuotRemNotation.
Module Type QuotRem' (A : Typ) := QuotRem A <+ QuotRemNotation A.
Module Type QuotRemSpec (Import A : ZAxiomsMiniSig')(Import B : QuotRem' A).
#[global]
Declare Instance quot_wd : Proper (eq==>eq==>eq) quot.
#[global]
Declare Instance rem_wd : Proper (eq==>eq==>eq) B.rem.

Axiom quot_rem : forall a b, b ~= 0 -> a == b*(a÷b) + (a rem b).