Set Asymmetric Patterns.
(* define nonnegative dyadic rationals *)
Inductive dyadic_rational : Type :=
| m_over_2_to_n: forall m n:nat, dyadic_rational.
Inductive dr_eq : dyadic_rational -> dyadic_rational -> Prop :=
| dr_eq_refl: forall x:dyadic_rational, dr_eq x x
| dr_eq_sym: forall x y:dyadic_rational, dr_eq x y -> dr_eq y x
| dr_eq_trans: forall x y z:dyadic_rational,
dr_eq x y -> dr_eq y z -> dr_eq x z
| dr_eq_scale: forall (m n:nat),
dr_eq (m_over_2_to_n m n)
(m_over_2_to_n (2*m) (S n)).
Inductive dr_lt : dyadic_rational -> dyadic_rational -> Prop :=
| intro_dr_lt: forall m m' n:nat, m < m' ->
dr_lt (m_over_2_to_n m n) (m_over_2_to_n m' n)
| dr_lt_wd: forall x x' y y':dyadic_rational,
dr_lt x y -> dr_eq x x' -> dr_eq y y' -> dr_lt x' y'.

Lemma dr_total_order: forall x y:dyadic_rational,
dr_lt x y \/ dr_eq x y \/ dr_lt y x.