Definition packaged_expand_U_dyadic :
{ f:nat->Ensemble (point_set X) |
(forall m:nat, open (f m)) /\
(forall m:nat, Included (closure (f m)) (f (S m))) } ->
{ f:nat->Ensemble (point_set X) |
(forall m:nat, open (f m)) /\
(forall m:nat, Included (closure (f m)) (f (S m))) }.
refine (fun fsig => match fsig with
| exist f (conj Hopen Hincr as a) => exist _ (expand_U_dyadic f Hopen Hincr) _
end).
destruct a.
split.
apply expand_U_dyadic_open.
apply expand_U_dyadic_incr.
Defined.
Definition U_dyadic_level_n (n:nat) :
{ f:nat->Ensemble (point_set X) |
(forall m:nat, open (f m)) /\
(forall m:nat, Included (closure (f m)) (f (S m))) }.
refine (let lev_n := fix lev_n (n:nat) :
{ f:nat->Ensemble (point_set X) |
(forall m:nat, open (f m)) /\
(forall m:nat, Included (closure (f m)) (f (S m))) } :=
match n with
| O => exist _ Un _
| S n' => packaged_expand_U_dyadic (lev_n n')
end in lev_n n).
split.
apply Un_open.
apply Un_incr.
Defined.
Definition U_dyadic (x:dyadic_rational) :
Ensemble (point_set X) :=
match x with
| m_over_2_to_n m n => (proj1_sig (U_dyadic_level_n n)) m
end.

(* Specifications: *)
Lemma U_dyadic_wd: forall x y:dyadic_rational, dr_eq x y ->
U_dyadic x = U_dyadic y.
Lemma U_dyadic_open: forall x:dyadic_rational,
open (U_dyadic x).
Lemma U_dyadic_incr: forall x y:dyadic_rational, dr_lt x y ->
Included (closure (U_dyadic x)) (U_dyadic y).