Skip to content

Commit 36a05fe

Browse files
committed
bolzano-weierstrass
1 parent 3ff0f75 commit 36a05fe

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed

theories/sequences.v

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2956,6 +2956,97 @@ Qed.
29562956

29572957
End 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+
29593050
Section banach_contraction.
29603051

29613052
Context {R : realType} {X : completeNormedModType R} (U : set X).

0 commit comments

Comments
 (0)