Skip to content

Commit ee12aba

Browse files
affeldt-aisthoheinzollernt6s
authored
gen exp_fun (#876)
* gen exp_fun - rename to power_pow - fix doc - add scope to notation Co-authored-by: Alessandro Bruni <[email protected]> Co-authored-by: Takafumi Saikawa <[email protected]> * add lemma power12_sqrt * additional lemmas * change power_pos so that 0^0=1 - so that power_pos and exprn coincide * measurable_fun exp ln * fix chaneglog * add power_pos_intmul proposed by Pierre * fix changelog --------- Co-authored-by: Alessandro Bruni <[email protected]> Co-authored-by: Takafumi Saikawa <[email protected]> Co-authored-by: Alessandro Bruni <[email protected]>
1 parent 7258033 commit ee12aba

File tree

3 files changed

+173
-35
lines changed

3 files changed

+173
-35
lines changed

CHANGELOG_UNRELEASED.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,27 @@
7070
+ lemmas `eq_bigmax`, `eq_bigmin` changed to respect `P` in the returned type.
7171
- in `measure.v`:
7272
+ generalize `negligible` to `semiRingOfSetsType`
73+
- in `exp.v`:
74+
+ new lemmas `power_pos_ge0`, `power_pos0`, `power_pos_eq0`,
75+
`power_posM`, `power_posAC`, `power12_sqrt`, `power_pos_inv1`,
76+
`power_pos_inv`, `power_pos_intmul`
77+
- in `lebesgue_measure.v`:
78+
+ lemmas `measurable_fun_ln`, `measurable_fun_power_pos`
79+
80+
### Changed
81+
82+
- in `exp.v`:
83+
+ generalize `exp_fun` and rename to `power_pos`
84+
+ `exp_fun_gt0` has now a condition and is renamed to `power_pos_gt0`
85+
+ remove condition of `exp_funr0` and rename to `power_posr0`
86+
+ weaken condition of `exp_funr1` and rename to `power_posr1`
87+
+ weaken condition of `exp_fun_inv` and rename to `power_pos_inv`
88+
+ `exp_fun1` -> `power_pos1`
89+
+ rename `ler_exp_fun` to `ler_power_pos`
90+
+ `exp_funD` -> `power_posD`
91+
+ weaken condition of `exp_fun_mulrn` and rename to `power_pos_mulrn`
92+
+ the notation ``` `^ ``` has now scope `real_scope`
93+
+ weaken condition of `riemannR_gt0` and `dvg_riemannR`
7394

7495
### Renamed
7596

theories/exp.v

Lines changed: 120 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Require Import signed topology normedtype landau sequences derive realfun.
1919
(* pseries_diffs f i == (i + 1) * f (i + 1) *)
2020
(* *)
2121
(* ln x == the natural logarithm *)
22-
(* a `^ x == exponential functions *)
22+
(* a `^ x == power function (assumes a >= 0) *)
2323
(* riemannR a == sequence n |-> 1 / (n.+1) `^ a where a has a type *)
2424
(* of type realType *)
2525
(* *)
@@ -572,68 +572,155 @@ Unshelve. all: by end_near. Qed.
572572

573573
End Ln.
574574

575-
Section ExpFun.
575+
Section PowerPos.
576576
Variable R : realType.
577577
Implicit Types a x : R.
578578

579-
Definition exp_fun a x := expR (x * ln a).
579+
Definition power_pos a x :=
580+
if a == 0 then (x == 0)%:R else expR (x * ln a).
580581

581-
Local Notation "a `^ x" := (exp_fun a x).
582+
Local Notation "a `^ x" := (power_pos a x).
582583

583-
Lemma exp_fun_gt0 a x : 0 < a `^ x. Proof. by rewrite expR_gt0. Qed.
584+
Lemma power_pos_ge0 a x : 0 <= a `^ x.
585+
Proof. by rewrite /power_pos; case: ifPn => // _; exact: expR_ge0. Qed.
584586

585-
Lemma exp_funr1 a : 0 < a -> a `^ 1 = a.
586-
Proof. by move=> a0; rewrite /exp_fun mul1r lnK. Qed.
587+
Lemma power_pos_gt0 a x : 0 < a -> 0 < a `^ x.
588+
Proof. by move=> a0; rewrite /power_pos gt_eqF// expR_gt0. Qed.
587589

588-
Lemma exp_funr0 a : 0 < a -> a `^ 0 = 1.
589-
Proof. by move=> a0; rewrite /exp_fun mul0r expR0. Qed.
590+
Lemma power_posr1 a : 0 <= a -> a `^ 1 = a.
591+
Proof.
592+
move=> a0; rewrite /power_pos; case: ifPn => [/eqP->|a0'].
593+
by rewrite oner_eq0.
594+
by rewrite mul1r lnK// posrE lt_neqAle eq_sym a0'.
595+
Qed.
596+
597+
Lemma power_posr0 a : a `^ 0 = 1.
598+
Proof.
599+
by rewrite /power_pos; case: ifPn; rewrite ?eqxx// mul0r expR0.
600+
Qed.
601+
602+
Lemma power_pos0 x : power_pos 0 x = (x == 0)%:R.
603+
Proof. by rewrite /power_pos eqxx. Qed.
604+
605+
Lemma power_pos1 : power_pos 1 = fun=> 1.
606+
Proof. by apply/funext => x; rewrite /power_pos oner_eq0 ln1 mulr0 expR0. Qed.
590607

591-
Lemma exp_fun1 : exp_fun 1 = fun=> 1.
592-
Proof. by rewrite funeqE => x; rewrite /exp_fun ln1 mulr0 expR0. Qed.
608+
Lemma power_pos_eq0 x p : x `^ p = 0 -> x = 0.
609+
Proof.
610+
rewrite /power_pos. have [->|_] := eqVneq x 0 => //.
611+
by move: (expR_gt0 (p * ln x)) => /gt_eqF /eqP.
612+
Qed.
593613

594-
Lemma ler_exp_fun a : 1 < a -> {homo exp_fun a : x y / x <= y}.
595-
Proof. by move=> a1 x y xy; rewrite /exp_fun ler_expR ler_pmul2r // ln_gt0. Qed.
614+
Lemma ler_power_pos a : 1 < a -> {homo power_pos a : x y / x <= y}.
615+
Proof.
616+
move=> a1 x y xy.
617+
by rewrite /power_pos gt_eqF ?(le_lt_trans _ a1)// ler_expR ler_pmul2r// ln_gt0.
618+
Qed.
596619

597-
Lemma exp_funD a : 0 < a -> {morph exp_fun a : x y / x + y >-> x * y}.
598-
Proof. by move=> a0 x y; rewrite [in LHS]/exp_fun mulrDl expRD. Qed.
620+
Lemma power_posM x y r : 0 <= x -> 0 <= y -> (x * y) `^ r = x `^ r * y `^ r.
621+
Proof.
622+
rewrite 2!le_eqVlt.
623+
move=> /predU1P[<-|x0] /predU1P[<-|y0]; rewrite ?(mulr0, mul0r,power_pos0).
624+
- by rewrite -natrM; case: eqP.
625+
- by case: eqP => [->|]/=; rewrite ?mul0r ?power_posr0 ?mulr1.
626+
- by case: eqP => [->|]/=; rewrite ?mulr0 ?power_posr0 ?mulr1.
627+
- rewrite /power_pos mulf_eq0; case: eqP => [->|x0']/=.
628+
rewrite (@gt_eqF _ _ y)//.
629+
by case: eqP => /=; rewrite ?mul0r ?mul1r// => ->; rewrite mul0r expR0.
630+
by rewrite gt_eqF// lnM ?posrE // -expRD mulrDr.
631+
Qed.
599632

600-
Lemma exp_fun_inv a : 0 < a -> a `^ (-1) = a ^-1.
633+
Lemma power_posAC x y z : (x `^ y) `^ z = (x `^ z) `^ y.
601634
Proof.
602-
move=> a0.
635+
rewrite /power_pos.
636+
have [->/=|z0] := eqVneq z 0; rewrite ?mul0r.
637+
- have [->/=|y0] := eqVneq y 0; rewrite ?mul0r//=.
638+
have [x0|x0] := eqVneq x 0; rewrite ?eqxx ?oner_eq0 ?ln1 ?mulr0 ?expR0//.
639+
by rewrite oner_eq0 if_same ln1 mulr0 expR0.
640+
- have [->/=|y0] := eqVneq y 0; rewrite ?mul0r/=.
641+
have [x0|x0] := eqVneq x 0; rewrite ?eqxx ?oner_eq0 ?ln1 ?mulr0 ?expR0//.
642+
by rewrite oner_eq0 if_same ln1 mulr0 expR0.
643+
have [x0|x0] := eqVneq x 0; rewrite ?eqxx ?oner_eq0 ?ln1 ?mulr0 ?expR0.
644+
by [].
645+
rewrite gt_eqF ?expR_gt0// gt_eqF; last by rewrite expR_gt0.
646+
by rewrite !expK mulrCA.
647+
Qed.
648+
649+
Lemma power_posD a : 0 < a -> {morph power_pos a : x y / x + y >-> x * y}.
650+
Proof. by move=> a0 x y; rewrite /power_pos gt_eqF// mulrDl expRD. Qed.
651+
652+
Lemma power_pos_mulrn a n : 0 <= a -> a `^ n%:R = a ^+ n.
653+
Proof.
654+
move=> a0; elim: n => [|n ih].
655+
by rewrite mulr0n expr0 power_posr0//; apply: lt0r_neq0.
656+
move: a0; rewrite le_eqVlt => /predU1P[<-|a0].
657+
by rewrite !power_pos0 mulrn_eq0/= oner_eq0/= expr0n.
658+
by rewrite -natr1 power_posD// ih power_posr1// ?exprS 1?mulrC// ltW.
659+
Qed.
660+
661+
Lemma power_pos_inv1 a : 0 <= a -> a `^ (-1) = a ^-1.
662+
Proof.
663+
rewrite le_eqVlt => /predU1P[<-|a0].
664+
by rewrite power_pos0 invr0 oppr_eq0 oner_eq0.
603665
apply/(@mulrI _ a); first by rewrite unitfE gt_eqF.
604-
rewrite -[X in X * _ = _](exp_funr1 a0) -exp_funD // subrr exp_funr0 //.
605-
by rewrite divrr // unitfE gt_eqF.
666+
rewrite -[X in X * _ = _](power_posr1 (ltW a0)) -power_posD // subrr.
667+
by rewrite power_posr0 divff// gt_eqF.
606668
Qed.
607669

608-
Lemma exp_fun_mulrn a n : 0 < a -> exp_fun a n%:R = a ^+ n.
670+
Lemma power_pos_inv a n : 0 <= a -> a `^ (- n%:R) = a ^- n.
609671
Proof.
610-
move=> a0; elim: n => [|n ih]; first by rewrite mulr0n expr0 exp_funr0.
611-
by rewrite -natr1 exprSr exp_funD// ih exp_funr1.
672+
move=> a0; elim: n => [|n ih].
673+
by rewrite -mulNrn mulr0n power_posr0 -exprVn expr0.
674+
move: a0; rewrite le_eqVlt => /predU1P[<-|a0].
675+
by rewrite power_pos0 oppr_eq0 mulrn_eq0 oner_eq0 orbF exprnN exp0rz oppr_eq0.
676+
rewrite -natr1 opprD power_posD// (power_pos_inv1 (ltW a0)) ih.
677+
by rewrite -[in RHS]exprVn exprS [in RHS]mulrC exprVn.
612678
Qed.
613679

614-
End ExpFun.
615-
Notation "a `^ x" := (exp_fun a x).
680+
Lemma power_pos_intmul a (z : int) : 0 <= a -> a `^ z%:~R = a ^ z.
681+
Proof.
682+
move=> a0; have [z0|z0] := leP 0 z.
683+
rewrite -[in RHS](gez0_abs z0) abszE -exprnP -power_pos_mulrn//.
684+
by rewrite natr_absz -abszE gez0_abs.
685+
rewrite -(opprK z) (_ : - z = `|z|%N); last by rewrite ltz0_abs.
686+
by rewrite -exprnN -power_pos_inv// nmulrn.
687+
Qed.
688+
689+
Lemma power12_sqrt a : 0 <= a -> a `^ (2^-1) = Num.sqrt a.
690+
Proof.
691+
rewrite le_eqVlt => /predU1P[<-|a0].
692+
by rewrite power_pos0 sqrtr0 invr_eq0 pnatr_eq0.
693+
have /eqP : (a `^ (2^-1)) ^+ 2 = (Num.sqrt a) ^+ 2.
694+
rewrite sqr_sqrtr; last exact: ltW.
695+
by rewrite /power_pos gt_eqF// -expRMm mulrA divrr ?mul1r ?unitfE// lnK.
696+
rewrite eqf_sqr => /predU1P[//|/eqP h].
697+
have : 0 < a `^ 2^-1 by apply: power_pos_gt0.
698+
by rewrite h oppr_gt0 ltNge sqrtr_ge0.
699+
Qed.
700+
701+
End PowerPos.
702+
Notation "a `^ x" := (power_pos a x) : real_scope.
616703

617704
Section riemannR_series.
618705
Variable R : realType.
619706
Implicit Types a : R.
620-
Local Open Scope ring_scope.
707+
Local Open Scope real_scope.
621708

622709
Definition riemannR a : R ^nat := fun n => (n.+1%:R `^ a)^-1.
623710
Arguments riemannR a n /.
624711

625-
Lemma riemannR_gt0 a i : 0 < a -> 0 < riemannR a i.
626-
Proof. move=> ?; by rewrite /riemannR invr_gt0 exp_fun_gt0. Qed.
712+
Lemma riemannR_gt0 a i : 0 <= a -> 0 < riemannR a i.
713+
Proof. by move=> ?; rewrite /riemannR invr_gt0 power_pos_gt0. Qed.
627714

628-
Lemma dvg_riemannR a : 0 < a <= 1 -> ~ cvg (series (riemannR a)).
715+
Lemma dvg_riemannR a : 0 <= a <= 1 -> ~ cvg (series (riemannR a)).
629716
Proof.
630-
case/andP => a0; rewrite le_eqVlt => /orP[/eqP ->|a1].
717+
case/andP => a0; rewrite le_eqVlt => /predU1P[->|a1].
631718
rewrite (_ : riemannR 1 = harmonic); first exact: dvg_harmonic.
632-
by rewrite funeqE => i /=; rewrite exp_funr1.
719+
by rewrite funeqE => i /=; rewrite power_posr1.
633720
have : forall n, harmonic n <= riemannR a n.
634-
case=> /= [|n]; first by rewrite exp_fun1 invr1.
635-
rewrite -[leRHS]div1r ler_pdivl_mulr ?exp_fun_gt0 // mulrC ler_pdivr_mulr //.
636-
by rewrite mul1r -[leRHS]exp_funr1 // (ler_exp_fun) // ?ltr1n // ltW.
721+
case=> /= [|n]; first by rewrite power_pos1 invr1.
722+
rewrite -[leRHS]div1r ler_pdivl_mulr ?power_pos_gt0 // mulrC ler_pdivr_mulr //.
723+
by rewrite mul1r -[leRHS]power_posr1 // (ler_power_pos) // ?ltr1n // ltW.
637724
move/(series_le_cvg harmonic_ge0 (fun i => ltW (riemannR_gt0 i a0))).
638725
by move/contra_not; apply; exact: dvg_harmonic.
639726
Qed.

theories/lebesgue_measure.v

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ From mathcomp.classical Require Import boolp classical_sets functions.
55
From mathcomp.classical Require Import cardinality fsbigop mathcomp_extra.
66
Require Import reals ereal signed topology numfun normedtype.
77
From HB Require Import structures.
8-
Require Import sequences esum measure real_interval realfun.
8+
Require Import sequences esum measure real_interval realfun exp.
99

1010
(******************************************************************************)
1111
(* Lebesgue Measure *)
@@ -1630,7 +1630,7 @@ rewrite -(addrA (f x * g x *+ 2)) -opprB opprK (addrC (g x ^+ 2)) addrK.
16301630
by rewrite -(mulr_natr (f x * g x)) -(mulrC 2) mulrA mulVr ?mul1r// unitfE.
16311631
Qed.
16321632

1633-
Lemma measurable_fun_max D f g :
1633+
Lemma measurable_fun_max D f g :
16341634
measurable_fun D f -> measurable_fun D g -> measurable_fun D (f \max g).
16351635
Proof.
16361636
move=> mf mg mD; apply (measurability (RGenCInfty.measurableE R)) => //.
@@ -1700,6 +1700,36 @@ Qed.
17001700

17011701
End measurable_fun_realType.
17021702

1703+
Lemma measurable_fun_ln (R : realType) : measurable_fun [set~ (0:R)] (@ln R).
1704+
Proof.
1705+
rewrite (_ : [set~ 0] = `]-oo, 0[ `|` `]0, +oo[); last first.
1706+
by rewrite -(setCitv `[0, 0]); apply/seteqP; split => [|]x/=;
1707+
rewrite in_itv/= -eq_le eq_sym; [move/eqP/negbTE => ->|move/negP/eqP].
1708+
apply/measurable_funU; [exact: measurable_itv|exact: measurable_itv|split].
1709+
- apply/(@measurable_restrict _ _ _ _ _ setT)=> //; first exact: measurable_itv.
1710+
rewrite (_ : _ \_ _ = cst (0:R)); first exact: measurable_fun_cst.
1711+
apply/funext => y; rewrite patchE.
1712+
by case: ifPn => //; rewrite inE/= in_itv/= => y0; rewrite ln0// ltW.
1713+
- have : {in `]0, +oo[%classic, continuous (@ln R)}.
1714+
by move=> x; rewrite inE/= in_itv/= andbT => x0; exact: continuous_ln.
1715+
rewrite -continuous_open_subspace; last exact: interval_open.
1716+
by move/subspace_continuous_measurable_fun; apply; exact: measurable_itv.
1717+
Qed.
1718+
1719+
Lemma measurable_fun_power_pos (R : realType) p :
1720+
measurable_fun [set: R] (@power_pos R ^~ p).
1721+
Proof.
1722+
apply: measurable_fun_if => //.
1723+
- apply: (measurable_fun_bool true); rewrite (_ : _ @^-1` _ = [set 0])//.
1724+
by apply/seteqP; split => [_ /eqP ->//|_ -> /=]; rewrite eqxx.
1725+
- exact: measurable_fun_cst.
1726+
- rewrite setTI; apply: (@measurable_fun_comp _ _ _ _ _ _ setT) => //.
1727+
by apply: continuous_measurable_fun; exact: continuous_expR.
1728+
rewrite (_ : _ @^-1` _ = [set~ 0]); last first.
1729+
by apply/seteqP; split => [x [/negP/negP/eqP]|x x0]//=; exact/negbTE/eqP.
1730+
by apply: measurable_funrM; exact: measurable_fun_ln.
1731+
Qed.
1732+
17031733
Section standard_emeasurable_fun.
17041734
Variable R : realType.
17051735

0 commit comments

Comments
 (0)