Module Import Private_BootStrap.
(** ** Operations and constants *)
(** ** Addition is commutative *)
(** ** Opposite distributes over addition *)
(** ** Opposite is injective *)
(** ** Addition is associative *)
Local Arguments add !x !y.
(** ** Opposite is inverse for addition *)
(** ** Multiplication and Opposite *)
(** ** Distributivity of multiplication over addition *)
End Private_BootStrap.
(** * Proofs of specifications *)
(** ** Specification of constants *)
(** ** Specification of addition *)
(** ** Specification of opposite *)
(** ** Specification of successor and predecessor *)
Local Arguments pos_sub : simpl nomatch.
(** ** Specification of subtraction *)
(** ** Specification of multiplication *)
(** ** Specification of comparisons and order *)
(** ** Specification of minimum and maximum *)
(** ** Induction principles based on successor / predecessor *)
(** We can now derive all properties of basic functions and orders, and use these properties for proving the specs of more advanced functions. *)
Include ZBasicProp <+ UsualMinMaxLogicalProperties <+ UsualMinMaxDecProperties.
Register eq_decidable as num.Z.eq_decidable.
Register le_decidable as num.Z.le_decidable.
Register lt_decidable as num.Z.lt_decidable.
(** ** Specification of absolute value *)
(** ** Specification of sign *)
(** ** Specification of power *)
(** For folding back a [pow_pos] into a [pow] *)
(** ** Specification of square *)
(** ** Specification of square root *)
(** ** Specification of logarithm *)
(** Specification of parity functions *)
(** ** Multiplication and Doubling *)
(** ** Correctness proofs for Trunc division *)

Lemma pos_div_eucl_eq a b : 0 < b ->
let (q, r) := pos_div_eucl a b in pos a = q * b + r.