Newer
Older
(**
This file is part of the Elfic library
Copyright (C) Boldo, Clément, Faissole, Martin, Mayero
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
COPYING file for more details.
*)
(** This file is still WIP... *)
From Coq Require Import Reals.
From Coquelicot Require Import Coquelicot.
Require Import Rbar_compl sum_Rbar_nonneg.
Require Import sigma_algebra sigma_algebra_R_Rbar.
Require Import measurable_fun measure.
Require Import simpl_fun LInt_p.
Require Import Bi_fun BInt_Bif BInt_LInt_p BInt_R.
Hypothesis Einhab : inhabited E.
Context {gen : (E -> Prop) -> Prop}.
(* QUESTION: R_max or Rbar_max ?? *)
(* have both probably... *)
fun (f : E -> Rbar) (x : E) => Rbar_max 0 (Rbar_opp (f x)).
Lemma sum_nonneg_nonpos_part :
forall f x, f x = Rbar_minus (nonneg_part f x) (nonpos_part f x).
Proof.
intros f x.
case (Rbar_le_lt_dec 0 (f x)); intros H.
rewrite Rbar_max_right; try easy.
rewrite Rbar_max_left; try easy.
unfold Rbar_minus; simpl.
now rewrite Ropp_0, Rbar_plus_0_r.
replace (Finite 0) with (Rbar_opp 0).
apply Rbar_opp_le; easy.
simpl; f_equal; ring.
rewrite Rbar_max_left.
2: apply Rbar_lt_le; easy.
rewrite Rbar_max_right.
unfold Rbar_minus; rewrite Rbar_plus_0_l.
rewrite Rbar_opp_involutive; easy.
replace (Finite 0) with (Rbar_opp 0).
apply Rbar_opp_le; try easy.
apply Rbar_lt_le; easy.
simpl; f_equal; ring.
Qed.
Lemma nonneg_nonneg_part :
forall f, nonneg (nonneg_part f).
case (f x); simpl; try easy.
intros t; apply Rmax_l.
apply Rle_refl.
Qed.
Lemma nonneg_nonpos_part :
forall f, nonneg (nonpos_part f).
case (f x); simpl; try easy.
intros t; apply Rmax_l.
apply Rle_refl.
Qed.
Lemma sum_nonneg_nonpos_part_abs :
forall f x, Rbar_abs (f x) = Rbar_plus (nonneg_part f x) (nonpos_part f x).
Proof.
intros f x.
case (Rbar_le_lt_dec 0 (f x)); intros H.
rewrite Rbar_max_right; try easy.
rewrite Rbar_max_left; try easy.
rewrite Rbar_plus_0_r.
apply Rbar_abs_pos; easy.
replace (Finite 0) with (Rbar_opp 0).
apply Rbar_opp_le; easy.
simpl; f_equal; ring.
rewrite Rbar_max_left.
2: apply Rbar_lt_le; easy.
rewrite Rbar_max_right.
unfold Rbar_minus; rewrite Rbar_plus_0_l.
apply Rbar_abs_neg.
apply Rbar_lt_le; easy.
replace (Finite 0) with (Rbar_opp 0).
apply Rbar_opp_le; try easy.
apply Rbar_lt_le; easy.
simpl; f_equal; ring.
Qed.
let f_p := nonneg_part f in
let f_m := nonpos_part f in
measurable_fun gen gen_R f /\
is_finite (LInt_p mu f_p) /\ is_finite (LInt_p mu f_m).
Definition LInt : (E -> R) -> R :=
fun f =>
let f_p := nonneg_part f in
let f_m := nonpos_part f in
Lemma LInt_ext : forall f g,
(forall x, f x = g x) ->
LInt f = LInt g.
Proof.
intros f g H.
unfold LInt, nonneg_part, nonpos_part; f_equal; f_equal.
apply LInt_p_ext; intros x; rewrite H; easy.
apply LInt_p_ext; intros x; rewrite H; easy.
Qed.
intros f H; unfold LInt, nonneg_part, nonpos_part.
replace (real (LInt_p mu (fun x : E => Rbar_max 0 (Rbar_opp (f x))))) with 0%R.
unfold Rbar_minus; simpl (Rbar_opp 0).
rewrite Ropp_0, Rbar_plus_0_r.
apply LInt_p_ext.
intros x; apply Rbar_max_right; apply H.
rewrite <- (LInt_p_0 Einhab mu) at 1.
apply LInt_p_ext.
intros x.
apply sym_eq, Rbar_max_left.
replace (Finite 0) with (Rbar_opp (Finite 0)).
apply <- Rbar_opp_le; apply H.
simpl; f_equal; ring.*)
(measurable_fun gen gen_R f /\
is_finite (LInt_p mu (fun t => Rabs (f t)))).
intros f; split.
assert (H4: measurable_fun_Rbar gen (fun x : E => Finite (f x))).
apply measurable_fun_composition with (2:=measurable_fun_Finite); easy.
2: intros x; apply trans_eq with (Rbar_abs (f x)); [easy|idtac].
2: rewrite (sum_nonneg_nonpos_part_abs f x); easy.
rewrite LInt_p_plus; try easy.
rewrite <- H2, <- H3; easy.
apply measurable_fun_fm; easy.
(* *)
intros (H1,H2); split; try easy; split.
eapply Rbar_bounded_is_finite.
2: easy.
2: exact H2.
apply LInt_p_monotone; try easy.
intros x; replace (Finite (Rabs (f x))) with (Rbar_abs (f x)) by easy.
rewrite (sum_nonneg_nonpos_part_abs f x).
rewrite <- (Rbar_plus_0_r (nonneg_part f x)) at 1.
2: easy.
2: exact H2.
apply LInt_p_monotone; try easy.
intros x; replace (Finite (Rabs (f x))) with (Rbar_abs (f x)) by easy.
rewrite (sum_nonneg_nonpos_part_abs f x).
rewrite <- (Rbar_plus_0_l (nonpos_part f x)) at 1.
Qed.
Lemma Bif_measurable : forall (f : E -> R),
Proof.
intros f bf.
generalize (measurable_Bif bf).
unfold fun_Bif, measurable_fun_R.
intros H A HA.
apply H.
apply measurable_R_equiv_oo; easy.
Qed.
Lemma Bif_ex_LInt : forall (f : E -> R),
forall (bf : Bif mu f),
ex_LInt f.
Proof.
intros f bf.
apply ex_LInt_equiv_abs.
split.
apply Bif_measurable; easy.
(* *)
generalize bf.
destruct bf; intros bf.
destruct (proj2 (ax_lim_l1 (mkposreal _ Rlt_0_1))) as (N,HN).
simpl in HN; rewrite Rplus_0_l in HN.
eapply Rbar_bounded_is_finite.
intros t; simpl; apply Rabs_pos.
2: easy.
eapply LInt_p_monotone.
intros t.
replace (Finite (Rabs (f t))) with (Rbar_abs (Finite (f t))) by easy.
(Rbar_plus (Rbar_minus (f t) (seq N t)) (seq N t)).
2: apply sym_eq, Rbar_plus_minus_r; easy.
eapply Rbar_le_trans with (1:= Rbar_abs_triang _ _).
apply Rbar_le_refl.
rewrite LInt_p_plus; try easy;
try (intros t; apply Rbar_abs_ge_0).
Rbar_abs (Rbar_minus (f x) (seq N x)))))).
apply Rbar_bounded_is_finite with 0 1; try easy.
replace (LInt_p mu (fun x =>
Rbar_abs (Rbar_minus (f x) (seq N x)))) with (LInt_p mu
(fun x => (‖ f - seq N ‖)%fn x)); try easy.
apply HN; auto with arith.
apply LInt_p_ext; intros t.
unfold fun_norm, norm; simpl.
unfold abs; simpl; f_equal; f_equal.
unfold fun_plus, fun_scal, opp; simpl.
unfold plus, scal, mult, one; simpl.
unfold mult; simpl; ring.
assert (T2: is_finite ((LInt_p mu (fun x => Rbar_abs (seq N x))))).
generalize (integrable_sf_norm (ax_int N)).
intros K; generalize (Bif_integrable_sf ax_notempty K).
intros K'; generalize (is_finite_LInt_p_Bif K').
unfold fun_Bif, fun_norm.
intros Y.
erewrite LInt_p_ext.
apply Y.
intros x; case (seq N); simpl; intros.
apply norm_ge_0.
intros x; simpl; f_equal.
generalize (fun_sf_norm (seq N) x).
(* *)
split.
intros x; apply Rbar_abs_ge_0.
apply measurable_fun_abs.
apply measurable_fun_plus.
apply measurable_fun_R_Rbar.
apply Bif_measurable; easy.
apply measurable_fun_opp.
apply measurable_fun_R_Rbar.
apply Bif_measurable.
apply Bif_integrable_sf; easy.
intros t; easy.
split.
intros x; apply Rbar_abs_ge_0.
apply measurable_fun_abs.
apply measurable_fun_R_Rbar.
apply Bif_measurable.
Lemma ex_LInt_Bif : forall (f : E -> R),
ex_LInt f -> Bif mu f.
Proof.
intros f H1.
assert (H2: measurable_fun gen gen_R f
/\ is_finite
(LInt_p mu
(fun t : E => Rabs (f t)))).
apply ex_LInt_equiv_abs; try easy.
destruct H2 as (H2,H3).
apply R_Bif; try easy.
apply measurable_fun_gen_ext2 with (gen_R); try easy.
intros A HA; apply measurable_R_equiv_oo.
apply measurable_gen; easy.
intros A HA; apply measurable_R_equiv_oo.
apply measurable_gen; easy.
Qed.
(*
forall t, sfp t = nonneg_part (fun_sf sf) t }.
Proof.
intros sf; destruct sf; simpl.
pose (valp := fun n => Rmax 0 (val n)).
assert (T1: valp max_which = zero).
unfold valp; rewrite ax_val_max_which; simpl.
rewrite Rmax_left; try easy.
simpl; apply Rle_refl.
exists (mk_simpl_fun which valp max_which T1 ax_which_max_which ax_measurable).
simpl; easy.
Qed.
*)
Lemma Bif_fp : forall (f: E -> R),
forall bf : Bif mu f, Bif mu (fun t => real (nonneg_part f t)).
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
Proof.
intros f bf.
apply R_Bif; try easy.
apply measurable_fun_gen_ext2 with (gen_R).
intros A HA; apply measurable_R_equiv_oo.
apply measurable_gen; easy.
intros A HA; apply measurable_R_equiv_oo.
apply measurable_gen; easy.
apply measurable_fun_composition with (2:=measurable_fun_real).
apply measurable_fun_fp.
apply measurable_fun_R_Rbar.
apply Bif_measurable; easy.
(* *)
erewrite LInt_p_ext.
generalize (Bif_ex_LInt f bf); intros (H1,(H2,H3)).
apply H2.
intros t; unfold fun_norm, norm; simpl.
unfold abs; simpl.
rewrite Rabs_pos_eq; try easy.
apply Rmax_l.
Qed.
(* à déplacer pour avoir le type X -> E *)
Lemma Bif_ext : forall (f g:E->R),
(forall t:E, f t = g t) -> Bif mu f -> Bif mu g.
Proof.
intros f g H1 H2.
destruct H2.
eexists seq; try easy.
intros x; rewrite <- H1; easy.

François Clément
committed
apply is_LimSup_seq_Rbar_ext with (2:=ax_lim_l1).
intros n; apply LInt_p_ext.
intros x; unfold fun_norm, fun_plus.
rewrite H1; easy.
Qed.
Lemma Bif_fm : forall (f: E -> R),
forall bf : Bif mu f, Bif mu (fun t => real (nonpos_part f t)).
Proof.
intros f bf.
assert (Y1 : Bif mu (-f)%fn).
apply Bif_ext with (2:=Bif_scal (-1) bf).
intros t; easy.
apply Bif_ext with (2:=Bif_plus Y1 (Bif_fp f bf)).
intros t; unfold fun_plus, fun_scal, plus; simpl.
unfold scal, opp, one; simpl.
replace (f t) with (real (Finite (f t))) at 1; try easy.
rewrite (sum_nonneg_nonpos_part f t); simpl.
unfold mult; simpl; ring.
Qed.
Lemma BInt_LInt_eq : forall (f : E -> R),
forall bf : Bif mu f,
BInt bf = LInt f.
Proof.
intros f bf; unfold LInt.
generalize (Bif_fp f bf); intros B1.
generalize (Bif_fm f bf); intros B2.
rewrite (BInt_ext _ ((B1-B2)%Bif)).
2: intros t.
2: replace (f t) with (real (Finite (f t))) at 1; try easy.
2: rewrite (sum_nonneg_nonpos_part f t); simpl.
2: unfold fun_plus, fun_scal, one, scal, plus, opp, mult; simpl.
2: unfold mult; simpl; ring.
rewrite BInt_minus.
generalize (Bif_ex_LInt f bf); intros (T1,(T2,T3)).
rewrite <- T2, <- T3; simpl.
unfold plus, Rminus; simpl; f_equal.
apply BInt_LInt_p_eq.
unfold fun_Bif; intros t.
apply Rmax_l.
unfold opp; simpl; f_equal.
apply BInt_LInt_p_eq.
unfold fun_Bif; intros t.
apply Rmax_l.
Qed.
Lemma ex_LInt_plus :
ex_LInt f -> ex_LInt g
-> ex_LInt (fun t => f t + g t).
Proof.
intros f g Hf Hg.
generalize (ex_LInt_Bif f Hf); intros bf.
generalize (ex_LInt_Bif g Hg); intros bg.
apply Bif_ex_LInt.
apply Bif_ext with (2:=Bif_plus bf bg); easy.
Qed.
Lemma LInt_plus : forall (f g : E -> R),
ex_LInt f -> ex_LInt g ->
= LInt (fun t => f t + g t).
Proof.
intros f g Hf Hg.
generalize (ex_LInt_Bif f Hf); intros bf.
generalize (ex_LInt_Bif g Hg); intros bg.
rewrite <- BInt_LInt_eq with f bf.
rewrite <- BInt_LInt_eq with g bg.
apply trans_eq with (plus (BInt bf)%Bif (BInt bg)%Bif).
unfold plus; simpl; easy.
rewrite <- BInt_plus.
rewrite BInt_LInt_eq.
f_equal; apply LInt_ext.
Qed.
(** EO Link with Bif *)
Lemma LInt_dominated_convergence :
forall f: nat -> E -> R, forall (g:E->R),
(forall n, measurable_fun_R gen (f n)) ->
(forall x, ex_lim_seq (fun n => f n x)) ->
ex_LInt g ->
(forall n x, (Rabs (f n x) <= g x)%R) ->
let lim_f := fun x => Lim_seq (fun n => f n x) in
(forall t, is_finite (lim_f t)) /\
ex_LInt lim_f /\
is_lim_seq (fun n => LInt (f n)) (LInt lim_f).
(* MANQUE que f n est ex_LInt aussi *)
Proof.
(* preuve par Bochner
pas très élégante pour cause de convergences *)
(* existence d'une preuve plus simple par LInt_p_dominated_convergence *)
intros f g H1 H2 H3 H4 lim_f.
assert (K: forall t, is_finite (lim_f t)).
intros t.
apply Rbar_bounded_is_finite with (- g t) (g t); try easy.
rewrite <- Lim_seq_const.
apply Lim_seq_le_loc.
exists 0%nat; intros n _.
apply (Raux.Rabs_le_inv (f n t) (g t)); easy.
rewrite <- Lim_seq_const.
apply Lim_seq_le_loc.
exists 0%nat; intros n _.
apply (Raux.Rabs_le_inv (f n t) (g t)); easy.
(* . *)
assert (bf : forall n : nat, Bif mu (f n)).
intros n.
apply ex_LInt_Bif.
apply ex_LInt_equiv_abs.
split.
apply H1.
assert (H5: forall x : E,
series.is_lim_seq (fun n : nat => f n x)
((fun x0 : E => real (lim_f x0)) x)).
intros x.
generalize (Lim_seq_correct _ (H2 x)).
fold (lim_f x); rewrite <- K; easy.
destruct (BInt_dominated_convergence bf lim_f H5 g)
as (Bl,HBl); try easy.
apply H3.
(* *)
split; try easy.
assert (H6: ex_LInt (fun x : E => real (lim_f x))).
apply Bif_ex_LInt; easy.
split; try easy.
rewrite <- (BInt_LInt_eq _ Bl).
(fun n => (BInt (bf n))%Bif); try easy.
intros n; apply BInt_LInt_eq.
Lemma LInt_Rbar_dominated_convergence_useful_R :
forall f: nat -> E -> R, forall (g:E->R) (limf: E -> R),
(forall n, measurable_fun_R gen (f n)) ->
(ae mu (fun x => ex_lim_seq (fun n => f n x))) ->
ex_LInt g ->
(forall n, ae mu (fun x => (Rabs (f n x) <= g x))) ->
(ae mu (fun x => limf x = Lim_seq (fun n => f n x))) ->
measurable_fun_R gen limf ->
(forall n, ex_LInt (f n)) /\
ex_LInt limf /\
is_lim_seq (fun n => LInt (f n)) (LInt limf).
Proof.
intros f g limf H1 H2 H3 H4 H5 H6.
generalize (ae_inter _ _ _ H2 H5); intros T1.
generalize (ae_inter_countable _ _ H4); intros T2.
generalize (ae_inter _ _ _ T1 T2); clear T1 T2; intros T.
destruct T as (A,(HA1,(HA2,HA3))).
pose (ff := fun n x => (charac (fun t => ~ (A t)) x) * (f n x)).
pose (gg := fun x => (charac (fun t => ~ (A t)) x) * (g x)).
destruct (LInt_dominated_convergence ff gg) as (Y1,(Y2,Y3)); try easy.
(* à partir de LInt_dominated_convergence
en rajoutant les ae
==> on complète les f n et g par 0 hors des ae *)
Context {E : Set}. (* was Type -- to be looked into *)
Hypothesis Einhab : inhabited E.
Context {gen : (E -> Prop) -> Prop}.
Variable mu : measure gen.
Definition ex_LInt_Rbar : (E -> Rbar) -> Prop := fun f =>
let f_p := nonneg_part f in
let f_m := nonpos_part f in
measurable_fun gen gen_Rbar f /\
is_finite (LInt_p mu f_p) /\ is_finite (LInt_p mu f_m).
Definition LInt_Rbar : (E -> Rbar) -> R (* or Rbar ? *) :=
fun f =>
let f_p := nonneg_part f in
let f_m := nonpos_part f in
ex_LInt_Rbar f -> ex_LInt mu (fun t => real (f t)).
Lemma toto2 : forall (f:E->Rbar),
ex_LInt_Rbar f -> ae mu (fun t => is_finite (f t)).
Lemma toto4 : forall (f g:E->Rbar),
ex_LInt_Rbar f -> (* ajouter mesurabilité de g ? *)
ae mu (fun t => f t = g t) ->
LInt_Rbar f = LInt_Rbar g.
(* en virer un mais ajouter sa mesurabilité ? *)
ae mu (fun t => f t = g t) ->
LInt_Rbar f = LInt mu g.
Definition ae_compat := fun (P:(E->Rbar)->Prop) =>
(forall f g, ae mu (fun t => f t = g t) -> P f -> P g).
forall (P : (E->Rbar) -> Prop) (Q: R -> Prop),
ae_compat P ->
(forall (f:E->R), ex_LInt mu f -> P f -> Q (LInt mu f)) ->
(forall (fb:E->Rbar), ex_LInt_Rbar fb -> P fb -> Q (LInt_Rbar fb)).
Proof.
intros P Q H0 H1 fb H2 H3.
rewrite toto3; try easy.
apply H1.
now apply toto1.
apply H0 with (2:=H3).
eapply ae_ext with (2:=toto2 fb H2).
intros t; easy.
(* attention : measurable_fun ne passe pas à ae *)
Lemma LInt_Rbar_dominated_convergence :
forall f: nat -> E -> Rbar, forall (g:E->Rbar),
(forall n, measurable_fun_Rbar gen (f n)) ->

François Clément
committed
(forall x, ex_lim_seq_Rbar (fun n => f n x)) ->
ex_LInt_Rbar g ->
(forall n x, Rbar_le (Rbar_abs (f n x)) (g x)) ->

François Clément
committed
let lim_f := fun x => Lim_seq_Rbar (fun n => f n x) in

François Clément
committed
= Lim_seq_Rbar (fun n => LInt_Rbar (f n)) /\
ex_lim_seq_Rbar (fun n => LInt_Rbar (f n)).
Lemma LInt_Rbar_dominated_convergence_useful :
forall f: nat -> E -> Rbar, forall (g:E->Rbar) (limf: E -> Rbar),
(forall n, measurable_fun_Rbar gen (f n)) ->

François Clément
committed
(ae mu (fun x => ex_lim_seq_Rbar (fun n => f n x))) ->
ex_LInt_Rbar g ->
(forall n, ae mu (fun x => Rbar_le (Rbar_abs (f n x)) (g x))) ->

François Clément
committed
(ae mu (fun x => limf x = Lim_seq_Rbar (fun n => f n x))) ->
measurable_fun_Rbar gen limf ->
(forall n, ex_LInt_Rbar (f n)) /\
ex_LInt_Rbar limf /\
is_lim_seq (fun n => LInt_Rbar (f n)) (LInt_Rbar limf).
(* essai à partir de LInt_Rbar_dominated_convergence_useful_R *)
intros f g limf H1 H2 H3 H4 H5 H6.
assert (K4: forall n, ae mu (fun t => is_finite (f n t))).
destruct (LInt_Rbar_dominated_convergence_useful_R Einhab mu f g limf) as (K1,(K2,K3)).
(* *)
intros n; apply measurable_fun_composition with gen_Rbar; try easy.
apply H1.
apply measurable_fun_real.
(* *)
eapply ae_imply.
2: eapply ae_inter.
2: apply H2.
2: eapply ae_inter_countable.
2: apply K4.
intros x (Y1,Y2); simpl in Y1, Y2.

François Clément
committed
exists (LimInf_seq_Rbar (fun n => f n x)).

François Clément
committed
erewrite LimSup_seq_Rbar_ext.
rewrite <- LimSup_seq_eq.
2: intros n; rewrite (Y2 n); easy.
unfold LimSup_seq; simpl.
destruct (ex_LimSup_seq _); easy.

François Clément
committed
erewrite LimInf_seq_Rbar_ext.
rewrite <- LimInf_seq_eq.
2: intros n; rewrite (Y2 n); easy.
unfold LimInf_seq; simpl.
destruct (ex_LimInf_seq _); easy.
(* *)
apply toto1; easy.
(* *)
intros n.
eapply ae_imply.
2: eapply ae_inter.
2: apply (H4 n).
2: apply (toto2 _ H3).
intros x.
intros (Y1,Y2).

François Clément
committed
aglop. (* ok par Lim_seq_eq *)
(* *)
split.
intros n.
(*ae (f n = real f n) car ae (f n x <= g x) et ae (is_finite g) car ex_LInt_Rbar g.
+ H1 *)

François Clément
committed
(* le même à peu près + Lim_seq_Rbar + H6 *)