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 |