# HG changeset patch # User huffman # Date 1261086710 28800 # Node ID f3fd41b9c017241b51ed465d58b424ada7a284b4 # Parent dbc0fb6e7eae6d039f79aeee050aadb42fae7c5f# Parent 9996f47a13109e735d66759a011937b7e2ab74fd merged diff -r 9996f47a1310 -r f3fd41b9c017 src/HOL/Finite_Set.thy --- a/src/HOL/Finite_Set.thy Thu Dec 17 21:12:57 2009 +0100 +++ b/src/HOL/Finite_Set.thy Thu Dec 17 13:51:50 2009 -0800 @@ -204,6 +204,9 @@ qed qed +lemma rev_finite_subset: "finite B ==> A \ B ==> finite A" +by (rule finite_subset) + lemma finite_Un [iff]: "finite (F Un G) = (finite F & finite G)" by (blast intro: finite_subset [of _ "X Un Y", standard] finite_UnI) @@ -355,6 +358,18 @@ apply (simp add: finite_Un finite_subset [OF inj_vimage_singleton]) done +lemma finite_vimageD: + assumes fin: "finite (h -` F)" and surj: "surj h" + shows "finite F" +proof - + have "finite (h ` (h -` F))" using fin by (rule finite_imageI) + also have "h ` (h -` F) = F" using surj by (rule surj_image_vimage_eq) + finally show "finite F" . +qed + +lemma finite_vimage_iff: "bij h \ finite (h -` F) \ finite F" + unfolding bij_def by (auto elim: finite_vimageD finite_vimageI) + text {* The finite UNION of finite sets *} diff -r 9996f47a1310 -r f3fd41b9c017 src/HOL/Library/Infinite_Set.thy --- a/src/HOL/Library/Infinite_Set.thy Thu Dec 17 21:12:57 2009 +0100 +++ b/src/HOL/Library/Infinite_Set.thy Thu Dec 17 13:51:50 2009 -0800 @@ -371,21 +371,38 @@ Inf_many (binder "\\<^sub>\" 10) and Alm_all (binder "\\<^sub>\" 10) -lemma INFM_EX: - "(\\<^sub>\x. P x) \ (\x. P x)" - unfolding Inf_many_def -proof (rule ccontr) - assume inf: "infinite {x. P x}" - assume "\ ?thesis" then have "{x. P x} = {}" by simp - then have "finite {x. P x}" by simp - with inf show False by simp -qed +lemma INFM_iff_infinite: "(INFM x. P x) \ infinite {x. P x}" + unfolding Inf_many_def .. + +lemma MOST_iff_cofinite: "(MOST x. P x) \ finite {x. \ P x}" + unfolding Alm_all_def Inf_many_def by simp + +(* legacy name *) +lemmas MOST_iff_finiteNeg = MOST_iff_cofinite + +lemma not_INFM [simp]: "\ (INFM x. P x) \ (MOST x. \ P x)" + unfolding Alm_all_def not_not .. -lemma MOST_iff_finiteNeg: "(\\<^sub>\x. P x) = finite {x. \ P x}" - by (simp add: Alm_all_def Inf_many_def) +lemma not_MOST [simp]: "\ (MOST x. P x) \ (INFM x. \ P x)" + unfolding Alm_all_def not_not .. + +lemma INFM_const [simp]: "(INFM x::'a. P) \ P \ infinite (UNIV::'a set)" + unfolding Inf_many_def by simp + +lemma MOST_const [simp]: "(MOST x::'a. P) \ P \ finite (UNIV::'a set)" + unfolding Alm_all_def by simp + +lemma INFM_EX: "(\\<^sub>\x. P x) \ (\x. P x)" + by (erule contrapos_pp, simp) lemma ALL_MOST: "\x. P x \ \\<^sub>\x. P x" - by (simp add: MOST_iff_finiteNeg) + by simp + +lemma INFM_E: assumes "INFM x. P x" obtains x where "P x" + using INFM_EX [OF assms] by (rule exE) + +lemma MOST_I: assumes "\x. P x" shows "MOST x. P x" + using assms by simp lemma INFM_mono: assumes inf: "\\<^sub>\x. P x" and q: "\x. P x \ Q x" @@ -404,30 +421,95 @@ "(\\<^sub>\x. P x \ Q x) \ (\\<^sub>\x. P x) \ (\\<^sub>\x. Q x)" unfolding Inf_many_def by (simp add: Collect_disj_eq) +lemma INFM_imp_distrib: + "(INFM x. P x \ Q x) \ ((MOST x. P x) \ (INFM x. Q x))" + by (simp only: imp_conv_disj INFM_disj_distrib not_MOST) + lemma MOST_conj_distrib: "(\\<^sub>\x. P x \ Q x) \ (\\<^sub>\x. P x) \ (\\<^sub>\x. Q x)" unfolding Alm_all_def by (simp add: INFM_disj_distrib del: disj_not1) +lemma MOST_conjI: + "MOST x. P x \ MOST x. Q x \ MOST x. P x \ Q x" + by (simp add: MOST_conj_distrib) + +lemma INFM_conjI: + "INFM x. P x \ MOST x. Q x \ INFM x. P x \ Q x" + unfolding MOST_iff_cofinite INFM_iff_infinite + apply (drule (1) Diff_infinite_finite) + apply (simp add: Collect_conj_eq Collect_neg_eq) + done + lemma MOST_rev_mp: assumes "\\<^sub>\x. P x" and "\\<^sub>\x. P x \ Q x" shows "\\<^sub>\x. Q x" proof - have "\\<^sub>\x. P x \ (P x \ Q x)" - using prems by (simp add: MOST_conj_distrib) + using assms by (rule MOST_conjI) thus ?thesis by (rule MOST_mono) simp qed -lemma not_INFM [simp]: "\ (INFM x. P x) \ (MOST x. \ P x)" -unfolding Alm_all_def not_not .. +lemma MOST_imp_iff: + assumes "MOST x. P x" + shows "(MOST x. P x \ Q x) \ (MOST x. Q x)" +proof + assume "MOST x. P x \ Q x" + with assms show "MOST x. Q x" by (rule MOST_rev_mp) +next + assume "MOST x. Q x" + then show "MOST x. P x \ Q x" by (rule MOST_mono) simp +qed -lemma not_MOST [simp]: "\ (MOST x. P x) \ (INFM x. \ P x)" -unfolding Alm_all_def not_not .. +lemma INFM_MOST_simps [simp]: + "\P Q. (INFM x. P x \ Q) \ (INFM x. P x) \ Q" + "\P Q. (INFM x. P \ Q x) \ P \ (INFM x. Q x)" + "\P Q. (MOST x. P x \ Q) \ (MOST x. P x) \ Q" + "\P Q. (MOST x. P \ Q x) \ P \ (MOST x. Q x)" + "\P Q. (MOST x. P x \ Q) \ ((INFM x. P x) \ Q)" + "\P Q. (MOST x. P \ Q x) \ (P \ (MOST x. Q x))" + unfolding Alm_all_def Inf_many_def + by (simp_all add: Collect_conj_eq) + +text {* Properties of quantifiers with injective functions. *} + +lemma INFM_inj: + "INFM x. P (f x) \ inj f \ INFM x. P x" + unfolding INFM_iff_infinite + by (clarify, drule (1) finite_vimageI, simp) -lemma INFM_const [simp]: "(INFM x::'a. P) \ P \ infinite (UNIV::'a set)" - unfolding Inf_many_def by simp +lemma MOST_inj: + "MOST x. P x \ inj f \ MOST x. P (f x)" + unfolding MOST_iff_cofinite + by (drule (1) finite_vimageI, simp) + +text {* Properties of quantifiers with singletons. *} + +lemma not_INFM_eq [simp]: + "\ (INFM x. x = a)" + "\ (INFM x. a = x)" + unfolding INFM_iff_infinite by simp_all + +lemma MOST_neq [simp]: + "MOST x. x \ a" + "MOST x. a \ x" + unfolding MOST_iff_cofinite by simp_all -lemma MOST_const [simp]: "(MOST x::'a. P) \ P \ finite (UNIV::'a set)" - unfolding Alm_all_def by simp +lemma INFM_neq [simp]: + "(INFM x::'a. x \ a) \ infinite (UNIV::'a set)" + "(INFM x::'a. a \ x) \ infinite (UNIV::'a set)" + unfolding INFM_iff_infinite by simp_all + +lemma MOST_eq [simp]: + "(MOST x::'a. x = a) \ finite (UNIV::'a set)" + "(MOST x::'a. a = x) \ finite (UNIV::'a set)" + unfolding MOST_iff_cofinite by simp_all + +lemma MOST_eq_imp: + "MOST x. x = a \ P x" + "MOST x. a = x \ P x" + unfolding MOST_iff_cofinite by simp_all + +text {* Properties of quantifiers over the naturals. *} lemma INFM_nat: "(\\<^sub>\n. P (n::nat)) = (\m. \n. m P n)" by (simp add: Inf_many_def infinite_nat_iff_unbounded) diff -r 9996f47a1310 -r f3fd41b9c017 src/HOL/Library/Product_Vector.thy --- a/src/HOL/Library/Product_Vector.thy Thu Dec 17 21:12:57 2009 +0100 +++ b/src/HOL/Library/Product_Vector.thy Thu Dec 17 13:51:50 2009 -0800 @@ -102,6 +102,42 @@ by (simp add: closed_vimage_fst closed_vimage_snd closed_Int) qed +lemma openI: (* TODO: move *) + assumes "\x. x \ S \ \T. open T \ x \ T \ T \ S" + shows "open S" +proof - + have "open (\{T. open T \ T \ S})" by auto + moreover have "\{T. open T \ T \ S} = S" by (auto dest!: assms) + ultimately show "open S" by simp +qed + +lemma subset_fst_imageI: "A \ B \ S \ y \ B \ A \ fst ` S" + unfolding image_def subset_eq by force + +lemma subset_snd_imageI: "A \ B \ S \ x \ A \ B \ snd ` S" + unfolding image_def subset_eq by force + +lemma open_image_fst: assumes "open S" shows "open (fst ` S)" +proof (rule openI) + fix x assume "x \ fst ` S" + then obtain y where "(x, y) \ S" by auto + then obtain A B where "open A" "open B" "x \ A" "y \ B" "A \ B \ S" + using `open S` unfolding open_prod_def by auto + from `A \ B \ S` `y \ B` have "A \ fst ` S" by (rule subset_fst_imageI) + with `open A` `x \ A` have "open A \ x \ A \ A \ fst ` S" by simp + then show "\T. open T \ x \ T \ T \ fst ` S" by - (rule exI) +qed + +lemma open_image_snd: assumes "open S" shows "open (snd ` S)" +proof (rule openI) + fix y assume "y \ snd ` S" + then obtain x where "(x, y) \ S" by auto + then obtain A B where "open A" "open B" "x \ A" "y \ B" "A \ B \ S" + using `open S` unfolding open_prod_def by auto + from `A \ B \ S` `x \ A` have "B \ snd ` S" by (rule subset_snd_imageI) + with `open B` `y \ B` have "open B \ y \ B \ B \ snd ` S" by simp + then show "\T. open T \ y \ T \ T \ snd ` S" by - (rule exI) +qed subsection {* Product is a metric space *}