Section cluster_point_subnet.
Variable x0:point_set X.
Hypothesis x0_cluster_point: net_cluster_point x x0.
Hypothesis I_nonempty: inhabited (DS_set I).
Record cluster_point_subnet_DS_set : Type := {
cps_i:DS_set I;
cps_U:Ensemble (point_set X);
cps_U_open_neigh: open_neighborhood cps_U x0;
cps_xi_in_U: In cps_U (x cps_i)
}.
Definition cluster_point_subnet_DS_ord
(iU1 iU2 : cluster_point_subnet_DS_set) : Prop :=
DS_ord (cps_i iU1) (cps_i iU2) /\
Included (cps_U iU2) (cps_U iU1).
Definition cluster_point_subnet_DS : DirectedSet.
refine (Build_DirectedSet
cluster_point_subnet_DS_set
cluster_point_subnet_DS_ord
_ _).
- constructor.
+ red. intros.
split; auto with sets.
apply preord_refl.
apply DS_ord_cond.
+ red. intros.
destruct H, H0.
red. split; auto with sets.
apply preord_trans with (cps_i y); trivial.
apply DS_ord_cond.
- intros.
destruct i as [i0 U0 ? ?].
destruct j as [i1 U1 ? ?].
destruct (DS_join_cond i0 i1).
destruct H.
pose proof (x0_cluster_point
(Intersection U0 U1)).
match type of H1 with | _ -> _ -> ?C =>
assert C end.
{ apply H1.
- apply open_intersection2;
(apply cps_U_open_neigh0 ||
apply cps_U_open_neigh1).
- constructor.
+ apply cps_U_open_neigh0.
+ apply cps_U_open_neigh1. }
destruct (H2 x1), H3.
pose (ki := x2).
pose (kU := Intersection U0 U1).
assert (open_neighborhood kU x0).
{ split.
- apply open_intersection2.
+ apply cps_U_open_neigh0.
+ apply cps_U_open_neigh1.
- constructor.
+ apply cps_U_open_neigh0.
+ apply cps_U_open_neigh1. }
assert (In kU (x ki)) by trivial.
exists (Build_cluster_point_subnet_DS_set
ki kU H5 H6).
split; red; simpl; split.
+ apply preord_trans with x1; trivial.
apply DS_ord_cond.
+ red. intros.
now destruct H7.
+ apply preord_trans with x1; trivial.
apply DS_ord_cond.
+ red. intros.
now destruct H7.
Defined.
Definition cluster_point_subnet : Net
cluster_point_subnet_DS X :=
fun (iU:DS_set cluster_point_subnet_DS) =>
x (cps_i iU).

Lemma net_cluster_point_impl_subnet_converges:
exists J:DirectedSet, exists y:Net J X,
Subnet y /\ net_limit y x0.