Library Coq.Arith.MinMax


Require Import Orders NatOrderedType GenericMinMax.

Maximum and Minimum of two natural numbers


Fixpoint max n m : nat :=
  match n, m with
    | O, _ => m
    | S n', O => n
    | S n', S m' => S (max n' m')
  end.

Fixpoint min n m : nat :=
  match n, m with
    | O, _ => 0
    | S n', O => 0
    | S n', S m' => S (min n' m')
  end.

These functions implement indeed a maximum and a minimum

Lemma max_l : forall x y, y<=x -> max x y = x.

Lemma max_r : forall x y, x<=y -> max x y = y.

Lemma min_l : forall x y, x<=y -> min x y = x.

Lemma min_r : forall x y, y<=x -> min x y = y.

Module NatHasMinMax <: HasMinMax Nat_as_OT.
 Definition max := max.
 Definition min := min.
 Definition max_l := max_l.
 Definition max_r := max_r.
 Definition min_l := min_l.
 Definition min_r := min_r.
End NatHasMinMax.

We obtain hence all the generic properties of max and min, see file GenericMinMax or use SearchAbout.

Module Export MMP := UsualMinMaxProperties Nat_as_OT NatHasMinMax.

Properties specific to the nat domain


Simplifications

Lemma max_0_l : forall n, max 0 n = n.

Lemma max_0_r : forall n, max n 0 = n.

Lemma min_0_l : forall n, min 0 n = 0.

Lemma min_0_r : forall n, min n 0 = 0.

Compatibilities (consequences of monotonicity)

Lemma succ_max_distr : forall n m, S (max n m) = max (S n) (S m).

Lemma succ_min_distr : forall n m, S (min n m) = min (S n) (S m).

Lemma plus_max_distr_l : forall n m p, max (p + n) (p + m) = p + max n m.

Lemma plus_max_distr_r : forall n m p, max (n + p) (m + p) = max n m + p.

Lemma plus_min_distr_l : forall n m p, min (p + n) (p + m) = p + min n m.

Lemma plus_min_distr_r : forall n m p, min (n + p) (m + p) = min n m + p.

Hint Resolve
 max_l max_r le_max_l le_max_r
 min_l min_r le_min_l le_min_r : arith v62.