hoelzl@42861: (* Title: HOL/Probability/Independent_Family.thy hoelzl@42861: Author: Johannes Hölzl, TU München hoelzl@42861: *) hoelzl@42861: hoelzl@42861: header {* Independent families of events, event sets, and random variables *} hoelzl@42861: hoelzl@42861: theory Independent_Family hoelzl@42861: imports Probability_Measure hoelzl@42861: begin hoelzl@42861: hoelzl@42861: definition (in prob_space) hoelzl@42981: "indep_events A I \ (A`I \ sets M) \ hoelzl@42981: (\J\I. J \ {} \ finite J \ prob (\j\J. A j) = (\j\J. prob (A j)))" hoelzl@42861: hoelzl@42861: definition (in prob_space) hoelzl@42981: "indep_event A B \ indep_events (bool_case A B) UNIV" hoelzl@42861: hoelzl@42861: definition (in prob_space) hoelzl@42981: "indep_sets F I \ (\i\I. F i \ sets M) \ hoelzl@42981: (\J\I. J \ {} \ finite J \ (\A\Pi J F. prob (\j\J. A j) = (\j\J. prob (A j))))" hoelzl@42981: hoelzl@42981: definition (in prob_space) hoelzl@42981: "indep_set A B \ indep_sets (bool_case A B) UNIV" hoelzl@42861: hoelzl@42861: definition (in prob_space) hoelzl@42861: "indep_rv M' X I \ hoelzl@42861: (\i\I. random_variable (M' i) (X i)) \ hoelzl@42861: indep_sets (\i. sigma_sets (space M) { X i -` A \ space M | A. A \ sets (M' i)}) I" hoelzl@42861: hoelzl@42981: lemma (in prob_space) indep_sets_cong: hoelzl@42981: "I = J \ (\i. i \ I \ F i = G i) \ indep_sets F I \ indep_sets G J" hoelzl@42981: by (simp add: indep_sets_def, intro conj_cong all_cong imp_cong ball_cong) blast+ hoelzl@42981: hoelzl@42981: lemma (in prob_space) indep_events_finite_index_events: hoelzl@42981: "indep_events F I \ (\J\I. J \ {} \ finite J \ indep_events F J)" hoelzl@42981: by (auto simp: indep_events_def) hoelzl@42981: hoelzl@42861: lemma (in prob_space) indep_sets_finite_index_sets: hoelzl@42861: "indep_sets F I \ (\J\I. J \ {} \ finite J \ indep_sets F J)" hoelzl@42861: proof (intro iffI allI impI) hoelzl@42861: assume *: "\J\I. J \ {} \ finite J \ indep_sets F J" hoelzl@42861: show "indep_sets F I" unfolding indep_sets_def hoelzl@42861: proof (intro conjI ballI allI impI) hoelzl@42861: fix i assume "i \ I" hoelzl@42861: with *[THEN spec, of "{i}"] show "F i \ events" hoelzl@42861: by (auto simp: indep_sets_def) hoelzl@42861: qed (insert *, auto simp: indep_sets_def) hoelzl@42861: qed (auto simp: indep_sets_def) hoelzl@42861: hoelzl@42861: lemma (in prob_space) indep_sets_mono_index: hoelzl@42861: "J \ I \ indep_sets F I \ indep_sets F J" hoelzl@42861: unfolding indep_sets_def by auto hoelzl@42861: hoelzl@42861: lemma (in prob_space) indep_sets_mono_sets: hoelzl@42861: assumes indep: "indep_sets F I" hoelzl@42861: assumes mono: "\i. i\I \ G i \ F i" hoelzl@42861: shows "indep_sets G I" hoelzl@42861: proof - hoelzl@42861: have "(\i\I. F i \ events) \ (\i\I. G i \ events)" hoelzl@42861: using mono by auto hoelzl@42861: moreover have "\A J. J \ I \ A \ (\ j\J. G j) \ A \ (\ j\J. F j)" hoelzl@42861: using mono by (auto simp: Pi_iff) hoelzl@42861: ultimately show ?thesis hoelzl@42861: using indep by (auto simp: indep_sets_def) hoelzl@42861: qed hoelzl@42861: hoelzl@42861: lemma (in prob_space) indep_setsI: hoelzl@42861: assumes "\i. i \ I \ F i \ events" hoelzl@42861: and "\A J. J \ {} \ J \ I \ finite J \ (\j\J. A j \ F j) \ prob (\j\J. A j) = (\j\J. prob (A j))" hoelzl@42861: shows "indep_sets F I" hoelzl@42861: using assms unfolding indep_sets_def by (auto simp: Pi_iff) hoelzl@42861: hoelzl@42861: lemma (in prob_space) indep_setsD: hoelzl@42861: assumes "indep_sets F I" and "J \ I" "J \ {}" "finite J" "\j\J. A j \ F j" hoelzl@42861: shows "prob (\j\J. A j) = (\j\J. prob (A j))" hoelzl@42861: using assms unfolding indep_sets_def by auto hoelzl@42861: hoelzl@42861: lemma dynkin_systemI': hoelzl@42861: assumes 1: "\ A. A \ sets M \ A \ space M" hoelzl@42861: assumes empty: "{} \ sets M" hoelzl@42861: assumes Diff: "\ A. A \ sets M \ space M - A \ sets M" hoelzl@42861: assumes 2: "\ A. disjoint_family A \ range A \ sets M hoelzl@42861: \ (\i::nat. A i) \ sets M" hoelzl@42861: shows "dynkin_system M" hoelzl@42861: proof - hoelzl@42861: from Diff[OF empty] have "space M \ sets M" by auto hoelzl@42861: from 1 this Diff 2 show ?thesis hoelzl@42861: by (intro dynkin_systemI) auto hoelzl@42861: qed hoelzl@42861: hoelzl@42861: lemma (in prob_space) indep_sets_dynkin: hoelzl@42861: assumes indep: "indep_sets F I" hoelzl@42861: shows "indep_sets (\i. sets (dynkin \ space = space M, sets = F i \)) I" hoelzl@42861: (is "indep_sets ?F I") hoelzl@42861: proof (subst indep_sets_finite_index_sets, intro allI impI ballI) hoelzl@42861: fix J assume "finite J" "J \ I" "J \ {}" hoelzl@42861: with indep have "indep_sets F J" hoelzl@42861: by (subst (asm) indep_sets_finite_index_sets) auto hoelzl@42861: { fix J K assume "indep_sets F K" hoelzl@42861: let "?G S i" = "if i \ S then ?F i else F i" hoelzl@42861: assume "finite J" "J \ K" hoelzl@42861: then have "indep_sets (?G J) K" hoelzl@42861: proof induct hoelzl@42861: case (insert j J) hoelzl@42861: moreover def G \ "?G J" hoelzl@42861: ultimately have G: "indep_sets G K" "\i. i \ K \ G i \ events" and "j \ K" hoelzl@42861: by (auto simp: indep_sets_def) hoelzl@42861: let ?D = "{E\events. indep_sets (G(j := {E})) K }" hoelzl@42861: { fix X assume X: "X \ events" hoelzl@42861: assume indep: "\J A. J \ {} \ J \ K \ finite J \ j \ J \ (\i\J. A i \ G i) hoelzl@42861: \ prob ((\i\J. A i) \ X) = prob X * (\i\J. prob (A i))" hoelzl@42861: have "indep_sets (G(j := {X})) K" hoelzl@42861: proof (rule indep_setsI) hoelzl@42861: fix i assume "i \ K" then show "(G(j:={X})) i \ events" hoelzl@42861: using G X by auto hoelzl@42861: next hoelzl@42861: fix A J assume J: "J \ {}" "J \ K" "finite J" "\i\J. A i \ (G(j := {X})) i" hoelzl@42861: show "prob (\j\J. A j) = (\j\J. prob (A j))" hoelzl@42861: proof cases hoelzl@42861: assume "j \ J" hoelzl@42861: with J have "A j = X" by auto hoelzl@42861: show ?thesis hoelzl@42861: proof cases hoelzl@42861: assume "J = {j}" then show ?thesis by simp hoelzl@42861: next hoelzl@42861: assume "J \ {j}" hoelzl@42861: have "prob (\i\J. A i) = prob ((\i\J-{j}. A i) \ X)" hoelzl@42861: using `j \ J` `A j = X` by (auto intro!: arg_cong[where f=prob] split: split_if_asm) hoelzl@42861: also have "\ = prob X * (\i\J-{j}. prob (A i))" hoelzl@42861: proof (rule indep) hoelzl@42861: show "J - {j} \ {}" "J - {j} \ K" "finite (J - {j})" "j \ J - {j}" hoelzl@42861: using J `J \ {j}` `j \ J` by auto hoelzl@42861: show "\i\J - {j}. A i \ G i" hoelzl@42861: using J by auto hoelzl@42861: qed hoelzl@42861: also have "\ = prob (A j) * (\i\J-{j}. prob (A i))" hoelzl@42861: using `A j = X` by simp hoelzl@42861: also have "\ = (\i\J. prob (A i))" hoelzl@42861: unfolding setprod.insert_remove[OF `finite J`, symmetric, of "\i. prob (A i)"] hoelzl@42861: using `j \ J` by (simp add: insert_absorb) hoelzl@42861: finally show ?thesis . hoelzl@42861: qed hoelzl@42861: next hoelzl@42861: assume "j \ J" hoelzl@42861: with J have "\i\J. A i \ G i" by (auto split: split_if_asm) hoelzl@42861: with J show ?thesis hoelzl@42861: by (intro indep_setsD[OF G(1)]) auto hoelzl@42861: qed hoelzl@42861: qed } hoelzl@42861: note indep_sets_insert = this hoelzl@42861: have "dynkin_system \ space = space M, sets = ?D \" hoelzl@42861: proof (rule dynkin_systemI', simp_all, safe) hoelzl@42861: show "indep_sets (G(j := {{}})) K" hoelzl@42861: by (rule indep_sets_insert) auto hoelzl@42861: next hoelzl@42861: fix X assume X: "X \ events" and G': "indep_sets (G(j := {X})) K" hoelzl@42861: show "indep_sets (G(j := {space M - X})) K" hoelzl@42861: proof (rule indep_sets_insert) hoelzl@42861: fix J A assume J: "J \ {}" "J \ K" "finite J" "j \ J" and A: "\i\J. A i \ G i" hoelzl@42861: then have A_sets: "\i. i\J \ A i \ events" hoelzl@42861: using G by auto hoelzl@42861: have "prob ((\j\J. A j) \ (space M - X)) = hoelzl@42861: prob ((\j\J. A j) - (\i\insert j J. (A(j := X)) i))" hoelzl@42861: using A_sets sets_into_space X `J \ {}` hoelzl@42861: by (auto intro!: arg_cong[where f=prob] split: split_if_asm) hoelzl@42861: also have "\ = prob (\j\J. A j) - prob (\i\insert j J. (A(j := X)) i)" hoelzl@42861: using J `J \ {}` `j \ J` A_sets X sets_into_space hoelzl@42861: by (auto intro!: finite_measure_Diff finite_INT split: split_if_asm) hoelzl@42861: finally have "prob ((\j\J. A j) \ (space M - X)) = hoelzl@42861: prob (\j\J. A j) - prob (\i\insert j J. (A(j := X)) i)" . hoelzl@42861: moreover { hoelzl@42861: have "prob (\j\J. A j) = (\j\J. prob (A j))" hoelzl@42861: using J A `finite J` by (intro indep_setsD[OF G(1)]) auto hoelzl@42861: then have "prob (\j\J. A j) = prob (space M) * (\i\J. prob (A i))" hoelzl@42861: using prob_space by simp } hoelzl@42861: moreover { hoelzl@42861: have "prob (\i\insert j J. (A(j := X)) i) = (\i\insert j J. prob ((A(j := X)) i))" hoelzl@42861: using J A `j \ K` by (intro indep_setsD[OF G']) auto hoelzl@42861: then have "prob (\i\insert j J. (A(j := X)) i) = prob X * (\i\J. prob (A i))" hoelzl@42861: using `finite J` `j \ J` by (auto intro!: setprod_cong) } hoelzl@42861: ultimately have "prob ((\j\J. A j) \ (space M - X)) = (prob (space M) - prob X) * (\i\J. prob (A i))" hoelzl@42861: by (simp add: field_simps) hoelzl@42861: also have "\ = prob (space M - X) * (\i\J. prob (A i))" hoelzl@42861: using X A by (simp add: finite_measure_compl) hoelzl@42861: finally show "prob ((\j\J. A j) \ (space M - X)) = prob (space M - X) * (\i\J. prob (A i))" . hoelzl@42861: qed (insert X, auto) hoelzl@42861: next hoelzl@42861: fix F :: "nat \ 'a set" assume disj: "disjoint_family F" and "range F \ ?D" hoelzl@42861: then have F: "\i. F i \ events" "\i. indep_sets (G(j:={F i})) K" by auto hoelzl@42861: show "indep_sets (G(j := {\k. F k})) K" hoelzl@42861: proof (rule indep_sets_insert) hoelzl@42861: fix J A assume J: "j \ J" "J \ {}" "J \ K" "finite J" and A: "\i\J. A i \ G i" hoelzl@42861: then have A_sets: "\i. i\J \ A i \ events" hoelzl@42861: using G by auto hoelzl@42861: have "prob ((\j\J. A j) \ (\k. F k)) = prob (\k. (\i\insert j J. (A(j := F k)) i))" hoelzl@42861: using `J \ {}` `j \ J` `j \ K` by (auto intro!: arg_cong[where f=prob] split: split_if_asm) hoelzl@42861: moreover have "(\k. prob (\i\insert j J. (A(j := F k)) i)) sums prob (\k. (\i\insert j J. (A(j := F k)) i))" hoelzl@42861: proof (rule finite_measure_UNION) hoelzl@42861: show "disjoint_family (\k. \i\insert j J. (A(j := F k)) i)" hoelzl@42861: using disj by (rule disjoint_family_on_bisimulation) auto hoelzl@42861: show "range (\k. \i\insert j J. (A(j := F k)) i) \ events" hoelzl@42861: using A_sets F `finite J` `J \ {}` `j \ J` by (auto intro!: Int) hoelzl@42861: qed hoelzl@42861: moreover { fix k hoelzl@42861: from J A `j \ K` have "prob (\i\insert j J. (A(j := F k)) i) = prob (F k) * (\i\J. prob (A i))" hoelzl@42861: by (subst indep_setsD[OF F(2)]) (auto intro!: setprod_cong split: split_if_asm) hoelzl@42861: also have "\ = prob (F k) * prob (\i\J. A i)" hoelzl@42861: using J A `j \ K` by (subst indep_setsD[OF G(1)]) auto hoelzl@42861: finally have "prob (\i\insert j J. (A(j := F k)) i) = prob (F k) * prob (\i\J. A i)" . } hoelzl@42861: ultimately have "(\k. prob (F k) * prob (\i\J. A i)) sums (prob ((\j\J. A j) \ (\k. F k)))" hoelzl@42861: by simp hoelzl@42861: moreover hoelzl@42861: have "(\k. prob (F k) * prob (\i\J. A i)) sums (prob (\k. F k) * prob (\i\J. A i))" hoelzl@42861: using disj F(1) by (intro finite_measure_UNION sums_mult2) auto hoelzl@42861: then have "(\k. prob (F k) * prob (\i\J. A i)) sums (prob (\k. F k) * (\i\J. prob (A i)))" hoelzl@42861: using J A `j \ K` by (subst indep_setsD[OF G(1), symmetric]) auto hoelzl@42861: ultimately hoelzl@42861: show "prob ((\j\J. A j) \ (\k. F k)) = prob (\k. F k) * (\j\J. prob (A j))" hoelzl@42861: by (auto dest!: sums_unique) hoelzl@42861: qed (insert F, auto) hoelzl@42861: qed (insert sets_into_space, auto) hoelzl@42861: then have mono: "sets (dynkin \space = space M, sets = G j\) \ hoelzl@42861: sets \space = space M, sets = {E \ events. indep_sets (G(j := {E})) K}\" hoelzl@42861: proof (rule dynkin_system.dynkin_subset, simp_all, safe) hoelzl@42861: fix X assume "X \ G j" hoelzl@42861: then show "X \ events" using G `j \ K` by auto hoelzl@42861: from `indep_sets G K` hoelzl@42861: show "indep_sets (G(j := {X})) K" hoelzl@42861: by (rule indep_sets_mono_sets) (insert `X \ G j`, auto) hoelzl@42861: qed hoelzl@42861: have "indep_sets (G(j:=?D)) K" hoelzl@42861: proof (rule indep_setsI) hoelzl@42861: fix i assume "i \ K" then show "(G(j := ?D)) i \ events" hoelzl@42861: using G(2) by auto hoelzl@42861: next hoelzl@42861: fix A J assume J: "J\{}" "J \ K" "finite J" and A: "\i\J. A i \ (G(j := ?D)) i" hoelzl@42861: show "prob (\j\J. A j) = (\j\J. prob (A j))" hoelzl@42861: proof cases hoelzl@42861: assume "j \ J" hoelzl@42861: with A have indep: "indep_sets (G(j := {A j})) K" by auto hoelzl@42861: from J A show ?thesis hoelzl@42861: by (intro indep_setsD[OF indep]) auto hoelzl@42861: next hoelzl@42861: assume "j \ J" hoelzl@42861: with J A have "\i\J. A i \ G i" by (auto split: split_if_asm) hoelzl@42861: with J show ?thesis hoelzl@42861: by (intro indep_setsD[OF G(1)]) auto hoelzl@42861: qed hoelzl@42861: qed hoelzl@42861: then have "indep_sets (G(j:=sets (dynkin \space = space M, sets = G j\))) K" hoelzl@42861: by (rule indep_sets_mono_sets) (insert mono, auto) hoelzl@42861: then show ?case hoelzl@42861: by (rule indep_sets_mono_sets) (insert `j \ K` `j \ J`, auto simp: G_def) hoelzl@42861: qed (insert `indep_sets F K`, simp) } hoelzl@42861: from this[OF `indep_sets F J` `finite J` subset_refl] hoelzl@42861: show "indep_sets (\i. sets (dynkin \ space = space M, sets = F i \)) J" hoelzl@42861: by (rule indep_sets_mono_sets) auto hoelzl@42861: qed hoelzl@42861: hoelzl@42861: lemma (in prob_space) indep_sets_sigma: hoelzl@42861: assumes indep: "indep_sets F I" hoelzl@42861: assumes stable: "\i. i \ I \ Int_stable \ space = space M, sets = F i \" hoelzl@42861: shows "indep_sets (\i. sets (sigma \ space = space M, sets = F i \)) I" hoelzl@42861: proof - hoelzl@42861: from indep_sets_dynkin[OF indep] hoelzl@42861: show ?thesis hoelzl@42861: proof (rule indep_sets_mono_sets, subst sigma_eq_dynkin, simp_all add: stable) hoelzl@42861: fix i assume "i \ I" hoelzl@42861: with indep have "F i \ events" by (auto simp: indep_sets_def) hoelzl@42861: with sets_into_space show "F i \ Pow (space M)" by auto hoelzl@42861: qed hoelzl@42861: qed hoelzl@42861: hoelzl@42861: lemma (in prob_space) indep_sets_sigma_sets: hoelzl@42861: assumes "indep_sets F I" hoelzl@42861: assumes "\i. i \ I \ Int_stable \ space = space M, sets = F i \" hoelzl@42861: shows "indep_sets (\i. sigma_sets (space M) (F i)) I" hoelzl@42861: using indep_sets_sigma[OF assms] by (simp add: sets_sigma) hoelzl@42861: hoelzl@42861: lemma (in prob_space) indep_sets2_eq: hoelzl@42981: "indep_set A B \ A \ events \ B \ events \ (\a\A. \b\B. prob (a \ b) = prob a * prob b)" hoelzl@42981: unfolding indep_set_def hoelzl@42861: proof (intro iffI ballI conjI) hoelzl@42861: assume indep: "indep_sets (bool_case A B) UNIV" hoelzl@42861: { fix a b assume "a \ A" "b \ B" hoelzl@42861: with indep_setsD[OF indep, of UNIV "bool_case a b"] hoelzl@42861: show "prob (a \ b) = prob a * prob b" hoelzl@42861: unfolding UNIV_bool by (simp add: ac_simps) } hoelzl@42861: from indep show "A \ events" "B \ events" hoelzl@42861: unfolding indep_sets_def UNIV_bool by auto hoelzl@42861: next hoelzl@42861: assume *: "A \ events \ B \ events \ (\a\A. \b\B. prob (a \ b) = prob a * prob b)" hoelzl@42861: show "indep_sets (bool_case A B) UNIV" hoelzl@42861: proof (rule indep_setsI) hoelzl@42861: fix i show "(case i of True \ A | False \ B) \ events" hoelzl@42861: using * by (auto split: bool.split) hoelzl@42861: next hoelzl@42861: fix J X assume "J \ {}" "J \ UNIV" and X: "\j\J. X j \ (case j of True \ A | False \ B)" hoelzl@42861: then have "J = {True} \ J = {False} \ J = {True,False}" hoelzl@42861: by (auto simp: UNIV_bool) hoelzl@42861: then show "prob (\j\J. X j) = (\j\J. prob (X j))" hoelzl@42861: using X * by auto hoelzl@42861: qed hoelzl@42861: qed hoelzl@42861: hoelzl@42981: lemma (in prob_space) indep_set_sigma_sets: hoelzl@42981: assumes "indep_set A B" hoelzl@42861: assumes A: "Int_stable \ space = space M, sets = A \" hoelzl@42861: assumes B: "Int_stable \ space = space M, sets = B \" hoelzl@42981: shows "indep_set (sigma_sets (space M) A) (sigma_sets (space M) B)" hoelzl@42861: proof - hoelzl@42861: have "indep_sets (\i. sigma_sets (space M) (case i of True \ A | False \ B)) UNIV" hoelzl@42861: proof (rule indep_sets_sigma_sets) hoelzl@42861: show "indep_sets (bool_case A B) UNIV" hoelzl@42981: by (rule `indep_set A B`[unfolded indep_set_def]) hoelzl@42861: fix i show "Int_stable \space = space M, sets = case i of True \ A | False \ B\" hoelzl@42861: using A B by (cases i) auto hoelzl@42861: qed hoelzl@42861: then show ?thesis hoelzl@42981: unfolding indep_set_def hoelzl@42861: by (rule indep_sets_mono_sets) (auto split: bool.split) hoelzl@42861: qed hoelzl@42861: hoelzl@42981: lemma (in prob_space) indep_sets_collect_sigma: hoelzl@42981: fixes I :: "'j \ 'i set" and J :: "'j set" and E :: "'i \ 'a set set" hoelzl@42981: assumes indep: "indep_sets E (\j\J. I j)" hoelzl@42981: assumes Int_stable: "\i j. j \ J \ i \ I j \ Int_stable \space = space M, sets = E i\" hoelzl@42981: assumes disjoint: "disjoint_family_on I J" hoelzl@42981: shows "indep_sets (\j. sigma_sets (space M) (\i\I j. E i)) J" hoelzl@42981: proof - hoelzl@42981: let "?E j" = "{\k\K. E' k| E' K. finite K \ K \ {} \ K \ I j \ (\k\K. E' k \ E k) }" hoelzl@42981: hoelzl@42981: from indep have E: "\j i. j \ J \ i \ I j \ E i \ sets M" hoelzl@42981: unfolding indep_sets_def by auto hoelzl@42981: { fix j hoelzl@42981: let ?S = "sigma \ space = space M, sets = (\i\I j. E i) \" hoelzl@42981: assume "j \ J" hoelzl@42981: from E[OF this] interpret S: sigma_algebra ?S hoelzl@42981: using sets_into_space by (intro sigma_algebra_sigma) auto hoelzl@42981: hoelzl@42981: have "sigma_sets (space M) (\i\I j. E i) = sigma_sets (space M) (?E j)" hoelzl@42981: proof (rule sigma_sets_eqI) hoelzl@42981: fix A assume "A \ (\i\I j. E i)" hoelzl@42981: then guess i .. hoelzl@42981: then show "A \ sigma_sets (space M) (?E j)" hoelzl@42981: by (auto intro!: sigma_sets.intros exI[of _ "{i}"] exI[of _ "\i. A"]) hoelzl@42981: next hoelzl@42981: fix A assume "A \ ?E j" hoelzl@42981: then obtain E' K where "finite K" "K \ {}" "K \ I j" "\k. k \ K \ E' k \ E k" hoelzl@42981: and A: "A = (\k\K. E' k)" hoelzl@42981: by auto hoelzl@42981: then have "A \ sets ?S" unfolding A hoelzl@42981: by (safe intro!: S.finite_INT) hoelzl@42981: (auto simp: sets_sigma intro!: sigma_sets.Basic) hoelzl@42981: then show "A \ sigma_sets (space M) (\i\I j. E i)" hoelzl@42981: by (simp add: sets_sigma) hoelzl@42981: qed } hoelzl@42981: moreover have "indep_sets (\j. sigma_sets (space M) (?E j)) J" hoelzl@42981: proof (rule indep_sets_sigma_sets) hoelzl@42981: show "indep_sets ?E J" hoelzl@42981: proof (intro indep_setsI) hoelzl@42981: fix j assume "j \ J" with E show "?E j \ events" by (force intro!: finite_INT) hoelzl@42981: next hoelzl@42981: fix K A assume K: "K \ {}" "K \ J" "finite K" hoelzl@42981: and "\j\K. A j \ ?E j" hoelzl@42981: then have "\j\K. \E' L. A j = (\l\L. E' l) \ finite L \ L \ {} \ L \ I j \ (\l\L. E' l \ E l)" hoelzl@42981: by simp hoelzl@42981: from bchoice[OF this] guess E' .. hoelzl@42981: from bchoice[OF this] obtain L hoelzl@42981: where A: "\j. j\K \ A j = (\l\L j. E' j l)" hoelzl@42981: and L: "\j. j\K \ finite (L j)" "\j. j\K \ L j \ {}" "\j. j\K \ L j \ I j" hoelzl@42981: and E': "\j l. j\K \ l \ L j \ E' j l \ E l" hoelzl@42981: by auto hoelzl@42981: hoelzl@42981: { fix k l j assume "k \ K" "j \ K" "l \ L j" "l \ L k" hoelzl@42981: have "k = j" hoelzl@42981: proof (rule ccontr) hoelzl@42981: assume "k \ j" hoelzl@42981: with disjoint `K \ J` `k \ K` `j \ K` have "I k \ I j = {}" hoelzl@42981: unfolding disjoint_family_on_def by auto hoelzl@42981: with L(2,3)[OF `j \ K`] L(2,3)[OF `k \ K`] hoelzl@42981: show False using `l \ L k` `l \ L j` by auto hoelzl@42981: qed } hoelzl@42981: note L_inj = this hoelzl@42981: hoelzl@42981: def k \ "\l. (SOME k. k \ K \ l \ L k)" hoelzl@42981: { fix x j l assume *: "j \ K" "l \ L j" hoelzl@42981: have "k l = j" unfolding k_def hoelzl@42981: proof (rule some_equality) hoelzl@42981: fix k assume "k \ K \ l \ L k" hoelzl@42981: with * L_inj show "k = j" by auto hoelzl@42981: qed (insert *, simp) } hoelzl@42981: note k_simp[simp] = this hoelzl@42981: let "?E' l" = "E' (k l) l" hoelzl@42981: have "prob (\j\K. A j) = prob (\l\(\k\K. L k). ?E' l)" hoelzl@42981: by (auto simp: A intro!: arg_cong[where f=prob]) hoelzl@42981: also have "\ = (\l\(\k\K. L k). prob (?E' l))" hoelzl@42981: using L K E' by (intro indep_setsD[OF indep]) (simp_all add: UN_mono) hoelzl@42981: also have "\ = (\j\K. \l\L j. prob (E' j l))" hoelzl@42981: using K L L_inj by (subst setprod_UN_disjoint) auto hoelzl@42981: also have "\ = (\j\K. prob (A j))" hoelzl@42981: using K L E' by (auto simp add: A intro!: setprod_cong indep_setsD[OF indep, symmetric]) blast hoelzl@42981: finally show "prob (\j\K. A j) = (\j\K. prob (A j))" . hoelzl@42981: qed hoelzl@42981: next hoelzl@42981: fix j assume "j \ J" hoelzl@42981: show "Int_stable \ space = space M, sets = ?E j \" hoelzl@42981: proof (rule Int_stableI) hoelzl@42981: fix a assume "a \ ?E j" then obtain Ka Ea hoelzl@42981: where a: "a = (\k\Ka. Ea k)" "finite Ka" "Ka \ {}" "Ka \ I j" "\k. k\Ka \ Ea k \ E k" by auto hoelzl@42981: fix b assume "b \ ?E j" then obtain Kb Eb hoelzl@42981: where b: "b = (\k\Kb. Eb k)" "finite Kb" "Kb \ {}" "Kb \ I j" "\k. k\Kb \ Eb k \ E k" by auto hoelzl@42981: let ?A = "\k. (if k \ Ka \ Kb then Ea k \ Eb k else if k \ Kb then Eb k else if k \ Ka then Ea k else {})" hoelzl@42981: have "a \ b = INTER (Ka \ Kb) ?A" hoelzl@42981: by (simp add: a b set_eq_iff) auto hoelzl@42981: with a b `j \ J` Int_stableD[OF Int_stable] show "a \ b \ ?E j" hoelzl@42981: by (intro CollectI exI[of _ "Ka \ Kb"] exI[of _ ?A]) auto hoelzl@42981: qed hoelzl@42981: qed hoelzl@42981: ultimately show ?thesis hoelzl@42981: by (simp cong: indep_sets_cong) hoelzl@42981: qed hoelzl@42981: hoelzl@42861: end