(*s Definition of the minimum function *)

Definition Dmin (d d' : D) := if Dle d d' then d else d'.

(* Specifications: *)
Lemma Dle_true_Dmin : forall d d' : D, Dle d d' = true -> Dmin d d' = d.
Lemma Dle_inv_Dmin : forall d d' : D, Dle d' d = true -> Dmin d d' = d'.
Lemma Dmin_idempotent : forall d : D, Dmin d d = d.
Lemma Dmin_comm : forall d d' : D, Dmin d d' = Dmin d' d.
Lemma Dmin_assoc : forall d d' d'' : D, Dmin (Dmin d d') d'' = Dmin d (Dmin d' d'').
Lemma Dmin_le_1 : forall d d' : D, Dle (Dmin d d') d = true.
Lemma Dmin_le_2 : forall d d' : D, Dle (Dmin d d') d' = true.
Lemma Dmin_le_3 : forall d d' d'' : D, Dle d (Dmin d' d'') = true -> Dle d d' = true.
Lemma Dmin_le_4 : forall d d' d'' : D, Dle d (Dmin d' d'') = true -> Dle d d'' = true.
Lemma Dmin_le_5 : forall d d' d'' : D, Dle d d' = true -> Dle d d'' = true -> Dle d (Dmin d' d'') = true.
Lemma Dneg_Dz : Dneg Dz = Dz.
Lemma Dneg_neg : forall d : D, Dneg (Dneg d) = d.
Lemma Dplus_neg_2 : forall d : D, Dplus (Dneg d) d = Dz.
Lemma Dplus_reg_l : forall d d' d'' : D, Dle (Dplus d'' d) (Dplus d'' d') = true -> Dle d d' = true.
Lemma Dplus_reg_r : forall d d' d'' : D, Dle (Dplus d d'') (Dplus d' d'') = true -> Dle d d' = true.
Lemma Dmin_plus_l : forall d d' d'' : D, Dplus (Dmin d d') d'' = Dmin (Dplus d d'') (Dplus d' d'').
Lemma Dmin_plus_r : forall d d' d'' : D, Dplus d'' (Dmin d d') = Dmin (Dplus d'' d) (Dplus d'' d').
Lemma Dle_neg : forall d : D, Dle Dz d = true -> Dle (Dneg d) Dz = true.
Lemma Dle_neg_2 : forall d : D, Dle d Dz = true -> Dle Dz (Dneg d) = true.
Lemma Dnotle_not_eq : forall d d' : D, Dle d d' = false -> d <> d'.
Lemma Dnotle_not_eq_sym : forall d d' : D, Dle d d' = false -> d' <> d.
Lemma D_dec : forall d d' : D, {d = d'} + {d <> d'}.
Lemma Dnotle_3_cases : forall d d' : D, {Dle d d' = false} + {d = d'} + {Dle d' d = false}.
Lemma Dle_noteq_notle : forall d d' : D, Dle d' d = true -> d <> d' -> Dle d d' = false.
Lemma Dnotle_not_refl : forall d : D, Dle d d <> false.
Lemma Dnotle_elim : forall d d' : D, Dle d' d = false -> Dle d d' = true /\ d <> d'.
Lemma Dnotle_trans : forall d d' d'' : D, Dle d d' = false -> Dle d' d'' = false -> Dle d d'' = false.
Lemma Dnotle_le_1 : forall d d' : D, Dle d d' = false -> Dle d' d = true.
Lemma Dmin_le_distr_l : forall d d' d'' : D, Dle (Dmin d d') d'' = Dle d d'' || Dle d' d''.
Lemma Dmin_choice : forall d d' : D, {Dmin d d' = d} + {Dmin d d' = d'}.
Lemma Dnotle_noteq : forall d d' : D, Dle d d' = false -> d <> d'.
Lemma Dneg_plus : forall d d' : D, Dneg (Dplus d d') = Dplus (Dneg d') (Dneg d).
Lemma Dneg_le : forall d d' : D, Dle d d' = true -> Dle (Dneg d') (Dneg d) = true.
Lemma Dnotle_plus_mono_1 : forall d d' d'' d''' : D, Dle d' d = true -> Dle d'' d''' = false -> Dle (Dplus d d'') (Dplus d' d''') = false.
Lemma Dnotle_plus_mono : forall d d' d'' d''' : D, Dle d d' = false -> Dle d'' d''' = false -> Dle (Dplus d d'') (Dplus d' d''') = false.