src/HOL/Probability/Tree_Space.thy
changeset 66050 3804a9640088
parent 66049 d20d5a3bf6cf
child 66059 5a6b67e42c4a
equal deleted inserted replaced
66049:d20d5a3bf6cf 66050:3804a9640088
    30 primrec right :: "'a tree \<Rightarrow> 'a tree"
    30 primrec right :: "'a tree \<Rightarrow> 'a tree"
    31 where
    31 where
    32   "right (Node l v r) = r"
    32   "right (Node l v r) = r"
    33 | "right Leaf = Leaf"
    33 | "right Leaf = Leaf"
    34 
    34 
    35 primrec val :: "'a tree \<Rightarrow> 'a"
       
    36 where
       
    37   "val (Node l v r) = v"
       
    38 | "val Leaf = undefined"
       
    39 
       
    40 inductive_set trees :: "'a set \<Rightarrow> 'a tree set" for S :: "'a set" where
    35 inductive_set trees :: "'a set \<Rightarrow> 'a tree set" for S :: "'a set" where
    41   [intro!]: "Leaf \<in> trees S"
    36   [intro!]: "Leaf \<in> trees S"
    42 | "l \<in> trees S \<Longrightarrow> r \<in> trees S \<Longrightarrow> v \<in> S \<Longrightarrow> Node l v r \<in> trees S"
    37 | "l \<in> trees S \<Longrightarrow> r \<in> trees S \<Longrightarrow> v \<in> S \<Longrightarrow> Node l v r \<in> trees S"
    43 
    38 
    44 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)"
    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)"
    57       by (subst lfp_unfold[OF mono]) auto
    52       by (subst lfp_unfold[OF mono]) auto
    58   qed
    53   qed
    59 qed
    54 qed
    60 
    55 
    61 lemma countable_trees: "countable A \<Longrightarrow> countable (trees A)"
    56 lemma countable_trees: "countable A \<Longrightarrow> countable (trees A)"
    62   apply (rule countable_subset[OF trees_sub_lfp])
    57 proof (intro countable_subset[OF trees_sub_lfp] countable_lfp
    63   apply (rule countable_lfp)
    58          sup_continuous_sup sup_continuous_const sup_continuous_id)
    64   subgoal by auto
    59   show "sup_continuous (\<lambda>T. (\<Union>l\<in>T. \<Union>v\<in>A. \<Union>r\<in>T. {\<langle>l, v, r\<rangle>}))"
    65   apply (intro sup_continuous_sup sup_continuous_const)
    60     unfolding sup_continuous_def
    66     subgoal by (simp add: sup_continuous_def)
    61   proof (intro allI impI equalityI subsetI, goal_cases)
    67     subgoal apply (auto simp add: sup_continuous_def)
    62     case (1 M t)
    68       subgoal premises prems for M x c a y d
    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"
    69       using prems(3,5) prems(2)[THEN incseqD, of x "max x y"] prems(2)[THEN incseqD, of y "max x y"]
    64       by auto
    70       by (intro exI[of _ "max x y"]) auto
    65     hence "l \<in> M (max i j)" "r \<in> M (max i j)"
    71     done
    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
    72   done
    67     with \<open>t = Node l x r\<close> and \<open>x \<in> A\<close> show ?case by auto
       
    68   qed auto
       
    69 qed auto
    73 
    70 
    74 lemma trees_UNIV[simp]: "trees UNIV = UNIV"
    71 lemma trees_UNIV[simp]: "trees UNIV = UNIV"
    75 proof -
    72 proof -
    76   have "t \<in> trees UNIV" for t :: "'a tree"
    73   have "t \<in> trees UNIV" for t :: "'a tree"
    77     by (induction t) (auto intro: trees.intros(2))
    74     by (induction t) (auto intro: trees.intros(2))
   173       by (intro countable_image countable_SIGMA countableI_type)
   170       by (intro countable_image countable_SIGMA countableI_type)
   174     show "(\<lambda>(a, b). a \<times> b) ` (range ?E \<times> range ?E) \<subseteq> ?P"
   171     show "(\<lambda>(a, b). a \<times> b) ` (range ?E \<times> range ?E) \<subseteq> ?P"
   175       by auto
   172       by auto
   176   qed (insert 4, auto simp: space_pair_measure space_tree_sigma set_eq_iff)
   173   qed (insert 4, auto simp: space_pair_measure space_tree_sigma set_eq_iff)
   177   also have "\<dots> = sigma_sets (space M \<times> trees (space M) \<times> trees (space M))
   174   also have "\<dots> = sigma_sets (space M \<times> trees (space M) \<times> trees (space M))
   178     {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) }"
   175                     {A \<times> BC |A BC. A \<in> sets M \<and> BC \<in> {A \<times> B |A B.
   179     apply (subst sets_measure_of)
   176                        A \<in> trees_cyl ` trees (sets M) \<and> B \<in> trees_cyl ` trees (sets M)}}"
   180     subgoal
   177     (is "_ = sigma_sets ?X ?Y") using sets.space_closed[of M] trees_cyl_sub_trees[of _ "sets M" "space M"]
   181       using sets.space_closed[of M] trees_cyl_sets_in_space[of M]
   178     by (subst sets_measure_of) 
   182       by (clarsimp simp: space_pair_measure space_tree_sigma) blast
   179        (auto simp: space_pair_measure space_tree_sigma)
   183     apply (rule arg_cong2[where f=sigma_sets])
   180   also have "?Y = {A \<times> trees_cyl B \<times> trees_cyl C | A B C. A \<in> sets M \<and> 
   184     apply (auto simp: space_pair_measure space_tree_sigma)
   181                      B \<in> trees (sets M) \<and> C \<in> trees (sets M)}" by blast
   185       subgoal premises prems for A B C
       
   186       apply (rule exI conjI refl prems)+
       
   187       using trees_cyl_sets_in_space[of M] prems
       
   188       by auto
       
   189     done
       
   190   finally have "X \<in> sigma_sets (space M \<times> trees (space M) \<times> trees (space M))
   182   finally have "X \<in> sigma_sets (space M \<times> trees (space M) \<times> trees (space M))
   191     {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) }"
   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) }"
   192     using assms by auto
   184     using assms by blast
   193   then show ?thesis
   185   then show ?thesis
   194   proof induction
   186   proof induction
   195     case (Basic A')
   187     case (Basic A')
   196     then obtain A B C where "A' = A \<times> trees_cyl B \<times> trees_cyl C"
   188     then obtain A B C where "A' = A \<times> trees_cyl B \<times> trees_cyl C"
   197       and *: "A \<in> sets M" "B \<in> trees (sets M)" "C \<in> trees (sets M)"
   189       and *: "A \<in> sets M" "B \<in> trees (sets M)" "C \<in> trees (sets M)"
   204     case Empty show ?case by auto
   196     case Empty show ?case by auto
   205   next
   197   next
   206     case (Compl A)
   198     case (Compl A)
   207     have "{Node l v r |l v r. (v, l, r) \<in> space M \<times> trees (space M) \<times> trees (space M) - A} =
   199     have "{Node l v r |l v r. (v, l, r) \<in> space M \<times> trees (space M) \<times> trees (space M) - A} =
   208       (space (tree_sigma M) - {Node l v r |l v r. (v, l, r) \<in> A}) - {Leaf}"
   200       (space (tree_sigma M) - {Node l v r |l v r. (v, l, r) \<in> A}) - {Leaf}"
   209       apply (auto simp: space_tree_sigma)
   201       by (auto simp: space_tree_sigma elim: trees.cases)
   210       subgoal for t
       
   211         by (cases t) auto
       
   212       done
       
   213     also have "\<dots> \<in> sets (tree_sigma M)"
   202     also have "\<dots> \<in> sets (tree_sigma M)"
   214       by (intro sets.Diff Compl) auto
   203       by (intro sets.Diff Compl) auto
   215     finally show ?case .
   204     finally show ?case .
   216   next
   205   next
   217     case (Union I)
   206     case (Union I)
   247     by (auto simp: space_tree_sigma elim: trees.cases)
   236     by (auto simp: space_tree_sigma elim: trees.cases)
   248   show "right -` A \<inter> space (tree_sigma M) \<in> sets (tree_sigma M)"
   237   show "right -` A \<inter> space (tree_sigma M) \<in> sets (tree_sigma M)"
   249     unfolding * using A by (intro sets.Un Node_in_tree_sigma pair_measureI) auto
   238     unfolding * using A by (intro sets.Un Node_in_tree_sigma pair_measureI) auto
   250 qed
   239 qed
   251 
   240 
   252 lemma measurable_val': "val \<in> restrict_space (tree_sigma M) (-{Leaf}) \<rightarrow>\<^sub>M M"
   241 lemma measurable_root_val': "root_val \<in> restrict_space (tree_sigma M) (-{Leaf}) \<rightarrow>\<^sub>M M"
   253 proof (rule measurableI)
   242 proof (rule measurableI)
   254   show "t \<in> space (restrict_space (tree_sigma M) (- {Leaf})) \<Longrightarrow> val t \<in> space M" for t
   243   show "t \<in> space (restrict_space (tree_sigma M) (- {Leaf})) \<Longrightarrow> root_val t \<in> space M" for t
   255     by (cases t) (auto simp: space_restrict_space space_tree_sigma)
   244     by (cases t) (auto simp: space_restrict_space space_tree_sigma)
   256   fix A assume A: "A \<in> sets M"
   245   fix A assume A: "A \<in> sets M"
   257   from sets.sets_into_space[OF this]
   246   from sets.sets_into_space[OF this]
   258   have "val -` A \<inter> space (restrict_space (tree_sigma M) (- {Leaf})) =
   247   have "root_val -` A \<inter> space (restrict_space (tree_sigma M) (- {Leaf})) =
   259     {Node l a r | l a r. (a, l, r) \<in> A \<times> space (tree_sigma M) \<times> space (tree_sigma M)}"
   248     {Node l a r | l a r. (a, l, r) \<in> A \<times> space (tree_sigma M) \<times> space (tree_sigma M)}"
   260     by (auto simp: space_tree_sigma space_restrict_space elim: trees.cases)
   249     by (auto simp: space_tree_sigma space_restrict_space elim: trees.cases)
   261   also have "\<dots> \<in> sets (tree_sigma M)"
   250   also have "\<dots> \<in> sets (tree_sigma M)"
   262     using A by (intro sets.Un Node_in_tree_sigma pair_measureI) auto
   251     using A by (intro sets.Un Node_in_tree_sigma pair_measureI) auto
   263   finally show "val -` A \<inter> space (restrict_space (tree_sigma M) (- {Leaf})) \<in>
   252   finally show "root_val -` A \<inter> space (restrict_space (tree_sigma M) (- {Leaf})) \<in>
   264       sets (restrict_space (tree_sigma M) (- {Leaf}))"
   253       sets (restrict_space (tree_sigma M) (- {Leaf}))"
   265     by (auto simp: sets_restrict_space_iff space_restrict_space)
   254     by (auto simp: sets_restrict_space_iff space_restrict_space)
   266 qed
   255 qed
   267 
   256 
   268 lemma measurable_restrict_mono:
   257 lemma measurable_restrict_mono:
   269   assumes f: "f \<in> restrict_space M A \<rightarrow>\<^sub>M N" and "B \<subseteq> A"
   258   assumes f: "f \<in> restrict_space M A \<rightarrow>\<^sub>M N" and "B \<subseteq> A"
   270   shows "f \<in> restrict_space M B \<rightarrow>\<^sub>M N"
   259   shows "f \<in> restrict_space M B \<rightarrow>\<^sub>M N"
   271 by (rule measurable_compose[OF measurable_restrict_space3 f])
   260 by (rule measurable_compose[OF measurable_restrict_space3 f])
   272    (insert \<open>B \<subseteq> A\<close>, auto)
   261    (insert \<open>B \<subseteq> A\<close>, auto)
   273 
   262 
   274 (*
   263 
   275 lemma measurable_val[measurable (raw)]:
   264 lemma measurable_root_val[measurable (raw)]:
   276   assumes "f \<in> X \<rightarrow>\<^sub>M tree_sigma M"
   265   assumes "f \<in> X \<rightarrow>\<^sub>M tree_sigma M"
   277     and "\<And>x. x \<in> space X \<Longrightarrow> f x \<noteq> Leaf"
   266     and "\<And>x. x \<in> space X \<Longrightarrow> f x \<noteq> Leaf"
   278   shows "(\<lambda>\<omega>. val (f \<omega>)) \<in> X \<rightarrow>\<^sub>M M"
   267   shows "(\<lambda>\<omega>. root_val (f \<omega>)) \<in> X \<rightarrow>\<^sub>M M"
   279   sorry
   268 proof -
   280 *)
   269   from assms have "f \<in> X \<rightarrow>\<^sub>M restrict_space (tree_sigma M) (- {Leaf})"
       
   270     by (intro measurable_restrict_space2) auto
       
   271   from this and measurable_root_val' show ?thesis by (rule measurable_compose)
       
   272 qed
   281 
   273 
   282 lemma measurable_rec_tree[measurable (raw)]:
   274 lemma measurable_rec_tree[measurable (raw)]:
   283   assumes t: "t \<in> B \<rightarrow>\<^sub>M tree_sigma M"
   275   assumes t: "t \<in> B \<rightarrow>\<^sub>M tree_sigma M"
   284   assumes l: "l \<in> B \<rightarrow>\<^sub>M A"
   276   assumes l: "l \<in> B \<rightarrow>\<^sub>M A"
   285   assumes n: "(\<lambda>(x, l, v, r, al, ar). n x l v r al ar) \<in>
   277   assumes n: "(\<lambda>(x, l, v, r, al, ar). n x l v r al ar) \<in>
   313       show "l \<in> restrict_space B (?C t Leaf) \<rightarrow>\<^sub>M A"
   305       show "l \<in> restrict_space B (?C t Leaf) \<rightarrow>\<^sub>M A"
   314         using l by (rule measurable_restrict_space1)
   306         using l by (rule measurable_restrict_space1)
   315     qed
   307     qed
   316   next
   308   next
   317     case (Node ls u rs)
   309     case (Node ls u rs)
   318     let ?F = "\<lambda>\<omega>. ?N (\<omega>, left (t \<omega>), val (t \<omega>), right (t \<omega>),
   310     let ?F = "\<lambda>\<omega>. ?N (\<omega>, left (t \<omega>), root_val (t \<omega>), right (t \<omega>),
   319         rec_tree (l \<omega>) (n \<omega>) (left (t \<omega>)), rec_tree (l \<omega>) (n \<omega>) (right (t \<omega>)))"
   311         rec_tree (l \<omega>) (n \<omega>) (left (t \<omega>)), rec_tree (l \<omega>) (n \<omega>) (right (t \<omega>)))"
   320     show ?case
   312     show ?case
   321     proof (rule measurable_cong[THEN iffD2])
   313     proof (rule measurable_cong[THEN iffD2])
   322       fix \<omega> assume "\<omega> \<in> space (restrict_space B (?C t (Node ls u rs)))"
   314       fix \<omega> assume "\<omega> \<in> space (restrict_space B (?C t (Node ls u rs)))"
   323       then show "rec_tree (l \<omega>) (n \<omega>) (t \<omega>) = ?F \<omega>"
   315       then show "rec_tree (l \<omega>) (n \<omega>) (t \<omega>) = ?F \<omega>"
   335           by auto
   327           by auto
   336         subgoal
   328         subgoal
   337           by (rule measurable_restrict_space1)
   329           by (rule measurable_restrict_space1)
   338              (rule measurable_compose[OF Node(3) measurable_right])
   330              (rule measurable_compose[OF Node(3) measurable_right])
   339         subgoal
   331         subgoal
   340           apply (rule measurable_compose[OF _ measurable_val'])
   332           apply (rule measurable_compose[OF _ measurable_root_val'])
   341           apply (rule measurable_restrict_space3[OF Node(3)])
   333           apply (rule measurable_restrict_space3[OF Node(3)])
   342           by auto
   334           by auto
   343         subgoal
   335         subgoal
   344           by (rule measurable_restrict_space1)
   336           by (rule measurable_restrict_space1)
   345              (rule measurable_compose[OF Node(3) measurable_left])
   337              (rule measurable_compose[OF Node(3) measurable_left])
   346         by (rule measurable_restrict_space1) auto
   338         by (rule measurable_restrict_space1) auto
   347     qed
   339     qed
   348   qed
   340   qed
   349 qed
   341 qed
   350 
   342 
   351 hide_const (open) val
   343 lemma measurable_Node [measurable]:
       
   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"
       
   345 proof (rule measurable_sigma_sets)
       
   346   show "sets (tree_sigma M) = sigma_sets (trees (space M)) (trees_cyl ` trees (sets M))"
       
   347     by (simp add: sets_tree_sigma_eq)
       
   348   show "trees_cyl ` trees (sets M) \<subseteq> Pow (trees (space M))"
       
   349     by (rule trees_cyl_sets_in_space)
       
   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)"
       
   351     by (auto simp: space_pair_measure space_tree_sigma)
       
   352   fix A assume t: "A \<in> trees_cyl ` trees (sets M)"
       
   353   then obtain t where t: "t \<in> trees (sets M)" "A = trees_cyl t" by auto
       
   354   show "(\<lambda>(l, x, r). \<langle>l, x, r\<rangle>) -` A \<inter>
       
   355          space (tree_sigma M \<Otimes>\<^sub>M M \<Otimes>\<^sub>M tree_sigma M)
       
   356          \<in> sets (tree_sigma M \<Otimes>\<^sub>M M \<Otimes>\<^sub>M tree_sigma M)"
       
   357   proof (cases t)
       
   358     case Leaf
       
   359     have "(\<lambda>(l, x, r). \<langle>l, x, r\<rangle>) -` {Leaf :: 'a tree} = {}" by auto
       
   360     with Leaf show ?thesis using t by simp
       
   361   next
       
   362     case (Node l B r)
       
   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) = 
       
   364              trees_cyl l \<times> B \<times> trees_cyl r" 
       
   365       using t and Node and trees_cyl_sub_trees[of _ "sets M" "space M"]
       
   366       by (auto simp: space_pair_measure space_tree_sigma 
       
   367                dest: sets.sets_into_space[of _ M])
       
   368     thus ?thesis using t and Node
       
   369       by (auto intro!: pair_measureI simp: sets_tree_sigma_eq)
       
   370   qed    
       
   371 qed
       
   372 
   352 hide_const (open) left
   373 hide_const (open) left
   353 hide_const (open) right
   374 hide_const (open) right
   354 
   375 
   355 end
   376 end