# HG changeset patch # User hoelzl # Date 1437036500 -7200 # Node ID 53697011b03af96595ce90c13d2b42433ba03d70 # Parent 6d500a224cbe941068bfb92e501dd5ee4f709689 move disjoint sets to their own theory diff -r 6d500a224cbe -r 53697011b03a src/HOL/Library/Disjoint_Sets.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Library/Disjoint_Sets.thy Thu Jul 16 10:48:20 2015 +0200 @@ -0,0 +1,156 @@ +(* Title: HOL/Library/Disjoint_Sets.thy + Author: Johannes Hölzl, TU München +*) + +section \Handling Disjoint Sets\ + +theory Disjoint_Sets + imports Main +begin + +lemma range_subsetD: "range f \ B \ f i \ B" + by blast + +lemma Int_Diff_disjoint: "A \ B \ (A - B) = {}" + by blast + +lemma Int_Diff_Un: "A \ B \ (A - B) = A" + by blast + +lemma mono_Un: "mono A \ (\i\n. A i) = A n" + unfolding mono_def by auto + +subsection \Set of Disjoint Sets\ + +definition "disjoint A \ (\a\A. \b\A. a \ b \ a \ b = {})" + +lemma disjointI: + "(\a b. a \ A \ b \ A \ a \ b \ a \ b = {}) \ disjoint A" + unfolding disjoint_def by auto + +lemma disjointD: + "disjoint A \ a \ A \ b \ A \ a \ b \ a \ b = {}" + unfolding disjoint_def by auto + +lemma disjoint_empty[iff]: "disjoint {}" + by (auto simp: disjoint_def) + +lemma disjoint_INT: + assumes *: "\i. i \ I \ disjoint (F i)" + shows "disjoint {\i\I. X i | X. \i\I. X i \ F i}" +proof (safe intro!: disjointI del: equalityI) + fix A B :: "'a \ 'b set" assume "(\i\I. A i) \ (\i\I. B i)" + then obtain i where "A i \ B i" "i \ I" + by auto + moreover assume "\i\I. A i \ F i" "\i\I. B i \ F i" + ultimately show "(\i\I. A i) \ (\i\I. B i) = {}" + using *[OF \i\I\, THEN disjointD, of "A i" "B i"] + by (auto simp: INT_Int_distrib[symmetric]) +qed + +lemma disjoint_singleton[simp]: "disjoint {A}" + by(simp add: disjoint_def) + +subsubsection "Family of Disjoint Sets" + +definition disjoint_family_on :: "('i \ 'a set) \ 'i set \ bool" where + "disjoint_family_on A S \ (\m\S. \n\S. m \ n \ A m \ A n = {})" + +abbreviation "disjoint_family A \ disjoint_family_on A UNIV" + +lemma disjoint_family_onD: + "disjoint_family_on A I \ i \ I \ j \ I \ i \ j \ A i \ A j = {}" + by (auto simp: disjoint_family_on_def) + +lemma disjoint_family_subset: "disjoint_family A \ (\x. B x \ A x) \ disjoint_family B" + by (force simp add: disjoint_family_on_def) + +lemma disjoint_family_on_bisimulation: + assumes "disjoint_family_on f S" + and "\n m. n \ S \ m \ S \ n \ m \ f n \ f m = {} \ g n \ g m = {}" + shows "disjoint_family_on g S" + using assms unfolding disjoint_family_on_def by auto + +lemma disjoint_family_on_mono: + "A \ B \ disjoint_family_on f B \ disjoint_family_on f A" + unfolding disjoint_family_on_def by auto + +lemma disjoint_family_Suc: + "(\n. A n \ A (Suc n)) \ disjoint_family (\i. A (Suc i) - A i)" + using lift_Suc_mono_le[of A] + by (auto simp add: disjoint_family_on_def) + (metis insert_absorb insert_subset le_SucE le_antisym not_leE less_imp_le) + +lemma disjoint_family_on_disjoint_image: + "disjoint_family_on A I \ disjoint (A ` I)" + unfolding disjoint_family_on_def disjoint_def by force + +lemma disjoint_family_on_vimageI: "disjoint_family_on F I \ disjoint_family_on (\i. f -` F i) I" + by (auto simp: disjoint_family_on_def) + +lemma disjoint_image_disjoint_family_on: + assumes d: "disjoint (A ` I)" and i: "inj_on A I" + shows "disjoint_family_on A I" + unfolding disjoint_family_on_def +proof (intro ballI impI) + fix n m assume nm: "m \ I" "n \ I" and "n \ m" + with i[THEN inj_onD, of n m] show "A n \ A m = {}" + by (intro disjointD[OF d]) auto +qed + +lemma disjoint_UN: + assumes F: "\i. i \ I \ disjoint (F i)" and *: "disjoint_family_on (\i. \F i) I" + shows "disjoint (\i\I. F i)" +proof (safe intro!: disjointI del: equalityI) + fix A B i j assume "A \ B" "A \ F i" "i \ I" "B \ F j" "j \ I" + show "A \ B = {}" + proof cases + assume "i = j" with F[of i] \i \ I\ \A \ F i\ \B \ F j\ \A \ B\ show "A \ B = {}" + by (auto dest: disjointD) + next + assume "i \ j" + with * \i\I\ \j\I\ have "(\F i) \ (\F j) = {}" + by (rule disjoint_family_onD) + with \A\F i\ \i\I\ \B\F j\ \j\I\ + show "A \ B = {}" + by auto + qed +qed + +lemma disjoint_union: "disjoint C \ disjoint B \ \C \ \B = {} \ disjoint (C \ B)" + using disjoint_UN[of "{C, B}" "\x. x"] by (auto simp add: disjoint_family_on_def) + +subsection \Construct Disjoint Sequences\ + +definition disjointed :: "(nat \ 'a set) \ nat \ 'a set" where + "disjointed A n = A n - (\i\{0..i\{0..i\{0..i. disjointed A i) = (\i. A i)" + by (rule UN_finite2_eq [where k=0]) + (simp add: finite_UN_disjointed_eq) + +lemma less_disjoint_disjointed: "m < n \ disjointed A m \ disjointed A n = {}" + by (auto simp add: disjointed_def) + +lemma disjoint_family_disjointed: "disjoint_family (disjointed A)" + by (simp add: disjoint_family_on_def) + (metis neq_iff Int_commute less_disjoint_disjointed) + +lemma disjointed_subset: "disjointed A n \ A n" + by (auto simp add: disjointed_def) + +lemma disjointed_0[simp]: "disjointed A 0 = A 0" + by (simp add: disjointed_def) + +lemma disjointed_mono: "mono A \ disjointed A (Suc n) = A (Suc n) - A n" + using mono_Un[of A] by (simp add: disjointed_def atLeastLessThanSuc_atLeastAtMost atLeast0AtMost) + +end \ No newline at end of file diff -r 6d500a224cbe -r 53697011b03a src/HOL/Library/Library.thy --- a/src/HOL/Library/Library.thy Wed Jul 15 11:25:51 2015 +0200 +++ b/src/HOL/Library/Library.thy Thu Jul 16 10:48:20 2015 +0200 @@ -14,6 +14,7 @@ Countable_Set_Type Debug Diagonal_Subsequence + Disjoint_Sets Dlist Extended Extended_Nat diff -r 6d500a224cbe -r 53697011b03a src/HOL/Probability/Binary_Product_Measure.thy --- a/src/HOL/Probability/Binary_Product_Measure.thy Wed Jul 15 11:25:51 2015 +0200 +++ b/src/HOL/Probability/Binary_Product_Measure.thy Thu Jul 16 10:48:20 2015 +0200 @@ -201,9 +201,6 @@ unfolding Int_stable_def by safe (auto simp add: times_Int_times) -lemma disjoint_family_vimageI: "disjoint_family F \ disjoint_family (\i. f -` F i)" - by (auto simp: disjoint_family_on_def) - lemma (in finite_measure) finite_measure_cut_measurable: assumes [measurable]: "Q \ sets (N \\<^sub>M M)" shows "(\x. emeasure M (Pair x -` Q)) \ borel_measurable N" @@ -221,7 +218,7 @@ next case (union F) then have "\x. emeasure M (Pair x -` (\i. F i)) = (\i. ?s (F i) x)" - by (simp add: suminf_emeasure disjoint_family_vimageI subset_eq vimage_UN sets_pair_measure[symmetric]) + by (simp add: suminf_emeasure disjoint_family_on_vimageI subset_eq vimage_UN sets_pair_measure[symmetric]) with union show ?case unfolding sets_pair_measure[symmetric] by simp qed (auto simp add: if_distrib Int_def[symmetric] intro!: measurable_If) diff -r 6d500a224cbe -r 53697011b03a src/HOL/Probability/Measure_Space.thy --- a/src/HOL/Probability/Measure_Space.thy Wed Jul 15 11:25:51 2015 +0200 +++ b/src/HOL/Probability/Measure_Space.thy Thu Jul 16 10:48:20 2015 +0200 @@ -41,6 +41,19 @@ show ?thesis using * by simp qed simp +lemma setsum_indicator_disjoint_family: + fixes f :: "'d \ 'e::semiring_1" + assumes d: "disjoint_family_on A P" and "x \ A j" and "finite P" and "j \ P" + shows "(\i\P. f i * indicator (A i) x) = f j" +proof - + have "P \ {i. x \ A i} = {j}" + using d `x \ A j` `j \ P` unfolding disjoint_family_on_def + by auto + thus ?thesis + unfolding indicator_def + by (simp add: if_distrib setsum.If_cases[OF `finite P`]) +qed + text {* The type for emeasure spaces is already defined in @{theory Sigma_Algebra}, as it is also used to represent sigma algebras (with an arbitrary emeasure). @@ -119,9 +132,9 @@ then have "(\i\Suc n. f (disjointed A i)) = f (A n) + f (disjointed A (Suc n))" by simp also have "\ = f (A n \ disjointed A (Suc n))" - using A by (subst f(2)[THEN additiveD]) (auto simp: disjointed_incseq) + using A by (subst f(2)[THEN additiveD]) (auto simp: disjointed_mono) also have "A n \ disjointed A (Suc n) = A (Suc n)" - using `incseq A` by (auto dest: incseq_SucD simp: disjointed_incseq) + using `incseq A` by (auto dest: incseq_SucD simp: disjointed_mono) finally show ?case . qed simp diff -r 6d500a224cbe -r 53697011b03a src/HOL/Probability/Sigma_Algebra.thy --- a/src/HOL/Probability/Sigma_Algebra.thy Wed Jul 15 11:25:51 2015 +0200 +++ b/src/HOL/Probability/Sigma_Algebra.thy Thu Jul 16 10:48:20 2015 +0200 @@ -14,6 +14,7 @@ "~~/src/HOL/Library/FuncSet" "~~/src/HOL/Library/Indicator_Function" "~~/src/HOL/Library/Extended_Real" + "~~/src/HOL/Library/Disjoint_Sets" begin text {* Sigma algebras are an elementary concept in measure @@ -35,46 +36,6 @@ subsubsection {* Semiring of sets *} -definition "disjoint A \ (\a\A. \b\A. a \ b \ a \ b = {})" - -lemma disjointI: - "(\a b. a \ A \ b \ A \ a \ b \ a \ b = {}) \ disjoint A" - unfolding disjoint_def by auto - -lemma disjointD: - "disjoint A \ a \ A \ b \ A \ a \ b \ a \ b = {}" - unfolding disjoint_def by auto - -lemma disjoint_empty[iff]: "disjoint {}" - by (auto simp: disjoint_def) - -lemma disjoint_union: - assumes C: "disjoint C" and B: "disjoint B" and disj: "\C \ \B = {}" - shows "disjoint (C \ B)" -proof (rule disjointI) - fix c d assume sets: "c \ C \ B" "d \ C \ B" and "c \ d" - show "c \ d = {}" - proof cases - assume "(c \ C \ d \ C) \ (c \ B \ d \ B)" - then show ?thesis - proof - assume "c \ C \ d \ C" with `c \ d` C show "c \ d = {}" - by (auto simp: disjoint_def) - next - assume "c \ B \ d \ B" with `c \ d` B show "c \ d = {}" - by (auto simp: disjoint_def) - qed - next - assume "\ ((c \ C \ d \ C) \ (c \ B \ d \ B))" - with sets have "(c \ \C \ d \ \B) \ (c \ \B \ d \ \C)" - by auto - with disj show "c \ d = {}" by auto - qed -qed - -lemma disjoint_singleton [simp]: "disjoint {A}" -by(simp add: disjoint_def) - locale semiring_of_sets = subset_class + assumes empty_sets[iff]: "{} \ M" assumes Int[intro]: "\a b. a \ M \ b \ M \ a \ b \ M" @@ -787,101 +748,6 @@ qed qed -subsubsection "Disjoint families" - -definition - disjoint_family_on where - "disjoint_family_on A S \ (\m\S. \n\S. m \ n \ A m \ A n = {})" - -abbreviation - "disjoint_family A \ disjoint_family_on A UNIV" - -lemma range_subsetD: "range f \ B \ f i \ B" - by blast - -lemma disjoint_family_onD: "disjoint_family_on A I \ i \ I \ j \ I \ i \ j \ A i \ A j = {}" - by (auto simp: disjoint_family_on_def) - -lemma Int_Diff_disjoint: "A \ B \ (A - B) = {}" - by blast - -lemma Int_Diff_Un: "A \ B \ (A - B) = A" - by blast - -lemma disjoint_family_subset: - "disjoint_family A \ (!!x. B x \ A x) \ disjoint_family B" - by (force simp add: disjoint_family_on_def) - -lemma disjoint_family_on_bisimulation: - assumes "disjoint_family_on f S" - and "\n m. n \ S \ m \ S \ n \ m \ f n \ f m = {} \ g n \ g m = {}" - shows "disjoint_family_on g S" - using assms unfolding disjoint_family_on_def by auto - -lemma disjoint_family_on_mono: - "A \ B \ disjoint_family_on f B \ disjoint_family_on f A" - unfolding disjoint_family_on_def by auto - -lemma disjoint_family_Suc: - assumes Suc: "!!n. A n \ A (Suc n)" - shows "disjoint_family (\i. A (Suc i) - A i)" -proof - - { - fix m - have "!!n. A n \ A (m+n)" - proof (induct m) - case 0 show ?case by simp - next - case (Suc m) thus ?case - by (metis Suc_eq_plus1 assms add.commute add.left_commute subset_trans) - qed - } - hence "!!m n. m < n \ A m \ A n" - by (metis add.commute le_add_diff_inverse nat_less_le) - thus ?thesis - by (auto simp add: disjoint_family_on_def) - (metis insert_absorb insert_subset le_SucE le_antisym not_leE) -qed - -lemma setsum_indicator_disjoint_family: - fixes f :: "'d \ 'e::semiring_1" - assumes d: "disjoint_family_on A P" and "x \ A j" and "finite P" and "j \ P" - shows "(\i\P. f i * indicator (A i) x) = f j" -proof - - have "P \ {i. x \ A i} = {j}" - using d `x \ A j` `j \ P` unfolding disjoint_family_on_def - by auto - thus ?thesis - unfolding indicator_def - by (simp add: if_distrib setsum.If_cases[OF `finite P`]) -qed - -definition disjointed :: "(nat \ 'a set) \ nat \ 'a set " - where "disjointed A n = A n - (\i\{0..i\{0..i\{0..i. disjointed A i) = (\i. A i)" - apply (rule UN_finite2_eq [where k=0]) - apply (simp add: finite_UN_disjointed_eq) - done - -lemma less_disjoint_disjointed: "m disjointed A m \ disjointed A n = {}" - by (auto simp add: disjointed_def) - -lemma disjoint_family_disjointed: "disjoint_family (disjointed A)" - by (simp add: disjoint_family_on_def) - (metis neq_iff Int_commute less_disjoint_disjointed) - -lemma disjointed_subset: "disjointed A n \ A n" - by (auto simp add: disjointed_def) - lemma (in ring_of_sets) UNION_in_sets: fixes A:: "nat \ 'a set" assumes A: "range A \ M" @@ -907,18 +773,6 @@ "range A \ M \ range (disjointed A) \ M" using range_disjointed_sets . -lemma disjointed_0[simp]: "disjointed A 0 = A 0" - by (simp add: disjointed_def) - -lemma incseq_Un: - "incseq A \ (\i\n. A i) = A n" - unfolding incseq_def by auto - -lemma disjointed_incseq: - "incseq A \ disjointed A (Suc n) = A (Suc n) - A n" - using incseq_Un[of A] - by (simp add: disjointed_def atLeastLessThanSuc_atLeastAtMost atLeast0AtMost) - lemma sigma_algebra_disjoint_iff: "sigma_algebra \ M \ algebra \ M \ (\A. range A \ M \ disjoint_family A \ (\i::nat. A i) \ M)" @@ -935,20 +789,6 @@ thus "(\i::nat. A i) \ M" by (simp add: UN_disjointed_eq) qed -lemma disjoint_family_on_disjoint_image: - "disjoint_family_on A I \ disjoint (A ` I)" - unfolding disjoint_family_on_def disjoint_def by force - -lemma disjoint_image_disjoint_family_on: - assumes d: "disjoint (A ` I)" and i: "inj_on A I" - shows "disjoint_family_on A I" - unfolding disjoint_family_on_def -proof (intro ballI impI) - fix n m assume nm: "m \ I" "n \ I" and "n \ m" - with i[THEN inj_onD, of n m] show "A n \ A m = {}" - by (intro disjointD[OF d]) auto -qed - subsubsection {* Ring generated by a semiring *} definition (in semiring_of_sets)