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'.

(* Specifications: *)
Lemma dr_incr_denom: forall (m n n':nat), n<=n' ->
exists m':nat, dr_eq (m_over_2_to_n m' n')
(m_over_2_to_n m n).
Lemma dr_total_order: forall x y:dyadic_rational,
dr_lt x y \/ dr_eq x y \/ dr_lt y x.