From Coq Require Export Qreals.
Local Close Scope Q_scope.
Local Close Scope R_scope.
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'.
Local Notation " ' x " := (Zpos x) (at level 20, no associativity) : Z_scope.
Fixpoint pos_power2 (n:nat) : positive := match n with
| O => 1%positive
| S m => ((pos_power2 m)~0)%positive
end.
Definition dr2Q (x:dyadic_rational) : Q :=
match x with
| m_over_2_to_n m n => (Z_of_nat m) # (pos_power2 n)
end.
Local Open Scope Q_scope.
Open Scope R_scope.

Lemma dyadic_rationals_dense_in_reals: forall x y:R,
0 <= x < y -> exists q:dyadic_rational,
x < Q2R (dr2Q q) < y.