# HG changeset patch # User nipkow # Date 1352485307 -3600 # Node ID 20bacff859842e3ae480ae1bca9425958861f5f6 # Parent 6fe18351e9ddfe83f19cf19653cc605363655f52# Parent e8af1889606092521e1bdb7136699fe718b43b9a merged diff -r e8af18896060 -r 20bacff85984 NEWS --- a/NEWS Fri Nov 09 19:16:31 2012 +0100 +++ b/NEWS Fri Nov 09 19:21:47 2012 +0100 @@ -207,6 +207,9 @@ * Simproc "finite_Collect" rewrites set comprehensions into pointfree expressions. +* Preprocessing of the code generator rewrites set comprehensions into +pointfree expressions. + * Quickcheck: - added an optimisation for equality premises. diff -r e8af18896060 -r 20bacff85984 src/HOL/Algebra/Divisibility.thy --- a/src/HOL/Algebra/Divisibility.thy Fri Nov 09 19:16:31 2012 +0100 +++ b/src/HOL/Algebra/Divisibility.thy Fri Nov 09 19:21:47 2012 +0100 @@ -244,7 +244,7 @@ apply (elim dividesE, intro dividesI, assumption) apply (rule l_cancel[of c]) apply (simp add: m_assoc carr)+ -apply (fast intro: divides_mult_lI carr) +apply (fast intro: carr) done lemma (in comm_monoid) divides_mult_rI [intro]: diff -r e8af18896060 -r 20bacff85984 src/HOL/Library/Permutation.thy --- a/src/HOL/Library/Permutation.thy Fri Nov 09 19:16:31 2012 +0100 +++ b/src/HOL/Library/Permutation.thy Fri Nov 09 19:21:47 2012 +0100 @@ -193,7 +193,7 @@ show ?case proof (intro exI[of _ "Fun.swap 0 1 id"] conjI allI impI) show "bij_betw (Fun.swap 0 1 id) {.. \ p dvd n ==> gcd p n = 1" apply (auto simp add: prime_def) - apply (metis One_nat_def gcd_dvd1 gcd_dvd2) + apply (metis gcd_dvd1 gcd_dvd2) done text {* diff -r e8af18896060 -r 20bacff85984 src/HOL/Probability/Finite_Product_Measure.thy --- a/src/HOL/Probability/Finite_Product_Measure.thy Fri Nov 09 19:16:31 2012 +0100 +++ b/src/HOL/Probability/Finite_Product_Measure.thy Fri Nov 09 19:21:47 2012 +0100 @@ -43,6 +43,15 @@ "extensional I \ extensional I' = extensional (I \ I')" unfolding extensional_def by auto +lemma extensional_UNIV[simp]: "extensional UNIV = UNIV" + by (auto simp: extensional_def) + +lemma restrict_extensional_sub[intro]: "A \ B \ restrict f A \ extensional B" + unfolding restrict_def extensional_def by auto + +lemma restrict_restrict[simp]: "restrict (restrict f A) B = restrict f (A \ B)" + unfolding restrict_def by (simp add: fun_eq_iff) + definition "merge I J = (\(x, y) i. if i \ I then x i else if i \ J then y i else undefined)" @@ -85,6 +94,33 @@ "J \ I = {} \ restrict (merge I J (x, y)) J = restrict y J" by (auto simp: restrict_def) +lemma split_merge: "P (merge I J (x,y) i) \ (i \ I \ P (x i)) \ (i \ J - I \ P (y i)) \ (i \ I \ J \ P undefined)" + unfolding merge_def by auto + +lemma extensional_merge_sub: "I \ J \ K \ merge I J (x, y) \ extensional K" + unfolding merge_def extensional_def by auto + +lemma injective_vimage_restrict: + assumes J: "J \ I" + and sets: "A \ (\\<^isub>E i\J. S i)" "B \ (\\<^isub>E i\J. S i)" and ne: "(\\<^isub>E i\I. S i) \ {}" + and eq: "(\x. restrict x J) -` A \ (\\<^isub>E i\I. S i) = (\x. restrict x J) -` B \ (\\<^isub>E i\I. S i)" + shows "A = B" +proof (intro set_eqI) + fix x + from ne obtain y where y: "\i. i \ I \ y i \ S i" by auto + have "J \ (I - J) = {}" by auto + show "x \ A \ x \ B" + proof cases + assume x: "x \ (\\<^isub>E i\J. S i)" + have "x \ A \ merge J (I - J) (x,y) \ (\x. restrict x J) -` A \ (\\<^isub>E i\I. S i)" + using y x `J \ I` by (auto simp add: Pi_iff extensional_restrict extensional_merge_sub split: split_merge) + then show "x \ A \ x \ B" + using y x `J \ I` by (auto simp add: Pi_iff extensional_restrict extensional_merge_sub eq split: split_merge) + next + assume "x \ (\\<^isub>E i\J. S i)" with sets show "x \ A \ x \ B" by auto + qed +qed + lemma extensional_insert_undefined[intro, simp]: assumes "a \ extensional (insert i I)" shows "a(i := undefined) \ extensional I" @@ -253,6 +289,24 @@ lemma prod_emb_PiE_same_index[simp]: "(\i. i \ I \ E i \ space (M i)) \ prod_emb I M I (Pi\<^isub>E I E) = Pi\<^isub>E I E" by (auto simp: prod_emb_def Pi_iff) +lemma prod_emb_trans[simp]: + "J \ K \ K \ L \ prod_emb L M K (prod_emb K M J X) = prod_emb L M J X" + by (auto simp add: Int_absorb1 prod_emb_def) + +lemma prod_emb_Pi: + assumes "X \ (\ j\J. sets (M j))" "J \ K" + shows "prod_emb K M J (Pi\<^isub>E J X) = (\\<^isub>E i\K. if i \ J then X i else space (M i))" + using assms space_closed + by (auto simp: prod_emb_def Pi_iff split: split_if_asm) blast+ + +lemma prod_emb_id: + "B \ (\\<^isub>E i\L. space (M i)) \ prod_emb L M L B = B" + by (auto simp: prod_emb_def Pi_iff subset_eq extensional_restrict) + +lemma prod_emb_mono: + "F \ G \ prod_emb A M B F \ prod_emb A M B G" + by (auto simp: prod_emb_def) + definition PiM :: "'i set \ ('i \ 'a measure) \ ('i \ 'a) measure" where "PiM I M = extend_measure (\\<^isub>E i\I. space (M i)) {(J, X). (J \ {} \ I = {}) \ finite J \ J \ I \ X \ (\ j\J. sets (M j))} @@ -309,6 +363,17 @@ \ prod_emb I M J (PIE j:J. E j) \ prod_algebra I M" by (auto simp: prod_algebra_def Pi_iff) +lemma prod_algebraI_finite: + "finite I \ (\i\I. E i \ sets (M i)) \ (Pi\<^isub>E I E) \ prod_algebra I M" + using prod_algebraI[of I I E M] prod_emb_PiE_same_index[of I E M, OF sets_into_space] by simp + +lemma Int_stable_PiE: "Int_stable {Pi\<^isub>E J E | E. \i\I. E i \ sets (M i)}" +proof (safe intro!: Int_stableI) + fix E F assume "\i\I. E i \ sets (M i)" "\i\I. F i \ sets (M i)" + then show "\G. Pi\<^isub>E J E \ Pi\<^isub>E J F = Pi\<^isub>E J G \ (\i\I. G i \ sets (M i))" + by (auto intro!: exI[of _ "\i. E i \ F i"]) +qed + lemma prod_algebraE: assumes A: "A \ prod_algebra I M" obtains J E where "A = prod_emb I M J (PIE j:J. E j)" @@ -546,6 +611,14 @@ using A X by (auto intro!: measurable_sets) qed (insert X, auto dest: measurable_space) +lemma measurable_restrict_subset: "J \ L \ (\f. restrict f J) \ measurable (Pi\<^isub>M L M) (Pi\<^isub>M J M)" + by (intro measurable_restrict measurable_component_singleton) auto + +lemma measurable_prod_emb[intro, simp]: + "J \ L \ X \ sets (Pi\<^isub>M J M) \ prod_emb L M J X \ sets (Pi\<^isub>M L M)" + unfolding prod_emb_def space_PiM[symmetric] + by (auto intro!: measurable_sets measurable_restrict measurable_component_singleton) + lemma sets_in_Pi_aux: "finite I \ (\j. j \ I \ {x\space (M j). x \ F j} \ sets (M j)) \ {x\space (PiM I M). x \ Pi I F} \ sets (PiM I M)" diff -r e8af18896060 -r 20bacff85984 src/HOL/Probability/Infinite_Product_Measure.thy --- a/src/HOL/Probability/Infinite_Product_Measure.thy Fri Nov 09 19:16:31 2012 +0100 +++ b/src/HOL/Probability/Infinite_Product_Measure.thy Fri Nov 09 19:21:47 2012 +0100 @@ -5,78 +5,9 @@ header {*Infinite Product Measure*} theory Infinite_Product_Measure - imports Probability_Measure Caratheodory + imports Probability_Measure Caratheodory Projective_Family begin -lemma extensional_UNIV[simp]: "extensional UNIV = UNIV" - by (auto simp: extensional_def) - -lemma restrict_extensional_sub[intro]: "A \ B \ restrict f A \ extensional B" - unfolding restrict_def extensional_def by auto - -lemma restrict_restrict[simp]: "restrict (restrict f A) B = restrict f (A \ B)" - unfolding restrict_def by (simp add: fun_eq_iff) - -lemma split_merge: "P (merge I J (x,y) i) \ (i \ I \ P (x i)) \ (i \ J - I \ P (y i)) \ (i \ I \ J \ P undefined)" - unfolding merge_def by auto - -lemma extensional_merge_sub: "I \ J \ K \ merge I J (x, y) \ extensional K" - unfolding merge_def extensional_def by auto - -lemma injective_vimage_restrict: - assumes J: "J \ I" - and sets: "A \ (\\<^isub>E i\J. S i)" "B \ (\\<^isub>E i\J. S i)" and ne: "(\\<^isub>E i\I. S i) \ {}" - and eq: "(\x. restrict x J) -` A \ (\\<^isub>E i\I. S i) = (\x. restrict x J) -` B \ (\\<^isub>E i\I. S i)" - shows "A = B" -proof (intro set_eqI) - fix x - from ne obtain y where y: "\i. i \ I \ y i \ S i" by auto - have "J \ (I - J) = {}" by auto - show "x \ A \ x \ B" - proof cases - assume x: "x \ (\\<^isub>E i\J. S i)" - have "x \ A \ merge J (I - J) (x,y) \ (\x. restrict x J) -` A \ (\\<^isub>E i\I. S i)" - using y x `J \ I` by (auto simp add: Pi_iff extensional_restrict extensional_merge_sub split: split_merge) - then show "x \ A \ x \ B" - using y x `J \ I` by (auto simp add: Pi_iff extensional_restrict extensional_merge_sub eq split: split_merge) - next - assume "x \ (\\<^isub>E i\J. S i)" with sets show "x \ A \ x \ B" by auto - qed -qed - -lemma prod_algebraI_finite: - "finite I \ (\i\I. E i \ sets (M i)) \ (Pi\<^isub>E I E) \ prod_algebra I M" - using prod_algebraI[of I I E M] prod_emb_PiE_same_index[of I E M, OF sets_into_space] by simp - -lemma Int_stable_PiE: "Int_stable {Pi\<^isub>E J E | E. \i\I. E i \ sets (M i)}" -proof (safe intro!: Int_stableI) - fix E F assume "\i\I. E i \ sets (M i)" "\i\I. F i \ sets (M i)" - then show "\G. Pi\<^isub>E J E \ Pi\<^isub>E J F = Pi\<^isub>E J G \ (\i\I. G i \ sets (M i))" - by (auto intro!: exI[of _ "\i. E i \ F i"]) -qed - -lemma prod_emb_trans[simp]: - "J \ K \ K \ L \ prod_emb L M K (prod_emb K M J X) = prod_emb L M J X" - by (auto simp add: Int_absorb1 prod_emb_def) - -lemma prod_emb_Pi: - assumes "X \ (\ j\J. sets (M j))" "J \ K" - shows "prod_emb K M J (Pi\<^isub>E J X) = (\\<^isub>E i\K. if i \ J then X i else space (M i))" - using assms space_closed - by (auto simp: prod_emb_def Pi_iff split: split_if_asm) blast+ - -lemma prod_emb_id: - "B \ (\\<^isub>E i\L. space (M i)) \ prod_emb L M L B = B" - by (auto simp: prod_emb_def Pi_iff subset_eq extensional_restrict) - -lemma measurable_prod_emb[intro, simp]: - "J \ L \ X \ sets (Pi\<^isub>M J M) \ prod_emb L M J X \ sets (Pi\<^isub>M L M)" - unfolding prod_emb_def space_PiM[symmetric] - by (auto intro!: measurable_sets measurable_restrict measurable_component_singleton) - -lemma measurable_restrict_subset: "J \ L \ (\f. restrict f J) \ measurable (Pi\<^isub>M L M) (Pi\<^isub>M J M)" - by (intro measurable_restrict measurable_component_singleton) auto - lemma (in product_prob_space) distr_restrict: assumes "J \ {}" "J \ K" "finite K" shows "(\\<^isub>M i\J. M i) = distr (\\<^isub>M i\K. M i) (\\<^isub>M i\J. M i) (\f. restrict f J)" (is "?P = ?D") @@ -118,200 +49,27 @@ by (auto intro!: measurable_restrict_subset simp: space_PiM) qed -abbreviation (in product_prob_space) - "emb L K X \ prod_emb L M K X" - lemma (in product_prob_space) emeasure_prod_emb[simp]: assumes L: "J \ {}" "J \ L" "finite L" and X: "X \ sets (Pi\<^isub>M J M)" - shows "emeasure (Pi\<^isub>M L M) (emb L J X) = emeasure (Pi\<^isub>M J M) X" + shows "emeasure (Pi\<^isub>M L M) (prod_emb L M J X) = emeasure (Pi\<^isub>M J M) X" by (subst distr_restrict[OF L]) (simp add: prod_emb_def space_PiM emeasure_distr measurable_restrict_subset L X) -lemma (in product_prob_space) prod_emb_injective: - assumes "J \ {}" "J \ L" "finite J" and sets: "X \ sets (Pi\<^isub>M J M)" "Y \ sets (Pi\<^isub>M J M)" - assumes "prod_emb L M J X = prod_emb L M J Y" - shows "X = Y" -proof (rule injective_vimage_restrict) - show "X \ (\\<^isub>E i\J. space (M i))" "Y \ (\\<^isub>E i\J. space (M i))" - using sets[THEN sets_into_space] by (auto simp: space_PiM) - have "\i\L. \x. x \ space (M i)" - using M.not_empty by auto - from bchoice[OF this] - show "(\\<^isub>E i\L. space (M i)) \ {}" by auto - show "(\x. restrict x J) -` X \ (\\<^isub>E i\L. space (M i)) = (\x. restrict x J) -` Y \ (\\<^isub>E i\L. space (M i))" - using `prod_emb L M J X = prod_emb L M J Y` by (simp add: prod_emb_def) -qed fact - -definition (in product_prob_space) generator :: "('i \ 'a) set set" where - "generator = (\J\{J. J \ {} \ finite J \ J \ I}. emb I J ` sets (Pi\<^isub>M J M))" - -lemma (in product_prob_space) generatorI': - "J \ {} \ finite J \ J \ I \ X \ sets (Pi\<^isub>M J M) \ emb I J X \ generator" - unfolding generator_def by auto - -lemma (in product_prob_space) algebra_generator: - assumes "I \ {}" shows "algebra (\\<^isub>E i\I. space (M i)) generator" (is "algebra ?\ ?G") - unfolding algebra_def algebra_axioms_def ring_of_sets_iff -proof (intro conjI ballI) - let ?G = generator - show "?G \ Pow ?\" - by (auto simp: generator_def prod_emb_def) - from `I \ {}` obtain i where "i \ I" by auto - then show "{} \ ?G" - by (auto intro!: exI[of _ "{i}"] image_eqI[where x="\i. {}"] - simp: sigma_sets.Empty generator_def prod_emb_def) - from `i \ I` show "?\ \ ?G" - by (auto intro!: exI[of _ "{i}"] image_eqI[where x="Pi\<^isub>E {i} (\i. space (M i))"] - simp: generator_def prod_emb_def) - fix A assume "A \ ?G" - then obtain JA XA where XA: "JA \ {}" "finite JA" "JA \ I" "XA \ sets (Pi\<^isub>M JA M)" and A: "A = emb I JA XA" - by (auto simp: generator_def) - fix B assume "B \ ?G" - then obtain JB XB where XB: "JB \ {}" "finite JB" "JB \ I" "XB \ sets (Pi\<^isub>M JB M)" and B: "B = emb I JB XB" - by (auto simp: generator_def) - let ?RA = "emb (JA \ JB) JA XA" - let ?RB = "emb (JA \ JB) JB XB" - have *: "A - B = emb I (JA \ JB) (?RA - ?RB)" "A \ B = emb I (JA \ JB) (?RA \ ?RB)" - using XA A XB B by auto - show "A - B \ ?G" "A \ B \ ?G" - unfolding * using XA XB by (safe intro!: generatorI') auto -qed - -lemma (in product_prob_space) sets_PiM_generator: - "sets (PiM I M) = sigma_sets (\\<^isub>E i\I. space (M i)) generator" -proof cases - assume "I = {}" then show ?thesis - unfolding generator_def - by (auto simp: sets_PiM_empty sigma_sets_empty_eq cong: conj_cong) -next - assume "I \ {}" - show ?thesis - proof - show "sets (Pi\<^isub>M I M) \ sigma_sets (\\<^isub>E i\I. space (M i)) generator" - unfolding sets_PiM - proof (safe intro!: sigma_sets_subseteq) - fix A assume "A \ prod_algebra I M" with `I \ {}` show "A \ generator" - by (auto intro!: generatorI' sets_PiM_I_finite elim!: prod_algebraE) - qed - qed (auto simp: generator_def space_PiM[symmetric] intro!: sigma_sets_subset) -qed - - -lemma (in product_prob_space) generatorI: - "J \ {} \ finite J \ J \ I \ X \ sets (Pi\<^isub>M J M) \ A = emb I J X \ A \ generator" - unfolding generator_def by auto - -definition (in product_prob_space) - "\G A = - (THE x. \J. J \ {} \ finite J \ J \ I \ (\X\sets (Pi\<^isub>M J M). A = emb I J X \ x = emeasure (Pi\<^isub>M J M) X))" - -lemma (in product_prob_space) \G_spec: - assumes J: "J \ {}" "finite J" "J \ I" "A = emb I J X" "X \ sets (Pi\<^isub>M J M)" - shows "\G A = emeasure (Pi\<^isub>M J M) X" - unfolding \G_def -proof (intro the_equality allI impI ballI) - fix K Y assume K: "K \ {}" "finite K" "K \ I" "A = emb I K Y" "Y \ sets (Pi\<^isub>M K M)" - have "emeasure (Pi\<^isub>M K M) Y = emeasure (Pi\<^isub>M (K \ J) M) (emb (K \ J) K Y)" - using K J by simp - also have "emb (K \ J) K Y = emb (K \ J) J X" - using K J by (simp add: prod_emb_injective[of "K \ J" I]) - also have "emeasure (Pi\<^isub>M (K \ J) M) (emb (K \ J) J X) = emeasure (Pi\<^isub>M J M) X" - using K J by simp - finally show "emeasure (Pi\<^isub>M J M) X = emeasure (Pi\<^isub>M K M) Y" .. -qed (insert J, force) +sublocale product_prob_space \ projective_family I "\J. PiM J M" M +proof + fix J::"'i set" assume "finite J" + interpret f: finite_product_prob_space M J proof qed fact + show "emeasure (Pi\<^isub>M J M) (space (Pi\<^isub>M J M)) \ \" by simp + show "\A. range A \ sets (Pi\<^isub>M J M) \ + (\i. A i) = space (Pi\<^isub>M J M) \ + (\i. emeasure (Pi\<^isub>M J M) (A i) \ \)" using sigma_finite[OF `finite J`] + by (auto simp add: sigma_finite_measure_def) + show "emeasure (Pi\<^isub>M J M) (space (Pi\<^isub>M J M)) = 1" by (rule f.emeasure_space_1) +qed simp_all -lemma (in product_prob_space) \G_eq: - "J \ {} \ finite J \ J \ I \ X \ sets (Pi\<^isub>M J M) \ \G (emb I J X) = emeasure (Pi\<^isub>M J M) X" - by (intro \G_spec) auto - -lemma (in product_prob_space) generator_Ex: - assumes *: "A \ generator" - shows "\J X. J \ {} \ finite J \ J \ I \ X \ sets (Pi\<^isub>M J M) \ A = emb I J X \ \G A = emeasure (Pi\<^isub>M J M) X" -proof - - from * obtain J X where J: "J \ {}" "finite J" "J \ I" "A = emb I J X" "X \ sets (Pi\<^isub>M J M)" - unfolding generator_def by auto - with \G_spec[OF this] show ?thesis by auto -qed - -lemma (in product_prob_space) generatorE: - assumes A: "A \ generator" - obtains J X where "J \ {}" "finite J" "J \ I" "X \ sets (Pi\<^isub>M J M)" "emb I J X = A" "\G A = emeasure (Pi\<^isub>M J M) X" -proof - - from generator_Ex[OF A] obtain X J where "J \ {}" "finite J" "J \ I" "X \ sets (Pi\<^isub>M J M)" "emb I J X = A" - "\G A = emeasure (Pi\<^isub>M J M) X" by auto - then show thesis by (intro that) auto -qed - -lemma (in product_prob_space) merge_sets: - "J \ K = {} \ A \ sets (Pi\<^isub>M (J \ K) M) \ x \ space (Pi\<^isub>M J M) \ (\y. merge J K (x,y)) -` A \ space (Pi\<^isub>M K M) \ sets (Pi\<^isub>M K M)" - by simp - -lemma (in product_prob_space) merge_emb: - assumes "K \ I" "J \ I" and y: "y \ space (Pi\<^isub>M J M)" - shows "((\x. merge J (I - J) (y, x)) -` emb I K X \ space (Pi\<^isub>M I M)) = - emb I (K - J) ((\x. merge J (K - J) (y, x)) -` emb (J \ K) K X \ space (Pi\<^isub>M (K - J) M))" -proof - - have [simp]: "\x J K L. merge J K (y, restrict x L) = merge J (K \ L) (y, x)" - by (auto simp: restrict_def merge_def) - have [simp]: "\x J K L. restrict (merge J K (y, x)) L = merge (J \ L) (K \ L) (y, x)" - by (auto simp: restrict_def merge_def) - have [simp]: "(I - J) \ K = K - J" using `K \ I` `J \ I` by auto - have [simp]: "(K - J) \ (K \ J) = K - J" by auto - have [simp]: "(K - J) \ K = K - J" by auto - from y `K \ I` `J \ I` show ?thesis - by (simp split: split_merge add: prod_emb_def Pi_iff extensional_merge_sub set_eq_iff space_PiM) - auto -qed - -lemma (in product_prob_space) positive_\G: - assumes "I \ {}" - shows "positive generator \G" -proof - - interpret G!: algebra "\\<^isub>E i\I. space (M i)" generator by (rule algebra_generator) fact - show ?thesis - proof (intro positive_def[THEN iffD2] conjI ballI) - from generatorE[OF G.empty_sets] guess J X . note this[simp] - interpret J: finite_product_sigma_finite M J by default fact - have "X = {}" - by (rule prod_emb_injective[of J I]) simp_all - then show "\G {} = 0" by simp - next - fix A assume "A \ generator" - from generatorE[OF this] guess J X . note this[simp] - interpret J: finite_product_sigma_finite M J by default fact - show "0 \ \G A" by (simp add: emeasure_nonneg) - qed -qed - -lemma (in product_prob_space) additive_\G: - assumes "I \ {}" - shows "additive generator \G" -proof - - interpret G!: algebra "\\<^isub>E i\I. space (M i)" generator by (rule algebra_generator) fact - show ?thesis - proof (intro additive_def[THEN iffD2] ballI impI) - fix A assume "A \ generator" with generatorE guess J X . note J = this - fix B assume "B \ generator" with generatorE guess K Y . note K = this - assume "A \ B = {}" - have JK: "J \ K \ {}" "J \ K \ I" "finite (J \ K)" - using J K by auto - interpret JK: finite_product_sigma_finite M "J \ K" by default fact - have JK_disj: "emb (J \ K) J X \ emb (J \ K) K Y = {}" - apply (rule prod_emb_injective[of "J \ K" I]) - apply (insert `A \ B = {}` JK J K) - apply (simp_all add: Int prod_emb_Int) - done - have AB: "A = emb I (J \ K) (emb (J \ K) J X)" "B = emb I (J \ K) (emb (J \ K) K Y)" - using J K by simp_all - then have "\G (A \ B) = \G (emb I (J \ K) (emb (J \ K) J X \ emb (J \ K) K Y))" - by simp - also have "\ = emeasure (Pi\<^isub>M (J \ K) M) (emb (J \ K) J X \ emb (J \ K) K Y)" - using JK J(1, 4) K(1, 4) by (simp add: \G_eq Un del: prod_emb_Un) - also have "\ = \G A + \G B" - using J K JK_disj by (simp add: plus_emeasure[symmetric]) - finally show "\G (A \ B) = \G A + \G B" . - qed -qed +lemma (in product_prob_space) PiP_PiM_finite[simp]: + assumes "J \ {}" "finite J" "J \ I" shows "PiP J M (\J. PiM J M) = PiM J M" + using assms by (simp add: PiP_finite) lemma (in product_prob_space) emeasure_PiM_emb_not_empty: assumes X: "J \ {}" "J \ I" "finite J" "\i\J. X i \ sets (M i)" @@ -337,7 +95,6 @@ ultimately have K: "K \ {}" "finite K" "K \ I" "X \ sets (Pi\<^isub>M K M)" "Z = emb I K X" "K - J \ {}" "K - J \ I" "\G Z = emeasure (Pi\<^isub>M K M) X" by (auto simp: subset_insertI) - let ?M = "\y. (\x. merge J (K - J) (y, x)) -` emb (J \ K) K X \ space (Pi\<^isub>M (K - J) M)" { fix y assume y: "y \ space (Pi\<^isub>M J M)" note * = merge_emb[OF `K \ I` `J \ I` y, of X] @@ -402,7 +159,7 @@ using A positive_\G[OF I_not_empty] by (auto intro!: INF_greatest simp: positive_def) ultimately have "0 < ?a" by auto - have "\n. \J X. J \ {} \ finite J \ J \ I \ X \ sets (Pi\<^isub>M J M) \ A n = emb I J X \ \G (A n) = emeasure (Pi\<^isub>M J M) X" + have "\n. \J X. J \ {} \ finite J \ J \ I \ X \ sets (Pi\<^isub>M J M) \ A n = emb I J X \ \G (A n) = emeasure (PiP J M (\J. (Pi\<^isub>M J M))) X" using A by (intro allI generator_Ex) auto then obtain J' X' where J': "\n. J' n \ {}" "\n. finite (J' n)" "\n. J' n \ I" "\n. X' n \ sets (Pi\<^isub>M (J' n) M)" and A': "\n. A n = emb I (J' n) (X' n)" diff -r e8af18896060 -r 20bacff85984 src/HOL/Probability/Projective_Family.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Probability/Projective_Family.thy Fri Nov 09 19:21:47 2012 +0100 @@ -0,0 +1,300 @@ +(* Title: HOL/Probability/Projective_Family.thy + Author: Fabian Immler, TU München + Author: Johannes Hölzl, TU München +*) + +header {*Projective Family*} + +theory Projective_Family +imports Finite_Product_Measure Probability_Measure +begin + +definition + PiP :: "'i set \ ('i \ 'a measure) \ ('i set \ ('i \ 'a) measure) \ ('i \ 'a) measure" where + "PiP I M P = extend_measure (\\<^isub>E i\I. space (M i)) + {(J, X). (J \ {} \ I = {}) \ finite J \ J \ I \ X \ (\ j\J. sets (M j))} + (\(J, X). prod_emb I M J (\\<^isub>E j\J. X j)) + (\(J, X). emeasure (P J) (Pi\<^isub>E J X))" + +lemma space_PiP[simp]: "space (PiP I M P) = space (PiM I M)" + by (auto simp add: PiP_def space_PiM prod_emb_def intro!: space_extend_measure) + +lemma sets_PiP[simp]: "sets (PiP I M P) = sets (PiM I M)" + by (auto simp add: PiP_def sets_PiM prod_algebra_def prod_emb_def intro!: sets_extend_measure) + +lemma measurable_PiP1[simp]: "measurable (PiP I M P) M' = measurable (\\<^isub>M i\I. M i) M'" + unfolding measurable_def by auto + +lemma measurable_PiP2[simp]: "measurable M' (PiP I M P) = measurable M' (\\<^isub>M i\I. M i)" + unfolding measurable_def by auto + +locale projective_family = + fixes I::"'i set" and P::"'i set \ ('i \ 'a) measure" and M::"('i \ 'a measure)" + assumes projective: "\J H X. J \ {} \ J \ H \ H \ I \ finite H \ X \ sets (PiM J M) \ + (P H) (prod_emb H M J X) = (P J) X" + assumes prob_space: "\J. finite J \ prob_space (P J)" + assumes proj_space: "\J. finite J \ space (P J) = space (PiM J M)" + assumes proj_sets: "\J. finite J \ sets (P J) = sets (PiM J M)" +begin + +lemma emeasure_PiP: + assumes "finite J" + assumes "J \ I" + assumes A: "\i. i\J \ A i \ sets (M i)" + shows "emeasure (PiP J M P) (Pi\<^isub>E J A) = emeasure (P J) (Pi\<^isub>E J A)" +proof - + have "Pi\<^isub>E J (restrict A J) \ (\\<^isub>E i\J. space (M i))" + proof safe + fix x j assume "x \ Pi J (restrict A J)" "j \ J" + hence "x j \ restrict A J j" by (auto simp: Pi_def) + also have "\ \ space (M j)" using sets_into_space A `j \ J` by auto + finally show "x j \ space (M j)" . + qed + hence "emeasure (PiP J M P) (Pi\<^isub>E J A) = + emeasure (PiP J M P) (prod_emb J M J (Pi\<^isub>E J A))" + using assms(1-3) sets_into_space by (auto simp add: prod_emb_id Pi_def) + also have "\ = emeasure (P J) (Pi\<^isub>E J A)" + proof (rule emeasure_extend_measure_Pair[OF PiP_def]) + show "positive (sets (PiP J M P)) (P J)" unfolding positive_def by auto + show "countably_additive (sets (PiP J M P)) (P J)" unfolding countably_additive_def + by (auto simp: suminf_emeasure proj_sets[OF `finite J`]) + show "(J \ {} \ J = {}) \ finite J \ J \ J \ A \ (\ j\J. sets (M j))" + using assms by auto + fix K and X::"'i \ 'a set" + show "prod_emb J M K (Pi\<^isub>E K X) \ Pow (\\<^isub>E i\J. space (M i))" + by (auto simp: prod_emb_def) + assume JX: "(K \ {} \ J = {}) \ finite K \ K \ J \ X \ (\ j\K. sets (M j))" + thus "emeasure (P J) (prod_emb J M K (Pi\<^isub>E K X)) = emeasure (P K) (Pi\<^isub>E K X)" + using assms + apply (cases "J = {}") + apply (simp add: prod_emb_id) + apply (fastforce simp add: intro!: projective sets_PiM_I_finite) + done + qed + finally show ?thesis . +qed + +lemma PiP_finite: + assumes "finite J" + assumes "J \ I" + shows "PiP J M P = P J" (is "?P = _") +proof (rule measure_eqI_generator_eq) + let ?J = "{Pi\<^isub>E J E | E. \i\J. E i \ sets (M i)}" + let ?F = "\i. \\<^isub>E k\J. space (M k)" + let ?\ = "(\\<^isub>E k\J. space (M k))" + show "Int_stable ?J" + by (rule Int_stable_PiE) + interpret prob_space "P J" using prob_space `finite J` by simp + show "emeasure ?P (?F _) \ \" using assms `finite J` by (auto simp: emeasure_PiP) + show "?J \ Pow ?\" by (auto simp: Pi_iff dest: sets_into_space) + show "sets (PiP J M P) = sigma_sets ?\ ?J" "sets (P J) = sigma_sets ?\ ?J" + using `finite J` proj_sets by (simp_all add: sets_PiM prod_algebra_eq_finite Pi_iff) + fix X assume "X \ ?J" + then obtain E where X: "X = Pi\<^isub>E J E" and E: "\i\J. E i \ sets (M i)" by auto + with `finite J` have "X \ sets (PiP J M P)" by simp + have emb_self: "prod_emb J M J (Pi\<^isub>E J E) = Pi\<^isub>E J E" + using E sets_into_space + by (auto intro!: prod_emb_PiE_same_index) + show "emeasure (PiP J M P) X = emeasure (P J) X" + unfolding X using E + by (intro emeasure_PiP assms) simp +qed (insert `finite J`, auto intro!: prod_algebraI_finite) + +lemma emeasure_fun_emb[simp]: + assumes L: "J \ {}" "J \ L" "finite L" "L \ I" and X: "X \ sets (PiM J M)" + shows "emeasure (PiP L M P) (prod_emb L M J X) = emeasure (PiP J M P) X" + using assms + by (subst PiP_finite) (auto simp: PiP_finite finite_subset projective) + +lemma prod_emb_injective: + assumes "J \ {}" "J \ L" "finite J" and sets: "X \ sets (Pi\<^isub>M J M)" "Y \ sets (Pi\<^isub>M J M)" + assumes "prod_emb L M J X = prod_emb L M J Y" + shows "X = Y" +proof (rule injective_vimage_restrict) + show "X \ (\\<^isub>E i\J. space (M i))" "Y \ (\\<^isub>E i\J. space (M i))" + using sets[THEN sets_into_space] by (auto simp: space_PiM) + have "\i\L. \x. x \ space (M i)" + proof + fix i assume "i \ L" + interpret prob_space "P {i}" using prob_space by simp + from not_empty show "\x. x \ space (M i)" by (auto simp add: proj_space space_PiM) + qed + from bchoice[OF this] + show "(\\<^isub>E i\L. space (M i)) \ {}" by auto + show "(\x. restrict x J) -` X \ (\\<^isub>E i\L. space (M i)) = (\x. restrict x J) -` Y \ (\\<^isub>E i\L. space (M i))" + using `prod_emb L M J X = prod_emb L M J Y` by (simp add: prod_emb_def) +qed fact + +abbreviation + "emb L K X \ prod_emb L M K X" + +definition generator :: "('i \ 'a) set set" where + "generator = (\J\{J. J \ {} \ finite J \ J \ I}. emb I J ` sets (Pi\<^isub>M J M))" + +lemma generatorI': + "J \ {} \ finite J \ J \ I \ X \ sets (Pi\<^isub>M J M) \ emb I J X \ generator" + unfolding generator_def by auto + +lemma algebra_generator: + assumes "I \ {}" shows "algebra (\\<^isub>E i\I. space (M i)) generator" (is "algebra ?\ ?G") + unfolding algebra_def algebra_axioms_def ring_of_sets_iff +proof (intro conjI ballI) + let ?G = generator + show "?G \ Pow ?\" + by (auto simp: generator_def prod_emb_def) + from `I \ {}` obtain i where "i \ I" by auto + then show "{} \ ?G" + by (auto intro!: exI[of _ "{i}"] image_eqI[where x="\i. {}"] + simp: sigma_sets.Empty generator_def prod_emb_def) + from `i \ I` show "?\ \ ?G" + by (auto intro!: exI[of _ "{i}"] image_eqI[where x="Pi\<^isub>E {i} (\i. space (M i))"] + simp: generator_def prod_emb_def) + fix A assume "A \ ?G" + then obtain JA XA where XA: "JA \ {}" "finite JA" "JA \ I" "XA \ sets (Pi\<^isub>M JA M)" and A: "A = emb I JA XA" + by (auto simp: generator_def) + fix B assume "B \ ?G" + then obtain JB XB where XB: "JB \ {}" "finite JB" "JB \ I" "XB \ sets (Pi\<^isub>M JB M)" and B: "B = emb I JB XB" + by (auto simp: generator_def) + let ?RA = "emb (JA \ JB) JA XA" + let ?RB = "emb (JA \ JB) JB XB" + have *: "A - B = emb I (JA \ JB) (?RA - ?RB)" "A \ B = emb I (JA \ JB) (?RA \ ?RB)" + using XA A XB B by auto + show "A - B \ ?G" "A \ B \ ?G" + unfolding * using XA XB by (safe intro!: generatorI') auto +qed + +lemma sets_PiM_generator: + "sets (PiM I M) = sigma_sets (\\<^isub>E i\I. space (M i)) generator" +proof cases + assume "I = {}" then show ?thesis + unfolding generator_def + by (auto simp: sets_PiM_empty sigma_sets_empty_eq cong: conj_cong) +next + assume "I \ {}" + show ?thesis + proof + show "sets (Pi\<^isub>M I M) \ sigma_sets (\\<^isub>E i\I. space (M i)) generator" + unfolding sets_PiM + proof (safe intro!: sigma_sets_subseteq) + fix A assume "A \ prod_algebra I M" with `I \ {}` show "A \ generator" + by (auto intro!: generatorI' sets_PiM_I_finite elim!: prod_algebraE) + qed + qed (auto simp: generator_def space_PiM[symmetric] intro!: sigma_sets_subset) +qed + +lemma generatorI: + "J \ {} \ finite J \ J \ I \ X \ sets (Pi\<^isub>M J M) \ A = emb I J X \ A \ generator" + unfolding generator_def by auto + +definition + "\G A = + (THE x. \J. J \ {} \ finite J \ J \ I \ (\X\sets (Pi\<^isub>M J M). A = emb I J X \ x = emeasure (PiP J M P) X))" + +lemma \G_spec: + assumes J: "J \ {}" "finite J" "J \ I" "A = emb I J X" "X \ sets (Pi\<^isub>M J M)" + shows "\G A = emeasure (PiP J M P) X" + unfolding \G_def +proof (intro the_equality allI impI ballI) + fix K Y assume K: "K \ {}" "finite K" "K \ I" "A = emb I K Y" "Y \ sets (Pi\<^isub>M K M)" + have "emeasure (PiP K M P) Y = emeasure (PiP (K \ J) M P) (emb (K \ J) K Y)" + using K J by simp + also have "emb (K \ J) K Y = emb (K \ J) J X" + using K J by (simp add: prod_emb_injective[of "K \ J" I]) + also have "emeasure (PiP (K \ J) M P) (emb (K \ J) J X) = emeasure (PiP J M P) X" + using K J by simp + finally show "emeasure (PiP J M P) X = emeasure (PiP K M P) Y" .. +qed (insert J, force) + +lemma \G_eq: + "J \ {} \ finite J \ J \ I \ X \ sets (Pi\<^isub>M J M) \ \G (emb I J X) = emeasure (PiP J M P) X" + by (intro \G_spec) auto + +lemma generator_Ex: + assumes *: "A \ generator" + shows "\J X. J \ {} \ finite J \ J \ I \ X \ sets (Pi\<^isub>M J M) \ A = emb I J X \ \G A = emeasure (PiP J M P) X" +proof - + from * obtain J X where J: "J \ {}" "finite J" "J \ I" "A = emb I J X" "X \ sets (Pi\<^isub>M J M)" + unfolding generator_def by auto + with \G_spec[OF this] show ?thesis by auto +qed + +lemma generatorE: + assumes A: "A \ generator" + obtains J X where "J \ {}" "finite J" "J \ I" "X \ sets (Pi\<^isub>M J M)" "emb I J X = A" "\G A = emeasure (PiP J M P) X" +proof - + from generator_Ex[OF A] obtain X J where "J \ {}" "finite J" "J \ I" "X \ sets (Pi\<^isub>M J M)" "emb I J X = A" + "\G A = emeasure (PiP J M P) X" by auto + then show thesis by (intro that) auto +qed + +lemma merge_sets: + "J \ K = {} \ A \ sets (Pi\<^isub>M (J \ K) M) \ x \ space (Pi\<^isub>M J M) \ (\y. merge J K (x,y)) -` A \ space (Pi\<^isub>M K M) \ sets (Pi\<^isub>M K M)" + by simp + +lemma merge_emb: + assumes "K \ I" "J \ I" and y: "y \ space (Pi\<^isub>M J M)" + shows "((\x. merge J (I - J) (y, x)) -` emb I K X \ space (Pi\<^isub>M I M)) = + emb I (K - J) ((\x. merge J (K - J) (y, x)) -` emb (J \ K) K X \ space (Pi\<^isub>M (K - J) M))" +proof - + have [simp]: "\x J K L. merge J K (y, restrict x L) = merge J (K \ L) (y, x)" + by (auto simp: restrict_def merge_def) + have [simp]: "\x J K L. restrict (merge J K (y, x)) L = merge (J \ L) (K \ L) (y, x)" + by (auto simp: restrict_def merge_def) + have [simp]: "(I - J) \ K = K - J" using `K \ I` `J \ I` by auto + have [simp]: "(K - J) \ (K \ J) = K - J" by auto + have [simp]: "(K - J) \ K = K - J" by auto + from y `K \ I` `J \ I` show ?thesis + by (simp split: split_merge add: prod_emb_def Pi_iff extensional_merge_sub set_eq_iff space_PiM) + auto +qed + +lemma positive_\G: + assumes "I \ {}" + shows "positive generator \G" +proof - + interpret G!: algebra "\\<^isub>E i\I. space (M i)" generator by (rule algebra_generator) fact + show ?thesis + proof (intro positive_def[THEN iffD2] conjI ballI) + from generatorE[OF G.empty_sets] guess J X . note this[simp] + have "X = {}" + by (rule prod_emb_injective[of J I]) simp_all + then show "\G {} = 0" by simp + next + fix A assume "A \ generator" + from generatorE[OF this] guess J X . note this[simp] + show "0 \ \G A" by (simp add: emeasure_nonneg) + qed +qed + +lemma additive_\G: + assumes "I \ {}" + shows "additive generator \G" +proof - + interpret G!: algebra "\\<^isub>E i\I. space (M i)" generator by (rule algebra_generator) fact + show ?thesis + proof (intro additive_def[THEN iffD2] ballI impI) + fix A assume "A \ generator" with generatorE guess J X . note J = this + fix B assume "B \ generator" with generatorE guess K Y . note K = this + assume "A \ B = {}" + have JK: "J \ K \ {}" "J \ K \ I" "finite (J \ K)" + using J K by auto + have JK_disj: "emb (J \ K) J X \ emb (J \ K) K Y = {}" + apply (rule prod_emb_injective[of "J \ K" I]) + apply (insert `A \ B = {}` JK J K) + apply (simp_all add: Int prod_emb_Int) + done + have AB: "A = emb I (J \ K) (emb (J \ K) J X)" "B = emb I (J \ K) (emb (J \ K) K Y)" + using J K by simp_all + then have "\G (A \ B) = \G (emb I (J \ K) (emb (J \ K) J X \ emb (J \ K) K Y))" + by simp + also have "\ = emeasure (PiP (J \ K) M P) (emb (J \ K) J X \ emb (J \ K) K Y)" + using JK J(1, 4) K(1, 4) by (simp add: \G_eq Un del: prod_emb_Un) + also have "\ = \G A + \G B" + using J K JK_disj by (simp add: plus_emeasure[symmetric]) + finally show "\G (A \ B) = \G A + \G B" . + qed +qed + +end + +end diff -r e8af18896060 -r 20bacff85984 src/HOL/Tools/set_comprehension_pointfree.ML --- a/src/HOL/Tools/set_comprehension_pointfree.ML Fri Nov 09 19:16:31 2012 +0100 +++ b/src/HOL/Tools/set_comprehension_pointfree.ML Fri Nov 09 19:21:47 2012 +0100 @@ -15,7 +15,6 @@ structure Set_Comprehension_Pointfree : SET_COMPREHENSION_POINTFREE = struct - (* syntactic operations *) fun mk_inf (t1, t2) = @@ -110,10 +109,6 @@ fun dest_bound (Bound i) = i | dest_bound t = raise TERM("dest_bound", [t]); -fun mk_pattern t = case try ((map dest_bound) o HOLogic.strip_tuple) t of - SOME p => Pattern p - | NONE => raise TERM ("mk_pattern: only tuples of bound variables supported", [t]); - fun type_of_pattern Ts (Pattern bs) = HOLogic.mk_tupleT (map (nth Ts) bs) fun term_of_pattern Ts (Pattern bs) = @@ -141,40 +136,40 @@ val t'' = HOLogic.split_const (T, T', rT) $ (Abs (x, T, t')) in (domain_type (fastype_of t''), t'') end -fun mk_atom vs (Const (@{const_name "Set.member"}, _) $ x $ s) = +fun mk_term vs t = + let + val bs = loose_bnos t + val vs' = map (nth (rev vs)) bs + val subst = map_index (fn (i, j) => (j, Bound i)) (rev bs) + |> sort (fn (p1, p2) => int_ord (fst p1, fst p2)) + |> (fn subst' => map (fn i => the_default (Bound i) (AList.lookup (op =) subst' i)) (0 upto (fst (snd (split_last subst'))))) + val t' = subst_bounds (subst, t) + val tuple = Pattern bs + in (tuple, (vs', t')) end + +fun default_atom vs t = + let + val (tuple, (vs', t')) = mk_term vs t + val T = HOLogic.mk_tupleT (map snd vs') + val s = HOLogic.Collect_const T $ (snd (mk_split @{typ bool} vs' t')) + in + (tuple, Atom (tuple, s)) + end + +fun mk_atom vs (t as Const (@{const_name "Set.member"}, _) $ x $ s) = if not (null (loose_bnos s)) then - raise TERM ("mk_atom: bound variables in the set expression", [s]) + default_atom vs t else - (case try mk_pattern x of - SOME pat => (pat, Atom (pat, s)) + (case try ((map dest_bound) o HOLogic.strip_tuple) x of + SOME pat => (Pattern pat, Atom (Pattern pat, s)) | NONE => let - val bs = loose_bnos x - val vs' = map (nth (rev vs)) bs - val subst = map_index (fn (i, j) => (j, Bound i)) (rev bs) - |> sort (fn (p1, p2) => int_ord (fst p1, fst p2)) - |> (fn subst' => map (fn i => the_default (Bound i) (AList.lookup (op =) subst' i)) (0 upto (fst (snd (split_last subst'))))) - val x' = subst_bounds (subst, x) - val tuple = Pattern bs + val (tuple, (vs', x')) = mk_term vs x val rT = HOLogic.dest_setT (fastype_of s) - val (_, f) = mk_split rT vs' x' - in (tuple, Atom (tuple, mk_vimage f s)) end) - | mk_atom vs (Const (@{const_name "HOL.Not"}, _) $ t) = - apsnd (map_atom (apsnd mk_Compl)) (mk_atom vs t) - | mk_atom vs t = - let - val bs = loose_bnos t - val vs' = map (nth (rev vs)) bs - val subst = map_index (fn (i, j) => (j, Bound i)) (rev bs) - |> sort (fn (p1, p2) => int_ord (fst p1, fst p2)) - |> (fn subst' => map (fn i => the_default (Bound i) (AList.lookup (op =) subst' i)) (0 upto (fst (snd (split_last subst'))))) - val t' = subst_bounds (subst, t) - val tuple = Pattern bs - val setT = HOLogic.mk_tupleT (map snd vs') - val (_, s) = mk_split @{typ bool} vs' t' - in - (tuple, Atom (tuple, HOLogic.Collect_const setT $ s)) - end + val s = mk_vimage (snd (mk_split rT vs' x')) s + in (tuple, Atom (tuple, s)) end) + | mk_atom vs (Const (@{const_name "HOL.Not"}, _) $ t) = apsnd (map_atom (apsnd mk_Compl)) (mk_atom vs t) + | mk_atom vs t = default_atom vs t fun merge' [] (pats1, pats2) = ([], (pats1, pats2)) | merge' pat (pats, []) = (pat, (pats, [])) @@ -294,7 +289,7 @@ (0 upto (length vs - 1)) val (pats, fm) = mk_formula ((x, T) :: vs) (foldr1 HOLogic.mk_conj (conjs' @ map mk_mem_UNIV unused_bounds)) - fun mk_set (Atom pt) = (case map (lookup pt) pats of [t'] => t' | ts => foldr1 mk_sigma ts) + fun mk_set (Atom pt) = foldr1 mk_sigma (map (lookup pt) pats) | mk_set (Un (f1, f2)) = mk_sup (mk_set f1, mk_set f2) | mk_set (Int (f1, f2)) = mk_inf (mk_set f1, mk_set f2) val pat = foldr1 (mk_prod1 Ts) (map (term_of_pattern Ts) pats) @@ -331,10 +326,10 @@ val collectI' = @{lemma "\ P a ==> a \ {x. P x}" by auto} val collectE' = @{lemma "a \ {x. P x} ==> (\ P a ==> Q) ==> Q" by auto} -val elim_Collect_tac = dtac @{thm iffD1[OF mem_Collect_eq]} +fun elim_Collect_tac ss = dtac @{thm iffD1[OF mem_Collect_eq]} THEN' (REPEAT_DETERM o (eresolve_tac @{thms exE})) THEN' REPEAT_DETERM o etac @{thm conjE} - THEN' TRY o hyp_subst_tac; + THEN' TRY o hyp_subst_tac' ss; fun intro_image_tac ctxt = rtac @{thm image_eqI} THEN' (REPEAT_DETERM1 o @@ -348,7 +343,7 @@ THEN' REPEAT_DETERM o CHANGED o (TRY o Simplifier.full_simp_tac (Simplifier.inherit_context ss (HOL_basic_ss addsimps @{thms split_paired_all prod.cases})) THEN' REPEAT_DETERM o etac @{thm Pair_inject} - THEN' TRY o hyp_subst_tac) + THEN' TRY o hyp_subst_tac' ss) fun tac1_of_formula ss (Int (fm1, fm2)) = TRY o etac @{thm conjE} @@ -392,21 +387,21 @@ ORELSE' etac @{thm conjE} ORELSE' ((etac @{thm CollectE} ORELSE' etac collectE') THEN' TRY o Simplifier.full_simp_tac (Simplifier.inherit_context ss (HOL_basic_ss addsimps [@{thm prod.cases}])) THEN' - REPEAT_DETERM o etac @{thm Pair_inject} THEN' TRY o hyp_subst_tac THEN' TRY o rtac @{thm refl}) + REPEAT_DETERM o etac @{thm Pair_inject} THEN' TRY o hyp_subst_tac' ss THEN' TRY o rtac @{thm refl}) ORELSE' (etac @{thm imageE} THEN' (REPEAT_DETERM o CHANGED o (TRY o Simplifier.full_simp_tac (Simplifier.inherit_context ss (HOL_basic_ss addsimps @{thms split_paired_all prod.cases})) THEN' REPEAT_DETERM o etac @{thm Pair_inject} - THEN' TRY o hyp_subst_tac THEN' TRY o rtac @{thm refl}))) + THEN' TRY o hyp_subst_tac' ss THEN' TRY o rtac @{thm refl}))) ORELSE' etac @{thm ComplE} ORELSE' ((etac @{thm vimageE} ORELSE' etac vimageE') THEN' TRY o Simplifier.full_simp_tac (Simplifier.inherit_context ss (HOL_basic_ss addsimps [@{thm prod.cases}])) - THEN' TRY o hyp_subst_tac THEN' TRY o rtac @{thm refl})) + THEN' TRY o hyp_subst_tac' ss THEN' TRY o rtac @{thm refl})) fun tac ss ctxt fm = let val subset_tac1 = rtac @{thm subsetI} - THEN' elim_Collect_tac + THEN' elim_Collect_tac ss THEN' intro_image_tac ctxt THEN' tac1_of_formula ss fm val subset_tac2 = rtac @{thm subsetI} @@ -414,7 +409,7 @@ THEN' rtac @{thm iffD2[OF mem_Collect_eq]} THEN' REPEAT_DETERM o resolve_tac @{thms exI} THEN' (TRY o REPEAT_ALL_NEW (rtac @{thm conjI})) - THEN' (K (TRY (FIRSTGOAL ((TRY o hyp_subst_tac) THEN' rtac @{thm refl})))) + THEN' (K (TRY (FIRSTGOAL ((TRY o hyp_subst_tac' ss) THEN' rtac @{thm refl})))) THEN' (fn i => EVERY (rev (map_index (fn (j, f) => REPEAT_DETERM (etac @{thm IntE} (i + j)) THEN tac2_of_formula ss f (i + j)) (strip_Int fm)))) in @@ -528,11 +523,14 @@ fun code_simproc ss redex = let - val prep_thm = Raw_Simplifier.rewrite false @{thms eq_equal[symmetric]} redex + fun unfold_conv thms = + Raw_Simplifier.rewrite_cterm (false, false, false) (K (K NONE)) + (Raw_Simplifier.inherit_context ss empty_ss addsimps thms) + val prep_thm = unfold_conv @{thms eq_equal[symmetric]} redex in case base_simproc ss (Thm.rhs_of prep_thm) of SOME rewr_thm => SOME (transitive_thm OF [transitive_thm OF [prep_thm, rewr_thm], - Raw_Simplifier.rewrite false @{thms eq_equal} (Thm.rhs_of rewr_thm)]) + unfold_conv @{thms eq_equal} (Thm.rhs_of rewr_thm)]) | NONE => NONE end; diff -r e8af18896060 -r 20bacff85984 src/Provers/hypsubst.ML --- a/src/Provers/hypsubst.ML Fri Nov 09 19:16:31 2012 +0100 +++ b/src/Provers/hypsubst.ML Fri Nov 09 19:21:47 2012 +0100 @@ -48,6 +48,7 @@ sig val bound_hyp_subst_tac : int -> tactic val hyp_subst_tac : int -> tactic + val hyp_subst_tac' : simpset -> int -> tactic val blast_hyp_subst_tac : bool -> int -> tactic val stac : thm -> int -> tactic val hypsubst_setup : theory -> theory @@ -126,12 +127,14 @@ (*Select a suitable equality assumption; substitute throughout the subgoal If bnd is true, then it replaces Bound variables only. *) - fun gen_hyp_subst_tac bnd = + fun gen_hyp_subst_tac opt_ss bnd = let fun tac i st = SUBGOAL (fn (Bi, _) => let val (k, _) = eq_var bnd true Bi - val hyp_subst_ss = Simplifier.global_context (Thm.theory_of_thm st) empty_ss - |> Simplifier.set_mksimps (K (mk_eqs bnd)) + val map_simpset = case opt_ss of + NONE => Simplifier.global_context (Thm.theory_of_thm st) + | SOME ss => Simplifier.inherit_context ss + val hyp_subst_ss = map_simpset empty_ss |> Simplifier.set_mksimps (K (mk_eqs bnd)) in EVERY [rotate_tac k i, asm_lr_simp_tac hyp_subst_ss i, etac thin_rl i, rotate_tac (~k) i] end handle THM _ => no_tac | EQ_VAR => no_tac) i st @@ -195,11 +198,14 @@ (*Substitutes for Free or Bound variables*) val hyp_subst_tac = FIRST' [ematch_tac [Data.thin_refl], - gen_hyp_subst_tac false, vars_gen_hyp_subst_tac false]; + gen_hyp_subst_tac NONE false, vars_gen_hyp_subst_tac false]; + +fun hyp_subst_tac' ss = FIRST' [ematch_tac [Data.thin_refl], + gen_hyp_subst_tac (SOME ss) false, vars_gen_hyp_subst_tac false]; (*Substitutes for Bound variables only -- this is always safe*) val bound_hyp_subst_tac = - gen_hyp_subst_tac true ORELSE' vars_gen_hyp_subst_tac true; + gen_hyp_subst_tac NONE true ORELSE' vars_gen_hyp_subst_tac true; (** Version for Blast_tac. Hyps that are affected by the substitution are