Theory Piecewise_Stopping_Time

section ‹Piecewise Stopping Times›

theory Piecewise_Stopping_Time
  imports Stopped_Value_Integration

begin

text ‹Piecewise constant stopping times and their interaction with stopped values and integration.
  These are needed for the converse direction of the optional stopping theorem.›

context nat_sigma_finite_filtered_measure
begin

subsection ‹Piecewise constant stopping times›

text ‹Given @{term "i  j"} and an @{term "F i"}-measurable set @{term S}, the function that
  returns @{term i} on @{term S} and @{term j} on its complement is a stopping time.
  This corresponds to ‹isStoppingTime_piecewise_const› in Mathlib.›

lemma stopping_time_piecewise_const:
  assumes "i  j" and S: "S  sets (F i)"
  shows "stopping_time (λω. if ω  S then i else j)"
proof (rule stopping_timeI)
  fix ω assume "ω  space M"
  show "0  (if ω  S then i else j)" by simp
next
  fix t :: nat assume "0  t"
  have space_eq: "space (F t) = space M" by simp
  have top: "space M  sets (F t)" using sets.top[of "F t"] by simp
  show "Measurable.pred (F t) (λω. (if ω  S then i else j)  t)"
    unfolding Measurable.pred_def
  proof -
    consider "j  t" | "i  t" "¬ j  t" | "¬ i  t"
      using i  j by linarith
    then show "{ω  space (F t). (if ω  S then i else j)  t}  sets (F t)"
    proof cases
      case 1
      then have "{ω  space (F t). (if ω  S then i else j)  t} = space (F t)"
        using i  j by (auto simp: space_eq)
      then show ?thesis using top space_eq by simp
    next
      case 2
      then have "{ω  space (F t). (if ω  S then i else j)  t} = S"
        using S sets.sets_into_space subset_antisym by fastforce
      then show ?thesis
        using S 2 sets_F_mono by force 
    next
      case 3
      then show ?thesis 
        using i  j by (auto simp: Measurable.pred_def space_eq split: if_splits)
    qed
  qed
qed

text ‹The stopped value at a piecewise constant stopping time decomposes into a piecewise function.
  This corresponds to ‹stoppedValue_piecewise_const› in Mathlib.›

lemma stopped_value_piecewise_const:
  assumes "S  space M"
  shows "stopped_value X (λω. if ω  S then i else j) = (λω. if ω  S then X i ω else X j ω)"
  unfolding stopped_value_def by (simp add: if_distrib if_distribR)

subsection ‹Integration over piecewise functions›

text ‹The integral of a piecewise function splits into integrals over the two pieces.
  This corresponds to ‹integral_piecewise› in Mathlib.›

lemma piecewise_eq_indicator_sum:
  fixes f g :: "'a  real"
  assumes "S  sets M" "ω  space M"
  shows "(if ω  S then f ω else g ω) = indicat_real S ω * f ω + indicat_real (space M - S) ω * g ω"
  using ω  space M by (auto simp: indicator_def)

lemma integral_piecewise:
  fixes f g :: "'a  real"
  assumes S_meas: "S  sets M" and int_f: "integrable M f" and int_g: "integrable M g"
  shows "(ω. (if ω  S then f ω else g ω) M) =
    set_lebesgue_integral M S f + set_lebesgue_integral M (space M - S) g"
proof -
  let ?h = "λω. indicat_real S ω * f ω + indicat_real (space M - S) ω * g ω"
  have eq_ae: "AE ω in M. (if ω  S then f ω else g ω) = ?h ω"
    by (rule AE_I2) (auto simp: indicator_def)
  have int_Sf: "integrable M (λω. indicat_real S ω * f ω)"
    using integrable_mult_indicator[OF S_meas int_f]
    by (simp add: scaleR_conv_of_real)
  have int_Sg: "integrable M (λω. indicat_real (space M - S) ω * g ω)"
    using integrable_mult_indicator[OF _ int_g] by (simp add: S_meas sets.Diff)
  have meas_if: "(λω. if ω  S then f ω else g ω)  borel_measurable M"
    by (intro measurable_If_set) (use int_f int_g S_meas in auto)
  have meas_h: "?h  borel_measurable M"
    using int_Sf int_Sg by (intro borel_measurable_add) auto
  have "(ω. (if ω  S then f ω else g ω) M) = (ω. ?h ω M)"
    by (rule integral_cong_AE[OF meas_if meas_h eq_ae])
  also have " = (ω. indicat_real S ω * f ω M) + (ω. indicat_real (space M - S) ω * g ω M)"
    by (rule Bochner_Integration.integral_add[OF int_Sf int_Sg])
  also have " = set_lebesgue_integral M S f + set_lebesgue_integral M (space M - S) g"
    unfolding set_lebesgue_integral_def by (simp add: scaleR_conv_of_real)
  finally show ?thesis .
qed

end

end