(* Multiplication. *)

Definition muln_rec := mult.Definition muln := nosimpl muln_rec.

(* Specifications: *)
Lemma multE : mult = muln.
Lemma mulnE : muln = muln_rec.
Lemma mul0n : left_zero 0 muln.
Lemma muln0 : right_zero 0 muln.
Lemma mul1n : left_id 1 muln.
Lemma mulSn m n : m.+1 * n = n + m * n.
Lemma mulSnr m n : m.+1 * n = m * n + n.
Lemma mulnS m n : m * n.+1 = m + m * n.
Lemma mulnSr m n : m * n.+1 = m * n + m.
Lemma iter_addn m n p : iter n (addn m) p = m * n + p.
Lemma iter_addn_0 m n : iter n (addn m) 0 = m * n.
Lemma muln1 : right_id 1 muln.
Lemma mulnC : commutative muln.
Lemma mulnDl : left_distributive muln addn.
Lemma mulnDr : right_distributive muln addn.
Lemma mulnBl : left_distributive muln subn.
Lemma mulnBr : right_distributive muln subn.
Lemma mulnA : associative muln.
Lemma mulnCA : left_commutative muln.
Lemma mulnAC : right_commutative muln.
Lemma mulnACA : interchange muln muln.
Lemma muln_gt0 m n : (0 < m * n) = (0 < m) && (0 < n).
Lemma leq_pmull m n : n > 0 -> m <= n * m.
Lemma leq_pmulr m n : n > 0 -> m <= m * n.
Lemma leq_mul m1 m2 n1 n2 : m1 <= n1 -> m2 <= n2 -> m1 * m2 <= n1 * n2.
Lemma leq_pmul2l m n1 n2 : 0 < m -> (m * n1 <= m * n2) = (n1 <= n2).
Lemma leq_pmul2r m n1 n2 : 0 < m -> (n1 * m <= n2 * m) = (n1 <= n2).
Lemma ltn_mul2l m n1 n2 : (m * n1 < m * n2) = (0 < m) && (n1 < n2).
Lemma ltn_mul2r m n1 n2 : (n1 * m < n2 * m) = (0 < m) && (n1 < n2).
Lemma ltn_pmul2l m n1 n2 : 0 < m -> (m * n1 < m * n2) = (n1 < n2).
Lemma ltn_pmul2r m n1 n2 : 0 < m -> (n1 * m < n2 * m) = (n1 < n2).
Lemma ltn_Pmull m n : 1 < n -> 0 < m -> m < n * m.
Lemma ltn_Pmulr m n : 1 < n -> 0 < m -> m < m * n.
Lemma ltn_mul m1 m2 n1 n2 : m1 < n1 -> m2 < n2 -> m1 * m2 < n1 * n2.
Lemma maxn_mulr : right_distributive muln maxn.
Lemma maxn_mull : left_distributive muln maxn.
Lemma minn_mulr : right_distributive muln minn.
Lemma minn_mull : left_distributive muln minn.