diff -r de72bbe42190 -r dea9363887a6 src/HOL/Probability/Fin_Map.thy --- a/src/HOL/Probability/Fin_Map.thy Tue Nov 27 11:29:47 2012 +0100 +++ b/src/HOL/Probability/Fin_Map.thy Tue Nov 27 13:48:40 2012 +0100 @@ -450,40 +450,41 @@ instantiation finmap :: (countable, polish_space) polish_space begin -definition enum_basis_finmap :: "nat \ ('a \\<^isub>F 'b) set" where - "enum_basis_finmap n = - (let m = from_nat n::('a \\<^isub>F nat) in Pi' (domain m) (enum_basis o (m)\<^isub>F))" +definition basis_finmap::"('a \\<^isub>F 'b) set set" + where "basis_finmap = {Pi' I S|I S. finite I \ (\i \ I. S i \ union_closed_basis)}" + +lemma in_basis_finmapI: + assumes "finite I" assumes "\i. i \ I \ S i \ union_closed_basis" + shows "Pi' I S \ basis_finmap" + using assms unfolding basis_finmap_def by auto + +lemma in_basis_finmapE: + assumes "x \ basis_finmap" + obtains I S where "x = Pi' I S" "finite I" "\i. i \ I \ S i \ union_closed_basis" + using assms unfolding basis_finmap_def by auto -lemma range_enum_basis_eq: - "range enum_basis_finmap = {Pi' I S|I S. finite I \ (\i \ I. S i \ range enum_basis)}" -proof (auto simp: enum_basis_finmap_def[abs_def]) - fix S::"('a \ 'b set)" and I - assume "\i\I. S i \ range enum_basis" - hence "\i\I. \n. S i = enum_basis n" by auto - then obtain n where n: "\i\I. S i = enum_basis (n i)" - unfolding bchoice_iff by blast - assume [simp]: "finite I" - have "\fm. domain fm = I \ (\i\I. n i = (fm i))" - by (rule finmap_choice) auto - then obtain m where "Pi' I S = Pi' (domain m) (enum_basis o m)" - using n by (auto simp: Pi'_def) - hence "Pi' I S = (let m = from_nat (to_nat m) in Pi' (domain m) (enum_basis \ m))" - by simp - thus "Pi' I S \ range (\n. let m = from_nat n in Pi' (domain m) (enum_basis \ m))" - by blast -qed (metis finite_domain o_apply rangeI) +lemma basis_finmap_eq: + "basis_finmap = (\f. Pi' (domain f) (\i. from_nat_into union_closed_basis ((f)\<^isub>F i))) ` + (UNIV::('a \\<^isub>F nat) set)" (is "_ = ?f ` _") + unfolding basis_finmap_def +proof safe + fix I::"'a set" and S::"'a \ 'b set" + assume "finite I" "\i\I. S i \ union_closed_basis" + hence "Pi' I S = ?f (finmap_of I (\x. to_nat_on union_closed_basis (S x)))" + by (force simp: Pi'_def countable_union_closed_basis) + thus "Pi' I S \ range ?f" by simp +qed (metis (mono_tags) empty_basisI equals0D finite_domain from_nat_into) -lemma in_enum_basis_finmapI: - assumes "finite I" assumes "\i. i \ I \ S i \ range enum_basis" - shows "Pi' I S \ range enum_basis_finmap" - using assms unfolding range_enum_basis_eq by auto +lemma countable_basis_finmap: "countable basis_finmap" + unfolding basis_finmap_eq by simp lemma finmap_topological_basis: - "topological_basis (range (enum_basis_finmap))" + "topological_basis basis_finmap" proof (subst topological_basis_iff, safe) - fix n::nat - show "open (enum_basis_finmap n::('a \\<^isub>F 'b) set)" using enum_basis_basis - by (auto intro!: open_Pi'I simp: topological_basis_def enum_basis_finmap_def Let_def) + fix B' assume "B' \ basis_finmap" + thus "open B'" + by (auto intro!: open_Pi'I topological_basis_open[OF basis_union_closed_basis] + simp: topological_basis_def basis_finmap_def Let_def) next fix O'::"('a \\<^isub>F 'b) set" and x assume "open O'" "x \ O'" @@ -491,19 +492,18 @@ def e' \ "e / (card (domain x) + 1)" have "\B. - (\i\domain x. x i \ enum_basis (B i) \ enum_basis (B i) \ ball (x i) e')" + (\i\domain x. x i \ B i \ B i \ ball (x i) e' \ B i \ union_closed_basis)" proof (rule bchoice, safe) fix i assume "i \ domain x" have "open (ball (x i) e')" "x i \ ball (x i) e'" using e by (auto simp add: e'_def intro!: divide_pos_pos) - from topological_basisE[OF enum_basis_basis this] guess b' . - thus "\y. x i \ enum_basis y \ - enum_basis y \ ball (x i) e'" by auto + from topological_basisE[OF basis_union_closed_basis this] guess b' . + thus "\y. x i \ y \ y \ ball (x i) e' \ y \ union_closed_basis" by auto qed then guess B .. note B = this - def B' \ "Pi' (domain x) (\i. enum_basis (B i)::'b set)" - hence "B' \ range enum_basis_finmap" unfolding B'_def - by (intro in_enum_basis_finmapI) auto + def B' \ "Pi' (domain x) (\i. (B i)::'b set)" + hence "B' \ basis_finmap" unfolding B'_def using B + by (intro in_basis_finmapI) auto moreover have "x \ B'" unfolding B'_def using B by auto moreover have "B' \ O'" proof @@ -516,7 +516,7 @@ also have "\ \ (\i \ domain x. e')" proof (rule setsum_mono) fix i assume "i \ domain x" - with `y \ B'` B have "y i \ enum_basis (B i)" + with `y \ B'` B have "y i \ B i" by (simp add: Pi'_def B'_def) hence "y i \ ball (x i) e'" using B `domain y = domain x` `i \ domain x` by force @@ -528,73 +528,15 @@ qed qed ultimately - show "\B'\range enum_basis_finmap. x \ B' \ B' \ O'" by blast + show "\B'\basis_finmap. x \ B' \ B' \ O'" by blast qed lemma range_enum_basis_finmap_imp_open: - assumes "x \ range enum_basis_finmap" + assumes "x \ basis_finmap" shows "open x" using finmap_topological_basis assms by (auto simp: topological_basis_def) -lemma open_imp_ex_UNION_of_enum: - fixes X::"('a \\<^isub>F 'b) set" - assumes "open X" assumes "X \ {}" - shows "\A::nat\'a set. \B::nat\('a \ 'b set) . X = UNION UNIV (\i. Pi' (A i) (B i)) \ - (\n. \i\A n. (B n) i \ range enum_basis) \ (\n. finite (A n))" -proof - - from `open X` obtain B' where B': "B'\range enum_basis_finmap" "\B' = X" - using finmap_topological_basis by (force simp add: topological_basis_def) - then obtain B where B: "B' = enum_basis_finmap ` B" by (auto simp: subset_image_iff) - show ?thesis - proof cases - assume "B = {}" with B have "B' = {}" by simp hence False using B' assms by simp - thus ?thesis by simp - next - assume "B \ {}" then obtain b where b: "b \ B" by auto - def NA \ "\n::nat. if n \ B - then domain ((from_nat::_\'a \\<^isub>F nat) n) - else domain ((from_nat::_\'a\\<^isub>F nat) b)" - def NB \ "\n::nat. if n \ B - then (\i. (enum_basis::nat\'b set) (((from_nat::_\'a \\<^isub>F nat) n) i)) - else (\i. (enum_basis::nat\'b set) (((from_nat::_\'a \\<^isub>F nat) b) i))" - have "X = UNION UNIV (\i. Pi' (NA i) (NB i))" unfolding B'(2)[symmetric] using b - unfolding B - by safe - (auto simp add: NA_def NB_def enum_basis_finmap_def Let_def o_def split: split_if_asm) - moreover - have "(\n. \i\NA n. (NB n) i \ range enum_basis)" - using enumerable_basis by (auto simp: topological_basis_def NA_def NB_def) - moreover have "(\n. finite (NA n))" by (simp add: NA_def) - ultimately show ?thesis by auto - qed -qed - -lemma open_imp_ex_UNION: - fixes X::"('a \\<^isub>F 'b) set" - assumes "open X" assumes "X \ {}" - shows "\A::nat\'a set. \B::nat\('a \ 'b set) . X = UNION UNIV (\i. Pi' (A i) (B i)) \ - (\n. \i\A n. open ((B n) i)) \ (\n. finite (A n))" - using open_imp_ex_UNION_of_enum[OF assms] - apply auto - apply (rule_tac x = A in exI) - apply (rule_tac x = B in exI) - apply (auto simp: open_enum_basis) - done - -lemma open_basisE: - assumes "open X" assumes "X \ {}" - obtains A::"nat\'a set" and B::"nat\('a \ 'b set)" where - "X = UNION UNIV (\i. Pi' (A i) (B i))" "\n i. i\A n \ open ((B n) i)" "\n. finite (A n)" - using open_imp_ex_UNION[OF assms] by auto - -lemma open_basis_of_enumE: - assumes "open X" assumes "X \ {}" - obtains A::"nat\'a set" and B::"nat\('a \ 'b set)" where - "X = UNION UNIV (\i. Pi' (A i) (B i))" "\n i. i\A n \ (B n) i \ range enum_basis" - "\n. finite (A n)" - using open_imp_ex_UNION_of_enum[OF assms] by auto - -instance proof qed (blast intro: finmap_topological_basis) +instance proof qed (blast intro: finmap_topological_basis countable_basis_finmap) end @@ -746,16 +688,12 @@ proof safe fix y assume "y \ sets N" have "A -` y = (\{A -` y \ {x. domain x = J}|J. finite J})" by auto - hence "A -` y \ space (PiF I M) = (\n. A -` y \ space (PiF ({set (from_nat n)}\I) M))" - apply (auto simp: space_PiF Pi'_def) - proof - - case goal1 + { fix x::"'a \\<^isub>F 'b" from finite_list[of "domain x"] obtain xs where "set xs = domain x" by auto - thus ?case - apply (intro exI[where x="to_nat xs"]) - apply auto - done - qed + hence "\n. domain x = set (from_nat n)" + by (intro exI[where x="to_nat xs"]) auto } + hence "A -` y \ space (PiF I M) = (\n. A -` y \ space (PiF ({set (from_nat n)}\I) M))" + by (auto simp: space_PiF Pi'_def) also have "\ \ sets (PiF I M)" apply (intro sets.Int sets.countable_nat_UN subsetI, safe) apply (case_tac "set (from_nat i) \ I") @@ -928,16 +866,6 @@ qed simp qed -lemma sets_subspaceI: - assumes "A \ space M \ sets M" - assumes "B \ sets M" - shows "A \ B \ sets M" using assms -proof - - have "A \ B = (A \ space M) \ B" - using assms sets.sets_into_space by auto - thus ?thesis using assms by auto -qed - lemma space_PiF_singleton_eq_product: assumes "finite I" shows "space (PiF {I} M) = (\' i\I. space (M i))" @@ -1075,49 +1003,49 @@ by (auto intro!: sets.sigma_sets_subset product_in_sets_PiFI simp: E_generates P_def) qed -lemma enumerable_sigma_fprod_algebra_sigma_eq: +lemma sets_PiF_eq_sigma_union_closed_basis_single: assumes "I \ {}" assumes [simp]: "finite I" shows "sets (PiF {I} (\_. borel)) = sigma_sets (space (PiF {I} (\_. borel))) - {Pi' I F |F. (\i\I. F i \ range enum_basis)}" + {Pi' I F |F. (\i\I. F i \ union_closed_basis)}" proof - from open_incseqE[OF open_UNIV] guess S::"nat \ 'b set" . note S = this show ?thesis proof (rule sigma_fprod_algebra_sigma_eq) show "finite I" by simp show "I \ {}" by fact - show "incseq S" "(\j. S j) = space borel" "range S \ range enum_basis" + show "incseq S" "(\j. S j) = space borel" "range S \ union_closed_basis" using S by simp_all - show "range enum_basis \ Pow (space borel)" by simp - show "sets borel = sigma_sets (space borel) (range enum_basis)" - by (simp add: borel_eq_enum_basis) + show "union_closed_basis \ Pow (space borel)" by simp + show "sets borel = sigma_sets (space borel) union_closed_basis" + by (simp add: borel_eq_union_closed_basis) qed qed -text {* adapted from @{thm enumerable_sigma_fprod_algebra_sigma_eq} *} +text {* adapted from @{thm sets_PiF_eq_sigma_union_closed_basis_single} *} -lemma enumerable_sigma_prod_algebra_sigma_eq: +lemma sets_PiM_eq_sigma_union_closed_basis: assumes "I \ {}" assumes [simp]: "finite I" shows "sets (PiM I (\_. borel)) = sigma_sets (space (PiM I (\_. borel))) - {Pi\<^isub>E I F |F. \i\I. F i \ range enum_basis}" + {Pi\<^isub>E I F |F. \i\I. F i \ union_closed_basis}" proof - from open_incseqE[OF open_UNIV] guess S::"nat \ 'b set" . note S = this show ?thesis proof (rule sigma_prod_algebra_sigma_eq) show "finite I" by simp note[[show_types]] - fix i show "(\j. S j) = space borel" "range S \ range enum_basis" + fix i show "(\j. S j) = space borel" "range S \ union_closed_basis" using S by simp_all - show "range enum_basis \ Pow (space borel)" by simp - show "sets borel = sigma_sets (space borel) (range enum_basis)" - by (simp add: borel_eq_enum_basis) + show "union_closed_basis \ Pow (space borel)" by simp + show "sets borel = sigma_sets (space borel) union_closed_basis" + by (simp add: borel_eq_union_closed_basis) qed qed lemma product_open_generates_sets_PiF_single: assumes "I \ {}" assumes [simp]: "finite I" - shows "sets (PiF {I} (\_. borel::'b::enumerable_basis measure)) = + shows "sets (PiF {I} (\_. borel::'b::countable_basis_space measure)) = sigma_sets (space (PiF {I} (\_. borel))) {Pi' I F |F. (\i\I. F i \ Collect open)}" proof - from open_incseqE[OF open_UNIV] guess S::"nat \ 'b set" . note S = this @@ -1126,7 +1054,7 @@ show "finite I" by simp show "I \ {}" by fact show "incseq S" "(\j. S j) = space borel" "range S \ Collect open" - using S by (auto simp: open_enum_basis) + using S by (auto simp: open_union_closed_basis) show "Collect open \ Pow (space borel)" by simp show "sets borel = sigma_sets (space borel) (Collect open)" by (simp add: borel_def) @@ -1136,7 +1064,7 @@ lemma product_open_generates_sets_PiM: assumes "I \ {}" assumes [simp]: "finite I" - shows "sets (PiM I (\_. borel::'b::enumerable_basis measure)) = + shows "sets (PiM I (\_. borel::'b::countable_basis_space measure)) = sigma_sets (space (PiM I (\_. borel))) {Pi\<^isub>E I F |F. \i\I. F i \ Collect open}" proof - from open_incseqE[OF open_UNIV] guess S::"nat \ 'b set" . note S = this @@ -1144,7 +1072,7 @@ proof (rule sigma_prod_algebra_sigma_eq) show "finite I" by simp note[[show_types]] fix i show "(\j. S j) = space borel" "range S \ Collect open" - using S by (auto simp: open_enum_basis) + using S by (auto simp: open_union_closed_basis) show "Collect open \ Pow (space borel)" by simp show "sets borel = sigma_sets (space borel) (Collect open)" by (simp add: borel_def) @@ -1155,88 +1083,62 @@ lemma borel_eq_PiF_borel: shows "(borel :: ('i::countable \\<^isub>F 'a::polish_space) measure) = - PiF (Collect finite) (\_. borel :: 'a measure)" -proof (rule measure_eqI) - have C: "Collect finite \ {}" by auto - show "sets (borel::('i \\<^isub>F 'a) measure) = sets (PiF (Collect finite) (\_. borel))" - proof - show "sets (borel::('i \\<^isub>F 'a) measure) \ sets (PiF (Collect finite) (\_. borel))" - apply (simp add: borel_def sets_PiF) - proof (rule sigma_sets_mono, safe, cases) - fix X::"('i \\<^isub>F 'a) set" assume "open X" "X \ {}" - from open_basisE[OF this] guess NA NB . note N = this - hence "X = (\i. Pi' (NA i) (NB i))" by simp - also have "\ \ - sigma_sets UNIV {Pi' J S |S J. finite J \ S \ J \ sigma_sets UNIV (Collect open)}" - using N by (intro Union sigma_sets.Basic) blast - finally show "X \ sigma_sets UNIV - {Pi' J X |X J. finite J \ X \ J \ sigma_sets UNIV (Collect open)}" . - qed (auto simp: Empty) + PiF (Collect finite) (\_. borel :: 'a measure)" + unfolding borel_def PiF_def +proof (rule measure_eqI, clarsimp, rule sigma_sets_eqI) + fix a::"('i \\<^isub>F 'a) set" assume "a \ Collect open" hence "open a" by simp + then obtain B' where B': "B'\basis_finmap" "a = \B'" + using finmap_topological_basis by (force simp add: topological_basis_def) + have "a \ sigma UNIV {Pi' J X |X J. finite J \ X \ J \ sigma_sets UNIV (Collect open)}" + unfolding `a = \B'` + proof (rule sets.countable_Union) + from B' countable_basis_finmap show "countable B'" by (metis countable_subset) next - show "sets (PiF (Collect finite) (\_. borel)) \ sets (borel::('i \\<^isub>F 'a) measure)" + show "B' \ sets (sigma UNIV + {Pi' J X |X J. finite J \ X \ J \ sigma_sets UNIV (Collect open)})" (is "_ \ sets ?s") proof - fix x assume x: "x \ sets (PiF (Collect finite::'i set set) (\_. borel::'a measure))" - hence x_sp: "x \ space (PiF (Collect finite) (\_. borel))" by (rule sets.sets_into_space) - let ?x = "\J. x \ {x. domain x = J}" - have "x = \{?x J |J. finite J}" by auto - also have "\ \ sets borel" - proof (rule countable_finite_comprehension, assumption) - fix J::"'i set" assume "finite J" - { assume ef: "J = {}" - { assume e: "?x J = {}" - hence "?x J \ sets borel" by simp - } moreover { - assume "?x J \ {}" - then obtain f where "f \ x" "domain f = {}" using ef by auto - hence "?x J = {f}" using `J = {}` - by (auto simp: finmap_eq_iff) - also have "{f} \ sets borel" by simp - finally have "?x J \ sets borel" . - } ultimately have "?x J \ sets borel" by blast - } moreover { - assume "J \ ({}::'i set)" - from open_incseqE[OF open_UNIV] guess S::"nat \ 'a set" . note S = this - have "(?x J) = x \ {m. domain m \ {J}}" by auto - also have "\ \ sets (PiF {J} (\_. borel))" - using x by (rule restrict_sets_measurable) (auto simp: `finite J`) - also have "\ = sigma_sets (space (PiF {J} (\_. borel))) - {Pi' (J) F |F. (\j\J. F j \ range enum_basis)}" - (is "_ = sigma_sets _ ?P") - by (rule enumerable_sigma_fprod_algebra_sigma_eq[OF `J \ {}` `finite J`]) - also have "\ \ sets borel" - proof - fix x - assume "x \ sigma_sets (space (PiF {J} (\_. borel))) ?P" - thus "x \ sets borel" - proof (rule sigma_sets.induct, safe) - fix F::"'i \ 'a set" - assume "\j\J. F j \ range enum_basis" - hence "Pi' J F \ range enum_basis_finmap" - unfolding range_enum_basis_eq - by (auto simp: `finite J` intro!: exI[where x=J] exI[where x=F]) - hence "open (Pi' (J) F)" by (rule range_enum_basis_finmap_imp_open) - thus "Pi' (J) F \ sets borel" by simp - next - fix a::"('i \\<^isub>F 'a) set" - have "space (PiF {J::'i set} (\_. borel::'a measure)) = - Pi' (J) (\_. UNIV)" - by (auto simp: space_PiF product_def) - moreover have "open (Pi' (J::'i set) (\_. UNIV::'a set))" - by (intro open_Pi'I) auto - ultimately - have "space (PiF {J::'i set} (\_. borel::'a measure)) \ sets borel" - by simp - moreover - assume "a \ sets borel" - ultimately show "space (PiF {J} (\_. borel)) - a \ sets borel" .. - qed auto - qed - finally have "(?x J) \ sets borel" . - } ultimately show "(?x J) \ sets borel" by blast - qed - finally show "x \ sets (borel)" . + fix x assume "x \ B'" with B' have "x \ basis_finmap" by auto + then obtain J X where "x = Pi' J X" "finite J" "X \ J \ sigma_sets UNIV (Collect open)" + by (auto simp: basis_finmap_def open_union_closed_basis) + thus "x \ sets ?s" by auto qed qed + thus "a \ sigma_sets UNIV {Pi' J X |X J. finite J \ X \ J \ sigma_sets UNIV (Collect open)}" + by simp +next + fix b::"('i \\<^isub>F 'a) set" + assume "b \ {Pi' J X |X J. finite J \ X \ J \ sigma_sets UNIV (Collect open)}" + hence b': "b \ sets (Pi\<^isub>F (Collect finite) (\_. borel))" by (auto simp: sets_PiF borel_def) + let ?b = "\J. b \ {x. domain x = J}" + have "b = \((\J. ?b J) ` Collect finite)" by auto + also have "\ \ sets borel" + proof (rule sets.countable_Union, safe) + fix J::"'i set" assume "finite J" + { assume ef: "J = {}" + have "?b J \ sets borel" + proof cases + assume "?b J \ {}" + then obtain f where "f \ b" "domain f = {}" using ef by auto + hence "?b J = {f}" using `J = {}` + by (auto simp: finmap_eq_iff) + also have "{f} \ sets borel" by simp + finally show ?thesis . + qed simp + } moreover { + assume "J \ ({}::'i set)" + have "(?b J) = b \ {m. domain m \ {J}}" by auto + also have "\ \ sets (PiF {J} (\_. borel))" + using b' by (rule restrict_sets_measurable) (auto simp: `finite J`) + also have "\ = sigma_sets (space (PiF {J} (\_. borel))) + {Pi' (J) F |F. (\j\J. F j \ Collect open)}" + (is "_ = sigma_sets _ ?P") + by (rule product_open_generates_sets_PiF_single[OF `J \ {}` `finite J`]) + also have "\ \ sigma_sets UNIV (Collect open)" + by (intro sigma_sets_mono'') (auto intro!: open_Pi'I simp: space_PiF) + finally have "(?b J) \ sets borel" by (simp add: borel_def) + } ultimately show "(?b J) \ sets borel" by blast + qed (simp add: countable_Collect_finite) + finally show "b \ sigma_sets UNIV (Collect open)" by (simp add: borel_def) qed (simp add: emeasure_sigma borel_def PiF_def) subsection {* Isomorphism between Functions and Finite Maps *}