Skip to content

Commit f1bcddc

Browse files
committed
adherence value, extracted seq, limit point
1 parent 7602bb7 commit f1bcddc

4 files changed

Lines changed: 188 additions & 0 deletions

File tree

CHANGELOG_UNRELEASED.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,16 @@
3434
+ definition `cut`
3535
+ lemmas `cut_adjacent`, `infinite_bounded_limit_point_nonempty`
3636

37+
- in `normed_module.v`:
38+
+ lemma `limit_point_setD`
39+
40+
- in `reals.v`:
41+
+ lemma `nat_has_minimum`
42+
43+
- in `sequences.v`:
44+
+ definition `adherence_value`
45+
+ lemmas `adherence_value_cvg`, `limit_point_adherence_value`
46+
3747
### Changed
3848

3949
- in `charge.v`:

reals/reals.v

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,18 @@ rewrite (le_trans _ (lbBi _ Bk)) //.
656656
by move/negP : i1x; rewrite -ltNge ltzD1.
657657
Qed.
658658

659+
Lemma nat_has_minimum (A : set nat) : A !=set0 ->
660+
exists j, A j /\ forall k, A k -> (j <= k)%N.
661+
Proof.
662+
move=> A0.
663+
pose B : set int := [set x%:~R | x in A].
664+
have B0 : B !=set0 by case: A0 => a Aa; exists a%:~R, a.
665+
have : lbound B 0 by move=> _ [b0 Bb0 <-]; rewrite ler0z.
666+
move/(int_lbound_has_minimum B0) => [_ [[i Ai <-]]] Bi.
667+
exists i; split => // k Bk.
668+
by have := Bi k%:~R; rewrite ler_int; apply; exists k.
669+
Qed.
670+
659671
Section rat_in_itvoo.
660672

661673
Let bound_div (R : archiRealFieldType) (x y : R) : nat :=

theories/normedtype_theory/normed_module.v

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,6 +1096,14 @@ move=> p q _ _ /=; apply: contraPP => /eqP.
10961096
by rewrite neq_lt => /orP[] /arv /[swap] ->; rewrite ltxx.
10971097
Qed.
10981098

1099+
Lemma limit_point_setD {R : archiRealFieldType} (A V : set R) a :
1100+
finite_set V -> limit_point A a -> limit_point (A `\` V) a.
1101+
Proof.
1102+
move=> finV /limit_point_infinite_setP aA.
1103+
apply/limit_point_infinite_setP => U aU.
1104+
by rewrite setIDA; apply: infinite_setD => //; exact: aA.
1105+
Qed.
1106+
10991107
Lemma EFin_lim (R : realFieldType) (f : nat -> R) : cvgn f ->
11001108
limn (EFin \o f) = (limn f)%:E.
11011109
Proof.

theories/sequences.v

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ From mathcomp Require Import ereal topology tvs normedtype landau.
5757
(* is convergent and its limit is sup u_n *)
5858
(* nonincreasing_cvgn u_ == if u_ is nonincreasing u_ and bound by below *)
5959
(* then u_ is convergent *)
60+
(* adherence_value u_ a == a is an adherence value of the sequence u_ *)
6061
(* adjacent_seq == adjacent sequences lemma *)
6162
(* cesaro == Cesaro's lemma *)
6263
(* ``` *)
@@ -2671,6 +2672,163 @@ apply: nondecreasing_cvgn_le; last exact: is_cvg_geometric_series.
26712672
by apply: nondecreasing_series => ? _ /=; rewrite pmulr_lge0 // exprn_gt0.
26722673
Qed.
26732674

2675+
Definition adherence_value {R : numDomainType} (u_ : R^nat) (a : R) :=
2676+
forall (e : R) n, e > 0 -> exists2 p, (p >= n)%N & `|u_ p - a| <= e.
2677+
2678+
Section adherence_value_cvg.
2679+
Context {R : realType}.
2680+
Variables (u_ : R^nat) (a : R).
2681+
2682+
(* We build a sequence of increasing positive indices N_k s.t.
2683+
|u_N_k - a| <= 1/k where N_k is the smallest natural number of the set
2684+
A(N, k) defined below. *)
2685+
2686+
Let A N k := [set j | (j > N)%N /\ `|u_ j - a| <= k.+1%:R^-1].
2687+
2688+
Let elt_prop Nk :=
2689+
[/\ `|u_ Nk.1 - a| <= Nk.2%:R^-1, A Nk.1 Nk.2 !=set0 & (0 < Nk.2)%N].
2690+
2691+
Let elt_type := {x : nat * nat | elt_prop x}.
2692+
2693+
Let N_ (x : elt_type) := (proj1_sig x).1.
2694+
2695+
Let idx_ (x : elt_type) := (proj1_sig x).2.
2696+
2697+
Let N_idx x : `|u_ (N_ x) - a| <= (idx_ x)%:R^-1.
2698+
Proof. by move: x => [[? ?]] []. Qed.
2699+
2700+
Let A_nonempty x : A (N_ x) (idx_ x) !=set0.
2701+
Proof. by move: x => [[? ?]] []. Qed.
2702+
2703+
Let elt_rel i j := [/\ (idx_ j = (idx_ i).+1),
2704+
(N_ j > N_ i)%N & N_ j = proj1_sig (cid (nat_has_minimum (A_nonempty i)))].
2705+
2706+
Let N_incr v k p : (forall n, elt_rel (v n) (v n.+1)) ->
2707+
(k < p)%N -> (N_ (v k) < N_ (v p))%N.
2708+
Proof.
2709+
move=> vrel kp.
2710+
have {}Nv n : (N_ (v n) < N_ (v n.+1))%O by have [_] := vrel n.
2711+
by move/increasing_seqP/leqW_mono : Nv => ->.
2712+
Qed.
2713+
2714+
Let idx_incr v n : (forall n, elt_rel (v n) (v n.+1)) -> (n <= idx_ (v n))%N.
2715+
Proof.
2716+
by move=> vrel; elim: n => // n /leq_ltn_trans; apply; have [->] := vrel n.
2717+
Qed.
2718+
2719+
Let adherence_value_cvg_direct : adherence_value u_ a ->
2720+
exists2 f : nat -> nat, increasing_seq f & (u_ \o f @ \oo --> a).
2721+
Proof.
2722+
move=> u_a.
2723+
have [N0 N01] : {N0 | `| u_ N0 - a | <= 1^-1}.
2724+
by move: u_a => /(_ 1 1 ltr01)/cid2[N1 _] N1a1; exists N1; rewrite invr1.
2725+
have A0 : A N0 1 !=set0.
2726+
move: u_a => /(_ 2^-1 N0.+1).
2727+
by rewrite invr_gt0// ltr0n => /(_ isT)[j N0j j1]; exists j.
2728+
have [v [v0 vrel]] : {v : nat -> elt_type |
2729+
v 0 = exist elt_prop (N0, 1) (And3 N01 A0 isT) /\
2730+
forall n, elt_rel (v n) (v n.+1) }.
2731+
apply: dependent_choice => // -[[N i] /=] [uNi ANi0 i0].
2732+
pose M := proj1_sig (cid (nat_has_minimum ANi0)).
2733+
have Mi1 : `|u_ M - a| <= i.+1%:R^-1 by rewrite /M; case: cid => /= x [[]].
2734+
have AMi1 : A M i.+1 !=set0.
2735+
move: u_a => /(_ i.+2%:R^-1 M.+1).
2736+
by rewrite invr_gt0// ltr0n => /(_ isT)/cid2[m nm um]; exists m.
2737+
exists (exist elt_prop (M, i.+1) (And3 Mi1 AMi1 isT)).
2738+
rewrite /elt_rel/= /N_/=; split; first exact.
2739+
- by rewrite /M; case: cid => // x [[]].
2740+
- rewrite /M; case: cid => // x [/= ANix ANi].
2741+
case: cid => //= y [/ANi xy] /(_ _ ANix) yx.
2742+
by apply/eqP; rewrite eq_le leEnat xy yx.
2743+
exists (N_ \o v \o S).
2744+
by apply/increasing_seqP => n; exact: N_incr.
2745+
apply/subr_cvg0/cvgrPdist_le => /= e e0; near=> n.
2746+
rewrite sub0r normrN (le_trans (N_idx (v n.+1)))//.
2747+
rewrite invf_ple ?posrE//; last by rewrite ltr0n; case: (v n.+1) => -[? ?] [].
2748+
rewrite (@le_trans _ _ n.+1%:R)//; last by rewrite ler_nat idx_incr.
2749+
by rewrite -nat1r -lerBlDl; near: n; exact: nbhs_infty_ger.
2750+
Unshelve. all: end_near. Qed.
2751+
2752+
Lemma adherence_value_cvg : adherence_value u_ a <->
2753+
exists2 f : nat -> nat, increasing_seq f & (u_ \o f @ \oo --> a).
2754+
Proof.
2755+
split => // -[f incrf] /cvgrPdist_le/= + e n e0.
2756+
move=> /(_ _ e0)[N _ {}Nauf].
2757+
exists (f (n + N)); last by rewrite distrC Nauf//= leq_addl.
2758+
rewrite (@leq_trans (f n))//.
2759+
elim: n => // n; rewrite -ltnS => /leq_trans; apply.
2760+
by move/increasing_seqP : incrf; exact.
2761+
by rewrite -leEnat incrf leq_addr.
2762+
Qed.
2763+
2764+
Lemma limit_point_adherence_value :
2765+
limit_point (range u_) a -> adherence_value u_ a.
2766+
Proof.
2767+
pose U := range u_.
2768+
pose V i := [set u_ k | k in `I_i].
2769+
have finV i : finite_set (V i) by exact/finite_image/finite_II.
2770+
(* we pick up elements u_N_k from the following set: *)
2771+
pose aU k := `]a - k.+1%:R^-1, a + k.+1%:R^-1[ `&` ((U `\` V k) `\ a).
2772+
move=> u_a.
2773+
have aU0 k : aU k !=set0.
2774+
have /(limit_pointP _ _).1 [a_ [au a_a]] := limit_point_setD (finV k) u_a.
2775+
move/cvgrPdist_lt => /(_ k.+1%:R^-1).
2776+
rewrite invr_gt0 ltr0n => /(_ isT)[N _ a_cvg].
2777+
exists (a_ N); split; first by rewrite /= in_itv/= -ltr_distlC a_cvg/=.
2778+
split; last exact/eqP.
2779+
split; first by have /au[] := imageT a_ N.
2780+
by case => x xk uxaN; have /au[_] := imageT a_ N; apply => /=; exists x.
2781+
have idx_aU k : exists N1, u_ N1 \in aU k.
2782+
have [/= y [/= a1y [[[m _ umy] Uny] ya]]] := aU0 k.
2783+
exists m; rewrite inE /aU umy; split => //=; split => //; split => //.
2784+
by exists m.
2785+
have [N0 N01] : {N0 | `| u_ N0 - a | <= 1^-1}.
2786+
apply/cid; have [a_ [au a_a]] := (limit_pointP _ _).1 u_a.
2787+
move/cvgrPdist_le => /(_ _ ltr01)[N _] /(_ _ (leqnn N)) aaN1.
2788+
have /au[x _ uxaN] := imageT a_ N.
2789+
by exists x; rewrite uxaN distrC invr1.
2790+
have A0 : A N0 1 !=set0.
2791+
have [N1] := idx_aU N0.+1.
2792+
rewrite inE => -[/= uN1 [[[x _ uxuN1] /= VN0N1] uN1_a]].
2793+
exists x; split.
2794+
by rewrite ltnNge; apply/negP => xN0; apply: VN0N1; exists x.
2795+
move: uN1; rewrite in_itv/= -ltr_distlC uxuN1 distrC => /ltW/le_trans; apply.
2796+
by rewrite lef_pV2 ?posrE// ler_nat.
2797+
have [v [v0 vrel]] : {v : nat -> elt_type |
2798+
v 0%N = exist elt_prop (N0, 1) (And3 N01 A0 isT) /\
2799+
forall n, elt_rel (v n) (v n.+1) }.
2800+
apply: dependent_choice => // -[[N i] /=] [uNi ANi0 i0].
2801+
pose M := proj1_sig (cid (nat_has_minimum ANi0)).
2802+
have M0 : (0 < M)%N.
2803+
by rewrite /M; case: cid => //= x [[+ _] _]; exact: leq_trans.
2804+
have Mi1 : `|u_ M - a| <= i.+1%:R^-1 by rewrite /M; case: cid => /= x [[]].
2805+
have AMi1 : A M i.+1 !=set0.
2806+
have [N1] := idx_aU (maxn i.+1 M.+1).
2807+
rewrite inE => -[/= uN1 [[[x _ uxuN2] /= Vi1M1] uN1_a]].
2808+
have Mx : (M < x)%N.
2809+
rewrite ltnNge; apply/negP => xM.
2810+
by apply: Vi1M1; exists x => //; rewrite /(`I_ _) leq_max !ltnS xM orbT.
2811+
exists x; split => //.
2812+
move: uN1; rewrite in_itv -ltr_distlC uxuN2 distrC => /ltW/le_trans; apply.
2813+
by rewrite lef_pV2 ?posrE// ler_nat ltnS leq_max ltnSn.
2814+
exists (exist elt_prop (M, i.+1) (And3 Mi1 AMi1 isT)).
2815+
rewrite /elt_rel/= /N_/=; split; first exact.
2816+
- by rewrite /M; case: cid => // x [[]].
2817+
- rewrite /M; case: cid => // x [ANix ANi]/=.
2818+
case: cid => //= y; rewrite /idx_/= => -[/ANi xy /(_ _ ANix) yx].
2819+
by apply/eqP; rewrite eq_le leEnat xy yx.
2820+
apply/adherence_value_cvg; exists (N_ \o v).
2821+
by apply/increasing_seqP => n; exact: N_incr.
2822+
apply/cvgrPdist_le => /= e e0; near=> n.
2823+
have := N_idx (v n); rewrite distrC => /le_trans; apply.
2824+
rewrite invf_ple//; last first.
2825+
by rewrite posrE ltr0n; case: (v n) => [[? ?] []].
2826+
rewrite (@le_trans _ _ n%:R)//; last by rewrite ler_nat idx_incr.
2827+
by near: n; exact: nbhs_infty_ger.
2828+
Unshelve. all: end_near. Qed.
2829+
2830+
End adherence_value_cvg.
2831+
26742832
Section adjacent_cut.
26752833
Context {R : realType}.
26762834
Implicit Types L D E : set R.

0 commit comments

Comments
 (0)