src/HOL/Probability/Stream_Space.thy
author hoelzl
Fri, 30 Sep 2016 16:08:38 +0200
changeset 64008 17a20ca86d62
parent 63333 158ab2239496
child 64320 ba194424b895
permissions -rw-r--r--
HOL-Probability: more about probability, prepare for Markov processes in the AFP
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
58606
9c66f7c541fb add Giry monad
hoelzl
parents: 58588
diff changeset
     1
(*  Title:      HOL/Probability/Stream_Space.thy
9c66f7c541fb add Giry monad
hoelzl
parents: 58588
diff changeset
     2
    Author:     Johannes Hölzl, TU München *)
9c66f7c541fb add Giry monad
hoelzl
parents: 58588
diff changeset
     3
58588
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
     4
theory Stream_Space
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
     5
imports
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
     6
  Infinite_Product_Measure
58607
1f90ea1b4010 move Stream theory from Datatype_Examples to Library
hoelzl
parents: 58606
diff changeset
     7
  "~~/src/HOL/Library/Stream"
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
     8
  "~~/src/HOL/Library/Linear_Temporal_Logic_on_Streams"
58588
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
     9
begin
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    10
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    11
lemma stream_eq_Stream_iff: "s = x ## t \<longleftrightarrow> (shd s = x \<and> stl s = t)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    12
  by (cases s) simp
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    13
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    14
lemma Stream_snth: "(x ## s) !! n = (case n of 0 \<Rightarrow> x | Suc n \<Rightarrow> s !! n)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    15
  by (cases n) simp_all
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    16
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    17
definition to_stream :: "(nat \<Rightarrow> 'a) \<Rightarrow> 'a stream" where
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    18
  "to_stream X = smap X nats"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    19
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    20
lemma to_stream_nat_case: "to_stream (case_nat x X) = x ## to_stream X"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    21
  unfolding to_stream_def
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    22
  by (subst siterate.ctr) (simp add: smap_siterate[symmetric] stream.map_comp comp_def)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    23
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
    24
lemma to_stream_in_streams: "to_stream X \<in> streams S \<longleftrightarrow> (\<forall>n. X n \<in> S)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
    25
  by (simp add: to_stream_def streams_iff_snth)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
    26
58588
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    27
definition stream_space :: "'a measure \<Rightarrow> 'a stream measure" where
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    28
  "stream_space M =
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    29
    distr (\<Pi>\<^sub>M i\<in>UNIV. M) (vimage_algebra (streams (space M)) snth (\<Pi>\<^sub>M i\<in>UNIV. M)) to_stream"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    30
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    31
lemma space_stream_space: "space (stream_space M) = streams (space M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    32
  by (simp add: stream_space_def)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    33
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    34
lemma streams_stream_space[intro]: "streams (space M) \<in> sets (stream_space M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    35
  using sets.top[of "stream_space M"] by (simp add: space_stream_space)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    36
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    37
lemma stream_space_Stream:
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    38
  "x ## \<omega> \<in> space (stream_space M) \<longleftrightarrow> x \<in> space M \<and> \<omega> \<in> space (stream_space M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    39
  by (simp add: space_stream_space streams_Stream)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    40
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    41
lemma stream_space_eq_distr: "stream_space M = distr (\<Pi>\<^sub>M i\<in>UNIV. M) (stream_space M) to_stream"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    42
  unfolding stream_space_def by (rule distr_cong) auto
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    43
59048
7dc8ac6f0895 add congruence solver to measurability prover
hoelzl
parents: 59000
diff changeset
    44
lemma sets_stream_space_cong[measurable_cong]:
7dc8ac6f0895 add congruence solver to measurability prover
hoelzl
parents: 59000
diff changeset
    45
  "sets M = sets N \<Longrightarrow> sets (stream_space M) = sets (stream_space N)"
58588
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    46
  using sets_eq_imp_space_eq[of M N] by (simp add: stream_space_def vimage_algebra_def cong: sets_PiM_cong)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    47
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    48
lemma measurable_snth_PiM: "(\<lambda>\<omega> n. \<omega> !! n) \<in> measurable (stream_space M) (\<Pi>\<^sub>M i\<in>UNIV. M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    49
  by (auto intro!: measurable_vimage_algebra1
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    50
           simp: space_PiM streams_iff_sset sset_range image_subset_iff stream_space_def)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    51
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    52
lemma measurable_snth[measurable]: "(\<lambda>\<omega>. \<omega> !! n) \<in> measurable (stream_space M) M"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    53
  using measurable_snth_PiM measurable_component_singleton by (rule measurable_compose) simp
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    54
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    55
lemma measurable_shd[measurable]: "shd \<in> measurable (stream_space M) M"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    56
  using measurable_snth[of 0] by simp
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    57
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    58
lemma measurable_stream_space2:
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    59
  assumes f_snth: "\<And>n. (\<lambda>x. f x !! n) \<in> measurable N M"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    60
  shows "f \<in> measurable N (stream_space M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    61
  unfolding stream_space_def measurable_distr_eq2
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    62
proof (rule measurable_vimage_algebra2)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    63
  show "f \<in> space N \<rightarrow> streams (space M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    64
    using f_snth[THEN measurable_space] by (auto simp add: streams_iff_sset sset_range)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    65
  show "(\<lambda>x. op !! (f x)) \<in> measurable N (Pi\<^sub>M UNIV (\<lambda>i. M))"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    66
  proof (rule measurable_PiM_single')
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    67
    show "(\<lambda>x. op !! (f x)) \<in> space N \<rightarrow> UNIV \<rightarrow>\<^sub>E space M"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    68
      using f_snth[THEN measurable_space] by auto
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    69
  qed (rule f_snth)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    70
qed
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    71
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    72
lemma measurable_stream_coinduct[consumes 1, case_names shd stl, coinduct set: measurable]:
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    73
  assumes "F f"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    74
  assumes h: "\<And>f. F f \<Longrightarrow> (\<lambda>x. shd (f x)) \<in> measurable N M"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    75
  assumes t: "\<And>f. F f \<Longrightarrow> F (\<lambda>x. stl (f x))"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    76
  shows "f \<in> measurable N (stream_space M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    77
proof (rule measurable_stream_space2)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    78
  fix n show "(\<lambda>x. f x !! n) \<in> measurable N M"
61808
fc1556774cfe isabelle update_cartouches -c -t;
wenzelm
parents: 61169
diff changeset
    79
    using \<open>F f\<close> by (induction n arbitrary: f) (auto intro: h t)
58588
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    80
qed
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    81
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    82
lemma measurable_sdrop[measurable]: "sdrop n \<in> measurable (stream_space M) (stream_space M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    83
  by (rule measurable_stream_space2) (simp add: sdrop_snth)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    84
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    85
lemma measurable_stl[measurable]: "(\<lambda>\<omega>. stl \<omega>) \<in> measurable (stream_space M) (stream_space M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    86
  by (rule measurable_stream_space2) (simp del: snth.simps add: snth.simps[symmetric])
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    87
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    88
lemma measurable_to_stream[measurable]: "to_stream \<in> measurable (\<Pi>\<^sub>M i\<in>UNIV. M) (stream_space M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    89
  by (rule measurable_stream_space2) (simp add: to_stream_def)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    90
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    91
lemma measurable_Stream[measurable (raw)]:
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    92
  assumes f[measurable]: "f \<in> measurable N M"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    93
  assumes g[measurable]: "g \<in> measurable N (stream_space M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    94
  shows "(\<lambda>x. f x ## g x) \<in> measurable N (stream_space M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    95
  by (rule measurable_stream_space2) (simp add: Stream_snth)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    96
63333
158ab2239496 Probability: show that measures form a complete lattice
hoelzl
parents: 61810
diff changeset
    97
lemma measurable_smap[measurable]:
58588
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    98
  assumes X[measurable]: "X \<in> measurable N M"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
    99
  shows "smap X \<in> measurable (stream_space N) (stream_space M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   100
  by (rule measurable_stream_space2) simp
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   101
63333
158ab2239496 Probability: show that measures form a complete lattice
hoelzl
parents: 61810
diff changeset
   102
lemma measurable_stake[measurable]:
58588
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   103
  "stake i \<in> measurable (stream_space (count_space UNIV)) (count_space (UNIV :: 'a::countable list set))"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   104
  by (induct i) auto
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   105
63333
158ab2239496 Probability: show that measures form a complete lattice
hoelzl
parents: 61810
diff changeset
   106
lemma measurable_shift[measurable]:
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   107
  assumes f: "f \<in> measurable N (stream_space M)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   108
  assumes [measurable]: "g \<in> measurable N (stream_space M)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   109
  shows "(\<lambda>x. stake n (f x) @- g x) \<in> measurable N (stream_space M)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   110
  using f by (induction n arbitrary: f) simp_all
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   111
64008
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   112
lemma measurable_case_stream_replace[measurable (raw)]:
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   113
  "(\<lambda>x. f x (shd (g x)) (stl (g x))) \<in> measurable M N \<Longrightarrow> (\<lambda>x. case_stream (f x) (g x)) \<in> measurable M N"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   114
  unfolding stream.case_eq_if .
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   115
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   116
lemma measurable_ev_at[measurable]:
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   117
  assumes [measurable]: "Measurable.pred (stream_space M) P"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   118
  shows "Measurable.pred (stream_space M) (ev_at P n)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   119
  by (induction n) auto
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   120
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   121
lemma measurable_alw[measurable]:
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   122
  "Measurable.pred (stream_space M) P \<Longrightarrow> Measurable.pred (stream_space M) (alw P)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   123
  unfolding alw_def
60172
423273355b55 rename continuous and down_continuous in Order_Continuity to sup_/inf_continuous; relate them with topological continuity
hoelzl
parents: 59092
diff changeset
   124
  by (coinduction rule: measurable_gfp_coinduct) (auto simp: inf_continuous_def)
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   125
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   126
lemma measurable_ev[measurable]:
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   127
  "Measurable.pred (stream_space M) P \<Longrightarrow> Measurable.pred (stream_space M) (ev P)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   128
  unfolding ev_def
60172
423273355b55 rename continuous and down_continuous in Order_Continuity to sup_/inf_continuous; relate them with topological continuity
hoelzl
parents: 59092
diff changeset
   129
  by (coinduction rule: measurable_lfp_coinduct) (auto simp: sup_continuous_def)
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   130
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   131
lemma measurable_until:
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   132
  assumes [measurable]: "Measurable.pred (stream_space M) \<phi>" "Measurable.pred (stream_space M) \<psi>"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   133
  shows "Measurable.pred (stream_space M) (\<phi> until \<psi>)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   134
  unfolding UNTIL_def
60172
423273355b55 rename continuous and down_continuous in Order_Continuity to sup_/inf_continuous; relate them with topological continuity
hoelzl
parents: 59092
diff changeset
   135
  by (coinduction rule: measurable_gfp_coinduct) (simp_all add: inf_continuous_def fun_eq_iff)
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   136
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   137
lemma measurable_holds [measurable]: "Measurable.pred M P \<Longrightarrow> Measurable.pred (stream_space M) (holds P)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   138
  unfolding holds.simps[abs_def]
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   139
  by (rule measurable_compose[OF measurable_shd]) simp
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   140
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   141
lemma measurable_hld[measurable]: assumes [measurable]: "t \<in> sets M" shows "Measurable.pred (stream_space M) (HLD t)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   142
  unfolding HLD_def by measurable
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   143
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   144
lemma measurable_nxt[measurable (raw)]:
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   145
  "Measurable.pred (stream_space M) P \<Longrightarrow> Measurable.pred (stream_space M) (nxt P)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   146
  unfolding nxt.simps[abs_def] by simp
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   147
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   148
lemma measurable_suntil[measurable]:
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   149
  assumes [measurable]: "Measurable.pred (stream_space M) Q" "Measurable.pred (stream_space M) P"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   150
  shows "Measurable.pred (stream_space M) (Q suntil P)"
60172
423273355b55 rename continuous and down_continuous in Order_Continuity to sup_/inf_continuous; relate them with topological continuity
hoelzl
parents: 59092
diff changeset
   151
  unfolding suntil_def by (coinduction rule: measurable_lfp_coinduct) (auto simp: sup_continuous_def)
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   152
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   153
lemma measurable_szip:
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   154
  "(\<lambda>(\<omega>1, \<omega>2). szip \<omega>1 \<omega>2) \<in> measurable (stream_space M \<Otimes>\<^sub>M stream_space N) (stream_space (M \<Otimes>\<^sub>M N))"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   155
proof (rule measurable_stream_space2)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   156
  fix n
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   157
  have "(\<lambda>x. (case x of (\<omega>1, \<omega>2) \<Rightarrow> szip \<omega>1 \<omega>2) !! n) = (\<lambda>(\<omega>1, \<omega>2). (\<omega>1 !! n, \<omega>2 !! n))"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   158
    by auto
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   159
  also have "\<dots> \<in> measurable (stream_space M \<Otimes>\<^sub>M stream_space N) (M \<Otimes>\<^sub>M N)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   160
    by measurable
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   161
  finally show "(\<lambda>x. (case x of (\<omega>1, \<omega>2) \<Rightarrow> szip \<omega>1 \<omega>2) !! n) \<in> measurable (stream_space M \<Otimes>\<^sub>M stream_space N) (M \<Otimes>\<^sub>M N)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   162
    .
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   163
qed
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   164
58588
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   165
lemma (in prob_space) prob_space_stream_space: "prob_space (stream_space M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   166
proof -
61169
4de9ff3ea29a tuned proofs -- less legacy;
wenzelm
parents: 60172
diff changeset
   167
  interpret product_prob_space "\<lambda>_. M" UNIV ..
58588
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   168
  show ?thesis
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   169
    by (subst stream_space_eq_distr) (auto intro!: P.prob_space_distr)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   170
qed
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   171
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   172
lemma (in prob_space) nn_integral_stream_space:
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   173
  assumes [measurable]: "f \<in> borel_measurable (stream_space M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   174
  shows "(\<integral>\<^sup>+X. f X \<partial>stream_space M) = (\<integral>\<^sup>+x. (\<integral>\<^sup>+X. f (x ## X) \<partial>stream_space M) \<partial>M)"
63333
158ab2239496 Probability: show that measures form a complete lattice
hoelzl
parents: 61810
diff changeset
   175
proof -
61169
4de9ff3ea29a tuned proofs -- less legacy;
wenzelm
parents: 60172
diff changeset
   176
  interpret S: sequence_space M ..
4de9ff3ea29a tuned proofs -- less legacy;
wenzelm
parents: 60172
diff changeset
   177
  interpret P: pair_sigma_finite M "\<Pi>\<^sub>M i::nat\<in>UNIV. M" ..
58588
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   178
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   179
  have "(\<integral>\<^sup>+X. f X \<partial>stream_space M) = (\<integral>\<^sup>+X. f (to_stream X) \<partial>S.S)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   180
    by (subst stream_space_eq_distr) (simp add: nn_integral_distr)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   181
  also have "\<dots> = (\<integral>\<^sup>+X. f (to_stream ((\<lambda>(s, \<omega>). case_nat s \<omega>) X)) \<partial>(M \<Otimes>\<^sub>M S.S))"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   182
    by (subst S.PiM_iter[symmetric]) (simp add: nn_integral_distr)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   183
  also have "\<dots> = (\<integral>\<^sup>+x. \<integral>\<^sup>+X. f (to_stream ((\<lambda>(s, \<omega>). case_nat s \<omega>) (x, X))) \<partial>S.S \<partial>M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   184
    by (subst S.nn_integral_fst) simp_all
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   185
  also have "\<dots> = (\<integral>\<^sup>+x. \<integral>\<^sup>+X. f (x ## to_stream X) \<partial>S.S \<partial>M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   186
    by (auto intro!: nn_integral_cong simp: to_stream_nat_case)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   187
  also have "\<dots> = (\<integral>\<^sup>+x. \<integral>\<^sup>+X. f (x ## X) \<partial>stream_space M \<partial>M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   188
    by (subst stream_space_eq_distr)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   189
       (simp add: nn_integral_distr cong: nn_integral_cong)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   190
  finally show ?thesis .
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   191
qed
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   192
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   193
lemma (in prob_space) emeasure_stream_space:
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   194
  assumes X[measurable]: "X \<in> sets (stream_space M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   195
  shows "emeasure (stream_space M) X = (\<integral>\<^sup>+t. emeasure (stream_space M) {x\<in>space (stream_space M). t ## x \<in> X } \<partial>M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   196
proof -
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   197
  have eq: "\<And>x xs. xs \<in> space (stream_space M) \<Longrightarrow> x \<in> space M \<Longrightarrow>
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   198
      indicator X (x ## xs) = indicator {xs\<in>space (stream_space M). x ## xs \<in> X } xs"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   199
    by (auto split: split_indicator)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   200
  show ?thesis
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   201
    using nn_integral_stream_space[of "indicator X"]
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   202
    apply (auto intro!: nn_integral_cong)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   203
    apply (subst nn_integral_cong)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   204
    apply (rule eq)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   205
    apply simp_all
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   206
    done
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   207
qed
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   208
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   209
lemma (in prob_space) prob_stream_space:
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   210
  assumes P[measurable]: "{x\<in>space (stream_space M). P x} \<in> sets (stream_space M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   211
  shows "\<P>(x in stream_space M. P x) = (\<integral>\<^sup>+t. \<P>(x in stream_space M. P (t ## x)) \<partial>M)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   212
proof -
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   213
  interpret S: prob_space "stream_space M"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   214
    by (rule prob_space_stream_space)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   215
  show ?thesis
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   216
    unfolding S.emeasure_eq_measure[symmetric]
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   217
    by (subst emeasure_stream_space) (auto simp: stream_space_Stream intro!: nn_integral_cong)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   218
qed
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   219
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   220
lemma (in prob_space) AE_stream_space:
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   221
  assumes [measurable]: "Measurable.pred (stream_space M) P"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   222
  shows "(AE X in stream_space M. P X) = (AE x in M. AE X in stream_space M. P (x ## X))"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   223
proof -
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   224
  interpret stream: prob_space "stream_space M"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   225
    by (rule prob_space_stream_space)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   226
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   227
  have eq: "\<And>x X. indicator {x. \<not> P x} (x ## X) = indicator {X. \<not> P (x ## X)} X"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   228
    by (auto split: split_indicator)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   229
  show ?thesis
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   230
    apply (subst AE_iff_nn_integral, simp)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   231
    apply (subst nn_integral_stream_space, simp)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   232
    apply (subst eq)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   233
    apply (subst nn_integral_0_iff_AE, simp)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   234
    apply (simp add: AE_iff_nn_integral[symmetric])
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   235
    done
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   236
qed
63333
158ab2239496 Probability: show that measures form a complete lattice
hoelzl
parents: 61810
diff changeset
   237
58588
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   238
lemma (in prob_space) AE_stream_all:
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   239
  assumes [measurable]: "Measurable.pred M P" and P: "AE x in M. P x"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   240
  shows "AE x in stream_space M. stream_all P x"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   241
proof -
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   242
  { fix n have "AE x in stream_space M. P (x !! n)"
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   243
    proof (induct n)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   244
      case 0 with P show ?case
61810
3c5040d5694a sorted out eventually_mono
paulson <lp15@cam.ac.uk>
parents: 61808
diff changeset
   245
        by (subst AE_stream_space) (auto elim!: eventually_mono)
58588
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   246
    next
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   247
      case (Suc n) then show ?case
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   248
        by (subst AE_stream_space) auto
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   249
    qed }
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   250
  then show ?thesis
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   251
    unfolding stream_all_def by (simp add: AE_all_countable)
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   252
qed
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   253
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   254
lemma streams_sets:
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   255
  assumes X[measurable]: "X \<in> sets M" shows "streams X \<in> sets (stream_space M)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   256
proof -
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   257
  have "streams X = {x\<in>space (stream_space M). x \<in> streams X}"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   258
    using streams_mono[OF _ sets.sets_into_space[OF X]] by (auto simp: space_stream_space)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   259
  also have "\<dots> = {x\<in>space (stream_space M). gfp (\<lambda>p x. shd x \<in> X \<and> p (stl x)) x}"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   260
    apply (simp add: set_eq_iff streams_def streamsp_def)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   261
    apply (intro allI conj_cong refl arg_cong2[where f=gfp] ext)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   262
    apply (case_tac xa)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   263
    apply auto
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   264
    done
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   265
  also have "\<dots> \<in> sets (stream_space M)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   266
    apply (intro predE)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   267
    apply (coinduction rule: measurable_gfp_coinduct)
60172
423273355b55 rename continuous and down_continuous in Order_Continuity to sup_/inf_continuous; relate them with topological continuity
hoelzl
parents: 59092
diff changeset
   268
    apply (auto simp: inf_continuous_def)
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   269
    done
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   270
  finally show ?thesis .
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   271
qed
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   272
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   273
lemma sets_stream_space_in_sets:
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   274
  assumes space: "space N = streams (space M)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   275
  assumes sets: "\<And>i. (\<lambda>x. x !! i) \<in> measurable N M"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   276
  shows "sets (stream_space M) \<subseteq> sets N"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   277
  unfolding stream_space_def sets_distr
63333
158ab2239496 Probability: show that measures form a complete lattice
hoelzl
parents: 61810
diff changeset
   278
  by (auto intro!: sets_image_in_sets measurable_Sup2 measurable_vimage_algebra2 del: subsetI equalityI
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   279
           simp add: sets_PiM_eq_proj snth_in space sets cong: measurable_cong_sets)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   280
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   281
lemma sets_stream_space_eq: "sets (stream_space M) =
63333
158ab2239496 Probability: show that measures form a complete lattice
hoelzl
parents: 61810
diff changeset
   282
    sets (SUP i:UNIV. vimage_algebra (streams (space M)) (\<lambda>s. s !! i) M)"
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   283
  by (auto intro!: sets_stream_space_in_sets sets_Sup_in_sets sets_image_in_sets
63333
158ab2239496 Probability: show that measures form a complete lattice
hoelzl
parents: 61810
diff changeset
   284
                   measurable_Sup1 snth_in measurable_vimage_algebra1 del: subsetI
158ab2239496 Probability: show that measures form a complete lattice
hoelzl
parents: 61810
diff changeset
   285
           simp: space_Sup_eq_UN space_stream_space)
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   286
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   287
lemma sets_restrict_stream_space:
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   288
  assumes S[measurable]: "S \<in> sets M"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   289
  shows "sets (restrict_space (stream_space M) (streams S)) = sets (stream_space (restrict_space M S))"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   290
  using  S[THEN sets.sets_into_space]
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   291
  apply (subst restrict_space_eq_vimage_algebra)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   292
  apply (simp add: space_stream_space streams_mono2)
59092
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   293
  apply (subst vimage_algebra_cong[OF refl refl sets_stream_space_eq])
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   294
  apply (subst sets_stream_space_eq)
63333
158ab2239496 Probability: show that measures form a complete lattice
hoelzl
parents: 61810
diff changeset
   295
  apply (subst sets_vimage_Sup_eq[where Y="streams (space M)"])
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   296
  apply simp
63333
158ab2239496 Probability: show that measures form a complete lattice
hoelzl
parents: 61810
diff changeset
   297
  apply auto []
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   298
  apply (auto intro: streams_mono) []
63333
158ab2239496 Probability: show that measures form a complete lattice
hoelzl
parents: 61810
diff changeset
   299
  apply auto []
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   300
  apply (simp add: image_image space_restrict_space)
59092
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   301
  apply (simp add: vimage_algebra_cong[OF refl refl restrict_space_eq_vimage_algebra])
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   302
  apply (subst (1 2) vimage_algebra_vimage_algebra_eq)
63333
158ab2239496 Probability: show that measures form a complete lattice
hoelzl
parents: 61810
diff changeset
   303
  apply (auto simp: streams_mono snth_in )
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   304
  done
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   305
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   306
primrec sstart :: "'a set \<Rightarrow> 'a list \<Rightarrow> 'a stream set" where
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   307
  "sstart S [] = streams S"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   308
| [simp del]: "sstart S (x # xs) = op ## x ` sstart S xs"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   309
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   310
lemma in_sstart[simp]: "s \<in> sstart S (x # xs) \<longleftrightarrow> shd s = x \<and> stl s \<in> sstart S xs"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   311
  by (cases s) (auto simp: sstart.simps(2))
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   312
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   313
lemma sstart_in_streams: "xs \<in> lists S \<Longrightarrow> sstart S xs \<subseteq> streams S"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   314
  by (induction xs) (auto simp: sstart.simps(2))
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   315
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   316
lemma sstart_eq: "x \<in> streams S \<Longrightarrow> x \<in> sstart S xs = (\<forall>i<length xs. x !! i = xs ! i)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   317
  by (induction xs arbitrary: x) (auto simp: nth_Cons streams_stl split: nat.splits)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   318
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   319
lemma sstart_sets: "sstart S xs \<in> sets (stream_space (count_space UNIV))"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   320
proof (induction xs)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   321
  case (Cons x xs)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   322
  note Cons[measurable]
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   323
  have "sstart S (x # xs) =
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   324
    {s\<in>space (stream_space (count_space UNIV)). shd s = x \<and> stl s \<in> sstart S xs}"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   325
    by (simp add: set_eq_iff space_stream_space)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   326
  also have "\<dots> \<in> sets (stream_space (count_space UNIV))"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   327
    by measurable
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   328
  finally show ?case .
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   329
qed (simp add: streams_sets)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   330
59092
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   331
lemma sigma_sets_singletons:
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   332
  assumes "countable S"
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   333
  shows "sigma_sets S ((\<lambda>s. {s})`S) = Pow S"
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   334
proof safe
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   335
  interpret sigma_algebra S "sigma_sets S ((\<lambda>s. {s})`S)"
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   336
    by (rule sigma_algebra_sigma_sets) auto
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   337
  fix A assume "A \<subseteq> S"
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   338
  with assms have "(\<Union>a\<in>A. {a}) \<in> sigma_sets S ((\<lambda>s. {s})`S)"
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   339
    by (intro countable_UN') (auto dest: countable_subset)
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   340
  then show "A \<in> sigma_sets S ((\<lambda>s. {s})`S)"
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   341
    by simp
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   342
qed (auto dest: sigma_sets_into_sp[rotated])
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   343
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   344
lemma sets_count_space_eq_sigma:
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   345
  "countable S \<Longrightarrow> sets (count_space S) = sets (sigma S ((\<lambda>s. {s})`S))"
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   346
  by (subst sets_measure_of) (auto simp: sigma_sets_singletons)
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   347
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   348
lemma sets_stream_space_sstart:
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   349
  assumes S[simp]: "countable S"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   350
  shows "sets (stream_space (count_space S)) = sets (sigma (streams S) (sstart S`lists S \<union> {{}}))"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   351
proof
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   352
  have [simp]: "sstart S ` lists S \<subseteq> Pow (streams S)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   353
    by (simp add: image_subset_iff sstart_in_streams)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   354
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   355
  let ?S = "sigma (streams S) (sstart S ` lists S \<union> {{}})"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   356
  { fix i a assume "a \<in> S"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   357
    { fix x have "(x !! i = a \<and> x \<in> streams S) \<longleftrightarrow> (\<exists>xs\<in>lists S. length xs = i \<and> x \<in> sstart S (xs @ [a]))"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   358
      proof (induction i arbitrary: x)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   359
        case (Suc i) from this[of "stl x"] show ?case
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   360
          by (simp add: length_Suc_conv Bex_def ex_simps[symmetric] del: ex_simps)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   361
             (metis stream.collapse streams_Stream)
61808
fc1556774cfe isabelle update_cartouches -c -t;
wenzelm
parents: 61169
diff changeset
   362
      qed (insert \<open>a \<in> S\<close>, auto intro: streams_stl in_streams) }
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   363
    then have "(\<lambda>x. x !! i) -` {a} \<inter> streams S = (\<Union>xs\<in>{xs\<in>lists S. length xs = i}. sstart S (xs @ [a]))"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   364
      by (auto simp add: set_eq_iff)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   365
    also have "\<dots> \<in> sets ?S"
61808
fc1556774cfe isabelle update_cartouches -c -t;
wenzelm
parents: 61169
diff changeset
   366
      using \<open>a\<in>S\<close> by (intro sets.countable_UN') (auto intro!: sigma_sets.Basic image_eqI)
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   367
    finally have " (\<lambda>x. x !! i) -` {a} \<inter> streams S \<in> sets ?S" . }
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   368
  then show "sets (stream_space (count_space S)) \<subseteq> sets (sigma (streams S) (sstart S`lists S \<union> {{}}))"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   369
    by (intro sets_stream_space_in_sets) (auto simp: measurable_count_space_eq_countable snth_in)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   370
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   371
  have "sigma_sets (space (stream_space (count_space S))) (sstart S`lists S \<union> {{}}) \<subseteq> sets (stream_space (count_space S))"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   372
  proof (safe intro!: sets.sigma_sets_subset)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   373
    fix xs assume "\<forall>x\<in>set xs. x \<in> S"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   374
    then have "sstart S xs = {x\<in>space (stream_space (count_space S)). \<forall>i<length xs. x !! i = xs ! i}"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   375
      by (induction xs)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   376
         (auto simp: space_stream_space nth_Cons split: nat.split intro: in_streams streams_stl)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   377
    also have "\<dots> \<in> sets (stream_space (count_space S))"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   378
      by measurable
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   379
    finally show "sstart S xs \<in> sets (stream_space (count_space S))" .
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   380
  qed
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   381
  then show "sets (sigma (streams S) (sstart S`lists S \<union> {{}})) \<subseteq> sets (stream_space (count_space S))"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   382
    by (simp add: space_stream_space)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   383
qed
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   384
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   385
lemma Int_stable_sstart: "Int_stable (sstart S`lists S \<union> {{}})"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   386
proof -
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   387
  { fix xs ys assume "xs \<in> lists S" "ys \<in> lists S"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   388
    then have "sstart S xs \<inter> sstart S ys \<in> sstart S ` lists S \<union> {{}}"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   389
    proof (induction xs ys rule: list_induct2')
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   390
      case (4 x xs y ys)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   391
      show ?case
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   392
      proof cases
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   393
        assume "x = y"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   394
        then have "sstart S (x # xs) \<inter> sstart S (y # ys) = op ## x ` (sstart S xs \<inter> sstart S ys)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   395
          by (auto simp: image_iff intro!: stream.collapse[symmetric])
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   396
        also have "\<dots> \<in> sstart S ` lists S \<union> {{}}"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   397
          using 4 by (auto simp: sstart.simps(2)[symmetric] del: in_listsD)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   398
        finally show ?case .
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   399
      qed auto
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   400
    qed (simp_all add: sstart_in_streams inf.absorb1 inf.absorb2 image_eqI[where x="[]"]) }
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   401
  then show ?thesis
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   402
    by (auto simp: Int_stable_def)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   403
qed
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   404
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   405
lemma stream_space_eq_sstart:
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   406
  assumes S[simp]: "countable S"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   407
  assumes P: "prob_space M" "prob_space N"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   408
  assumes ae: "AE x in M. x \<in> streams S" "AE x in N. x \<in> streams S"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   409
  assumes sets_M: "sets M = sets (stream_space (count_space UNIV))"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   410
  assumes sets_N: "sets N = sets (stream_space (count_space UNIV))"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   411
  assumes *: "\<And>xs. xs \<noteq> [] \<Longrightarrow> xs \<in> lists S \<Longrightarrow> emeasure M (sstart S xs) = emeasure N (sstart S xs)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   412
  shows "M = N"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   413
proof (rule measure_eqI_restrict_generator[OF Int_stable_sstart])
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   414
  have [simp]: "sstart S ` lists S \<subseteq> Pow (streams S)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   415
    by (simp add: image_subset_iff sstart_in_streams)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   416
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   417
  interpret M: prob_space M by fact
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   418
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   419
  show "sstart S ` lists S \<union> {{}} \<subseteq> Pow (streams S)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   420
    by (auto dest: sstart_in_streams del: in_listsD)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   421
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   422
  { fix M :: "'a stream measure" assume M: "sets M = sets (stream_space (count_space UNIV))"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   423
    have "sets (restrict_space M (streams S)) = sigma_sets (streams S) (sstart S ` lists S \<union> {{}})"
59092
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   424
      by (subst sets_restrict_space_cong[OF M])
d469103c0737 add integral substitution theorems from Manuel Eberl, Jeremy Avigad, Luke Serafin, and Sudeep Kanav
hoelzl
parents: 59048
diff changeset
   425
         (simp add: sets_restrict_stream_space restrict_count_space sets_stream_space_sstart) }
59000
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   426
  from this[OF sets_M] this[OF sets_N]
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   427
  show "sets (restrict_space M (streams S)) = sigma_sets (streams S) (sstart S ` lists S \<union> {{}})"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   428
       "sets (restrict_space N (streams S)) = sigma_sets (streams S) (sstart S ` lists S \<union> {{}})"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   429
    by auto
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   430
  show "{streams S} \<subseteq> sstart S ` lists S \<union> {{}}"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   431
    "\<Union>{streams S} = streams S" "\<And>s. s \<in> {streams S} \<Longrightarrow> emeasure M s \<noteq> \<infinity>"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   432
    using M.emeasure_space_1 space_stream_space[of "count_space S"] sets_eq_imp_space_eq[OF sets_M]
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   433
    by (auto simp add: image_eqI[where x="[]"])
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   434
  show "sets M = sets N"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   435
    by (simp add: sets_M sets_N)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   436
next
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   437
  fix X assume "X \<in> sstart S ` lists S \<union> {{}}"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   438
  then obtain xs where "X = {} \<or> (xs \<in> lists S \<and> X = sstart S xs)"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   439
    by auto
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   440
  moreover have "emeasure M (streams S) = 1"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   441
    using ae by (intro prob_space.emeasure_eq_1_AE[OF P(1)]) (auto simp: sets_M streams_sets)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   442
  moreover have "emeasure N (streams S) = 1"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   443
    using ae by (intro prob_space.emeasure_eq_1_AE[OF P(2)]) (auto simp: sets_N streams_sets)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   444
  ultimately show "emeasure M X = emeasure N X"
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   445
    using P[THEN prob_space.emeasure_space_1]
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   446
    by (cases "xs = []") (auto simp: * space_stream_space del: in_listsD)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   447
qed (auto simp: * ae sets_M del: in_listsD intro!: streams_sets)
6eb0725503fc import general theorems from AFP/Markov_Models
hoelzl
parents: 58607
diff changeset
   448
64008
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   449
primrec scylinder :: "'a set \<Rightarrow> 'a set list \<Rightarrow> 'a stream set"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   450
where
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   451
  "scylinder S [] = streams S"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   452
| "scylinder S (A # As) = {\<omega>\<in>streams S. shd \<omega> \<in> A \<and> stl \<omega> \<in> scylinder S As}"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   453
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   454
lemma scylinder_streams: "scylinder S xs \<subseteq> streams S"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   455
  by (induction xs) auto
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   456
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   457
lemma sets_scylinder: "(\<forall>x\<in>set xs. x \<in> sets S) \<Longrightarrow> scylinder (space S) xs \<in> sets (stream_space S)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   458
  by (induction xs) (auto simp: space_stream_space[symmetric])
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   459
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   460
lemma stream_space_eq_scylinder:
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   461
  assumes P: "prob_space M" "prob_space N"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   462
  assumes "Int_stable G" and S: "sets S = sets (sigma (space S) G)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   463
    and C: "countable C" "C \<subseteq> G" "\<Union>C = space S" and G: "G \<subseteq> Pow (space S)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   464
  assumes sets_M: "sets M = sets (stream_space S)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   465
  assumes sets_N: "sets N = sets (stream_space S)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   466
  assumes *: "\<And>xs. xs \<noteq> [] \<Longrightarrow> xs \<in> lists G \<Longrightarrow> emeasure M (scylinder (space S) xs) = emeasure N (scylinder (space S) xs)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   467
  shows "M = N"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   468
proof (rule measure_eqI_generator_eq)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   469
  interpret M: prob_space M by fact
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   470
  interpret N: prob_space N by fact
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   471
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   472
  let ?G = "scylinder (space S) ` lists G"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   473
  show sc_Pow: "?G \<subseteq> Pow (streams (space S))"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   474
    using scylinder_streams by auto
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   475
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   476
  have "sets (stream_space S) = sets (sigma (streams (space S)) ?G)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   477
    (is "?S = sets ?R")
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   478
  proof (rule antisym)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   479
    let ?V = "\<lambda>i. vimage_algebra (streams (space S)) (\<lambda>s. s !! i) S"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   480
    show "?S \<subseteq> sets ?R"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   481
      unfolding sets_stream_space_eq
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   482
    proof (safe intro!: sets_Sup_in_sets del: subsetI equalityI)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   483
      fix i :: nat
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   484
      show "space (?V i) = space ?R"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   485
        using scylinder_streams by (subst space_measure_of) (auto simp: )
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   486
      { fix A assume "A \<in> G"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   487
        then have "scylinder (space S) (replicate i (space S) @ [A]) = (\<lambda>s. s !! i) -` A \<inter> streams (space S)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   488
          by (induction i) (auto simp add: streams_shd streams_stl cong: conj_cong)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   489
        also have "scylinder (space S) (replicate i (space S) @ [A]) = (\<Union>xs\<in>{xs\<in>lists C. length xs = i}. scylinder (space S) (xs @ [A]))"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   490
          apply (induction i)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   491
          apply auto []
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   492
          apply (simp add: length_Suc_conv set_eq_iff ex_simps(1,2)[symmetric] cong: conj_cong del: ex_simps(1,2))
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   493
          apply rule
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   494
          subgoal for i x
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   495
            apply (cases x)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   496
            apply (subst (2) C(3)[symmetric])
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   497
            apply (simp del: ex_simps(1,2) add: ex_simps(1,2)[symmetric] ac_simps Bex_def)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   498
            apply auto
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   499
            done
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   500
          done
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   501
        finally have "(\<lambda>s. s !! i) -` A \<inter> streams (space S) = (\<Union>xs\<in>{xs\<in>lists C. length xs = i}. scylinder (space S) (xs @ [A]))"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   502
          ..
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   503
        also have "\<dots> \<in> ?R"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   504
          using C(2) \<open>A\<in>G\<close>
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   505
          by (intro sets.countable_UN' countable_Collect countable_lists C)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   506
             (auto intro!: in_measure_of[OF sc_Pow] imageI)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   507
        finally have "(\<lambda>s. s !! i) -` A \<inter> streams (space S) \<in> ?R" . }
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   508
      then show "sets (?V i) \<subseteq> ?R"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   509
        apply (subst vimage_algebra_cong[OF refl refl S])
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   510
        apply (subst vimage_algebra_sigma[OF G])
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   511
        apply (simp add: streams_iff_snth) []
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   512
        apply (subst sigma_le_sets)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   513
        apply auto
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   514
        done
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   515
    qed
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   516
    have "G \<subseteq> sets S"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   517
      unfolding S using G by auto
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   518
    with C(2) show "sets ?R \<subseteq> ?S"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   519
      unfolding sigma_le_sets[OF sc_Pow] by (auto intro!: sets_scylinder)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   520
  qed
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   521
  then show "sets M = sigma_sets (streams (space S)) (scylinder (space S) ` lists G)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   522
    "sets N = sigma_sets (streams (space S)) (scylinder (space S) ` lists G)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   523
    unfolding sets_M sets_N by (simp_all add: sc_Pow)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   524
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   525
  show "Int_stable ?G"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   526
  proof (rule Int_stableI_image)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   527
    fix xs ys assume "xs \<in> lists G" "ys \<in> lists G"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   528
    then show "\<exists>zs\<in>lists G. scylinder (space S) xs \<inter> scylinder (space S) ys = scylinder (space S) zs"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   529
    proof (induction xs arbitrary: ys)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   530
      case Nil then show ?case
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   531
        by (auto simp add: Int_absorb1 scylinder_streams)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   532
    next
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   533
      case xs: (Cons x xs)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   534
      show ?case
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   535
      proof (cases ys)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   536
        case Nil with xs.hyps show ?thesis
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   537
          by (auto simp add: Int_absorb2 scylinder_streams intro!: bexI[of _ "x#xs"])
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   538
      next
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   539
        case ys: (Cons y ys')
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   540
        with xs.IH[of ys'] xs.prems obtain zs where
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   541
          "zs \<in> lists G" and eq: "scylinder (space S) xs \<inter> scylinder (space S) ys' = scylinder (space S) zs"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   542
          by auto
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   543
        show ?thesis
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   544
        proof (intro bexI[of _ "(x \<inter> y)#zs"])
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   545
          show "x \<inter> y # zs \<in> lists G"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   546
            using \<open>zs\<in>lists G\<close> \<open>x\<in>G\<close> \<open>ys\<in>lists G\<close> ys \<open>Int_stable G\<close>[THEN Int_stableD, of x y] by auto
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   547
          show "scylinder (space S) (x # xs) \<inter> scylinder (space S) ys = scylinder (space S) (x \<inter> y # zs)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   548
            by (auto simp add: eq[symmetric] ys)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   549
        qed
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   550
      qed
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   551
    qed
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   552
  qed
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   553
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   554
  show "range (\<lambda>_::nat. streams (space S)) \<subseteq> scylinder (space S) ` lists G"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   555
    "(\<Union>i. streams (space S)) = streams (space S)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   556
    "emeasure M (streams (space S)) \<noteq> \<infinity>"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   557
    by (auto intro!: image_eqI[of _ _ "[]"])
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   558
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   559
  fix X assume "X \<in> scylinder (space S) ` lists G"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   560
  then obtain xs where xs: "xs \<in> lists G" and eq: "X = scylinder (space S) xs"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   561
    by auto
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   562
  then show "emeasure M X = emeasure N X"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   563
  proof (cases "xs = []")
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   564
    assume "xs = []" then show ?thesis
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   565
      unfolding eq
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   566
      using sets_M[THEN sets_eq_imp_space_eq] sets_N[THEN sets_eq_imp_space_eq]
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   567
         M.emeasure_space_1 N.emeasure_space_1
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   568
      by (simp add: space_stream_space[symmetric])
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   569
  next
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   570
    assume "xs \<noteq> []" with xs show ?thesis
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   571
      unfolding eq by (intro *)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   572
  qed
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   573
qed
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   574
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   575
lemma stream_space_coinduct:
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   576
  fixes R :: "'a stream measure \<Rightarrow> 'a stream measure \<Rightarrow> bool"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   577
  assumes "R A B"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   578
  assumes R: "\<And>A B. R A B \<Longrightarrow> \<exists>K\<in>space (prob_algebra M).
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   579
    \<exists>A'\<in>M \<rightarrow>\<^sub>M prob_algebra (stream_space M). \<exists>B'\<in>M \<rightarrow>\<^sub>M prob_algebra (stream_space M).
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   580
    (AE y in K. R (A' y) (B' y) \<or> A' y = B' y) \<and>
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   581
    A = do { y \<leftarrow> K; \<omega> \<leftarrow> A' y; return (stream_space M) (y ## \<omega>) } \<and>
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   582
    B = do { y \<leftarrow> K; \<omega> \<leftarrow> B' y; return (stream_space M) (y ## \<omega>) }"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   583
  shows "A = B"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   584
proof (rule stream_space_eq_scylinder)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   585
  let ?step = "\<lambda>K L. do { y \<leftarrow> K; \<omega> \<leftarrow> L y; return (stream_space M) (y ## \<omega>) }"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   586
  { fix K A A' assume K: "K \<in> space (prob_algebra M)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   587
      and A'[measurable]: "A' \<in> M \<rightarrow>\<^sub>M prob_algebra (stream_space M)" and A_eq: "A = ?step K A'"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   588
    have ps: "prob_space A"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   589
      unfolding A_eq by (rule prob_space_bind'[OF K]) measurable
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   590
    have "sets A = sets (stream_space M)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   591
      unfolding A_eq by (rule sets_bind'[OF K]) measurable
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   592
    note ps this }
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   593
  note ** = this
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   594
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   595
  { fix A B assume "R A B"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   596
    obtain K A' B' where K: "K \<in> space (prob_algebra M)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   597
      and A': "A' \<in> M \<rightarrow>\<^sub>M prob_algebra (stream_space M)" "A = ?step K A'"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   598
      and B': "B' \<in> M \<rightarrow>\<^sub>M prob_algebra (stream_space M)" "B = ?step K B'"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   599
      using R[OF \<open>R A B\<close>] by blast
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   600
    have "prob_space A" "prob_space B" "sets A = sets (stream_space M)" "sets B = sets (stream_space M)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   601
      using **[OF K A'] **[OF K B'] by auto }
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   602
  note R_D = this
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   603
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   604
  show "prob_space A" "prob_space B" "sets A = sets (stream_space M)" "sets B = sets (stream_space M)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   605
    using R_D[OF \<open>R A B\<close>] by auto
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   606
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   607
  show "Int_stable (sets M)" "sets M = sets (sigma (space M) (sets M))" "countable {space M}"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   608
    "{space M} \<subseteq> sets M" "\<Union>{space M} = space M" "sets M \<subseteq> Pow (space M)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   609
    using sets.space_closed[of M] by (auto simp: Int_stable_def)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   610
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   611
  { fix A As L K assume K[measurable]: "K \<in> space (prob_algebra M)" and A: "A \<in> sets M" "As \<in> lists (sets M)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   612
      and L[measurable]: "L \<in> M \<rightarrow>\<^sub>M prob_algebra (stream_space M)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   613
    from A have [measurable]: "\<forall>x\<in>set (A # As). x \<in> sets M" "\<forall>x\<in>set As. x \<in> sets M"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   614
      by auto
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   615
    have [simp]: "space K = space M" "sets K = sets M"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   616
      using K by (auto simp: space_prob_algebra intro!: sets_eq_imp_space_eq)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   617
    have [simp]: "x \<in> space M \<Longrightarrow> sets (L x) = sets (stream_space M)" for x
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   618
      using measurable_space[OF L] by (auto simp: space_prob_algebra)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   619
    note sets_scylinder[measurable]
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   620
    have *: "indicator (scylinder (space M) (A # As)) (x ## \<omega>) =
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   621
        (indicator A x * indicator (scylinder (space M) As) \<omega> :: ennreal)" for \<omega> x
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   622
      using scylinder_streams[of "space M" As] \<open>A \<in> sets M\<close>[THEN sets.sets_into_space]
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   623
      by (auto split: split_indicator)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   624
    have "emeasure (?step K L) (scylinder (space M) (A # As)) = (\<integral>\<^sup>+y. L y (scylinder (space M) As) * indicator A y \<partial>K)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   625
      apply (subst emeasure_bind_prob_algebra[OF K])
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   626
      apply measurable
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   627
      apply (rule nn_integral_cong)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   628
      apply (subst emeasure_bind_prob_algebra[OF L[THEN measurable_space]])
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   629
      apply (simp_all add: ac_simps * nn_integral_cmult_indicator del: scylinder.simps)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   630
      apply measurable
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   631
      done }
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   632
  note emeasure_step = this
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   633
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   634
  fix Xs assume "Xs \<in> lists (sets M)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   635
  from this \<open>R A B\<close> show "emeasure A (scylinder (space M) Xs) = emeasure B (scylinder (space M) Xs)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   636
  proof (induction Xs arbitrary: A B)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   637
    case (Cons X Xs)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   638
    obtain K A' B' where K: "K \<in> space (prob_algebra M)"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   639
      and A'[measurable]: "A' \<in> M \<rightarrow>\<^sub>M prob_algebra (stream_space M)" and A: "A = ?step K A'"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   640
      and B'[measurable]: "B' \<in> M \<rightarrow>\<^sub>M prob_algebra (stream_space M)" and B: "B = ?step K B'"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   641
      and AE_R: "AE x in K. R (A' x) (B' x) \<or> A' x = B' x"
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   642
      using R[OF \<open>R A B\<close>] by blast
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   643
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   644
    show ?case
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   645
      unfolding A B emeasure_step[OF K Cons.hyps A'] emeasure_step[OF K Cons.hyps B']
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   646
      apply (rule nn_integral_cong_AE)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   647
      using AE_R by eventually_elim (auto simp add: Cons.IH)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   648
  next
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   649
    case Nil
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   650
    note R_D[OF this]
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   651
    from this(1,2)[THEN prob_space.emeasure_space_1] this(3,4)[THEN sets_eq_imp_space_eq]
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   652
    show ?case
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   653
      by (simp add: space_stream_space)
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   654
  qed
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   655
qed
17a20ca86d62 HOL-Probability: more about probability, prepare for Markov processes in the AFP
hoelzl
parents: 63333
diff changeset
   656
58588
93d87fd1583d add measure space for (coinductive) streams
hoelzl
parents:
diff changeset
   657
end