Skip to content
Snippets Groups Projects
LInt.v 19.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • Micaela Mayero's avatar
    Micaela Mayero committed
    (**
    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... *)
    
    Micaela Mayero's avatar
    Micaela Mayero committed
    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.
    
    Micaela Mayero's avatar
    Micaela Mayero committed
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    Open Scope R_scope.
    
    Micaela Mayero's avatar
    Micaela Mayero committed
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    
    Micaela Mayero's avatar
    Micaela Mayero committed
    Section LInt_def.
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    Context {E : Set}.  (* was Type -- to be looked into *)
    
    Micaela Mayero's avatar
    Micaela Mayero committed
    Hypothesis Einhab : inhabited E.
    
    Context {gen : (E -> Prop) -> Prop}.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    Variable mu : measure gen.
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    (* QUESTION: R_max or Rbar_max ?? *)
    (* have both probably... *)
    
    Micaela Mayero's avatar
    Micaela Mayero committed
    
    
    Definition nonneg_part :=
    
    Micaela Mayero's avatar
    Micaela Mayero committed
      fun (f : E -> Rbar) (x : E) => Rbar_max 0 (f x).
    
    
    Definition nonpos_part :=
    
    Micaela Mayero's avatar
    Micaela Mayero committed
      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.
    
    unfold nonneg_part, nonpos_part.
    
    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.
    
    unfold nonneg_part, nonpos_part.
    
    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).
    
    Proof.
    
    intros f x; unfold nonneg_part.
    
    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).
    
    Proof.
    
    intros f x; unfold nonpos_part.
    
    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.
    
    unfold nonneg_part, nonpos_part.
    
    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.
    
    unfold nonneg_part, nonpos_part.
    
    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.
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    Definition ex_LInt : (E -> R) -> Prop := fun f =>
    
      let f_p := nonneg_part f in
      let f_m := nonpos_part f in
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
         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
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
        ((LInt_p mu f_p)-(LInt_p mu f_m))%R.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    (* Various lemmas *)
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    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.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    apply LInt_p_ext; intros x; rewrite H; easy.
    apply LInt_p_ext; intros x; rewrite H; easy.
    Qed.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    Lemma LInt_eq_p : forall f,
    
       nonneg f -> LInt f = LInt_p mu f.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    Proof.
    
    Micaela Mayero's avatar
    Micaela Mayero committed
    (*
    
    intros f H; unfold LInt, nonneg_part, nonpos_part.
    
    Micaela Mayero's avatar
    Micaela Mayero committed
    replace (real (LInt_p mu (fun x : E => Rbar_max 0 (Rbar_opp (f x))))) with 0%R.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
      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.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
      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.*)
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    Lemma ex_LInt_equiv_abs :
       forall f,
    
        (ex_LInt f) <->
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
           (measurable_fun gen gen_R f /\
              is_finite (LInt_p mu (fun t => Rabs (f t)))).
    
    Proof.
    
    intros (H1,(H2,H3)); split; try easy.
    
    assert (H4: measurable_fun_Rbar gen (fun x : E => Finite (f x))).
    apply measurable_fun_composition with (2:=measurable_fun_Finite); easy.
    
    erewrite LInt_p_ext.
    
    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 nonneg_nonneg_part.
    
    apply measurable_fun_fp; easy.
    
    apply nonneg_nonpos_part.
    
    apply measurable_fun_fm; easy.
    (* *)
    intros (H1,H2); split; try easy; split.
    eapply Rbar_bounded_is_finite.
    
    apply LInt_p_nonneg; try easy.
    
    apply nonneg_nonneg_part.
    
    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.
    
    apply Rbar_plus_le_compat_l.
    
    apply nonneg_nonpos_part.
    
    eapply Rbar_bounded_is_finite.
    
    apply LInt_p_nonneg; try easy.
    
    apply nonneg_nonpos_part.
    
    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.
    
    apply Rbar_plus_le_compat_r.
    
    apply nonneg_nonneg_part.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    (** LInk with Bif *)
    
    
    Lemma Bif_measurable : forall (f : E -> R),
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
            forall bf : Bif mu f,
              measurable_fun_R gen f.
    
    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.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    
    Lemma Bif_ex_LInt : forall (f : E -> R),
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
            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.
    
       apply LInt_p_nonneg; try easy.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
       intros t; simpl; apply Rabs_pos.
       2: easy.
       eapply LInt_p_monotone.
       intros t.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
       replace (Finite (Rabs (f t))) with (Rbar_abs (Finite (f t))) by easy.
    
       replace (Finite (f t)) with
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
         (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).
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
       assert (T1:is_finite ((LInt_p mu
            (fun x =>
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
               Rbar_abs (Rbar_minus (f x) (seq N x)))))).
      apply Rbar_bounded_is_finite with 0 1; try easy.
    
      apply LInt_p_nonneg; try easy.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
      intros t; apply Rbar_abs_ge_0.
      apply Rbar_lt_le.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
      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.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
      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.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
      assert (T2: is_finite ((LInt_p mu (fun x => Rbar_abs (seq N x))))).
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
      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.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
      intros x; simpl; f_equal.
      generalize (fun_sf_norm (seq N) x).
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
      unfold norm; simpl; easy.
      rewrite <- T1, <- T2; easy.
    
      (* *)
      split.
      intros x; apply Rbar_abs_ge_0.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
      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.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
      apply measurable_fun_abs.
      apply measurable_fun_R_Rbar.
      apply Bif_measurable.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
      apply Bif_integrable_sf; easy.
    Qed.
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    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.
    
    (*
    
    Lemma nonneg_part_simpl_fun :
    
         sf : simpl_fun R_NormedModule gen,
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
              { sfp : simpl_fun R_NormedModule gen |
    
               forall t, sfp t = nonneg_part (fun_sf sf) t }.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    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)).
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    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.
    
     apply is_LimSup_seq_Rbar_ext with (2:=ax_lim_l1).
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
     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)).
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    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.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    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.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
     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 :
    
       forall (f g : E -> R),
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
          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 f + LInt g
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
          = 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 *)
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    (*
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    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 *)
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    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.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    aglop. (* OK, Rbar_bounded_is_finite *)
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    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.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    aglop. (* OK! dans H3 *)
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    (* *)
    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).
    
    apply is_lim_seq_ext with
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
      (fun n => (BInt (bf n))%Bif); try easy.
    intros n; apply BInt_LInt_eq.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    *)
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    (*
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    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 ->
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
        (forall n, ex_LInt (f n)) /\
           ex_LInt limf /\
           is_lim_seq (fun n => LInt (f n)) (LInt limf).
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    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 *)
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    *)
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    End LInt_def.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    Section LInt_Rbar.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    Context {E : Set}.  (* was Type -- to be looked into *)
    Hypothesis Einhab : inhabited E.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    Context {gen : (E -> Prop) -> Prop}.
    Variable mu : measure gen.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    Definition ex_LInt_Rbar : (E -> Rbar) -> Prop := fun f =>
    
      let f_p := nonneg_part f in
      let f_m := nonpos_part f in
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
         measurable_fun gen gen_Rbar f /\
         is_finite (LInt_p mu f_p) /\ is_finite (LInt_p mu f_m).
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    Definition LInt_Rbar : (E -> Rbar) -> R (* or Rbar ? *) :=
      fun f =>
    
      let f_p := nonneg_part f in
      let f_m := nonpos_part f in
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
        (Rbar_minus (LInt_p mu f_p) (LInt_p mu f_m)).
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    
    (* list of useful theorems to switch *)
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    (*Lemma toto1 : forall (f:E->Rbar),
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
       ex_LInt_Rbar f -> ex_LInt mu (fun t => real (f t)).
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    Lemma toto2 : forall (f:E->Rbar),
       ex_LInt_Rbar f -> ae mu (fun t => is_finite (f t)).
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    Lemma toto3 : forall (f:E->Rbar),
    
       ex_LInt_Rbar f ->
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
       LInt_Rbar f = LInt mu (fun t => real (f t)).
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    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.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    Lemma toto5 : forall (f:E->Rbar) (g:E->R),
    
       ex_LInt_Rbar f -> ex_LInt mu g ->
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
         (* en virer un mais ajouter sa mesurabilité ? *)
       ae mu (fun t => f t = g t) ->
       LInt_Rbar f = LInt mu g.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    *)
    
    Definition ae_compat := fun (P:(E->Rbar)->Prop) =>
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
      (forall f g, ae mu (fun t => f t = g t) -> P f -> P g).
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    (*
    
    Lemma lift_LInt_R_Rbar :
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
          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.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    *)
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    (* attention : measurable_fun ne passe pas à ae *)
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    (*
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    Lemma LInt_Rbar_dominated_convergence :
      forall f: nat -> E -> Rbar, forall (g:E->Rbar),
        (forall n, measurable_fun_Rbar gen (f n)) ->
    
        (forall x, ex_lim_seq_Rbar (fun n => f n x)) ->
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
         ex_LInt_Rbar g ->
        (forall n x, Rbar_le (Rbar_abs (f n x)) (g x)) ->
    
    
        let lim_f := fun x => Lim_seq_Rbar (fun n => f n x) in
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
           ex_LInt_Rbar lim_f /\
    
           LInt_Rbar lim_f
    
               = Lim_seq_Rbar (fun n => LInt_Rbar (f n)) /\
           ex_lim_seq_Rbar (fun n => LInt_Rbar (f n)).
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    Proof.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    *)
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    (*
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    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)) ->
    
        (ae mu (fun x => ex_lim_seq_Rbar (fun n => f n x))) ->
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
         ex_LInt_Rbar g ->
        (forall n, ae mu (fun x => Rbar_le (Rbar_abs (f n x)) (g x))) ->
    
        (ae mu (fun x => limf x = Lim_seq_Rbar (fun n => f n x))) ->
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
         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).
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    Proof.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    (* 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))).
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    aglop.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    assert (K5: ae mu (fun t => is_finite (limf t))).
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    aglop.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    destruct (LInt_Rbar_dominated_convergence_useful_R Einhab mu f g limf) as (K1,(K2,K3)).
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    (* *)
    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.
    
    exists (LimInf_seq_Rbar (fun n => f n x)).
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    apply is_LimSup_LimInf_lim_seq.
    rewrite Y1.
    
    erewrite LimSup_seq_Rbar_ext.
    rewrite <- LimSup_seq_eq.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    2: intros n; rewrite (Y2 n); easy.
    unfold LimSup_seq; simpl.
    destruct (ex_LimSup_seq _); easy.
    
    erewrite LimInf_seq_Rbar_ext.
    rewrite <- LimInf_seq_eq.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    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).
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    aglop. (* ok probablement *)
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    (* *)
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    (* *)
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    aglop. (* ok *)
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    (* *)
    
    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 *)
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    aglop.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    
    split.
    
    (* le même à peu près + Lim_seq_Rbar + H6 *)
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    aglop.
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    (* ok si f n et limf sont finis presque partout *)
    
    
    Sylvie Boldo's avatar
    Sylvie Boldo committed
    *)
    
    End LInt_Rbar.