src/HOL/Probability/Embed_Measure.thy
author haftmann
Fri Jun 19 07:53:35 2015 +0200 (2015-06-19)
changeset 60517 f16e4fb20652
parent 60065 390de6d3a7b8
child 60580 7e741e22d7fc
permissions -rw-r--r--
separate class for notions specific for integral (semi)domains, in contrast to fields where these are trivial
hoelzl@59092
     1
(*  Title:      HOL/Probability/Embed_Measure.thy
hoelzl@59092
     2
    Author:     Manuel Eberl, TU M√ľnchen
hoelzl@59092
     3
hoelzl@59092
     4
    Defines measure embeddings with injective functions, i.e. lifting a measure on some values 
hoelzl@59092
     5
    to a measure on "tagged" values (e.g. embed_measure M Inl lifts a measure on values 'a to a 
hoelzl@59092
     6
    measure on the left part of the sum type 'a + 'b)
hoelzl@59092
     7
*)
hoelzl@59092
     8
hoelzl@59092
     9
section {* Embed Measure Spaces with a Function *}
hoelzl@59092
    10
hoelzl@59092
    11
theory Embed_Measure
hoelzl@59092
    12
imports Binary_Product_Measure
hoelzl@59092
    13
begin
hoelzl@59092
    14
hoelzl@59092
    15
definition embed_measure :: "'a measure \<Rightarrow> ('a \<Rightarrow> 'b) \<Rightarrow> 'b measure" where
hoelzl@59092
    16
  "embed_measure M f = measure_of (f ` space M) {f ` A |A. A \<in> sets M} 
hoelzl@59092
    17
                           (\<lambda>A. emeasure M (f -` A \<inter> space M))"
hoelzl@59092
    18
hoelzl@59092
    19
lemma space_embed_measure: "space (embed_measure M f) = f ` space M"
hoelzl@59092
    20
  unfolding embed_measure_def 
hoelzl@59092
    21
  by (subst space_measure_of) (auto dest: sets.sets_into_space)
hoelzl@59092
    22
hoelzl@59092
    23
lemma sets_embed_measure':
hoelzl@59092
    24
  assumes inj: "inj_on f (space M)" 
hoelzl@59092
    25
  shows "sets (embed_measure M f) = {f ` A |A. A \<in> sets M}"
hoelzl@59092
    26
  unfolding embed_measure_def
hoelzl@59092
    27
proof (intro sigma_algebra.sets_measure_of_eq sigma_algebra_iff2[THEN iffD2] conjI allI ballI impI)
hoelzl@59092
    28
  fix s assume "s \<in> {f ` A |A. A \<in> sets M}"
hoelzl@59092
    29
  then obtain s' where s'_props: "s = f ` s'" "s' \<in> sets M" by auto
hoelzl@59092
    30
  hence "f ` space M - s = f ` (space M - s')" using inj
hoelzl@59092
    31
    by (auto dest: inj_onD sets.sets_into_space)
hoelzl@59092
    32
  also have "... \<in> {f ` A |A. A \<in> sets M}" using s'_props by auto
hoelzl@59092
    33
  finally show "f ` space M - s \<in> {f ` A |A. A \<in> sets M}" .
hoelzl@59092
    34
next
hoelzl@59092
    35
  fix A :: "nat \<Rightarrow> _" assume "range A \<subseteq> {f ` A |A. A \<in> sets M}"
hoelzl@59092
    36
  then obtain A' where "\<And>i. A i = f ` A' i" "\<And>i. A' i \<in> sets M"
hoelzl@59092
    37
    by (auto simp: subset_eq choice_iff)
hoelzl@59092
    38
  moreover from this have "(\<Union>x. f ` A' x) = f ` (\<Union>x. A' x)" by blast
hoelzl@59092
    39
  ultimately show "(\<Union>i. A i) \<in> {f ` A |A. A \<in> sets M}" by blast
hoelzl@59092
    40
qed (auto dest: sets.sets_into_space)
hoelzl@59092
    41
hoelzl@59092
    42
lemma the_inv_into_vimage:
hoelzl@59092
    43
  "inj_on f X \<Longrightarrow> A \<subseteq> X \<Longrightarrow> the_inv_into X f -` A \<inter> (f`X) = f ` A"
hoelzl@59092
    44
  by (auto simp: the_inv_into_f_f)
hoelzl@59092
    45
hoelzl@59092
    46
lemma sets_embed_eq_vimage_algebra:
hoelzl@59092
    47
  assumes "inj_on f (space M)"
hoelzl@59092
    48
  shows "sets (embed_measure M f) = sets (vimage_algebra (f`space M) (the_inv_into (space M) f) M)"
hoelzl@59092
    49
  by (auto simp: sets_embed_measure'[OF assms] Pi_iff the_inv_into_f_f assms sets_vimage_algebra2 simple_image
hoelzl@59092
    50
           dest: sets.sets_into_space
hoelzl@59092
    51
           intro!: image_cong the_inv_into_vimage[symmetric])
hoelzl@59092
    52
hoelzl@59092
    53
lemma sets_embed_measure:
hoelzl@59092
    54
  assumes inj: "inj f" 
hoelzl@59092
    55
  shows "sets (embed_measure M f) = {f ` A |A. A \<in> sets M}"
hoelzl@59092
    56
  using assms by (subst sets_embed_measure') (auto intro!: inj_onI dest: injD)
hoelzl@59092
    57
hoelzl@59092
    58
lemma in_sets_embed_measure: "A \<in> sets M \<Longrightarrow> f ` A \<in> sets (embed_measure M f)"
hoelzl@59092
    59
  unfolding embed_measure_def
hoelzl@59092
    60
  by (intro in_measure_of) (auto dest: sets.sets_into_space)
hoelzl@59092
    61
hoelzl@59092
    62
lemma measurable_embed_measure1:
hoelzl@59092
    63
  assumes g: "(\<lambda>x. g (f x)) \<in> measurable M N" 
hoelzl@59092
    64
  shows "g \<in> measurable (embed_measure M f) N"
hoelzl@59092
    65
  unfolding measurable_def
hoelzl@59092
    66
proof safe
hoelzl@59092
    67
  fix A assume "A \<in> sets N"
hoelzl@59092
    68
  with g have "(\<lambda>x. g (f x)) -` A \<inter> space M \<in> sets M"
hoelzl@59092
    69
    by (rule measurable_sets)
hoelzl@59092
    70
  then have "f ` ((\<lambda>x. g (f x)) -` A \<inter> space M) \<in> sets (embed_measure M f)"
hoelzl@59092
    71
    by (rule in_sets_embed_measure)
hoelzl@59092
    72
  also have "f ` ((\<lambda>x. g (f x)) -` A \<inter> space M) = g -` A \<inter> space (embed_measure M f)"
hoelzl@59092
    73
    by (auto simp: space_embed_measure)
hoelzl@59092
    74
  finally show "g -` A \<inter> space (embed_measure M f) \<in> sets (embed_measure M f)" .
hoelzl@59092
    75
qed (insert measurable_space[OF assms], auto simp: space_embed_measure)
hoelzl@59092
    76
hoelzl@59092
    77
lemma measurable_embed_measure2':
hoelzl@59092
    78
  assumes "inj_on f (space M)" 
hoelzl@59092
    79
  shows "f \<in> measurable M (embed_measure M f)"
hoelzl@59092
    80
proof-
hoelzl@59092
    81
  {
hoelzl@59092
    82
    fix A assume A: "A \<in> sets M"
hoelzl@59092
    83
    also from this have "A = A \<inter> space M" by auto
hoelzl@59092
    84
    also have "... = f -` f ` A \<inter> space M" using A assms
hoelzl@59092
    85
      by (auto dest: inj_onD sets.sets_into_space)
hoelzl@59092
    86
    finally have "f -` f ` A \<inter> space M \<in> sets M" .
hoelzl@59092
    87
  }
hoelzl@59092
    88
  thus ?thesis using assms unfolding embed_measure_def
hoelzl@59092
    89
    by (intro measurable_measure_of) (auto dest: sets.sets_into_space)
hoelzl@59092
    90
qed
hoelzl@59092
    91
hoelzl@59092
    92
lemma measurable_embed_measure2:
hoelzl@59092
    93
  assumes [simp]: "inj f" shows "f \<in> measurable M (embed_measure M f)"
hoelzl@59092
    94
  by (auto simp: inj_vimage_image_eq embed_measure_def
hoelzl@59092
    95
           intro!: measurable_measure_of dest: sets.sets_into_space)
hoelzl@59092
    96
hoelzl@59092
    97
lemma embed_measure_eq_distr':
hoelzl@59092
    98
  assumes "inj_on f (space M)"
hoelzl@59092
    99
  shows "embed_measure M f = distr M (embed_measure M f) f"
hoelzl@59092
   100
proof-
hoelzl@59092
   101
  have "distr M (embed_measure M f) f = 
hoelzl@59092
   102
            measure_of (f ` space M) {f ` A |A. A \<in> sets M}
hoelzl@59092
   103
                       (\<lambda>A. emeasure M (f -` A \<inter> space M))" unfolding distr_def
hoelzl@59092
   104
      by (simp add: space_embed_measure sets_embed_measure'[OF assms])
hoelzl@59092
   105
  also have "... = embed_measure M f" unfolding embed_measure_def ..
hoelzl@59092
   106
  finally show ?thesis ..
hoelzl@59092
   107
qed
hoelzl@59092
   108
hoelzl@59092
   109
lemma embed_measure_eq_distr:
hoelzl@59092
   110
    "inj f \<Longrightarrow> embed_measure M f = distr M (embed_measure M f) f"
hoelzl@59092
   111
  by (rule embed_measure_eq_distr') (auto intro!: inj_onI dest: injD)
hoelzl@59092
   112
Andreas@60065
   113
lemma nn_integral_embed_measure':
Andreas@60065
   114
  "inj_on f (space M) \<Longrightarrow> g \<in> borel_measurable (embed_measure M f) \<Longrightarrow>
Andreas@60065
   115
  nn_integral (embed_measure M f) g = nn_integral M (\<lambda>x. g (f x))"
Andreas@60065
   116
  apply (subst embed_measure_eq_distr', simp)
Andreas@60065
   117
  apply (subst nn_integral_distr)
Andreas@60065
   118
  apply (simp_all add: measurable_embed_measure2')
Andreas@60065
   119
  done
Andreas@60065
   120
hoelzl@59092
   121
lemma nn_integral_embed_measure:
hoelzl@59092
   122
  "inj f \<Longrightarrow> g \<in> borel_measurable (embed_measure M f) \<Longrightarrow>
hoelzl@59092
   123
  nn_integral (embed_measure M f) g = nn_integral M (\<lambda>x. g (f x))"
Andreas@60065
   124
  by(erule nn_integral_embed_measure'[OF subset_inj_on]) simp
hoelzl@59092
   125
hoelzl@59092
   126
lemma emeasure_embed_measure':
hoelzl@59092
   127
    assumes "inj_on f (space M)" "A \<in> sets (embed_measure M f)"
hoelzl@59092
   128
    shows "emeasure (embed_measure M f) A = emeasure M (f -` A \<inter> space M)"
hoelzl@59092
   129
  by (subst embed_measure_eq_distr'[OF assms(1)])
hoelzl@59092
   130
     (simp add: emeasure_distr[OF measurable_embed_measure2'[OF assms(1)] assms(2)])
hoelzl@59092
   131
hoelzl@59092
   132
lemma emeasure_embed_measure:
hoelzl@59092
   133
    assumes "inj f" "A \<in> sets (embed_measure M f)"
hoelzl@59092
   134
    shows "emeasure (embed_measure M f) A = emeasure M (f -` A \<inter> space M)"
hoelzl@59092
   135
 using assms by (intro emeasure_embed_measure') (auto intro!: inj_onI dest: injD)
hoelzl@59092
   136
hoelzl@59092
   137
lemma embed_measure_comp: 
hoelzl@59092
   138
  assumes [simp]: "inj f" "inj g"
hoelzl@59092
   139
  shows "embed_measure (embed_measure M f) g = embed_measure M (g \<circ> f)"
hoelzl@59092
   140
proof-
hoelzl@59092
   141
  have [simp]: "inj (\<lambda>x. g (f x))" by (subst o_def[symmetric]) (auto intro: inj_comp)
hoelzl@59092
   142
  note measurable_embed_measure2[measurable]
hoelzl@59092
   143
  have "embed_measure (embed_measure M f) g = 
hoelzl@59092
   144
            distr M (embed_measure (embed_measure M f) g) (g \<circ> f)"
hoelzl@59092
   145
      by (subst (1 2) embed_measure_eq_distr) 
hoelzl@59092
   146
         (simp_all add: distr_distr sets_embed_measure cong: distr_cong)
hoelzl@59092
   147
  also have "... = embed_measure M (g \<circ> f)"
hoelzl@59092
   148
      by (subst (3) embed_measure_eq_distr, simp add: o_def, rule distr_cong)
hoelzl@59092
   149
         (auto simp: sets_embed_measure o_def image_image[symmetric] 
hoelzl@59092
   150
               intro: inj_comp cong: distr_cong)
hoelzl@59092
   151
  finally show ?thesis .
hoelzl@59092
   152
qed
hoelzl@59092
   153
hoelzl@59092
   154
lemma sigma_finite_embed_measure:
hoelzl@59092
   155
  assumes "sigma_finite_measure M" and inj: "inj f"
hoelzl@59092
   156
  shows "sigma_finite_measure (embed_measure M f)"
hoelzl@59092
   157
proof
hoelzl@59092
   158
  case goal1
hoelzl@59092
   159
  from assms(1) interpret sigma_finite_measure M .
hoelzl@59092
   160
  from sigma_finite_countable obtain A where
hoelzl@59092
   161
      A_props: "countable A" "A \<subseteq> sets M" "\<Union>A = space M" "\<And>X. X\<in>A \<Longrightarrow> emeasure M X \<noteq> \<infinity>" by blast
hoelzl@59092
   162
  show ?case
hoelzl@59092
   163
  proof (intro exI[of _ "op ` f`A"] conjI allI)
hoelzl@59092
   164
    from A_props show "countable (op ` f`A)" by auto
hoelzl@59092
   165
    from inj and A_props show "op ` f`A \<subseteq> sets (embed_measure M f)" 
hoelzl@59092
   166
      by (auto simp: sets_embed_measure)
hoelzl@59092
   167
    from A_props and inj show "\<Union>(op ` f`A) = space (embed_measure M f)"
hoelzl@59092
   168
      by (auto simp: space_embed_measure intro!: imageI)
hoelzl@59092
   169
    from A_props and inj show "\<forall>a\<in>op ` f ` A. emeasure (embed_measure M f) a \<noteq> \<infinity>"
hoelzl@59092
   170
      by (intro ballI, subst emeasure_embed_measure)
hoelzl@59092
   171
         (auto simp: inj_vimage_image_eq intro: in_sets_embed_measure)
hoelzl@59092
   172
  qed
hoelzl@59092
   173
qed
hoelzl@59092
   174
Andreas@60065
   175
lemma embed_measure_count_space':
Andreas@60065
   176
    "inj_on f A \<Longrightarrow> embed_measure (count_space A) f = count_space (f`A)"
hoelzl@59092
   177
  apply (subst distr_bij_count_space[of f A "f`A", symmetric])
hoelzl@59092
   178
  apply (simp add: inj_on_def bij_betw_def)
Andreas@60065
   179
  apply (subst embed_measure_eq_distr')
hoelzl@59092
   180
  apply simp
Andreas@60065
   181
  apply(auto 4 3 intro!: measure_eqI imageI simp add: sets_embed_measure' subset_image_iff)
hoelzl@59092
   182
  apply (subst (1 2) emeasure_distr)
Andreas@60065
   183
  apply (auto simp: space_embed_measure sets_embed_measure')
hoelzl@59092
   184
  done
hoelzl@59092
   185
Andreas@60065
   186
lemma embed_measure_count_space: 
Andreas@60065
   187
    "inj f \<Longrightarrow> embed_measure (count_space A) f = count_space (f`A)"
Andreas@60065
   188
  by(rule embed_measure_count_space')(erule subset_inj_on, simp)
Andreas@60065
   189
hoelzl@59092
   190
lemma sets_embed_measure_alt:
hoelzl@59092
   191
    "inj f \<Longrightarrow> sets (embed_measure M f) = (op`f) ` sets M"
hoelzl@59092
   192
  by (auto simp: sets_embed_measure)
hoelzl@59092
   193
hoelzl@59092
   194
lemma emeasure_embed_measure_image':
hoelzl@59092
   195
  assumes "inj_on f (space M)" "X \<in> sets M"
hoelzl@59092
   196
  shows "emeasure (embed_measure M f) (f`X) = emeasure M X"
hoelzl@59092
   197
proof-
hoelzl@59092
   198
  from assms have "emeasure (embed_measure M f) (f`X) = emeasure M (f -` f ` X \<inter> space M)"
hoelzl@59092
   199
    by (subst emeasure_embed_measure') (auto simp: sets_embed_measure')
hoelzl@59092
   200
  also from assms have "f -` f ` X \<inter> space M = X" by (auto dest: inj_onD sets.sets_into_space)
hoelzl@59092
   201
  finally show ?thesis .
hoelzl@59092
   202
qed
hoelzl@59092
   203
hoelzl@59092
   204
lemma emeasure_embed_measure_image:
hoelzl@59092
   205
    "inj f \<Longrightarrow> X \<in> sets M \<Longrightarrow> emeasure (embed_measure M f) (f`X) = emeasure M X"
hoelzl@59092
   206
  by (simp_all add: emeasure_embed_measure in_sets_embed_measure inj_vimage_image_eq)
hoelzl@59092
   207
hoelzl@59092
   208
lemma embed_measure_eq_iff:
hoelzl@59092
   209
  assumes "inj f"
hoelzl@59092
   210
  shows "embed_measure A f = embed_measure B f \<longleftrightarrow> A = B" (is "?M = ?N \<longleftrightarrow> _")
hoelzl@59092
   211
proof
hoelzl@59092
   212
  from assms have I: "inj (op` f)" by (auto intro: injI dest: injD)
hoelzl@59092
   213
  assume asm: "?M = ?N"
hoelzl@59092
   214
  hence "sets (embed_measure A f) = sets (embed_measure B f)" by simp
hoelzl@59092
   215
  with assms have "sets A = sets B" by (simp only: I inj_image_eq_iff sets_embed_measure_alt)
hoelzl@59092
   216
  moreover {
hoelzl@59092
   217
    fix X assume "X \<in> sets A"
hoelzl@59092
   218
    from asm have "emeasure ?M (f`X) = emeasure ?N (f`X)" by simp
hoelzl@59092
   219
    with `X \<in> sets A` and `sets A = sets B` and assms 
hoelzl@59092
   220
        have "emeasure A X = emeasure B X" by (simp add: emeasure_embed_measure_image)
hoelzl@59092
   221
  }
hoelzl@59092
   222
  ultimately show "A = B" by (rule measure_eqI)
hoelzl@59092
   223
qed simp
hoelzl@59092
   224
hoelzl@59092
   225
lemma the_inv_into_in_Pi: "inj_on f A \<Longrightarrow> the_inv_into A f \<in> f ` A \<rightarrow> A"
hoelzl@59092
   226
  by (auto simp: the_inv_into_f_f)
hoelzl@59092
   227
hoelzl@59092
   228
lemma map_prod_image: "map_prod f g ` (A \<times> B) = (f`A) \<times> (g`B)"
hoelzl@59092
   229
  using map_prod_surj_on[OF refl refl] .
hoelzl@59092
   230
hoelzl@59092
   231
lemma map_prod_vimage: "map_prod f g -` (A \<times> B) = (f-`A) \<times> (g-`B)"
hoelzl@59092
   232
  by auto
hoelzl@59092
   233
hoelzl@59092
   234
lemma embed_measure_prod:
hoelzl@59092
   235
  assumes f: "inj f" and g: "inj g" and [simp]: "sigma_finite_measure M" "sigma_finite_measure N"
hoelzl@59092
   236
  shows "embed_measure M f \<Otimes>\<^sub>M embed_measure N g = embed_measure (M \<Otimes>\<^sub>M N) (\<lambda>(x, y). (f x, g y))"
hoelzl@59092
   237
    (is "?L = _")
hoelzl@59092
   238
  unfolding map_prod_def[symmetric]
hoelzl@59092
   239
proof (rule pair_measure_eqI)
hoelzl@59092
   240
  have fg[simp]: "\<And>A. inj_on (map_prod f g) A" "\<And>A. inj_on f A" "\<And>A. inj_on g A"
hoelzl@59092
   241
    using f g by (auto simp: inj_on_def)
hoelzl@59092
   242
  
hoelzl@59092
   243
  show sets: "sets ?L = sets (embed_measure (M \<Otimes>\<^sub>M N) (map_prod f g))"
hoelzl@59092
   244
    unfolding map_prod_def[symmetric]
hoelzl@59092
   245
    apply (simp add: sets_pair_eq_sets_fst_snd sets_embed_eq_vimage_algebra
hoelzl@59092
   246
      cong: vimage_algebra_cong)
hoelzl@59092
   247
    apply (subst vimage_algebra_Sup_sigma)
hoelzl@59092
   248
    apply (simp_all add: space_pair_measure[symmetric])
hoelzl@59092
   249
    apply (auto simp add: the_inv_into_f_f
hoelzl@59092
   250
                simp del: map_prod_simp
hoelzl@59092
   251
                del: prod_fun_imageE) []
hoelzl@59092
   252
    apply (subst (1 2 3 4 ) vimage_algebra_vimage_algebra_eq)
hoelzl@59092
   253
    apply (simp_all add: the_inv_into_in_Pi Pi_iff[of snd] Pi_iff[of fst] space_pair_measure)
hoelzl@59092
   254
    apply (simp_all add: Pi_iff[of snd] Pi_iff[of fst] the_inv_into_in_Pi vimage_algebra_vimage_algebra_eq
hoelzl@59092
   255
       space_pair_measure[symmetric] map_prod_image[symmetric])
hoelzl@59092
   256
    apply (intro arg_cong[where f=sets] arg_cong[where f=Sup_sigma] arg_cong2[where f=insert] vimage_algebra_cong)
hoelzl@59092
   257
    apply (auto simp: map_prod_image the_inv_into_f_f
hoelzl@59092
   258
                simp del: map_prod_simp del: prod_fun_imageE)
hoelzl@59092
   259
    apply (simp_all add: the_inv_into_f_f space_pair_measure)
hoelzl@59092
   260
    done
hoelzl@59092
   261
hoelzl@59092
   262
  note measurable_embed_measure2[measurable]
hoelzl@59092
   263
  fix A B assume AB: "A \<in> sets (embed_measure M f)" "B \<in> sets (embed_measure N g)"
hoelzl@59092
   264
  moreover have "f -` A \<times> g -` B \<inter> space (M \<Otimes>\<^sub>M N) = (f -` A \<inter> space M) \<times> (g -` B \<inter> space N)"
hoelzl@59092
   265
    by (auto simp: space_pair_measure)
hoelzl@59092
   266
  ultimately show "emeasure (embed_measure M f) A * emeasure (embed_measure N g) B =
hoelzl@59092
   267
                     emeasure (embed_measure (M \<Otimes>\<^sub>M N) (map_prod f g)) (A \<times> B)"
hoelzl@59092
   268
    by (simp add: map_prod_vimage sets[symmetric] emeasure_embed_measure
hoelzl@59092
   269
                  sigma_finite_measure.emeasure_pair_measure_Times)
hoelzl@59092
   270
qed (insert assms, simp_all add: sigma_finite_embed_measure)
hoelzl@59092
   271
hoelzl@59092
   272
lemma density_embed_measure:
hoelzl@59092
   273
  assumes inj: "inj f" and Mg[measurable]: "g \<in> borel_measurable (embed_measure M f)"
hoelzl@59092
   274
  shows "density (embed_measure M f) g = embed_measure (density M (g \<circ> f)) f" (is "?M1 = ?M2")
hoelzl@59092
   275
proof (rule measure_eqI)
hoelzl@59092
   276
  fix X assume X: "X \<in> sets ?M1"
hoelzl@59092
   277
  from inj have Mf[measurable]: "f \<in> measurable M (embed_measure M f)" 
hoelzl@59092
   278
    by (rule measurable_embed_measure2)
hoelzl@59092
   279
  from Mg and X have "emeasure ?M1 X = \<integral>\<^sup>+ x. g x * indicator X x \<partial>embed_measure M f" 
hoelzl@59092
   280
    by (subst emeasure_density) simp_all
hoelzl@59092
   281
  also from X have "... = \<integral>\<^sup>+ x. g (f x) * indicator X (f x) \<partial>M"
hoelzl@59092
   282
    by (subst embed_measure_eq_distr[OF inj], subst nn_integral_distr)
hoelzl@59092
   283
       (auto intro!: borel_measurable_ereal_times borel_measurable_indicator)
hoelzl@59092
   284
  also have "... = \<integral>\<^sup>+ x. g (f x) * indicator (f -` X \<inter> space M) x \<partial>M"
hoelzl@59092
   285
    by (intro nn_integral_cong) (auto split: split_indicator)
hoelzl@59092
   286
  also from X have "... = emeasure (density M (g \<circ> f)) (f -` X \<inter> space M)"
hoelzl@59092
   287
    by (subst emeasure_density) (simp_all add: measurable_comp[OF Mf Mg] measurable_sets[OF Mf])
hoelzl@59092
   288
  also from X and inj have "... = emeasure ?M2 X" 
hoelzl@59092
   289
    by (subst emeasure_embed_measure) (simp_all add: sets_embed_measure)
hoelzl@59092
   290
  finally show "emeasure ?M1 X = emeasure ?M2 X" .
hoelzl@59092
   291
qed (simp_all add: sets_embed_measure inj)
hoelzl@59092
   292
hoelzl@59092
   293
lemma density_embed_measure':
hoelzl@59092
   294
  assumes inj: "inj f" and inv: "\<And>x. f' (f x) = x" and Mg[measurable]: "g \<in> borel_measurable M"
hoelzl@59092
   295
  shows "density (embed_measure M f) (g \<circ> f') = embed_measure (density M g) f"
hoelzl@59092
   296
proof-
hoelzl@59092
   297
  have "density (embed_measure M f) (g \<circ> f') = embed_measure (density M (g \<circ> f' \<circ> f)) f"
hoelzl@59092
   298
    by (rule density_embed_measure[OF inj])
hoelzl@59092
   299
       (rule measurable_comp, rule measurable_embed_measure1, subst measurable_cong, 
hoelzl@59092
   300
        rule inv, rule measurable_ident_sets, simp, rule Mg)
hoelzl@59092
   301
  also have "density M (g \<circ> f' \<circ> f) = density M g"
hoelzl@59092
   302
    by (intro density_cong) (subst measurable_cong, simp add: o_def inv, simp_all add: Mg inv)
hoelzl@59092
   303
  finally show ?thesis .
hoelzl@59092
   304
qed
hoelzl@59092
   305
hoelzl@59092
   306
lemma inj_on_image_subset_iff:
hoelzl@59092
   307
  assumes "inj_on f C" "A \<subseteq> C"  "B \<subseteq> C"
hoelzl@59092
   308
  shows "f ` A \<subseteq> f ` B \<longleftrightarrow> A \<subseteq> B"
hoelzl@59092
   309
proof (intro iffI subsetI)
hoelzl@59092
   310
  fix x assume A: "f ` A \<subseteq> f ` B" and B: "x \<in> A"
hoelzl@59092
   311
  from B have "f x \<in> f ` A" by blast
hoelzl@59092
   312
  with A have "f x \<in> f ` B" by blast
hoelzl@59092
   313
  then obtain y where "f x = f y" and "y \<in> B" by blast
hoelzl@59092
   314
  with assms and B have "x = y" by (auto dest: inj_onD)
hoelzl@59092
   315
  with `y \<in> B` show "x \<in> B" by simp
hoelzl@59092
   316
qed auto
hoelzl@59092
   317
  
hoelzl@59092
   318
hoelzl@59092
   319
lemma AE_embed_measure':
hoelzl@59092
   320
  assumes inj: "inj_on f (space M)"
hoelzl@59092
   321
  shows "(AE x in embed_measure M f. P x) \<longleftrightarrow> (AE x in M. P (f x))"
hoelzl@59092
   322
proof
hoelzl@59092
   323
  let ?M = "embed_measure M f"
hoelzl@59092
   324
  assume "AE x in ?M. P x"
hoelzl@59092
   325
  then obtain A where A_props: "A \<in> sets ?M" "emeasure ?M A = 0" "{x\<in>space ?M. \<not>P x} \<subseteq> A"
hoelzl@59092
   326
    by (force elim: AE_E)
hoelzl@59092
   327
  then obtain A' where A'_props: "A = f ` A'" "A' \<in> sets M" by (auto simp: sets_embed_measure' inj)
hoelzl@59092
   328
  moreover have B: "{x\<in>space ?M. \<not>P x} = f ` {x\<in>space M. \<not>P (f x)}" 
hoelzl@59092
   329
    by (auto simp: inj space_embed_measure)
hoelzl@59092
   330
  from A_props(3) have "{x\<in>space M. \<not>P (f x)} \<subseteq> A'"
hoelzl@59092
   331
    by (subst (asm) B, subst (asm) A'_props, subst (asm) inj_on_image_subset_iff[OF inj])
hoelzl@59092
   332
       (insert A'_props, auto dest: sets.sets_into_space)
hoelzl@59092
   333
  moreover from A_props A'_props have "emeasure M A' = 0"
hoelzl@59092
   334
    by (simp add: emeasure_embed_measure_image' inj)
hoelzl@59092
   335
  ultimately show "AE x in M. P (f x)" by (intro AE_I)
hoelzl@59092
   336
next
hoelzl@59092
   337
  let ?M = "embed_measure M f"
hoelzl@59092
   338
  assume "AE x in M. P (f x)"
hoelzl@59092
   339
  then obtain A where A_props: "A \<in> sets M" "emeasure M A = 0" "{x\<in>space M. \<not>P (f x)} \<subseteq> A"
hoelzl@59092
   340
    by (force elim: AE_E)
hoelzl@59092
   341
  hence "f`A \<in> sets ?M" "emeasure ?M (f`A) = 0" "{x\<in>space ?M. \<not>P x} \<subseteq> f`A"
hoelzl@59092
   342
    by (auto simp: space_embed_measure emeasure_embed_measure_image' sets_embed_measure' inj)
hoelzl@59092
   343
  thus "AE x in ?M. P x" by (intro AE_I)
hoelzl@59092
   344
qed
hoelzl@59092
   345
hoelzl@59092
   346
lemma AE_embed_measure:
hoelzl@59092
   347
  assumes inj: "inj f"
hoelzl@59092
   348
  shows "(AE x in embed_measure M f. P x) \<longleftrightarrow> (AE x in M. P (f x))"
hoelzl@59092
   349
  using assms by (intro AE_embed_measure') (auto intro!: inj_onI dest: injD)
hoelzl@59092
   350
Andreas@60065
   351
lemma nn_integral_monotone_convergence_SUP_countable:
Andreas@60065
   352
  fixes f :: "'a \<Rightarrow> 'b \<Rightarrow> ereal"
Andreas@60065
   353
  assumes nonempty: "Y \<noteq> {}"
Andreas@60065
   354
  and chain: "Complete_Partial_Order.chain op \<le> (f ` Y)"
Andreas@60065
   355
  and countable: "countable B"
Andreas@60065
   356
  shows "(\<integral>\<^sup>+ x. (SUP i:Y. f i x) \<partial>count_space B) = (SUP i:Y. (\<integral>\<^sup>+ x. f i x \<partial>count_space B))"
Andreas@60065
   357
  (is "?lhs = ?rhs")
Andreas@60065
   358
proof -
Andreas@60065
   359
  let ?f = "(\<lambda>i x. f i (from_nat_into B x) * indicator (to_nat_on B ` B) x)"
Andreas@60065
   360
  have "?lhs = \<integral>\<^sup>+ x. (SUP i:Y. f i (from_nat_into B (to_nat_on B x))) \<partial>count_space B"
Andreas@60065
   361
    by(rule nn_integral_cong)(simp add: countable)
Andreas@60065
   362
  also have "\<dots> = \<integral>\<^sup>+ x. (SUP i:Y. f i (from_nat_into B x)) \<partial>count_space (to_nat_on B ` B)"
Andreas@60065
   363
    by(simp add: embed_measure_count_space'[symmetric] inj_on_to_nat_on countable nn_integral_embed_measure' measurable_embed_measure1)
Andreas@60065
   364
  also have "\<dots> = \<integral>\<^sup>+ x. (SUP i:Y. ?f i x) \<partial>count_space UNIV"
Andreas@60065
   365
    by(simp add: nn_integral_count_space_indicator ereal_indicator[symmetric] Sup_ereal_mult_right' nonempty)
Andreas@60065
   366
  also have "\<dots> = (SUP i:Y. \<integral>\<^sup>+ x. ?f i x \<partial>count_space UNIV)" using nonempty
Andreas@60065
   367
  proof(rule nn_integral_monotone_convergence_SUP_nat)
Andreas@60065
   368
    show "Complete_Partial_Order.chain op \<le> (?f ` Y)"
Andreas@60065
   369
      by(rule chain_imageI[OF chain, unfolded image_image])(auto intro!: le_funI split: split_indicator dest: le_funD)
Andreas@60065
   370
  qed
Andreas@60065
   371
  also have "\<dots> = (SUP i:Y. \<integral>\<^sup>+ x. f i (from_nat_into B x) \<partial>count_space (to_nat_on B ` B))"
Andreas@60065
   372
    by(simp add: nn_integral_count_space_indicator)
Andreas@60065
   373
  also have "\<dots> = (SUP i:Y. \<integral>\<^sup>+ x. f i (from_nat_into B (to_nat_on B x)) \<partial>count_space B)"
Andreas@60065
   374
    by(simp add: embed_measure_count_space'[symmetric] inj_on_to_nat_on countable nn_integral_embed_measure' measurable_embed_measure1)
Andreas@60065
   375
  also have "\<dots> = ?rhs" 
Andreas@60065
   376
    by(intro arg_cong2[where f="SUPREMUM"] ext nn_integral_cong_AE)(simp_all add: AE_count_space countable)
Andreas@60065
   377
  finally show ?thesis .
Andreas@60065
   378
qed
Andreas@60065
   379
hoelzl@59092
   380
end