src/HOL/Probability/Tree_Space.thy
author eberlm <eberlm@in.tum.de>
Fri, 09 Jun 2017 18:36:25 +0200
changeset 66050 3804a9640088
parent 66049 d20d5a3bf6cf
child 66059 5a6b67e42c4a
permissions -rw-r--r--
Cleaned up and extended Probability/Tree_Space
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
66026
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
     1
(*  Title:      HOL/Probability/Tree_Space.thy
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
     2
    Author:     Johannes Hölzl, CMU *)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
     3
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
     4
theory Tree_Space
66049
d20d5a3bf6cf HOL-Probability: use tree datastructure from Libary/Tree; hide left/right/var projections
hoelzl
parents: 66026
diff changeset
     5
  imports Analysis "~~/src/HOL/Library/Tree"
66026
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
     6
begin
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
     7
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
     8
lemma countable_lfp:
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
     9
  assumes step: "\<And>Y. countable Y \<Longrightarrow> countable (F Y)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    10
  and cont: "Order_Continuity.sup_continuous F"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    11
  shows "countable (lfp F)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    12
by(subst sup_continuous_lfp[OF cont])(simp add: countable_funpow[OF step])
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    13
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    14
lemma countable_lfp_apply:
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    15
  assumes step: "\<And>Y x. (\<And>x. countable (Y x)) \<Longrightarrow> countable (F Y x)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    16
  and cont: "Order_Continuity.sup_continuous F"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    17
  shows "countable (lfp F x)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    18
proof -
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    19
  { fix n
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    20
    have "\<And>x. countable ((F ^^ n) bot x)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    21
      by(induct n)(auto intro: step) }
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    22
  thus ?thesis using cont by(simp add: sup_continuous_lfp)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    23
qed
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    24
66049
d20d5a3bf6cf HOL-Probability: use tree datastructure from Libary/Tree; hide left/right/var projections
hoelzl
parents: 66026
diff changeset
    25
primrec left :: "'a tree \<Rightarrow> 'a tree"
d20d5a3bf6cf HOL-Probability: use tree datastructure from Libary/Tree; hide left/right/var projections
hoelzl
parents: 66026
diff changeset
    26
where
d20d5a3bf6cf HOL-Probability: use tree datastructure from Libary/Tree; hide left/right/var projections
hoelzl
parents: 66026
diff changeset
    27
  "left (Node l v r) = l"
d20d5a3bf6cf HOL-Probability: use tree datastructure from Libary/Tree; hide left/right/var projections
hoelzl
parents: 66026
diff changeset
    28
| "left Leaf = Leaf"
d20d5a3bf6cf HOL-Probability: use tree datastructure from Libary/Tree; hide left/right/var projections
hoelzl
parents: 66026
diff changeset
    29
d20d5a3bf6cf HOL-Probability: use tree datastructure from Libary/Tree; hide left/right/var projections
hoelzl
parents: 66026
diff changeset
    30
primrec right :: "'a tree \<Rightarrow> 'a tree"
d20d5a3bf6cf HOL-Probability: use tree datastructure from Libary/Tree; hide left/right/var projections
hoelzl
parents: 66026
diff changeset
    31
where
d20d5a3bf6cf HOL-Probability: use tree datastructure from Libary/Tree; hide left/right/var projections
hoelzl
parents: 66026
diff changeset
    32
  "right (Node l v r) = r"
d20d5a3bf6cf HOL-Probability: use tree datastructure from Libary/Tree; hide left/right/var projections
hoelzl
parents: 66026
diff changeset
    33
| "right Leaf = Leaf"
d20d5a3bf6cf HOL-Probability: use tree datastructure from Libary/Tree; hide left/right/var projections
hoelzl
parents: 66026
diff changeset
    34
66026
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    35
inductive_set trees :: "'a set \<Rightarrow> 'a tree set" for S :: "'a set" where
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    36
  [intro!]: "Leaf \<in> trees S"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    37
| "l \<in> trees S \<Longrightarrow> r \<in> trees S \<Longrightarrow> v \<in> S \<Longrightarrow> Node l v r \<in> trees S"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    38
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    39
lemma Node_in_trees_iff[simp]: "Node l v r \<in> trees S \<longleftrightarrow> (l \<in> trees S \<and> v \<in> S \<and> r \<in> trees S)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    40
  by (subst trees.simps) auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    41
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    42
lemma trees_sub_lfp: "trees S \<subseteq> lfp (\<lambda>T. T \<union> {Leaf} \<union> (\<Union>l\<in>T. (\<Union>v\<in>S. (\<Union>r\<in>T. {Node l v r}))))"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    43
proof
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    44
  have mono: "mono (\<lambda>T. T \<union> {Leaf} \<union> (\<Union>l\<in>T. (\<Union>v\<in>S. (\<Union>r\<in>T. {Node l v r}))))"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    45
    by (auto simp: mono_def)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    46
  fix t assume "t \<in> trees S" then show "t \<in> lfp (\<lambda>T. T \<union> {Leaf} \<union> (\<Union>l\<in>T. (\<Union>v\<in>S. (\<Union>r\<in>T. {Node l v r}))))"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    47
  proof induction
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    48
    case 1 then show ?case
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    49
      by (subst lfp_unfold[OF mono]) auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    50
  next
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    51
    case 2 then show ?case
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    52
      by (subst lfp_unfold[OF mono]) auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    53
  qed
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    54
qed
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    55
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    56
lemma countable_trees: "countable A \<Longrightarrow> countable (trees A)"
66050
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
    57
proof (intro countable_subset[OF trees_sub_lfp] countable_lfp
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
    58
         sup_continuous_sup sup_continuous_const sup_continuous_id)
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
    59
  show "sup_continuous (\<lambda>T. (\<Union>l\<in>T. \<Union>v\<in>A. \<Union>r\<in>T. {\<langle>l, v, r\<rangle>}))"
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
    60
    unfolding sup_continuous_def
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
    61
  proof (intro allI impI equalityI subsetI, goal_cases)
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
    62
    case (1 M t)
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
    63
    then obtain i j :: nat and l x r  where "t = Node l x r" "x \<in> A" "l \<in> M i" "r \<in> M j"
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
    64
      by auto
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
    65
    hence "l \<in> M (max i j)" "r \<in> M (max i j)"
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
    66
      using incseqD[OF \<open>incseq M\<close>, of i "max i j"] incseqD[OF \<open>incseq M\<close>, of j "max i j"] by auto
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
    67
    with \<open>t = Node l x r\<close> and \<open>x \<in> A\<close> show ?case by auto
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
    68
  qed auto
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
    69
qed auto
66026
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    70
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    71
lemma trees_UNIV[simp]: "trees UNIV = UNIV"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    72
proof -
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    73
  have "t \<in> trees UNIV" for t :: "'a tree"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    74
    by (induction t) (auto intro: trees.intros(2))
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    75
  then show ?thesis by auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    76
qed
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    77
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    78
instance tree :: (countable) countable
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    79
proof
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    80
  have "countable (UNIV :: 'a tree set)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    81
    by (subst trees_UNIV[symmetric]) (intro countable_trees[OF countableI_type])
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    82
  then show "\<exists>to_nat::'a tree \<Rightarrow> nat. inj to_nat"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    83
    by (auto simp: countable_def)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    84
qed
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    85
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    86
lemma map_in_trees[intro]: "(\<And>x. x \<in> set_tree t \<Longrightarrow> f x \<in> S) \<Longrightarrow> map_tree f t \<in> trees S"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    87
  by (induction t) (auto intro: trees.intros(2))
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    88
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    89
primrec trees_cyl :: "'a set tree \<Rightarrow> 'a tree set" where
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    90
  "trees_cyl Leaf = {Leaf} "
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    91
| "trees_cyl (Node l v r) = (\<Union>l'\<in>trees_cyl l. (\<Union>v'\<in>v. (\<Union>r'\<in>trees_cyl r. {Node l' v' r'})))"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    92
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    93
definition tree_sigma :: "'a measure \<Rightarrow> 'a tree measure"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    94
where
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    95
  "tree_sigma M = sigma (trees (space M)) (trees_cyl ` trees (sets M))"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    96
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    97
lemma Node_in_trees_cyl: "Node l' v' r' \<in> trees_cyl t \<longleftrightarrow>
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    98
  (\<exists>l v r. t = Node l v r \<and> l' \<in> trees_cyl l \<and> r' \<in> trees_cyl r \<and> v' \<in> v)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
    99
  by (cases t) auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   100
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   101
lemma trees_cyl_sub_trees:
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   102
  assumes "t \<in> trees A" "A \<subseteq> Pow B" shows "trees_cyl t \<subseteq> trees B"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   103
  using assms(1)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   104
proof induction
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   105
  case (2 l v r) with \<open>A \<subseteq> Pow B\<close> show ?case
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   106
    by (auto intro!: trees.intros(2))
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   107
qed auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   108
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   109
lemma trees_cyl_sets_in_space: "trees_cyl ` trees (sets M) \<subseteq> Pow (trees (space M))"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   110
  using trees_cyl_sub_trees[OF _ sets.space_closed, of _ M] by auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   111
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   112
lemma space_tree_sigma: "space (tree_sigma M) = trees (space M)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   113
  unfolding tree_sigma_def by (rule space_measure_of_conv)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   114
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   115
lemma sets_tree_sigma_eq: "sets (tree_sigma M) = sigma_sets (trees (space M)) (trees_cyl ` trees (sets M))"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   116
  unfolding tree_sigma_def by (rule sets_measure_of) (rule trees_cyl_sets_in_space)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   117
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   118
lemma Leaf_in_tree_sigma[measurable]: "{Leaf} \<in> sets (tree_sigma M)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   119
  unfolding sets_tree_sigma_eq
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   120
  by (rule sigma_sets.Basic) (auto intro: trees.intros(2) image_eqI[where x=Leaf])
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   121
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   122
lemma trees_cyl_map_treeI: "t \<in> trees_cyl (map_tree (\<lambda>x. A) t)" if *: "t \<in> trees A"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   123
  using * by induction auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   124
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   125
lemma trees_cyl_map_in_sets:
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   126
  "(\<And>x. x \<in> set_tree t \<Longrightarrow> f x \<in> sets M) \<Longrightarrow> trees_cyl (map_tree f t) \<in> sets (tree_sigma M)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   127
  by (subst sets_tree_sigma_eq) auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   128
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   129
lemma Node_in_tree_sigma:
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   130
  assumes L: "X \<in> sets (M \<Otimes>\<^sub>M (tree_sigma M \<Otimes>\<^sub>M tree_sigma M))"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   131
  shows "{Node l v r | l v r. (v, l, r) \<in> X} \<in> sets (tree_sigma M)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   132
proof -
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   133
  let ?E = "\<lambda>s::unit tree. trees_cyl (map_tree (\<lambda>_. space M) s)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   134
  have 1: "countable (range ?E)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   135
    by (intro countable_image countableI_type)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   136
  have 2: "trees_cyl ` trees (sets M) \<subseteq> Pow (space (tree_sigma M))"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   137
    using trees_cyl_sets_in_space[of M] by (simp add: space_tree_sigma)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   138
  have 3: "sets (tree_sigma M) = sigma_sets (space (tree_sigma M)) (trees_cyl ` trees (sets M))"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   139
    unfolding sets_tree_sigma_eq by (simp add: space_tree_sigma)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   140
  have 4: "(\<Union>s. ?E s) = space (tree_sigma M)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   141
  proof (safe; clarsimp simp: space_tree_sigma)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   142
    fix t s assume "t \<in> trees_cyl (map_tree (\<lambda>_::unit. space M) s)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   143
    then show "t \<in> trees (space M)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   144
      by (induction s arbitrary: t) auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   145
  next
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   146
    fix t assume "t \<in> trees (space M)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   147
    then show "\<exists>t'. t \<in> ?E t'"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   148
      by (intro exI[of _ "map_tree (\<lambda>_. ()) t"])
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   149
         (auto simp: tree.map_comp comp_def intro: trees_cyl_map_treeI)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   150
  qed
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   151
  have 5: "range ?E \<subseteq> trees_cyl ` trees (sets M)" by auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   152
  let ?P = "{A \<times> B | A B. A \<in> trees_cyl ` trees (sets M) \<and> B \<in> trees_cyl ` trees (sets M)}"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   153
  have P: "sets (tree_sigma M \<Otimes>\<^sub>M tree_sigma M) = sets (sigma (space (tree_sigma M) \<times> space (tree_sigma M)) ?P)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   154
    by (rule sets_pair_eq[OF 2 3 1 5 4 2 3 1 5 4])
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   155
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   156
  have "sets (M \<Otimes>\<^sub>M (tree_sigma M \<Otimes>\<^sub>M tree_sigma M)) =
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   157
    sets (sigma (space M \<times> space (tree_sigma M \<Otimes>\<^sub>M tree_sigma M)) {A \<times> BC | A BC. A \<in> sets M \<and> BC \<in> ?P})"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   158
  proof (rule sets_pair_eq)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   159
    show "sets M \<subseteq> Pow (space M)" "sets M = sigma_sets (space M) (sets M)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   160
      by (auto simp: sets.sigma_sets_eq sets.space_closed)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   161
    show "countable {space M}" "{space M} \<subseteq> sets M" "\<Union>{space M} = space M"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   162
      by auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   163
    show "?P \<subseteq> Pow (space (tree_sigma M \<Otimes>\<^sub>M tree_sigma M))"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   164
      using trees_cyl_sets_in_space[of M]
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   165
      by (auto simp: space_pair_measure space_tree_sigma subset_eq)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   166
    then show "sets (tree_sigma M \<Otimes>\<^sub>M tree_sigma M) =
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   167
      sigma_sets (space (tree_sigma M \<Otimes>\<^sub>M tree_sigma M)) ?P"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   168
      by (subst P, subst sets_measure_of) (auto simp: space_tree_sigma space_pair_measure)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   169
    show "countable ((\<lambda>(a, b). a \<times> b) ` (range ?E \<times> range ?E))"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   170
      by (intro countable_image countable_SIGMA countableI_type)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   171
    show "(\<lambda>(a, b). a \<times> b) ` (range ?E \<times> range ?E) \<subseteq> ?P"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   172
      by auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   173
  qed (insert 4, auto simp: space_pair_measure space_tree_sigma set_eq_iff)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   174
  also have "\<dots> = sigma_sets (space M \<times> trees (space M) \<times> trees (space M))
66050
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   175
                    {A \<times> BC |A BC. A \<in> sets M \<and> BC \<in> {A \<times> B |A B.
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   176
                       A \<in> trees_cyl ` trees (sets M) \<and> B \<in> trees_cyl ` trees (sets M)}}"
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   177
    (is "_ = sigma_sets ?X ?Y") using sets.space_closed[of M] trees_cyl_sub_trees[of _ "sets M" "space M"]
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   178
    by (subst sets_measure_of) 
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   179
       (auto simp: space_pair_measure space_tree_sigma)
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   180
  also have "?Y = {A \<times> trees_cyl B \<times> trees_cyl C | A B C. A \<in> sets M \<and> 
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   181
                     B \<in> trees (sets M) \<and> C \<in> trees (sets M)}" by blast
66026
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   182
  finally have "X \<in> sigma_sets (space M \<times> trees (space M) \<times> trees (space M))
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   183
    {A \<times> trees_cyl B \<times> trees_cyl C | A B C. A \<in> sets M \<and> B \<in> trees (sets M) \<and> C \<in> trees (sets M) }"
66050
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   184
    using assms by blast
66026
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   185
  then show ?thesis
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   186
  proof induction
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   187
    case (Basic A')
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   188
    then obtain A B C where "A' = A \<times> trees_cyl B \<times> trees_cyl C"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   189
      and *: "A \<in> sets M" "B \<in> trees (sets M)" "C \<in> trees (sets M)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   190
      by auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   191
    then have "{Node l v r |l v r. (v, l, r) \<in> A'} = trees_cyl (Node B A C)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   192
      by auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   193
    then show ?case
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   194
      by (auto simp del: trees_cyl.simps simp: sets_tree_sigma_eq intro!: sigma_sets.Basic *)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   195
  next
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   196
    case Empty show ?case by auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   197
  next
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   198
    case (Compl A)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   199
    have "{Node l v r |l v r. (v, l, r) \<in> space M \<times> trees (space M) \<times> trees (space M) - A} =
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   200
      (space (tree_sigma M) - {Node l v r |l v r. (v, l, r) \<in> A}) - {Leaf}"
66050
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   201
      by (auto simp: space_tree_sigma elim: trees.cases)
66026
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   202
    also have "\<dots> \<in> sets (tree_sigma M)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   203
      by (intro sets.Diff Compl) auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   204
    finally show ?case .
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   205
  next
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   206
    case (Union I)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   207
    have *: "{Node l v r |l v r. (v, l, r) \<in> UNION UNIV I} =
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   208
      (\<Union>i. {Node l v r |l v r. (v, l, r) \<in> I i})" by auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   209
    show ?case unfolding * using Union(2) by (intro sets.countable_UN) auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   210
  qed
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   211
qed
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   212
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   213
lemma measurable_left[measurable]: "left \<in> tree_sigma M \<rightarrow>\<^sub>M tree_sigma M"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   214
proof (rule measurableI)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   215
  show "t \<in> space (tree_sigma M) \<Longrightarrow> left t \<in> space (tree_sigma M)" for t
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   216
    by (cases t) (auto simp: space_tree_sigma)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   217
  fix A assume A: "A \<in> sets (tree_sigma M)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   218
  from sets.sets_into_space[OF this]
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   219
  have *: "left -` A \<inter> space (tree_sigma M) =
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   220
    (if Leaf \<in> A then {Leaf} else {}) \<union>
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   221
    {Node a v r | a v r. (v, a, r) \<in> space M \<times> A \<times> space (tree_sigma M)}"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   222
    by (auto simp: space_tree_sigma elim: trees.cases)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   223
  show "left -` A \<inter> space (tree_sigma M) \<in> sets (tree_sigma M)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   224
    unfolding * using A by (intro sets.Un Node_in_tree_sigma pair_measureI) auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   225
qed
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   226
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   227
lemma measurable_right[measurable]: "right \<in> tree_sigma M \<rightarrow>\<^sub>M tree_sigma M"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   228
proof (rule measurableI)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   229
  show "t \<in> space (tree_sigma M) \<Longrightarrow> right t \<in> space (tree_sigma M)" for t
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   230
    by (cases t) (auto simp: space_tree_sigma)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   231
  fix A assume A: "A \<in> sets (tree_sigma M)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   232
  from sets.sets_into_space[OF this]
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   233
  have *: "right -` A \<inter> space (tree_sigma M) =
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   234
    (if Leaf \<in> A then {Leaf} else {}) \<union>
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   235
    {Node l v a | l v a. (v, l, a) \<in> space M \<times> space (tree_sigma M) \<times> A}"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   236
    by (auto simp: space_tree_sigma elim: trees.cases)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   237
  show "right -` A \<inter> space (tree_sigma M) \<in> sets (tree_sigma M)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   238
    unfolding * using A by (intro sets.Un Node_in_tree_sigma pair_measureI) auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   239
qed
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   240
66050
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   241
lemma measurable_root_val': "root_val \<in> restrict_space (tree_sigma M) (-{Leaf}) \<rightarrow>\<^sub>M M"
66026
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   242
proof (rule measurableI)
66050
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   243
  show "t \<in> space (restrict_space (tree_sigma M) (- {Leaf})) \<Longrightarrow> root_val t \<in> space M" for t
66026
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   244
    by (cases t) (auto simp: space_restrict_space space_tree_sigma)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   245
  fix A assume A: "A \<in> sets M"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   246
  from sets.sets_into_space[OF this]
66050
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   247
  have "root_val -` A \<inter> space (restrict_space (tree_sigma M) (- {Leaf})) =
66026
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   248
    {Node l a r | l a r. (a, l, r) \<in> A \<times> space (tree_sigma M) \<times> space (tree_sigma M)}"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   249
    by (auto simp: space_tree_sigma space_restrict_space elim: trees.cases)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   250
  also have "\<dots> \<in> sets (tree_sigma M)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   251
    using A by (intro sets.Un Node_in_tree_sigma pair_measureI) auto
66050
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   252
  finally show "root_val -` A \<inter> space (restrict_space (tree_sigma M) (- {Leaf})) \<in>
66026
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   253
      sets (restrict_space (tree_sigma M) (- {Leaf}))"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   254
    by (auto simp: sets_restrict_space_iff space_restrict_space)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   255
qed
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   256
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   257
lemma measurable_restrict_mono:
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   258
  assumes f: "f \<in> restrict_space M A \<rightarrow>\<^sub>M N" and "B \<subseteq> A"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   259
  shows "f \<in> restrict_space M B \<rightarrow>\<^sub>M N"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   260
by (rule measurable_compose[OF measurable_restrict_space3 f])
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   261
   (insert \<open>B \<subseteq> A\<close>, auto)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   262
66050
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   263
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   264
lemma measurable_root_val[measurable (raw)]:
66026
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   265
  assumes "f \<in> X \<rightarrow>\<^sub>M tree_sigma M"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   266
    and "\<And>x. x \<in> space X \<Longrightarrow> f x \<noteq> Leaf"
66050
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   267
  shows "(\<lambda>\<omega>. root_val (f \<omega>)) \<in> X \<rightarrow>\<^sub>M M"
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   268
proof -
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   269
  from assms have "f \<in> X \<rightarrow>\<^sub>M restrict_space (tree_sigma M) (- {Leaf})"
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   270
    by (intro measurable_restrict_space2) auto
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   271
  from this and measurable_root_val' show ?thesis by (rule measurable_compose)
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   272
qed
66026
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   273
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   274
lemma measurable_rec_tree[measurable (raw)]:
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   275
  assumes t: "t \<in> B \<rightarrow>\<^sub>M tree_sigma M"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   276
  assumes l: "l \<in> B \<rightarrow>\<^sub>M A"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   277
  assumes n: "(\<lambda>(x, l, v, r, al, ar). n x l v r al ar) \<in>
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   278
    (B \<Otimes>\<^sub>M tree_sigma M \<Otimes>\<^sub>M M \<Otimes>\<^sub>M tree_sigma M \<Otimes>\<^sub>M A \<Otimes>\<^sub>M A) \<rightarrow>\<^sub>M A" (is "?N \<in> ?M \<rightarrow>\<^sub>M A")
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   279
  shows "(\<lambda>x. rec_tree (l x) (n x) (t x)) \<in> B \<rightarrow>\<^sub>M A"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   280
proof (rule measurable_piecewise_restrict)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   281
  let ?C = "\<lambda>t. \<lambda>s::unit tree. t -` trees_cyl (map_tree (\<lambda>_. space M) s)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   282
  show "countable (range (?C t))" by (intro countable_image countableI_type)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   283
  show "space B \<subseteq> (\<Union>s. ?C t s)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   284
  proof (safe; clarsimp)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   285
    fix x assume x: "x \<in> space B" have "t x \<in> trees (space M)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   286
      using t[THEN measurable_space, OF x] by (simp add: space_tree_sigma)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   287
    then show "\<exists>xa::unit tree. t x \<in> trees_cyl (map_tree (\<lambda>_. space M) xa)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   288
      by (intro exI[of _ "map_tree (\<lambda>_. ()) (t x)"])
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   289
         (simp add: tree.map_comp comp_def trees_cyl_map_treeI)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   290
  qed
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   291
  fix \<Omega> assume "\<Omega> \<in> range (?C t)"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   292
  then obtain s :: "unit tree" where \<Omega>: "\<Omega> = ?C t s" by auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   293
  then show "\<Omega> \<inter> space B \<in> sets B"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   294
    by (safe intro!: measurable_sets[OF t] trees_cyl_map_in_sets)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   295
  show "(\<lambda>x. rec_tree (l x) (n x) (t x)) \<in> restrict_space B \<Omega> \<rightarrow>\<^sub>M A"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   296
    unfolding \<Omega> using t
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   297
  proof (induction s arbitrary: t)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   298
    case Leaf
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   299
    show ?case
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   300
    proof (rule measurable_cong[THEN iffD2])
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   301
      fix \<omega> assume "\<omega> \<in> space (restrict_space B (?C t Leaf))"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   302
      then show "rec_tree (l \<omega>) (n \<omega>) (t \<omega>) = l \<omega>"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   303
        by (auto simp: space_restrict_space)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   304
    next
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   305
      show "l \<in> restrict_space B (?C t Leaf) \<rightarrow>\<^sub>M A"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   306
        using l by (rule measurable_restrict_space1)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   307
    qed
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   308
  next
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   309
    case (Node ls u rs)
66050
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   310
    let ?F = "\<lambda>\<omega>. ?N (\<omega>, left (t \<omega>), root_val (t \<omega>), right (t \<omega>),
66026
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   311
        rec_tree (l \<omega>) (n \<omega>) (left (t \<omega>)), rec_tree (l \<omega>) (n \<omega>) (right (t \<omega>)))"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   312
    show ?case
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   313
    proof (rule measurable_cong[THEN iffD2])
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   314
      fix \<omega> assume "\<omega> \<in> space (restrict_space B (?C t (Node ls u rs)))"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   315
      then show "rec_tree (l \<omega>) (n \<omega>) (t \<omega>) = ?F \<omega>"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   316
        by (auto simp: space_restrict_space)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   317
    next
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   318
      show "?F \<in> (restrict_space B (?C t (Node ls u rs))) \<rightarrow>\<^sub>M A"
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   319
        apply (intro measurable_compose[OF _ n] measurable_Pair[rotated])
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   320
        subgoal
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   321
          apply (rule measurable_restrict_mono[OF Node(2)])
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   322
          apply (rule measurable_compose[OF Node(3) measurable_right])
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   323
          by auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   324
        subgoal
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   325
          apply (rule measurable_restrict_mono[OF Node(1)])
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   326
          apply (rule measurable_compose[OF Node(3) measurable_left])
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   327
          by auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   328
        subgoal
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   329
          by (rule measurable_restrict_space1)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   330
             (rule measurable_compose[OF Node(3) measurable_right])
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   331
        subgoal
66050
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   332
          apply (rule measurable_compose[OF _ measurable_root_val'])
66026
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   333
          apply (rule measurable_restrict_space3[OF Node(3)])
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   334
          by auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   335
        subgoal
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   336
          by (rule measurable_restrict_space1)
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   337
             (rule measurable_compose[OF Node(3) measurable_left])
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   338
        by (rule measurable_restrict_space1) auto
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   339
    qed
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   340
  qed
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   341
qed
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   342
66050
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   343
lemma measurable_Node [measurable]:
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   344
  "(\<lambda>(l,x,r). Node l x r) \<in> tree_sigma M \<Otimes>\<^sub>M M \<Otimes>\<^sub>M tree_sigma M \<rightarrow>\<^sub>M tree_sigma M"
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   345
proof (rule measurable_sigma_sets)
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   346
  show "sets (tree_sigma M) = sigma_sets (trees (space M)) (trees_cyl ` trees (sets M))"
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   347
    by (simp add: sets_tree_sigma_eq)
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   348
  show "trees_cyl ` trees (sets M) \<subseteq> Pow (trees (space M))"
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   349
    by (rule trees_cyl_sets_in_space)
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   350
  show "(\<lambda>(l, x, r). \<langle>l, x, r\<rangle>) \<in> space (tree_sigma M \<Otimes>\<^sub>M M \<Otimes>\<^sub>M tree_sigma M) \<rightarrow> trees (space M)"
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   351
    by (auto simp: space_pair_measure space_tree_sigma)
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   352
  fix A assume t: "A \<in> trees_cyl ` trees (sets M)"
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   353
  then obtain t where t: "t \<in> trees (sets M)" "A = trees_cyl t" by auto
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   354
  show "(\<lambda>(l, x, r). \<langle>l, x, r\<rangle>) -` A \<inter>
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   355
         space (tree_sigma M \<Otimes>\<^sub>M M \<Otimes>\<^sub>M tree_sigma M)
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   356
         \<in> sets (tree_sigma M \<Otimes>\<^sub>M M \<Otimes>\<^sub>M tree_sigma M)"
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   357
  proof (cases t)
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   358
    case Leaf
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   359
    have "(\<lambda>(l, x, r). \<langle>l, x, r\<rangle>) -` {Leaf :: 'a tree} = {}" by auto
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   360
    with Leaf show ?thesis using t by simp
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   361
  next
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   362
    case (Node l B r)
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   363
    hence "(\<lambda>(l, x, r). \<langle>l, x, r\<rangle>) -` A \<inter> space (tree_sigma M \<Otimes>\<^sub>M M \<Otimes>\<^sub>M tree_sigma M) = 
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   364
             trees_cyl l \<times> B \<times> trees_cyl r" 
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   365
      using t and Node and trees_cyl_sub_trees[of _ "sets M" "space M"]
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   366
      by (auto simp: space_pair_measure space_tree_sigma 
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   367
               dest: sets.sets_into_space[of _ M])
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   368
    thus ?thesis using t and Node
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   369
      by (auto intro!: pair_measureI simp: sets_tree_sigma_eq)
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   370
  qed    
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   371
qed
3804a9640088 Cleaned up and extended Probability/Tree_Space
eberlm <eberlm@in.tum.de>
parents: 66049
diff changeset
   372
66049
d20d5a3bf6cf HOL-Probability: use tree datastructure from Libary/Tree; hide left/right/var projections
hoelzl
parents: 66026
diff changeset
   373
hide_const (open) left
d20d5a3bf6cf HOL-Probability: use tree datastructure from Libary/Tree; hide left/right/var projections
hoelzl
parents: 66026
diff changeset
   374
hide_const (open) right
d20d5a3bf6cf HOL-Probability: use tree datastructure from Libary/Tree; hide left/right/var projections
hoelzl
parents: 66026
diff changeset
   375
66026
704e4970d703 HOL-Probability: add measurable space for trees
hoelzl
parents:
diff changeset
   376
end