(** We hence obtain all the generic properties of [min] and [max]. *)
Ltac order := Private_Tac.order.
(** Minimum, maximum and constant one *)

(* Specifications: *)
Lemma max_1_l n : max 1 n = n.
Lemma max_1_r n : max n 1 = n.
Lemma min_1_r n : min n 1 = 1.
Lemma succ_min_distr n m : succ (min n m) = min (succ n) (succ m).
Lemma add_max_distr_l n m p : max (p + n) (p + m) = p + max n m.
Lemma add_max_distr_r n m p : max (n + p) (m + p) = max n m + p.
Lemma add_min_distr_l n m p : min (p + n) (p + m) = p + min n m.
Lemma add_min_distr_r n m p : min (n + p) (m + p) = min n m + p.
Lemma mul_max_distr_l n m p : max (p * n) (p * m) = p * max n m.
Lemma mul_max_distr_r n m p : max (n * p) (m * p) = max n m * p.
Lemma mul_min_distr_l n m p : min (p * n) (p * m) = p * min n m.
Lemma mul_min_distr_r n m p : min (n * p) (m * p) = min n m * p.
(** ** Results concerning [iter_op] *)
Lemma iter_op_succ : forall A (op:A->A->A),
(forall x y z, op x (op y z) = op (op x y) z) ->
forall p a,
iter_op op (succ p) a = op a (iter_op op p a).
Lemma iter_op_correct {A} op x p z
(op_zero_r : op x z = x)
(op_assoc : forall x y z : A, op x (op y z) = op (op x y) z)
: @Pos.iter_op A op p x = Pos.iter (op x) z p.