From 5835607da447353cfb56f4b0034c9c64f6f83f9c Mon Sep 17 00:00:00 2001 From: Lionel Blatter Date: Tue, 31 Mar 2026 00:28:05 +0200 Subject: [PATCH 01/21] Add missing lemmas for distr --- _CoqProject | 1 + experimental_reals/distr.v | 229 +++++++++++++ experimental_reals/edistr.v | 103 ++++++ experimental_reals/realsum.v | 81 ++++- rocq-mathcomp-experimental-reals.opam | 1 + theories/esum.v | 442 ++++++++++++++++++++++++++ 6 files changed, 855 insertions(+), 2 deletions(-) create mode 100644 experimental_reals/edistr.v diff --git a/_CoqProject b/_CoqProject index f0b745c7f6..5da7e51a7b 100644 --- a/_CoqProject +++ b/_CoqProject @@ -39,6 +39,7 @@ experimental_reals/discrete.v experimental_reals/realseq.v experimental_reals/realsum.v experimental_reals/distr.v +experimental_reals/edistr.v reals_stdlib/Rstruct.v reals_stdlib/nsatz_realtype.v diff --git a/experimental_reals/distr.v b/experimental_reals/distr.v index 26f82b3ef8..2bbac0aae7 100644 --- a/experimental_reals/distr.v +++ b/experimental_reals/distr.v @@ -8,6 +8,7 @@ From mathcomp Require Import all_ssreflect_compat all_algebra. From mathcomp.classical Require Import boolp classical_sets mathcomp_extra. From mathcomp Require Import xfinmap constructive_ereal reals discrete. From mathcomp Require Import realseq realsum. +From mathcomp Require Import fsbigop. Set Implicit Arguments. Unset Strict Implicit. @@ -1266,3 +1267,231 @@ End Jensen. Notation convex f := (convexon \-inf \+inf f). (* -------------------------------------------------------------------- *) + +Section mono. + Context + {R : realType} + {T : choiceType} + {f : nat -> distr R T} + (hmono : (forall n m : nat, (n <= m)%N -> forall x : T, f n x <= f m x)). + + Lemma cvg_f: forall x, exists l, ncvg (fun n => f n x) l%:E. + Proof. + move=> x; apply: ncvg_mono_bnd; first by move=> *; apply: hmono. + apply/asboolP/nboundedP => /=; exists 2%:R => //. + move=> n; rewrite ger0_norm ?ge0_mu //; apply: (@le_lt_trans _ _ 1%:R). + - by apply: le1_mu1. + by apply: ltr_nat. + Qed. + + Lemma cvg_l : exists l, forall x, ncvg (fun n => f n x) (l x)%:E. + Proof. + have wtn: forall x, exists l, `[< ncvg (fun n => f n x) l%:E >]. + - by move=> x; apply/exists_asboolP/asboolP/cvg_f. + exists (fun x => xchoose (wtn x)) => x. + by apply/asboolP/(xchooseP (wtn x)). + Qed. +End mono. + +Section mono_sum. + Context + {R : realType} + {T : choiceType} + {f : nat -> distr R T} + (hmono : (forall n m : nat, (n <= m)%N -> forall x : T, f n x <= f m x)). + + Lemma mono_psum_Efn (E: T -> R): + (forall m, 0 <= E m)%R -> + (forall n, summable (fun x => E x * f n x)) -> + forall m n, (m <= n)%N -> + psum (fun x => E x * f m x) <= psum (fun x => E x * f n x). + Proof. + move=> hE smb_Efn m n le_mn. + apply /le_psum /smb_Efn. + move => x; rewrite mulr_ge0 //=. + by apply: ler_pM => //; apply: hmono. + Qed. + + Lemma ncvg_lp (E: T -> R) r: + (forall m, 0 <= E m)%R -> + (forall n, summable (fun x => E x * f n x)) -> + (forall n : nat, psum (fun x => E x * f n x) <= r) -> + exists lp, ncvg (fun n => psum (fun x => E x * f n x)) lp%:E. + Proof. + move => He smb_Efn h. + have hr : (0 <= r)%R. + - apply: (le_trans (y:= psum (fun x => E x * f 0 x))). + - by apply: ge0_psum. + by apply: h. + apply: ncvg_mono_bnd ; first by apply: mono_psum_Efn. + apply/asboolP/nboundedP => /=. + exists (r + 1). + - by apply ltr_wpDl. + move => n; rewrite ger0_norm 1?ge0_psum //; apply/(le_lt_trans (y := r)). + - apply h. + by apply ltr_pwDr. + Qed. + + Lemma sum_dlim_r [E : T -> R] [r : R]: + summable E -> + (forall m, 0 <= E m)%R -> + (forall (n : nat), psum (fun x : T => E x * f n x) <= r)%R -> + (psum (fun x : T => E x * (\dlim_(n) f n) x) <= r)%R. + Proof. + move => smb_E hE h. + have [l cvgfx]:= @cvg_l R T f hmono. + have ge0_l: forall x, 0 <= l x. + - by move=> x; apply: (ncvg_geC _ (cvgfx x)) => n; apply: ge0_mu. + have cvgEfx: forall x, ncvg (fun n => E x * f n x) (E x * l x)%:E. + - by move=> x; apply/ncvgZ. + rewrite (@eq_psum _ _ _ (fun x => fine (nlim (fun n => E x * f n x)))). + - move => x /=; rewrite dlimE (nlimE (cvgfx x)) /=. + by have /(ncvgZ (c := E x)) /nlimE -> /= := cvgfx x. + rewrite (@eq_psum _ _ _ (fun x => E x * l x)). + - by move=> x /=; have /(ncvgZ (c := E x)) /nlimE -> := cvgfx x. + apply: psum_le => J uqJ. + have ncvgJ: ncvg (fun n => \sum_(j <- J) E j * f n j) (\sum_(j <- J) E j * (l j))%:E. + - by apply: (ncvg_mono_sum cvgEfx). + have smb_Efn: forall n, summable (fun x => E x * f n x). + - move=> n; apply summableM. + exact: smb_E. + apply summable_mu. + have [lp ncvg_lp] := @ncvg_lp _ r hE smb_Efn h. + have le1_lp: lp <= r. + - apply: (@ncvg_leC _ r _ _ _ ncvg_lp). + exact : h. + apply: (le_trans (y :=fine (nlim (fun n : nat => \sum_(j <- J) E j * f n j)))). + - rewrite (nlimE ncvgJ) /=; apply: ler_sum => x _. + rewrite ger0_norm; auto. + by apply mulr_ge0. + rewrite (nlimE ncvgJ) /=. + apply (le_trans (y:= lp)). + - apply: (ncvg_le _ ncvg_lp ncvgJ) => n. + apply/(le_trans _): (ger_big_psum uqJ (smb_Efn n)). + by apply/ler_sum => x _; apply/ler_norm. + exact: le1_lp. + Qed. + + Lemma sum_dlim (E : pred T) : + psum (fun x : T => (E x)%:R * (\dlim_(n) f n) x) = + fine (nlim (fun n => psum (fun x : T => (E x)%:R * f n x))). + Proof. + have [l cvgfx]:= @cvg_l R T f hmono. + have cvgEfx: forall x, ncvg (fun n => (E x)%:R * f n x) ((E x)%:R * l x)%:E. + - by move=> x; apply/ncvgZ. + have ge0_l: forall x, 0 <= l x. + - by move=> x; apply: (ncvg_geC _ (cvgfx x)) => n; apply: ge0_mu. + transitivity (psum (fun x => fine (nlim (fun n => (E x)%:R * f n x)))). + - apply: eq_psum => x /=; rewrite dlimE (nlimE (cvgfx x)) /=. + by have /(ncvgZ (c := (E x)%:R)) /nlimE -> /= := cvgfx x. + transitivity (psum (fun x => (E x)%:R * l x)); first apply: eq_psum. + - by move=> x /=; have /(ncvgZ (c := (E x)%:R)) /nlimE -> := cvgfx x. + have smb_Efn: forall n, summable (fun x => (E x)%:R * f n x). + - by move=> n; apply: (summable_pr E (f n)). + have le1_psum_Efn: forall n, psum (fun x => (E x)%:R * f n x) <= 1. + - by move=> n; apply/le1_pr. + have hE: forall x : T, 0 <= (E x)%:R. by auto. + have [lp ncvg_lp] := @ncvg_lp _ _ (hE R) smb_Efn le1_psum_Efn. + have le1_lp: lp <= 1. + - by move/ncvg_leC: ncvg_lp; apply; apply/le1_psum_Efn. + have smb_Ef: summable (fun x => (E x)%:R * l x). + - exists 1 => J; rewrite -(finmap.big_seq_fsetE _ _ predT (fun x => `|(E x)%:R * l x|)) /=. + apply: (le_trans (y := \sum_(x <- finmap.enum_fset J) (l x))). + - apply: ler_sum => /= j _; rewrite ger0_norm 1?mulr_ge0 //. + by apply: ler_piMl => //; case: (E _). + have: ncvg (fun n => \sum_(x <- finmap.enum_fset J) (f n x)) (\sum_(x <- finmap.enum_fset J) l x)%:E. + - by apply: ncvg_mono_sum. + move/ncvg_leC => /(_ 1); apply => n /=. + have /gerfin_psum := summable_mu (f n) => /(_ J). + move/le_trans => /= /(_ _ (le1_mu (f n))); apply/le_trans. + by rewrite finmap.big_seq_fsetE; apply: ler_sum => j _ /=; apply/ler_norm. + apply/eqP; rewrite eq_le; apply/andP; split. + - apply: psum_le => J uqJ. + have ncvgJ: + ncvg (fun n => \sum_(j <- J) (E j)%:R * f n j) (\sum_(j <- J) (E j)%:R * (l j))%:E. + - by apply: (ncvg_mono_sum cvgEfx). + apply: (le_trans (y := fine (nlim (fun n => \sum_(j <- J) (E j)%:R * f n j)))); last first. + - rewrite (nlimE ncvgJ) (nlimE ncvg_lp) /=. + apply: (ncvg_le _ ncvg_lp ncvgJ) => n. + apply/(le_trans _): (ger_big_psum uqJ (smb_Efn n)). + by apply/ler_sum => x _; apply/ler_norm. + rewrite (nlimE ncvgJ) /=; apply: ler_sum => x _. + by rewrite ger0_norm // mulr_ge0. + - rewrite (nlimE ncvg_lp) /=; apply: (ncvg_leC _ ncvg_lp) => n. + apply: le_psum => // x; rewrite mulr_ge0 //=. + apply: ler_pM => //; apply: (ncvg_homo_le _ (cvgfx x)). + by move=> *; apply: hmono. + Qed. + +End mono_sum. + +From mathcomp Require Import ereal esum. + +Section mono_esum. + Context + {R : realType} + {T : choiceType} + {f : nat -> distr R T} + (hmono : (forall n m : nat, (n <= m)%N -> forall x : T, f n x <= f m x)). + + Lemma mono_esum_Efn (E: T -> \bar R): + (forall m, 0 <= E m)%E -> + forall m n, (m <= n)%N -> + (esum [set:T] (fun x => E x * (f m x)%:E) <= + esum [set:T] (fun x => E x * (f n x)%:E))%E. + Proof. + move=> hE m n le_mn. + apply /esum.le_esum. + move => ??; rewrite lee_pmul => //=. + - rewrite lee_tofin //. + - rewrite lee_tofin //; exact: hmono. + Qed. + + Lemma ncvg_dlim a : ncvg (fun n : nat => f n a) ((\dlim_(n) f n) a)%:E. + Proof. + case : (dlimP (fun n => f n) a) => [l _ _ h | habs] //. + exfalso; apply habs. + apply dcvg_homo => n m hnm b. + by rewrite hmono. + Qed. + + Lemma ereal_sup_sup a : + ereal_sup (range (fun n => (f n a)%:E)) = (sup ([set r | exists n, r = (f n a) ]))%:E. + Proof. + rewrite -ereal_sup_EFin. + - exists 1%R => r //= [n ->]; exact: le1_mu1. + - exists (f 0%N a); exists 0%N => //. + - congr ereal_sup. + apply /seteqP; split. + - by move => p [n _ hn]; exists (f n a) => //; exists n. + - by move => x [_ [n ->] <- ] //=; exists n. + Qed. + + Lemma distr_lub_sup a : + ((dlim f) a)%:E = ereal_sup (range (fun n => (f n a)%:E)). + Proof. + unfold image. + rewrite ereal_sup_sup. + apply /ereal_eqP /eqP /esym; apply :nlim_sup. + - by move => n m h; rewrite hmono. + - exact: ncvg_dlim. + Qed. + + Lemma esum_dlim_r [E : T -> \bar R] [r : \bar R]: + (forall m, 0 <= E m)%E -> + (forall (n : nat), esum [set:T] (fun x : T => E x * (f n x)%:E) <= r)%E -> + (esum [set:T] (fun x : T => E x * ((\dlim_(n) f n) x)%:E) <= r)%E. + Proof. + move => hE h. + rewrite (@esum.eq_esum _ _ _ _ (fun x => ereal_sup (range (fun n => E x * (f n x)%:E)%E))). + - move => ??; rewrite distr_lub_sup. + rewrite (@esupZl_range R T (fun a b => (f b a)%:E)) //. + move => ??; rewrite lee_tofin //. + rewrite esum_esup_comm //. + - by move => ??; rewrite mule_ge0 // lee_tofin. + - by move => ????; rewrite lee_pmul // ?lee_tofin // hmono. + rewrite ge_ereal_sup//= => x [n s] <-. + apply h. + Qed. + +End mono_esum. diff --git a/experimental_reals/edistr.v b/experimental_reals/edistr.v new file mode 100644 index 0000000000..e909f369b0 --- /dev/null +++ b/experimental_reals/edistr.v @@ -0,0 +1,103 @@ +From mathcomp Require Import all_boot all_order all_algebra. +From mathcomp.classical Require Import boolp fsbigop. +From mathcomp Require Import xfinmap constructive_ereal reals discrete realseq. +From mathcomp.classical Require Import classical_sets functions. +From mathcomp.experimental_reals Require Import realsum distr. +From mathcomp.analysis Require Import esum ereal. + +Set Implicit Arguments. +Unset Strict Implicit. +Unset Printing Implicit Defensive. +Unset SsrOldRewriteGoalsOrder. + +Import Order.TTheory GRing.Theory Num.Theory. + +Local Open Scope fset_scope. +Local Open Scope ring_scope. + +(* -------------------------------------------------------------------- *) +Reserved Notation "\Ee_[ mu ] f" (at level 2, format "\Ee_[ mu ] f"). + +Section Esp. + Context {R : realType} {T : choiceType}. + + Implicit Types (mu : {distr T / R}) (f : T -> \bar R). + + Definition espe mu f := sum (fun x => mule (f x) ((mu x)%:E)). + + Notation "\Ee_[ mu ] f" := (espe mu f). +End Esp. + +Section PrCoreTheory. + Context {R : realType} {T : choiceType}. + + Implicit Types (mu : {distr T / R}) (A B E : pred T). + + Lemma exp_dunit (f : T -> \bar R) (x : T) : + espe (dunit x) f = f x. + Proof. + rewrite /espe. + rewrite (@eq_sum _ _ _ (fun y : T => if x == y then f y else 0%R)%E). + + move => x0. rewrite dunit1E. + by case (x == x0) => //=; rewrite ?mule1 ?mule0. + by rewrite sum_unit. + Qed. + + Lemma exp_cst mu r : (espe mu (fun _ => r) = (\P_[mu] predT)%:E * r)%E. + Proof. + rewrite pr_predT psum_sum /espe //. + rewrite sumZ. + - move => ?. rewrite lee_fin //. + by rewrite sum_sum // muleC. + Qed. + + Lemma exp0 mu : espe mu (fun _ => 0) = 0. + Proof. by rewrite exp_cst mule0. Qed. + + Lemma exp_dlet {U: choiceType} mu (nu : T -> {distr U / R}) F : + (forall x, 0%:E <= F x)%E -> + espe (dlet nu mu) F = espe mu (fun x => espe (nu x) F). + Proof. + move => HF. + have pos : (forall (i : T) (j : U), (0%R <= F j * ((mu i)%:E * (nu i j)%:E))%E). + - move => i j; rewrite mule_ge0 //. + by rewrite mule_ge0 // lee_tofin. + rewrite /espe. + rewrite (eq_sum + (S1:=fun x : U => (F x * ((\dlet_(i <- mu) nu i) x)%:E)%E) + (S2:=fun x : U => (F x * esum [set:T] (fun y : T => (mu y * nu y x)%:E)))%E). + - move => x; rewrite dletE. + congr ( _ * _)%E. + rewrite -esum_psum //. + - by move => i; rewrite mulr_ge0. + - apply/(le_summable (F2 := mu)) => //. + by move=> x0; rewrite mulr_ge0 //= ler_piMr ?le1_mu1. + symmetry. + rewrite (eq_sum + (S1:=(fun x : T => (sum (fun x0 : U => F x0 * (nu x x0)%:E) * (mu x)%:E)%E)) + (S2:=(fun x : T => (esum [set:U] (fun x0 : U => F x0 * ((mu x)%:E * (nu x x0)%:E))%E)))). + - move => x; rewrite muleC. + rewrite -sumZ. + - move => x1; rewrite mule_ge0 //=. + - exact: (ge0_mu (nu x) x1). + rewrite (eq_sum + (S1:=(fun x0 : U => (mu x)%:E * (F x0 * (nu x x0)%:E))%E) + (S2:=(fun x0 : U => F x0 * ((mu x)%:E * (nu x x0)%:E))%E)) //. + - by move => ?; rewrite muleCA. + rewrite esum_sum' //. + rewrite esum_sum'. + - by move => ?; rewrite esum_ge0 //. + rewrite esum_esum' //. + rewrite esum_sum'. + - move => ?; rewrite mule_ge0 // esum_ge0 //. + by move => ??; rewrite lee_tofin // mulr_ge0. + rewrite {1}(eq_esum + (b:= fun x => (F x * (\esum_(y in [set: T]) (mu y * nu y x)%:E))%E)) //. + - move => ??. rewrite esumZ //. + by move => ?; rewrite mule_ge0 // lee_tofin. + Qed. + + (* Lemma expZ mu F c : \E_[mu] (c \*o F) = c * \E_[mu] F. *) + (* Proof. by rewrite -sumZ; apply/eq_sum=> x /=; rewrite mulrA. Qed. *) + +End PrCoreTheory. diff --git a/experimental_reals/realsum.v b/experimental_reals/realsum.v index 267b1b7688..fbda74147c 100644 --- a/experimental_reals/realsum.v +++ b/experimental_reals/realsum.v @@ -3,12 +3,13 @@ (* Copyright (c) - 2015--2018 - Inria *) (* Copyright (c) - 2016--2018 - Polytechnique *) (* -------------------------------------------------------------------- *) -From mathcomp Require Import all_ssreflect_compat all_algebra. +From mathcomp Require Import all_boot all_order all_algebra. #[warning="-warn-library-file-internal-analysis"] From mathcomp Require Import unstable. -From mathcomp.classical Require Import boolp. +From mathcomp.classical Require Import boolp fsbigop. From mathcomp Require Import xfinmap constructive_ereal reals discrete realseq. From mathcomp.classical Require Import classical_sets functions. +From mathcomp.analysis Require Import esum ereal. Set Implicit Arguments. Unset Strict Implicit. @@ -194,6 +195,18 @@ case/(_ (NPInf M)): cu => K /= /(_ K (leqnn _)). rewrite inE/= => /ltW /le_trans /(_ (ler_norm _)). by move/le_lt_trans/(_ (bdu _)); rewrite ltxx. Qed. + +Lemma ncvg_mono_sum {T : eqType} [f : nat -> T -> R] [l : T -> R] [J : seq T] : + (forall x, ncvg (fun n => f n x) (l x)%:E) -> + ncvg (fun n => \sum_(x <- J) f n x) (\sum_(x <- J) l x)%:E. +Proof. +move=> hcvg; elim: J => //= [|j J ih]. +- rewrite big_nil; apply/(@ncvg_eq _ (fun _ => 0))/ncvgC. + by move=> n /=; rewrite big_nil. +- rewrite big_cons; have := ncvgD (hcvg j) ih; apply/ncvg_eq. + by move=> n /=; rewrite big_cons. +Qed. + End PosCnv. (* -------------------------------------------------------------------- *) @@ -343,6 +356,47 @@ by case=> /= [|J lt_lJ _]; [apply/summable_sup | exists J]. Qed. End SumTh. +(* -------------------------------------------------------------------- *) +Section Esum. + + Context {R : realType} {T : choiceType}. + + Lemma esum_psum (S: T -> R) : + (forall i : T, 0%R <= S i) -> + summable S -> + esum [set:T] (fun x => (S x)%:E) = (psum S)%:E. + Proof. + move => Sg0 h; apply/eqP; rewrite eq_le; apply/andP; split. + - rewrite ge_ereal_sup//= => x [] X [] finX XT. + rewrite fsumEFin // => <-. + rewrite lee_fin. + rewrite fsbig_finite //=. + revert finX. + rewrite cardinality.finite_fsetP. + move => [] J ->. + rewrite cardinality.set_fsetK. + apply: (le_trans _ (gerfin_psum J h)). + rewrite -(@big_fset_seq R _ _ T J S) //=. + apply: (le_trans _ (ler_norm_sum _ _ _)). + exact : ler_norm. + - rewrite (eq_esum (b:= fun x => `| S x |%:E)%E). + - by move => ??; rewrite ger0_norm. + have [H1 H3] := (summable_sup h). + rewrite psum_absE //. + rewrite -(ereal_sup_EFin H3 H1). + rewrite ge_ereal_sup//= => x [] X [] Fs XT <-. + rewrite esum_ge //. + exists ([set` Fs]%classic) => //. + rewrite fsumEFin //. + rewrite lee_fin. + rewrite XT. + rewrite (@big_fset_seq R _ _ T _ (fun x => `|S x|)) //=. + rewrite -{1}(cardinality.set_fsetK Fs). + by rewrite -fsbig_finite. + Qed. + +End Esum. + (* -------------------------------------------------------------------- *) Lemma max_sup {R : realType} x (E : set R) : (E `&` ubound E)%classic x -> sup E = x. @@ -694,6 +748,29 @@ Qed. End SummableAlg. +(* -------------------------------------------------------------------- *) +Section Sum_Sum. + Context {T: choiceType} {R : realType}. + + Lemma sum_sum (S: T -> R) : + summable S -> + esum.sum (fun x => (S x)%:E) = (sum S)%:E. + Proof. + move => hs. rewrite /esum.sum /sum. + rewrite (eq_esum (a:= esum.fpos (fun x => (S x)%:E)) (b:= fun x => (fpos S x)%:E)). + - by move => ??; rewrite /esum.fpos /fpos -fine_max. + rewrite (eq_esum (a:= esum.fneg (fun x => (S x)%:E)) (b:= fun x => (realsum.fneg S x)%:E)). + - by move => ??; rewrite /esum.fneg /fneg -fine_min. + rewrite esum_psum //. + - move => ?. rewrite /realsum.fpos. exact : normr_ge0. + - exact : summable_fpos. + rewrite esum_psum //. + - move => ?. rewrite /realsum.fneg. exact : normr_ge0. + - exact : summable_fneg. + Qed. + +End Sum_Sum. + (* -------------------------------------------------------------------- *) Section StdSum. Context {R : realType} (T : choiceType) (I : Type). diff --git a/rocq-mathcomp-experimental-reals.opam b/rocq-mathcomp-experimental-reals.opam index 83179674dd..234d011a17 100644 --- a/rocq-mathcomp-experimental-reals.opam +++ b/rocq-mathcomp-experimental-reals.opam @@ -19,6 +19,7 @@ build: [make "-C" "experimental_reals" "-j%{jobs}%"] install: [make "-C" "experimental_reals" "install"] depends: [ "rocq-mathcomp-reals" { = version} + "rocq-mathcomp-analysis" { = "dev"} "rocq-mathcomp-bigenough" { (>= "1.0.0") } ] diff --git a/theories/esum.v b/theories/esum.v index 486d54a46f..ea2b226aad 100644 --- a/theories/esum.v +++ b/theories/esum.v @@ -100,6 +100,21 @@ Proof. by move=> ?; rewrite esum_fset// ?fset_set1// ?fsbig_set1// => t' /[!inE] ->. Qed. +Lemma esum_pos_e a: + ((forall i : T, 0%R <= a i) -> + (0%R = \esum_(x in [set: T]) a x) -> + forall x: T, 0%R = a x)%E. +Proof. + move => hi hs x. + apply/eqP;rewrite eq_le; apply/andP; split. + + by apply hi. + + rewrite hs. + apply ereal_sup_ubound => //=. + rewrite -esum_set1 //. + exists [set x]%classic => //. + by rewrite esum_fset. +Qed. + End esum_realType. Lemma esum1 [R : realFieldType] [I : choiceType] (D : set I) (a : I -> \bar R) : @@ -129,6 +144,46 @@ Lemma eq_esum [R : realType] [T : choiceType] (I : set T) (a b : T -> \bar R) : \esum_(i in I) a i = \esum_(i in I) b i. Proof. by move=> e; apply/eqP; rewrite eq_le !le_esum// => i Ii; rewrite e. Qed. +Lemma esumZ [R : realType] [T : choiceType] S (c : \bar R) : + (0 <= c -> (forall i : T, 0 <= S i) -> + esum [set:T] (fun x => c * (S x)) = c * (esum [set:T] S))%E. +Proof. + rewrite le_eqVlt => /orP[/eqP<-|cgt0]. + - by rewrite mul0e esum1 // => ??; rewrite mul0e. + move => Sg0; apply/eqP; rewrite eq_le; apply/andP; split. + - rewrite ge_ereal_sup//= => x [X [finX XI]] <-. + setoid_rewrite <- (@ge0_mule_fsumr _ _ c S X Sg0). + rewrite lee_pmul //. + + by rewrite ltW. + + by rewrite fsume_ge0 //. + + by rewrite ereal_sup_ubound //=; exists X. + - revert cgt0. + case c => //. + + move => s hs. + rewrite -lee_pdivlMl //. + rewrite ge_ereal_sup//= => _ [X [finX XI]] <-. + rewrite lee_pdivlMl //. + rewrite ge0_mule_fsumr //. + by rewrite ereal_sup_ubound //=; exists X. + + move => h. + have he: (0 <= \esum_(x in [set: T]) S x)%E. + - by apply esum_ge0; move => ??; apply Sg0. + rewrite le_eqVlt in he;revert he. + move => /orP [/eqP Sgt0|Sgt0]. + + rewrite -Sgt0 mule0. + rewrite (eq_esum (b := (fun _ => 0)%E)). + - by intros ??; rewrite -(esum_pos_e (a:= S)) // mule0. + by rewrite esum1. + + rewrite gt0_mulye //. + have [y [H ? ? ?]] := (ereal_sup_gt Sgt0). + rewrite leye_eq; apply/eqP /eq_infty => y'; rewrite esum_ge//. + exists H; move => //. + rewrite -ge0_mule_fsumr //. + subst. + rewrite gt0_mulye //. + by rewrite leey. +Qed. + Lemma esumD [R : realType] [T : choiceType] (I : set T) (a b : T -> \bar R) : (forall i, I i -> 0 <= a i) -> (forall i, I i -> 0 <= b i) -> \esum_(i in I) (a i + b i) = \esum_(i in I) a i + \esum_(i in I) b i. @@ -356,6 +411,23 @@ by rewrite -fsbig_finite//; apply: eq_fsbigr=> x /[!inE]/XQ ?; rewrite invK ?inE Qed. Arguments reindex_esum {R T T'} P Q e a. +Lemma esum_esum' [R : realType] [T U : choiceType] (f: T -> U -> \bar R): + (forall i j, (0%R <= f i j)%E) -> + esum [set:T] (fun x => esum [set:U] (fun y => f x y)) = + esum [set:U] (fun y => esum [set:T] (fun x => f x y)). +Proof. + move => h. + rewrite !esum_esum //=. + rewrite /setXR. + rewrite (reindex_esum + (fun z=> [set: U]%classic z.1 /\ [set: T]%classic z.2) + (fun z => [set: T]%classic z.1 /\ [set: U]%classic z.2) + (fun x => (x.2, x.1))) //=. + - split => //=. + by move=> [i1 i2] [j1 j2] /= _ _ [] -> ->. + by move=> [i1 i2] [Pi1 Qi2] /=; exists (i2, i1). +Qed. + Section nneseries_interchange. Local Open Scope ereal_scope. @@ -665,3 +737,373 @@ by rewrite ge0_esum_posneg// ge0_esum_posneg// => /eqP ->. Qed. End esumB. + + +(* This should go to ereal*) +Section Ereal. + Context {R : realType}. + + Definition esg (x: \bar R) : \bar R := + (if x == 0 then 0 else if x < 0 then -1 else 1)%E. + + Lemma numEsg (x : \bar R): (x = esg x * `|x|)%E. + Proof. + rewrite /esg. + case (comparable_ltgtP (comparableT x 0)%E) => h. + + by rewrite (lt_eqF h) h lte0_abs // muleNN mul1e. + + by rewrite (gt_eqF h) (lt_gtF h) gte0_abs // mul1e. + + by rewrite h eq_refl mul0e. + Qed. + + Lemma gte0_esg (x : \bar R): (x < 0 -> esg x = -1)%E. + Proof. + by move => h; rewrite /esg (lt_eqF h) h. + Qed. + + Lemma lte0_esg (x : \bar R): (0 < x -> esg x = 1)%E. + Proof. + by move => h; rewrite /esg (gt_eqF h) (lt_gtF h). + Qed. + + Lemma esg0 : (esg 0 = 0)%E. + Proof. + by rewrite /esg eq_refl. + Qed. + +End Ereal. + + +Section Sum. + Context {R : realType} {T : choiceType}. + + Implicit Types f (* g *) : T -> \bar R. + +(* Use the following function (numfun.funepos.body f \+ numfun.funeneg.body f)%E *) + + Definition fpos f := fun x => `|maxe 0%E (f x)|%E. + Definition fneg f := fun x => `|mine 0%E (f x)|%E. + + Lemma min_l (x y : \bar R) : (x <= y -> mine x y = x)%E. Proof. by case: comparableP. Qed. + + Lemma min_r (x y : \bar R) : (y <= x -> mine x y = y)%E. Proof. by case: comparableP. Qed. + + Lemma max_l (x y : \bar R) : (y <= x -> maxe x y = x)%E. Proof. by case: comparableP. Qed. + + Lemma max_r (x y : \bar R) : (x <= y -> maxe x y = y)%E. Proof. by case: comparableP. Qed. + + Lemma fneg_ge0 f x : (forall x, 0%R <= f x)%E -> fneg f x = 0. + Proof. by move => ?; rewrite /fneg min_l ?abse0. Qed. + + Lemma fpos_ge0 f x : (forall x, 0%R <= f x )%E -> fpos f x = f x. + Proof. by move=> ?; rewrite /fpos max_r ?gee0_abs. Qed. + + Lemma fpos0 x : fpos (fun _ : T => 0) x = 0. + Proof. by rewrite /fpos /maxe ltxx abse0. Qed. + + Lemma fneg0 x : fneg (fun _ : T => 0) x = 0. + Proof. by rewrite /fneg /mine ltxx abse0. Qed. + + Lemma fnegN f : (fneg (\- f ) =1 fpos f)%E. + Proof. by move => x; rewrite /fpos /fneg -{1}oppe0 -oppe_max abseN. Qed. + + Lemma fposN f : (fpos (\- f ) =1 fneg f)%E. + Proof. by move=> x; rewrite /fpos /fneg -{1}oppe0 -oppe_min abseN. Qed. + + Lemma le_fpos f1 f2 : ((forall x, f1 x <= f2 x) -> (forall x, fpos f1 x <= fpos f2 x))%E. + Proof. + move=> le_f x; rewrite /fpos !gee0_abs ?le_max ?lexx //. + by rewrite ge_max lexx /=; case: ltP => //=; rewrite le_f. + Qed. + + Definition sum f : \bar R := esum [set:T] (fpos f) - esum [set:T] (fneg f). +End Sum. + +Section SumTheory. + Context {R : realType} {T : choiceType}. + Implicit Types (S : T -> \bar R). + + Lemma sum0 : @sum R _ (fun _ : T => 0%E) = 0%E. + Proof. + rewrite /sum esum1. + + by move => ??; rewrite max_l; [| rewrite abse0]. + by rewrite sube0. + Qed. + + Lemma eq_sum S1 S2: S1 =1 S2 -> sum S1 = sum S2. + Proof. + move=> eq_fg; rewrite /sum. + rewrite (eq_esum (a:= fpos S2) (b:= fpos S1)). + - by move => ??; rewrite /fpos eq_fg. + rewrite (eq_esum (a:= fneg S2) (b:= fneg S1)). + - by move => ??; rewrite /fneg eq_fg. + by idtac. + Qed. + + Lemma esum_unit S x : + esum [set:T] (fun y => if x == y then S y else 0) = \esum_(i in [set x]) S i. + Proof. + rewrite (esum_mkcond [set x] S). + apply eq_esum => i ? //=. + by case_eq (x == i);rewrite eq_sym -in_fset1 -cardinality.fset_set1 + cardinality.in_fset_set => //= ->. + Qed. + + Lemma sum_unit S x : sum (fun y => if x == y then S y else 0) = S x. + Proof. + rewrite /sum. + rewrite (@eq_esum _ _ _ (fpos _) (fun y : T => if x == y then fpos S y else 0%R)). + + move => i ? ; rewrite /fpos /maxe => //=. + case (x == i) => //=. + by case (_ < _)%E; rewrite abse0. + rewrite (@eq_esum _ _ _ (fneg _) (fun y : T => if x == y then fneg S y else 0%R)). + + move => i ? ; rewrite /fneg /mine => //=. + case (x == i) => //=. + by case (_ < _)%E; rewrite abse0. + rewrite !esum_unit. + case (comparable_ltP (comparableT (S x) 0)%E) => h;last first. + + rewrite esum_set1. + + by rewrite /fpos max_r ?gee0_abs. + rewrite esum1. + + by move => i //= ->; rewrite /fneg min_l ?gee0_abs. + by rewrite /fpos max_r ?gee0_abs ?sube0. + rewrite esum1. + + by move => i //= ->; rewrite /fpos max_l ?abse0 => //=; apply ltW. + rewrite esum_set1. + + by rewrite /fneg min_r ?lte0_abs ?oppe_ge0 => //=; apply ltW. + rewrite /fneg min_r. + + by apply ltW. + rewrite lte0_abs ?sub0e => //=. + by apply (eqe_oppLRP (- (S x))). + Qed. + + Section SumTheoryP. + + Lemma esum_sum' S : (forall x, 0%:E <= S x)%E -> sum S = esum [set:T] S. + Proof. + move=> ge0_S; rewrite /sum. rewrite (@esum1 R T [set:T] (fneg S)). + + by move => x ?; rewrite fneg_ge0. + by rewrite sube0; apply eq_esum => x ?; rewrite fpos_ge0. + Qed. + + Lemma sum_pos S : (forall x, 0%:E <= S x)%E -> (0%R <= sum S)%E. + Proof. + by move=> ge0_S; rewrite esum_sum' // esum_ge0. + Qed. + + Lemma le_sum S1 S2: + ((forall x, 0%:E <= S1 x) -> + (forall x, 0%:E <= S2 x) -> + (forall x, S1 x <= S2 x) -> + sum S1 <= sum S2)%E. + Proof. + move=> pS1 pS2 leS. rewrite /sum leeB //. + + apply le_esum. + by move => ??; rewrite !fpos_ge0. + apply le_esum. + by move => ??; rewrite !fneg_ge0. + Qed. + + Lemma sumN S : + (forall x, 0%:E <= S x)%E -> + (sum (\- S ) = - sum S)%E. + Proof. + move => h; rewrite /sum. + rewrite (eq_esum (a:=fpos _) (b:=fun _ : T => 0%E)). + + by move => ?? ; rewrite fposN fneg_ge0. + rewrite (eq_esum (a:= fneg S) (b:= fun _ : T => 0%E)). + + by move => ?? ; rewrite fneg_ge0. + rewrite (eq_esum (a:=fneg (\- S)%E) (b:=fpos S)). + + by move => ?? ; rewrite fnegN. + rewrite esum1 => //=. + by rewrite sube0 sub0e. + Qed. + + Lemma sumZ S c : + (forall x, 0%:E <= S x)%E -> + (sum (fun x => mule c (S x)) = mule c (sum S))%E. + Proof. + move => h. + rewrite (eq_sum (S2 := fun x => esg c * (`|c| * S x))%E). + by move=> x ; rewrite muleA -numEsg. + transitivity (esg c * sum (fun x => `|c| * (S x)))%E. + - case (comparable_ltgtP (comparableT c 0)%E) => hc. + + rewrite {1}lte0_abs // gte0_esg //. + rewrite (eq_sum (S2 := fun x : T => (- (- c * S x))%E)). + - by move => ?; rewrite mulN1e. + rewrite mulN1e -sumN;[|rewrite lte0_abs //]. + by move => ?; rewrite mule_ge0. + + rewrite gte0_abs // lte0_esg // mul1e. + rewrite (eq_sum (S2 := fun x : T => ( c * S x)%E)). + - by move => ?; rewrite mul1e. + by idtac. + + rewrite hc esg0 mul0e. + rewrite (eq_sum (S2 := fun _ : T => 0%E)). + - by move => ?; rewrite mul0e. + by rewrite sum0. + - rewrite {1}/sum. + rewrite (eq_esum (a:= fpos _) (b:= (fun x : T => `|c| * S x)%E)). + + by move => ??; rewrite fpos_ge0 // => x; rewrite mule_ge0. + rewrite (eq_esum (a:=fneg _) (b:=fun _ : T => 0%E)). + + by move => ?? ; rewrite fneg_ge0 // => x; rewrite mule_ge0. + rewrite (esum1 (a:= fun _ => 0%E)) // sube0. + by rewrite esumZ // muleA -numEsg esum_sum'. + Qed. + + End SumTheoryP. + + Section SumTheoryS. + + Lemma le_sum_s S1 S2 : + (summable [set:T] S1 -> summable [set : T] S2 -> + (forall x, S1 x <= S2 x) -> + sum S1 <= sum S2)%E. + Proof. + move=> smS1 smS2 leS; rewrite /sum leeB //. + + by apply le_esum => ??; apply le_fpos. + apply le_esum => ??. + rewrite -!fposN. apply le_fpos => ?. + by rewrite leeN2. + Qed. + + End SumTheoryS. + +End SumTheory. + +Lemma ereal_sup_comm {R:realType} {X Y : Type} (f : X -> Y -> \bar R) (A : set X) (B : set Y) : + ereal_sup [set ereal_sup [set f x y | y in B] | x in A] = + ereal_sup [set ereal_sup [set f x y | x in A] | y in B]. +Proof. + suff key : forall (X' Y' : Type) (g : X' -> Y' -> \bar R) (C : set X') (D : set Y'), + ereal_sup [set ereal_sup [set g x y | y in D] | x in C] <= + ereal_sup [set ereal_sup [set g x y | x in C] | y in D]. + apply: le_anti. apply/andP; split; [exact: key | exact: (key _ _ (fun y x => f x y) B A)]. + move=> X' Y' g C D. + apply/ereal_supP => _ [x hx <-]. + apply/ereal_supP => _ [y hy <-]. + apply: le_ereal_sup_tmp; exists (ereal_sup [set g x0 y | x0 in C]). + - exists y => //. + - apply: le_ereal_sup_tmp; exists (g x y); [exists x => // | exact: le_refl]. +Qed. + + +Section mono_esum. + Context + {R : realType} + {T : choiceType} + {f : T -> nat -> \bar R} + {fpos : forall t n, 0 <= f t n} + (hmono : (forall n m : nat, (n <= m)%N -> forall x : T, f x n <= f x m)). + +Lemma esupZl (c : \bar R) (X : set \bar R): + 0 <= c -> + X != set0 -> + (forall x, X x -> 0 <= x) -> + ereal_sup [ set c * x | x in X ] = c * ereal_sup X. +Proof. +move=> cpos Xne Xpos. + have /set0P [x Xx] := Xne. + case: c cpos => [r|_|//]. + - move=> hr. + case: (eqVneq r 0%R) => [-> | rne0]. + + rewrite mul0e. + under eq_imagel => a _ do rewrite mul0e. + rewrite ereal_sup_cst //. + exact: ereal_supZl Xne hr. + - case: (boolp.pselect (forall a, X a -> a = 0)) => [hall | hnall]. + + have -> : [set +oo * x | x in X] = [set 0]. { + apply/seteqP; split. + + by move=> _ [z Xz <-]; rewrite (hall _ Xz) mule0 //. + + by move=> y /= ->; exists x => //; rewrite (hall _ Xx) mule0. + } + have -> : X = [set 0]. { + apply/seteqP; split. + + by move=> y Xy; rewrite (hall _ Xy)=> //. + + by move=> y /= ->; rewrite -(hall _ Xx) //. + } + by rewrite ereal_sup1 mule0. + + move: hnall; rewrite -boolp.existsNE. + move => [y /boolp.not_implyP [Xy hy] ]. + have ygt0: 0 < y by rewrite lt_def Xpos // andbT; apply/eqP. + rewrite gt0_mulye //. + - apply: (lt_le_trans ygt0); exact: ereal_sup_ubound. + apply: ereal_supy. exists y => //. exact: gt0_mulye. +Qed. + + Lemma esupZl_range (c : \bar R) (x : T) (cpos : 0 <= c) : + (c * ereal_sup (range (f x)) = + ereal_sup (range (fun n => c * f x n)))%E. + Proof. + have seteq : + [set c * y | y in range (f x)] = range (fun n => c * f x n). + apply/seteqP; split. + - by move=> _ [_ [n _ <-] <-]; exists n. + - by move=> _ [n _ <-]; exists (f x n) => //; exists n. + rewrite -seteq esupZl //. + - by apply/set0P; exists (f x 0%N), 0%N. + - by move=> _ [n _ <-]; exact: fpos. + Qed. + + Lemma esup_add (u v : nat -> \bar R) : + (forall n, 0 <= u n) -> (forall n, 0 <= v n) -> + nondecreasing_seq u -> nondecreasing_seq v -> + ereal_sup (range u) + ereal_sup (range v) = + ereal_sup (range (fun n => u n + v n)). + Proof. + move=> u0 v0 ndu ndv. + have su_ge0 : 0 <= ereal_sup (range u). + by rewrite (le_trans (u0 0%N))// ereal_sup_ubound//; exists 0%N. + have sv_ge0 : 0 <= ereal_sup (range v). + by rewrite (le_trans (v0 0%N))// ereal_sup_ubound//; exists 0%N. + have ndsum : nondecreasing_seq (fun n => u n + v n). + by move=> n m nm; apply: leeD; [exact: ndu | exact: ndv]. + have cuv_add : + (fun n => u n + v n) @ \oo --> + ereal_sup (range u) + ereal_sup (range v). + apply: cvgeD. + - by apply: ge0_adde_def; rewrite inE. + - exact: ereal_nondecreasing_cvgn. + - exact: ereal_nondecreasing_cvgn. + have cuv_sup : + (fun n => u n + v n) @ \oo --> + ereal_sup (range (fun n => u n + v n)). + exact: ereal_nondecreasing_cvgn. + exact: cvg_unique cuv_add cuv_sup. + Qed. + + Lemma ereal_sup_sum (A : {fset T}) : + \sum_(x <- A) ereal_sup (range (f x)) = + ereal_sup (range (fun n => \sum_(x <- A) f x n)). + Proof. + have key (l : seq T) : + \sum_(x <- l) ereal_sup (range (f x)) = + ereal_sup (range (fun n => \sum_(x <- l) f x n)). + elim: l => [|x xs IH]. + - rewrite big_nil. + under eq_fun => n do rewrite big_nil. + by rewrite ereal_sup_cst//; apply/set0P; exists 0%N. + - rewrite big_cons IH. + under [in RHS]eq_fun => n do rewrite big_cons. + apply: esup_add. + + by move=> n; exact: fpos. + + by move=> n; apply: sume_ge0 => y _; exact: fpos. + + by move=> n m nm; exact: hmono. + + by move=> n m nm; apply: lee_sum => y _; exact: hmono. + exact: key. + Qed. + + Lemma esum_esup_comm : + (\esum_(i in [set: T]) ereal_sup (range (f i)))%E = + (ereal_sup (range (fun n => esum [set:T] (fun x : T => f x n))))%E. + Proof. + rewrite /esum. + under eq_imagel => A [fin ?] do + rewrite fsbig_finite // ereal_sup_sum //. + rewrite ereal_sup_comm. + congr ereal_sup. + apply: eq_imagel => n S. + congr ereal_sup. + apply: eq_imagel => n' [A _]. + rewrite fsbig_finite //. +Qed. + +End mono_esum. From 2dea50cc1d1c3bdf19cc85ea9180b96413dbb7c6 Mon Sep 17 00:00:00 2001 From: Reynald Affeldt Date: Mon, 11 May 2026 23:21:32 +0900 Subject: [PATCH 02/21] use fun{r,e}{pos,neg} instead of f{pos,neg} --- experimental_reals/realsum.v | 130 ++++++++++++------------------- theories/esum.v | 143 ++++++++++++++--------------------- 2 files changed, 107 insertions(+), 166 deletions(-) diff --git a/experimental_reals/realsum.v b/experimental_reals/realsum.v index fbda74147c..33de9a937a 100644 --- a/experimental_reals/realsum.v +++ b/experimental_reals/realsum.v @@ -9,7 +9,7 @@ From mathcomp Require Import unstable. From mathcomp.classical Require Import boolp fsbigop. From mathcomp Require Import xfinmap constructive_ereal reals discrete realseq. From mathcomp.classical Require Import classical_sets functions. -From mathcomp.analysis Require Import esum ereal. +From mathcomp.analysis Require Import esum ereal numfun. Set Implicit Arguments. Unset Strict Implicit. @@ -47,83 +47,54 @@ Context {R : realType} {T : choiceType}. Implicit Types f g : T -> R. -Definition fpos f := fun x => `|Num.max 0 (f x)|. -Definition fneg f := fun x => `|Num.min 0 (f x)|. +Lemma eq_fpos f g : f =1 g -> f^\+ =1 g^\+. +Proof. by move=> eq_fg x; rewrite /funrpos eq_fg. Qed. -Lemma eq_fpos f g : f =1 g -> fpos f =1 fpos g. -Proof. by move=> eq_fg x; rewrite /fpos eq_fg. Qed. +Lemma eq_fneg f g : f =1 g -> f^\- =1 g^\-. +Proof. by move=> eq_fg x; rewrite /funrneg eq_fg. Qed. -Lemma eq_fneg f g : f =1 g -> fneg f =1 fneg g. -Proof. by move=> eq_fg x; rewrite /fneg eq_fg. Qed. +Lemma funrpos_cst0 x : (fun _ : T => 0)^\+ x = 0 :> R. +Proof. by rewrite /funrpos maxxx. Qed. -Lemma fpos0 x : fpos (fun _ : T => 0) x = 0 :> R. -Proof. by rewrite /fpos maxxx normr0. Qed. +Lemma funrneg_cst0 x : (fun _ : T => 0)^\- x = 0 :> R. +Proof. by rewrite /funrneg oppr0 maxxx. Qed. -Lemma fneg0 x : fneg (fun _ : T => 0) x = 0 :> R. -Proof. by rewrite /fneg minxx normr0. Qed. +Lemma fposZ f c : 0 <= c -> (c \*o f)^\+ =1 c \*o f^\+. +Proof. by move=> ge0_c x; rewrite /= ge0_funrposM. Qed. -Lemma fnegN f : fneg (- f) =1 fpos f. -Proof. by move=> x; rewrite /fpos /fneg -{1}oppr0 -oppr_max normrN. Qed. - -Lemma fposN f : fpos (- f) =1 fneg f. -Proof. by move=> x; rewrite /fpos /fneg -{1}oppr0 -oppr_min normrN. Qed. - -Lemma fposZ f c : 0 <= c -> fpos (c \*o f) =1 c \*o fpos f. +Lemma fnegZ f c : 0 <= c -> (c \*o f)^\- =1 c \*o f^\-. Proof. -move=> ge0_c x; rewrite /fpos /= -{1}(mulr0 c). -by rewrite -maxr_pMr // normrM ger0_norm. -Qed. - -Lemma fnegZ f c : 0 <= c -> fneg (c \*o f) =1 c \*o fneg f. -Proof. -move=> ge0_c x; rewrite /= -!fposN; have /=<- := (fposZ (- f) ge0_c x). +move=> ge0_c x; rewrite /= -!funrposN; have /= <- := fposZ (- f) ge0_c x. by apply/eq_fpos=> y /=; rewrite mulrN. Qed. Lemma fpos_natrM f (n : T -> nat) x : - fpos (fun x => (n x)%:R * f x) x = (n x)%:R * fpos f x. + (fun x => (n x)%:R * f x)^\+ x = (n x)%:R * f^\+ x. Proof. -rewrite /fpos -[in RHS]normr_nat -normrM. -by rewrite maxr_pMr ?ler0n // mulr0. +by rewrite /funrpos -[in RHS]normr_nat maxr_pMr// mulr0 ger0_norm. Qed. Lemma fneg_natrM f (n : T -> nat) x : - fneg (fun x => (n x)%:R * f x) x = (n x)%:R * fneg f x. + (fun x => (n x)%:R * f x)^\- x = (n x)%:R * f^\- x. Proof. -rewrite -[in RHS]fposN -fpos_natrM -fposN. +rewrite -[in RHS]funrposN -fpos_natrM -funrposN. by apply/eq_fpos=> y; rewrite mulrN. Qed. -Lemma fneg_ge0 f x : (forall x, 0 <= f x) -> fneg f x = 0. -Proof. by move=> ?; rewrite /fneg min_l ?normr0. Qed. - -Lemma fpos_ge0 f x : (forall x, 0 <= f x ) -> fpos f x = f x. -Proof. by move=> ?; rewrite /fpos max_r ?ger0_norm. Qed. - -Lemma ge0_fpos f x : 0 <= fpos f x. -Proof. by apply/normr_ge0. Qed. +Lemma fneg_ge0 f x : (forall x, 0 <= f x) -> f^\- x = 0. +Proof. by move=> ?; rewrite /funrneg max_r// oppr_le0. Qed. -Lemma ge0_fneg f x : 0 <= fneg f x. -Proof. by apply/normr_ge0. Qed. +Lemma fpos_ge0 f x : (forall x, 0 <= f x ) -> f^\+ x = f x. +Proof. by move=> ?; rewrite /funrpos max_l. Qed. -Lemma le_fpos_norm f x : fpos f x <= `|f x|. +Lemma le_fpos_norm f x : f^\+ x <= `|f x|. Proof. -rewrite /fpos ger0_norm ?(le_max, lexx) //. -by rewrite ge_max normr_ge0 ler_norm. +by rewrite -/((Num.Def.normr \o f) x) -funrposDneg lerDl funrneg_ge0. Qed. -Lemma le_fpos f1 f2 : f1 <=1 f2 -> fpos f1 <=1 fpos f2. +Lemma le_fpos f1 f2 : f1 <=1 f2 -> f1^\+ <=1 f2^\+. Proof. -move=> le_f x; rewrite /fpos !ger0_norm ?le_max ?lexx //. -by rewrite ge_max lexx /=; case: ltP => //=; rewrite le_f. -Qed. - -Lemma fposBfneg f x : fpos f x - fneg f x = f x. -Proof. -rewrite /fpos /fneg maxC. -case: (leP (f x) 0); rewrite normr0 (subr0, sub0r) => ?. - by rewrite ler0_norm ?opprK. -by rewrite gtr0_norm. +by move=> le_f x; rewrite (@funrpos_le _ _ setT)// inE. Qed. Definition psum f : R := @@ -131,7 +102,7 @@ Definition psum f : R := let S := [set x | exists J : {fset T}, x = \sum_(x : J) `|f (val x)| ]%classic in if `[] then sup S else 0. -Definition sum f : R := psum (fpos f) - psum (fneg f). +Definition sum f : R := psum f^\+ - psum f^\-. End Sum. (* -------------------------------------------------------------------- *) @@ -688,16 +659,17 @@ Qed. (* -------------------------------------------------------------------- *) Lemma summable_fpos (f : T -> R) : - summable f -> summable (fpos f). + summable f -> summable f^\+. Proof. -move/summable_abs; apply/le_summable=> x. -by rewrite ge0_fpos /= le_fpos_norm. +by move/summable_abs; apply/le_summable => x; rewrite funrpos_ge0 le_fpos_norm. Qed. (* -------------------------------------------------------------------- *) Lemma summable_fneg (f : T -> R) : - summable f -> summable (fneg f). -Proof. by move/summableN/summable_fpos/(eq_summable (fposN _)). Qed. + summable f -> summable f^\-. +Proof. +by move/summableN/summable_fpos; apply: eq_summable => x; rewrite funrposN. +Qed. (* -------------------------------------------------------------------- *) Lemma summable_condl (S : T -> R) (P : pred T) : @@ -757,16 +729,12 @@ Section Sum_Sum. esum.sum (fun x => (S x)%:E) = (sum S)%:E. Proof. move => hs. rewrite /esum.sum /sum. - rewrite (eq_esum (a:= esum.fpos (fun x => (S x)%:E)) (b:= fun x => (fpos S x)%:E)). - - by move => ??; rewrite /esum.fpos /fpos -fine_max. - rewrite (eq_esum (a:= esum.fneg (fun x => (S x)%:E)) (b:= fun x => (realsum.fneg S x)%:E)). - - by move => ??; rewrite /esum.fneg /fneg -fine_min. - rewrite esum_psum //. - - move => ?. rewrite /realsum.fpos. exact : normr_ge0. - - exact : summable_fpos. - rewrite esum_psum //. - - move => ?. rewrite /realsum.fneg. exact : normr_ge0. - - exact : summable_fneg. + rewrite (eq_esum (a:= (fun x => (S x)%:E)^\+%E) (b:= fun x => (S^\+ x)%:E)). + - by move => ??; rewrite funeposE -fine_max//=. + rewrite (eq_esum (a:= (fun x => (S x)%:E)^\-%E) (b:= fun x => (S^\- x)%:E)). + - by move => ??; rewrite funenegE /funrneg EFin_max. + rewrite esum_psum //; first exact : summable_fpos. + by rewrite esum_psum //; exact : summable_fneg. Qed. End Sum_Sum. @@ -1218,17 +1186,19 @@ Lemma le_sum S1 S2 : Proof. move=> smS1 smS2 leS; rewrite /sum lerB //. apply/le_psum/summable_fpos => // x. - by rewrite ge0_fpos /= le_fpos. + by rewrite funrpos_ge0/= le_fpos. apply/le_psum/summable_fneg => // x. -rewrite -!fposN ge0_fpos le_fpos // => y. +rewrite -!funrposN funrpos_ge0 le_fpos // => y. by rewrite lerN2. Qed. -Lemma sum0 : sum (fun _ : T => 0) = 0 :> R. -Proof. by rewrite /sum !(eq_psum fpos0, eq_psum fneg0) !psum0 subr0. Qed. +Lemma sum0 : sum (@cst T _ 0) = 0 :> R. +Proof. +by rewrite /sum !(eq_psum funrpos_cst0, eq_psum funrneg_cst0) !psum0 subr0. +Qed. Lemma sumN S : sum (- S) = - sum S. -Proof. by rewrite /sum (eq_psum (fnegN _)) (eq_psum (fposN _)) opprB. Qed. +Proof. by rewrite /sum funrnegN funrposN opprB. Qed. Lemma sumZ S c : sum (c \*o S) = c * sum S. Proof. @@ -1236,7 +1206,7 @@ rewrite (eq_sum (F2 := fun x => Num.sg c * (`|c| * S x))). by move=> x; rewrite mulrA -numEsg. transitivity (Num.sg c * sum (`|c| \*o S)). case: sgrP => [_|gt0_c|lt0_c]; rewrite ?Monoid.simpm. - + by rewrite (eq_sum (F2 := fun _ => 0)) ?sum0 // => x; rewrite !mul0r. + + by rewrite (eq_sum (F2 := cst 0)) ?sum0 // => x; rewrite !mul0r. + by apply/eq_sum=> x; rewrite mul1r. by rewrite mulN1r -sumN; apply/eq_sum=> x; rewrite !mulN1r. rewrite {1}/sum !(eq_psum (fposZ _ _), eq_psum (fnegZ _ _)) //. @@ -1260,13 +1230,13 @@ Lemma sum_finseq S (r : seq T) : Proof. move=> eqr domS; rewrite /sum !(psum_finseq eqr). + move=> x; rewrite !inE => xPS; apply/domS; rewrite !inE. - move: xPS; rewrite /fpos normr_eq0. + move: xPS; rewrite /funrpos. by apply: contra => /eqP ->; rewrite maxxx. + move=> x; rewrite !inE => xPS; apply/domS; rewrite !inE. - move: xPS; rewrite /fneg normr_eq0. - by apply: contra => /eqP ->; rewrite minxx. + move: xPS; rewrite /funrneg. + by apply: contra => /eqP ->; rewrite oppr0 maxxx. rewrite -sumrB; apply/eq_bigr=> i _. -by rewrite !ger0_norm ?(ge0_fpos, ge0_fneg) ?fposBfneg. +by rewrite !ger0_norm// -[in RHS](funrposBneg S). Qed. Lemma sum_seq1 S x : (forall y, S y != 0 -> x == y) -> sum S = S x. diff --git a/theories/esum.v b/theories/esum.v index ea2b226aad..ff375025d0 100644 --- a/theories/esum.v +++ b/theories/esum.v @@ -778,11 +778,6 @@ Section Sum. Implicit Types f (* g *) : T -> \bar R. -(* Use the following function (numfun.funepos.body f \+ numfun.funeneg.body f)%E *) - - Definition fpos f := fun x => `|maxe 0%E (f x)|%E. - Definition fneg f := fun x => `|mine 0%E (f x)|%E. - Lemma min_l (x y : \bar R) : (x <= y -> mine x y = x)%E. Proof. by case: comparableP. Qed. Lemma min_r (x y : \bar R) : (y <= x -> mine x y = y)%E. Proof. by case: comparableP. Qed. @@ -791,52 +786,38 @@ Section Sum. Lemma max_r (x y : \bar R) : (x <= y -> maxe x y = y)%E. Proof. by case: comparableP. Qed. - Lemma fneg_ge0 f x : (forall x, 0%R <= f x)%E -> fneg f x = 0. - Proof. by move => ?; rewrite /fneg min_l ?abse0. Qed. - - Lemma fpos_ge0 f x : (forall x, 0%R <= f x )%E -> fpos f x = f x. - Proof. by move=> ?; rewrite /fpos max_r ?gee0_abs. Qed. + Lemma ge0_funeneg f x : (forall x, 0 <= f x)%E -> f^\- x = 0. + Proof. by move => ?; rewrite funenegE max_r// ?lerN0 oppe_le0. Qed. - Lemma fpos0 x : fpos (fun _ : T => 0) x = 0. - Proof. by rewrite /fpos /maxe ltxx abse0. Qed. + Lemma ge0_funepos f x : (forall x, 0 <= f x)%E -> f^\+ x = f x. + Proof. by move=> ?; rewrite funeposE max_l. Qed. - Lemma fneg0 x : fneg (fun _ : T => 0) x = 0. - Proof. by rewrite /fneg /mine ltxx abse0. Qed. + Lemma funepos_cst0 x : (@cst T _ 0)^\+ x = 0 :> \bar R. + Proof. by rewrite funeposE maxxx. Qed. - Lemma fnegN f : (fneg (\- f ) =1 fpos f)%E. - Proof. by move => x; rewrite /fpos /fneg -{1}oppe0 -oppe_max abseN. Qed. + Lemma funeneg_cst0 x : (@cst T _ 0)^\- x = 0 :> \bar R. + Proof. by rewrite funenegE oppe0 maxxx. Qed. - Lemma fposN f : (fpos (\- f ) =1 fneg f)%E. - Proof. by move=> x; rewrite /fpos /fneg -{1}oppe0 -oppe_min abseN. Qed. - - Lemma le_fpos f1 f2 : ((forall x, f1 x <= f2 x) -> (forall x, fpos f1 x <= fpos f2 x))%E. - Proof. - move=> le_f x; rewrite /fpos !gee0_abs ?le_max ?lexx //. - by rewrite ge_max lexx /=; case: ltP => //=; rewrite le_f. - Qed. + Lemma le_funepos f1 f2 : ((forall x, f1 x <= f2 x) -> (forall x, f1^\+ x <= f2^\+ x))%E. + Proof. by move=> le_f x; rewrite (@funepos_le _ _ setT)// inE. Qed. - Definition sum f : \bar R := esum [set:T] (fpos f) - esum [set:T] (fneg f). + Definition sum f : \bar R := esum [set: T] f^\+ - esum [set: T] f^\-. End Sum. Section SumTheory. Context {R : realType} {T : choiceType}. Implicit Types (S : T -> \bar R). - Lemma sum0 : @sum R _ (fun _ : T => 0%E) = 0%E. - Proof. - rewrite /sum esum1. - + by move => ??; rewrite max_l; [| rewrite abse0]. - by rewrite sube0. - Qed. +Lemma sum0 : @sum R _ (@cst T _ 0) = 0. +Proof. +by rewrite /sum !esum1 ?subee// => r _; rewrite ?[LHS](funepos_cst0,funeneg_cst0). +Qed. Lemma eq_sum S1 S2: S1 =1 S2 -> sum S1 = sum S2. Proof. - move=> eq_fg; rewrite /sum. - rewrite (eq_esum (a:= fpos S2) (b:= fpos S1)). - - by move => ??; rewrite /fpos eq_fg. - rewrite (eq_esum (a:= fneg S2) (b:= fneg S1)). - - by move => ??; rewrite /fneg eq_fg. - by idtac. + move=> eq_fg; rewrite /sum; congr (_ - _). + by apply: eq_esum => t _; rewrite !funeposE eq_fg. + by apply: eq_esum => t _; rewrite !funenegE eq_fg. Qed. Lemma esum_unit S x : @@ -851,76 +832,67 @@ Section SumTheory. Lemma sum_unit S x : sum (fun y => if x == y then S y else 0) = S x. Proof. rewrite /sum. - rewrite (@eq_esum _ _ _ (fpos _) (fun y : T => if x == y then fpos S y else 0%R)). - + move => i ? ; rewrite /fpos /maxe => //=. - case (x == i) => //=. - by case (_ < _)%E; rewrite abse0. - rewrite (@eq_esum _ _ _ (fneg _) (fun y : T => if x == y then fneg S y else 0%R)). - + move => i ? ; rewrite /fneg /mine => //=. - case (x == i) => //=. - by case (_ < _)%E; rewrite abse0. + rewrite (@eq_esum _ _ _ _ (fun y : T => if x == y then S^\+ y else 0%R)). + + move=> i ?. + by rewrite !funeposE; case: ifPn => //; rewrite maxxx. + rewrite [X in _ - X](@eq_esum _ _ _ _ (fun y : T => if x == y then S^\- y else 0%R)). + + move => i ?. + by rewrite !funenegE; case: ifPn => //; rewrite oppe0 maxxx. rewrite !esum_unit. case (comparable_ltP (comparableT (S x) 0)%E) => h;last first. - + rewrite esum_set1. - + by rewrite /fpos max_r ?gee0_abs. + + rewrite esum_set1 ?funepos_ge0//. rewrite esum1. - + by move => i //= ->; rewrite /fneg min_l ?gee0_abs. - by rewrite /fpos max_r ?gee0_abs ?sube0. + + by move => i //= ->; rewrite funenegE max_r// oppe_le0. + by rewrite funeposE max_l// sube0. rewrite esum1. - + by move => i //= ->; rewrite /fpos max_l ?abse0 => //=; apply ltW. + + by move => i //= ->; rewrite funeposE max_r// ltW. rewrite esum_set1. - + by rewrite /fneg min_r ?lte0_abs ?oppe_ge0 => //=; apply ltW. - rewrite /fneg min_r. - + by apply ltW. - rewrite lte0_abs ?sub0e => //=. - by apply (eqe_oppLRP (- (S x))). + + by rewrite funeneg_ge0. + by rewrite funenegE max_l ?oppeK ?add0e// oppe_ge0 ltW. Qed. Section SumTheoryP. - Lemma esum_sum' S : (forall x, 0%:E <= S x)%E -> sum S = esum [set:T] S. + Lemma esum_sum' S : (forall x, 0 <= S x)%E -> sum S = esum [set:T] S. Proof. - move=> ge0_S; rewrite /sum. rewrite (@esum1 R T [set:T] (fneg S)). - + by move => x ?; rewrite fneg_ge0. - by rewrite sube0; apply eq_esum => x ?; rewrite fpos_ge0. + move=> ge0_S; rewrite /sum (@esum1 R T [set:T] S^\-) ?sube0. + by move=> x ?; rewrite ge0_funeneg. + by under eq_esum do rewrite ge0_funepos//. Qed. - Lemma sum_pos S : (forall x, 0%:E <= S x)%E -> (0%R <= sum S)%E. + Lemma sum_pos S : (forall x, 0 <= S x)%E -> (0 <= sum S)%E. Proof. by move=> ge0_S; rewrite esum_sum' // esum_ge0. Qed. Lemma le_sum S1 S2: - ((forall x, 0%:E <= S1 x) -> - (forall x, 0%:E <= S2 x) -> + ((forall x, 0 <= S1 x) -> + (forall x, 0 <= S2 x) -> (forall x, S1 x <= S2 x) -> sum S1 <= sum S2)%E. Proof. - move=> pS1 pS2 leS. rewrite /sum leeB //. - + apply le_esum. - by move => ??; rewrite !fpos_ge0. - apply le_esum. - by move => ??; rewrite !fneg_ge0. + move=> pS1 pS2 leS; rewrite /sum leeB//. + - by apply: le_esum => t _; rewrite !ge0_funepos. + - by apply: le_esum => t _; rewrite !ge0_funeneg. Qed. Lemma sumN S : - (forall x, 0%:E <= S x)%E -> + (forall x, 0 <= S x)%E -> (sum (\- S ) = - sum S)%E. Proof. move => h; rewrite /sum. - rewrite (eq_esum (a:=fpos _) (b:=fun _ : T => 0%E)). - + by move => ?? ; rewrite fposN fneg_ge0. - rewrite (eq_esum (a:= fneg S) (b:= fun _ : T => 0%E)). - + by move => ?? ; rewrite fneg_ge0. - rewrite (eq_esum (a:=fneg (\- S)%E) (b:=fpos S)). - + by move => ?? ; rewrite fnegN. - rewrite esum1 => //=. - by rewrite sube0 sub0e. + rewrite (eq_esum (a:=_^\+) (b:=fun _ : T => 0%E)). + + by move => ?? ; rewrite funeposN ge0_funeneg. + rewrite (eq_esum (a:= S^\-) (b:= fun _ : T => 0%E)). + + by move => ?? ; rewrite ge0_funeneg. + rewrite (eq_esum (a:=(\- S)%E^\-) (b:=S^\+)). + + by move => ?? ; rewrite funenegN. + by rewrite esum1 // sube0 sub0e. Qed. Lemma sumZ S c : (forall x, 0%:E <= S x)%E -> - (sum (fun x => mule c (S x)) = mule c (sum S))%E. + (sum (fun x => c * (S x)) = c * (sum S))%E. Proof. move => h. rewrite (eq_sum (S2 := fun x => esg c * (`|c| * S x))%E). @@ -941,12 +913,11 @@ Section SumTheory. - by move => ?; rewrite mul0e. by rewrite sum0. - rewrite {1}/sum. - rewrite (eq_esum (a:= fpos _) (b:= (fun x : T => `|c| * S x)%E)). - + by move => ??; rewrite fpos_ge0 // => x; rewrite mule_ge0. - rewrite (eq_esum (a:=fneg _) (b:=fun _ : T => 0%E)). - + by move => ?? ; rewrite fneg_ge0 // => x; rewrite mule_ge0. - rewrite (esum1 (a:= fun _ => 0%E)) // sube0. - by rewrite esumZ // muleA -numEsg esum_sum'. + rewrite (eq_esum (a:= _^\+) (b:= fun x : T => `|c| * S x)%E). + + by move=> ? _; rewrite ge0_funepos // => x; rewrite mule_ge0. + rewrite (eq_esum (a:=_^\-) (b := @cst T _ 0)). + + by move => ? _; rewrite ge0_funeneg // => x; rewrite mule_ge0. + by rewrite (esum1 (a := @cst T _ 0))// sube0 esumZ// muleA -numEsg esum_sum'. Qed. End SumTheoryP. @@ -959,9 +930,9 @@ Section SumTheory. sum S1 <= sum S2)%E. Proof. move=> smS1 smS2 leS; rewrite /sum leeB //. - + by apply le_esum => ??; apply le_fpos. + + by apply le_esum => ??; exact: le_funepos. apply le_esum => ??. - rewrite -!fposN. apply le_fpos => ?. + rewrite -!funeposN; apply: le_funepos => ?. by rewrite leeN2. Qed. @@ -1103,7 +1074,7 @@ Qed. apply: eq_imagel => n S. congr ereal_sup. apply: eq_imagel => n' [A _]. - rewrite fsbig_finite //. + by rewrite fsbig_finite. Qed. End mono_esum. From c6e3777423b66e71d953a22a8dcdca81891f1a72 Mon Sep 17 00:00:00 2001 From: Reynald Affeldt Date: Tue, 12 May 2026 12:12:11 +0900 Subject: [PATCH 03/21] linting --- theories/esum.v | 260 ++++++++++++++++++++---------------------------- 1 file changed, 107 insertions(+), 153 deletions(-) diff --git a/theories/esum.v b/theories/esum.v index ff375025d0..5a0629541f 100644 --- a/theories/esum.v +++ b/theories/esum.v @@ -1,5 +1,7 @@ (* mathcomp analysis (c) 2017 Inria and AIST. License: CeCILL-C. *) From mathcomp Require Import all_ssreflect_compat ssralg ssrnum finmap. +#[warning="-warn-library-file-internal-analysis"] +From mathcomp Require Import unstable. From mathcomp Require Import mathcomp_extra boolp classical_sets functions. From mathcomp Require Import cardinality fsbigop reals ereal interval_inference. From mathcomp Require Import topology sequences normedtype numfun. @@ -100,19 +102,14 @@ Proof. by move=> ?; rewrite esum_fset// ?fset_set1// ?fsbig_set1// => t' /[!inE] ->. Qed. -Lemma esum_pos_e a: - ((forall i : T, 0%R <= a i) -> - (0%R = \esum_(x in [set: T]) a x) -> - forall x: T, 0%R = a x)%E. +Lemma esum_eq0P (A : set T) a : (forall i, A i -> 0 <= a i) -> + \esum_(x in A) a x = 0 -> + forall x, A x -> a x = 0. Proof. - move => hi hs x. - apply/eqP;rewrite eq_le; apply/andP; split. - + by apply hi. - + rewrite hs. - apply ereal_sup_ubound => //=. - rewrite -esum_set1 //. - exists [set x]%classic => //. - by rewrite esum_fset. +move=> a0 suma0 x Ax. +apply/eqP; rewrite eq_le a0//= -suma0 ereal_sup_ubound//=. +exists [set x]; first by split => // t ->. +by rewrite -esum_set1 ?a0// esum_fset// => i /[!inE] ->; exact: a0. Qed. End esum_realType. @@ -144,44 +141,26 @@ Lemma eq_esum [R : realType] [T : choiceType] (I : set T) (a b : T -> \bar R) : \esum_(i in I) a i = \esum_(i in I) b i. Proof. by move=> e; apply/eqP; rewrite eq_le !le_esum// => i Ii; rewrite e. Qed. -Lemma esumZ [R : realType] [T : choiceType] S (c : \bar R) : - (0 <= c -> (forall i : T, 0 <= S i) -> - esum [set:T] (fun x => c * (S x)) = c * (esum [set:T] S))%E. +(* TODO: generalize setT to any set *) +Lemma esumZ [R : realType] [T : choiceType] (a : T -> \bar R) + (c : \bar R) : 0 <= c -> (forall t, 0 <= a t) -> + \esum_(t in [set: T]) c * a t = c * \esum_(t in [set: T]) a t. Proof. - rewrite le_eqVlt => /orP[/eqP<-|cgt0]. - - by rewrite mul0e esum1 // => ??; rewrite mul0e. - move => Sg0; apply/eqP; rewrite eq_le; apply/andP; split. - - rewrite ge_ereal_sup//= => x [X [finX XI]] <-. - setoid_rewrite <- (@ge0_mule_fsumr _ _ c S X Sg0). - rewrite lee_pmul //. - + by rewrite ltW. - + by rewrite fsume_ge0 //. - + by rewrite ereal_sup_ubound //=; exists X. - - revert cgt0. - case c => //. - + move => s hs. - rewrite -lee_pdivlMl //. - rewrite ge_ereal_sup//= => _ [X [finX XI]] <-. - rewrite lee_pdivlMl //. - rewrite ge0_mule_fsumr //. - by rewrite ereal_sup_ubound //=; exists X. - + move => h. - have he: (0 <= \esum_(x in [set: T]) S x)%E. - - by apply esum_ge0; move => ??; apply Sg0. - rewrite le_eqVlt in he;revert he. - move => /orP [/eqP Sgt0|Sgt0]. - + rewrite -Sgt0 mule0. - rewrite (eq_esum (b := (fun _ => 0)%E)). - - by intros ??; rewrite -(esum_pos_e (a:= S)) // mule0. - by rewrite esum1. - + rewrite gt0_mulye //. - have [y [H ? ? ?]] := (ereal_sup_gt Sgt0). - rewrite leye_eq; apply/eqP /eq_infty => y'; rewrite esum_ge//. - exists H; move => //. - rewrite -ge0_mule_fsumr //. - subst. - rewrite gt0_mulye //. - by rewrite leey. +rewrite le_eqVlt => /predU1P[<- _|c0 a0]. + by rewrite esum1 ?mul0e// => ? _; rewrite mul0e. +apply/eqP; rewrite eq_le; apply/andP; split. +- rewrite ge_ereal_sup//= => _ [X [finX _]] <-. + by rewrite -ge0_mule_fsumr// (lee_wpmul2l (ltW c0))// esum_ge//; exists X. +- case: c c0 => [s s0|_|//]. + + rewrite -lee_pdivlMl// ge_ereal_sup//= => _ [X [finX XI]] <-. + by rewrite lee_pdivlMl// ge0_mule_fsumr// esum_ge//; exists X. + + have : 0 <= \esum_(x in setT) a x by apply: esum_ge0 => ? _; exact: a0. + rewrite [in X in X -> _]le_eqVlt => /predU1P[<-|suma0]. + + by rewrite mule0 esum_ge0// => ? _; rewrite mule_ge0. + + rewrite gt0_mulye//. + have [y [A fsetsTA yE y0]] := ereal_sup_gt suma0. + rewrite leye_eq; apply/eqP/eq_infty => r; rewrite esum_ge//. + by exists A => //; rewrite -ge0_mule_fsumr// yE gt0_mulye// leey. Qed. Lemma esumD [R : realType] [T : choiceType] (I : set T) (a b : T -> \bar R) : @@ -411,21 +390,17 @@ by rewrite -fsbig_finite//; apply: eq_fsbigr=> x /[!inE]/XQ ?; rewrite invK ?inE Qed. Arguments reindex_esum {R T T'} P Q e a. -Lemma esum_esum' [R : realType] [T U : choiceType] (f: T -> U -> \bar R): - (forall i j, (0%R <= f i j)%E) -> - esum [set:T] (fun x => esum [set:U] (fun y => f x y)) = - esum [set:U] (fun y => esum [set:T] (fun x => f x y)). +(* TODO: rename *) +Lemma esum_esum' [R : realType] [T U : choiceType] A B (f: T -> U -> \bar R): + (forall i j, 0 <= f i j) -> + \esum_(x in A) \esum_(y in B) f x y = \esum_(y in B) \esum_(x in A) f x y. Proof. - move => h. - rewrite !esum_esum //=. - rewrite /setXR. - rewrite (reindex_esum - (fun z=> [set: U]%classic z.1 /\ [set: T]%classic z.2) - (fun z => [set: T]%classic z.1 /\ [set: U]%classic z.2) - (fun x => (x.2, x.1))) //=. - - split => //=. - by move=> [i1 i2] [j1 j2] /= _ _ [] -> ->. - by move=> [i1 i2] [Pi1 Qi2] /=; exists (i2, i1). +move=> f0; rewrite !esum_esum//=. +rewrite (reindex_esum (fun z => A z.1 /\ B z.2) (fun z => B z.1 /\ A z.2) swap)//=. +split. +- by move=> [i j]/= []. +- by move=> [i1 i2] [j1 j2] /[!inE] -[Ai1 Bi2] [Aj1 Bj2] [-> ->]. +- by move=> [i j]/= [Bi Aj]; exists (j, i). Qed. Section nneseries_interchange. @@ -820,14 +795,13 @@ Qed. by apply: eq_esum => t _; rewrite !funenegE eq_fg. Qed. - Lemma esum_unit S x : - esum [set:T] (fun y => if x == y then S y else 0) = \esum_(i in [set x]) S i. - Proof. - rewrite (esum_mkcond [set x] S). - apply eq_esum => i ? //=. - by case_eq (x == i);rewrite eq_sym -in_fset1 -cardinality.fset_set1 - cardinality.in_fset_set => //= ->. - Qed. +(* TODO: rename *) +Lemma esum_unit S x : + \esum_(y in [set: T]) (if x == y then S y else 0) = \esum_(i in [set x]) S i. +Proof. +rewrite [RHS]esum_mkcond. +by under [in RHS]eq_esum do rewrite in_set1 eq_sym. +Qed. Lemma sum_unit S x : sum (fun y => if x == y then S y else 0) = S x. Proof. @@ -853,88 +827,69 @@ Qed. Section SumTheoryP. - Lemma esum_sum' S : (forall x, 0 <= S x)%E -> sum S = esum [set:T] S. + Lemma esum_sum' S : (forall x, 0 <= S x)%E -> sum S = \esum_(i in [set: T]) S i. Proof. - move=> ge0_S; rewrite /sum (@esum1 R T [set:T] S^\-) ?sube0. + move=> ge0_S; rewrite /sum (@esum1 R T [set: T] S^\-) ?sube0. by move=> x ?; rewrite ge0_funeneg. by under eq_esum do rewrite ge0_funepos//. Qed. - Lemma sum_pos S : (forall x, 0 <= S x)%E -> (0 <= sum S)%E. - Proof. - by move=> ge0_S; rewrite esum_sum' // esum_ge0. - Qed. +Lemma sum_ge0 S : (forall x, 0 <= S x) -> 0 <= sum S. +Proof. by move=> ge0_S; rewrite esum_sum' // esum_ge0. Qed. - Lemma le_sum S1 S2: - ((forall x, 0 <= S1 x) -> - (forall x, 0 <= S2 x) -> - (forall x, S1 x <= S2 x) -> - sum S1 <= sum S2)%E. - Proof. - move=> pS1 pS2 leS; rewrite /sum leeB//. - - by apply: le_esum => t _; rewrite !ge0_funepos. - - by apply: le_esum => t _; rewrite !ge0_funeneg. - Qed. +Lemma le_sum S1 S2: (forall x, 0 <= S1 x) -> (forall x, S1 x <= S2 x) -> + sum S1 <= sum S2. +Proof. +move=> pS1 leS. +have pS2 x : 0 <= S2 x by rewrite (le_trans _ (leS _)). +rewrite /sum leeB//. +- by apply: le_esum => t _; rewrite !ge0_funepos. +- by apply: le_esum => t _; rewrite !ge0_funeneg. +Qed. - Lemma sumN S : - (forall x, 0 <= S x)%E -> - (sum (\- S ) = - sum S)%E. - Proof. - move => h; rewrite /sum. - rewrite (eq_esum (a:=_^\+) (b:=fun _ : T => 0%E)). - + by move => ?? ; rewrite funeposN ge0_funeneg. - rewrite (eq_esum (a:= S^\-) (b:= fun _ : T => 0%E)). - + by move => ?? ; rewrite ge0_funeneg. - rewrite (eq_esum (a:=(\- S)%E^\-) (b:=S^\+)). - + by move => ?? ; rewrite funenegN. - by rewrite esum1 // sube0 sub0e. - Qed. +Lemma sumN S : (forall x, 0 <= S x) -> sum (\- S ) = - sum S. +Proof. +move=> S0; rewrite /sum [X in X - _ = _]esum1 ?add0r. + by move=> t _; rewrite funeposN ge0_funeneg. +rewrite [X in _ = - (_ - X)]esum1 ?sube0. + by move=> t _; rewrite ge0_funeneg. +by under eq_esum do rewrite funenegN. +Qed. - Lemma sumZ S c : - (forall x, 0%:E <= S x)%E -> - (sum (fun x => c * (S x)) = c * (sum S))%E. - Proof. - move => h. - rewrite (eq_sum (S2 := fun x => esg c * (`|c| * S x))%E). - by move=> x ; rewrite muleA -numEsg. - transitivity (esg c * sum (fun x => `|c| * (S x)))%E. - - case (comparable_ltgtP (comparableT c 0)%E) => hc. - + rewrite {1}lte0_abs // gte0_esg //. - rewrite (eq_sum (S2 := fun x : T => (- (- c * S x))%E)). - - by move => ?; rewrite mulN1e. - rewrite mulN1e -sumN;[|rewrite lte0_abs //]. - by move => ?; rewrite mule_ge0. - + rewrite gte0_abs // lte0_esg // mul1e. - rewrite (eq_sum (S2 := fun x : T => ( c * S x)%E)). - - by move => ?; rewrite mul1e. - by idtac. - + rewrite hc esg0 mul0e. - rewrite (eq_sum (S2 := fun _ : T => 0%E)). - - by move => ?; rewrite mul0e. - by rewrite sum0. - - rewrite {1}/sum. - rewrite (eq_esum (a:= _^\+) (b:= fun x : T => `|c| * S x)%E). - + by move=> ? _; rewrite ge0_funepos // => x; rewrite mule_ge0. - rewrite (eq_esum (a:=_^\-) (b := @cst T _ 0)). - + by move => ? _; rewrite ge0_funeneg // => x; rewrite mule_ge0. - by rewrite (esum1 (a := @cst T _ 0))// sube0 esumZ// muleA -numEsg esum_sum'. - Qed. +Lemma sumZ S c : (forall x, 0 <= S x) -> sum (fun x => c * S x) = c * sum S. +Proof. +move=> h. +rewrite (@eq_sum _ (fun x => esg c * (`|c| * S x))). + by move=> x; rewrite muleA -numEsg. +transitivity (esg c * sum (fun x => `|c| * S x)). + have [hc|hc|->] := comparable_ltgtP (comparableT c 0). + + rewrite {1}lte0_abs// gte0_esg// (@eq_sum _ (fun x => - (- c * S x))). + by move => ?; rewrite mulN1e. + rewrite mulN1e -sumN; last by rewrite lte0_abs. + by move=> ?; rewrite mule_ge0. + + rewrite gte0_abs// lte0_esg// mul1e (@eq_sum _ (fun x => c * S x))//. + by move=> ?; rewrite mul1e. + + under eq_sum do rewrite esg0 mul0e. + by rewrite esg0 mul0e sum0. +- rewrite {1}/sum (@eq_esum _ _ _ _ (fun x => `|c| * S x))//. + by move=> ? _; rewrite ge0_funepos // => x; rewrite mule_ge0. + rewrite (@eq_esum _ _ _ (_^\-) (@cst T _ 0)). + by move => ? _; rewrite ge0_funeneg // => x; rewrite mule_ge0. + by rewrite (@esum1 _ _ _ (cst 0))// sube0 esumZ// muleA -numEsg esum_sum'. +Qed. End SumTheoryP. Section SumTheoryS. - Lemma le_sum_s S1 S2 : - (summable [set:T] S1 -> summable [set : T] S2 -> - (forall x, S1 x <= S2 x) -> - sum S1 <= sum S2)%E. - Proof. - move=> smS1 smS2 leS; rewrite /sum leeB //. - + by apply le_esum => ??; exact: le_funepos. - apply le_esum => ??. - rewrite -!funeposN; apply: le_funepos => ?. - by rewrite leeN2. - Qed. +Lemma summable_le_sum S1 S2 : summable [set : T] S2 -> + (forall x, S1 x <= S2 x) -> sum S1 <= sum S2. +Proof. +move=> smS2 leS; rewrite /sum leeB//. + by apply: le_esum => ? ?; exact: le_funepos. +apply le_esum => t _. +by rewrite -!funeposN; apply: le_funepos => ?; rewrite leeN2. +Qed. End SumTheoryS. @@ -1062,19 +1017,18 @@ Qed. exact: key. Qed. - Lemma esum_esup_comm : - (\esum_(i in [set: T]) ereal_sup (range (f i)))%E = - (ereal_sup (range (fun n => esum [set:T] (fun x : T => f x n))))%E. - Proof. - rewrite /esum. - under eq_imagel => A [fin ?] do - rewrite fsbig_finite // ereal_sup_sum //. - rewrite ereal_sup_comm. - congr ereal_sup. - apply: eq_imagel => n S. - congr ereal_sup. - apply: eq_imagel => n' [A _]. - by rewrite fsbig_finite. +Lemma esum_esup_comm : + \esum_(i in [set: T]) ereal_sup (range (f i)) = + ereal_sup (range (fun n => \esum_(x in [set:T]) f x n)). +Proof. +rewrite /esum. +under eq_imagel => A [fin ?] do rewrite fsbig_finite// ereal_sup_sum//. +rewrite ereal_sup_comm. +congr ereal_sup. +apply: eq_imagel => n _. +congr ereal_sup. +apply: eq_imagel => A [finA _]. +by rewrite fsbig_finite. Qed. End mono_esum. From a79a80fea3cc69e9a3ea3e279f42154237d0a1f9 Mon Sep 17 00:00:00 2001 From: Lionel Blatter Date: Tue, 12 May 2026 22:30:05 +0200 Subject: [PATCH 04/21] Add additonal lemmas --- experimental_reals/edistr.v | 11 +++++++++-- theories/esum.v | 13 ++++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/experimental_reals/edistr.v b/experimental_reals/edistr.v index e909f369b0..a06c99220f 100644 --- a/experimental_reals/edistr.v +++ b/experimental_reals/edistr.v @@ -97,7 +97,14 @@ Section PrCoreTheory. by move => ?; rewrite mule_ge0 // lee_tofin. Qed. - (* Lemma expZ mu F c : \E_[mu] (c \*o F) = c * \E_[mu] F. *) - (* Proof. by rewrite -sumZ; apply/eq_sum=> x /=; rewrite mulrA. Qed. *) + Lemma expZ mu F c : + (forall x, 0%:E <= F x)%E -> + espe mu (fun x => mule c (F x)) = mule c (espe mu F). + Proof. + move => h. + rewrite -sumZ. + + by move => x; rewrite mule_ge0 // lee_tofin. + by apply/eq_sum=> x; rewrite muleA. + Qed. End PrCoreTheory. diff --git a/theories/esum.v b/theories/esum.v index 5a0629541f..02450134e8 100644 --- a/theories/esum.v +++ b/theories/esum.v @@ -862,7 +862,7 @@ move=> h. rewrite (@eq_sum _ (fun x => esg c * (`|c| * S x))). by move=> x; rewrite muleA -numEsg. transitivity (esg c * sum (fun x => `|c| * S x)). - have [hc|hc|->] := comparable_ltgtP (comparableT c 0). +- have [hc|hc|->] := comparable_ltgtP (comparableT c 0). + rewrite {1}lte0_abs// gte0_esg// (@eq_sum _ (fun x => - (- c * S x))). by move => ?; rewrite mulN1e. rewrite mulN1e -sumN; last by rewrite lte0_abs. @@ -891,6 +891,17 @@ apply le_esum => t _. by rewrite -!funeposN; apply: le_funepos => ?; rewrite leeN2. Qed. +Lemma summable_sumN S : summable [set : T] S -> sum (\- S ) = - sum S. +Proof. + move => hs. + rewrite /sum funenegN funeposN addeC oppeB //= adde_defC. + apply : fin_num_adde_defl. + have := (summable_funepos hs). + rewrite summableE. + rewrite (@eq_esum _ _ _ (fun y : T => S^\+ y) (fun y : T => `|S^\+ y|)) //=. + by move => ??; rewrite gee0_abs. +Qed. + End SumTheoryS. End SumTheory. From 1aaef4bf5793c7adf92ecf4ac81ca81fb3520e5b Mon Sep 17 00:00:00 2001 From: Lionel Blatter Date: Thu, 14 May 2026 14:38:32 +0200 Subject: [PATCH 05/21] Add aditional lemmas --- theories/esum.v | 207 +++++++++++++++++++++++++++++------------------- 1 file changed, 127 insertions(+), 80 deletions(-) diff --git a/theories/esum.v b/theories/esum.v index 02450134e8..1b2befe5d7 100644 --- a/theories/esum.v +++ b/theories/esum.v @@ -783,10 +783,10 @@ Section SumTheory. Context {R : realType} {T : choiceType}. Implicit Types (S : T -> \bar R). -Lemma sum0 : @sum R _ (@cst T _ 0) = 0. -Proof. -by rewrite /sum !esum1 ?subee// => r _; rewrite ?[LHS](funepos_cst0,funeneg_cst0). -Qed. + Lemma sum0 : @sum R _ (@cst T _ 0) = 0. + Proof. + by rewrite /sum !esum1 ?subee// => r _; rewrite ?[LHS](funepos_cst0,funeneg_cst0). + Qed. Lemma eq_sum S1 S2: S1 =1 S2 -> sum S1 = sum S2. Proof. @@ -795,13 +795,13 @@ Qed. by apply: eq_esum => t _; rewrite !funenegE eq_fg. Qed. -(* TODO: rename *) -Lemma esum_unit S x : - \esum_(y in [set: T]) (if x == y then S y else 0) = \esum_(i in [set x]) S i. -Proof. -rewrite [RHS]esum_mkcond. -by under [in RHS]eq_esum do rewrite in_set1 eq_sym. -Qed. + (* TODO: rename *) + Lemma esum_unit S x : + \esum_(y in [set: T]) (if x == y then S y else 0) = \esum_(i in [set x]) S i. + Proof. + rewrite [RHS]esum_mkcond. + by under [in RHS]eq_esum do rewrite in_set1 eq_sym. + Qed. Lemma sum_unit S x : sum (fun y => if x == y then S y else 0) = S x. Proof. @@ -827,80 +827,127 @@ Qed. Section SumTheoryP. - Lemma esum_sum' S : (forall x, 0 <= S x)%E -> sum S = \esum_(i in [set: T]) S i. - Proof. - move=> ge0_S; rewrite /sum (@esum1 R T [set: T] S^\-) ?sube0. - by move=> x ?; rewrite ge0_funeneg. - by under eq_esum do rewrite ge0_funepos//. - Qed. - -Lemma sum_ge0 S : (forall x, 0 <= S x) -> 0 <= sum S. -Proof. by move=> ge0_S; rewrite esum_sum' // esum_ge0. Qed. - -Lemma le_sum S1 S2: (forall x, 0 <= S1 x) -> (forall x, S1 x <= S2 x) -> - sum S1 <= sum S2. -Proof. -move=> pS1 leS. -have pS2 x : 0 <= S2 x by rewrite (le_trans _ (leS _)). -rewrite /sum leeB//. -- by apply: le_esum => t _; rewrite !ge0_funepos. -- by apply: le_esum => t _; rewrite !ge0_funeneg. -Qed. - -Lemma sumN S : (forall x, 0 <= S x) -> sum (\- S ) = - sum S. -Proof. -move=> S0; rewrite /sum [X in X - _ = _]esum1 ?add0r. - by move=> t _; rewrite funeposN ge0_funeneg. -rewrite [X in _ = - (_ - X)]esum1 ?sube0. - by move=> t _; rewrite ge0_funeneg. -by under eq_esum do rewrite funenegN. -Qed. - -Lemma sumZ S c : (forall x, 0 <= S x) -> sum (fun x => c * S x) = c * sum S. -Proof. -move=> h. -rewrite (@eq_sum _ (fun x => esg c * (`|c| * S x))). - by move=> x; rewrite muleA -numEsg. -transitivity (esg c * sum (fun x => `|c| * S x)). -- have [hc|hc|->] := comparable_ltgtP (comparableT c 0). - + rewrite {1}lte0_abs// gte0_esg// (@eq_sum _ (fun x => - (- c * S x))). - by move => ?; rewrite mulN1e. - rewrite mulN1e -sumN; last by rewrite lte0_abs. - by move=> ?; rewrite mule_ge0. - + rewrite gte0_abs// lte0_esg// mul1e (@eq_sum _ (fun x => c * S x))//. - by move=> ?; rewrite mul1e. - + under eq_sum do rewrite esg0 mul0e. - by rewrite esg0 mul0e sum0. -- rewrite {1}/sum (@eq_esum _ _ _ _ (fun x => `|c| * S x))//. - by move=> ? _; rewrite ge0_funepos // => x; rewrite mule_ge0. - rewrite (@eq_esum _ _ _ (_^\-) (@cst T _ 0)). - by move => ? _; rewrite ge0_funeneg // => x; rewrite mule_ge0. - by rewrite (@esum1 _ _ _ (cst 0))// sube0 esumZ// muleA -numEsg esum_sum'. -Qed. + Lemma esum_sum' S : (forall x, 0 <= S x)%E -> sum S = \esum_(i in [set: T]) S i. + Proof. + move=> ge0_S; rewrite /sum (@esum1 R T [set: T] S^\-) ?sube0. + by move=> x ?; rewrite ge0_funeneg. + by under eq_esum do rewrite ge0_funepos//. + Qed. + + Lemma sum_ge0 S : (forall x, 0 <= S x) -> 0 <= sum S. + Proof. by move=> ge0_S; rewrite esum_sum' // esum_ge0. Qed. + + Lemma le_sum S1 S2: (forall x, 0 <= S1 x) -> (forall x, S1 x <= S2 x) -> + sum S1 <= sum S2. + Proof. + move=> pS1 leS. + have pS2 x : 0 <= S2 x by rewrite (le_trans _ (leS _)). + rewrite /sum leeB//. + - by apply: le_esum => t _; rewrite !ge0_funepos. + - by apply: le_esum => t _; rewrite !ge0_funeneg. + Qed. + + Lemma sumN S : (forall x, 0 <= S x) -> sum (\- S ) = - sum S. + Proof. + move=> S0; rewrite /sum [X in X - _ = _]esum1 ?add0r. + by move=> t _; rewrite funeposN ge0_funeneg. + rewrite [X in _ = - (_ - X)]esum1 ?sube0. + by move=> t _; rewrite ge0_funeneg. + by under eq_esum do rewrite funenegN. + Qed. + + Lemma sumZ S c : (forall x, 0 <= S x) -> sum (fun x => c * S x) = c * sum S. + Proof. + move=> h. + rewrite (@eq_sum _ (fun x => esg c * (`|c| * S x))). + by move=> x; rewrite muleA -numEsg. + transitivity (esg c * sum (fun x => `|c| * S x)). + - have [hc|hc|->] := comparable_ltgtP (comparableT c 0). + + rewrite {1}lte0_abs// gte0_esg// (@eq_sum _ (fun x => - (- c * S x))). + by move => ?; rewrite mulN1e. + rewrite mulN1e -sumN; last by rewrite lte0_abs. + by move=> ?; rewrite mule_ge0. + + rewrite gte0_abs// lte0_esg// mul1e (@eq_sum _ (fun x => c * S x))//. + by move=> ?; rewrite mul1e. + + under eq_sum do rewrite esg0 mul0e. + by rewrite esg0 mul0e sum0. + - rewrite {1}/sum (@eq_esum _ _ _ _ (fun x => `|c| * S x))//. + by move=> ? _; rewrite ge0_funepos // => x; rewrite mule_ge0. + rewrite (@eq_esum _ _ _ (_^\-) (@cst T _ 0)). + by move => ? _; rewrite ge0_funeneg // => x; rewrite mule_ge0. + by rewrite (@esum1 _ _ _ (cst 0))// sube0 esumZ// muleA -numEsg esum_sum'. + Qed. End SumTheoryP. Section SumTheoryS. -Lemma summable_le_sum S1 S2 : summable [set : T] S2 -> - (forall x, S1 x <= S2 x) -> sum S1 <= sum S2. -Proof. -move=> smS2 leS; rewrite /sum leeB//. - by apply: le_esum => ? ?; exact: le_funepos. -apply le_esum => t _. -by rewrite -!funeposN; apply: le_funepos => ?; rewrite leeN2. -Qed. - -Lemma summable_sumN S : summable [set : T] S -> sum (\- S ) = - sum S. -Proof. - move => hs. - rewrite /sum funenegN funeposN addeC oppeB //= adde_defC. - apply : fin_num_adde_defl. - have := (summable_funepos hs). - rewrite summableE. - rewrite (@eq_esum _ _ _ (fun y : T => S^\+ y) (fun y : T => `|S^\+ y|)) //=. - by move => ??; rewrite gee0_abs. -Qed. + Lemma summable_le_sum S1 S2 : summable [set : T] S2 -> + (forall x, S1 x <= S2 x) -> sum S1 <= sum S2. + Proof. + move=> smS2 leS; rewrite /sum leeB//. + by apply: le_esum => ? ?; exact: le_funepos. + apply le_esum => t _. + by rewrite -!funeposN; apply: le_funepos => ?; rewrite leeN2. + Qed. + + Lemma summable_esum_funepos S : + summable [set: T] S -> \esum_(t in [set: T]) S^\+ t \is a fin_num. + Proof. + move => /summable_funepos. + rewrite summableE. + rewrite (@eq_esum _ _ _ (fun y : T => S^\+ y) (fun y : T => `|S^\+ y|)) //=. + by move => ??; rewrite gee0_abs. + Qed. + + Lemma summable_sumN S : summable [set : T] S -> sum (\- S ) = - sum S. + Proof. + move => hs. + rewrite /sum funenegN funeposN addeC oppeB //= adde_defC. + apply : fin_num_adde_defl. + by apply : summable_esum_funepos. + Qed. + + Lemma summableZ c S : + `|c| \is a fin_num -> + summable [set: T] (fun x : T => S x) -> + summable [set: T] (fun x : T => `|c| * S x). + Proof. + rewrite /summable. + move => hc h. + rewrite (@eq_esum _ _ _ _ (fun x => `|c| * `|S x|)). + + move => i ?. + by rewrite abseM abse_id. + rewrite esumZ //. + by apply: lte_mul_pinfty. + Qed. + + Lemma summable_sumZ S c : + `|c| \is a fin_num -> summable [set : T] S -> sum (fun x => c * S x) = c * sum S. + Proof. + move => hf h. + rewrite (@eq_sum _ (fun x => esg c * (`|c| * S x))). + by move=> x; rewrite muleA -numEsg. + transitivity (esg c * sum (fun x => `|c| * S x)). + - have [hc|hc|->] := comparable_ltgtP (comparableT c 0). + + rewrite {1}lte0_abs// gte0_esg// (@eq_sum _ (fun x => - (- c * S x))). + by move => ?; rewrite mulN1e. + rewrite mulN1e -summable_sumN; last by rewrite lte0_abs. + by apply: summableZ. + + rewrite gte0_abs// lte0_esg// mul1e (@eq_sum _ (fun x => c * S x))//. + by move=> ?; rewrite mul1e. + + under eq_sum do rewrite esg0 mul0e. + by rewrite esg0 mul0e sum0. + - rewrite {1}/sum. + rewrite (@eq_esum _ _ _ _ (fun x => `|c| * S^\+ x)). + by move=> i _ //=; rewrite -(fineK (x:= `|c|)) // ge0_funeposM. + rewrite (@eq_esum _ _ _ (fun x : T => `|c| * S x)^\- (fun x => `|c| * S^\- x)). + by move=> i _ //=; rewrite -(fineK (x:= `|c|)) // ge0_funenegM. + rewrite !esumZ // -muleBr //=. + + rewrite adde_defC fin_num_adde_defl //. + by apply : summable_esum_funepos. + by rewrite muleA -numEsg. + Qed. End SumTheoryS. From 43050766f576dc3d85f3561f40d8569656e399ff Mon Sep 17 00:00:00 2001 From: Reynald Affeldt Date: Wed, 20 May 2026 11:18:23 +0900 Subject: [PATCH 06/21] esum lemmas from PR 1954 --- CHANGELOG_UNRELEASED.md | 35 +++ _CoqProject | 1 - experimental_reals/distr.v | 231 ------------------- experimental_reals/edistr.v | 110 --------- experimental_reals/realsum.v | 99 +++----- theories/esum.v | 428 +++++++++++++++++------------------ 6 files changed, 276 insertions(+), 628 deletions(-) delete mode 100644 experimental_reals/edistr.v diff --git a/CHANGELOG_UNRELEASED.md b/CHANGELOG_UNRELEASED.md index 1100d1bebb..32530a9d9b 100644 --- a/CHANGELOG_UNRELEASED.md +++ b/CHANGELOG_UNRELEASED.md @@ -92,6 +92,23 @@ + lemma `diffmx` + lemma `is_diff_mx` + instance `is_diff_mx` +- in `realsum.v`: + + lemma `esum_psum` + + lemma `sum_sum` + +- in `esum.v`: + + lemmas `esum_eq0P`, `esumZ`, `esum_esum'` + + definition `esg` + + lemmas `numEsg`, `gte0_esg`, `lte0_esg`, `esg0` + + lemmas `ge0_funeneg`, `ge0_funepos`, `funepos_cst0`, `funeneg_cst0`, + `le_funepos` + + definition `sum` + + lemmas `sum0`, `eq_sum`, `esum_unit`, `sum_unit` + + lemmas `esum_sum'`, `sum_ge0`, `le_sum`, `sumN`, `sumZ` + + lemmas `summable_le_sum`, `summable_esum_funepos`, `summable_sumN`, + `summableZ`, `summable_sumZ` + + lemmas `ereal_sup_comm` + + lemmas `esupZl`, `esupZl_range`, `esup_add`, `ereal_sup_sum`, `esum_esup_comm` - in `reals.v`: + lemmas `sup_ge0`, `has_sup_wpZl`, `gt0_has_supZl`, `has_sup_Mn`, `sup_Mn` @@ -222,6 +239,18 @@ + lemmas `Radon_NikodymE`, `Radon_Nikodym_fin_num`, `Radon_Nikodym_integrable`, `ae_eq_Radon_Nikodym_SigmaFinite`, `Radon_Nikodym_change_of_variables`, `Radon_Nikodym_cscale`, `Radon_Nikodym_cadd`, `Radon_Nikodym_chain_rule` +- in `realsum.v`: + + now use `funrpos` and `funrneg`: + * lemmas `eq_fpos`, `eq_fneg` + * lemma `fpos0` (renamed to `funrpos_cst0`) + * lemma `fneg0` (renamed to `funrneg_cst0`) + * lemmas `fposZ`, `fnegZ` + * lemmas `fpos_natrM`, `fneg_natrM` + * lemmas `fneg_ge0`, `fpos_ge0` + * lemmas `le_fpos_norm`, `le_fpos` + * definition `sum` + * lemmas `summable_fpos`, `summable_fneg` + + lemma `sum0` (now uses `cst`) ### Renamed @@ -303,6 +332,12 @@ - in `measurable_structure.v`: + lemmas `measurable_prod_g_measurableType`, `measurable_prod_g_measurableTypeR` +- in `realsum.v`: + + definitions `fpos`, `fneg` (use `funrpos`, `funrneg` instead) + + lemmas `fnegN`, `fposN` + + lemmas `ge0_pos`, `ge0_neg` + + lemma `fposBfneg` + ### Infrastructure ### Misc diff --git a/_CoqProject b/_CoqProject index 5da7e51a7b..f0b745c7f6 100644 --- a/_CoqProject +++ b/_CoqProject @@ -39,7 +39,6 @@ experimental_reals/discrete.v experimental_reals/realseq.v experimental_reals/realsum.v experimental_reals/distr.v -experimental_reals/edistr.v reals_stdlib/Rstruct.v reals_stdlib/nsatz_realtype.v diff --git a/experimental_reals/distr.v b/experimental_reals/distr.v index 2bbac0aae7..847698b84e 100644 --- a/experimental_reals/distr.v +++ b/experimental_reals/distr.v @@ -8,7 +8,6 @@ From mathcomp Require Import all_ssreflect_compat all_algebra. From mathcomp.classical Require Import boolp classical_sets mathcomp_extra. From mathcomp Require Import xfinmap constructive_ereal reals discrete. From mathcomp Require Import realseq realsum. -From mathcomp Require Import fsbigop. Set Implicit Arguments. Unset Strict Implicit. @@ -1265,233 +1264,3 @@ End Jensen. End Jensen. Notation convex f := (convexon \-inf \+inf f). - -(* -------------------------------------------------------------------- *) - -Section mono. - Context - {R : realType} - {T : choiceType} - {f : nat -> distr R T} - (hmono : (forall n m : nat, (n <= m)%N -> forall x : T, f n x <= f m x)). - - Lemma cvg_f: forall x, exists l, ncvg (fun n => f n x) l%:E. - Proof. - move=> x; apply: ncvg_mono_bnd; first by move=> *; apply: hmono. - apply/asboolP/nboundedP => /=; exists 2%:R => //. - move=> n; rewrite ger0_norm ?ge0_mu //; apply: (@le_lt_trans _ _ 1%:R). - - by apply: le1_mu1. - by apply: ltr_nat. - Qed. - - Lemma cvg_l : exists l, forall x, ncvg (fun n => f n x) (l x)%:E. - Proof. - have wtn: forall x, exists l, `[< ncvg (fun n => f n x) l%:E >]. - - by move=> x; apply/exists_asboolP/asboolP/cvg_f. - exists (fun x => xchoose (wtn x)) => x. - by apply/asboolP/(xchooseP (wtn x)). - Qed. -End mono. - -Section mono_sum. - Context - {R : realType} - {T : choiceType} - {f : nat -> distr R T} - (hmono : (forall n m : nat, (n <= m)%N -> forall x : T, f n x <= f m x)). - - Lemma mono_psum_Efn (E: T -> R): - (forall m, 0 <= E m)%R -> - (forall n, summable (fun x => E x * f n x)) -> - forall m n, (m <= n)%N -> - psum (fun x => E x * f m x) <= psum (fun x => E x * f n x). - Proof. - move=> hE smb_Efn m n le_mn. - apply /le_psum /smb_Efn. - move => x; rewrite mulr_ge0 //=. - by apply: ler_pM => //; apply: hmono. - Qed. - - Lemma ncvg_lp (E: T -> R) r: - (forall m, 0 <= E m)%R -> - (forall n, summable (fun x => E x * f n x)) -> - (forall n : nat, psum (fun x => E x * f n x) <= r) -> - exists lp, ncvg (fun n => psum (fun x => E x * f n x)) lp%:E. - Proof. - move => He smb_Efn h. - have hr : (0 <= r)%R. - - apply: (le_trans (y:= psum (fun x => E x * f 0 x))). - - by apply: ge0_psum. - by apply: h. - apply: ncvg_mono_bnd ; first by apply: mono_psum_Efn. - apply/asboolP/nboundedP => /=. - exists (r + 1). - - by apply ltr_wpDl. - move => n; rewrite ger0_norm 1?ge0_psum //; apply/(le_lt_trans (y := r)). - - apply h. - by apply ltr_pwDr. - Qed. - - Lemma sum_dlim_r [E : T -> R] [r : R]: - summable E -> - (forall m, 0 <= E m)%R -> - (forall (n : nat), psum (fun x : T => E x * f n x) <= r)%R -> - (psum (fun x : T => E x * (\dlim_(n) f n) x) <= r)%R. - Proof. - move => smb_E hE h. - have [l cvgfx]:= @cvg_l R T f hmono. - have ge0_l: forall x, 0 <= l x. - - by move=> x; apply: (ncvg_geC _ (cvgfx x)) => n; apply: ge0_mu. - have cvgEfx: forall x, ncvg (fun n => E x * f n x) (E x * l x)%:E. - - by move=> x; apply/ncvgZ. - rewrite (@eq_psum _ _ _ (fun x => fine (nlim (fun n => E x * f n x)))). - - move => x /=; rewrite dlimE (nlimE (cvgfx x)) /=. - by have /(ncvgZ (c := E x)) /nlimE -> /= := cvgfx x. - rewrite (@eq_psum _ _ _ (fun x => E x * l x)). - - by move=> x /=; have /(ncvgZ (c := E x)) /nlimE -> := cvgfx x. - apply: psum_le => J uqJ. - have ncvgJ: ncvg (fun n => \sum_(j <- J) E j * f n j) (\sum_(j <- J) E j * (l j))%:E. - - by apply: (ncvg_mono_sum cvgEfx). - have smb_Efn: forall n, summable (fun x => E x * f n x). - - move=> n; apply summableM. - exact: smb_E. - apply summable_mu. - have [lp ncvg_lp] := @ncvg_lp _ r hE smb_Efn h. - have le1_lp: lp <= r. - - apply: (@ncvg_leC _ r _ _ _ ncvg_lp). - exact : h. - apply: (le_trans (y :=fine (nlim (fun n : nat => \sum_(j <- J) E j * f n j)))). - - rewrite (nlimE ncvgJ) /=; apply: ler_sum => x _. - rewrite ger0_norm; auto. - by apply mulr_ge0. - rewrite (nlimE ncvgJ) /=. - apply (le_trans (y:= lp)). - - apply: (ncvg_le _ ncvg_lp ncvgJ) => n. - apply/(le_trans _): (ger_big_psum uqJ (smb_Efn n)). - by apply/ler_sum => x _; apply/ler_norm. - exact: le1_lp. - Qed. - - Lemma sum_dlim (E : pred T) : - psum (fun x : T => (E x)%:R * (\dlim_(n) f n) x) = - fine (nlim (fun n => psum (fun x : T => (E x)%:R * f n x))). - Proof. - have [l cvgfx]:= @cvg_l R T f hmono. - have cvgEfx: forall x, ncvg (fun n => (E x)%:R * f n x) ((E x)%:R * l x)%:E. - - by move=> x; apply/ncvgZ. - have ge0_l: forall x, 0 <= l x. - - by move=> x; apply: (ncvg_geC _ (cvgfx x)) => n; apply: ge0_mu. - transitivity (psum (fun x => fine (nlim (fun n => (E x)%:R * f n x)))). - - apply: eq_psum => x /=; rewrite dlimE (nlimE (cvgfx x)) /=. - by have /(ncvgZ (c := (E x)%:R)) /nlimE -> /= := cvgfx x. - transitivity (psum (fun x => (E x)%:R * l x)); first apply: eq_psum. - - by move=> x /=; have /(ncvgZ (c := (E x)%:R)) /nlimE -> := cvgfx x. - have smb_Efn: forall n, summable (fun x => (E x)%:R * f n x). - - by move=> n; apply: (summable_pr E (f n)). - have le1_psum_Efn: forall n, psum (fun x => (E x)%:R * f n x) <= 1. - - by move=> n; apply/le1_pr. - have hE: forall x : T, 0 <= (E x)%:R. by auto. - have [lp ncvg_lp] := @ncvg_lp _ _ (hE R) smb_Efn le1_psum_Efn. - have le1_lp: lp <= 1. - - by move/ncvg_leC: ncvg_lp; apply; apply/le1_psum_Efn. - have smb_Ef: summable (fun x => (E x)%:R * l x). - - exists 1 => J; rewrite -(finmap.big_seq_fsetE _ _ predT (fun x => `|(E x)%:R * l x|)) /=. - apply: (le_trans (y := \sum_(x <- finmap.enum_fset J) (l x))). - - apply: ler_sum => /= j _; rewrite ger0_norm 1?mulr_ge0 //. - by apply: ler_piMl => //; case: (E _). - have: ncvg (fun n => \sum_(x <- finmap.enum_fset J) (f n x)) (\sum_(x <- finmap.enum_fset J) l x)%:E. - - by apply: ncvg_mono_sum. - move/ncvg_leC => /(_ 1); apply => n /=. - have /gerfin_psum := summable_mu (f n) => /(_ J). - move/le_trans => /= /(_ _ (le1_mu (f n))); apply/le_trans. - by rewrite finmap.big_seq_fsetE; apply: ler_sum => j _ /=; apply/ler_norm. - apply/eqP; rewrite eq_le; apply/andP; split. - - apply: psum_le => J uqJ. - have ncvgJ: - ncvg (fun n => \sum_(j <- J) (E j)%:R * f n j) (\sum_(j <- J) (E j)%:R * (l j))%:E. - - by apply: (ncvg_mono_sum cvgEfx). - apply: (le_trans (y := fine (nlim (fun n => \sum_(j <- J) (E j)%:R * f n j)))); last first. - - rewrite (nlimE ncvgJ) (nlimE ncvg_lp) /=. - apply: (ncvg_le _ ncvg_lp ncvgJ) => n. - apply/(le_trans _): (ger_big_psum uqJ (smb_Efn n)). - by apply/ler_sum => x _; apply/ler_norm. - rewrite (nlimE ncvgJ) /=; apply: ler_sum => x _. - by rewrite ger0_norm // mulr_ge0. - - rewrite (nlimE ncvg_lp) /=; apply: (ncvg_leC _ ncvg_lp) => n. - apply: le_psum => // x; rewrite mulr_ge0 //=. - apply: ler_pM => //; apply: (ncvg_homo_le _ (cvgfx x)). - by move=> *; apply: hmono. - Qed. - -End mono_sum. - -From mathcomp Require Import ereal esum. - -Section mono_esum. - Context - {R : realType} - {T : choiceType} - {f : nat -> distr R T} - (hmono : (forall n m : nat, (n <= m)%N -> forall x : T, f n x <= f m x)). - - Lemma mono_esum_Efn (E: T -> \bar R): - (forall m, 0 <= E m)%E -> - forall m n, (m <= n)%N -> - (esum [set:T] (fun x => E x * (f m x)%:E) <= - esum [set:T] (fun x => E x * (f n x)%:E))%E. - Proof. - move=> hE m n le_mn. - apply /esum.le_esum. - move => ??; rewrite lee_pmul => //=. - - rewrite lee_tofin //. - - rewrite lee_tofin //; exact: hmono. - Qed. - - Lemma ncvg_dlim a : ncvg (fun n : nat => f n a) ((\dlim_(n) f n) a)%:E. - Proof. - case : (dlimP (fun n => f n) a) => [l _ _ h | habs] //. - exfalso; apply habs. - apply dcvg_homo => n m hnm b. - by rewrite hmono. - Qed. - - Lemma ereal_sup_sup a : - ereal_sup (range (fun n => (f n a)%:E)) = (sup ([set r | exists n, r = (f n a) ]))%:E. - Proof. - rewrite -ereal_sup_EFin. - - exists 1%R => r //= [n ->]; exact: le1_mu1. - - exists (f 0%N a); exists 0%N => //. - - congr ereal_sup. - apply /seteqP; split. - - by move => p [n _ hn]; exists (f n a) => //; exists n. - - by move => x [_ [n ->] <- ] //=; exists n. - Qed. - - Lemma distr_lub_sup a : - ((dlim f) a)%:E = ereal_sup (range (fun n => (f n a)%:E)). - Proof. - unfold image. - rewrite ereal_sup_sup. - apply /ereal_eqP /eqP /esym; apply :nlim_sup. - - by move => n m h; rewrite hmono. - - exact: ncvg_dlim. - Qed. - - Lemma esum_dlim_r [E : T -> \bar R] [r : \bar R]: - (forall m, 0 <= E m)%E -> - (forall (n : nat), esum [set:T] (fun x : T => E x * (f n x)%:E) <= r)%E -> - (esum [set:T] (fun x : T => E x * ((\dlim_(n) f n) x)%:E) <= r)%E. - Proof. - move => hE h. - rewrite (@esum.eq_esum _ _ _ _ (fun x => ereal_sup (range (fun n => E x * (f n x)%:E)%E))). - - move => ??; rewrite distr_lub_sup. - rewrite (@esupZl_range R T (fun a b => (f b a)%:E)) //. - move => ??; rewrite lee_tofin //. - rewrite esum_esup_comm //. - - by move => ??; rewrite mule_ge0 // lee_tofin. - - by move => ????; rewrite lee_pmul // ?lee_tofin // hmono. - rewrite ge_ereal_sup//= => x [n s] <-. - apply h. - Qed. - -End mono_esum. diff --git a/experimental_reals/edistr.v b/experimental_reals/edistr.v deleted file mode 100644 index a06c99220f..0000000000 --- a/experimental_reals/edistr.v +++ /dev/null @@ -1,110 +0,0 @@ -From mathcomp Require Import all_boot all_order all_algebra. -From mathcomp.classical Require Import boolp fsbigop. -From mathcomp Require Import xfinmap constructive_ereal reals discrete realseq. -From mathcomp.classical Require Import classical_sets functions. -From mathcomp.experimental_reals Require Import realsum distr. -From mathcomp.analysis Require Import esum ereal. - -Set Implicit Arguments. -Unset Strict Implicit. -Unset Printing Implicit Defensive. -Unset SsrOldRewriteGoalsOrder. - -Import Order.TTheory GRing.Theory Num.Theory. - -Local Open Scope fset_scope. -Local Open Scope ring_scope. - -(* -------------------------------------------------------------------- *) -Reserved Notation "\Ee_[ mu ] f" (at level 2, format "\Ee_[ mu ] f"). - -Section Esp. - Context {R : realType} {T : choiceType}. - - Implicit Types (mu : {distr T / R}) (f : T -> \bar R). - - Definition espe mu f := sum (fun x => mule (f x) ((mu x)%:E)). - - Notation "\Ee_[ mu ] f" := (espe mu f). -End Esp. - -Section PrCoreTheory. - Context {R : realType} {T : choiceType}. - - Implicit Types (mu : {distr T / R}) (A B E : pred T). - - Lemma exp_dunit (f : T -> \bar R) (x : T) : - espe (dunit x) f = f x. - Proof. - rewrite /espe. - rewrite (@eq_sum _ _ _ (fun y : T => if x == y then f y else 0%R)%E). - + move => x0. rewrite dunit1E. - by case (x == x0) => //=; rewrite ?mule1 ?mule0. - by rewrite sum_unit. - Qed. - - Lemma exp_cst mu r : (espe mu (fun _ => r) = (\P_[mu] predT)%:E * r)%E. - Proof. - rewrite pr_predT psum_sum /espe //. - rewrite sumZ. - - move => ?. rewrite lee_fin //. - by rewrite sum_sum // muleC. - Qed. - - Lemma exp0 mu : espe mu (fun _ => 0) = 0. - Proof. by rewrite exp_cst mule0. Qed. - - Lemma exp_dlet {U: choiceType} mu (nu : T -> {distr U / R}) F : - (forall x, 0%:E <= F x)%E -> - espe (dlet nu mu) F = espe mu (fun x => espe (nu x) F). - Proof. - move => HF. - have pos : (forall (i : T) (j : U), (0%R <= F j * ((mu i)%:E * (nu i j)%:E))%E). - - move => i j; rewrite mule_ge0 //. - by rewrite mule_ge0 // lee_tofin. - rewrite /espe. - rewrite (eq_sum - (S1:=fun x : U => (F x * ((\dlet_(i <- mu) nu i) x)%:E)%E) - (S2:=fun x : U => (F x * esum [set:T] (fun y : T => (mu y * nu y x)%:E)))%E). - - move => x; rewrite dletE. - congr ( _ * _)%E. - rewrite -esum_psum //. - - by move => i; rewrite mulr_ge0. - - apply/(le_summable (F2 := mu)) => //. - by move=> x0; rewrite mulr_ge0 //= ler_piMr ?le1_mu1. - symmetry. - rewrite (eq_sum - (S1:=(fun x : T => (sum (fun x0 : U => F x0 * (nu x x0)%:E) * (mu x)%:E)%E)) - (S2:=(fun x : T => (esum [set:U] (fun x0 : U => F x0 * ((mu x)%:E * (nu x x0)%:E))%E)))). - - move => x; rewrite muleC. - rewrite -sumZ. - - move => x1; rewrite mule_ge0 //=. - - exact: (ge0_mu (nu x) x1). - rewrite (eq_sum - (S1:=(fun x0 : U => (mu x)%:E * (F x0 * (nu x x0)%:E))%E) - (S2:=(fun x0 : U => F x0 * ((mu x)%:E * (nu x x0)%:E))%E)) //. - - by move => ?; rewrite muleCA. - rewrite esum_sum' //. - rewrite esum_sum'. - - by move => ?; rewrite esum_ge0 //. - rewrite esum_esum' //. - rewrite esum_sum'. - - move => ?; rewrite mule_ge0 // esum_ge0 //. - by move => ??; rewrite lee_tofin // mulr_ge0. - rewrite {1}(eq_esum - (b:= fun x => (F x * (\esum_(y in [set: T]) (mu y * nu y x)%:E))%E)) //. - - move => ??. rewrite esumZ //. - by move => ?; rewrite mule_ge0 // lee_tofin. - Qed. - - Lemma expZ mu F c : - (forall x, 0%:E <= F x)%E -> - espe mu (fun x => mule c (F x)) = mule c (espe mu F). - Proof. - move => h. - rewrite -sumZ. - + by move => x; rewrite mule_ge0 // lee_tofin. - by apply/eq_sum=> x; rewrite muleA. - Qed. - -End PrCoreTheory. diff --git a/experimental_reals/realsum.v b/experimental_reals/realsum.v index 33de9a937a..c04c913ef0 100644 --- a/experimental_reals/realsum.v +++ b/experimental_reals/realsum.v @@ -8,7 +8,7 @@ From mathcomp Require Import all_boot all_order all_algebra. From mathcomp Require Import unstable. From mathcomp.classical Require Import boolp fsbigop. From mathcomp Require Import xfinmap constructive_ereal reals discrete realseq. -From mathcomp.classical Require Import classical_sets functions. +From mathcomp.classical Require Import classical_sets functions cardinality. From mathcomp.analysis Require Import esum ereal numfun. Set Implicit Arguments. @@ -109,7 +109,7 @@ End Sum. Section SummableCountable. Variable (T : choiceType) (R : realType) (f : T -> R). -Lemma summable_countn0 : summable f -> countable [pred x | f x != 0]. +Lemma summable_countn0 : summable f -> discrete.countable [pred x | f x != 0]. Proof. case/summableP=> M ge0_M bM; pose E (p : nat) := [pred x | `|f x| > p.+1%:~R^-1]. set F := [pred x | _]; have le: {subset F <= [pred x | `[< exists p, x \in E p >]]}. @@ -167,17 +167,6 @@ rewrite inE/= => /ltW /le_trans /(_ (ler_norm _)). by move/le_lt_trans/(_ (bdu _)); rewrite ltxx. Qed. -Lemma ncvg_mono_sum {T : eqType} [f : nat -> T -> R] [l : T -> R] [J : seq T] : - (forall x, ncvg (fun n => f n x) (l x)%:E) -> - ncvg (fun n => \sum_(x <- J) f n x) (\sum_(x <- J) l x)%:E. -Proof. -move=> hcvg; elim: J => //= [|j J ih]. -- rewrite big_nil; apply/(@ncvg_eq _ (fun _ => 0))/ncvgC. - by move=> n /=; rewrite big_nil. -- rewrite big_cons; have := ncvgD (hcvg j) ih; apply/ncvg_eq. - by move=> n /=; rewrite big_cons. -Qed. - End PosCnv. (* -------------------------------------------------------------------- *) @@ -329,42 +318,28 @@ End SumTh. (* -------------------------------------------------------------------- *) Section Esum. +Context {R : realType} {T : choiceType}. - Context {R : realType} {T : choiceType}. - - Lemma esum_psum (S: T -> R) : - (forall i : T, 0%R <= S i) -> - summable S -> - esum [set:T] (fun x => (S x)%:E) = (psum S)%:E. - Proof. - move => Sg0 h; apply/eqP; rewrite eq_le; apply/andP; split. - - rewrite ge_ereal_sup//= => x [] X [] finX XT. - rewrite fsumEFin // => <-. - rewrite lee_fin. - rewrite fsbig_finite //=. - revert finX. - rewrite cardinality.finite_fsetP. - move => [] J ->. - rewrite cardinality.set_fsetK. - apply: (le_trans _ (gerfin_psum J h)). - rewrite -(@big_fset_seq R _ _ T J S) //=. - apply: (le_trans _ (ler_norm_sum _ _ _)). - exact : ler_norm. - - rewrite (eq_esum (b:= fun x => `| S x |%:E)%E). - - by move => ??; rewrite ger0_norm. - have [H1 H3] := (summable_sup h). - rewrite psum_absE //. - rewrite -(ereal_sup_EFin H3 H1). - rewrite ge_ereal_sup//= => x [] X [] Fs XT <-. - rewrite esum_ge //. - exists ([set` Fs]%classic) => //. - rewrite fsumEFin //. - rewrite lee_fin. - rewrite XT. - rewrite (@big_fset_seq R _ _ T _ (fun x => `|S x|)) //=. - rewrite -{1}(cardinality.set_fsetK Fs). - by rewrite -fsbig_finite. - Qed. +Lemma esum_psum (S : T -> R) : (forall i, 0 <= S i) -> summable S -> + \esum_(x in [set: T]) (S x)%:E = (psum S)%:E. +Proof. +move => Sg0 h; apply/eqP; rewrite eq_le; apply/andP; split. +- rewrite ge_ereal_sup//= => x [X [finX _]]. + rewrite fsumEFin // => <-. + rewrite lee_fin fsbig_finite//=. + move/cardinality.finite_fsetP : finX => [J ->]. + rewrite set_fsetK (le_trans _ (gerfin_psum J h))//. + rewrite -(@big_fset_seq R _ _ T J S)//= (le_trans _ (ler_norm_sum _ _ _))//. + exact: ler_norm. +- rewrite (@eq_esum _ _ _ _ (fun x => `| S x |%:E)). + by move => t _; rewrite ger0_norm. + have [nonempty hasub] := summable_sup h. + rewrite psum_absE// -ereal_sup_EFin// ge_ereal_sup//= => x [X [Fs ->] <-]. + rewrite esum_ge//. + exists ([set` Fs]%classic) => //. + rewrite fsumEFin// lee_fin (big_fset_seq (fun x => `|S x|))//=. + by rewrite -{1}(set_fsetK Fs) -fsbig_finite. +Qed. End Esum. @@ -722,20 +697,20 @@ End SummableAlg. (* -------------------------------------------------------------------- *) Section Sum_Sum. - Context {T: choiceType} {R : realType}. - - Lemma sum_sum (S: T -> R) : - summable S -> - esum.sum (fun x => (S x)%:E) = (sum S)%:E. - Proof. - move => hs. rewrite /esum.sum /sum. - rewrite (eq_esum (a:= (fun x => (S x)%:E)^\+%E) (b:= fun x => (S^\+ x)%:E)). - - by move => ??; rewrite funeposE -fine_max//=. - rewrite (eq_esum (a:= (fun x => (S x)%:E)^\-%E) (b:= fun x => (S^\- x)%:E)). - - by move => ??; rewrite funenegE /funrneg EFin_max. - rewrite esum_psum //; first exact : summable_fpos. - by rewrite esum_psum //; exact : summable_fneg. - Qed. +Context {T : choiceType} {R : realType}. + +Lemma sum_sum (S : T -> R) : summable S -> + esum.sum (fun x => (S x)%:E) = (sum S)%:E. +Proof. +move=> hs. +rewrite /esum.sum /sum. +rewrite (@eq_esum _ _ _ ((fun x => (S x)%:E)^\+%E) (fun x => (S^\+ x)%:E)). + by move=> t _; rewrite funeposE -fine_max. +rewrite (@eq_esum _ _ _ ((fun x => (S x)%:E)^\-%E) (fun x => (S^\- x)%:E)). + by move=> t _; rewrite funenegE EFin_max. +rewrite esum_psum//; first exact : summable_fpos. +by rewrite esum_psum//; exact : summable_fneg. +Qed. End Sum_Sum. diff --git a/theories/esum.v b/theories/esum.v index 1b2befe5d7..5e1382d117 100644 --- a/theories/esum.v +++ b/theories/esum.v @@ -1,4 +1,4 @@ -(* mathcomp analysis (c) 2017 Inria and AIST. License: CeCILL-C. *) +(* mathcomp analysis (c) 2026 Inria and AIST. License: CeCILL-C. *) From mathcomp Require Import all_ssreflect_compat ssralg ssrnum finmap. #[warning="-warn-library-file-internal-analysis"] From mathcomp Require Import unstable. @@ -713,263 +713,243 @@ Qed. End esumB. - -(* This should go to ereal*) +(* TODO: This should go to ereal.v or constructive_ereal.v *) Section Ereal. - Context {R : realType}. +Context {R : realType}. +Implicit Types x : \bar R. - Definition esg (x: \bar R) : \bar R := - (if x == 0 then 0 else if x < 0 then -1 else 1)%E. +Definition esg x : \bar R := + if x == 0 then 0 else if x < 0 then -1 else 1. - Lemma numEsg (x : \bar R): (x = esg x * `|x|)%E. - Proof. - rewrite /esg. - case (comparable_ltgtP (comparableT x 0)%E) => h. - + by rewrite (lt_eqF h) h lte0_abs // muleNN mul1e. - + by rewrite (gt_eqF h) (lt_gtF h) gte0_abs // mul1e. - + by rewrite h eq_refl mul0e. - Qed. +Lemma numEsg x : x = esg x * `| x |. +Proof. +rewrite /esg; have [x0|x0|->] := ltgtP x 0. +- by rewrite lte0_abs// muleNN mul1e. +- by rewrite gte0_abs// mul1e. +- by rewrite abse0 mule0. +Qed. - Lemma gte0_esg (x : \bar R): (x < 0 -> esg x = -1)%E. - Proof. - by move => h; rewrite /esg (lt_eqF h) h. - Qed. +Lemma gte0_esg x : x < 0 -> esg x = -1. +Proof. by move=> x0; rewrite /esg lt_eqF// x0. Qed. - Lemma lte0_esg (x : \bar R): (0 < x -> esg x = 1)%E. - Proof. - by move => h; rewrite /esg (gt_eqF h) (lt_gtF h). - Qed. +Lemma lte0_esg x: 0 < x -> esg x = 1. +Proof. by move=> x0; rewrite /esg gt_eqF// ltNge (ltW x0). Qed. - Lemma esg0 : (esg 0 = 0)%E. - Proof. - by rewrite /esg eq_refl. - Qed. +Lemma esg0 : esg 0 = 0. Proof. by rewrite /esg eqxx. Qed. End Ereal. - Section Sum. - Context {R : realType} {T : choiceType}. +Context {R : realType} {T : choiceType}. +Implicit Types (f : T -> \bar R) (x y : \bar R). - Implicit Types f (* g *) : T -> \bar R. +Lemma ge0_funeneg f t : (forall t, 0 <= f t) -> f^\- t = 0. +Proof. by move => ?; rewrite funenegE max_r// ?lerN0 oppe_le0. Qed. - Lemma min_l (x y : \bar R) : (x <= y -> mine x y = x)%E. Proof. by case: comparableP. Qed. +Lemma ge0_funepos f t : (forall t, 0 <= f t) -> f^\+ t = f t. +Proof. by move=> ?; rewrite funeposE max_l. Qed. - Lemma min_r (x y : \bar R) : (y <= x -> mine x y = y)%E. Proof. by case: comparableP. Qed. +Lemma funepos_cst0 t : (@cst T _ 0)^\+ t = 0 :> \bar R. +Proof. by rewrite funeposE maxxx. Qed. - Lemma max_l (x y : \bar R) : (y <= x -> maxe x y = x)%E. Proof. by case: comparableP. Qed. +Lemma funeneg_cst0 t : (@cst T _ 0)^\- t = 0 :> \bar R. +Proof. by rewrite funenegE oppe0 maxxx. Qed. - Lemma max_r (x y : \bar R) : (x <= y -> maxe x y = y)%E. Proof. by case: comparableP. Qed. +Lemma le_funepos f1 f2 : (forall t, f1 t <= f2 t) -> + (forall t, f1^\+ t <= f2^\+ t). +Proof. by move=> le_f x; rewrite (@funepos_le _ _ setT)// inE. Qed. - Lemma ge0_funeneg f x : (forall x, 0 <= f x)%E -> f^\- x = 0. - Proof. by move => ?; rewrite funenegE max_r// ?lerN0 oppe_le0. Qed. +Definition sum f : \bar R := esum [set: T] f^\+ - esum [set: T] f^\-. - Lemma ge0_funepos f x : (forall x, 0 <= f x)%E -> f^\+ x = f x. - Proof. by move=> ?; rewrite funeposE max_l. Qed. +End Sum. - Lemma funepos_cst0 x : (@cst T _ 0)^\+ x = 0 :> \bar R. - Proof. by rewrite funeposE maxxx. Qed. +Section SumTheory. +Context {R : realType} {T : choiceType}. +Implicit Types (S : T -> \bar R). - Lemma funeneg_cst0 x : (@cst T _ 0)^\- x = 0 :> \bar R. - Proof. by rewrite funenegE oppe0 maxxx. Qed. +Lemma sum0 : @sum R _ (@cst T _ 0) = 0. +Proof. +by rewrite /sum !esum1 ?subee// => r _; + rewrite ?[LHS](funepos_cst0,funeneg_cst0). +Qed. - Lemma le_funepos f1 f2 : ((forall x, f1 x <= f2 x) -> (forall x, f1^\+ x <= f2^\+ x))%E. - Proof. by move=> le_f x; rewrite (@funepos_le _ _ setT)// inE. Qed. +Lemma eq_sum S1 S2 : S1 =1 S2 -> sum S1 = sum S2. +Proof. +move=> eq_fg; rewrite /sum; congr (_ - _). +by apply: eq_esum => t _; rewrite !funeposE eq_fg. +by apply: eq_esum => t _; rewrite !funenegE eq_fg. +Qed. - Definition sum f : \bar R := esum [set: T] f^\+ - esum [set: T] f^\-. -End Sum. +(* TODO: rename *) +Lemma esum_unit S x : + \esum_(y in [set: T]) (if x == y then S y else 0) = \esum_(i in [set x]) S i. +Proof. +rewrite [RHS]esum_mkcond. +by under [in RHS]eq_esum do rewrite in_set1 eq_sym. +Qed. -Section SumTheory. - Context {R : realType} {T : choiceType}. - Implicit Types (S : T -> \bar R). +Lemma sum_unit S x : sum (fun y => if x == y then S y else 0) = S x. +Proof. +rewrite /sum. +rewrite (@eq_esum _ _ _ _ (fun y => if x == y then S^\+ y else 0)). + move=> i ?. + by rewrite !funeposE; case: ifPn => //; rewrite maxxx. +rewrite [X in _ - X](@eq_esum _ _ _ _ (fun y => if x == y then S^\- y else 0)). + move => i ?. + by rewrite !funenegE; case: ifPn => //; rewrite oppe0 maxxx. +rewrite !esum_unit. +case: (comparable_ltP (comparableT (S x) 0)%E) => Sx0. +- rewrite esum1. + by move => t //= ->; rewrite funeposE max_r// ltW. + rewrite esum_set1 ?funeneg_ge0//. + by rewrite funenegE max_l ?oppeK ?add0e// oppe_ge0 ltW. +- rewrite esum_set1 ?funepos_ge0// esum1. + by move => t //= ->; rewrite funenegE max_r// oppe_le0. + by rewrite funeposE max_l// sube0. +Qed. - Lemma sum0 : @sum R _ (@cst T _ 0) = 0. - Proof. - by rewrite /sum !esum1 ?subee// => r _; rewrite ?[LHS](funepos_cst0,funeneg_cst0). - Qed. +Section SumTheoryP. - Lemma eq_sum S1 S2: S1 =1 S2 -> sum S1 = sum S2. - Proof. - move=> eq_fg; rewrite /sum; congr (_ - _). - by apply: eq_esum => t _; rewrite !funeposE eq_fg. - by apply: eq_esum => t _; rewrite !funenegE eq_fg. - Qed. +Lemma esum_sum' S : (forall x, 0 <= S x) -> sum S = \esum_(i in [set: T]) S i. +Proof. +move=> ge0_S; rewrite /sum (@esum1 R T [set: T] S^\-) ?sube0. + by move=> x ?; rewrite ge0_funeneg. +by under eq_esum do rewrite ge0_funepos//. +Qed. - (* TODO: rename *) - Lemma esum_unit S x : - \esum_(y in [set: T]) (if x == y then S y else 0) = \esum_(i in [set x]) S i. - Proof. - rewrite [RHS]esum_mkcond. - by under [in RHS]eq_esum do rewrite in_set1 eq_sym. - Qed. +Lemma sum_ge0 S : (forall x, 0 <= S x) -> 0 <= sum S. +Proof. by move=> ge0_S; rewrite esum_sum' // esum_ge0. Qed. - Lemma sum_unit S x : sum (fun y => if x == y then S y else 0) = S x. - Proof. - rewrite /sum. - rewrite (@eq_esum _ _ _ _ (fun y : T => if x == y then S^\+ y else 0%R)). - + move=> i ?. - by rewrite !funeposE; case: ifPn => //; rewrite maxxx. - rewrite [X in _ - X](@eq_esum _ _ _ _ (fun y : T => if x == y then S^\- y else 0%R)). - + move => i ?. - by rewrite !funenegE; case: ifPn => //; rewrite oppe0 maxxx. - rewrite !esum_unit. - case (comparable_ltP (comparableT (S x) 0)%E) => h;last first. - + rewrite esum_set1 ?funepos_ge0//. - rewrite esum1. - + by move => i //= ->; rewrite funenegE max_r// oppe_le0. - by rewrite funeposE max_l// sube0. - rewrite esum1. - + by move => i //= ->; rewrite funeposE max_r// ltW. - rewrite esum_set1. - + by rewrite funeneg_ge0. - by rewrite funenegE max_l ?oppeK ?add0e// oppe_ge0 ltW. - Qed. +Lemma le_sum S1 S2 : (forall x, 0 <= S1 x) -> (forall x, S1 x <= S2 x) -> + sum S1 <= sum S2. +Proof. +move=> pS1 leS. +have pS2 x : 0 <= S2 x by rewrite (le_trans _ (leS _)). +rewrite /sum leeB//. +- by apply: le_esum => t _; rewrite !ge0_funepos. +- by apply: le_esum => t _; rewrite !ge0_funeneg. +Qed. + +Lemma sumN S : (forall x, 0 <= S x) -> sum (\- S ) = - sum S. +Proof. +move=> S0; rewrite /sum [X in X - _ = _]esum1 ?add0r. + by move=> t _; rewrite funeposN ge0_funeneg. +rewrite [X in _ = - (_ - X)]esum1 ?sube0. + by move=> t _; rewrite ge0_funeneg. +by under eq_esum do rewrite funenegN. +Qed. + +Lemma sumZ S c : (forall x, 0 <= S x) -> sum (fun x => c * S x) = c * sum S. +Proof. +move=> h. +rewrite (@eq_sum _ (fun x => esg c * (`|c| * S x))). + by move=> x; rewrite muleA -numEsg. +transitivity (esg c * sum (fun x => `|c| * S x)). +- have [hc|hc|->] := comparable_ltgtP (comparableT c 0). + + rewrite {1}lte0_abs// gte0_esg// (@eq_sum _ (fun x => - (- c * S x))). + by move => ?; rewrite mulN1e. + rewrite mulN1e -sumN; last by rewrite lte0_abs. + by move=> ?; rewrite mule_ge0. + + rewrite gte0_abs// lte0_esg// mul1e (@eq_sum _ (fun x => c * S x))//. + by move=> ?; rewrite mul1e. + + under eq_sum do rewrite esg0 mul0e. + by rewrite esg0 mul0e sum0. +- rewrite {1}/sum (@eq_esum _ _ _ _ (fun x => `|c| * S x))//. + by move=> ? _; rewrite ge0_funepos // => x; rewrite mule_ge0. + rewrite (@eq_esum _ _ _ (_^\-) (@cst T _ 0)). + by move => ? _; rewrite ge0_funeneg // => x; rewrite mule_ge0. + by rewrite (@esum1 _ _ _ (cst 0))// sube0 esumZ// muleA -numEsg esum_sum'. +Qed. + +End SumTheoryP. + +Section SumTheoryS. + +Lemma summable_le_sum S1 S2 : summable [set : T] S2 -> + (forall x, S1 x <= S2 x) -> sum S1 <= sum S2. +Proof. +move=> smS2 leS; rewrite /sum leeB//. + by apply: le_esum => ? ?; exact: le_funepos. +apply le_esum => t _. +by rewrite -!funeposN; apply: le_funepos => ?; rewrite leeN2. +Qed. + +Lemma summable_esum_funepos S : + summable [set: T] S -> \esum_(t in [set: T]) S^\+ t \is a fin_num. +Proof. +move => /summable_funepos. +rewrite summableE. +rewrite (@eq_esum _ _ _ (fun y : T => S^\+ y) (fun y : T => `|S^\+ y|)) //=. +by move => ??; rewrite gee0_abs. +Qed. - Section SumTheoryP. - - Lemma esum_sum' S : (forall x, 0 <= S x)%E -> sum S = \esum_(i in [set: T]) S i. - Proof. - move=> ge0_S; rewrite /sum (@esum1 R T [set: T] S^\-) ?sube0. - by move=> x ?; rewrite ge0_funeneg. - by under eq_esum do rewrite ge0_funepos//. - Qed. - - Lemma sum_ge0 S : (forall x, 0 <= S x) -> 0 <= sum S. - Proof. by move=> ge0_S; rewrite esum_sum' // esum_ge0. Qed. - - Lemma le_sum S1 S2: (forall x, 0 <= S1 x) -> (forall x, S1 x <= S2 x) -> - sum S1 <= sum S2. - Proof. - move=> pS1 leS. - have pS2 x : 0 <= S2 x by rewrite (le_trans _ (leS _)). - rewrite /sum leeB//. - - by apply: le_esum => t _; rewrite !ge0_funepos. - - by apply: le_esum => t _; rewrite !ge0_funeneg. - Qed. - - Lemma sumN S : (forall x, 0 <= S x) -> sum (\- S ) = - sum S. - Proof. - move=> S0; rewrite /sum [X in X - _ = _]esum1 ?add0r. - by move=> t _; rewrite funeposN ge0_funeneg. - rewrite [X in _ = - (_ - X)]esum1 ?sube0. - by move=> t _; rewrite ge0_funeneg. - by under eq_esum do rewrite funenegN. - Qed. - - Lemma sumZ S c : (forall x, 0 <= S x) -> sum (fun x => c * S x) = c * sum S. - Proof. - move=> h. - rewrite (@eq_sum _ (fun x => esg c * (`|c| * S x))). - by move=> x; rewrite muleA -numEsg. - transitivity (esg c * sum (fun x => `|c| * S x)). - - have [hc|hc|->] := comparable_ltgtP (comparableT c 0). - + rewrite {1}lte0_abs// gte0_esg// (@eq_sum _ (fun x => - (- c * S x))). - by move => ?; rewrite mulN1e. - rewrite mulN1e -sumN; last by rewrite lte0_abs. - by move=> ?; rewrite mule_ge0. - + rewrite gte0_abs// lte0_esg// mul1e (@eq_sum _ (fun x => c * S x))//. - by move=> ?; rewrite mul1e. - + under eq_sum do rewrite esg0 mul0e. - by rewrite esg0 mul0e sum0. - - rewrite {1}/sum (@eq_esum _ _ _ _ (fun x => `|c| * S x))//. - by move=> ? _; rewrite ge0_funepos // => x; rewrite mule_ge0. - rewrite (@eq_esum _ _ _ (_^\-) (@cst T _ 0)). - by move => ? _; rewrite ge0_funeneg // => x; rewrite mule_ge0. - by rewrite (@esum1 _ _ _ (cst 0))// sube0 esumZ// muleA -numEsg esum_sum'. - Qed. - - End SumTheoryP. - - Section SumTheoryS. - - Lemma summable_le_sum S1 S2 : summable [set : T] S2 -> - (forall x, S1 x <= S2 x) -> sum S1 <= sum S2. - Proof. - move=> smS2 leS; rewrite /sum leeB//. - by apply: le_esum => ? ?; exact: le_funepos. - apply le_esum => t _. - by rewrite -!funeposN; apply: le_funepos => ?; rewrite leeN2. - Qed. - - Lemma summable_esum_funepos S : - summable [set: T] S -> \esum_(t in [set: T]) S^\+ t \is a fin_num. - Proof. - move => /summable_funepos. - rewrite summableE. - rewrite (@eq_esum _ _ _ (fun y : T => S^\+ y) (fun y : T => `|S^\+ y|)) //=. - by move => ??; rewrite gee0_abs. - Qed. - - Lemma summable_sumN S : summable [set : T] S -> sum (\- S ) = - sum S. - Proof. - move => hs. - rewrite /sum funenegN funeposN addeC oppeB //= adde_defC. - apply : fin_num_adde_defl. - by apply : summable_esum_funepos. - Qed. - - Lemma summableZ c S : - `|c| \is a fin_num -> - summable [set: T] (fun x : T => S x) -> - summable [set: T] (fun x : T => `|c| * S x). - Proof. - rewrite /summable. - move => hc h. - rewrite (@eq_esum _ _ _ _ (fun x => `|c| * `|S x|)). - + move => i ?. - by rewrite abseM abse_id. - rewrite esumZ //. - by apply: lte_mul_pinfty. - Qed. - - Lemma summable_sumZ S c : - `|c| \is a fin_num -> summable [set : T] S -> sum (fun x => c * S x) = c * sum S. - Proof. - move => hf h. - rewrite (@eq_sum _ (fun x => esg c * (`|c| * S x))). - by move=> x; rewrite muleA -numEsg. - transitivity (esg c * sum (fun x => `|c| * S x)). - - have [hc|hc|->] := comparable_ltgtP (comparableT c 0). - + rewrite {1}lte0_abs// gte0_esg// (@eq_sum _ (fun x => - (- c * S x))). - by move => ?; rewrite mulN1e. - rewrite mulN1e -summable_sumN; last by rewrite lte0_abs. - by apply: summableZ. - + rewrite gte0_abs// lte0_esg// mul1e (@eq_sum _ (fun x => c * S x))//. - by move=> ?; rewrite mul1e. - + under eq_sum do rewrite esg0 mul0e. - by rewrite esg0 mul0e sum0. - - rewrite {1}/sum. - rewrite (@eq_esum _ _ _ _ (fun x => `|c| * S^\+ x)). - by move=> i _ //=; rewrite -(fineK (x:= `|c|)) // ge0_funeposM. - rewrite (@eq_esum _ _ _ (fun x : T => `|c| * S x)^\- (fun x => `|c| * S^\- x)). - by move=> i _ //=; rewrite -(fineK (x:= `|c|)) // ge0_funenegM. - rewrite !esumZ // -muleBr //=. - + rewrite adde_defC fin_num_adde_defl //. - by apply : summable_esum_funepos. - by rewrite muleA -numEsg. - Qed. - - End SumTheoryS. +Lemma summable_sumN S : summable [set : T] S -> sum (\- S) = - sum S. +Proof. +move => hs. +rewrite /sum funenegN funeposN addeC oppeB //= adde_defC. +apply: fin_num_adde_defl. +exact: summable_esum_funepos. +Qed. + +Lemma summableZ c S : `|c| \is a fin_num -> + summable [set: T] (fun x : T => S x) -> + summable [set: T] (fun x : T => `|c| * S x). +Proof. +rewrite /summable => cfin Soo. +rewrite (@eq_esum _ _ _ _ (fun x => `|c| * `|S x|)). + by move=> t ?; rewrite abseM abse_id. +by rewrite esumZ// lte_mul_pinfty. +Qed. + +Lemma summable_sumZ S c : +`|c| \is a fin_num -> summable [set : T] S -> sum (fun x => c * S x) = c * sum S. +Proof. +move => hf h. +rewrite (@eq_sum _ (fun x => esg c * (`|c| * S x))). + by move=> x; rewrite muleA -numEsg. +transitivity (esg c * sum (fun x => `|c| * S x)). +- have [hc|hc|->] := comparable_ltgtP (comparableT c 0). + + rewrite {1}lte0_abs// gte0_esg// (@eq_sum _ (fun x => - (- c * S x))). + by move => ?; rewrite mulN1e. + rewrite mulN1e -summable_sumN; last by rewrite lte0_abs. + exact: summableZ. + + rewrite gte0_abs// lte0_esg// mul1e (@eq_sum _ (fun x => c * S x))//. + by move=> ?; rewrite mul1e. + + under eq_sum do rewrite esg0 mul0e. + by rewrite esg0 mul0e sum0. +- rewrite {1}/sum. + rewrite (@eq_esum _ _ _ _ (fun x => `|c| * S^\+ x)). + by move=> i _ //=; rewrite -(@fineK _ `|c|) // ge0_funeposM. + rewrite (@eq_esum _ _ _ (fun x => `|c| * S x)^\- (fun x => `|c| * S^\- x)). + by move=> t _ //=; rewrite -(@fineK _ `|c|) // ge0_funenegM. + rewrite !esumZ// -muleBr//=. + rewrite adde_defC fin_num_adde_defl//. + exact: summable_esum_funepos. + by rewrite muleA -numEsg. +Qed. + +End SumTheoryS. End SumTheory. -Lemma ereal_sup_comm {R:realType} {X Y : Type} (f : X -> Y -> \bar R) (A : set X) (B : set Y) : +(* TODO: move *) +Lemma ereal_sup_comm {R : realType} {X Y : Type} (f : X -> Y -> \bar R) + (A : set X) (B : set Y) : ereal_sup [set ereal_sup [set f x y | y in B] | x in A] = - ereal_sup [set ereal_sup [set f x y | x in A] | y in B]. + ereal_sup [set ereal_sup [set f x y | x in A] | y in B]. Proof. - suff key : forall (X' Y' : Type) (g : X' -> Y' -> \bar R) (C : set X') (D : set Y'), - ereal_sup [set ereal_sup [set g x y | y in D] | x in C] <= - ereal_sup [set ereal_sup [set g x y | x in C] | y in D]. - apply: le_anti. apply/andP; split; [exact: key | exact: (key _ _ (fun y x => f x y) B A)]. - move=> X' Y' g C D. - apply/ereal_supP => _ [x hx <-]. - apply/ereal_supP => _ [y hy <-]. - apply: le_ereal_sup_tmp; exists (ereal_sup [set g x0 y | x0 in C]). - - exists y => //. - - apply: le_ereal_sup_tmp; exists (g x y); [exists x => // | exact: le_refl]. +suff key : forall (X' Y' : Type) (g : X' -> Y' -> \bar R) (C : set X') (D : set Y'), + ereal_sup [set ereal_sup [set g x y | y in D] | x in C] <= + ereal_sup [set ereal_sup [set g x y | x in C] | y in D]. +apply/le_anti/andP; split; [exact: key | exact: (key _ _ (fun y x => f x y) B A)]. +move=> X' Y' g C D. +apply/ereal_supP => _ [x hx <-]. +apply/ereal_supP => _ [y hy <-]. +apply: le_ereal_sup_tmp; exists (ereal_sup [set g x0 y | x0 in C]). +- exists y => //. +- apply: le_ereal_sup_tmp; exists (g x y); [exists x => // | exact: le_refl]. Qed. - Section mono_esum. Context {R : realType} From f3b1c98eb8dc77a37750cdb041794546b679ce2e Mon Sep 17 00:00:00 2001 From: Reynald Affeldt Date: Wed, 20 May 2026 11:20:49 +0900 Subject: [PATCH 07/21] fix opam --- rocq-mathcomp-experimental-reals.opam | 1 - 1 file changed, 1 deletion(-) diff --git a/rocq-mathcomp-experimental-reals.opam b/rocq-mathcomp-experimental-reals.opam index 234d011a17..83179674dd 100644 --- a/rocq-mathcomp-experimental-reals.opam +++ b/rocq-mathcomp-experimental-reals.opam @@ -19,7 +19,6 @@ build: [make "-C" "experimental_reals" "-j%{jobs}%"] install: [make "-C" "experimental_reals" "install"] depends: [ "rocq-mathcomp-reals" { = version} - "rocq-mathcomp-analysis" { = "dev"} "rocq-mathcomp-bigenough" { (>= "1.0.0") } ] From 8bf83ae2d7d3765597b856da677083321793f090 Mon Sep 17 00:00:00 2001 From: Reynald Affeldt Date: Wed, 20 May 2026 11:59:23 +0900 Subject: [PATCH 08/21] fix CI --- rocq-mathcomp-experimental-reals.opam | 1 + 1 file changed, 1 insertion(+) diff --git a/rocq-mathcomp-experimental-reals.opam b/rocq-mathcomp-experimental-reals.opam index 83179674dd..d97c18b4f3 100644 --- a/rocq-mathcomp-experimental-reals.opam +++ b/rocq-mathcomp-experimental-reals.opam @@ -20,6 +20,7 @@ install: [make "-C" "experimental_reals" "install"] depends: [ "rocq-mathcomp-reals" { = version} "rocq-mathcomp-bigenough" { (>= "1.0.0") } + "rocq-mathcomp-analysis" { = version } ] conflicts: [ "coq-mathcomp-experimental-reals" { < "1.16~" } ] From 44d4aa062f88c78f513e2f9a1dcfb5b547926d76 Mon Sep 17 00:00:00 2001 From: Reynald Affeldt Date: Thu, 21 May 2026 14:30:34 +0900 Subject: [PATCH 09/21] fix CI --- rocq-mathcomp-experimental-reals.opam | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rocq-mathcomp-experimental-reals.opam b/rocq-mathcomp-experimental-reals.opam index d97c18b4f3..237b8e58dd 100644 --- a/rocq-mathcomp-experimental-reals.opam +++ b/rocq-mathcomp-experimental-reals.opam @@ -18,9 +18,8 @@ Beware that this still contains a few Admitted.""" build: [make "-C" "experimental_reals" "-j%{jobs}%"] install: [make "-C" "experimental_reals" "install"] depends: [ - "rocq-mathcomp-reals" { = version} + "rocq-mathcomp-analysis" { = version} "rocq-mathcomp-bigenough" { (>= "1.0.0") } - "rocq-mathcomp-analysis" { = version } ] conflicts: [ "coq-mathcomp-experimental-reals" { < "1.16~" } ] From b075e0b622f267c666853c64d816974eae50e77f Mon Sep 17 00:00:00 2001 From: Reynald Affeldt Date: Thu, 21 May 2026 18:01:37 +0900 Subject: [PATCH 10/21] mv --- CHANGELOG_UNRELEASED.md | 18 ++++--- experimental_reals/realsum.v | 95 +++++++++++++++++------------------- reals/constructive_ereal.v | 25 ++++++++++ theories/esum.v | 34 ++----------- 4 files changed, 85 insertions(+), 87 deletions(-) diff --git a/CHANGELOG_UNRELEASED.md b/CHANGELOG_UNRELEASED.md index 32530a9d9b..9933e3a31a 100644 --- a/CHANGELOG_UNRELEASED.md +++ b/CHANGELOG_UNRELEASED.md @@ -96,10 +96,12 @@ + lemma `esum_psum` + lemma `sum_sum` +- in `constructive_ereal.v`: + + definition `esg` + + lemmas `numEesg`, `gte0_esg`, `lte0_esg`, `esg0` + - in `esum.v`: + lemmas `esum_eq0P`, `esumZ`, `esum_esum'` - + definition `esg` - + lemmas `numEsg`, `gte0_esg`, `lte0_esg`, `esg0` + lemmas `ge0_funeneg`, `ge0_funepos`, `funepos_cst0`, `funeneg_cst0`, `le_funepos` + definition `sum` @@ -241,15 +243,15 @@ `Radon_Nikodym_cscale`, `Radon_Nikodym_cadd`, `Radon_Nikodym_chain_rule` - in `realsum.v`: + now use `funrpos` and `funrneg`: - * lemmas `eq_fpos`, `eq_fneg` + * lemmas `eq_funrpos`, `eq_funrneg` * lemma `fpos0` (renamed to `funrpos_cst0`) * lemma `fneg0` (renamed to `funrneg_cst0`) - * lemmas `fposZ`, `fnegZ` - * lemmas `fpos_natrM`, `fneg_natrM` - * lemmas `fneg_ge0`, `fpos_ge0` - * lemmas `le_fpos_norm`, `le_fpos` + * lemmas `funrposZ`, `funrnegZ` + * lemmas `funrpos_natrM`, `funrneg_natrM` + * lemmas `ge0_funrneg`, `ge0_funrpos` + * lemmas `le_funrpos_norm`, `funrpos_le` * definition `sum` - * lemmas `summable_fpos`, `summable_fneg` + * lemmas `summable_funrpos`, `summable_funrneg` + lemma `sum0` (now uses `cst`) ### Renamed diff --git a/experimental_reals/realsum.v b/experimental_reals/realsum.v index c04c913ef0..0c9aba127e 100644 --- a/experimental_reals/realsum.v +++ b/experimental_reals/realsum.v @@ -6,10 +6,11 @@ From mathcomp Require Import all_boot all_order all_algebra. #[warning="-warn-library-file-internal-analysis"] From mathcomp Require Import unstable. -From mathcomp.classical Require Import boolp fsbigop. -From mathcomp Require Import xfinmap constructive_ereal reals discrete realseq. -From mathcomp.classical Require Import classical_sets functions cardinality. -From mathcomp.analysis Require Import esum ereal numfun. +From mathcomp Require Import boolp fsbigop classical_sets functions. +From mathcomp Require Import cardinality. +From mathcomp Require Import constructive_ereal reals. +From mathcomp Require Import xfinmap discrete realseq. +From mathcomp Require Import esum ereal numfun. Set Implicit Arguments. Unset Strict Implicit. @@ -44,13 +45,13 @@ End Summable. (* -------------------------------------------------------------------- *) Section Sum. Context {R : realType} {T : choiceType}. - Implicit Types f g : T -> R. -Lemma eq_fpos f g : f =1 g -> f^\+ =1 g^\+. +(* TODO: move to numfun.v *) +Lemma eq_funrpos f g : f =1 g -> f^\+ =1 g^\+. Proof. by move=> eq_fg x; rewrite /funrpos eq_fg. Qed. -Lemma eq_fneg f g : f =1 g -> f^\- =1 g^\-. +Lemma eq_funrneg f g : f =1 g -> f^\- =1 g^\-. Proof. by move=> eq_fg x; rewrite /funrneg eq_fg. Qed. Lemma funrpos_cst0 x : (fun _ : T => 0)^\+ x = 0 :> R. @@ -59,43 +60,41 @@ Proof. by rewrite /funrpos maxxx. Qed. Lemma funrneg_cst0 x : (fun _ : T => 0)^\- x = 0 :> R. Proof. by rewrite /funrneg oppr0 maxxx. Qed. -Lemma fposZ f c : 0 <= c -> (c \*o f)^\+ =1 c \*o f^\+. +Lemma funrposZ f c : 0 <= c -> (c \*o f)^\+ =1 c \*o f^\+. Proof. by move=> ge0_c x; rewrite /= ge0_funrposM. Qed. -Lemma fnegZ f c : 0 <= c -> (c \*o f)^\- =1 c \*o f^\-. +Lemma funrnegZ f c : 0 <= c -> (c \*o f)^\- =1 c \*o f^\-. Proof. -move=> ge0_c x; rewrite /= -!funrposN; have /= <- := fposZ (- f) ge0_c x. -by apply/eq_fpos=> y /=; rewrite mulrN. +move=> ge0_c x; rewrite /= -!funrposN; have /= <- := funrposZ (- f) ge0_c x. +by apply/eq_funrpos=> y /=; rewrite mulrN. Qed. -Lemma fpos_natrM f (n : T -> nat) x : +Lemma funrpos_natrM f (n : T -> nat) x : (fun x => (n x)%:R * f x)^\+ x = (n x)%:R * f^\+ x. Proof. by rewrite /funrpos -[in RHS]normr_nat maxr_pMr// mulr0 ger0_norm. Qed. -Lemma fneg_natrM f (n : T -> nat) x : +Lemma funrneg_natrM f (n : T -> nat) x : (fun x => (n x)%:R * f x)^\- x = (n x)%:R * f^\- x. Proof. -rewrite -[in RHS]funrposN -fpos_natrM -funrposN. -by apply/eq_fpos=> y; rewrite mulrN. +rewrite -[in RHS]funrposN -funrpos_natrM -funrposN. +by apply/eq_funrpos=> y; rewrite mulrN. Qed. -Lemma fneg_ge0 f x : (forall x, 0 <= f x) -> f^\- x = 0. +Lemma ge0_funrneg f x : (forall x, 0 <= f x) -> f^\- x = 0. Proof. by move=> ?; rewrite /funrneg max_r// oppr_le0. Qed. -Lemma fpos_ge0 f x : (forall x, 0 <= f x ) -> f^\+ x = f x. +Lemma ge0_funrpos f x : (forall x, 0 <= f x) -> f^\+ x = f x. Proof. by move=> ?; rewrite /funrpos max_l. Qed. -Lemma le_fpos_norm f x : f^\+ x <= `|f x|. +Lemma le_funrpos_norm f x : f^\+ x <= `|f x|. Proof. by rewrite -/((Num.Def.normr \o f) x) -funrposDneg lerDl funrneg_ge0. Qed. -Lemma le_fpos f1 f2 : f1 <=1 f2 -> f1^\+ <=1 f2^\+. -Proof. -by move=> le_f x; rewrite (@funrpos_le _ _ setT)// inE. -Qed. +Lemma funrpos_le f1 f2 : f1 <=1 f2 -> f1^\+ <=1 f2^\+. +Proof. by move=> le_f x; rewrite (@funrpos_le _ _ setT)// in_setT. Qed. Definition psum f : R := (* We need some ticked `image` operator *) @@ -103,6 +102,7 @@ Definition psum f : R := if `[] then sup S else 0. Definition sum f : R := psum f^\+ - psum f^\-. + End Sum. (* -------------------------------------------------------------------- *) @@ -113,7 +113,7 @@ Lemma summable_countn0 : summable f -> discrete.countable [pred x | f x != 0]. Proof. case/summableP=> M ge0_M bM; pose E (p : nat) := [pred x | `|f x| > p.+1%:~R^-1]. set F := [pred x | _]; have le: {subset F <= [pred x | `[< exists p, x \in E p >]]}. - move=> x; rewrite !inE => nz_fx; exists (Num.truncn `|f x|^-1). + move=> x; rewrite !inE => nz_fx; apply/asboolP; exists (Num.truncn `|f x|^-1). by rewrite inE invf_plt ?unfold_in/= ?normr_gt0 // -normfV ltr_norm_bound. apply/(countable_sub le)/cunion_countable=> i /=. case: (existsTP (fun s : seq T => {subset E i <= s}))=> /= [[s le_Eis]|]. @@ -235,7 +235,8 @@ Qed. Lemma eq_sum (F1 F2 : T -> R) : F1 =1 F2 -> sum F1 = sum F2. Proof. move=> eq_fg; rewrite /sum; congr (_ - _); apply/eq_psum. - by apply/eq_fpos. by apply/eq_fneg. +- exact/eq_funrpos. +- exact/eq_funrneg. Qed. Lemma le_summable (F1 F2 : T -> R) : @@ -632,18 +633,15 @@ move=> smS1 smS2; apply/summableMl => //; exists (psum S1). by move=> x; apply/ger1_psum. Qed. -(* -------------------------------------------------------------------- *) -Lemma summable_fpos (f : T -> R) : - summable f -> summable f^\+. +Lemma summable_funrpos (f : T -> R) : summable f -> summable f^\+. Proof. -by move/summable_abs; apply/le_summable => x; rewrite funrpos_ge0 le_fpos_norm. +move/summable_abs; apply/le_summable => x. +by rewrite funrpos_ge0 le_funrpos_norm. Qed. -(* -------------------------------------------------------------------- *) -Lemma summable_fneg (f : T -> R) : - summable f -> summable f^\-. +Lemma summable_funrneg (f : T -> R) : summable f -> summable f^\-. Proof. -by move/summableN/summable_fpos; apply: eq_summable => x; rewrite funrposN. +by move/summableN/summable_funrpos; apply: eq_summable => x; rewrite funrposN. Qed. (* -------------------------------------------------------------------- *) @@ -708,8 +706,8 @@ rewrite (@eq_esum _ _ _ ((fun x => (S x)%:E)^\+%E) (fun x => (S^\+ x)%:E)). by move=> t _; rewrite funeposE -fine_max. rewrite (@eq_esum _ _ _ ((fun x => (S x)%:E)^\-%E) (fun x => (S^\- x)%:E)). by move=> t _; rewrite funenegE EFin_max. -rewrite esum_psum//; first exact : summable_fpos. -by rewrite esum_psum//; exact : summable_fneg. +rewrite esum_psum//; first exact : summable_funrpos. +by rewrite esum_psum//; exact : summable_funrneg. Qed. End Sum_Sum. @@ -1151,20 +1149,19 @@ Implicit Types (S : T -> R). Lemma psum_sum S : (forall x, 0 <= S x) -> psum S = sum S. Proof. move=> ge0_S; rewrite /sum [X in _-X]psum_eq0 ?subr0. - by move=> x; rewrite fneg_ge0. -by apply/eq_psum=> x; rewrite fpos_ge0. + by move=> x; rewrite ge0_funrneg. +by apply/eq_psum=> x; rewrite ge0_funrpos. Qed. -Lemma le_sum S1 S2 : - summable S1 -> summable S2 -> (S1 <=1 S2) -> - sum S1 <= sum S2. +Lemma le_sum S1 S2 : summable S1 -> summable S2 -> S1 <=1 S2 -> + sum S1 <= sum S2. Proof. move=> smS1 smS2 leS; rewrite /sum lerB //. - apply/le_psum/summable_fpos => // x. - by rewrite funrpos_ge0/= le_fpos. -apply/le_psum/summable_fneg => // x. -rewrite -!funrposN funrpos_ge0 le_fpos // => y. -by rewrite lerN2. +- apply/le_psum/summable_funrpos => // x. + by rewrite funrpos_ge0/= funrpos_le. +- apply/le_psum/summable_funrneg => // x. + rewrite -!funrposN funrpos_ge0 funrpos_le // => y. + by rewrite lerN2. Qed. Lemma sum0 : sum (@cst T _ 0) = 0 :> R. @@ -1184,7 +1181,7 @@ transitivity (Num.sg c * sum (`|c| \*o S)). + by rewrite (eq_sum (F2 := cst 0)) ?sum0 // => x; rewrite !mul0r. + by apply/eq_sum=> x; rewrite mul1r. by rewrite mulN1r -sumN; apply/eq_sum=> x; rewrite !mulN1r. -rewrite {1}/sum !(eq_psum (fposZ _ _), eq_psum (fnegZ _ _)) //. +rewrite {1}/sum !(eq_psum (funrposZ _ _), eq_psum (funrnegZ _ _)) //. by rewrite !psumZ // -mulrBr mulrA -numEsg. Qed. @@ -1193,10 +1190,10 @@ Lemma sumID S (P : pred T) : sum (fun x => (P x)%:R * S x) + sum (fun x => (~~ P x)%:R * S x). Proof. move=> sm_S; rewrite /sum addrACA -[in RHS]opprD; congr (_ - _). -+ rewrite (psumID P); first by apply/summable_fpos. - by congr (_ + _); apply/eq_psum => x; rewrite fpos_natrM. -+ rewrite (psumID P); first by apply/summable_fneg. - by congr (_ + _); apply/eq_psum => x; rewrite fneg_natrM. ++ rewrite (psumID P); first exact/summable_funrpos. + by congr (_ + _); apply/eq_psum => x; rewrite funrpos_natrM. ++ rewrite (psumID P); first exact/summable_funrneg. + by congr (_ + _); apply/eq_psum => x; rewrite funrneg_natrM. Qed. Lemma sum_finseq S (r : seq T) : diff --git a/reals/constructive_ereal.v b/reals/constructive_ereal.v index cea1c06ff2..fdef6e5f25 100644 --- a/reals/constructive_ereal.v +++ b/reals/constructive_ereal.v @@ -94,6 +94,7 @@ From mathcomp Require Import mathcomp_extra interval_inference. (* (\prod_(i in A) f i)%E == bigop-like notation in scope %E *) (* maxe x y, mine x y == notation for the maximum/minimum of two *) (* extended real numbers *) +(* esg x == sign of x (0, -1, or +1, as an extended real) *) (* ``` *) (* *) (* ## Signed extended real numbers *) @@ -3026,6 +3027,30 @@ Notation mineMr := mine_pMr (only parsing). #[deprecated(since="mathcomp-analysis 1.8.0", note="renamed to mine_pMl")] Notation mineMl := mine_pMl (only parsing). +Section esg. +Context {R : realDomainType}. +Implicit Types x : \bar R. + +Definition esg x : \bar R := if x == 0 then 0 else if x < 0 then -1 else 1. + +Lemma numEesg x : x = esg x * `| x |. +Proof. +rewrite /esg; have [x0|x0|->] := ltgtP x 0. +- by rewrite lte0_abs// muleNN mul1e. +- by rewrite gte0_abs// mul1e. +- by rewrite abse0 mule0. +Qed. + +Lemma gte0_esg x : x < 0 -> esg x = -1. +Proof. by move=> x0; rewrite /esg lt_eqF// x0. Qed. + +Lemma lte0_esg x: 0 < x -> esg x = 1. +Proof. by move=> x0; rewrite /esg gt_eqF// ltNge (ltW x0). Qed. + +Lemma esg0 : esg 0 = 0. Proof. by rewrite /esg eqxx. Qed. + +End esg. + Module DualAddTheoryRealDomain. Section DualERealArithTh_realDomainType. diff --git a/theories/esum.v b/theories/esum.v index 5e1382d117..56f2351143 100644 --- a/theories/esum.v +++ b/theories/esum.v @@ -713,32 +713,6 @@ Qed. End esumB. -(* TODO: This should go to ereal.v or constructive_ereal.v *) -Section Ereal. -Context {R : realType}. -Implicit Types x : \bar R. - -Definition esg x : \bar R := - if x == 0 then 0 else if x < 0 then -1 else 1. - -Lemma numEsg x : x = esg x * `| x |. -Proof. -rewrite /esg; have [x0|x0|->] := ltgtP x 0. -- by rewrite lte0_abs// muleNN mul1e. -- by rewrite gte0_abs// mul1e. -- by rewrite abse0 mule0. -Qed. - -Lemma gte0_esg x : x < 0 -> esg x = -1. -Proof. by move=> x0; rewrite /esg lt_eqF// x0. Qed. - -Lemma lte0_esg x: 0 < x -> esg x = 1. -Proof. by move=> x0; rewrite /esg gt_eqF// ltNge (ltW x0). Qed. - -Lemma esg0 : esg 0 = 0. Proof. by rewrite /esg eqxx. Qed. - -End Ereal. - Section Sum. Context {R : realType} {T : choiceType}. Implicit Types (f : T -> \bar R) (x y : \bar R). @@ -843,7 +817,7 @@ Lemma sumZ S c : (forall x, 0 <= S x) -> sum (fun x => c * S x) = c * sum S. Proof. move=> h. rewrite (@eq_sum _ (fun x => esg c * (`|c| * S x))). - by move=> x; rewrite muleA -numEsg. + by move=> x; rewrite muleA -numEesg. transitivity (esg c * sum (fun x => `|c| * S x)). - have [hc|hc|->] := comparable_ltgtP (comparableT c 0). + rewrite {1}lte0_abs// gte0_esg// (@eq_sum _ (fun x => - (- c * S x))). @@ -858,7 +832,7 @@ transitivity (esg c * sum (fun x => `|c| * S x)). by move=> ? _; rewrite ge0_funepos // => x; rewrite mule_ge0. rewrite (@eq_esum _ _ _ (_^\-) (@cst T _ 0)). by move => ? _; rewrite ge0_funeneg // => x; rewrite mule_ge0. - by rewrite (@esum1 _ _ _ (cst 0))// sube0 esumZ// muleA -numEsg esum_sum'. + by rewrite (@esum1 _ _ _ (cst 0))// sube0 esumZ// muleA -numEesg esum_sum'. Qed. End SumTheoryP. @@ -906,7 +880,7 @@ Lemma summable_sumZ S c : Proof. move => hf h. rewrite (@eq_sum _ (fun x => esg c * (`|c| * S x))). - by move=> x; rewrite muleA -numEsg. + by move=> x; rewrite muleA -numEesg. transitivity (esg c * sum (fun x => `|c| * S x)). - have [hc|hc|->] := comparable_ltgtP (comparableT c 0). + rewrite {1}lte0_abs// gte0_esg// (@eq_sum _ (fun x => - (- c * S x))). @@ -925,7 +899,7 @@ transitivity (esg c * sum (fun x => `|c| * S x)). rewrite !esumZ// -muleBr//=. rewrite adde_defC fin_num_adde_defl//. exact: summable_esum_funepos. - by rewrite muleA -numEsg. + by rewrite muleA -numEesg. Qed. End SumTheoryS. From 7ad0bf3e792aa2ec9750f5c42bd8357134bf1b7c Mon Sep 17 00:00:00 2001 From: Reynald Affeldt Date: Mon, 25 May 2026 12:28:35 +0900 Subject: [PATCH 11/21] gen esumZ, esum_esup_comm --- CHANGELOG_UNRELEASED.md | 3 ++ theories/ereal.v | 10 +++-- theories/esum.v | 44 +++++++++---------- .../lebesgue_integral_definition.v | 3 +- .../lebesgue_integral_theory/radon_nikodym.v | 2 +- 5 files changed, 35 insertions(+), 27 deletions(-) diff --git a/CHANGELOG_UNRELEASED.md b/CHANGELOG_UNRELEASED.md index 9933e3a31a..9a9a9d7a62 100644 --- a/CHANGELOG_UNRELEASED.md +++ b/CHANGELOG_UNRELEASED.md @@ -323,6 +323,9 @@ - in `simple_functions.v`: + lemmas `fctD`, `fctN`, `fctM`, `fctZ` +- in `ereal.v`: + + lemmas `ge0_mule_fsumr`, `ge0_mule_fsuml` + ### Deprecated - file `charge.v` (use `measure.v` and/or `lebesgue_integral.v`) diff --git a/theories/ereal.v b/theories/ereal.v index 76dfc1b728..dcac6d2ece 100644 --- a/theories/ereal.v +++ b/theories/ereal.v @@ -226,11 +226,14 @@ by move=> i; rewrite in_fset_set// inE; exact: ab. Qed. Lemma ge0_mule_fsumr (T : choiceType) x (F : T -> \bar R) (P : set T) : - (forall i : T, 0 <= F i) -> x * (\sum_(i \in P) F i) = \sum_(i \in P) x * F i. + (forall i, P i -> 0 <= F i) -> + x * (\sum_(i \in P) F i) = \sum_(i \in P) x * F i. Proof. move=> F0; have [->{x}|x0] := eqVneq x 0%E. by rewrite mul0e big1// => ? _; rewrite mul0e. -rewrite ge0_sume_distrr//; apply: eq_fbigl => y. +rewrite big_seq ge0_sume_distrr. + by move=> t; case: finite_supportP => // X XP _ _ /XP/F0. +rewrite -big_seq; apply: eq_fbigl => y. rewrite !unlock; congr (_ \in fset_set _). apply/seteqP; rewrite /preimage; split=> [|] z/= [Pz Fz0]; split=> //; apply: contra_not Fz0. @@ -239,7 +242,8 @@ by move=> ->; rewrite mule0. Qed. Lemma ge0_mule_fsuml (T : choiceType) x (F : T -> \bar R) (P : set T) : - (forall i : T, 0 <= F i) -> (\sum_(i \in P) F i) * x = \sum_(i \in P) F i * x. + (forall i, P i -> 0 <= F i) -> + (\sum_(i \in P) F i) * x = \sum_(i \in P) F i * x. Proof. move=> F0; rewrite muleC ge0_mule_fsumr//. by apply: eq_fsbigr => i; rewrite muleC. diff --git a/theories/esum.v b/theories/esum.v index 56f2351143..bda7d4434c 100644 --- a/theories/esum.v +++ b/theories/esum.v @@ -141,26 +141,29 @@ Lemma eq_esum [R : realType] [T : choiceType] (I : set T) (a b : T -> \bar R) : \esum_(i in I) a i = \esum_(i in I) b i. Proof. by move=> e; apply/eqP; rewrite eq_le !le_esum// => i Ii; rewrite e. Qed. -(* TODO: generalize setT to any set *) -Lemma esumZ [R : realType] [T : choiceType] (a : T -> \bar R) - (c : \bar R) : 0 <= c -> (forall t, 0 <= a t) -> - \esum_(t in [set: T]) c * a t = c * \esum_(t in [set: T]) a t. +Lemma esumZ [R : realType] [T : choiceType] (A : set T) (a : T -> \bar R) + (c : \bar R) : 0 <= c -> (forall t, A t -> 0 <= a t) -> + \esum_(t in A) c * a t = c * \esum_(t in A) a t. Proof. rewrite le_eqVlt => /predU1P[<- _|c0 a0]. - by rewrite esum1 ?mul0e// => ? _; rewrite mul0e. + by rewrite mul0e esum1// => ? _; rewrite mul0e. apply/eqP; rewrite eq_le; apply/andP; split. -- rewrite ge_ereal_sup//= => _ [X [finX _]] <-. - by rewrite -ge0_mule_fsumr// (lee_wpmul2l (ltW c0))// esum_ge//; exists X. +- rewrite ge_ereal_sup//= => _ [X [finX XA]] <-. + rewrite -ge0_mule_fsumr; first by move=> t /XA /a0. + by rewrite (lee_wpmul2l (ltW c0))// esum_ge//; exists X. - case: c c0 => [s s0|_|//]. + rewrite -lee_pdivlMl// ge_ereal_sup//= => _ [X [finX XI]] <-. - by rewrite lee_pdivlMl// ge0_mule_fsumr// esum_ge//; exists X. - + have : 0 <= \esum_(x in setT) a x by apply: esum_ge0 => ? _; exact: a0. + rewrite lee_pdivlMl// ge0_mule_fsumr//; first by move=> t /XI /a0. + by rewrite esum_ge//; exists X. + + have : 0 <= \esum_(x in A) a x by apply: esum_ge0 => ? ?; exact: a0. rewrite [in X in X -> _]le_eqVlt => /predU1P[<-|suma0]. - + by rewrite mule0 esum_ge0// => ? _; rewrite mule_ge0. + + by rewrite mule0 esum_ge0// => ? ?; rewrite mule_ge0// a0. + rewrite gt0_mulye//. - have [y [A fsetsTA yE y0]] := ereal_sup_gt suma0. + have [y [B fsetsTB yE y0]] := ereal_sup_gt suma0. rewrite leye_eq; apply/eqP/eq_infty => r; rewrite esum_ge//. - by exists A => //; rewrite -ge0_mule_fsumr// yE gt0_mulye// leey. + exists B => //; rewrite -ge0_mule_fsumr//. + by move=> i Bi; rewrite a0//; case: fsetsTB => _ /(_ _ Bi). + by rewrite yE gt0_mulye// leey. Qed. Lemma esumD [R : realType] [T : choiceType] (I : set T) (a b : T -> \bar R) : @@ -1029,18 +1032,15 @@ Qed. exact: key. Qed. -Lemma esum_esup_comm : - \esum_(i in [set: T]) ereal_sup (range (f i)) = - ereal_sup (range (fun n => \esum_(x in [set:T]) f x n)). +Lemma esum_esup_comm (A : set T) : + \esum_(i in A) ereal_sup (range (f i)) = + ereal_sup (range (fun n => \esum_(x in A) f x n)). Proof. rewrite /esum. -under eq_imagel => A [fin ?] do rewrite fsbig_finite// ereal_sup_sum//. -rewrite ereal_sup_comm. -congr ereal_sup. -apply: eq_imagel => n _. -congr ereal_sup. -apply: eq_imagel => A [finA _]. -by rewrite fsbig_finite. +under eq_imagel => B [fin ?] do rewrite fsbig_finite// ereal_sup_sum. +rewrite ereal_sup_comm; congr ereal_sup. +apply: eq_imagel => n _; congr ereal_sup. +by apply: eq_imagel => B [finB BA]; rewrite fsbig_finite. Qed. End mono_esum. diff --git a/theories/lebesgue_integral_theory/lebesgue_integral_definition.v b/theories/lebesgue_integral_theory/lebesgue_integral_definition.v index d4395d5ee9..917f991730 100644 --- a/theories/lebesgue_integral_theory/lebesgue_integral_definition.v +++ b/theories/lebesgue_integral_theory/lebesgue_integral_definition.v @@ -148,7 +148,8 @@ Lemma sintegralrM : sintegral m (cst r \* f)%R = r%:E * sintegral m f. Proof. have [->|r0] := eqVneq r 0%R. by rewrite mul0e (eq_sintegral (cst 0%R)) ?sintegral0// => x/=; rewrite mul0r. -rewrite !sintegralET ge0_mule_fsumr; first exact: nnsfun_mulemu_ge0. +rewrite !sintegralET ge0_mule_fsumr. + by move=> s ?; rewrite nnsfun_mulemu_ge0. rewrite (reindex_fsbigT ( *%R r))/=. by exists ( *%R r^-1); [exact: mulKf|exact: mulVKf]. by apply: eq_fsbigr => x; rewrite preimage_cstM// [(_ / r)%R]mulrC mulKf// muleA. diff --git a/theories/lebesgue_integral_theory/radon_nikodym.v b/theories/lebesgue_integral_theory/radon_nikodym.v index df4cefd622..644b3fe713 100644 --- a/theories/lebesgue_integral_theory/radon_nikodym.v +++ b/theories/lebesgue_integral_theory/radon_nikodym.v @@ -893,7 +893,7 @@ rewrite ge0_integral_fsum//; first by move=> m y Ey; exact: nnfun_muleindic_ge0. transitivity (\int[mu]_(x in E) (\sum_(y \in range (h n)) (y * \1_(h n @^-1` [set y]) x)%:E * g x)). under [RHS]eq_integral => x xE. - rewrite -ge0_mule_fsuml => [y|]; first exact: nnfun_muleindic_ge0. + rewrite -ge0_mule_fsuml => [y ?|]; first exact: nnfun_muleindic_ge0. rewrite fsumEFin // -(fimfunE _ x); over. by []. rewrite ge0_integral_fsum//. From 42a87b0466195ebcde6120c9af90d43404014a66 Mon Sep 17 00:00:00 2001 From: Reynald Affeldt Date: Wed, 10 Jun 2026 15:04:26 +0900 Subject: [PATCH 12/21] address comments --- CHANGELOG_UNRELEASED.md | 19 ++- classical/unstable.v | 13 ++ theories/ereal.v | 65 +++++++++- theories/esum.v | 261 +++++++++------------------------------- theories/numfun.v | 13 -- theories/sequences.v | 54 +++++++++ 6 files changed, 202 insertions(+), 223 deletions(-) diff --git a/CHANGELOG_UNRELEASED.md b/CHANGELOG_UNRELEASED.md index 9a9a9d7a62..46d9644d04 100644 --- a/CHANGELOG_UNRELEASED.md +++ b/CHANGELOG_UNRELEASED.md @@ -101,16 +101,21 @@ + lemmas `numEesg`, `gte0_esg`, `lte0_esg`, `esg0` - in `esum.v`: - + lemmas `esum_eq0P`, `esumZ`, `esum_esum'` + + lemmas `esum_eq0P`, `esumZ`, `exchange_esum` + lemmas `ge0_funeneg`, `ge0_funepos`, `funepos_cst0`, `funeneg_cst0`, `le_funepos` + definition `sum` - + lemmas `sum0`, `eq_sum`, `esum_unit`, `sum_unit` - + lemmas `esum_sum'`, `sum_ge0`, `le_sum`, `sumN`, `sumZ` + + lemmas `sum0`, `eq_sum` + + lemmas `ge0_sum`, `sum_ge0`, `le_sum`, `sumN`, `sumZ` + lemmas `summable_le_sum`, `summable_esum_funepos`, `summable_sumN`, `summableZ`, `summable_sumZ` - + lemmas `ereal_sup_comm` - + lemmas `esupZl`, `esupZl_range`, `esup_add`, `ereal_sup_sum`, `esum_esup_comm` + + lemmas `exchange_esum_ereal_sup` + +- in `ereal.v`: + + lemmas `exchange_ereal_sup`, `ge0_ereal_supZl`, `ge0_ereal_supZl_range` + +- in `sequences.v`: + + lemmas `ereal_supD`, `ereal_sup_sum` - in `reals.v`: + lemmas `sup_ge0`, `has_sup_wpZl`, `gt0_has_supZl`, `has_sup_Mn`, `sup_Mn` @@ -254,6 +259,10 @@ * lemmas `summable_funrpos`, `summable_funrneg` + lemma `sum0` (now uses `cst`) +- moved from `numfun.v` to `unstable.v`: + + notations `nondecreasing_fun`, `nonincreasing_fun`, + `decreasing_fun`, `increasing_fun` + ### Renamed - in `tvs.v`: diff --git a/classical/unstable.v b/classical/unstable.v index cf8b4ce04a..d1c516f787 100644 --- a/classical/unstable.v +++ b/classical/unstable.v @@ -16,6 +16,10 @@ From mathcomp Require Import vector archimedean interval. (* ``` *) (* swap x := (x.2, x.1) *) (* map_pair f x := (f x.1, f x.2) *) +(* nondecreasing_fun f == the function f is non-decreasing *) +(* nonincreasing_fun f == the function f is non-increasing *) +(* increasing_fun f == the function f is (strictly) increasing *) +(* decreasing_fun f == the function f is (strictly) decreasing *) (* monotonic A f := {in A &, {homo f : x y / x <= y}} \/ *) (* {in A &, {homo f : x y /~ x <= y}} *) (* strict_monotonic A f := {in A &, {homo f : x y / x < y}} \/ *) @@ -197,6 +201,15 @@ rewrite -[X in (_ <= X)%N]prednK ?expn_gt0// -[X in (_ <= X)%N]addn1 leq_add2r. by rewrite (leq_trans h2)// -subn1 leq_subRL ?expn_gt0// add1n ltn_exp2l. Qed. +Notation "'nondecreasing_fun' f" := ({homo f : n m / (n <= m)%O >-> (n <= m)%O}) + (at level 10). +Notation "'nonincreasing_fun' f" := ({homo f : n m / (n <= m)%O >-> (n >= m)%O}) + (at level 10). +Notation "'increasing_fun' f" := ({mono f : n m / (n <= m)%O >-> (n <= m)%O}) + (at level 10). +Notation "'decreasing_fun' f" := ({mono f : n m / (n <= m)%O >-> (n >= m)%O}) + (at level 10). + Definition monotonic d (T : porderType d) d' (T' : porderType d') (pT : predType T) (A : pT) (f : T -> T') := {in A &, nondecreasing f} \/ {in A &, {homo f : x y /~ (x <= y)%O}}. diff --git a/theories/ereal.v b/theories/ereal.v index dcac6d2ece..e367efa176 100644 --- a/theories/ereal.v +++ b/theories/ereal.v @@ -637,6 +637,22 @@ split=> [ge_x y Sy|ge_x _ [y Sy <-]]; rewrite ?oppeK// ?ge_x//. by rewrite -[y]oppeK ge_x//; exists y. Qed. +Lemma exchange_ereal_sup {X Y : Type} (f : X -> Y -> \bar R) + (A : set X) (B : set Y) : + ereal_sup [set ereal_sup [set f x y | y in B] | x in A] = + ereal_sup [set ereal_sup [set f x y | x in A] | y in B]. +Proof. +suff suf : forall (U V : Type) (g : U -> V -> \bar R) (C : set U) (D : set V), + ereal_sup [set ereal_sup [set g x y | y in D] | x in C] <= + ereal_sup [set ereal_sup [set g x y | x in C] | y in D]. + by apply/le_anti/andP; split; exact: suf. +move=> U V g C D. +apply/ereal_supP => _ [x Cx <-]; apply/ereal_supP => _ [y Dy <-]. +apply: le_ereal_sup_tmp; exists (ereal_sup [set g x y | x in C]). +- by exists y. +- by apply: le_ereal_sup_tmp; exists (g x y) => //; exists x. +Qed. + Lemma ereal_sup_gtP S x : reflect (exists2 y : \bar R, S y & x < y) (x < ereal_sup S). Proof. @@ -752,6 +768,53 @@ move=> XN0 r_gt0; rewrite !ereal_supEN muleN image_comp/=; congr (- _). by under eq_imagel do rewrite /= -muleN; rewrite -image_comp ereal_inf_pZl. Qed. +Lemma ge0_ereal_supZl (c : \bar R) X : 0 <= c -> X != set0 -> + (forall x, X x -> 0 <= x) -> + ereal_sup [set c * x | x in X] = c * ereal_sup X. +Proof. +move=> c0 /[dup] Xneq0 /set0P[x Xx] X_ge0. +case: c c0 => [r r0|_|//]. +- have [->|_] := eqVneq r 0%R. + + rewrite mul0e. + under eq_imagel do rewrite mul0e. + by rewrite ereal_sup_cst. + + exact: ereal_supZl Xneq0 r0. +- have [Xall0|] := pselect (forall a, X a -> a = 0). + + rewrite [X in ereal_sup X = _](_ : _ = [set 0]%classic). + apply/seteqP; split. + * by move=> _ [z Xz <-]; rewrite (Xall0 _ Xz) mule0. + * by move=> y /= ->; exists x => //; rewrite (Xall0 _ Xx) mule0. + have -> : X = [set 0]%classic. + apply/seteqP; split. + + by move=> y /Xall0 ->. + + by move=> y /= ->; rewrite -(Xall0 _ Xx). + by rewrite ereal_sup1 mule0. + + rewrite -existsNE => -[y /not_implyP[Xy /eqP]]. + rewrite neq_lt ltNge X_ge0//= => y0. + rewrite gt0_mulye//. + by rewrite (lt_le_trans y0)// ereal_sup_ubound. + by rewrite ereal_supy//=; exists y => //; exact: gt0_mulye. +Qed. + +Section ge0_ereal_supZl_range. +Context {T : choiceType} (f : T -> nat -> \bar R). +Hypothesis f_ge0 : forall t n, 0 <= f t n. + +Lemma ge0_ereal_supZl_range (c : \bar R) (x : T) : 0 <= c -> + c * ereal_sup (range (f x)) = ereal_sup (range (fun n => c * f x n)). +Proof. +move=> c0. +rewrite [X in _ = ereal_sup X](_ : _ = [set c * y | y in range (f x)]%classic). + apply/seteqP; split. + - by move=> _ [n _ <-]; exists (f x n) => //; exists n. + - by move=> _ [_ [n _ <-] <-]; exists n. +rewrite ge0_ereal_supZl//. +- by apply/set0P; exists (f x 0%N), 0%N. +- by move=> _ [n _ <-]; exact: f_ge0. +Qed. + +End ge0_ereal_supZl_range. + End ereal_supZ. Lemma restrict_abse T (R : numDomainType) (f : T -> \bar R) (D : set T) : @@ -1545,7 +1608,7 @@ Definition ereal_loc_seq (R : numDomainType) (x : \bar R) (n : nat) := end. Lemma cvg_ereal_loc_seq (R : realType) (x : \bar R) : - ereal_loc_seq x @ \oo--> ereal_dnbhs x. + ereal_loc_seq x @ \oo --> ereal_dnbhs x. Proof. move=> P; rewrite /ereal_loc_seq. case: x => /= [x [_/posnumP[d] dP] |[d [dreal dP]] |[d [dreal dP]]]; last 2 first. diff --git a/theories/esum.v b/theories/esum.v index bda7d4434c..e0b54f8e6f 100644 --- a/theories/esum.v +++ b/theories/esum.v @@ -58,7 +58,7 @@ End set_of_fset_in_a_set. Section esum. Variables (R : realFieldType) (T : choiceType). -Implicit Types (S : set T) (a : T -> \bar R). +Implicit Types (S : set T) (a g : T -> \bar R). Definition esum S a := ereal_sup [set \sum_(x \in A) a x | A in fsets S]. @@ -393,8 +393,7 @@ by rewrite -fsbig_finite//; apply: eq_fsbigr=> x /[!inE]/XQ ?; rewrite invK ?inE Qed. Arguments reindex_esum {R T T'} P Q e a. -(* TODO: rename *) -Lemma esum_esum' [R : realType] [T U : choiceType] A B (f: T -> U -> \bar R): +Lemma exchange_esum [R : realType] [T U : choiceType] A B (f : T -> U -> \bar R): (forall i j, 0 <= f i j) -> \esum_(x in A) \esum_(y in B) f x y = \esum_(y in B) \esum_(x in A) f x y. Proof. @@ -742,7 +741,7 @@ End Sum. Section SumTheory. Context {R : realType} {T : choiceType}. -Implicit Types (S : T -> \bar R). +Implicit Types f g : T -> \bar R. Lemma sum0 : @sum R _ (@cst T _ 0) = 0. Proof. @@ -750,158 +749,128 @@ by rewrite /sum !esum1 ?subee// => r _; rewrite ?[LHS](funepos_cst0,funeneg_cst0). Qed. -Lemma eq_sum S1 S2 : S1 =1 S2 -> sum S1 = sum S2. +Lemma eq_sum f g : f =1 g -> sum f = sum g. Proof. move=> eq_fg; rewrite /sum; congr (_ - _). by apply: eq_esum => t _; rewrite !funeposE eq_fg. by apply: eq_esum => t _; rewrite !funenegE eq_fg. Qed. -(* TODO: rename *) -Lemma esum_unit S x : - \esum_(y in [set: T]) (if x == y then S y else 0) = \esum_(i in [set x]) S i. -Proof. -rewrite [RHS]esum_mkcond. -by under [in RHS]eq_esum do rewrite in_set1 eq_sym. -Qed. - -Lemma sum_unit S x : sum (fun y => if x == y then S y else 0) = S x. -Proof. -rewrite /sum. -rewrite (@eq_esum _ _ _ _ (fun y => if x == y then S^\+ y else 0)). - move=> i ?. - by rewrite !funeposE; case: ifPn => //; rewrite maxxx. -rewrite [X in _ - X](@eq_esum _ _ _ _ (fun y => if x == y then S^\- y else 0)). - move => i ?. - by rewrite !funenegE; case: ifPn => //; rewrite oppe0 maxxx. -rewrite !esum_unit. -case: (comparable_ltP (comparableT (S x) 0)%E) => Sx0. -- rewrite esum1. - by move => t //= ->; rewrite funeposE max_r// ltW. - rewrite esum_set1 ?funeneg_ge0//. - by rewrite funenegE max_l ?oppeK ?add0e// oppe_ge0 ltW. -- rewrite esum_set1 ?funepos_ge0// esum1. - by move => t //= ->; rewrite funenegE max_r// oppe_le0. - by rewrite funeposE max_l// sube0. -Qed. - Section SumTheoryP. -Lemma esum_sum' S : (forall x, 0 <= S x) -> sum S = \esum_(i in [set: T]) S i. +Lemma ge0_sum f : (forall x, 0 <= f x) -> sum f = \esum_(i in [set: T]) f i. Proof. -move=> ge0_S; rewrite /sum (@esum1 R T [set: T] S^\-) ?sube0. +move=> ge0_S; rewrite /sum (@esum1 R T [set: T] f^\-) ?sube0. by move=> x ?; rewrite ge0_funeneg. by under eq_esum do rewrite ge0_funepos//. Qed. -Lemma sum_ge0 S : (forall x, 0 <= S x) -> 0 <= sum S. -Proof. by move=> ge0_S; rewrite esum_sum' // esum_ge0. Qed. +Lemma sum_ge0 f : (forall x, 0 <= f x) -> 0 <= sum f. +Proof. by move=> ge0_S; rewrite ge0_sum// esum_ge0. Qed. -Lemma le_sum S1 S2 : (forall x, 0 <= S1 x) -> (forall x, S1 x <= S2 x) -> - sum S1 <= sum S2. +Lemma le_sum f g : (forall x, 0 <= f x) -> (forall x, f x <= g x) -> + sum f <= sum g. Proof. -move=> pS1 leS. -have pS2 x : 0 <= S2 x by rewrite (le_trans _ (leS _)). +move=> f0 leS. +have g0 x : 0 <= g x by rewrite (le_trans _ (leS _)). rewrite /sum leeB//. - by apply: le_esum => t _; rewrite !ge0_funepos. - by apply: le_esum => t _; rewrite !ge0_funeneg. Qed. -Lemma sumN S : (forall x, 0 <= S x) -> sum (\- S ) = - sum S. +Lemma sumN f : (forall x, 0 <= f x) -> sum (\- f ) = - sum f. Proof. -move=> S0; rewrite /sum [X in X - _ = _]esum1 ?add0r. +move=> f0; rewrite /sum [X in X - _ = _]esum1 ?add0r. by move=> t _; rewrite funeposN ge0_funeneg. rewrite [X in _ = - (_ - X)]esum1 ?sube0. by move=> t _; rewrite ge0_funeneg. by under eq_esum do rewrite funenegN. Qed. -Lemma sumZ S c : (forall x, 0 <= S x) -> sum (fun x => c * S x) = c * sum S. +Lemma sumZ f c : (forall x, 0 <= f x) -> sum (fun x => c * f x) = c * sum f. Proof. move=> h. -rewrite (@eq_sum _ (fun x => esg c * (`|c| * S x))). +rewrite (@eq_sum _ (fun x => esg c * (`|c| * f x))). by move=> x; rewrite muleA -numEesg. -transitivity (esg c * sum (fun x => `|c| * S x)). +transitivity (esg c * sum (fun x => `|c| * f x)). - have [hc|hc|->] := comparable_ltgtP (comparableT c 0). - + rewrite {1}lte0_abs// gte0_esg// (@eq_sum _ (fun x => - (- c * S x))). + + rewrite {1}lte0_abs// gte0_esg// (@eq_sum _ (fun x => - (- c * f x))). by move => ?; rewrite mulN1e. rewrite mulN1e -sumN; last by rewrite lte0_abs. by move=> ?; rewrite mule_ge0. - + rewrite gte0_abs// lte0_esg// mul1e (@eq_sum _ (fun x => c * S x))//. + + rewrite gte0_abs// lte0_esg// mul1e (@eq_sum _ (fun x => c * f x))//. by move=> ?; rewrite mul1e. + under eq_sum do rewrite esg0 mul0e. by rewrite esg0 mul0e sum0. -- rewrite {1}/sum (@eq_esum _ _ _ _ (fun x => `|c| * S x))//. +- rewrite {1}/sum (@eq_esum _ _ _ _ (fun x => `|c| * f x))//. by move=> ? _; rewrite ge0_funepos // => x; rewrite mule_ge0. rewrite (@eq_esum _ _ _ (_^\-) (@cst T _ 0)). by move => ? _; rewrite ge0_funeneg // => x; rewrite mule_ge0. - by rewrite (@esum1 _ _ _ (cst 0))// sube0 esumZ// muleA -numEesg esum_sum'. + by rewrite (@esum1 _ _ _ (cst 0))// sube0 esumZ// muleA -numEesg ge0_sum. Qed. End SumTheoryP. Section SumTheoryS. -Lemma summable_le_sum S1 S2 : summable [set : T] S2 -> - (forall x, S1 x <= S2 x) -> sum S1 <= sum S2. +Lemma summable_le_sum f g : summable [set : T] g -> + (forall x, f x <= g x) -> sum f <= sum g. Proof. -move=> smS2 leS; rewrite /sum leeB//. +move=> sg leS; rewrite /sum leeB//. by apply: le_esum => ? ?; exact: le_funepos. apply le_esum => t _. by rewrite -!funeposN; apply: le_funepos => ?; rewrite leeN2. Qed. -Lemma summable_esum_funepos S : - summable [set: T] S -> \esum_(t in [set: T]) S^\+ t \is a fin_num. +Lemma summable_esum_funepos A f : + summable A f -> \esum_(t in A) f^\+ t \is a fin_num. Proof. -move => /summable_funepos. -rewrite summableE. -rewrite (@eq_esum _ _ _ (fun y : T => S^\+ y) (fun y : T => `|S^\+ y|)) //=. -by move => ??; rewrite gee0_abs. +move=> /summable_funepos. +rewrite summableE (@eq_esum _ _ _ (fun y => f^\+ y) (fun y => `|f^\+ y|))//=. +by move => ? ?; rewrite gee0_abs. Qed. -Lemma summable_sumN S : summable [set : T] S -> sum (\- S) = - sum S. +Lemma summable_sumN f : summable [set: T] f -> sum (\- f) = - sum f. Proof. -move => hs. -rewrite /sum funenegN funeposN addeC oppeB //= adde_defC. -apply: fin_num_adde_defl. +move=> sf. +rewrite /sum funenegN funeposN addeC oppeB //= adde_defC fin_num_adde_defl//. exact: summable_esum_funepos. Qed. -Lemma summableZ c S : `|c| \is a fin_num -> - summable [set: T] (fun x : T => S x) -> - summable [set: T] (fun x : T => `|c| * S x). +Lemma summableZ c f : `|c| \is a fin_num -> + summable [set: T] f -> + summable [set: T] (fun x => `|c| * f x). Proof. rewrite /summable => cfin Soo. -rewrite (@eq_esum _ _ _ _ (fun x => `|c| * `|S x|)). +rewrite (@eq_esum _ _ _ _ (fun x => `|c| * `|f x|)). by move=> t ?; rewrite abseM abse_id. by rewrite esumZ// lte_mul_pinfty. Qed. -Lemma summable_sumZ S c : -`|c| \is a fin_num -> summable [set : T] S -> sum (fun x => c * S x) = c * sum S. +Lemma summable_sumZ f c : `|c| \is a fin_num -> + summable [set : T] f -> + sum (fun x => c * f x) = c * sum f. Proof. -move => hf h. -rewrite (@eq_sum _ (fun x => esg c * (`|c| * S x))). +move=> c_fin_num sf. +rewrite (@eq_sum _ (fun x => esg c * (`|c| * f x))). by move=> x; rewrite muleA -numEesg. -transitivity (esg c * sum (fun x => `|c| * S x)). +transitivity (esg c * sum (fun x => `|c| * f x)). - have [hc|hc|->] := comparable_ltgtP (comparableT c 0). - + rewrite {1}lte0_abs// gte0_esg// (@eq_sum _ (fun x => - (- c * S x))). + + rewrite {1}lte0_abs// gte0_esg// (@eq_sum _ (fun x => - (- c * f x))). by move => ?; rewrite mulN1e. rewrite mulN1e -summable_sumN; last by rewrite lte0_abs. exact: summableZ. - + rewrite gte0_abs// lte0_esg// mul1e (@eq_sum _ (fun x => c * S x))//. + + rewrite gte0_abs// lte0_esg// mul1e (@eq_sum _ (fun x => c * f x))//. by move=> ?; rewrite mul1e. + under eq_sum do rewrite esg0 mul0e. by rewrite esg0 mul0e sum0. - rewrite {1}/sum. - rewrite (@eq_esum _ _ _ _ (fun x => `|c| * S^\+ x)). + rewrite (@eq_esum _ _ _ _ (fun x => `|c| * f^\+ x)). by move=> i _ //=; rewrite -(@fineK _ `|c|) // ge0_funeposM. - rewrite (@eq_esum _ _ _ (fun x => `|c| * S x)^\- (fun x => `|c| * S^\- x)). + rewrite (@eq_esum _ _ _ (fun x => `|c| * f x)^\- (fun x => `|c| * f^\- x)). by move=> t _ //=; rewrite -(@fineK _ `|c|) // ge0_funenegM. rewrite !esumZ// -muleBr//=. - rewrite adde_defC fin_num_adde_defl//. - exact: summable_esum_funepos. + by rewrite adde_defC fin_num_adde_defl// summable_esum_funepos. by rewrite muleA -numEesg. Qed. @@ -909,138 +878,22 @@ End SumTheoryS. End SumTheory. -(* TODO: move *) -Lemma ereal_sup_comm {R : realType} {X Y : Type} (f : X -> Y -> \bar R) - (A : set X) (B : set Y) : - ereal_sup [set ereal_sup [set f x y | y in B] | x in A] = - ereal_sup [set ereal_sup [set f x y | x in A] | y in B]. -Proof. -suff key : forall (X' Y' : Type) (g : X' -> Y' -> \bar R) (C : set X') (D : set Y'), - ereal_sup [set ereal_sup [set g x y | y in D] | x in C] <= - ereal_sup [set ereal_sup [set g x y | x in C] | y in D]. -apply/le_anti/andP; split; [exact: key | exact: (key _ _ (fun y x => f x y) B A)]. -move=> X' Y' g C D. -apply/ereal_supP => _ [x hx <-]. -apply/ereal_supP => _ [y hy <-]. -apply: le_ereal_sup_tmp; exists (ereal_sup [set g x0 y | x0 in C]). -- exists y => //. -- apply: le_ereal_sup_tmp; exists (g x y); [exists x => // | exact: le_refl]. -Qed. - -Section mono_esum. - Context - {R : realType} - {T : choiceType} - {f : T -> nat -> \bar R} - {fpos : forall t n, 0 <= f t n} - (hmono : (forall n m : nat, (n <= m)%N -> forall x : T, f x n <= f x m)). - -Lemma esupZl (c : \bar R) (X : set \bar R): - 0 <= c -> - X != set0 -> - (forall x, X x -> 0 <= x) -> - ereal_sup [ set c * x | x in X ] = c * ereal_sup X. -Proof. -move=> cpos Xne Xpos. - have /set0P [x Xx] := Xne. - case: c cpos => [r|_|//]. - - move=> hr. - case: (eqVneq r 0%R) => [-> | rne0]. - + rewrite mul0e. - under eq_imagel => a _ do rewrite mul0e. - rewrite ereal_sup_cst //. - exact: ereal_supZl Xne hr. - - case: (boolp.pselect (forall a, X a -> a = 0)) => [hall | hnall]. - + have -> : [set +oo * x | x in X] = [set 0]. { - apply/seteqP; split. - + by move=> _ [z Xz <-]; rewrite (hall _ Xz) mule0 //. - + by move=> y /= ->; exists x => //; rewrite (hall _ Xx) mule0. - } - have -> : X = [set 0]. { - apply/seteqP; split. - + by move=> y Xy; rewrite (hall _ Xy)=> //. - + by move=> y /= ->; rewrite -(hall _ Xx) //. - } - by rewrite ereal_sup1 mule0. - + move: hnall; rewrite -boolp.existsNE. - move => [y /boolp.not_implyP [Xy hy] ]. - have ygt0: 0 < y by rewrite lt_def Xpos // andbT; apply/eqP. - rewrite gt0_mulye //. - - apply: (lt_le_trans ygt0); exact: ereal_sup_ubound. - apply: ereal_supy. exists y => //. exact: gt0_mulye. -Qed. +Section exchange_esum_ereal_sup. +Context {R : realType} {T : choiceType} {f : T -> nat -> \bar R}. +Hypothesis f_ge0 : forall t n, 0 <= f t n. +Hypothesis f_nd : forall x, nondecreasing_seq (f x). - Lemma esupZl_range (c : \bar R) (x : T) (cpos : 0 <= c) : - (c * ereal_sup (range (f x)) = - ereal_sup (range (fun n => c * f x n)))%E. - Proof. - have seteq : - [set c * y | y in range (f x)] = range (fun n => c * f x n). - apply/seteqP; split. - - by move=> _ [_ [n _ <-] <-]; exists n. - - by move=> _ [n _ <-]; exists (f x n) => //; exists n. - rewrite -seteq esupZl //. - - by apply/set0P; exists (f x 0%N), 0%N. - - by move=> _ [n _ <-]; exact: fpos. - Qed. - - Lemma esup_add (u v : nat -> \bar R) : - (forall n, 0 <= u n) -> (forall n, 0 <= v n) -> - nondecreasing_seq u -> nondecreasing_seq v -> - ereal_sup (range u) + ereal_sup (range v) = - ereal_sup (range (fun n => u n + v n)). - Proof. - move=> u0 v0 ndu ndv. - have su_ge0 : 0 <= ereal_sup (range u). - by rewrite (le_trans (u0 0%N))// ereal_sup_ubound//; exists 0%N. - have sv_ge0 : 0 <= ereal_sup (range v). - by rewrite (le_trans (v0 0%N))// ereal_sup_ubound//; exists 0%N. - have ndsum : nondecreasing_seq (fun n => u n + v n). - by move=> n m nm; apply: leeD; [exact: ndu | exact: ndv]. - have cuv_add : - (fun n => u n + v n) @ \oo --> - ereal_sup (range u) + ereal_sup (range v). - apply: cvgeD. - - by apply: ge0_adde_def; rewrite inE. - - exact: ereal_nondecreasing_cvgn. - - exact: ereal_nondecreasing_cvgn. - have cuv_sup : - (fun n => u n + v n) @ \oo --> - ereal_sup (range (fun n => u n + v n)). - exact: ereal_nondecreasing_cvgn. - exact: cvg_unique cuv_add cuv_sup. - Qed. - - Lemma ereal_sup_sum (A : {fset T}) : - \sum_(x <- A) ereal_sup (range (f x)) = - ereal_sup (range (fun n => \sum_(x <- A) f x n)). - Proof. - have key (l : seq T) : - \sum_(x <- l) ereal_sup (range (f x)) = - ereal_sup (range (fun n => \sum_(x <- l) f x n)). - elim: l => [|x xs IH]. - - rewrite big_nil. - under eq_fun => n do rewrite big_nil. - by rewrite ereal_sup_cst//; apply/set0P; exists 0%N. - - rewrite big_cons IH. - under [in RHS]eq_fun => n do rewrite big_cons. - apply: esup_add. - + by move=> n; exact: fpos. - + by move=> n; apply: sume_ge0 => y _; exact: fpos. - + by move=> n m nm; exact: hmono. - + by move=> n m nm; apply: lee_sum => y _; exact: hmono. - exact: key. - Qed. - -Lemma esum_esup_comm (A : set T) : +Lemma exchange_esum_ereal_sup (A : set T) : \esum_(i in A) ereal_sup (range (f i)) = ereal_sup (range (fun n => \esum_(x in A) f x n)). Proof. rewrite /esum. -under eq_imagel => B [fin ?] do rewrite fsbig_finite// ereal_sup_sum. -rewrite ereal_sup_comm; congr ereal_sup. +under eq_imagel. + move=> B [fin BA]; rewrite fsbig_finite//= ereal_sup_sum//. + over. +rewrite exchange_ereal_sup; congr ereal_sup. apply: eq_imagel => n _; congr ereal_sup. by apply: eq_imagel => B [finB BA]; rewrite fsbig_finite. Qed. -End mono_esum. +End exchange_esum_ereal_sup. diff --git a/theories/numfun.v b/theories/numfun.v index 534f7ce698..39a0476140 100644 --- a/theories/numfun.v +++ b/theories/numfun.v @@ -16,10 +16,6 @@ From mathcomp Require Import topology normedtype sequences. (* zero) ring) and theorems such as Tietze's extension theorem. *) (* *) (* ``` *) -(* nondecreasing_fun f == the function f is non-decreasing *) -(* nonincreasing_fun f == the function f is non-increasing *) -(* increasing_fun f == the function f is (strictly) increasing *) -(* decreasing_fun f == the function f is (strictly) decreasing *) (* itv_partition a b s == s is a partition of the interval `[a, b] *) (* itv_partitionL s c == the left side of splitting a partition at c *) (* itv_partitionR s c == the right side of splitting a partition at c *) @@ -57,15 +53,6 @@ Import numFieldTopology.Exports. Local Open Scope classical_set_scope. Local Open Scope ring_scope. -Notation "'nondecreasing_fun' f" := ({homo f : n m / (n <= m)%O >-> (n <= m)%O}) - (at level 10). -Notation "'nonincreasing_fun' f" := ({homo f : n m / (n <= m)%O >-> (n >= m)%O}) - (at level 10). -Notation "'increasing_fun' f" := ({mono f : n m / (n <= m)%O >-> (n <= m)%O}) - (at level 10). -Notation "'decreasing_fun' f" := ({mono f : n m / (n <= m)%O >-> (n >= m)%O}) - (at level 10). - Lemma nondecreasing_funN {R : numDomainType} a b (f : R -> R) : {in `[a, b] &, nondecreasing_fun f} <-> {in `[a, b] &, nonincreasing_fun (\- f)}. diff --git a/theories/sequences.v b/theories/sequences.v index 9207b9ecb9..e810336e70 100644 --- a/theories/sequences.v +++ b/theories/sequences.v @@ -1488,6 +1488,60 @@ apply: nondecreasing_cvgn. by apply: ereal_sup_ubound; exists (m + N)%N. Unshelve. all: by end_near. Qed. +Section ereal_supD. +Context {R : realType}. +Local Open Scope ereal_scope. + +Lemma ereal_supD (u v : nat -> \bar R) : + (forall n, 0 <= u n) -> (forall n, 0 <= v n) -> + nondecreasing u -> nondecreasing v -> + ereal_sup (range u) + ereal_sup (range v) = + ereal_sup (range (fun n => u n + v n)). +Proof. +move=> u0 v0 ndu ndv. +have u_ge0 : 0 <= ereal_sup (range u). + by rewrite (le_trans (u0 0%N))// ereal_sup_ubound//; exists 0%N. +have v_ge0 : 0 <= ereal_sup (range v). + by rewrite (le_trans (v0 0%N))// ereal_sup_ubound//; exists 0%N. +have ndsum : nondecreasing (fun n => u n + v n). + by move=> n m nm; apply: leeD; [exact: ndu | exact: ndv]. +have cuv_add : (fun n => u n + v n) @ \oo --> + ereal_sup (range u) + ereal_sup (range v). + apply: cvgeD. + - by apply: ge0_adde_def; rewrite inE. + - exact: ereal_nondecreasing_cvgn. + - exact: ereal_nondecreasing_cvgn. +have : (fun n => u n + v n) @ \oo --> ereal_sup (range (fun n => u n + v n)). + exact: ereal_nondecreasing_cvgn. +exact: cvg_unique cuv_add. +Qed. + +Section ereal_sup_sum. +Context {T : choiceType} (f : T -> nat -> \bar R). +Hypothesis f_ge0 : forall t n, 0 <= f t n. +Hypothesis f_nd : forall x, nondecreasing_seq (f x). + +Lemma ereal_sup_sum (l : seq T) : + \sum_(x <- l) ereal_sup (range (f x)) = + ereal_sup (range (fun n => \sum_(x <- l) f x n)). +Proof. +elim: l => [|x xs ih]. +- rewrite big_nil. + under eq_fun do rewrite big_nil. + by rewrite ereal_sup_cst//; apply/set0P; exists 0%N. +- rewrite big_cons ih. + under [in RHS]eq_fun do rewrite big_cons. + apply: ereal_supD. + + by move=> n; exact: f_ge0. + + by move=> n; apply: sume_ge0 => y _; exact: f_ge0. + + by move=> n m nm; exact: f_nd. + + by move=> n m nm; apply: lee_sum => y _; exact: f_nd. +Qed. + +End ereal_sup_sum. + +End ereal_supD. + Lemma ereal_nondecreasing_is_cvgn (R : realType) (u_ : (\bar R) ^nat) : nondecreasing_seq u_ -> cvgn u_. Proof. by move=> ?; apply/cvg_ex; eexists; exact: ereal_nondecreasing_cvgn. Qed. From 6e2c7bc7331d71d9f9d747fd29d0c7f413aaf7f8 Mon Sep 17 00:00:00 2001 From: Reynald Affeldt Date: Wed, 10 Jun 2026 16:02:24 +0900 Subject: [PATCH 13/21] fix --- CHANGELOG_UNRELEASED.md | 11 +++-------- theories/esum.v | 31 ++++++------------------------- theories/numfun.v | 12 ++++++++++++ 3 files changed, 21 insertions(+), 33 deletions(-) diff --git a/CHANGELOG_UNRELEASED.md b/CHANGELOG_UNRELEASED.md index 46d9644d04..26700bdbfb 100644 --- a/CHANGELOG_UNRELEASED.md +++ b/CHANGELOG_UNRELEASED.md @@ -100,10 +100,11 @@ + definition `esg` + lemmas `numEesg`, `gte0_esg`, `lte0_esg`, `esg0` +- in `numfun.v`: + + lemmas `ge0_funeneg`, `ge0_funepos`, `funepos_cst0`, `funeneg_cst0` + - in `esum.v`: + lemmas `esum_eq0P`, `esumZ`, `exchange_esum` - + lemmas `ge0_funeneg`, `ge0_funepos`, `funepos_cst0`, `funeneg_cst0`, - `le_funepos` + definition `sum` + lemmas `sum0`, `eq_sum` + lemmas `ge0_sum`, `sum_ge0`, `le_sum`, `sumN`, `sumZ` @@ -152,12 +153,6 @@ * lemmas `zornS_ex`, `domain_extend`, `hahn_banach_witness` + theorems `hahn_banach_extension`, `hahn_banach_extension_normed` -### Changed - -- moved from `measurable_structure.v` to `classical_sets.v`: - + definition `preimage_set_system` - + lemmas `preimage_set_system0`, `preimage_set_systemU`, `preimage_set_system_comp`, - `preimage_set_system_id` - in `functions.v`: + lemmas `linfunP`, `linfun_eqP` + instances of `SubLmodule` and `pointedType` on `{linear _->_ | _ }` diff --git a/theories/esum.v b/theories/esum.v index e0b54f8e6f..7ff0cd9934 100644 --- a/theories/esum.v +++ b/theories/esum.v @@ -20,6 +20,7 @@ From mathcomp Require Import topology sequences normedtype numfun. (* reals; it is 0 if I = set0 and sup(\sum_A a) where A *) (* is a finite set included in I o.w. *) (* summable D f := \esum_(x in D) `| f x | < +oo *) +(* sum f := esum [set: T] f^\+ - esum [set: T] f^\-. *) (* ``` *) (* *) (******************************************************************************) @@ -715,29 +716,8 @@ Qed. End esumB. -Section Sum. -Context {R : realType} {T : choiceType}. -Implicit Types (f : T -> \bar R) (x y : \bar R). - -Lemma ge0_funeneg f t : (forall t, 0 <= f t) -> f^\- t = 0. -Proof. by move => ?; rewrite funenegE max_r// ?lerN0 oppe_le0. Qed. - -Lemma ge0_funepos f t : (forall t, 0 <= f t) -> f^\+ t = f t. -Proof. by move=> ?; rewrite funeposE max_l. Qed. - -Lemma funepos_cst0 t : (@cst T _ 0)^\+ t = 0 :> \bar R. -Proof. by rewrite funeposE maxxx. Qed. - -Lemma funeneg_cst0 t : (@cst T _ 0)^\- t = 0 :> \bar R. -Proof. by rewrite funenegE oppe0 maxxx. Qed. - -Lemma le_funepos f1 f2 : (forall t, f1 t <= f2 t) -> - (forall t, f1^\+ t <= f2^\+ t). -Proof. by move=> le_f x; rewrite (@funepos_le _ _ setT)// inE. Qed. - -Definition sum f : \bar R := esum [set: T] f^\+ - esum [set: T] f^\-. - -End Sum. +Definition sum {R : realType} {T : choiceType} (f : T -> \bar R) : \bar R := + esum [set: T] f^\+ - esum [set: T] f^\-. Section SumTheory. Context {R : realType} {T : choiceType}. @@ -817,9 +797,10 @@ Lemma summable_le_sum f g : summable [set : T] g -> (forall x, f x <= g x) -> sum f <= sum g. Proof. move=> sg leS; rewrite /sum leeB//. - by apply: le_esum => ? ?; exact: le_funepos. + by apply: le_esum => ? ?; apply: (@funepos_le _ _ setT) => //; rewrite inE. apply le_esum => t _. -by rewrite -!funeposN; apply: le_funepos => ?; rewrite leeN2. +rewrite -!funeposN. +by apply: (@funepos_le _ _ setT); rewrite ?inE// => ? ?; rewrite leeN2. Qed. Lemma summable_esum_funepos A f : diff --git a/theories/numfun.v b/theories/numfun.v index 39a0476140..cf89346d25 100644 --- a/theories/numfun.v +++ b/theories/numfun.v @@ -945,6 +945,18 @@ move=> fg x Dx; rewrite !funenegE /maxe; case: ifPn => gx; case: ifPn => fx //. - by rewrite leeN2; exact: fg. Qed. +Lemma ge0_funeneg f t : (forall t, 0 <= f t) -> f^\- t = 0. +Proof. by move => ?; rewrite funenegE max_r// ?lerN0 oppe_le0. Qed. + +Lemma ge0_funepos f t : (forall t, 0 <= f t) -> f^\+ t = f t. +Proof. by move=> ?; rewrite funeposE max_l. Qed. + +Lemma funepos_cst0 t : (@cst T _ 0)^\+ t = 0 :> \bar R. +Proof. by rewrite funeposE maxxx. Qed. + +Lemma funeneg_cst0 t : (@cst T _ 0)^\- t = 0 :> \bar R. +Proof. by rewrite funenegE oppe0 maxxx. Qed. + End funposneg_lemmas. #[deprecated(since="mathcomp-analysis 1.15.0", note="use `-funeDB` instead")] Notation funeD_posD := funeDB (only parsing). From 42688b14c70760835383f4a52ced22ba1065a85d Mon Sep 17 00:00:00 2001 From: Reynald Affeldt Date: Wed, 10 Jun 2026 17:24:21 +0900 Subject: [PATCH 14/21] mv --- CHANGELOG_UNRELEASED.md | 12 ++++--- experimental_reals/realsum.v | 68 ++++-------------------------------- theories/numfun.v | 45 ++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 65 deletions(-) diff --git a/CHANGELOG_UNRELEASED.md b/CHANGELOG_UNRELEASED.md index 26700bdbfb..deb50cb1f8 100644 --- a/CHANGELOG_UNRELEASED.md +++ b/CHANGELOG_UNRELEASED.md @@ -242,6 +242,12 @@ `ae_eq_Radon_Nikodym_SigmaFinite`, `Radon_Nikodym_change_of_variables`, `Radon_Nikodym_cscale`, `Radon_Nikodym_cadd`, `Radon_Nikodym_chain_rule` - in `realsum.v`: + + now use `funrpos` and `funrneg`: + * definition `sum` + * lemmas `summable_funrpos`, `summable_funrneg` + + lemma `sum0` (now uses `cst`) + +- moved from `realsum` to `numfun.v`: + now use `funrpos` and `funrneg`: * lemmas `eq_funrpos`, `eq_funrneg` * lemma `fpos0` (renamed to `funrpos_cst0`) @@ -249,10 +255,7 @@ * lemmas `funrposZ`, `funrnegZ` * lemmas `funrpos_natrM`, `funrneg_natrM` * lemmas `ge0_funrneg`, `ge0_funrpos` - * lemmas `le_funrpos_norm`, `funrpos_le` - * definition `sum` - * lemmas `summable_funrpos`, `summable_funrneg` - + lemma `sum0` (now uses `cst`) + * lemmas `le_funrpos_norm` - moved from `numfun.v` to `unstable.v`: + notations `nondecreasing_fun`, `nonincreasing_fun`, @@ -346,6 +349,7 @@ + lemmas `fnegN`, `fposN` + lemmas `ge0_pos`, `ge0_neg` + lemma `fposBfneg` + + lemma `funrpos_le` ### Infrastructure diff --git a/experimental_reals/realsum.v b/experimental_reals/realsum.v index 0c9aba127e..c9b8a5c6a4 100644 --- a/experimental_reals/realsum.v +++ b/experimental_reals/realsum.v @@ -42,68 +42,13 @@ by have := h fset0; rewrite big_pred0 // => -[x]; rewrite in_fset0. Qed. End Summable. -(* -------------------------------------------------------------------- *) -Section Sum. -Context {R : realType} {T : choiceType}. -Implicit Types f g : T -> R. - -(* TODO: move to numfun.v *) -Lemma eq_funrpos f g : f =1 g -> f^\+ =1 g^\+. -Proof. by move=> eq_fg x; rewrite /funrpos eq_fg. Qed. - -Lemma eq_funrneg f g : f =1 g -> f^\- =1 g^\-. -Proof. by move=> eq_fg x; rewrite /funrneg eq_fg. Qed. - -Lemma funrpos_cst0 x : (fun _ : T => 0)^\+ x = 0 :> R. -Proof. by rewrite /funrpos maxxx. Qed. - -Lemma funrneg_cst0 x : (fun _ : T => 0)^\- x = 0 :> R. -Proof. by rewrite /funrneg oppr0 maxxx. Qed. - -Lemma funrposZ f c : 0 <= c -> (c \*o f)^\+ =1 c \*o f^\+. -Proof. by move=> ge0_c x; rewrite /= ge0_funrposM. Qed. - -Lemma funrnegZ f c : 0 <= c -> (c \*o f)^\- =1 c \*o f^\-. -Proof. -move=> ge0_c x; rewrite /= -!funrposN; have /= <- := funrposZ (- f) ge0_c x. -by apply/eq_funrpos=> y /=; rewrite mulrN. -Qed. - -Lemma funrpos_natrM f (n : T -> nat) x : - (fun x => (n x)%:R * f x)^\+ x = (n x)%:R * f^\+ x. -Proof. -by rewrite /funrpos -[in RHS]normr_nat maxr_pMr// mulr0 ger0_norm. -Qed. - -Lemma funrneg_natrM f (n : T -> nat) x : - (fun x => (n x)%:R * f x)^\- x = (n x)%:R * f^\- x. -Proof. -rewrite -[in RHS]funrposN -funrpos_natrM -funrposN. -by apply/eq_funrpos=> y; rewrite mulrN. -Qed. - -Lemma ge0_funrneg f x : (forall x, 0 <= f x) -> f^\- x = 0. -Proof. by move=> ?; rewrite /funrneg max_r// oppr_le0. Qed. - -Lemma ge0_funrpos f x : (forall x, 0 <= f x) -> f^\+ x = f x. -Proof. by move=> ?; rewrite /funrpos max_l. Qed. - -Lemma le_funrpos_norm f x : f^\+ x <= `|f x|. -Proof. -by rewrite -/((Num.Def.normr \o f) x) -funrposDneg lerDl funrneg_ge0. -Qed. - -Lemma funrpos_le f1 f2 : f1 <=1 f2 -> f1^\+ <=1 f2^\+. -Proof. by move=> le_f x; rewrite (@funrpos_le _ _ setT)// in_setT. Qed. - -Definition psum f : R := +Definition psum {R : realType} {T : choiceType} (f : T -> R) : R := (* We need some ticked `image` operator *) let S := [set x | exists J : {fset T}, x = \sum_(x : J) `|f (val x)| ]%classic in if `[] then sup S else 0. -Definition sum f : R := psum f^\+ - psum f^\-. - -End Sum. +Definition sum {R : realType} {T : choiceType} (f : T -> R) : R := + psum f^\+ - psum f^\-. (* -------------------------------------------------------------------- *) Section SummableCountable. @@ -1158,15 +1103,16 @@ Lemma le_sum S1 S2 : summable S1 -> summable S2 -> S1 <=1 S2 -> Proof. move=> smS1 smS2 leS; rewrite /sum lerB //. - apply/le_psum/summable_funrpos => // x. - by rewrite funrpos_ge0/= funrpos_le. + by rewrite funrpos_ge0/= (@funrpos_le _ _ setT)//= in_setE. - apply/le_psum/summable_funrneg => // x. - rewrite -!funrposN funrpos_ge0 funrpos_le // => y. + rewrite -!funrposN funrpos_ge0 (@funrpos_le _ _ setT) ?in_setE//= => y _. by rewrite lerN2. Qed. Lemma sum0 : sum (@cst T _ 0) = 0 :> R. Proof. -by rewrite /sum !(eq_psum funrpos_cst0, eq_psum funrneg_cst0) !psum0 subr0. +rewrite /sum !(eq_psum (@funrpos_cst0 _ _), eq_psum (@funrneg_cst0 _ _)). +by rewrite !psum0 subr0. Qed. Lemma sumN S : sum (- S) = - sum S. diff --git a/theories/numfun.v b/theories/numfun.v index cf89346d25..1c3d0a0aaa 100644 --- a/theories/numfun.v +++ b/theories/numfun.v @@ -793,6 +793,51 @@ move=> fg x Dx; rewrite /funrneg /Num.max; case: ifPn => gx; case: ifPn => fx//. - by rewrite lerN2; exact: fg. Qed. +Lemma eq_funrpos f g : f =1 g -> f^\+ =1 g^\+. +Proof. by move=> eq_fg x; rewrite /funrpos eq_fg. Qed. + +Lemma eq_funrneg f g : f =1 g -> f^\- =1 g^\-. +Proof. by move=> eq_fg x; rewrite /funrneg eq_fg. Qed. + +Lemma funrpos_cst0 x : (fun _ : T => 0)^\+ x = 0 :> R. +Proof. by rewrite /funrpos maxxx. Qed. + +Lemma funrneg_cst0 x : (fun _ : T => 0)^\- x = 0 :> R. +Proof. by rewrite /funrneg oppr0 maxxx. Qed. + +Lemma funrposZ f c : 0 <= c -> (c \*o f)^\+ =1 c \*o f^\+. +Proof. by move=> ge0_c x; rewrite /= ge0_funrposM. Qed. + +Lemma funrnegZ f c : 0 <= c -> (c \*o f)^\- =1 c \*o f^\-. +Proof. +move=> ge0_c x; rewrite /= -!funrposN; have /= <- := funrposZ (- f) ge0_c x. +by apply/eq_funrpos=> y /=; rewrite mulrN. +Qed. + +Lemma funrpos_natrM f (n : T -> nat) x : + (fun x => (n x)%:R * f x)^\+ x = (n x)%:R * f^\+ x. +Proof. +by rewrite /funrpos -[in RHS]normr_nat maxr_pMr// mulr0 ger0_norm. +Qed. + +Lemma funrneg_natrM f (n : T -> nat) x : + (fun x => (n x)%:R * f x)^\- x = (n x)%:R * f^\- x. +Proof. +rewrite -[in RHS]funrposN -funrpos_natrM -funrposN. +by apply/eq_funrpos=> y; rewrite mulrN. +Qed. + +Lemma ge0_funrneg f x : (forall x, 0 <= f x) -> f^\- x = 0. +Proof. by move=> ?; rewrite /funrneg max_r// oppr_le0. Qed. + +Lemma ge0_funrpos f x : (forall x, 0 <= f x) -> f^\+ x = f x. +Proof. by move=> ?; rewrite /funrpos max_l. Qed. + +Lemma le_funrpos_norm f x : f^\+ x <= `|f x|. +Proof. +by rewrite -/((Num.Def.normr \o f) x) -funrposDneg lerDl funrneg_ge0. +Qed. + End funrposneg_lemmas. #[global] Hint Extern 0 (is_true (0%R <= _ ^\+ _)%R) => solve [apply: funrpos_ge0] : core. From 86b2f5712d3b464775d59d267f3de6158ec88db7 Mon Sep 17 00:00:00 2001 From: Reynald Affeldt Date: Wed, 10 Jun 2026 18:16:28 +0900 Subject: [PATCH 15/21] rm weak variants of lemmmas --- CHANGELOG_UNRELEASED.md | 3 +- experimental_reals/realsum.v | 4 +- theories/esum.v | 71 ++++++++++++++++++++++++++++-------- theories/numfun.v | 12 ------ 4 files changed, 59 insertions(+), 31 deletions(-) diff --git a/CHANGELOG_UNRELEASED.md b/CHANGELOG_UNRELEASED.md index deb50cb1f8..b8241b733d 100644 --- a/CHANGELOG_UNRELEASED.md +++ b/CHANGELOG_UNRELEASED.md @@ -101,7 +101,7 @@ + lemmas `numEesg`, `gte0_esg`, `lte0_esg`, `esg0` - in `numfun.v`: - + lemmas `ge0_funeneg`, `ge0_funepos`, `funepos_cst0`, `funeneg_cst0` + + lemmas `funepos_cst0`, `funeneg_cst0` - in `esum.v`: + lemmas `esum_eq0P`, `esumZ`, `exchange_esum` @@ -254,7 +254,6 @@ * lemma `fneg0` (renamed to `funrneg_cst0`) * lemmas `funrposZ`, `funrnegZ` * lemmas `funrpos_natrM`, `funrneg_natrM` - * lemmas `ge0_funrneg`, `ge0_funrpos` * lemmas `le_funrpos_norm` - moved from `numfun.v` to `unstable.v`: diff --git a/experimental_reals/realsum.v b/experimental_reals/realsum.v index c9b8a5c6a4..d771379d0f 100644 --- a/experimental_reals/realsum.v +++ b/experimental_reals/realsum.v @@ -1094,8 +1094,8 @@ Implicit Types (S : T -> R). Lemma psum_sum S : (forall x, 0 <= S x) -> psum S = sum S. Proof. move=> ge0_S; rewrite /sum [X in _-X]psum_eq0 ?subr0. - by move=> x; rewrite ge0_funrneg. -by apply/eq_psum=> x; rewrite ge0_funrpos. + by move=> x; rewrite (@ge0_funrnegE _ _ setT) ?in_setT. +by apply/eq_psum=> x; rewrite (@ge0_funrposE _ _ setT) ?in_setT. Qed. Lemma le_sum S1 S2 : summable S1 -> summable S2 -> S1 <=1 S2 -> diff --git a/theories/esum.v b/theories/esum.v index 7ff0cd9934..27668e630c 100644 --- a/theories/esum.v +++ b/theories/esum.v @@ -57,21 +57,57 @@ Qed. End set_of_fset_in_a_set. -Section esum. +Module PosEsum. +Section posesum. Variables (R : realFieldType) (T : choiceType). Implicit Types (S : set T) (a g : T -> \bar R). -Definition esum S a := ereal_sup [set \sum_(x \in A) a x | A in fsets S]. +Definition pos_esum S g := ereal_sup [set \sum_(x \in B) g x | B in fsets S]. -Local Notation "\esum_ ( i 'in' P ) A" := (esum P (fun i => A)). +Local Notation "\esum_ ( i 'in' P ) A" := (pos_esum P (fun i => A)). -Lemma esum_set0 a : \esum_(i in set0) a i = 0. +Lemma pos_esum_set0 a : \esum_(i in set0) a i = 0. Proof. -rewrite /esum fsets0 [X in ereal_sup X](_ : _ = [set 0%E]) ?ereal_sup1//. +rewrite /pos_esum fsets0 [X in ereal_sup X](_ : _ = [set 0%E]) ?ereal_sup1//. apply/seteqP; split=> [x [_ /= ->]|x]; first by rewrite fsbig_set0. by move=> -> /=; exists set0 => //; rewrite fsbig_set0. Qed. +Lemma ge0_pos_esum S a : (forall x, S x -> 0 <= a x) -> + \esum_(i in S) a^\- i = 0. +Proof. +move=> a0. +rewrite /pos_esum [X in ereal_sup X](_ : _ = [set 0]) ?ereal_sup1//. +apply/seteqP; split => [/= x /= [A SA <-]|]. + rewrite fsbig1//= => t At. + rewrite (@ge0_funenegE _ _ A)//; last exact/mem_set. + by move=> u; case: SA => _ => /[apply] /a0. +move=> /= _ ->. +exists set0; first exact: fsets_set0. +by rewrite fsbig_set0. +Qed. + +End posesum. +End PosEsum. + +Section esum. +Variables (R : realFieldType) (T : choiceType). +Implicit Types (S : set T) (a g : T -> \bar R). + +Import PosEsum. + +Definition esum S a := (*pos_esum S a^\+ - pos_esum S a^\-*) pos_esum S a. + +Local Notation "\esum_ ( i 'in' P ) A" := (esum P (fun i => A)). + +Lemma ge0_esum S a : (forall x, S x -> 0 <= a x) -> + \esum_(i in S) a i = ereal_sup [set \sum_(x \in B) a x | B in fsets S]. +Proof. +Abort. + +Lemma esum_set0 a : \esum_(i in set0) a i = 0. +Proof. by rewrite /esum pos_esum_set0. Qed. + End esum. Notation "\esum_ ( i 'in' P ) F" := (esum P (fun i => F)) : ring_scope. @@ -118,7 +154,7 @@ End esum_realType. Lemma esum1 [R : realFieldType] [I : choiceType] (D : set I) (a : I -> \bar R) : (forall i, D i -> a i = 0) -> \esum_(i in D) a i = 0. Proof. -move=> a0; rewrite /esum (_ : [set _ | _ in _] = [set 0]) ?ereal_sup1//. +move=> a0; rewrite /esum /PosEsum.pos_esum (_ : [set _ | _ in _] = [set 0]) ?ereal_sup1//. apply/seteqP; split=> x //= => [[X [finX XI]] <-|->]. by rewrite fsbig1// => i /XI/a0. by exists set0; rewrite ?fsbig_set0//; exact: fsets_set0. @@ -741,8 +777,11 @@ Section SumTheoryP. Lemma ge0_sum f : (forall x, 0 <= f x) -> sum f = \esum_(i in [set: T]) f i. Proof. move=> ge0_S; rewrite /sum (@esum1 R T [set: T] f^\-) ?sube0. - by move=> x ?; rewrite ge0_funeneg. -by under eq_esum do rewrite ge0_funepos//. + by move=> x ?; rewrite (@ge0_funenegE _ _ setT)// in_setE. +under eq_esum. + move=> ? _; rewrite (@ge0_funeposE _ _ setT) ?in_setT//. + over. +by []. Qed. Lemma sum_ge0 f : (forall x, 0 <= f x) -> 0 <= sum f. @@ -754,16 +793,16 @@ Proof. move=> f0 leS. have g0 x : 0 <= g x by rewrite (le_trans _ (leS _)). rewrite /sum leeB//. -- by apply: le_esum => t _; rewrite !ge0_funepos. -- by apply: le_esum => t _; rewrite !ge0_funeneg. +- by apply: le_esum => t _; rewrite !(@ge0_funeposE _ _ setT) ?in_setT. +- by apply: le_esum => t _; rewrite !(@ge0_funenegE _ _ setT) ?in_setT. Qed. Lemma sumN f : (forall x, 0 <= f x) -> sum (\- f ) = - sum f. Proof. move=> f0; rewrite /sum [X in X - _ = _]esum1 ?add0r. - by move=> t _; rewrite funeposN ge0_funeneg. + by move=> t _; rewrite funeposN (@ge0_funenegE _ _ setT) ?in_setT//. rewrite [X in _ = - (_ - X)]esum1 ?sube0. - by move=> t _; rewrite ge0_funeneg. + by move=> t _; rewrite (@ge0_funenegE _ _ setT) ?in_setT//. by under eq_esum do rewrite funenegN. Qed. @@ -783,9 +822,11 @@ transitivity (esg c * sum (fun x => `|c| * f x)). + under eq_sum do rewrite esg0 mul0e. by rewrite esg0 mul0e sum0. - rewrite {1}/sum (@eq_esum _ _ _ _ (fun x => `|c| * f x))//. - by move=> ? _; rewrite ge0_funepos // => x; rewrite mule_ge0. + move=> ? _; rewrite (@ge0_funeposE _ _ setT) ?in_setT// => x. + by rewrite mule_ge0. rewrite (@eq_esum _ _ _ (_^\-) (@cst T _ 0)). - by move => ? _; rewrite ge0_funeneg // => x; rewrite mule_ge0. + move => ? _; rewrite (@ge0_funenegE _ _ setT) ?in_setT// => x. + by rewrite mule_ge0. by rewrite (@esum1 _ _ _ (cst 0))// sube0 esumZ// muleA -numEesg ge0_sum. Qed. @@ -868,7 +909,7 @@ Lemma exchange_esum_ereal_sup (A : set T) : \esum_(i in A) ereal_sup (range (f i)) = ereal_sup (range (fun n => \esum_(x in A) f x n)). Proof. -rewrite /esum. +rewrite /esum /PosEsum.pos_esum. under eq_imagel. move=> B [fin BA]; rewrite fsbig_finite//= ereal_sup_sum//. over. diff --git a/theories/numfun.v b/theories/numfun.v index 1c3d0a0aaa..7946c95f0c 100644 --- a/theories/numfun.v +++ b/theories/numfun.v @@ -827,12 +827,6 @@ rewrite -[in RHS]funrposN -funrpos_natrM -funrposN. by apply/eq_funrpos=> y; rewrite mulrN. Qed. -Lemma ge0_funrneg f x : (forall x, 0 <= f x) -> f^\- x = 0. -Proof. by move=> ?; rewrite /funrneg max_r// oppr_le0. Qed. - -Lemma ge0_funrpos f x : (forall x, 0 <= f x) -> f^\+ x = f x. -Proof. by move=> ?; rewrite /funrpos max_l. Qed. - Lemma le_funrpos_norm f x : f^\+ x <= `|f x|. Proof. by rewrite -/((Num.Def.normr \o f) x) -funrposDneg lerDl funrneg_ge0. @@ -990,12 +984,6 @@ move=> fg x Dx; rewrite !funenegE /maxe; case: ifPn => gx; case: ifPn => fx //. - by rewrite leeN2; exact: fg. Qed. -Lemma ge0_funeneg f t : (forall t, 0 <= f t) -> f^\- t = 0. -Proof. by move => ?; rewrite funenegE max_r// ?lerN0 oppe_le0. Qed. - -Lemma ge0_funepos f t : (forall t, 0 <= f t) -> f^\+ t = f t. -Proof. by move=> ?; rewrite funeposE max_l. Qed. - Lemma funepos_cst0 t : (@cst T _ 0)^\+ t = 0 :> \bar R. Proof. by rewrite funeposE maxxx. Qed. From ce7d98a38ad81c3542ef11ebb4c1a44fe35bd631 Mon Sep 17 00:00:00 2001 From: Reynald Affeldt Date: Thu, 11 Jun 2026 22:32:39 +0900 Subject: [PATCH 16/21] new definition of esum --- CHANGELOG_UNRELEASED.md | 19 +- experimental_reals/realsum.v | 31 +- theories/esum.v | 642 +++++++++++------- .../lebesgue_integrable.v | 3 +- theories/lebesgue_measure.v | 5 +- theories/lebesgue_stieltjes_measure.v | 3 +- theories/measure_theory/dirac_measure.v | 2 +- theories/measure_theory/measure_extension.v | 2 +- theories/measure_theory/measure_function.v | 6 +- .../bernoulli_distribution.v | 2 +- 10 files changed, 425 insertions(+), 290 deletions(-) diff --git a/CHANGELOG_UNRELEASED.md b/CHANGELOG_UNRELEASED.md index b8241b733d..45b9b902b2 100644 --- a/CHANGELOG_UNRELEASED.md +++ b/CHANGELOG_UNRELEASED.md @@ -94,7 +94,7 @@ + instance `is_diff_mx` - in `realsum.v`: + lemma `esum_psum` - + lemma `sum_sum` + + lemma `esumEsum` - in `constructive_ereal.v`: + definition `esg` @@ -105,11 +105,9 @@ - in `esum.v`: + lemmas `esum_eq0P`, `esumZ`, `exchange_esum` - + definition `sum` - + lemmas `sum0`, `eq_sum` - + lemmas `ge0_sum`, `sum_ge0`, `le_sum`, `sumN`, `sumZ` - + lemmas `summable_le_sum`, `summable_esum_funepos`, `summable_sumN`, - `summableZ`, `summable_sumZ` + + lemmas `le_esum`, `esumN` + + lemmas `summable_le_esum`, `summable_esum_funepos`, `summable_esumN`, + `summableZ`, `summable_esumZ` + lemmas `exchange_esum_ereal_sup` - in `ereal.v`: @@ -178,6 +176,9 @@ - new files `signed_measure.v` and `radon_nikodym.v` + with the contents of `charge.v` (deprecated) +- in `esum.v`: + + `ge0_esum` + ### Changed - moved from `measurable_structure.v` to `classical_sets.v`: @@ -260,6 +261,12 @@ + notations `nondecreasing_fun`, `nonincreasing_fun`, `decreasing_fun`, `increasing_fun` +- in `esum.v`: + + definition `esum` + + lemma `esum_fset` + + lemma `esum_ge` -> `PosEsum.pos_esum_ge` + + lemma `le_esum` -> `PosEsum.le_pos_esum` + ### Renamed - in `tvs.v`: diff --git a/experimental_reals/realsum.v b/experimental_reals/realsum.v index d771379d0f..30bb67694b 100644 --- a/experimental_reals/realsum.v +++ b/experimental_reals/realsum.v @@ -270,7 +270,9 @@ Lemma esum_psum (S : T -> R) : (forall i, 0 <= S i) -> summable S -> \esum_(x in [set: T]) (S x)%:E = (psum S)%:E. Proof. move => Sg0 h; apply/eqP; rewrite eq_le; apply/andP; split. -- rewrite ge_ereal_sup//= => x [X [finX _]]. +- rewrite ge0_esum. + by move=> t _; rewrite lee_fin. + rewrite ge_ereal_sup//= => x [X [finX _]]. rewrite fsumEFin // => <-. rewrite lee_fin fsbig_finite//=. move/cardinality.finite_fsetP : finX => [J ->]. @@ -281,7 +283,8 @@ move => Sg0 h; apply/eqP; rewrite eq_le; apply/andP; split. by move => t _; rewrite ger0_norm. have [nonempty hasub] := summable_sup h. rewrite psum_absE// -ereal_sup_EFin// ge_ereal_sup//= => x [X [Fs ->] <-]. - rewrite esum_ge//. + rewrite ge0_esum//. + rewrite PosEsum.pos_esum_ge//. exists ([set` Fs]%classic) => //. rewrite fsumEFin// lee_fin (big_fset_seq (fun x => `|S x|))//=. by rewrite -{1}(set_fsetK Fs) -fsbig_finite. @@ -638,25 +641,21 @@ Qed. End SummableAlg. -(* -------------------------------------------------------------------- *) -Section Sum_Sum. -Context {T : choiceType} {R : realType}. - -Lemma sum_sum (S : T -> R) : summable S -> - esum.sum (fun x => (S x)%:E) = (sum S)%:E. +Lemma esumEsum {T : choiceType} {R : realType} (S : T -> R) : summable S -> + \esum_(x in setT) (S x)%:E = (sum S)%:E. Proof. -move=> hs. -rewrite /esum.sum /sum. -rewrite (@eq_esum _ _ _ ((fun x => (S x)%:E)^\+%E) (fun x => (S^\+ x)%:E)). +move=> hs; rewrite /esum. +rewrite (PosEsum.eq_pos_esum _ (fun x => (S x)%:E)^\+%E (fun x => (S^\+ x)%:E)). by move=> t _; rewrite funeposE -fine_max. -rewrite (@eq_esum _ _ _ ((fun x => (S x)%:E)^\-%E) (fun x => (S^\- x)%:E)). +rewrite (PosEsum.eq_pos_esum _ (fun x => (S x)%:E)^\-%E (fun x => (S^\- x)%:E)). by move=> t _; rewrite funenegE EFin_max. -rewrite esum_psum//; first exact : summable_funrpos. -by rewrite esum_psum//; exact : summable_funrneg. +rewrite EFinB; congr (_ - _)%E. +- rewrite -esum_psum//; first exact : summable_funrpos. + by rewrite ge0_esum// => x _; rewrite lee_fin. +- rewrite -esum_psum//; first exact : summable_funrneg. + by rewrite ge0_esum// => x _; rewrite lee_fin. Qed. -End Sum_Sum. - (* -------------------------------------------------------------------- *) Section StdSum. Context {R : realType} (T : choiceType) (I : Type). diff --git a/theories/esum.v b/theories/esum.v index 27668e630c..96cc6400d1 100644 --- a/theories/esum.v +++ b/theories/esum.v @@ -20,7 +20,6 @@ From mathcomp Require Import topology sequences normedtype numfun. (* reals; it is 0 if I = set0 and sup(\sum_A a) where A *) (* is a finite set included in I o.w. *) (* summable D f := \esum_(x in D) `| f x | < +oo *) -(* sum f := esum [set: T] f^\+ - esum [set: T] f^\-. *) (* ``` *) (* *) (******************************************************************************) @@ -73,7 +72,7 @@ apply/seteqP; split=> [x [_ /= ->]|x]; first by rewrite fsbig_set0. by move=> -> /=; exists set0 => //; rewrite fsbig_set0. Qed. -Lemma ge0_pos_esum S a : (forall x, S x -> 0 <= a x) -> +Lemma ge0_pos_esum_funeneg S a : (forall x, S x -> 0 <= a x) -> \esum_(i in S) a^\- i = 0. Proof. move=> a0. @@ -87,149 +86,128 @@ exists set0; first exact: fsets_set0. by rewrite fsbig_set0. Qed. -End posesum. -End PosEsum. - -Section esum. -Variables (R : realFieldType) (T : choiceType). -Implicit Types (S : set T) (a g : T -> \bar R). - -Import PosEsum. - -Definition esum S a := (*pos_esum S a^\+ - pos_esum S a^\-*) pos_esum S a. - -Local Notation "\esum_ ( i 'in' P ) A" := (esum P (fun i => A)). - -Lemma ge0_esum S a : (forall x, S x -> 0 <= a x) -> - \esum_(i in S) a i = ereal_sup [set \sum_(x \in B) a x | B in fsets S]. +Lemma eq_pos_esum S f g : {in S, f =1 g} -> + \esum_(i in S) f i = \esum_(i in S) g i. Proof. -Abort. +move=> eq_fg; rewrite /pos_esum; congr ereal_sup. +apply/seteqP; split => [_/= [B SB <-]|_/= [B SB <-]]. +- exists B => //; apply: eq_fsbigr => i iB. + exact/esym/eq_fg/mem_set/SB.2/set_mem. +- exists B => //; apply: eq_fsbigr => i iB. + exact/eq_fg/mem_set/SB.2/set_mem. +Qed. -Lemma esum_set0 a : \esum_(i in set0) a i = 0. -Proof. by rewrite /esum pos_esum_set0. Qed. +Lemma ge0_pos_esum_funepos S a : (forall x, S x -> 0 <= a x) -> + \esum_(i in S) a^\+ i = \esum_(i in S) a i. +Proof. by move=> a0; apply: eq_pos_esum; exact: ge0_funeposE. Qed. -End esum. +Lemma pos_esum1 (D : set T) (a : T -> \bar R) : + (forall i, D i -> a i = 0) -> \esum_(i in D) a i = 0. +Proof. +move=> a0; rewrite /pos_esum (_ : [set _ | _ in _] = [set 0]) ?ereal_sup1//. +apply/seteqP; split=> x //= => [[X [finX XI]] <-|->]. + by rewrite fsbig1// => i /XI/a0. +by exists set0; rewrite ?fsbig_set0//; exact: fsets_set0. +Qed. -Notation "\esum_ ( i 'in' P ) F" := (esum P (fun i => F)) : ring_scope. +End posesum. +Arguments eq_pos_esum {R T} S f g. -Section esum_realType. +Section posesum_realType. Variables (R : realType) (T : choiceType). -Implicit Types (a : T -> \bar R). +Implicit Types (S : set T) (a g : T -> \bar R). -Lemma esum_ge0 (S : set T) a : +Local Notation "\esum_ ( i 'in' P ) A" := (pos_esum P (fun i => A)). + +Lemma pos_esum_ge0 (S : set T) a : (forall x, S x -> 0 <= a x) -> 0 <= \esum_(i in S) a i. Proof. -move=> a0; apply: ereal_sup_ubound. +move=> a0; rewrite /pos_esum ereal_sup_ubound//. by exists set0; [exact: fsets_set0|rewrite fsbig_set0]. Qed. -Lemma esum_fset (F : set T) a : finite_set F -> - (forall i, i \in F -> 0 <= a i) -> +Lemma pos_esum_fset (F : set T) a : finite_set F -> + (forall i, F i -> 0 <= a i) -> \esum_(i in F) a i = \sum_(i \in F) a i. Proof. move=> finF f0; apply/eqP; rewrite eq_le; apply/andP; split; last first. by apply: ereal_sup_ubound; exists F => //; exact: fsets_self. apply: ge_ereal_sup => /= ? -[F' [finF' F'F] <-]. apply/lee_fsum_nneg_subset => //; first exact/subsetP. -by move=> t; rewrite inE/= => /andP[_] /f0. +by move=> t; rewrite inE/= => /andP[_] /set_mem/f0. Qed. -Lemma esum_set1 t a : 0 <= a t -> \esum_(i in [set t]) a i = a t. +Lemma pos_esum_set1 t a : 0 <= a t -> \esum_(i in [set t]) a i = a t. Proof. -by move=> ?; rewrite esum_fset// ?fset_set1// ?fsbig_set1// => t' /[!inE] ->. +by move=> ?; rewrite pos_esum_fset// ?fset_set1// ?fsbig_set1// => t' ->. Qed. -Lemma esum_eq0P (A : set T) a : (forall i, A i -> 0 <= a i) -> - \esum_(x in A) a x = 0 -> - forall x, A x -> a x = 0. -Proof. -move=> a0 suma0 x Ax. -apply/eqP; rewrite eq_le a0//= -suma0 ereal_sup_ubound//=. -exists [set x]; first by split => // t ->. -by rewrite -esum_set1 ?a0// esum_fset// => i /[!inE] ->; exact: a0. -Qed. - -End esum_realType. - -Lemma esum1 [R : realFieldType] [I : choiceType] (D : set I) (a : I -> \bar R) : - (forall i, D i -> a i = 0) -> \esum_(i in D) a i = 0. -Proof. -move=> a0; rewrite /esum /PosEsum.pos_esum (_ : [set _ | _ in _] = [set 0]) ?ereal_sup1//. -apply/seteqP; split=> x //= => [[X [finX XI]] <-|->]. - by rewrite fsbig1// => i /XI/a0. -by exists set0; rewrite ?fsbig_set0//; exact: fsets_set0. -Qed. - -Lemma esum_ge [R : realType] [T : choiceType] (I : set T) (a : T -> \bar R) x : - (exists2 X : set T, fsets I X & x <= \sum_(i \in X) a i) -> +Lemma pos_esum_ge (T1 : choiceType) (I : set T1) (a : T1 -> \bar R) x : + (exists2 X : set T1, fsets I X & x <= \sum_(i \in X) a i) -> x <= \esum_(i in I) a i. Proof. by move=> [X IX /le_trans->//]; apply: ereal_sup_ubound; exists X. Qed. -Lemma le_esum [R : realType] [T : choiceType] (I : set T) (a b : T -> \bar R) : +Lemma le_pos_esum (I : set T) (a b : T -> \bar R) : (forall i, I i -> a i <= b i) -> \esum_(i in I) a i <= \esum_(i in I) b i. Proof. -move=> le_ab; rewrite ge_ereal_sup => //= _ [X [finX XI]] <-; rewrite esum_ge//. +move=> le_ab; rewrite ge_ereal_sup => //= _ [X [finX XI]] <-; rewrite pos_esum_ge//. by exists X => //; apply: lee_fsum => // t /XI /le_ab. Qed. -Lemma eq_esum [R : realType] [T : choiceType] (I : set T) (a b : T -> \bar R) : - (forall i, I i -> a i = b i) -> - \esum_(i in I) a i = \esum_(i in I) b i. -Proof. by move=> e; apply/eqP; rewrite eq_le !le_esum// => i Ii; rewrite e. Qed. - -Lemma esumZ [R : realType] [T : choiceType] (A : set T) (a : T -> \bar R) +Lemma pos_esumZ (A : set T) (a : T -> \bar R) (c : \bar R) : 0 <= c -> (forall t, A t -> 0 <= a t) -> \esum_(t in A) c * a t = c * \esum_(t in A) a t. Proof. rewrite le_eqVlt => /predU1P[<- _|c0 a0]. - by rewrite mul0e esum1// => ? _; rewrite mul0e. + by rewrite mul0e pos_esum1// => ? _; rewrite mul0e. apply/eqP; rewrite eq_le; apply/andP; split. - rewrite ge_ereal_sup//= => _ [X [finX XA]] <-. rewrite -ge0_mule_fsumr; first by move=> t /XA /a0. - by rewrite (lee_wpmul2l (ltW c0))// esum_ge//; exists X. + by rewrite (lee_wpmul2l (ltW c0))// pos_esum_ge//; exists X. - case: c c0 => [s s0|_|//]. + rewrite -lee_pdivlMl// ge_ereal_sup//= => _ [X [finX XI]] <-. rewrite lee_pdivlMl// ge0_mule_fsumr//; first by move=> t /XI /a0. - by rewrite esum_ge//; exists X. - + have : 0 <= \esum_(x in A) a x by apply: esum_ge0 => ? ?; exact: a0. + by rewrite pos_esum_ge//; exists X. + + have : 0 <= \esum_(x in A) a x by apply: pos_esum_ge0 => ? ?; exact: a0. rewrite [in X in X -> _]le_eqVlt => /predU1P[<-|suma0]. - + by rewrite mule0 esum_ge0// => ? ?; rewrite mule_ge0// a0. - + rewrite gt0_mulye//. + * by rewrite mule0 pos_esum_ge0// => ? ?; rewrite mule_ge0// a0. + * rewrite gt0_mulye//. have [y [B fsetsTB yE y0]] := ereal_sup_gt suma0. - rewrite leye_eq; apply/eqP/eq_infty => r; rewrite esum_ge//. + rewrite leye_eq; apply/eqP/eq_infty => r; rewrite pos_esum_ge//. exists B => //; rewrite -ge0_mule_fsumr//. by move=> i Bi; rewrite a0//; case: fsetsTB => _ /(_ _ Bi). by rewrite yE gt0_mulye// leey. Qed. -Lemma esumD [R : realType] [T : choiceType] (I : set T) (a b : T -> \bar R) : +Lemma pos_esumD (T1 : choiceType) (I : set T1) (a b : T1 -> \bar R) : (forall i, I i -> 0 <= a i) -> (forall i, I i -> 0 <= b i) -> \esum_(i in I) (a i + b i) = \esum_(i in I) a i + \esum_(i in I) b i. Proof. -move=> ag0 bg0; apply/eqP; rewrite eq_le; apply/andP; split. +move=> ag0 bg0. +apply/eqP; rewrite eq_le; apply/andP; split. rewrite ge_ereal_sup//= => x [X [finX XI]] <-; rewrite fsbig_split//=. by rewrite leeD// ereal_sup_ubound//=; exists X. wlog : a b ag0 bg0 / \esum_(i in I) a i \isn't a fin_num => [saoo|]; last first. move=> /fin_numPn[->|/[dup] aoo ->]; first by rewrite leNye. - rewrite (@le_trans _ _ +oo)//; first by rewrite /adde/=; case: esum. - rewrite leye_eq; apply/eqP/eq_infty => y; rewrite esum_ge//. + rewrite (@le_trans _ _ +oo)//; first by rewrite /adde/=; case: pos_esum. + rewrite leye_eq; apply/eqP/eq_infty => y; rewrite pos_esum_ge//. have : y%:E < \esum_(i in I) a i by rewrite aoo// ltry. move=> /ereal_sup_gt[_ [X [finX XI]] <-] /ltW yle; exists X => //=. rewrite (le_trans yle)// fsbig_split// leeDl// fsume_ge0// => // i. by move=> /XI; exact: bg0. case: (boolP (\esum_(i in I) a i \is a fin_num)) => sa; last exact: saoo. case: (boolP (\esum_(i in I) b i \is a fin_num)) => sb; last first. - by rewrite addeC (eq_esum (fun _ _ => addeC _ _)) saoo. + by rewrite addeC (eq_pos_esum _ _ _ (fun _ _ => addeC _ _)) saoo. rewrite -leeBrDr// ge_ereal_sup//= => _ [X [finX XI]] <-. have saX : \sum_(i \in X) a i \is a fin_num. apply: contraTT sa => /fin_numPn[] sa. suff : \sum_(i \in X) a i >= 0 by rewrite sa. by rewrite fsume_ge0// => i /XI/ag0. - apply/fin_numPn; right; apply/eqP; rewrite -leye_eq esum_ge//. + apply/fin_numPn; right; apply/eqP; rewrite -leye_eq pos_esum_ge//. by exists X; rewrite // sa. rewrite leeBrDr// addeC -leeBrDr// ge_ereal_sup//= => _ [Y [finY YI]] <-. -rewrite leeBrDr// addeC esum_ge//; exists (X `|` Y). +rewrite leeBrDr// addeC pos_esum_ge//; exists (X `|` Y). by split; [rewrite finite_setU|rewrite subUset]. rewrite fsbig_split ?finite_setU//= leeD// lee_fsum_nneg_subset ?finite_setU//=. - exact/subsetP/subsetUl. @@ -239,9 +217,9 @@ rewrite fsbig_split ?finite_setU//= leeD// lee_fsum_nneg_subset ?finite_setU//=. by move=> /andP[_] /[!inE] /XI/bg0. Qed. -Lemma esum_mkcond [R : realType] [T : choiceType] (I : set T) - (a : T -> \bar R) : - \esum_(i in I) a i = \esum_(i in [set: T]) if i \in I then a i else 0. +Lemma pos_esum_mkcond (T1 : choiceType) (I : set T1) + (a : T1 -> \bar R) : + \esum_(i in I) a i = \esum_(i in [set: T1]) if i \in I then a i else 0. Proof. apply/eqP; rewrite eq_le !ge_ereal_sup//= => _ [X [finX XI]] <-. rewrite ereal_sup_ubound//; exists X => //; apply: eq_fsbigr => x /[!inE] Xx. @@ -252,60 +230,33 @@ rewrite ereal_sup_ubound//=; exists [set` Y]. by rewrite fsbig_finite// set_fsetK. Qed. -Lemma esum_mkcondr [R : realType] [T : choiceType] (I J : set T) - (a : T -> \bar R) : - \esum_(i in I `&` J) a i = \esum_(i in I) if i \in J then a i else 0. -Proof. -rewrite esum_mkcond [RHS]esum_mkcond; apply: eq_esum=> i _. -by rewrite in_setI; case: (i \in I) (i \in J) => [] []. -Qed. - -Lemma esum_mkcondl [R : realType] [T : choiceType] (I J : set T) - (a : T -> \bar R) : - \esum_(i in I `&` J) a i = \esum_(i in J) if i \in I then a i else 0. -Proof. -rewrite esum_mkcond [RHS]esum_mkcond; apply: eq_esum=> i _. -by rewrite in_setI; case: (i \in I) (i \in J) => [] []. -Qed. - -Lemma esumID (R : realType) (I : choiceType) (B : set I) (A : set I) - (F : I -> \bar R) : - (forall i, A i -> F i >= 0) -> - \esum_(i in A) F i = (\esum_(i in A `&` B) F i) + - (\esum_(i in A `&` ~` B) F i). -Proof. -move=> F0; rewrite !esum_mkcondr -esumD; do ?by move=> i /F0; case: ifP. -by apply: eq_esum=> i; rewrite in_setC; case: ifP; rewrite /= (adde0, add0e). -Qed. -Arguments esumID {R I}. - -Lemma esum_sum [R : realType] [T1 T2 : choiceType] +Lemma pos_esum_sum [T1 T2 : choiceType] (I : set T1) (r : seq T2) (P : pred T2) (a : T1 -> T2 -> \bar R) : (forall i j, I i -> P j -> 0 <= a i j) -> \esum_(i in I) \sum_(j <- r | P j) a i j = \sum_(j <- r | P j) \esum_(i in I) a i j. Proof. move=> a_ge0; elim: r => [|j r IHr]; rewrite ?(big_nil, big_cons)// -?IHr. - by rewrite esum1// => i; rewrite big_nil. + by rewrite pos_esum1// => i; rewrite big_nil. case: ifPn => Pj; last first. - by apply: eq_esum => i Ii; rewrite big_cons (negPf Pj). + by apply: eq_pos_esum => i Ii; rewrite big_cons (negPf Pj). have aj_ge0 i : I i -> a i j >= 0 by move=> ?; apply: a_ge0. -rewrite -esumD//; first by move=> i Ii; apply: sume_ge0 => *; apply: a_ge0. -by apply: eq_esum => i Ii; rewrite big_cons Pj. +rewrite -pos_esumD//; first by move=> i Ii; apply: sume_ge0 => *; apply: a_ge0. +by apply: eq_pos_esum => i Ii; rewrite big_cons Pj. Qed. -Lemma esum_esum [R : realType] [T1 T2 : choiceType] +Lemma pos_esum_esum [T1 T2 : choiceType] (I : set T1) (J : T1 -> set T2) (a : T1 -> T2 -> \bar R) : (forall i j, I i -> J i j -> 0 <= a i j) -> \esum_(i in I) \esum_(j in J i) a i j = \esum_(k in I `*`` J) a k.1 k.2. Proof. move=> a_ge0; apply/eqP; rewrite eq_le; apply/andP; split. apply: ge_ereal_sup => /= _ [X [finX XI]] <-. - under eq_fsbigr do rewrite esum_mkcond. - rewrite fsbig_finite//= big_seq -esum_sum. + under eq_fsbigr do rewrite pos_esum_mkcond. + rewrite fsbig_finite//= big_seq -pos_esum_sum. move=> i j _ /[!in_fset_set]// /[!inE] /XI Ij. by case: ifPn => // /[!inE] /a_ge0-/(_ Ij). - under eq_esum do rewrite -big_seq -big_mkcond/=. + under eq_pos_esum do rewrite -big_seq -big_mkcond/=. apply: ge_ereal_sup => /= _ [Y [finY _] <-]; apply: ereal_sup_ubound => /=. set XYJ := [set z | z \in X `*` Y /\ z.2 \in J z.1]. have ? : finite_set XYJ. @@ -320,7 +271,7 @@ move=> a_ge0; apply/eqP; rewrite eq_le; apply/andP; split. by exists y => //; rewrite !inE mem_set// in_fset_set// mem_set. move=> [t1]; rewrite !inE andbT/= in_fset_set// inE => Xt1. by move=> [t2]; rewrite !inE in_fset_set /XYJ//= =>/andP[/[!inE] ? ?] [-> ->]. -apply: ge_ereal_sup => _ /= [X/= [finX XIJ]] <-; apply: esum_ge. +apply: ge_ereal_sup => _ /= [X/= [finX XIJ]] <-; apply: pos_esum_ge. exists X.`1; first by split=> [|x [y /XIJ[]//]]; exact: finite_set_fst. apply: (@le_trans _ _ (\sum_(i <- fset_set X.`1) \sum_(j <- fset_set X.`2 | j \in J i) a i j)). @@ -352,6 +303,249 @@ rewrite [in RHS]big_fset_condE/= fsbig_finite//; apply/eq_fbigl => j. by rewrite in_fset_set// !inE/= in_setI in_fset_set//; exact: finite_set_snd. Qed. +Lemma reindex_pos_esum (T1 T' : choiceType) + (P : set T1) (Q : set T') (e : T1 -> T') (a : T' -> \bar R) : + set_bij P Q e -> + \esum_(j in Q) a j = \esum_(i in P) a (e i). +Proof. +elim/choicePpointed: T1 => T1 in e P *. + rewrite !emptyE => /Pbij[{}e ->]. + by rewrite -[in LHS](image_eq e) image_set0 !pos_esum_set0. +elim/choicePpointed: T' => T' in a e Q *; first by have := no (e point). +move=> /(@pPbij _ _ _)[{}e ->]. +gen have le_esum : T1 T' a P Q e / + \esum_(j in Q) a j <= \esum_(i in P) a (e i); last first. + apply/eqP; rewrite eq_le le_esum//=. + rewrite [leRHS](_ : _ = \esum_(j in Q) a (e (e^-1%FUN j))). + by apply: eq_pos_esum => i Qi; rewrite invK. + by rewrite le_esum => //= i Qi; rewrite a_ge0//; exact: funS. +rewrite ge_ereal_sup => //= _ [X [finX XQ] <-]; rewrite ereal_sup_ubound => //=. +exists [set` (e^-1 @` (fset_set X))%fset]. + split=> [|t /= /imfsetP[t'/=]]; first exact: finite_fset. + by rewrite in_fset_set// inE => /XQ Qt' ->; exact: funS. +rewrite fsbig_finite//= set_fsetK big_imfset => //=. + move=> x y; rewrite !in_fset_set// !inE => /XQ ? /XQ ? /(congr1 e). + by rewrite !invK ?inE. +by rewrite -fsbig_finite//; apply: eq_fsbigr=> x /[!inE]/XQ ?; rewrite invK ?inE. +Qed. + +End posesum_realType. +Arguments reindex_pos_esum {R T1 T'} P Q e a. + +End PosEsum. + +Section esum. +Variables (R : realFieldType) (T : choiceType). +Implicit Types (S : set T) (a g : T -> \bar R). + +Import PosEsum. + +Definition esum S a := pos_esum S a^\+ - pos_esum S a^\-. + +Local Notation "\esum_ ( i 'in' P ) A" := (esum P (fun i => A)). + +Lemma ge0_esum S a : (forall x, S x -> 0 <= a x) -> + \esum_(i in S) a i = ereal_sup [set \sum_(x \in B) a x | B in fsets S]. +Proof. +by move=> a0; rewrite /esum ge0_pos_esum_funepos// ge0_pos_esum_funeneg// sube0. +Qed. + +Lemma esum_set0 a : \esum_(i in set0) a i = 0. +Proof. by rewrite /esum !pos_esum_set0 subee. Qed. + +Lemma esumN A f : (forall x, A x -> 0 <= f x) -> + \esum_(x in A) - f x = - \esum_(i in A) f i. +Proof. +move=> f0. +rewrite [in RHS]ge0_esum// [LHS]/esum [X in X - _ = _]PosEsum.pos_esum1 ?add0r. + by move=> t /mem_set At; rewrite funeposN (@ge0_funenegE _ _ A). +rewrite /PosEsum.pos_esum; congr (- ereal_sup _). +apply: eq_imagel => B AB; apply: eq_fsbigr => x xB. +rewrite funenegN (@ge0_funeposE _ _ B)// => y By; apply: f0. +by case: AB => _; exact. +Qed. + +End esum. + +Notation "\esum_ ( i 'in' P ) F" := (esum P (fun i => F)) : ring_scope. + +Section esum_realType. +Variables (R : realType) (T : choiceType). +Implicit Types (a : T -> \bar R). + +Lemma le_esum (A : set T) (f g : T -> \bar R) : (forall x, A x -> 0 <= f x) -> + (forall x, A x -> f x <= g x) -> + \esum_(x in A) f x <= \esum_(x in A) g x. +Proof. +move=> f0 leS. +have g0 x : A x -> 0 <= g x. + by move=> /[dup] Ax /leS; apply: le_trans; exact: f0 Ax. +by rewrite !ge0_esum// PosEsum.le_pos_esum. +Qed. + +Lemma esum_ge0 (S : set T) a : + (forall x, S x -> 0 <= a x) -> 0 <= \esum_(i in S) a i. +Proof. by move=> a0; rewrite ge0_esum// PosEsum.pos_esum_ge0. Qed. + +Lemma esum_fset (F : set T) a : finite_set F -> + (forall i, F i -> 0 <= a i) -> + \esum_(i in F) a i = \sum_(i \in F) a i. +Proof. +by move=> finF f0; rewrite ge0_esum//; exact: PosEsum.pos_esum_fset. +Qed. + +Lemma esum_set1 t a : 0 <= a t -> \esum_(i in [set t]) a i = a t. +Proof. +move=> ?; rewrite ge0_esum. + by move=> x ->. +exact: PosEsum.pos_esum_set1. +Qed. + +Lemma esum_eq0P (A : set T) a : (forall i, A i -> 0 <= a i) -> + \esum_(x in A) a x = 0 -> + forall x, A x -> a x = 0. +Proof. +move=> a0; rewrite ge0_esum// => suma0 x Ax. +apply/eqP; rewrite eq_le a0//= -suma0 ereal_sup_ubound//=. +exists [set x]; first by split => // t ->. +by rewrite -esum_set1 ?a0// esum_fset// => i ->; exact: a0. +Qed. + +End esum_realType. + +Lemma esum1 {R : realFieldType} {I : choiceType} (D : set I) (a : I -> \bar R) : + (forall i, D i -> a i = 0) -> \esum_(i in D) a i = 0. +Proof. +move=> a0; rewrite ge0_esum; last exact: PosEsum.pos_esum1. +by move=> i /a0 ->. +Qed. + +Lemma eq_esum {R : realFieldType} {T : choiceType} (I : set T) + (a b : T -> \bar R) : (forall i, I i -> a i = b i) -> + \esum_(i in I) a i = \esum_(i in I) b i. +Proof. +move=> e; congr (_ - _). +- by apply: PosEsum.eq_pos_esum => i /set_mem/e abi; rewrite !funeposE abi. +- by apply: PosEsum.eq_pos_esum => i /set_mem/e abi; rewrite !funenegE abi. +Qed. +Arguments eq_esum {R T} I a b. + +Section esumZ. +Context {R : realType} {T : choiceType}. + +Let ge0_esumZ (A : set T) (a : T -> \bar R) + (c : \bar R) : 0 <= c -> (forall t, A t -> 0 <= a t) -> + \esum_(t in A) c * a t = c * \esum_(t in A) a t. +Proof. +rewrite le_eqVlt => /predU1P[<- _|c0 a0]. + by rewrite mul0e esum1// => ? _; rewrite mul0e. +rewrite ge0_esum. + by move=> x /a0 ax0; rewrite mule_ge0// ltW. +rewrite ge0_esum//. +by apply: PosEsum.pos_esumZ => //; exact: ltW. +Qed. + +Lemma esumZ (A : set T) (f : T -> \bar R) c : (forall x, A x -> 0 <= f x) -> + \esum_(x in A) c * f x = c * \esum_(x in A) f x. +Proof. +move=> h. +rewrite (eq_esum _ _ (fun x => esg c * (`|c| * f x))). + by move=> x; rewrite muleA -numEesg. +transitivity (esg c * \esum_(x in A) `|c| * f x). +- have [hc|hc|->] := comparable_ltgtP (comparableT c 0). + + rewrite {1}lte0_abs// gte0_esg// (eq_esum _ _ (fun x => - (- c * f x))). + by move => ?; rewrite mulN1e. + rewrite mulN1e -esumN; last by rewrite lte0_abs. + by move=> ? ?; rewrite mule_ge0//; exact: h. + + rewrite gte0_abs// lte0_esg// mul1e (eq_esum _ _ (fun x => c * f x))//. + by move=> ?; rewrite mul1e. + + under eq_esum do rewrite esg0 mul0e. + by rewrite esg0 mul0e esum1. +- by rewrite (eq_esum _ _ (fun x => `|c| * f x))// ge0_esumZ// muleA -numEesg. +Qed. + +End esumZ. + +Lemma esumD [R : realType] [T : choiceType] (I : set T) (a b : T -> \bar R) : + (forall i, I i -> 0 <= a i) -> (forall i, I i -> 0 <= b i) -> + \esum_(i in I) (a i + b i) = \esum_(i in I) a i + \esum_(i in I) b i. +Proof. +move=> ag0 bg0. +rewrite ge0_esum//. + by move=> x Ix; rewrite adde_ge0 ?ag0 ?bg0//. +by do 2 rewrite ge0_esum//; exact: PosEsum.pos_esumD. +Qed. + +Lemma esum_mkcond [R : realType] [T : choiceType] (I : set T) + (a : T -> \bar R) : + \esum_(i in I) a i = \esum_(i in [set: T]) if i \in I then a i else 0. +Proof. +rewrite /esum; congr (_ - _); rewrite PosEsum.pos_esum_mkcond; + congr PosEsum.pos_esum; apply/funext => x/=. +- by rewrite (funepos_restrict I a). +- by rewrite (funeneg_restrict I a). +Qed. + +Lemma esum_mkcondr [R : realType] [T : choiceType] (I J : set T) + (a : T -> \bar R) : + \esum_(i in I `&` J) a i = \esum_(i in I) if i \in J then a i else 0. +Proof. +rewrite esum_mkcond [RHS]esum_mkcond; apply: eq_esum=> i _. +by rewrite in_setI; case: (i \in I) (i \in J) => [] []. +Qed. + +Lemma esum_mkcondl [R : realType] [T : choiceType] (I J : set T) + (a : T -> \bar R) : + \esum_(i in I `&` J) a i = \esum_(i in J) if i \in I then a i else 0. +Proof. +rewrite esum_mkcond [RHS]esum_mkcond; apply: eq_esum=> i _. +by rewrite in_setI; case: (i \in I) (i \in J) => [] []. +Qed. + +Lemma esumID (R : realType) (I : choiceType) (B : set I) (A : set I) + (F : I -> \bar R) : + (forall i, A i -> F i >= 0) -> + \esum_(i in A) F i = (\esum_(i in A `&` B) F i) + + (\esum_(i in A `&` ~` B) F i). +Proof. +move=> F0; rewrite !esum_mkcondr -esumD; do ?by move=> i /F0; case: ifP. +by apply: eq_esum=> i; rewrite in_setC; case: ifP; rewrite /= (adde0, add0e). +Qed. +Arguments esumID {R I}. + +Lemma exchange_esum_sum [R : realType] [T1 T2 : choiceType] + (I : set T1) (r : seq T2) (P : pred T2) (a : T1 -> T2 -> \bar R) : + (forall i j, I i -> P j -> 0 <= a i j) -> + \esum_(i in I) \sum_(j <- r | P j) a i j = + \sum_(j <- r | P j) \esum_(i in I) a i j. +Proof. +move=> a_ge0. +rewrite ge0_esum. + by move=> x Ix; apply: sume_ge0 => t /a_ge0; exact. +rewrite [LHS]PosEsum.pos_esum_sum//. +apply: eq_bigr => t Pt. +by rewrite ge0_esum// => x /a_ge0; exact. +Qed. +#[deprecated(since="mathcomp-analysis 1.17.0", note="renamed to `exchange_esum_sum`")] +Notation esum_sum := exchange_esum_sum (only parsing). + +Lemma esum_esum [R : realType] [T1 T2 : choiceType] + (I : set T1) (J : T1 -> set T2) (a : T1 -> T2 -> \bar R) : + (forall i j, I i -> J i j -> 0 <= a i j) -> + \esum_(i in I) \esum_(j in J i) a i j = \esum_(k in I `*`` J) a k.1 k.2. +Proof. +move=> a_ge0. +rewrite [RHS]ge0_esum/=. + move=> [x y]/= [Ix Jxy]. + exact: a_ge0. +rewrite -[RHS]PosEsum.pos_esum_esum//. +rewrite ge0_esum. + move=> x Ix. + by rewrite esum_ge0// => t /a_ge0; exact. +apply: PosEsum.eq_pos_esum => x Ix. +by rewrite ge0_esum// => t /a_ge0; apply; exact/set_mem. +Qed. + Lemma lee_sum_fset_nat (R : realDomainType) (f : (\bar R)^nat) (F : {fset nat}) n (P : pred nat) : (forall i, P i -> 0%E <= f i) -> @@ -386,7 +580,9 @@ Lemma nneseries_esum (R : realType) (a : nat -> \bar R) (P : pred nat) : (forall n, P n -> 0 <= a n) -> \sum_(i a0; apply/eqP; rewrite eq_le; apply/andP; split. +move=> a0. +rewrite ge0_esum//. +apply/eqP; rewrite eq_le; apply/andP; split. apply: (lime_le (is_cvg_nneseries_cond (fun n _ => a0 n))); apply: nearW => n. apply: ereal_sup_ubound; exists [set` [fset val i | i in 'I_n & P i]%fset]. split; first exact: finite_fset. @@ -408,25 +604,16 @@ Lemma reindex_esum (R : realType) (T T' : choiceType) set_bij P Q e -> \esum_(j in Q) a j = \esum_(i in P) a (e i). Proof. -elim/choicePpointed: T => T in e P *. - rewrite !emptyE => /Pbij[{}e ->]. - by rewrite -[in LHS](image_eq e) image_set0 !esum_set0. -elim/choicePpointed: T' => T' in a e Q *; first by have := no (e point). -move=> /(@pPbij _ _ _)[{}e ->]. -gen have le_esum : T T' a P Q e / - \esum_(j in Q) a j <= \esum_(i in P) a (e i); last first. - apply/eqP; rewrite eq_le le_esum//=. - rewrite [leRHS](_ : _ = \esum_(j in Q) a (e (e^-1%FUN j))). - by apply: eq_esum => i Qi; rewrite invK ?inE. - by rewrite le_esum => //= i Qi; rewrite a_ge0//; exact: funS. -rewrite ge_ereal_sup => //= _ [X [finX XQ] <-]; rewrite ereal_sup_ubound => //=. -exists [set` (e^-1 @` (fset_set X))%fset]. - split=> [|t /= /imfsetP[t'/=]]; first exact: finite_fset. - by rewrite in_fset_set// inE => /XQ Qt' ->; exact: funS. -rewrite fsbig_finite//= set_fsetK big_imfset => //=. - move=> x y; rewrite !in_fset_set// !inE => /XQ ? /XQ ? /(congr1 e). - by rewrite !invK ?inE. -by rewrite -fsbig_finite//; apply: eq_fsbigr=> x /[!inE]/XQ ?; rewrite invK ?inE. +move=> PQe. +rewrite /esum; congr (_ - _). + rewrite (PosEsum.reindex_pos_esum P Q e)//. + congr PosEsum.pos_esum. + apply/funext => i. + by rewrite !funeposE. +rewrite (PosEsum.reindex_pos_esum P Q e)//. +congr PosEsum.pos_esum. +apply/funext => i. +by rewrite !funenegE. Qed. Arguments reindex_esum {R T T'} P Q e a. @@ -581,7 +768,10 @@ Qed. Lemma summableD D f g : summable D f -> summable D g -> summable D (f \+ g). Proof. move=> Df Dg; apply: le_lt_trans (lte_add_pinfty Df Dg). -by rewrite -esumD//; apply le_esum => t Dt; exact: lee_abs_add. +rewrite -esumD//. +do 2 rewrite ge0_esum//. + by move=> x Dx; rewrite adde_ge0. +by apply: PosEsum.le_pos_esum => t Dt; exact: lee_abs_add. Qed. Lemma summableN D f : summable D f = summable D (\- f). @@ -594,13 +784,17 @@ Proof. by move=> Df; rewrite summableN; exact: summableD. Qed. Lemma summable_funepos D f : summable D f -> summable D f^\+. Proof. -apply: le_lt_trans; apply: le_esum => t Dt. +apply: le_lt_trans. +do 2 rewrite ge0_esum//. +apply: PosEsum.le_pos_esum => t Dt. by rewrite -/((abse \o f) t) -funeposDneg gee0_abs// leeDl. Qed. Lemma summable_funeneg D f : summable D f -> summable D f^\-. Proof. -apply: le_lt_trans; apply: le_esum => t Dt. +apply: le_lt_trans. +do 2 rewrite ge0_esum//. +apply: PosEsum.le_pos_esum => t Dt. by rewrite -/((abse \o f) t) -funeposDneg gee0_abs// leeDr. Qed. @@ -635,7 +829,8 @@ rewrite summable_fine_sum// -lee_fin fineK//. rewrite fineK//. rewrite nneseries_esum// fin_numElt; apply/andP; split. by rewrite (@lt_le_trans _ _ 0)// ?lte_ninfty//; exact: esum_ge0. - by apply: le_lt_trans Pf; apply le_esum. + apply: le_lt_trans Pf => /=. + by rewrite ge0_esum. apply: le_trans (nneseries_lim_ge n _) => //; apply: lee_sum => i _. by rewrite lee_abs. Qed. @@ -731,18 +926,17 @@ have /eqP : esum D (f \- g)^\+ + esum_posneg D g = by rewrite -addeA addeCA addeA subeK// fin_num_abs (summable_pinfty Df). rewrite [X in _ == X -> _]addeC -sube_eq. - rewrite fin_numD; apply/andP; split. - rewrite (@eq_esum _ _ _ _ (abse \o (f \- g)^\+))//. + rewrite (eq_esum _ _ (abse \o (f \- g)^\+))//. by move=> t Dt; rewrite /= gee0_abs. by rewrite -summableE; exact/summable_funepos/summableB. - move: Dg; rewrite summableE (@eq_esum _ _ _ _ g)//. + move: Dg; rewrite summableE (eq_esum _ _ g)//. by move=> t Tt; rewrite gee0_abs// g0. by rewrite ge0_esum_posneg// => t Tt; rewrite gee0_abs// g0. - rewrite fin_num_adde_defr// ge0_esum_posneg//. - rewrite (@eq_esum _ _ _ _ (abse \o f))// -?summableE// => i Di. + rewrite (eq_esum _ _ (abse \o f))// -?summableE// => i Di. by rewrite /= gee0_abs// f0. rewrite -addeA addeCA eq_sym [X in _ == X -> _]addeC -sube_eq. -- rewrite ge0_esum_posneg//. - rewrite (@eq_esum _ _ _ _ (abse \o f))// -?summableE// => i Di. +- rewrite ge0_esum_posneg// (eq_esum _ _ (abse \o f))// -?summableE// => i Di. by rewrite /= gee0_abs// f0. - rewrite fin_num_adde_defl// ge0_esum_posneg//. rewrite (@eq_esum _ _ _ _ (abse \o g))// -?summableE// => i Di. @@ -752,153 +946,77 @@ Qed. End esumB. -Definition sum {R : realType} {T : choiceType} (f : T -> \bar R) : \bar R := - esum [set: T] f^\+ - esum [set: T] f^\-. - -Section SumTheory. +Section summable_esum. Context {R : realType} {T : choiceType}. -Implicit Types f g : T -> \bar R. - -Lemma sum0 : @sum R _ (@cst T _ 0) = 0. -Proof. -by rewrite /sum !esum1 ?subee// => r _; - rewrite ?[LHS](funepos_cst0,funeneg_cst0). -Qed. - -Lemma eq_sum f g : f =1 g -> sum f = sum g. -Proof. -move=> eq_fg; rewrite /sum; congr (_ - _). -by apply: eq_esum => t _; rewrite !funeposE eq_fg. -by apply: eq_esum => t _; rewrite !funenegE eq_fg. -Qed. - -Section SumTheoryP. - -Lemma ge0_sum f : (forall x, 0 <= f x) -> sum f = \esum_(i in [set: T]) f i. -Proof. -move=> ge0_S; rewrite /sum (@esum1 R T [set: T] f^\-) ?sube0. - by move=> x ?; rewrite (@ge0_funenegE _ _ setT)// in_setE. -under eq_esum. - move=> ? _; rewrite (@ge0_funeposE _ _ setT) ?in_setT//. - over. -by []. -Qed. - -Lemma sum_ge0 f : (forall x, 0 <= f x) -> 0 <= sum f. -Proof. by move=> ge0_S; rewrite ge0_sum// esum_ge0. Qed. +Implicit Types (A : set T) (f g : T -> \bar R). -Lemma le_sum f g : (forall x, 0 <= f x) -> (forall x, f x <= g x) -> - sum f <= sum g. +Lemma summable_le_esum A f g : summable A g -> + (forall x, A x -> f x <= g x) -> \esum_(x in A) f x <= \esum_(x in A) g x. Proof. -move=> f0 leS. -have g0 x : 0 <= g x by rewrite (le_trans _ (leS _)). -rewrite /sum leeB//. -- by apply: le_esum => t _; rewrite !(@ge0_funeposE _ _ setT) ?in_setT. -- by apply: le_esum => t _; rewrite !(@ge0_funenegE _ _ setT) ?in_setT. -Qed. - -Lemma sumN f : (forall x, 0 <= f x) -> sum (\- f ) = - sum f. -Proof. -move=> f0; rewrite /sum [X in X - _ = _]esum1 ?add0r. - by move=> t _; rewrite funeposN (@ge0_funenegE _ _ setT) ?in_setT//. -rewrite [X in _ = - (_ - X)]esum1 ?sube0. - by move=> t _; rewrite (@ge0_funenegE _ _ setT) ?in_setT//. -by under eq_esum do rewrite funenegN. -Qed. - -Lemma sumZ f c : (forall x, 0 <= f x) -> sum (fun x => c * f x) = c * sum f. -Proof. -move=> h. -rewrite (@eq_sum _ (fun x => esg c * (`|c| * f x))). - by move=> x; rewrite muleA -numEesg. -transitivity (esg c * sum (fun x => `|c| * f x)). -- have [hc|hc|->] := comparable_ltgtP (comparableT c 0). - + rewrite {1}lte0_abs// gte0_esg// (@eq_sum _ (fun x => - (- c * f x))). - by move => ?; rewrite mulN1e. - rewrite mulN1e -sumN; last by rewrite lte0_abs. - by move=> ?; rewrite mule_ge0. - + rewrite gte0_abs// lte0_esg// mul1e (@eq_sum _ (fun x => c * f x))//. - by move=> ?; rewrite mul1e. - + under eq_sum do rewrite esg0 mul0e. - by rewrite esg0 mul0e sum0. -- rewrite {1}/sum (@eq_esum _ _ _ _ (fun x => `|c| * f x))//. - move=> ? _; rewrite (@ge0_funeposE _ _ setT) ?in_setT// => x. - by rewrite mule_ge0. - rewrite (@eq_esum _ _ _ (_^\-) (@cst T _ 0)). - move => ? _; rewrite (@ge0_funenegE _ _ setT) ?in_setT// => x. - by rewrite mule_ge0. - by rewrite (@esum1 _ _ _ (cst 0))// sube0 esumZ// muleA -numEesg ge0_sum. -Qed. - -End SumTheoryP. - -Section SumTheoryS. - -Lemma summable_le_sum f g : summable [set : T] g -> - (forall x, f x <= g x) -> sum f <= sum g. -Proof. -move=> sg leS; rewrite /sum leeB//. - by apply: le_esum => ? ?; apply: (@funepos_le _ _ setT) => //; rewrite inE. -apply le_esum => t _. -rewrite -!funeposN. -by apply: (@funepos_le _ _ setT); rewrite ?inE// => ? ?; rewrite leeN2. +move=> sg leS; rewrite leeB//. + apply: PosEsum.le_pos_esum => ? ?. + apply: (@funepos_le _ _ A); last exact/mem_set. + by move=> x /set_mem/leS. +apply: PosEsum.le_pos_esum => t At. +rewrite -!funeposN (@funepos_le _ _ A)//; last exact/mem_set. +by move=> x /set_mem/leS; rewrite leeN2. Qed. Lemma summable_esum_funepos A f : summable A f -> \esum_(t in A) f^\+ t \is a fin_num. Proof. move=> /summable_funepos. -rewrite summableE (@eq_esum _ _ _ (fun y => f^\+ y) (fun y => `|f^\+ y|))//=. +rewrite summableE (eq_esum _ (funepos f) (fun y => `|f^\+ y|))//=. by move => ? ?; rewrite gee0_abs. Qed. -Lemma summable_sumN f : summable [set: T] f -> sum (\- f) = - sum f. +Lemma summable_esumN A f : summable A f -> + \esum_(x in A) - f x = - \esum_(x in A) f x. Proof. move=> sf. -rewrite /sum funenegN funeposN addeC oppeB //= adde_defC fin_num_adde_defl//. -exact: summable_esum_funepos. +rewrite /esum funenegN funeposN addeC oppeB //= adde_defC fin_num_adde_defl//. +have := summable_esum_funepos sf. +by rewrite ge0_esum. Qed. -Lemma summableZ c f : `|c| \is a fin_num -> - summable [set: T] f -> - summable [set: T] (fun x => `|c| * f x). +Lemma summableZ A c f : `|c| \is a fin_num -> + summable A f -> summable A (fun x => `|c| * f x). Proof. rewrite /summable => cfin Soo. -rewrite (@eq_esum _ _ _ _ (fun x => `|c| * `|f x|)). +rewrite (eq_esum _ _ (fun x => `|c| * `|f x|)). by move=> t ?; rewrite abseM abse_id. by rewrite esumZ// lte_mul_pinfty. Qed. -Lemma summable_sumZ f c : `|c| \is a fin_num -> - summable [set : T] f -> - sum (fun x => c * f x) = c * sum f. +Lemma summable_esumZ A f c : `|c| \is a fin_num -> summable A f -> + \esum_(x in A) c * f x = c * \esum_(x in A) f x. Proof. move=> c_fin_num sf. -rewrite (@eq_sum _ (fun x => esg c * (`|c| * f x))). +rewrite (eq_esum _ _ (fun x => esg c * (`|c| * f x))). by move=> x; rewrite muleA -numEesg. -transitivity (esg c * sum (fun x => `|c| * f x)). +transitivity (esg c * \esum_(x in A) `|c| * f x). - have [hc|hc|->] := comparable_ltgtP (comparableT c 0). - + rewrite {1}lte0_abs// gte0_esg// (@eq_sum _ (fun x => - (- c * f x))). + + rewrite {1}lte0_abs// gte0_esg// (eq_esum _ _ (fun x => - (- c * f x))). by move => ?; rewrite mulN1e. - rewrite mulN1e -summable_sumN; last by rewrite lte0_abs. + rewrite mulN1e -summable_esumN; last by rewrite lte0_abs. exact: summableZ. - + rewrite gte0_abs// lte0_esg// mul1e (@eq_sum _ (fun x => c * f x))//. + + rewrite gte0_abs// lte0_esg// mul1e (eq_esum _ _ (fun x => c * f x))//. by move=> ?; rewrite mul1e. - + under eq_sum do rewrite esg0 mul0e. - by rewrite esg0 mul0e sum0. -- rewrite {1}/sum. - rewrite (@eq_esum _ _ _ _ (fun x => `|c| * f^\+ x)). + + under eq_esum do rewrite esg0 mul0e. + by rewrite esg0 mul0e esum1. +- rewrite {1}/esum. + rewrite (PosEsum.eq_pos_esum _ _ (fun x => `|c| * f^\+ x)). by move=> i _ //=; rewrite -(@fineK _ `|c|) // ge0_funeposM. - rewrite (@eq_esum _ _ _ (fun x => `|c| * f x)^\- (fun x => `|c| * f^\- x)). + rewrite (PosEsum.eq_pos_esum _ (fun x => `|c| * f x)^\- (fun x => `|c| * f^\- x)). by move=> t _ //=; rewrite -(@fineK _ `|c|) // ge0_funenegM. - rewrite !esumZ// -muleBr//=. - by rewrite adde_defC fin_num_adde_defl// summable_esum_funepos. + rewrite !PosEsum.pos_esumZ// -muleBr//=. + rewrite adde_defC fin_num_adde_defl//. + have := summable_esum_funepos sf. + by rewrite ge0_esum. by rewrite muleA -numEesg. Qed. -End SumTheoryS. - -End SumTheory. +End summable_esum. Section exchange_esum_ereal_sup. Context {R : realType} {T : choiceType} {f : T -> nat -> \bar R}. @@ -909,12 +1027,16 @@ Lemma exchange_esum_ereal_sup (A : set T) : \esum_(i in A) ereal_sup (range (f i)) = ereal_sup (range (fun n => \esum_(x in A) f x n)). Proof. -rewrite /esum /PosEsum.pos_esum. +rewrite ge0_esum. + move=> x Ax. + apply: le_ereal_sup_tmp. + by exists (f x 0). under eq_imagel. move=> B [fin BA]; rewrite fsbig_finite//= ereal_sup_sum//. over. rewrite exchange_ereal_sup; congr ereal_sup. -apply: eq_imagel => n _; congr ereal_sup. +apply: eq_imagel => n _. +rewrite ge0_esum//; congr ereal_sup. by apply: eq_imagel => B [finB BA]; rewrite fsbig_finite. Qed. diff --git a/theories/lebesgue_integral_theory/lebesgue_integrable.v b/theories/lebesgue_integral_theory/lebesgue_integrable.v index 0c67532994..ca929f029f 100644 --- a/theories/lebesgue_integral_theory/lebesgue_integrable.v +++ b/theories/lebesgue_integral_theory/lebesgue_integrable.v @@ -984,7 +984,8 @@ rewrite -esumB//. rewrite -summable_eseries_esum. apply: (@le_lt_trans _ _ (\esum_(i in (fun=> true)) `|(fine (\int[m_ i]_(x in D) f x))%:E|)). - by apply: le_esum => k _; rewrite -EFinB -fineB// -?integralE//; + do 2 rewrite ge0_esum//. + by apply: PosEsum.le_pos_esum => k _; rewrite -EFinB -fineB// -?integralE//; [exact: integrable_pos_fin_num|exact: integrable_neg_fin_num]. rewrite -nneseries_esum; first by []. apply: (@le_lt_trans _ _ diff --git a/theories/lebesgue_measure.v b/theories/lebesgue_measure.v index 327961a2ff..d0d190324e 100644 --- a/theories/lebesgue_measure.v +++ b/theories/lebesgue_measure.v @@ -306,8 +306,9 @@ move=> /(_ _ _ _)/Box[]//=; apply: le_le_trans. rewrite hlength_itv ?lte_fin -?EFinD/= -addrA -opprD. by case: ltP => //; rewrite lee_fin subr_le0. rewrite nneseries_esum//; first by move=> *; rewrite adde_ge0//= ?lee_fin. -rewrite esum_ge//; exists [set` X] => //; rewrite fsbig_finite// ?set_fsetK//=. -rewrite fsbig_finite//= set_fsetK//. +rewrite ge0_esum/=; first by move=> n _; rewrite adde_ge0. +rewrite PosEsum.pos_esum_ge//; exists [set` X] => //. +rewrite fsbig_finite// ?set_fsetK//= fsbig_finite//= set_fsetK//. rewrite lee_sum // => i _; rewrite ?AE// !hlength_itv/= ?lte_fin -?EFinD/=. do !case: ifPn => //= ?; do ?by rewrite ?adde_ge0 ?lee_fin// ?subr_ge0// ?ltW. by rewrite addrAC. diff --git a/theories/lebesgue_stieltjes_measure.v b/theories/lebesgue_stieltjes_measure.v index cd14543440..725eb070a6 100644 --- a/theories/lebesgue_stieltjes_measure.v +++ b/theories/lebesgue_stieltjes_measure.v @@ -473,7 +473,8 @@ apply: (@le_trans _ _ (\sum_(i <- X) (wlength f `](b i).1, (b i).2]%classic) + rewrite addeC -big_split/=; apply: lee_sum => k _. by rewrite !(EFinB, wlength_itv_bnd)// addeA subeK. rewrite -big_split/= nneseries_esum//; first by move=> k _; rewrite adde_ge0. -rewrite esum_ge//; exists [set` X] => //; rewrite fsbig_finite//= set_fsetK. +rewrite ge0_esum/=; first by move=> n _; rewrite adde_ge0. +rewrite PosEsum.pos_esum_ge//; exists [set` X] => //; rewrite fsbig_finite//= set_fsetK. rewrite big_seq [in X in (_ <= X)%E]big_seq; apply: lee_sum => k kX. by rewrite AE leeD2l// lee_fin lerBlDl natrX De. Qed. diff --git a/theories/measure_theory/dirac_measure.v b/theories/measure_theory/dirac_measure.v index d2e8cea15a..1db2fac757 100644 --- a/theories/measure_theory/dirac_measure.v +++ b/theories/measure_theory/dirac_measure.v @@ -102,7 +102,7 @@ Lemma infinite_card_dirac (A : set T) : infinite_set A -> Proof. move=> infA; apply/eqyP => r r0. have [B BA Br] := infinite_set_fset (Num.truncn r).+1 infA. -apply: esum_ge; exists [set` B] => //. +rewrite ge0_esum//; apply: PosEsum.pos_esum_ge; exists [set` B] => //. apply: (@le_trans _ _ (Num.truncn r).+1%:R%:E). by rewrite lee_fin ltW// truncnS_gt. move: Br; rewrite -(@ler_nat R) -lee_fin => /le_trans; apply. diff --git a/theories/measure_theory/measure_extension.v b/theories/measure_theory/measure_extension.v index 7f1bd77611..018f27c0e8 100644 --- a/theories/measure_theory/measure_extension.v +++ b/theories/measure_theory/measure_extension.v @@ -623,7 +623,7 @@ pose g i := (f^-1%FUN i).2; exists g; first split. rewrite !nneseries_esumT//= /measure. transitivity (\esum_(i in setT) \sum_(X0 \in decomp (F i)) mu X0); last first. by apply: eq_esum => /= k _; rewrite fsbig_finite//; exact: decomp_finite_set. -rewrite -(eq_esum (fun _ _ => esum_fset _ _))//. +rewrite -(eq_esum _ _ _ (fun _ _ => esum_fset _ _))//. by move=> ? _; exact: decomp_finite_set. rewrite esum_esum//= (reindex_esum K setT f) => //=. by apply: eq_esum => i Ki; rewrite /g funK ?inE. diff --git a/theories/measure_theory/measure_function.v b/theories/measure_theory/measure_function.v index d8a4ac0721..b13178ec5c 100644 --- a/theories/measure_theory/measure_function.v +++ b/theories/measure_theory/measure_function.v @@ -1206,7 +1206,11 @@ rewrite esum_bigcup//. move=> /(decomp_neq0 DUBiN0) [y Yy]. apply: (@trivIset_seqDU _ B) => //; exists y. by split => //; [exact: YBi|exact: YBj]. -rewrite nneseries_esumT// le_esum// => i _. +rewrite nneseries_esumT//. +rewrite ge0_esum/=. + by move=> i _; exact: esum_ge0. +rewrite ge0_esum//. +apply: PosEsum.le_pos_esum => // i _. rewrite [leLHS](_ : _ = \sum_(j \in decomp (seqDU B i)) mu j). by rewrite esum_fset//; exact: decomp_finite_set. rewrite -SetRing.Rmu_fin_bigcup//=. diff --git a/theories/probability_theory/bernoulli_distribution.v b/theories/probability_theory/bernoulli_distribution.v index a13264227b..4d6ec3844f 100644 --- a/theories/probability_theory/bernoulli_distribution.v +++ b/theories/probability_theory/bernoulli_distribution.v @@ -136,7 +136,7 @@ apply/funext => U; rewrite /bernoulli_prob; case: ifPn => [p01|]; last first. rewrite measure_addE/= /mscale/=. have := @subsetT _ U; rewrite setT_bool => UT. have [->|->|->|->] /= := subset_set2 UT. -- rewrite -esum_fset//=; first by move=> b; rewrite lee_fin bernoulli_pmf_ge0. +- rewrite -esum_fset//=. by rewrite esum_set0 2!measure0 2!mule0 adde0. - rewrite -esum_fset//=; first by move=> b; rewrite lee_fin bernoulli_pmf_ge0. rewrite esum_set1/= ?lee_fin// 2!diracE mem_set//= memNset//= mule0 adde0. From 8addcbddc1b13aca53dc06472cfa9a9d966cf3eb Mon Sep 17 00:00:00 2001 From: Reynald Affeldt Date: Fri, 12 Jun 2026 00:02:59 +0900 Subject: [PATCH 17/21] restore esum_unit --- CHANGELOG_UNRELEASED.md | 4 ++ theories/esum.v | 120 +++++++++++++++++++++++++--------------- 2 files changed, 80 insertions(+), 44 deletions(-) diff --git a/CHANGELOG_UNRELEASED.md b/CHANGELOG_UNRELEASED.md index 45b9b902b2..342cfd31c8 100644 --- a/CHANGELOG_UNRELEASED.md +++ b/CHANGELOG_UNRELEASED.md @@ -108,6 +108,7 @@ + lemmas `le_esum`, `esumN` + lemmas `summable_le_esum`, `summable_esum_funepos`, `summable_esumN`, `summableZ`, `summable_esumZ` + + lemmas `esum_unit` + lemmas `exchange_esum_ereal_sup` - in `ereal.v`: @@ -339,6 +340,9 @@ - in `ereal.v`: + lemmas `ge0_mule_fsumr`, `ge0_mule_fsuml` +- in `esum.v`: + + lemma `esum_set1` + ### Deprecated - file `charge.v` (use `measure.v` and/or `lebesgue_integral.v`) diff --git a/theories/esum.v b/theories/esum.v index 96cc6400d1..00998a9c1e 100644 --- a/theories/esum.v +++ b/theories/esum.v @@ -394,23 +394,6 @@ Proof. by move=> finF f0; rewrite ge0_esum//; exact: PosEsum.pos_esum_fset. Qed. -Lemma esum_set1 t a : 0 <= a t -> \esum_(i in [set t]) a i = a t. -Proof. -move=> ?; rewrite ge0_esum. - by move=> x ->. -exact: PosEsum.pos_esum_set1. -Qed. - -Lemma esum_eq0P (A : set T) a : (forall i, A i -> 0 <= a i) -> - \esum_(x in A) a x = 0 -> - forall x, A x -> a x = 0. -Proof. -move=> a0; rewrite ge0_esum// => suma0 x Ax. -apply/eqP; rewrite eq_le a0//= -suma0 ereal_sup_ubound//=. -exists [set x]; first by split => // t ->. -by rewrite -esum_set1 ?a0// esum_fset// => i ->; exact: a0. -Qed. - End esum_realType. Lemma esum1 {R : realFieldType} {I : choiceType} (D : set I) (a : I -> \bar R) : @@ -430,6 +413,81 @@ move=> e; congr (_ - _). Qed. Arguments eq_esum {R T} I a b. +Lemma esum_mkcond [R : realType] [T : choiceType] (I : set T) + (a : T -> \bar R) : + \esum_(i in I) a i = \esum_(i in [set: T]) if i \in I then a i else 0. +Proof. +rewrite /esum; congr (_ - _); rewrite PosEsum.pos_esum_mkcond; + congr PosEsum.pos_esum; apply/funext => x/=. +- by rewrite (funepos_restrict I a). +- by rewrite (funeneg_restrict I a). +Qed. + +Lemma esum_mkcondr [R : realType] [T : choiceType] (I J : set T) + (a : T -> \bar R) : + \esum_(i in I `&` J) a i = \esum_(i in I) if i \in J then a i else 0. +Proof. +rewrite esum_mkcond [RHS]esum_mkcond; apply: eq_esum=> i _. +by rewrite in_setI; case: (i \in I) (i \in J) => [] []. +Qed. + +Lemma esum_mkcondl [R : realType] [T : choiceType] (I J : set T) + (a : T -> \bar R) : + \esum_(i in I `&` J) a i = \esum_(i in J) if i \in I then a i else 0. +Proof. +rewrite esum_mkcond [RHS]esum_mkcond; apply: eq_esum=> i _. +by rewrite in_setI; case: (i \in I) (i \in J) => [] []. +Qed. + +Lemma esum_if_eq_op {R : realType} {T : choiceType} (f : T -> \bar R) x : + \esum_(y in [set: T]) (if x == y then f y else 0) = \esum_(i in [set x]) f i. +Proof. +rewrite [RHS]esum_mkcond. +by under [in RHS]eq_esum do rewrite in_set1 eq_sym. +Qed. + +Section esum_set1. +Context {R : realType} {T : choiceType}. + +Let ge0_esum_set1 t (a : T -> \bar R) : 0 <= a t -> + \esum_(i in [set t]) a i = a t. +Proof. +move=> ?; rewrite ge0_esum; first by move=> x ->. +exact: PosEsum.pos_esum_set1. +Qed. + +Lemma esum_set1 (f : T -> \bar R) x : \esum_(i in [set x]) f i = f x. +Proof. +rewrite /esum. +rewrite (PosEsum.eq_pos_esum _ _ (fun y => if x == y then f^\+ y else 0)). + by move=> i /[!inE] ->; rewrite eqxx. +rewrite [X in _ - X](PosEsum.eq_pos_esum _ _ + (fun y => if x == y then f^\- y else 0)). + by move=> i /[!inE] ->; rewrite eqxx. +rewrite -[X in X - _]ge0_esum; first by move=> t _; case: ifPn. +rewrite -[X in _ - X]ge0_esum; first by move=> t _; case: ifPn. +have [Sx0|Sx0] := comparable_ltP (comparableT (f x) 0)%E. +- rewrite esum1; first by move => t //= ->; rewrite eqxx funeposE// max_r// ltW. + rewrite ge0_esum_set1 eqxx ?funeneg_ge0//. + by rewrite funenegE max_l// ?oppeK ?add0e// leeNr oppe0 ltW. +- rewrite ge0_esum_set1 eqxx ?funepos_ge0//. + rewrite esum1; first by move => t ->; rewrite funenegE eqxx max_r// oppe_le0. + by rewrite funeposE max_l// sube0. +Qed. + +End esum_set1. + +Lemma esum_eq0P [R : realType] [T : choiceType] (A : set T) (a : T -> \bar R) : + (forall i, A i -> 0 <= a i) -> + \esum_(x in A) a x = 0 -> + forall x, A x -> a x = 0. +Proof. +move=> a0; rewrite ge0_esum// => suma0 x Ax. +apply/eqP; rewrite eq_le a0//= -suma0 ereal_sup_ubound//=. +exists [set x]; first by split => // t ->. +by rewrite -esum_set1 ?a0// esum_fset// => i ->; exact: a0. +Qed. + Section esumZ. Context {R : realType} {T : choiceType}. @@ -440,7 +498,7 @@ Proof. rewrite le_eqVlt => /predU1P[<- _|c0 a0]. by rewrite mul0e esum1// => ? _; rewrite mul0e. rewrite ge0_esum. - by move=> x /a0 ax0; rewrite mule_ge0// ltW. + by move=> x /a0 ax0; rewrite ?mule_ge0//; exact: ltW. rewrite ge0_esum//. by apply: PosEsum.pos_esumZ => //; exact: ltW. Qed. @@ -476,32 +534,6 @@ rewrite ge0_esum//. by do 2 rewrite ge0_esum//; exact: PosEsum.pos_esumD. Qed. -Lemma esum_mkcond [R : realType] [T : choiceType] (I : set T) - (a : T -> \bar R) : - \esum_(i in I) a i = \esum_(i in [set: T]) if i \in I then a i else 0. -Proof. -rewrite /esum; congr (_ - _); rewrite PosEsum.pos_esum_mkcond; - congr PosEsum.pos_esum; apply/funext => x/=. -- by rewrite (funepos_restrict I a). -- by rewrite (funeneg_restrict I a). -Qed. - -Lemma esum_mkcondr [R : realType] [T : choiceType] (I J : set T) - (a : T -> \bar R) : - \esum_(i in I `&` J) a i = \esum_(i in I) if i \in J then a i else 0. -Proof. -rewrite esum_mkcond [RHS]esum_mkcond; apply: eq_esum=> i _. -by rewrite in_setI; case: (i \in I) (i \in J) => [] []. -Qed. - -Lemma esum_mkcondl [R : realType] [T : choiceType] (I J : set T) - (a : T -> \bar R) : - \esum_(i in I `&` J) a i = \esum_(i in J) if i \in I then a i else 0. -Proof. -rewrite esum_mkcond [RHS]esum_mkcond; apply: eq_esum=> i _. -by rewrite in_setI; case: (i \in I) (i \in J) => [] []. -Qed. - Lemma esumID (R : realType) (I : choiceType) (B : set I) (A : set I) (F : I -> \bar R) : (forall i, A i -> F i >= 0) -> From 30fdf7270a5e2842192167d2d22ffc6737820683 Mon Sep 17 00:00:00 2001 From: Reynald Affeldt Date: Fri, 12 Jun 2026 00:57:10 +0900 Subject: [PATCH 18/21] fix changelog --- CHANGELOG_UNRELEASED.md | 10 +-- experimental_reals/realsum.v | 22 +++-- theories/ereal.v | 25 +++--- theories/esum.v | 154 ++++++++--------------------------- theories/sequences.v | 2 +- 5 files changed, 63 insertions(+), 150 deletions(-) diff --git a/CHANGELOG_UNRELEASED.md b/CHANGELOG_UNRELEASED.md index 342cfd31c8..b0c6d88dda 100644 --- a/CHANGELOG_UNRELEASED.md +++ b/CHANGELOG_UNRELEASED.md @@ -100,15 +100,12 @@ + definition `esg` + lemmas `numEesg`, `gte0_esg`, `lte0_esg`, `esg0` -- in `numfun.v`: - + lemmas `funepos_cst0`, `funeneg_cst0` - - in `esum.v`: + lemmas `esum_eq0P`, `esumZ`, `exchange_esum` + lemmas `le_esum`, `esumN` + lemmas `summable_le_esum`, `summable_esum_funepos`, `summable_esumN`, `summableZ`, `summable_esumZ` - + lemmas `esum_unit` + + lemmas `esum_if_eq_op` + lemmas `exchange_esum_ereal_sup` - in `ereal.v`: @@ -244,7 +241,7 @@ `ae_eq_Radon_Nikodym_SigmaFinite`, `Radon_Nikodym_change_of_variables`, `Radon_Nikodym_cscale`, `Radon_Nikodym_cadd`, `Radon_Nikodym_chain_rule` - in `realsum.v`: - + now use `funrpos` and `funrneg`: + + the following now use `funrpos` and `funrneg`: * definition `sum` * lemmas `summable_funrpos`, `summable_funrneg` + lemma `sum0` (now uses `cst`) @@ -309,6 +306,9 @@ - in `measure_function.v`: + `isFinite` -> `isFinNumFun` +- in `esum.v`: + + `esum_sum` -> ` exchange_esum_sum` + ### Generalized - in `measurable_structure.v`: diff --git a/experimental_reals/realsum.v b/experimental_reals/realsum.v index 30bb67694b..002ce1f223 100644 --- a/experimental_reals/realsum.v +++ b/experimental_reals/realsum.v @@ -270,12 +270,11 @@ Lemma esum_psum (S : T -> R) : (forall i, 0 <= S i) -> summable S -> \esum_(x in [set: T]) (S x)%:E = (psum S)%:E. Proof. move => Sg0 h; apply/eqP; rewrite eq_le; apply/andP; split. -- rewrite ge0_esum. - by move=> t _; rewrite lee_fin. +- rewrite ge0_esum; first by move=> t _; rewrite lee_fin. rewrite ge_ereal_sup//= => x [X [finX _]]. rewrite fsumEFin // => <-. rewrite lee_fin fsbig_finite//=. - move/cardinality.finite_fsetP : finX => [J ->]. + move/finite_fsetP : finX => [J ->]. rewrite set_fsetK (le_trans _ (gerfin_psum J h))//. rewrite -(@big_fset_seq R _ _ T J S)//= (le_trans _ (ler_norm_sum _ _ _))//. exact: ler_norm. @@ -283,9 +282,8 @@ move => Sg0 h; apply/eqP; rewrite eq_le; apply/andP; split. by move => t _; rewrite ger0_norm. have [nonempty hasub] := summable_sup h. rewrite psum_absE// -ereal_sup_EFin// ge_ereal_sup//= => x [X [Fs ->] <-]. - rewrite ge0_esum//. - rewrite PosEsum.pos_esum_ge//. - exists ([set` Fs]%classic) => //. + rewrite ge0_esum// PosEsum.pos_esum_ge//. + exists [set` Fs]%classic => //. rewrite fsumEFin// lee_fin (big_fset_seq (fun x => `|S x|))//=. by rewrite -{1}(set_fsetK Fs) -fsbig_finite. Qed. @@ -641,18 +639,18 @@ Qed. End SummableAlg. -Lemma esumEsum {T : choiceType} {R : realType} (S : T -> R) : summable S -> - \esum_(x in setT) (S x)%:E = (sum S)%:E. +Lemma esumEsum {T : choiceType} {R : realType} (f : T -> R) : summable f -> + \esum_(x in [set: T]) (f x)%:E = (sum f)%:E. Proof. move=> hs; rewrite /esum. -rewrite (PosEsum.eq_pos_esum _ (fun x => (S x)%:E)^\+%E (fun x => (S^\+ x)%:E)). +rewrite (PosEsum.eq_pos_esum _ (fun x => (f x)%:E)^\+%E (fun x => (f^\+ x)%:E)). by move=> t _; rewrite funeposE -fine_max. -rewrite (PosEsum.eq_pos_esum _ (fun x => (S x)%:E)^\-%E (fun x => (S^\- x)%:E)). +rewrite (PosEsum.eq_pos_esum _ (fun x => (f x)%:E)^\-%E (fun x => (f^\- x)%:E)). by move=> t _; rewrite funenegE EFin_max. rewrite EFinB; congr (_ - _)%E. -- rewrite -esum_psum//; first exact : summable_funrpos. +- rewrite -esum_psum//; first exact: summable_funrpos. by rewrite ge0_esum// => x _; rewrite lee_fin. -- rewrite -esum_psum//; first exact : summable_funrneg. +- rewrite -esum_psum//; first exact: summable_funrneg. by rewrite ge0_esum// => x _; rewrite lee_fin. Qed. diff --git a/theories/ereal.v b/theories/ereal.v index e367efa176..27163b9f9f 100644 --- a/theories/ereal.v +++ b/theories/ereal.v @@ -773,27 +773,26 @@ Lemma ge0_ereal_supZl (c : \bar R) X : 0 <= c -> X != set0 -> ereal_sup [set c * x | x in X] = c * ereal_sup X. Proof. move=> c0 /[dup] Xneq0 /set0P[x Xx] X_ge0. -case: c c0 => [r r0|_|//]. -- have [->|_] := eqVneq r 0%R. +case: c c0 => [r|_|//]. +- rewrite lee_fin le_eqVlt => /predU1P[<-|r0]. + rewrite mul0e. under eq_imagel do rewrite mul0e. by rewrite ereal_sup_cst. - + exact: ereal_supZl Xneq0 r0. + + exact/(ereal_supZl Xneq0)/ltW. - have [Xall0|] := pselect (forall a, X a -> a = 0). + rewrite [X in ereal_sup X = _](_ : _ = [set 0]%classic). apply/seteqP; split. * by move=> _ [z Xz <-]; rewrite (Xall0 _ Xz) mule0. * by move=> y /= ->; exists x => //; rewrite (Xall0 _ Xx) mule0. - have -> : X = [set 0]%classic. - apply/seteqP; split. - + by move=> y /Xall0 ->. - + by move=> y /= ->; rewrite -(Xall0 _ Xx). - by rewrite ereal_sup1 mule0. - + rewrite -existsNE => -[y /not_implyP[Xy /eqP]]. - rewrite neq_lt ltNge X_ge0//= => y0. - rewrite gt0_mulye//. - by rewrite (lt_le_trans y0)// ereal_sup_ubound. - by rewrite ereal_supy//=; exists y => //; exact: gt0_mulye. + have -> : X = [set 0]%classic. + apply/seteqP; split. + * by move=> y /Xall0 ->. + * by move=> y /= ->; rewrite -(Xall0 _ Xx). + by rewrite ereal_sup1 mule0. + + rewrite -existsNE => -[y /not_implyP[Xy /eqP]]. + rewrite neq_lt ltNge X_ge0//= => y0. + rewrite gt0_mulye//; first by rewrite (lt_le_trans y0)// ereal_sup_ubound. + by rewrite ereal_supy//=; exists y => //; exact: gt0_mulye. Qed. Section ge0_ereal_supZl_range. diff --git a/theories/esum.v b/theories/esum.v index 00998a9c1e..59ca611a93 100644 --- a/theories/esum.v +++ b/theories/esum.v @@ -56,6 +56,8 @@ Qed. End set_of_fset_in_a_set. +(**md Definition of `esum` for non-negative functions, used to define + `esum` for any function, use the latter. *) Module PosEsum. Section posesum. Variables (R : realFieldType) (T : choiceType). @@ -377,8 +379,7 @@ Lemma le_esum (A : set T) (f g : T -> \bar R) : (forall x, A x -> 0 <= f x) -> (forall x, A x -> f x <= g x) -> \esum_(x in A) f x <= \esum_(x in A) g x. Proof. -move=> f0 leS. -have g0 x : A x -> 0 <= g x. +move=> f0 leS; have g0 x : A x -> 0 <= g x. by move=> /[dup] Ax /leS; apply: le_trans; exact: f0 Ax. by rewrite !ge0_esum// PosEsum.le_pos_esum. Qed. @@ -477,54 +478,49 @@ Qed. End esum_set1. -Lemma esum_eq0P [R : realType] [T : choiceType] (A : set T) (a : T -> \bar R) : - (forall i, A i -> 0 <= a i) -> - \esum_(x in A) a x = 0 -> - forall x, A x -> a x = 0. +Lemma esum_eq0P {R : realType} {T : choiceType} (A : set T) (f : T -> \bar R) : + (forall i, A i -> 0 <= f i) -> + \esum_(x in A) f x = 0 -> forall x, A x -> f x = 0. Proof. -move=> a0; rewrite ge0_esum// => suma0 x Ax. -apply/eqP; rewrite eq_le a0//= -suma0 ereal_sup_ubound//=. +move=> f0; rewrite ge0_esum// => suma0 x Ax. +apply/eqP; rewrite eq_le f0//= -suma0 ereal_sup_ubound//=. exists [set x]; first by split => // t ->. -by rewrite -esum_set1 ?a0// esum_fset// => i ->; exact: a0. +by rewrite -esum_set1 esum_fset// => i ->; exact: f0. Qed. Section esumZ. -Context {R : realType} {T : choiceType}. +Context {R : realType} {T : choiceType} (A : set T) (f : T -> \bar R). -Let ge0_esumZ (A : set T) (a : T -> \bar R) - (c : \bar R) : 0 <= c -> (forall t, A t -> 0 <= a t) -> - \esum_(t in A) c * a t = c * \esum_(t in A) a t. +Let ge0_esumZ c : 0 <= c -> (forall t, A t -> 0 <= f t) -> + \esum_(t in A) c * f t = c * \esum_(t in A) f t. Proof. -rewrite le_eqVlt => /predU1P[<- _|c0 a0]. +rewrite le_eqVlt => /predU1P[<- _|c0 f0]. by rewrite mul0e esum1// => ? _; rewrite mul0e. -rewrite ge0_esum. - by move=> x /a0 ax0; rewrite ?mule_ge0//; exact: ltW. -rewrite ge0_esum//. -by apply: PosEsum.pos_esumZ => //; exact: ltW. +rewrite ge0_esum; first by move=> x /f0 ax0; rewrite ?mule_ge0// ltW. +by rewrite ge0_esum//; apply: PosEsum.pos_esumZ => //; exact: ltW. Qed. -Lemma esumZ (A : set T) (f : T -> \bar R) c : (forall x, A x -> 0 <= f x) -> +Lemma esumZ c : (forall x, A x -> 0 <= f x) -> \esum_(x in A) c * f x = c * \esum_(x in A) f x. Proof. -move=> h. -rewrite (eq_esum _ _ (fun x => esg c * (`|c| * f x))). +move=> h; rewrite (eq_esum _ _ (fun x => esg c * (`|c| * f x))). by move=> x; rewrite muleA -numEesg. transitivity (esg c * \esum_(x in A) `|c| * f x). -- have [hc|hc|->] := comparable_ltgtP (comparableT c 0). - + rewrite {1}lte0_abs// gte0_esg// (eq_esum _ _ (fun x => - (- c * f x))). + have [hc|hc|->] := comparable_ltgtP (comparableT c 0). + - rewrite {1}lte0_abs// gte0_esg// (eq_esum _ _ (fun x => - (- c * f x))). by move => ?; rewrite mulN1e. rewrite mulN1e -esumN; last by rewrite lte0_abs. by move=> ? ?; rewrite mule_ge0//; exact: h. - + rewrite gte0_abs// lte0_esg// mul1e (eq_esum _ _ (fun x => c * f x))//. + - rewrite gte0_abs// lte0_esg// mul1e (eq_esum _ _ (fun x => c * f x))//. by move=> ?; rewrite mul1e. - + under eq_esum do rewrite esg0 mul0e. + - under eq_esum do rewrite esg0 mul0e. by rewrite esg0 mul0e esum1. -- by rewrite (eq_esum _ _ (fun x => `|c| * f x))// ge0_esumZ// muleA -numEesg. +by rewrite (eq_esum _ _ (fun x => `|c| * f x))// ge0_esumZ// muleA -numEesg. Qed. End esumZ. -Lemma esumD [R : realType] [T : choiceType] (I : set T) (a b : T -> \bar R) : +Lemma esumD {R : realType} {T : choiceType} (I : set T) (a b : T -> \bar R) : (forall i, I i -> 0 <= a i) -> (forall i, I i -> 0 <= b i) -> \esum_(i in I) (a i + b i) = \esum_(i in I) a i + \esum_(i in I) b i. Proof. @@ -534,11 +530,10 @@ rewrite ge0_esum//. by do 2 rewrite ge0_esum//; exact: PosEsum.pos_esumD. Qed. -Lemma esumID (R : realType) (I : choiceType) (B : set I) (A : set I) - (F : I -> \bar R) : +Lemma esumID {R : realType} {I : choiceType} (B A : set I) (F : I -> \bar R) : (forall i, A i -> F i >= 0) -> \esum_(i in A) F i = (\esum_(i in A `&` B) F i) + - (\esum_(i in A `&` ~` B) F i). + (\esum_(i in A `&` ~` B) F i). Proof. move=> F0; rewrite !esum_mkcondr -esumD; do ?by move=> i /F0; case: ifP. by apply: eq_esum=> i; rewrite in_setC; case: ifP; rewrite /= (adde0, add0e). @@ -552,8 +547,7 @@ Lemma exchange_esum_sum [R : realType] [T1 T2 : choiceType] \sum_(j <- r | P j) \esum_(i in I) a i j. Proof. move=> a_ge0. -rewrite ge0_esum. - by move=> x Ix; apply: sume_ge0 => t /a_ge0; exact. +rewrite ge0_esum; first by move=> x Ix; apply: sume_ge0 => t /a_ge0; exact. rewrite [LHS]PosEsum.pos_esum_sum//. apply: eq_bigr => t Pt. by rewrite ge0_esum// => x /a_ge0; exact. @@ -567,13 +561,9 @@ Lemma esum_esum [R : realType] [T1 T2 : choiceType] \esum_(i in I) \esum_(j in J i) a i j = \esum_(k in I `*`` J) a k.1 k.2. Proof. move=> a_ge0. -rewrite [RHS]ge0_esum/=. - move=> [x y]/= [Ix Jxy]. - exact: a_ge0. -rewrite -[RHS]PosEsum.pos_esum_esum//. -rewrite ge0_esum. - move=> x Ix. - by rewrite esum_ge0// => t /a_ge0; exact. +rewrite [RHS]ge0_esum/=; first by move=> [x y]/= [Ix Jxy]; exact: a_ge0. +rewrite -[RHS]PosEsum.pos_esum_esum// ge0_esum. + by move=> x Ix; rewrite esum_ge0// => t /a_ge0; exact. apply: PosEsum.eq_pos_esum => x Ix. by rewrite ge0_esum// => t /a_ge0; apply; exact/set_mem. Qed. @@ -649,12 +639,13 @@ by rewrite !funenegE. Qed. Arguments reindex_esum {R T T'} P Q e a. -Lemma exchange_esum [R : realType] [T U : choiceType] A B (f : T -> U -> \bar R): - (forall i j, 0 <= f i j) -> +Lemma exchange_esum [R : realType] [T U : choiceType] A B + (f : T -> U -> \bar R): (forall i j, 0 <= f i j) -> \esum_(x in A) \esum_(y in B) f x y = \esum_(y in B) \esum_(x in A) f x y. Proof. move=> f0; rewrite !esum_esum//=. -rewrite (reindex_esum (fun z => A z.1 /\ B z.2) (fun z => B z.1 /\ A z.2) swap)//=. +rewrite (reindex_esum (fun z => A z.1 /\ B z.2) (fun z => B z.1 /\ A z.2) + swap)//=. split. - by move=> [i j]/= []. - by move=> [i1 i2] [j1 j2] /[!inE] -[Ai1 Bi2] [Aj1 Bj2] [-> ->]. @@ -978,78 +969,6 @@ Qed. End esumB. -Section summable_esum. -Context {R : realType} {T : choiceType}. -Implicit Types (A : set T) (f g : T -> \bar R). - -Lemma summable_le_esum A f g : summable A g -> - (forall x, A x -> f x <= g x) -> \esum_(x in A) f x <= \esum_(x in A) g x. -Proof. -move=> sg leS; rewrite leeB//. - apply: PosEsum.le_pos_esum => ? ?. - apply: (@funepos_le _ _ A); last exact/mem_set. - by move=> x /set_mem/leS. -apply: PosEsum.le_pos_esum => t At. -rewrite -!funeposN (@funepos_le _ _ A)//; last exact/mem_set. -by move=> x /set_mem/leS; rewrite leeN2. -Qed. - -Lemma summable_esum_funepos A f : - summable A f -> \esum_(t in A) f^\+ t \is a fin_num. -Proof. -move=> /summable_funepos. -rewrite summableE (eq_esum _ (funepos f) (fun y => `|f^\+ y|))//=. -by move => ? ?; rewrite gee0_abs. -Qed. - -Lemma summable_esumN A f : summable A f -> - \esum_(x in A) - f x = - \esum_(x in A) f x. -Proof. -move=> sf. -rewrite /esum funenegN funeposN addeC oppeB //= adde_defC fin_num_adde_defl//. -have := summable_esum_funepos sf. -by rewrite ge0_esum. -Qed. - -Lemma summableZ A c f : `|c| \is a fin_num -> - summable A f -> summable A (fun x => `|c| * f x). -Proof. -rewrite /summable => cfin Soo. -rewrite (eq_esum _ _ (fun x => `|c| * `|f x|)). - by move=> t ?; rewrite abseM abse_id. -by rewrite esumZ// lte_mul_pinfty. -Qed. - -Lemma summable_esumZ A f c : `|c| \is a fin_num -> summable A f -> - \esum_(x in A) c * f x = c * \esum_(x in A) f x. -Proof. -move=> c_fin_num sf. -rewrite (eq_esum _ _ (fun x => esg c * (`|c| * f x))). - by move=> x; rewrite muleA -numEesg. -transitivity (esg c * \esum_(x in A) `|c| * f x). -- have [hc|hc|->] := comparable_ltgtP (comparableT c 0). - + rewrite {1}lte0_abs// gte0_esg// (eq_esum _ _ (fun x => - (- c * f x))). - by move => ?; rewrite mulN1e. - rewrite mulN1e -summable_esumN; last by rewrite lte0_abs. - exact: summableZ. - + rewrite gte0_abs// lte0_esg// mul1e (eq_esum _ _ (fun x => c * f x))//. - by move=> ?; rewrite mul1e. - + under eq_esum do rewrite esg0 mul0e. - by rewrite esg0 mul0e esum1. -- rewrite {1}/esum. - rewrite (PosEsum.eq_pos_esum _ _ (fun x => `|c| * f^\+ x)). - by move=> i _ //=; rewrite -(@fineK _ `|c|) // ge0_funeposM. - rewrite (PosEsum.eq_pos_esum _ (fun x => `|c| * f x)^\- (fun x => `|c| * f^\- x)). - by move=> t _ //=; rewrite -(@fineK _ `|c|) // ge0_funenegM. - rewrite !PosEsum.pos_esumZ// -muleBr//=. - rewrite adde_defC fin_num_adde_defl//. - have := summable_esum_funepos sf. - by rewrite ge0_esum. - by rewrite muleA -numEesg. -Qed. - -End summable_esum. - Section exchange_esum_ereal_sup. Context {R : realType} {T : choiceType} {f : T -> nat -> \bar R}. Hypothesis f_ge0 : forall t n, 0 <= f t n. @@ -1060,14 +979,11 @@ Lemma exchange_esum_ereal_sup (A : set T) : ereal_sup (range (fun n => \esum_(x in A) f x n)). Proof. rewrite ge0_esum. - move=> x Ax. - apply: le_ereal_sup_tmp. - by exists (f x 0). + by move=> x Ax; apply: le_ereal_sup_tmp; exists (f x 0). under eq_imagel. move=> B [fin BA]; rewrite fsbig_finite//= ereal_sup_sum//. over. -rewrite exchange_ereal_sup; congr ereal_sup. -apply: eq_imagel => n _. +rewrite exchange_ereal_sup; congr ereal_sup; apply: eq_imagel => n _. rewrite ge0_esum//; congr ereal_sup. by apply: eq_imagel => B [finB BA]; rewrite fsbig_finite. Qed. diff --git a/theories/sequences.v b/theories/sequences.v index e810336e70..12c37d35ea 100644 --- a/theories/sequences.v +++ b/theories/sequences.v @@ -1523,7 +1523,7 @@ Hypothesis f_nd : forall x, nondecreasing_seq (f x). Lemma ereal_sup_sum (l : seq T) : \sum_(x <- l) ereal_sup (range (f x)) = - ereal_sup (range (fun n => \sum_(x <- l) f x n)). + ereal_sup (range (fun n => \sum_(x <- l) f x n)). Proof. elim: l => [|x xs ih]. - rewrite big_nil. From 3aec29b6f558f02abbdfe2e50c9a77f8dfe144ce Mon Sep 17 00:00:00 2001 From: Reynald Affeldt Date: Fri, 12 Jun 2026 09:26:21 +0900 Subject: [PATCH 19/21] nitpick --- .nix/coq-nix-toolbox.nix | 2 +- CHANGELOG_UNRELEASED.md | 3 +- experimental_reals/realsum.v | 33 +-- theories/ereal.v | 2 +- theories/esum.v | 290 ++++++++++----------- theories/lebesgue_measure.v | 4 +- theories/lebesgue_stieltjes_measure.v | 4 +- theories/measure_theory/measure_function.v | 12 +- 8 files changed, 161 insertions(+), 189 deletions(-) diff --git a/.nix/coq-nix-toolbox.nix b/.nix/coq-nix-toolbox.nix index e70ee2f134..ff570aeca7 100644 --- a/.nix/coq-nix-toolbox.nix +++ b/.nix/coq-nix-toolbox.nix @@ -1 +1 @@ -"4a441c50de5618ef066128f9f6f84e6bc13066da" +"6b32b8cd491ec44b75da86fb17e4353f2f102328" diff --git a/CHANGELOG_UNRELEASED.md b/CHANGELOG_UNRELEASED.md index b0c6d88dda..e470668ba7 100644 --- a/CHANGELOG_UNRELEASED.md +++ b/CHANGELOG_UNRELEASED.md @@ -175,7 +175,8 @@ + with the contents of `charge.v` (deprecated) - in `esum.v`: - + `ge0_esum` + + lemma `ge0_esum` + + lemma `esum_ge` ### Changed diff --git a/experimental_reals/realsum.v b/experimental_reals/realsum.v index 002ce1f223..5f0f1732bd 100644 --- a/experimental_reals/realsum.v +++ b/experimental_reals/realsum.v @@ -262,34 +262,27 @@ by case=> /= [|J lt_lJ _]; [apply/summable_sup | exists J]. Qed. End SumTh. -(* -------------------------------------------------------------------- *) -Section Esum. -Context {R : realType} {T : choiceType}. - -Lemma esum_psum (S : T -> R) : (forall i, 0 <= S i) -> summable S -> - \esum_(x in [set: T]) (S x)%:E = (psum S)%:E. +Lemma esum_psum {R : realType} {T : choiceType} (f : T -> R) : + (forall i, 0 <= f i) -> summable f -> + \esum_(x in [set: T]) (f x)%:E = (psum f)%:E. Proof. -move => Sg0 h; apply/eqP; rewrite eq_le; apply/andP; split. +move => f0 h; apply/eqP; rewrite eq_le; apply/andP; split. - rewrite ge0_esum; first by move=> t _; rewrite lee_fin. rewrite ge_ereal_sup//= => x [X [finX _]]. rewrite fsumEFin // => <-. rewrite lee_fin fsbig_finite//=. move/finite_fsetP : finX => [J ->]. rewrite set_fsetK (le_trans _ (gerfin_psum J h))//. - rewrite -(@big_fset_seq R _ _ T J S)//= (le_trans _ (ler_norm_sum _ _ _))//. - exact: ler_norm. -- rewrite (@eq_esum _ _ _ _ (fun x => `| S x |%:E)). + by rewrite -big_fset_seq//= (le_trans _ (ler_norm_sum _ _ _))// ler_norm. +- rewrite (eq_esum _ _ (fun x => `|f x|%:E)). by move => t _; rewrite ger0_norm. have [nonempty hasub] := summable_sup h. rewrite psum_absE// -ereal_sup_EFin// ge_ereal_sup//= => x [X [Fs ->] <-]. - rewrite ge0_esum// PosEsum.pos_esum_ge//. - exists [set` Fs]%classic => //. - rewrite fsumEFin// lee_fin (big_fset_seq (fun x => `|S x|))//=. + rewrite esum_ge//; exists [set` Fs]%classic => //. + rewrite fsumEFin// lee_fin (big_fset_seq (fun x => `|f x|))//=. by rewrite -{1}(set_fsetK Fs) -fsbig_finite. Qed. -End Esum. - (* -------------------------------------------------------------------- *) Lemma max_sup {R : realType} x (E : set R) : (E `&` ubound E)%classic x -> sup E = x. @@ -643,15 +636,13 @@ Lemma esumEsum {T : choiceType} {R : realType} (f : T -> R) : summable f -> \esum_(x in [set: T]) (f x)%:E = (sum f)%:E. Proof. move=> hs; rewrite /esum. -rewrite (PosEsum.eq_pos_esum _ (fun x => (f x)%:E)^\+%E (fun x => (f^\+ x)%:E)). - by move=> t _; rewrite funeposE -fine_max. -rewrite (PosEsum.eq_pos_esum _ (fun x => (f x)%:E)^\-%E (fun x => (f^\- x)%:E)). - by move=> t _; rewrite funenegE EFin_max. rewrite EFinB; congr (_ - _)%E. - rewrite -esum_psum//; first exact: summable_funrpos. - by rewrite ge0_esum// => x _; rewrite lee_fin. + rewrite ge0_esum/=; first by move=> x _; rewrite lee_fin. + by apply: PosEsum.eq_pos_esum => x _; rewrite funerpos. - rewrite -esum_psum//; first exact: summable_funrneg. - by rewrite ge0_esum// => x _; rewrite lee_fin. + rewrite ge0_esum/=; first by move=> x _; rewrite lee_fin. + by apply: PosEsum.eq_pos_esum => x _; rewrite funerneg. Qed. (* -------------------------------------------------------------------- *) diff --git a/theories/ereal.v b/theories/ereal.v index 27163b9f9f..df5b8b6d36 100644 --- a/theories/ereal.v +++ b/theories/ereal.v @@ -232,7 +232,7 @@ Proof. move=> F0; have [->{x}|x0] := eqVneq x 0%E. by rewrite mul0e big1// => ? _; rewrite mul0e. rewrite big_seq ge0_sume_distrr. - by move=> t; case: finite_supportP => // X XP _ _ /XP/F0. + by move=> t; case: finite_supportP => // X XP _ _ /XP/F0. rewrite -big_seq; apply: eq_fbigl => y. rewrite !unlock; congr (_ \in fset_set _). apply/seteqP; rewrite /preimage; split=> [|] z/= [Pz Fz0]; diff --git a/theories/esum.v b/theories/esum.v index 59ca611a93..fda7af005a 100644 --- a/theories/esum.v +++ b/theories/esum.v @@ -56,35 +56,34 @@ Qed. End set_of_fset_in_a_set. -(**md Definition of `esum` for non-negative functions, used to define - `esum` for any function, use the latter. *) +(**md This module is for internal use. It defines `esum` in the + particular case of non-negative functions and is then used to + define a generic `esum` below, which should be preferred *) Module PosEsum. Section posesum. Variables (R : realFieldType) (T : choiceType). -Implicit Types (S : set T) (a g : T -> \bar R). +Implicit Types (S : set T) (f g : T -> \bar R). Definition pos_esum S g := ereal_sup [set \sum_(x \in B) g x | B in fsets S]. Local Notation "\esum_ ( i 'in' P ) A" := (pos_esum P (fun i => A)). -Lemma pos_esum_set0 a : \esum_(i in set0) a i = 0. +Lemma pos_esum_set0 f : \esum_(i in set0) f i = 0. Proof. rewrite /pos_esum fsets0 [X in ereal_sup X](_ : _ = [set 0%E]) ?ereal_sup1//. apply/seteqP; split=> [x [_ /= ->]|x]; first by rewrite fsbig_set0. by move=> -> /=; exists set0 => //; rewrite fsbig_set0. Qed. -Lemma ge0_pos_esum_funeneg S a : (forall x, S x -> 0 <= a x) -> - \esum_(i in S) a^\- i = 0. +Lemma ge0_pos_esum_funeneg S f : (forall x, S x -> 0 <= f x) -> + \esum_(i in S) f^\- i = 0. Proof. -move=> a0. -rewrite /pos_esum [X in ereal_sup X](_ : _ = [set 0]) ?ereal_sup1//. +move=> a0; rewrite /pos_esum [X in ereal_sup X](_ : _ = [set 0]) ?ereal_sup1//. apply/seteqP; split => [/= x /= [A SA <-]|]. rewrite fsbig1//= => t At. rewrite (@ge0_funenegE _ _ A)//; last exact/mem_set. by move=> u; case: SA => _ => /[apply] /a0. -move=> /= _ ->. -exists set0; first exact: fsets_set0. +rewrite sub1set inE/=; exists set0; first exact: fsets_set0. by rewrite fsbig_set0. Qed. @@ -99,12 +98,11 @@ apply/seteqP; split => [_/= [B SB <-]|_/= [B SB <-]]. exact/eq_fg/mem_set/SB.2/set_mem. Qed. -Lemma ge0_pos_esum_funepos S a : (forall x, S x -> 0 <= a x) -> - \esum_(i in S) a^\+ i = \esum_(i in S) a i. +Lemma ge0_pos_esum_funepos S f : (forall x, S x -> 0 <= f x) -> + \esum_(i in S) f^\+ i = \esum_(i in S) f i. Proof. by move=> a0; apply: eq_pos_esum; exact: ge0_funeposE. Qed. -Lemma pos_esum1 (D : set T) (a : T -> \bar R) : - (forall i, D i -> a i = 0) -> \esum_(i in D) a i = 0. +Lemma pos_esum1 S f : (forall i, S i -> f i = 0) -> \esum_(i in S) f i = 0. Proof. move=> a0; rewrite /pos_esum (_ : [set _ | _ in _] = [set 0]) ?ereal_sup1//. apply/seteqP; split=> x //= => [[X [finX XI]] <-|->]. @@ -117,29 +115,27 @@ Arguments eq_pos_esum {R T} S f g. Section posesum_realType. Variables (R : realType) (T : choiceType). -Implicit Types (S : set T) (a g : T -> \bar R). +Implicit Types (S : set T) (f g : T -> \bar R). Local Notation "\esum_ ( i 'in' P ) A" := (pos_esum P (fun i => A)). -Lemma pos_esum_ge0 (S : set T) a : - (forall x, S x -> 0 <= a x) -> 0 <= \esum_(i in S) a i. +Lemma pos_esum_ge0 S f : 0 <= \esum_(i in S) f i. Proof. -move=> a0; rewrite /pos_esum ereal_sup_ubound//. +rewrite /pos_esum ereal_sup_ubound//. by exists set0; [exact: fsets_set0|rewrite fsbig_set0]. Qed. -Lemma pos_esum_fset (F : set T) a : finite_set F -> - (forall i, F i -> 0 <= a i) -> - \esum_(i in F) a i = \sum_(i \in F) a i. +Lemma pos_esum_fset S f : finite_set S -> (forall i, S i -> 0 <= f i) -> + \esum_(i in S) f i = \sum_(i \in S) f i. Proof. -move=> finF f0; apply/eqP; rewrite eq_le; apply/andP; split; last first. - by apply: ereal_sup_ubound; exists F => //; exact: fsets_self. +move=> finS f0; apply/eqP; rewrite eq_le; apply/andP; split; last first. + by apply: ereal_sup_ubound; exists S => //; exact: fsets_self. apply: ge_ereal_sup => /= ? -[F' [finF' F'F] <-]. apply/lee_fsum_nneg_subset => //; first exact/subsetP. by move=> t; rewrite inE/= => /andP[_] /set_mem/f0. Qed. -Lemma pos_esum_set1 t a : 0 <= a t -> \esum_(i in [set t]) a i = a t. +Lemma pos_esum_set1 t f : 0 <= f t -> \esum_(i in [set t]) f i = f t. Proof. by move=> ?; rewrite pos_esum_fset// ?fset_set1// ?fsbig_set1// => t' ->. Qed. @@ -149,36 +145,34 @@ Lemma pos_esum_ge (T1 : choiceType) (I : set T1) (a : T1 -> \bar R) x : x <= \esum_(i in I) a i. Proof. by move=> [X IX /le_trans->//]; apply: ereal_sup_ubound; exists X. Qed. -Lemma le_pos_esum (I : set T) (a b : T -> \bar R) : - (forall i, I i -> a i <= b i) -> - \esum_(i in I) a i <= \esum_(i in I) b i. +Lemma le_pos_esum S f g : (forall i, S i -> f i <= g i) -> + \esum_(i in S) f i <= \esum_(i in S) g i. Proof. -move=> le_ab; rewrite ge_ereal_sup => //= _ [X [finX XI]] <-; rewrite pos_esum_ge//. -by exists X => //; apply: lee_fsum => // t /XI /le_ab. +move=> fg; rewrite ge_ereal_sup => //= _ [X [finX XS]] <-. +by rewrite pos_esum_ge//; exists X => //; apply: lee_fsum => // t /XS /fg. Qed. -Lemma pos_esumZ (A : set T) (a : T -> \bar R) - (c : \bar R) : 0 <= c -> (forall t, A t -> 0 <= a t) -> - \esum_(t in A) c * a t = c * \esum_(t in A) a t. +Lemma pos_esumZ S f (c : \bar R) : 0 <= c -> (forall t, S t -> 0 <= f t) -> + \esum_(t in S) c * f t = c * \esum_(t in S) f t. Proof. -rewrite le_eqVlt => /predU1P[<- _|c0 a0]. +rewrite le_eqVlt => /predU1P[<- _|c0 f0]. by rewrite mul0e pos_esum1// => ? _; rewrite mul0e. apply/eqP; rewrite eq_le; apply/andP; split. - rewrite ge_ereal_sup//= => _ [X [finX XA]] <-. - rewrite -ge0_mule_fsumr; first by move=> t /XA /a0. + rewrite -ge0_mule_fsumr; first by move=> t /XA /f0. by rewrite (lee_wpmul2l (ltW c0))// pos_esum_ge//; exists X. - case: c c0 => [s s0|_|//]. + rewrite -lee_pdivlMl// ge_ereal_sup//= => _ [X [finX XI]] <-. - rewrite lee_pdivlMl// ge0_mule_fsumr//; first by move=> t /XI /a0. + rewrite lee_pdivlMl// ge0_mule_fsumr//; first by move=> t /XI /f0. by rewrite pos_esum_ge//; exists X. - + have : 0 <= \esum_(x in A) a x by apply: pos_esum_ge0 => ? ?; exact: a0. + + have : 0 <= \esum_(x in S) f x by apply: pos_esum_ge0 => ? ?; exact: f0. rewrite [in X in X -> _]le_eqVlt => /predU1P[<-|suma0]. - * by rewrite mule0 pos_esum_ge0// => ? ?; rewrite mule_ge0// a0. + * by rewrite mule0 pos_esum_ge0// => ? ?; rewrite mule_ge0. * rewrite gt0_mulye//. have [y [B fsetsTB yE y0]] := ereal_sup_gt suma0. rewrite leye_eq; apply/eqP/eq_infty => r; rewrite pos_esum_ge//. exists B => //; rewrite -ge0_mule_fsumr//. - by move=> i Bi; rewrite a0//; case: fsetsTB => _ /(_ _ Bi). + by move=> i Bi; rewrite f0//; case: fsetsTB => _ /(_ _ Bi). by rewrite yE gt0_mulye// leey. Qed. @@ -219,8 +213,7 @@ rewrite fsbig_split ?finite_setU//= leeD// lee_fsum_nneg_subset ?finite_setU//=. by move=> /andP[_] /[!inE] /XI/bg0. Qed. -Lemma pos_esum_mkcond (T1 : choiceType) (I : set T1) - (a : T1 -> \bar R) : +Lemma pos_esum_mkcond {T1 : choiceType} (I : set T1) (a : T1 -> \bar R) : \esum_(i in I) a i = \esum_(i in [set: T1]) if i \in I then a i else 0. Proof. apply/eqP; rewrite eq_le !ge_ereal_sup//= => _ [X [finX XI]] <-. @@ -232,8 +225,8 @@ rewrite ereal_sup_ubound//=; exists [set` Y]. by rewrite fsbig_finite// set_fsetK. Qed. -Lemma pos_esum_sum [T1 T2 : choiceType] - (I : set T1) (r : seq T2) (P : pred T2) (a : T1 -> T2 -> \bar R) : +Lemma pos_esum_sum {T1 T2 : choiceType} (I : set T1) (r : seq T2) (P : pred T2) + (a : T1 -> T2 -> \bar R) : (forall i j, I i -> P j -> 0 <= a i j) -> \esum_(i in I) \sum_(j <- r | P j) a i j = \sum_(j <- r | P j) \esum_(i in I) a i j. @@ -247,8 +240,8 @@ rewrite -pos_esumD//; first by move=> i Ii; apply: sume_ge0 => *; apply: a_ge0. by apply: eq_pos_esum => i Ii; rewrite big_cons Pj. Qed. -Lemma pos_esum_esum [T1 T2 : choiceType] - (I : set T1) (J : T1 -> set T2) (a : T1 -> T2 -> \bar R) : +Lemma pos_esum_esum {T1 T2 : choiceType} (I : set T1) (J : T1 -> set T2) + (a : T1 -> T2 -> \bar R) : (forall i j, I i -> J i j -> 0 <= a i j) -> \esum_(i in I) \esum_(j in J i) a i j = \esum_(k in I `*`` J) a k.1 k.2. Proof. @@ -305,17 +298,16 @@ rewrite [in RHS]big_fset_condE/= fsbig_finite//; apply/eq_fbigl => j. by rewrite in_fset_set// !inE/= in_setI in_fset_set//; exact: finite_set_snd. Qed. -Lemma reindex_pos_esum (T1 T' : choiceType) - (P : set T1) (Q : set T') (e : T1 -> T') (a : T' -> \bar R) : - set_bij P Q e -> +Lemma reindex_pos_esum (T1 T2 : choiceType) (P : set T1) (Q : set T2) + (e : T1 -> T2) (a : T2 -> \bar R) : set_bij P Q e -> \esum_(j in Q) a j = \esum_(i in P) a (e i). Proof. elim/choicePpointed: T1 => T1 in e P *. rewrite !emptyE => /Pbij[{}e ->]. by rewrite -[in LHS](image_eq e) image_set0 !pos_esum_set0. -elim/choicePpointed: T' => T' in a e Q *; first by have := no (e point). +elim/choicePpointed: T2 => T2 in a e Q *; first by have := no (e point). move=> /(@pPbij _ _ _)[{}e ->]. -gen have le_esum : T1 T' a P Q e / +gen have le_esum : T1 T2 a P Q e / \esum_(j in Q) a j <= \esum_(i in P) a (e i); last first. apply/eqP; rewrite eq_le le_esum//=. rewrite [leRHS](_ : _ = \esum_(j in Q) a (e (e^-1%FUN j))). @@ -332,39 +324,39 @@ by rewrite -fsbig_finite//; apply: eq_fsbigr=> x /[!inE]/XQ ?; rewrite invK ?inE Qed. End posesum_realType. -Arguments reindex_pos_esum {R T1 T'} P Q e a. +Arguments reindex_pos_esum {R T1 T2} P Q e a. End PosEsum. Section esum. Variables (R : realFieldType) (T : choiceType). -Implicit Types (S : set T) (a g : T -> \bar R). +Implicit Types (S : set T) (f g : T -> \bar R). Import PosEsum. -Definition esum S a := pos_esum S a^\+ - pos_esum S a^\-. +Definition esum S f := pos_esum S f^\+ - pos_esum S f^\-. Local Notation "\esum_ ( i 'in' P ) A" := (esum P (fun i => A)). -Lemma ge0_esum S a : (forall x, S x -> 0 <= a x) -> - \esum_(i in S) a i = ereal_sup [set \sum_(x \in B) a x | B in fsets S]. +Lemma ge0_esum S f : (forall x, S x -> 0 <= f x) -> + \esum_(i in S) f i = ereal_sup [set \sum_(x \in B) f x | B in fsets S]. Proof. -by move=> a0; rewrite /esum ge0_pos_esum_funepos// ge0_pos_esum_funeneg// sube0. +by move=> ?; rewrite /esum ge0_pos_esum_funepos// ge0_pos_esum_funeneg// sube0. Qed. -Lemma esum_set0 a : \esum_(i in set0) a i = 0. +Lemma esum_set0 f : \esum_(i in set0) f i = 0. Proof. by rewrite /esum !pos_esum_set0 subee. Qed. -Lemma esumN A f : (forall x, A x -> 0 <= f x) -> - \esum_(x in A) - f x = - \esum_(i in A) f i. +Lemma esumN S f : (forall x, S x -> 0 <= f x) -> + \esum_(x in S) - f x = - \esum_(i in S) f i. Proof. move=> f0. rewrite [in RHS]ge0_esum// [LHS]/esum [X in X - _ = _]PosEsum.pos_esum1 ?add0r. - by move=> t /mem_set At; rewrite funeposN (@ge0_funenegE _ _ A). + by move=> t /mem_set At; rewrite funeposN (@ge0_funenegE _ _ S). rewrite /PosEsum.pos_esum; congr (- ereal_sup _). -apply: eq_imagel => B AB; apply: eq_fsbigr => x xB. +apply: eq_imagel => B SB; apply: eq_fsbigr => x xB. rewrite funenegN (@ge0_funeposE _ _ B)// => y By; apply: f0. -by case: AB => _; exact. +by case: SB => _; exact. Qed. End esum. @@ -373,91 +365,90 @@ Notation "\esum_ ( i 'in' P ) F" := (esum P (fun i => F)) : ring_scope. Section esum_realType. Variables (R : realType) (T : choiceType). -Implicit Types (a : T -> \bar R). +Implicit Types (S : set T) (f : T -> \bar R). -Lemma le_esum (A : set T) (f g : T -> \bar R) : (forall x, A x -> 0 <= f x) -> - (forall x, A x -> f x <= g x) -> - \esum_(x in A) f x <= \esum_(x in A) g x. +Lemma le_esum S f g : (forall x, S x -> 0 <= f x) -> + (forall x, S x -> f x <= g x) -> + \esum_(x in S) f x <= \esum_(x in S) g x. Proof. -move=> f0 leS; have g0 x : A x -> 0 <= g x. +move=> f0 leS; have g0 x : S x -> 0 <= g x. by move=> /[dup] Ax /leS; apply: le_trans; exact: f0 Ax. by rewrite !ge0_esum// PosEsum.le_pos_esum. Qed. -Lemma esum_ge0 (S : set T) a : - (forall x, S x -> 0 <= a x) -> 0 <= \esum_(i in S) a i. -Proof. by move=> a0; rewrite ge0_esum// PosEsum.pos_esum_ge0. Qed. +Lemma esum_ge0 S f : (forall x, S x -> 0 <= f x) -> 0 <= \esum_(i in S) f i. +Proof. by move=> f0; rewrite ge0_esum// PosEsum.pos_esum_ge0. Qed. -Lemma esum_fset (F : set T) a : finite_set F -> - (forall i, F i -> 0 <= a i) -> - \esum_(i in F) a i = \sum_(i \in F) a i. -Proof. -by move=> finF f0; rewrite ge0_esum//; exact: PosEsum.pos_esum_fset. -Qed. +Lemma esum_fset S f : finite_set S -> (forall i, S i -> 0 <= f i) -> + \esum_(i in S) f i = \sum_(i \in S) f i. +Proof. by move=> finF f0; rewrite ge0_esum//; exact: PosEsum.pos_esum_fset. Qed. End esum_realType. -Lemma esum1 {R : realFieldType} {I : choiceType} (D : set I) (a : I -> \bar R) : - (forall i, D i -> a i = 0) -> \esum_(i in D) a i = 0. +Lemma esum1 {R : realFieldType} {I : choiceType} (D : set I) (f : I -> \bar R) : + (forall i, D i -> f i = 0) -> \esum_(i in D) f i = 0. Proof. move=> a0; rewrite ge0_esum; last exact: PosEsum.pos_esum1. by move=> i /a0 ->. Qed. -Lemma eq_esum {R : realFieldType} {T : choiceType} (I : set T) - (a b : T -> \bar R) : (forall i, I i -> a i = b i) -> - \esum_(i in I) a i = \esum_(i in I) b i. +Lemma eq_esum {R : realFieldType} {T : choiceType} (A : set T) + (f g : T -> \bar R) : (forall i, A i -> f i = g i) -> + \esum_(i in A) f i = \esum_(i in A) g i. Proof. move=> e; congr (_ - _). - by apply: PosEsum.eq_pos_esum => i /set_mem/e abi; rewrite !funeposE abi. - by apply: PosEsum.eq_pos_esum => i /set_mem/e abi; rewrite !funenegE abi. Qed. -Arguments eq_esum {R T} I a b. +Arguments eq_esum {R T} A f g. + +Section esum_cond. +Context {R : realType} {T : choiceType}. +Implicit Types (A B : set T) (f : T -> \bar R). -Lemma esum_mkcond [R : realType] [T : choiceType] (I : set T) - (a : T -> \bar R) : - \esum_(i in I) a i = \esum_(i in [set: T]) if i \in I then a i else 0. +Lemma esum_mkcond A f : + \esum_(i in A) f i = \esum_(i in [set: T]) if i \in A then f i else 0. Proof. rewrite /esum; congr (_ - _); rewrite PosEsum.pos_esum_mkcond; congr PosEsum.pos_esum; apply/funext => x/=. -- by rewrite (funepos_restrict I a). -- by rewrite (funeneg_restrict I a). +- by rewrite funepos_restrict. +- by rewrite funeneg_restrict. Qed. -Lemma esum_mkcondr [R : realType] [T : choiceType] (I J : set T) - (a : T -> \bar R) : - \esum_(i in I `&` J) a i = \esum_(i in I) if i \in J then a i else 0. +Lemma esum_mkcondr A B f : + \esum_(i in A `&` B) f i = \esum_(i in A) if i \in B then f i else 0. Proof. rewrite esum_mkcond [RHS]esum_mkcond; apply: eq_esum=> i _. -by rewrite in_setI; case: (i \in I) (i \in J) => [] []. +by rewrite in_setI; case: (i \in A) (i \in B) => [] []. Qed. -Lemma esum_mkcondl [R : realType] [T : choiceType] (I J : set T) - (a : T -> \bar R) : - \esum_(i in I `&` J) a i = \esum_(i in J) if i \in I then a i else 0. +Lemma esum_mkcondl A B f : + \esum_(i in A `&` B) f i = \esum_(i in B) if i \in A then f i else 0. Proof. rewrite esum_mkcond [RHS]esum_mkcond; apply: eq_esum=> i _. -by rewrite in_setI; case: (i \in I) (i \in J) => [] []. +by rewrite in_setI; case: (i \in A) (i \in B) => [] []. Qed. -Lemma esum_if_eq_op {R : realType} {T : choiceType} (f : T -> \bar R) x : +Lemma esum_if_eq_op f x : \esum_(y in [set: T]) (if x == y then f y else 0) = \esum_(i in [set x]) f i. Proof. rewrite [RHS]esum_mkcond. by under [in RHS]eq_esum do rewrite in_set1 eq_sym. Qed. +End esum_cond. + Section esum_set1. Context {R : realType} {T : choiceType}. +Implicit Types (f : T -> \bar R). -Let ge0_esum_set1 t (a : T -> \bar R) : 0 <= a t -> - \esum_(i in [set t]) a i = a t. +Let ge0_esum_set1 t f : 0 <= f t -> \esum_(i in [set t]) f i = f t. Proof. move=> ?; rewrite ge0_esum; first by move=> x ->. exact: PosEsum.pos_esum_set1. Qed. -Lemma esum_set1 (f : T -> \bar R) x : \esum_(i in [set x]) f i = f x. +Lemma esum_set1 f x : \esum_(i in [set x]) f i = f x. Proof. rewrite /esum. rewrite (PosEsum.eq_pos_esum _ _ (fun y => if x == y then f^\+ y else 0)). @@ -478,6 +469,12 @@ Qed. End esum_set1. +Lemma esum_ge {R : realType} {T : choiceType} (I : set T) (f : T -> \bar R) x : + (forall i, I i -> 0 <= f i) -> + (exists2 X : set T, fsets I X & x <= \sum_(i \in X) f i) -> + x <= \esum_(i in I) f i. +Proof. by move=> f0 If; rewrite ge0_esum// PosEsum.pos_esum_ge. Qed. + Lemma esum_eq0P {R : realType} {T : choiceType} (A : set T) (f : T -> \bar R) : (forall i, A i -> 0 <= f i) -> \esum_(x in A) f x = 0 -> forall x, A x -> f x = 0. @@ -520,58 +517,52 @@ Qed. End esumZ. -Lemma esumD {R : realType} {T : choiceType} (I : set T) (a b : T -> \bar R) : - (forall i, I i -> 0 <= a i) -> (forall i, I i -> 0 <= b i) -> - \esum_(i in I) (a i + b i) = \esum_(i in I) a i + \esum_(i in I) b i. +Lemma esumD {R : realType} {T : choiceType} (I : set T) (f g : T -> \bar R) : + (forall i, I i -> 0 <= f i) -> (forall i, I i -> 0 <= g i) -> + \esum_(i in I) (f i + g i) = \esum_(i in I) f i + \esum_(i in I) g i. Proof. -move=> ag0 bg0. -rewrite ge0_esum//. - by move=> x Ix; rewrite adde_ge0 ?ag0 ?bg0//. +move=> f0 g0; rewrite ge0_esum//; first by move=> *; rewrite adde_ge0 ?f0 ?g0. by do 2 rewrite ge0_esum//; exact: PosEsum.pos_esumD. Qed. -Lemma esumID {R : realType} {I : choiceType} (B A : set I) (F : I -> \bar R) : - (forall i, A i -> F i >= 0) -> - \esum_(i in A) F i = (\esum_(i in A `&` B) F i) + - (\esum_(i in A `&` ~` B) F i). +Lemma esumID {R : realType} {T : choiceType} (B A : set T) (f : T -> \bar R) : + (forall i, A i -> f i >= 0) -> + \esum_(i in A) f i = (\esum_(i in A `&` B) f i) + + (\esum_(i in A `&` ~` B) f i). Proof. -move=> F0; rewrite !esum_mkcondr -esumD; do ?by move=> i /F0; case: ifP. +move=> f0; rewrite !esum_mkcondr -esumD; do ?by move=> i /f0; case: ifP. by apply: eq_esum=> i; rewrite in_setC; case: ifP; rewrite /= (adde0, add0e). Qed. -Arguments esumID {R I}. +Arguments esumID {R T}. Lemma exchange_esum_sum [R : realType] [T1 T2 : choiceType] - (I : set T1) (r : seq T2) (P : pred T2) (a : T1 -> T2 -> \bar R) : - (forall i j, I i -> P j -> 0 <= a i j) -> - \esum_(i in I) \sum_(j <- r | P j) a i j = - \sum_(j <- r | P j) \esum_(i in I) a i j. + (I : set T1) (r : seq T2) (P : pred T2) (f : T1 -> T2 -> \bar R) : + (forall i j, I i -> P j -> 0 <= f i j) -> + \esum_(i in I) \sum_(j <- r | P j) f i j = + \sum_(j <- r | P j) \esum_(i in I) f i j. Proof. -move=> a_ge0. -rewrite ge0_esum; first by move=> x Ix; apply: sume_ge0 => t /a_ge0; exact. -rewrite [LHS]PosEsum.pos_esum_sum//. -apply: eq_bigr => t Pt. -by rewrite ge0_esum// => x /a_ge0; exact. +move=> f0; rewrite ge0_esum; first by move=> *; apply: sume_ge0 => t /f0; exact. +rewrite [LHS]PosEsum.pos_esum_sum//; apply: eq_bigr => t Pt. +by rewrite ge0_esum// => x /f0; exact. Qed. #[deprecated(since="mathcomp-analysis 1.17.0", note="renamed to `exchange_esum_sum`")] Notation esum_sum := exchange_esum_sum (only parsing). Lemma esum_esum [R : realType] [T1 T2 : choiceType] - (I : set T1) (J : T1 -> set T2) (a : T1 -> T2 -> \bar R) : - (forall i j, I i -> J i j -> 0 <= a i j) -> - \esum_(i in I) \esum_(j in J i) a i j = \esum_(k in I `*`` J) a k.1 k.2. + (I : set T1) (J : T1 -> set T2) (f : T1 -> T2 -> \bar R) : + (forall i j, I i -> J i j -> 0 <= f i j) -> + \esum_(i in I) \esum_(j in J i) f i j = \esum_(k in I `*`` J) f k.1 k.2. Proof. -move=> a_ge0. -rewrite [RHS]ge0_esum/=; first by move=> [x y]/= [Ix Jxy]; exact: a_ge0. +move=> f0; rewrite [RHS]ge0_esum/=; first by move=> [x y]/= [Ix Jxy]; exact: f0. rewrite -[RHS]PosEsum.pos_esum_esum// ge0_esum. - by move=> x Ix; rewrite esum_ge0// => t /a_ge0; exact. + by move=> x Ix; rewrite esum_ge0// => t /f0; exact. apply: PosEsum.eq_pos_esum => x Ix. -by rewrite ge0_esum// => t /a_ge0; apply; exact/set_mem. +by rewrite ge0_esum// => t /f0; apply; exact/set_mem. Qed. Lemma lee_sum_fset_nat (R : realDomainType) (f : (\bar R)^nat) (F : {fset nat}) n (P : pred nat) : - (forall i, P i -> 0%E <= f i) -> - [set` F] `<=` `I_n -> + (forall i, P i -> 0%E <= f i) -> [set` F] `<=` `I_n -> \sum_(i <- F | P i) f i <= \sum_(0 <= i < n | P i) f i. Proof. move=> f0 Fn; rewrite [leRHS](bigID (mem F))/=. @@ -586,8 +577,7 @@ Qed. Arguments lee_sum_fset_nat {R f} F n P. Lemma lee_sum_fset_lim (R : realType) (f : (\bar R)^nat) (F : {fset nat}) - (P : pred nat) : - (forall i, P i -> 0%E <= f i) -> + (P : pred nat) : (forall i, P i -> 0%E <= f i) -> \sum_(i <- F | P i) f i <= \sum_(i f0; pose n := (\max_(k <- F) k).+1. @@ -602,40 +592,33 @@ Lemma nneseries_esum (R : realType) (a : nat -> \bar R) (P : pred nat) : (forall n, P n -> 0 <= a n) -> \sum_(i a0. -rewrite ge0_esum//. +move=> a0; rewrite ge0_esum//. apply/eqP; rewrite eq_le; apply/andP; split. - apply: (lime_le (is_cvg_nneseries_cond (fun n _ => a0 n))); apply: nearW => n. +- apply: (lime_le (is_cvg_nneseries_cond (fun n _ => a0 n))); apply: nearW => n. apply: ereal_sup_ubound; exists [set` [fset val i | i in 'I_n & P i]%fset]. split; first exact: finite_fset. by move=> /= k /imfsetP[/= i]; rewrite inE => + ->. rewrite fsbig_finite//= set_fsetK big_imfset/=. by move=> ? ? ? ? /val_inj. by rewrite big_filter big_enum_cond/= big_mkord. -apply: ge_ereal_sup => _ [/= F [finF PF] <-]. -rewrite fsbig_finite//= -(big_rmcond_in P)/=; last exact: lee_sum_fset_lim. -by move=> k; rewrite in_fset_set// inE => /PF ->. +- apply: ge_ereal_sup => _ [/= F [finF PF] <-]. + rewrite fsbig_finite//= -(big_rmcond_in P)/=; last exact: lee_sum_fset_lim. + by move=> k; rewrite in_fset_set// inE => /PF ->. Qed. Lemma nneseries_esumT {R : realType} (a : nat -> \bar R) : (forall n, 0 <= a n) -> \sum_(i a0; rewrite nneseries_esum// set_true. Qed. -Lemma reindex_esum (R : realType) (T T' : choiceType) - (P : set T) (Q : set T') (e : T -> T') (a : T' -> \bar R) : - set_bij P Q e -> +Lemma reindex_esum {R : realType} {T T' : choiceType} (P : set T) (Q : set T') + (e : T -> T') (a : T' -> \bar R) : set_bij P Q e -> \esum_(j in Q) a j = \esum_(i in P) a (e i). Proof. -move=> PQe. -rewrite /esum; congr (_ - _). - rewrite (PosEsum.reindex_pos_esum P Q e)//. - congr PosEsum.pos_esum. - apply/funext => i. - by rewrite !funeposE. -rewrite (PosEsum.reindex_pos_esum P Q e)//. -congr PosEsum.pos_esum. -apply/funext => i. -by rewrite !funenegE. +move=> PQe; rewrite /esum; congr (_ - _). +- rewrite (PosEsum.reindex_pos_esum P Q e)//; congr PosEsum.pos_esum. + by apply/funext => i; rewrite !funeposE. +- rewrite (PosEsum.reindex_pos_esum P Q e)//; congr PosEsum.pos_esum. + by apply/funext => i; rewrite !funenegE. Qed. Arguments reindex_esum {R T T'} P Q e a. @@ -791,8 +774,7 @@ Qed. Lemma summableD D f g : summable D f -> summable D g -> summable D (f \+ g). Proof. move=> Df Dg; apply: le_lt_trans (lte_add_pinfty Df Dg). -rewrite -esumD//. -do 2 rewrite ge0_esum//. +rewrite -esumD//; do 2 rewrite ge0_esum//. by move=> x Dx; rewrite adde_ge0. by apply: PosEsum.le_pos_esum => t Dt; exact: lee_abs_add. Qed. @@ -829,7 +811,7 @@ Section summable_nat. Local Open Scope ereal_scope. Variable R : realType. -Lemma summable_fine_sum r (P : pred nat) (f : nat -> \bar R) : summable P f -> +Lemma summable_fine_sum r (P : pred nat) (f : (\bar R)^nat) : summable P f -> (\sum_(0 <= k < r | P k) fine (f k))%R = fine (\sum_(0 <= k < r | P k) f k). Proof. move=> Pf; elim: r => [|r ih]; first by rewrite !big_nil. @@ -871,7 +853,7 @@ transitivity (lim (EFin \o A_ @ \oo)). by rewrite EFin_lim//; apply: summable_cvg. Qed. -Lemma summable_eseries (f : nat -> \bar R) (P : pred nat) : summable P f -> +Lemma summable_eseries (f : (\bar R)^nat) (P : pred nat) : summable P f -> \sum_(i : (C_ = A_ \- B_)%R. by rewrite distrC; apply: hN; near: n; exists N. Unshelve. all: by end_near. Qed. -Lemma summable_eseries_esum (f : nat -> \bar R) (P : pred nat) : +Lemma summable_eseries_esum (f : (\bar R)^nat) (P : pred nat) : summable P f -> \sum_(i Pfoo. diff --git a/theories/lebesgue_measure.v b/theories/lebesgue_measure.v index d0d190324e..2371ea646d 100644 --- a/theories/lebesgue_measure.v +++ b/theories/lebesgue_measure.v @@ -306,8 +306,8 @@ move=> /(_ _ _ _)/Box[]//=; apply: le_le_trans. rewrite hlength_itv ?lte_fin -?EFinD/= -addrA -opprD. by case: ltP => //; rewrite lee_fin subr_le0. rewrite nneseries_esum//; first by move=> *; rewrite adde_ge0//= ?lee_fin. -rewrite ge0_esum/=; first by move=> n _; rewrite adde_ge0. -rewrite PosEsum.pos_esum_ge//; exists [set` X] => //. +rewrite esum_ge//=; first by move=> n _; rewrite adde_ge0. +exists [set` X] => //. rewrite fsbig_finite// ?set_fsetK//= fsbig_finite//= set_fsetK//. rewrite lee_sum // => i _; rewrite ?AE// !hlength_itv/= ?lte_fin -?EFinD/=. do !case: ifPn => //= ?; do ?by rewrite ?adde_ge0 ?lee_fin// ?subr_ge0// ?ltW. diff --git a/theories/lebesgue_stieltjes_measure.v b/theories/lebesgue_stieltjes_measure.v index 725eb070a6..a99ea011a4 100644 --- a/theories/lebesgue_stieltjes_measure.v +++ b/theories/lebesgue_stieltjes_measure.v @@ -473,8 +473,8 @@ apply: (@le_trans _ _ (\sum_(i <- X) (wlength f `](b i).1, (b i).2]%classic) + rewrite addeC -big_split/=; apply: lee_sum => k _. by rewrite !(EFinB, wlength_itv_bnd)// addeA subeK. rewrite -big_split/= nneseries_esum//; first by move=> k _; rewrite adde_ge0. -rewrite ge0_esum/=; first by move=> n _; rewrite adde_ge0. -rewrite PosEsum.pos_esum_ge//; exists [set` X] => //; rewrite fsbig_finite//= set_fsetK. +rewrite esum_ge//=; first by move=> n _; rewrite adde_ge0. +exists [set` X] => //; rewrite fsbig_finite//= set_fsetK. rewrite big_seq [in X in (_ <= X)%E]big_seq; apply: lee_sum => k kX. by rewrite AE leeD2l// lee_fin lerBlDl natrX De. Qed. diff --git a/theories/measure_theory/measure_function.v b/theories/measure_theory/measure_function.v index b13178ec5c..01b441b15e 100644 --- a/theories/measure_theory/measure_function.v +++ b/theories/measure_theory/measure_function.v @@ -1207,16 +1207,14 @@ rewrite esum_bigcup//. apply: (@trivIset_seqDU _ B) => //; exists y. by split => //; [exact: YBi|exact: YBj]. rewrite nneseries_esumT//. -rewrite ge0_esum/=. - by move=> i _; exact: esum_ge0. -rewrite ge0_esum//. -apply: PosEsum.le_pos_esum => // i _. +apply: le_esum => /=; first by move=> i _; exact: esum_ge0. +move=> // i _. rewrite [leLHS](_ : _ = \sum_(j \in decomp (seqDU B i)) mu j). by rewrite esum_fset//; exact: decomp_finite_set. rewrite -SetRing.Rmu_fin_bigcup//=. - exact: decomp_finite_set. - exact: decomp_triv. - by move=> ?; exact: decomp_measurable. +- exact: decomp_finite_set. +- exact: decomp_triv. +- by move=> ?; exact: decomp_measurable. rewrite -[leRHS]SetRing.RmuE// le_measure//; last by rewrite cover_decomp. - rewrite inE; apply: fin_bigcup_measurable; first exact: decomp_finite_set. move=> j /mem_set jdec; apply: sub_gen_smallest. From b26709cab50a5fecc6a5fc32e82a66eeabc95035 Mon Sep 17 00:00:00 2001 From: Reynald Affeldt Date: Fri, 12 Jun 2026 10:58:43 +0900 Subject: [PATCH 20/21] upd toolbox --- .nix/coq-nix-toolbox.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nix/coq-nix-toolbox.nix b/.nix/coq-nix-toolbox.nix index ff570aeca7..e70ee2f134 100644 --- a/.nix/coq-nix-toolbox.nix +++ b/.nix/coq-nix-toolbox.nix @@ -1 +1 @@ -"6b32b8cd491ec44b75da86fb17e4353f2f102328" +"4a441c50de5618ef066128f9f6f84e6bc13066da" From 4d86e16cc0f96a2c3e4b32b4a2a5900909db6383 Mon Sep 17 00:00:00 2001 From: Reynald Affeldt Date: Fri, 12 Jun 2026 12:35:39 +0900 Subject: [PATCH 21/21] fix --- theories/esum.v | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/theories/esum.v b/theories/esum.v index fda7af005a..94352e3682 100644 --- a/theories/esum.v +++ b/theories/esum.v @@ -493,7 +493,7 @@ Let ge0_esumZ c : 0 <= c -> (forall t, A t -> 0 <= f t) -> Proof. rewrite le_eqVlt => /predU1P[<- _|c0 f0]. by rewrite mul0e esum1// => ? _; rewrite mul0e. -rewrite ge0_esum; first by move=> x /f0 ax0; rewrite ?mule_ge0// ltW. +rewrite [in LHS]ge0_esum; first by move=> x /f0 ax0; rewrite ?mule_ge0// ltW. by rewrite ge0_esum//; apply: PosEsum.pos_esumZ => //; exact: ltW. Qed. @@ -521,7 +521,8 @@ Lemma esumD {R : realType} {T : choiceType} (I : set T) (f g : T -> \bar R) : (forall i, I i -> 0 <= f i) -> (forall i, I i -> 0 <= g i) -> \esum_(i in I) (f i + g i) = \esum_(i in I) f i + \esum_(i in I) g i. Proof. -move=> f0 g0; rewrite ge0_esum//; first by move=> *; rewrite adde_ge0 ?f0 ?g0. +move=> f0 g0; rewrite [in LHS]ge0_esum//. + by move=> *; rewrite adde_ge0 ?f0 ?g0. by do 2 rewrite ge0_esum//; exact: PosEsum.pos_esumD. Qed.