(* There are still many variants of the theorem above. One can assume 0 < n or 0 < p or n <= m or p <= q. *)

(* Specifications: *)
Theorem mul_le_mono_nonneg :
forall n m p q, 0 <= n -> n <= m -> 0 <= p -> p <= q -> n * p <= m * q.
Theorem mul_pos_pos : forall n m, 0 < n -> 0 < m -> 0 < n * m.
Theorem mul_neg_neg : forall n m, n < 0 -> m < 0 -> 0 < n * m.
Theorem mul_pos_neg : forall n m, 0 < n -> m < 0 -> n * m < 0.
Theorem mul_neg_pos : forall n m, n < 0 -> 0 < m -> n * m < 0.
Theorem mul_nonneg_nonneg : forall n m, 0 <= n -> 0 <= m -> 0 <= n*m.
Theorem mul_pos_cancel_l : forall n m, 0 < n -> (0 < n*m <-> 0 < m).
Theorem mul_pos_cancel_r : forall n m, 0 < m -> (0 < n*m <-> 0 < n).
Theorem mul_nonneg_cancel_l : forall n m, 0 < n -> (0 <= n*m <-> 0 <= m).
Theorem mul_nonneg_cancel_r : forall n m, 0 < m -> (0 <= n*m <-> 0 <= n).
Theorem lt_1_mul_pos : forall n m, 1 < n -> 0 < m -> 1 < n * m.
Theorem eq_mul_0 : forall n m, n * m == 0 <-> n == 0 \/ m == 0.
Theorem neq_mul_0 : forall n m, n ~= 0 /\ m ~= 0 <-> n * m ~= 0.
Theorem eq_square_0 : forall n, n * n == 0 <-> n == 0.
Theorem eq_mul_0_l : forall n m, n * m == 0 -> m ~= 0 -> n == 0.
Theorem eq_mul_0_r : forall n m, n * m == 0 -> n ~= 0 -> m == 0.
Notation mul_eq_0 := eq_mul_0.