# HG changeset patch # User hoelzl # Date 1305625656 -7200 # Node ID 16375b493b64643ab342785f9331dd7203be27aa # Parent b02349e70d5a1f968f79685cde7765f799ad865c Add formalization of probabilistic independence for families of sets diff -r b02349e70d5a -r 16375b493b64 src/HOL/IsaMakefile --- a/src/HOL/IsaMakefile Thu May 19 19:58:07 2011 +0200 +++ b/src/HOL/IsaMakefile Tue May 17 11:47:36 2011 +0200 @@ -1193,6 +1193,7 @@ Probability/ex/Dining_Cryptographers.thy \ Probability/ex/Koepf_Duermuth_Countermeasure.thy \ Probability/Finite_Product_Measure.thy \ + Probability/Independent_Family.thy \ Probability/Infinite_Product_Measure.thy Probability/Information.thy \ Probability/Lebesgue_Integration.thy Probability/Lebesgue_Measure.thy \ Probability/Measure.thy Probability/Probability_Measure.thy \ diff -r b02349e70d5a -r 16375b493b64 src/HOL/Probability/Independent_Family.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Probability/Independent_Family.thy Tue May 17 11:47:36 2011 +0200 @@ -0,0 +1,312 @@ +(* Title: HOL/Probability/Independent_Family.thy + Author: Johannes Hölzl, TU München +*) + +header {* Independent families of events, event sets, and random variables *} + +theory Independent_Family + imports Probability_Measure +begin + +definition (in prob_space) + "indep_events A I \ (\J\I. J \ {} \ finite J \ prob (\j\J. A j) = (\j\J. prob (A j)))" + +definition (in prob_space) + "indep_sets F I \ (\i\I. F i \ events) \ (\J\I. J \ {} \ finite J \ + (\A\(\ j\J. F j). prob (\j\J. A j) = (\j\J. prob (A j))))" + +definition (in prob_space) + "indep_sets2 A B \ indep_sets (bool_case A B) UNIV" + +definition (in prob_space) + "indep_rv M' X I \ + (\i\I. random_variable (M' i) (X i)) \ + indep_sets (\i. sigma_sets (space M) { X i -` A \ space M | A. A \ sets (M' i)}) I" + +lemma (in prob_space) indep_sets_finite_index_sets: + "indep_sets F I \ (\J\I. J \ {} \ finite J \ indep_sets F J)" +proof (intro iffI allI impI) + assume *: "\J\I. J \ {} \ finite J \ indep_sets F J" + show "indep_sets F I" unfolding indep_sets_def + proof (intro conjI ballI allI impI) + fix i assume "i \ I" + with *[THEN spec, of "{i}"] show "F i \ events" + by (auto simp: indep_sets_def) + qed (insert *, auto simp: indep_sets_def) +qed (auto simp: indep_sets_def) + +lemma (in prob_space) indep_sets_mono_index: + "J \ I \ indep_sets F I \ indep_sets F J" + unfolding indep_sets_def by auto + +lemma (in prob_space) indep_sets_mono_sets: + assumes indep: "indep_sets F I" + assumes mono: "\i. i\I \ G i \ F i" + shows "indep_sets G I" +proof - + have "(\i\I. F i \ events) \ (\i\I. G i \ events)" + using mono by auto + moreover have "\A J. J \ I \ A \ (\ j\J. G j) \ A \ (\ j\J. F j)" + using mono by (auto simp: Pi_iff) + ultimately show ?thesis + using indep by (auto simp: indep_sets_def) +qed + +lemma (in prob_space) indep_setsI: + assumes "\i. i \ I \ F i \ events" + and "\A J. J \ {} \ J \ I \ finite J \ (\j\J. A j \ F j) \ prob (\j\J. A j) = (\j\J. prob (A j))" + shows "indep_sets F I" + using assms unfolding indep_sets_def by (auto simp: Pi_iff) + +lemma (in prob_space) indep_setsD: + assumes "indep_sets F I" and "J \ I" "J \ {}" "finite J" "\j\J. A j \ F j" + shows "prob (\j\J. A j) = (\j\J. prob (A j))" + using assms unfolding indep_sets_def by auto + +lemma dynkin_systemI': + assumes 1: "\ A. A \ sets M \ A \ space M" + assumes empty: "{} \ sets M" + assumes Diff: "\ A. A \ sets M \ space M - A \ sets M" + assumes 2: "\ A. disjoint_family A \ range A \ sets M + \ (\i::nat. A i) \ sets M" + shows "dynkin_system M" +proof - + from Diff[OF empty] have "space M \ sets M" by auto + from 1 this Diff 2 show ?thesis + by (intro dynkin_systemI) auto +qed + +lemma (in prob_space) indep_sets_dynkin: + assumes indep: "indep_sets F I" + shows "indep_sets (\i. sets (dynkin \ space = space M, sets = F i \)) I" + (is "indep_sets ?F I") +proof (subst indep_sets_finite_index_sets, intro allI impI ballI) + fix J assume "finite J" "J \ I" "J \ {}" + with indep have "indep_sets F J" + by (subst (asm) indep_sets_finite_index_sets) auto + { fix J K assume "indep_sets F K" + let "?G S i" = "if i \ S then ?F i else F i" + assume "finite J" "J \ K" + then have "indep_sets (?G J) K" + proof induct + case (insert j J) + moreover def G \ "?G J" + ultimately have G: "indep_sets G K" "\i. i \ K \ G i \ events" and "j \ K" + by (auto simp: indep_sets_def) + let ?D = "{E\events. indep_sets (G(j := {E})) K }" + { fix X assume X: "X \ events" + assume indep: "\J A. J \ {} \ J \ K \ finite J \ j \ J \ (\i\J. A i \ G i) + \ prob ((\i\J. A i) \ X) = prob X * (\i\J. prob (A i))" + have "indep_sets (G(j := {X})) K" + proof (rule indep_setsI) + fix i assume "i \ K" then show "(G(j:={X})) i \ events" + using G X by auto + next + fix A J assume J: "J \ {}" "J \ K" "finite J" "\i\J. A i \ (G(j := {X})) i" + show "prob (\j\J. A j) = (\j\J. prob (A j))" + proof cases + assume "j \ J" + with J have "A j = X" by auto + show ?thesis + proof cases + assume "J = {j}" then show ?thesis by simp + next + assume "J \ {j}" + have "prob (\i\J. A i) = prob ((\i\J-{j}. A i) \ X)" + using `j \ J` `A j = X` by (auto intro!: arg_cong[where f=prob] split: split_if_asm) + also have "\ = prob X * (\i\J-{j}. prob (A i))" + proof (rule indep) + show "J - {j} \ {}" "J - {j} \ K" "finite (J - {j})" "j \ J - {j}" + using J `J \ {j}` `j \ J` by auto + show "\i\J - {j}. A i \ G i" + using J by auto + qed + also have "\ = prob (A j) * (\i\J-{j}. prob (A i))" + using `A j = X` by simp + also have "\ = (\i\J. prob (A i))" + unfolding setprod.insert_remove[OF `finite J`, symmetric, of "\i. prob (A i)"] + using `j \ J` by (simp add: insert_absorb) + finally show ?thesis . + qed + next + assume "j \ J" + with J have "\i\J. A i \ G i" by (auto split: split_if_asm) + with J show ?thesis + by (intro indep_setsD[OF G(1)]) auto + qed + qed } + note indep_sets_insert = this + have "dynkin_system \ space = space M, sets = ?D \" + proof (rule dynkin_systemI', simp_all, safe) + show "indep_sets (G(j := {{}})) K" + by (rule indep_sets_insert) auto + next + fix X assume X: "X \ events" and G': "indep_sets (G(j := {X})) K" + show "indep_sets (G(j := {space M - X})) K" + proof (rule indep_sets_insert) + fix J A assume J: "J \ {}" "J \ K" "finite J" "j \ J" and A: "\i\J. A i \ G i" + then have A_sets: "\i. i\J \ A i \ events" + using G by auto + have "prob ((\j\J. A j) \ (space M - X)) = + prob ((\j\J. A j) - (\i\insert j J. (A(j := X)) i))" + using A_sets sets_into_space X `J \ {}` + by (auto intro!: arg_cong[where f=prob] split: split_if_asm) + also have "\ = prob (\j\J. A j) - prob (\i\insert j J. (A(j := X)) i)" + using J `J \ {}` `j \ J` A_sets X sets_into_space + by (auto intro!: finite_measure_Diff finite_INT split: split_if_asm) + finally have "prob ((\j\J. A j) \ (space M - X)) = + prob (\j\J. A j) - prob (\i\insert j J. (A(j := X)) i)" . + moreover { + have "prob (\j\J. A j) = (\j\J. prob (A j))" + using J A `finite J` by (intro indep_setsD[OF G(1)]) auto + then have "prob (\j\J. A j) = prob (space M) * (\i\J. prob (A i))" + using prob_space by simp } + moreover { + have "prob (\i\insert j J. (A(j := X)) i) = (\i\insert j J. prob ((A(j := X)) i))" + using J A `j \ K` by (intro indep_setsD[OF G']) auto + then have "prob (\i\insert j J. (A(j := X)) i) = prob X * (\i\J. prob (A i))" + using `finite J` `j \ J` by (auto intro!: setprod_cong) } + ultimately have "prob ((\j\J. A j) \ (space M - X)) = (prob (space M) - prob X) * (\i\J. prob (A i))" + by (simp add: field_simps) + also have "\ = prob (space M - X) * (\i\J. prob (A i))" + using X A by (simp add: finite_measure_compl) + finally show "prob ((\j\J. A j) \ (space M - X)) = prob (space M - X) * (\i\J. prob (A i))" . + qed (insert X, auto) + next + fix F :: "nat \ 'a set" assume disj: "disjoint_family F" and "range F \ ?D" + then have F: "\i. F i \ events" "\i. indep_sets (G(j:={F i})) K" by auto + show "indep_sets (G(j := {\k. F k})) K" + proof (rule indep_sets_insert) + fix J A assume J: "j \ J" "J \ {}" "J \ K" "finite J" and A: "\i\J. A i \ G i" + then have A_sets: "\i. i\J \ A i \ events" + using G by auto + have "prob ((\j\J. A j) \ (\k. F k)) = prob (\k. (\i\insert j J. (A(j := F k)) i))" + using `J \ {}` `j \ J` `j \ K` by (auto intro!: arg_cong[where f=prob] split: split_if_asm) + 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))" + proof (rule finite_measure_UNION) + show "disjoint_family (\k. \i\insert j J. (A(j := F k)) i)" + using disj by (rule disjoint_family_on_bisimulation) auto + show "range (\k. \i\insert j J. (A(j := F k)) i) \ events" + using A_sets F `finite J` `J \ {}` `j \ J` by (auto intro!: Int) + qed + moreover { fix k + from J A `j \ K` have "prob (\i\insert j J. (A(j := F k)) i) = prob (F k) * (\i\J. prob (A i))" + by (subst indep_setsD[OF F(2)]) (auto intro!: setprod_cong split: split_if_asm) + also have "\ = prob (F k) * prob (\i\J. A i)" + using J A `j \ K` by (subst indep_setsD[OF G(1)]) auto + finally have "prob (\i\insert j J. (A(j := F k)) i) = prob (F k) * prob (\i\J. A i)" . } + ultimately have "(\k. prob (F k) * prob (\i\J. A i)) sums (prob ((\j\J. A j) \ (\k. F k)))" + by simp + moreover + have "(\k. prob (F k) * prob (\i\J. A i)) sums (prob (\k. F k) * prob (\i\J. A i))" + using disj F(1) by (intro finite_measure_UNION sums_mult2) auto + then have "(\k. prob (F k) * prob (\i\J. A i)) sums (prob (\k. F k) * (\i\J. prob (A i)))" + using J A `j \ K` by (subst indep_setsD[OF G(1), symmetric]) auto + ultimately + show "prob ((\j\J. A j) \ (\k. F k)) = prob (\k. F k) * (\j\J. prob (A j))" + by (auto dest!: sums_unique) + qed (insert F, auto) + qed (insert sets_into_space, auto) + then have mono: "sets (dynkin \space = space M, sets = G j\) \ + sets \space = space M, sets = {E \ events. indep_sets (G(j := {E})) K}\" + proof (rule dynkin_system.dynkin_subset, simp_all, safe) + fix X assume "X \ G j" + then show "X \ events" using G `j \ K` by auto + from `indep_sets G K` + show "indep_sets (G(j := {X})) K" + by (rule indep_sets_mono_sets) (insert `X \ G j`, auto) + qed + have "indep_sets (G(j:=?D)) K" + proof (rule indep_setsI) + fix i assume "i \ K" then show "(G(j := ?D)) i \ events" + using G(2) by auto + next + fix A J assume J: "J\{}" "J \ K" "finite J" and A: "\i\J. A i \ (G(j := ?D)) i" + show "prob (\j\J. A j) = (\j\J. prob (A j))" + proof cases + assume "j \ J" + with A have indep: "indep_sets (G(j := {A j})) K" by auto + from J A show ?thesis + by (intro indep_setsD[OF indep]) auto + next + assume "j \ J" + with J A have "\i\J. A i \ G i" by (auto split: split_if_asm) + with J show ?thesis + by (intro indep_setsD[OF G(1)]) auto + qed + qed + then have "indep_sets (G(j:=sets (dynkin \space = space M, sets = G j\))) K" + by (rule indep_sets_mono_sets) (insert mono, auto) + then show ?case + by (rule indep_sets_mono_sets) (insert `j \ K` `j \ J`, auto simp: G_def) + qed (insert `indep_sets F K`, simp) } + from this[OF `indep_sets F J` `finite J` subset_refl] + show "indep_sets (\i. sets (dynkin \ space = space M, sets = F i \)) J" + by (rule indep_sets_mono_sets) auto +qed + +lemma (in prob_space) indep_sets_sigma: + assumes indep: "indep_sets F I" + assumes stable: "\i. i \ I \ Int_stable \ space = space M, sets = F i \" + shows "indep_sets (\i. sets (sigma \ space = space M, sets = F i \)) I" +proof - + from indep_sets_dynkin[OF indep] + show ?thesis + proof (rule indep_sets_mono_sets, subst sigma_eq_dynkin, simp_all add: stable) + fix i assume "i \ I" + with indep have "F i \ events" by (auto simp: indep_sets_def) + with sets_into_space show "F i \ Pow (space M)" by auto + qed +qed + +lemma (in prob_space) indep_sets_sigma_sets: + assumes "indep_sets F I" + assumes "\i. i \ I \ Int_stable \ space = space M, sets = F i \" + shows "indep_sets (\i. sigma_sets (space M) (F i)) I" + using indep_sets_sigma[OF assms] by (simp add: sets_sigma) + +lemma (in prob_space) indep_sets2_eq: + "indep_sets2 A B \ A \ events \ B \ events \ (\a\A. \b\B. prob (a \ b) = prob a * prob b)" + unfolding indep_sets2_def +proof (intro iffI ballI conjI) + assume indep: "indep_sets (bool_case A B) UNIV" + { fix a b assume "a \ A" "b \ B" + with indep_setsD[OF indep, of UNIV "bool_case a b"] + show "prob (a \ b) = prob a * prob b" + unfolding UNIV_bool by (simp add: ac_simps) } + from indep show "A \ events" "B \ events" + unfolding indep_sets_def UNIV_bool by auto +next + assume *: "A \ events \ B \ events \ (\a\A. \b\B. prob (a \ b) = prob a * prob b)" + show "indep_sets (bool_case A B) UNIV" + proof (rule indep_setsI) + fix i show "(case i of True \ A | False \ B) \ events" + using * by (auto split: bool.split) + next + fix J X assume "J \ {}" "J \ UNIV" and X: "\j\J. X j \ (case j of True \ A | False \ B)" + then have "J = {True} \ J = {False} \ J = {True,False}" + by (auto simp: UNIV_bool) + then show "prob (\j\J. X j) = (\j\J. prob (X j))" + using X * by auto + qed +qed + +lemma (in prob_space) indep_sets2_sigma_sets: + assumes "indep_sets2 A B" + assumes A: "Int_stable \ space = space M, sets = A \" + assumes B: "Int_stable \ space = space M, sets = B \" + shows "indep_sets2 (sigma_sets (space M) A) (sigma_sets (space M) B)" +proof - + have "indep_sets (\i. sigma_sets (space M) (case i of True \ A | False \ B)) UNIV" + proof (rule indep_sets_sigma_sets) + show "indep_sets (bool_case A B) UNIV" + by (rule `indep_sets2 A B`[unfolded indep_sets2_def]) + fix i show "Int_stable \space = space M, sets = case i of True \ A | False \ B\" + using A B by (cases i) auto + qed + then show ?thesis + unfolding indep_sets2_def + by (rule indep_sets_mono_sets) (auto split: bool.split) +qed + +end diff -r b02349e70d5a -r 16375b493b64 src/HOL/Probability/Probability.thy --- a/src/HOL/Probability/Probability.thy Thu May 19 19:58:07 2011 +0200 +++ b/src/HOL/Probability/Probability.thy Tue May 17 11:47:36 2011 +0200 @@ -4,6 +4,7 @@ Lebesgue_Measure Probability_Measure Infinite_Product_Measure + Independent_Family Information "ex/Dining_Cryptographers" "ex/Koepf_Duermuth_Countermeasure"