@@ -2956,6 +2956,97 @@ Qed.
29562956
29572957End adjacent_cut.
29582958
2959+ Section bw.
2960+ Context {R : realType}.
2961+
2962+ Lemma finite_range_cst (u_ : R^nat) : finite_set (range u_) ->
2963+ exists N, exists2 A, infinite_set A & (forall k, A k <-> u_ k = u_ N).
2964+ Proof .
2965+ case=> n; elim: n => [|n ih] in u_ *.
2966+ by rewrite card_eq_sym => /card_set_bijP[/= f [_ _ /(_ _ (imageT u_ 0))[]]].
2967+ move/eq_cardSP => -[r [N _ uNr]] urn.
2968+ apply: assume_not => /forallNP/(_ N) uN.
2969+ have {uN}[B finB BuN] : exists2 B, finite_set B &
2970+ (forall k, B k <-> u_ k = u_ N).
2971+ exists (u_ @^-1` [set u_ N]); last by move=> k; split.
2972+ by apply: contrapT => u_N; apply: uN; eexists; [exact: u_N|by []].
2973+ have [M BM] : exists M, ~ B M.
2974+ apply/existsNP => allB.
2975+ move: finB; rewrite (_ : B = setT); first exact/infinite_nat.
2976+ by rewrite -subTset => x _; exact: allB.
2977+ have uMuN : u_ M != u_ N by apply: contra_not_neq BM; exact: (BuN _).2.
2978+ pose v_ k := if k \in B then u_ M else u_ k.
2979+ have /ih[k [A infA Ak]] : (range v_ #= `I_n)%card.
2980+ suff : range v_ = (range u_) `\ u_ N by move=> ->; rewrite uNr.
2981+ apply/seteqP; split=> [_ [y] _ <-|_ [[y _ <-]] uyuN]; rewrite /v_.
2982+ - case: ifPn => [yB|]; first by split; [exists M|exact/eqP].
2983+ by rewrite notin_setE => /BuN.
2984+ - by exists y => //; case: ifPn => // /set_mem /BuN.
2985+ have [Bk|Bk] := pselect (B k).
2986+ - exists M, (A `\` B); [exact: infinite_setD|move=> m; split=> [[+ Bm]|]].
2987+ + by move/(Ak _).1; rewrite /v_ memNset// mem_set.
2988+ + apply: contraPP; rewrite -[~ _]/((~` (_ `\` _)) m) setCD => -[|/BuN ->].
2989+ * have /iff_not2[+ _] := Ak m.
2990+ by move/[apply]; rewrite /v_; case: ifPn => mB; rewrite mem_set// eqxx.
2991+ * exact/nesym/eqP.
2992+ - exists k, (A `\` B); [exact: infinite_setD|move=> m].
2993+ split=> [[+ Bm]|]; first by move/(Ak _).1; rewrite /v_ memNset// memNset.
2994+ apply: contraPP; rewrite -[~ _]/((~` (_ `\` _)) m) setCD => -[|Bm].
2995+ + have /iff_not2[+ _] := Ak m.
2996+ move=> /[apply]; rewrite /v_; case: ifPn => mB; rewrite memNset//.
2997+ by move: mB Bk => /set_mem /BuN -> /BuN /nesym.
2998+ + have /iff_not2[+ _] := BuN k.
2999+ by move=> /(_ Bk); apply: contra_not; rewrite ((BuN m).1 Bm).
3000+ Qed .
3001+
3002+ Lemma injectiveT_ltn (A : set nat) (f : {injfun [set: nat] >-> A}) (n : nat) :
3003+ exists m, (n < f m)%N.
3004+ Proof .
3005+ elim: n => [|n [m ih]].
3006+ apply/not_existsP => f_le0.
3007+ have /(_ 0 1 (in_setT _) (in_setT _)) : set_inj setT f by [].
3008+ have /negP := f_le0 0; rewrite -leqNgt leqn0 => /eqP ->.
3009+ have /negP := f_le0 1; rewrite -leqNgt leqn0 => /eqP ->.
3010+ by move=> /(_ erefl)/esym; exact/eqP/oner_neq0.
3011+ apply/not_existsP => f_leS.
3012+ have {}f_leS x : (f x <= n.+1)%N by rewrite leqNgt; exact/negP/f_leS.
3013+ have /subset_card_le : f @` `I_n.+3 `<=` `I_n.+2.
3014+ by move=> /= _ [y] yn3 <-; rewrite ltnS f_leS.
3015+ by rewrite (card_ge_image f)// card_le_II ltnn.
3016+ Qed .
3017+
3018+ Lemma finite_range_cvg (x_ : R ^nat) : finite_set (range x_) ->
3019+ exists2 f : nat -> nat, increasing_seq f & cvgn (x_ \o f).
3020+ Proof .
3021+ move=> /finite_range_cst[k [A /infiniteP/pcard_leP/unsquash f Ak]].
3022+ have : forall n, {y | (n < y)%N /\ A y}.
3023+ move=> n; apply/cid.
3024+ have [m xfm] : exists m, (n < f m)%N by exact: injectiveT_ltn.
3025+ by exists (f m); split => //; exact: funS.
3026+ move/dependent_choice => /(_ 0)[g [g00 gincr]].
3027+ exists g; first by apply/increasing_seqP => n; exact: (gincr _).1.
3028+ apply/cvg_ex; exists (x_ k); apply/cvgrPdist_le => /= e e0.
3029+ near=> n.
3030+ have := (gincr n.-1).2; rewrite prednK; last by near: n; by exists 1%N.
3031+ by move/(Ak (g n)).1 => ->; rewrite subrr normr0 ltW.
3032+ Unshelve. all: end_near. Qed .
3033+
3034+ Theorem bolzano_weierstrass (u_ : R^nat):
3035+ bounded_fun u_ -> exists2 f : nat -> nat, increasing_seq f & cvgn (u_ \o f).
3036+ Proof .
3037+ move=> bnd_u; set U := range u_.
3038+ have bndU : bounded_set U.
3039+ case: bnd_u => N [Nreal Nu_].
3040+ by exists N; split => // x /Nu_ {}Nu_ /= y [x0 _ <-]; exact: Nu_.
3041+ have [/finite_range_cvg//|infU] := pselect (finite_set U).
3042+ have [/= l Ul] := infinite_bounded_limit_point_nonempty infU bndU.
3043+ have x_l := limit_point_adherence_value Ul.
3044+ have [+ _] := adherence_value_cvg u_ l.
3045+ by move=> /(_ x_l)[f fi fl]; exists f => //; apply/cvg_ex; exists l.
3046+ Qed .
3047+
3048+ End bw.
3049+
29593050Section banach_contraction.
29603051
29613052Context {R : realType} {X : completeNormedModType R} (U : set X).
0 commit comments