# HG changeset patch # User huffman # Date 1314811469 25200 # Node ID d08cb39b628a34ed08ef90f01462d2b5ddc146d3 # Parent 1cd782f3458be1d0967ac983c7bddf9f6ed83b03 convert proof to Isar-style diff -r 1cd782f3458b -r d08cb39b628a src/HOL/Multivariate_Analysis/Finite_Cartesian_Product.thy --- a/src/HOL/Multivariate_Analysis/Finite_Cartesian_Product.thy Wed Aug 31 13:51:22 2011 -0700 +++ b/src/HOL/Multivariate_Analysis/Finite_Cartesian_Product.thy Wed Aug 31 10:24:29 2011 -0700 @@ -296,44 +296,45 @@ apply (simp add: setL2_mono dist_triangle2) done next - (* FIXME: long proof! *) fix S :: "('a ^ 'b) set" show "open S \ (\x\S. \e>0. \y. dist y x < e \ y \ S)" - unfolding open_vec_def open_dist - apply safe - apply (drule (1) bspec) - apply clarify - apply (subgoal_tac "\e>0. \i y. dist y (x$i) < e \ y \ A i") - apply clarify - apply (rule_tac x=e in exI, clarify) - apply (drule spec, erule mp, clarify) - apply (drule spec, drule spec, erule mp) - apply (erule le_less_trans [OF dist_vec_nth_le]) - apply (subgoal_tac "\i\UNIV. \e>0. \y. dist y (x$i) < e \ y \ A i") - apply (drule finite_choice [OF finite], clarify) - apply (rule_tac x="Min (range f)" in exI, simp) - apply clarify - apply (drule_tac x=i in spec, clarify) - apply (erule (1) bspec) - apply (drule (1) bspec, clarify) - apply (subgoal_tac "\r. (\i::'b. 0 < r i) \ e = setL2 r UNIV") - apply clarify - apply (rule_tac x="\i. {y. dist y (x$i) < r i}" in exI) - apply (rule conjI) - apply clarify - apply (rule conjI) - apply (clarify, rename_tac y) - apply (rule_tac x="r i - dist y (x$i)" in exI, rule conjI, simp) - apply clarify - apply (simp only: less_diff_eq) - apply (erule le_less_trans [OF dist_triangle]) - apply simp - apply clarify - apply (drule spec, erule mp) - apply (simp add: dist_vec_def setL2_strict_mono) - apply (rule_tac x="\i. e / sqrt (of_nat CARD('b))" in exI) - apply (simp add: divide_pos_pos setL2_constant) - done + proof + assume "open S" show "\x\S. \e>0. \y. dist y x < e \ y \ S" + proof + fix x assume "x \ S" + obtain A where A: "\i. open (A i)" "\i. x $ i \ A i" + and S: "\y. (\i. y $ i \ A i) \ y \ S" + using `open S` and `x \ S` unfolding open_vec_def by metis + have "\i\UNIV. \r>0. \y. dist y (x $ i) < r \ y \ A i" + using A unfolding open_dist by simp + hence "\r. \i\UNIV. 0 < r i \ (\y. dist y (x $ i) < r i \ y \ A i)" + by (rule finite_choice [OF finite]) + then obtain r where r1: "\i. 0 < r i" + and r2: "\i y. dist y (x $ i) < r i \ y \ A i" by fast + have "0 < Min (range r) \ (\y. dist y x < Min (range r) \ y \ S)" + by (simp add: r1 r2 S le_less_trans [OF dist_vec_nth_le]) + thus "\e>0. \y. dist y x < e \ y \ S" .. + qed + next + assume *: "\x\S. \e>0. \y. dist y x < e \ y \ S" show "open S" + proof (unfold open_vec_def, rule) + fix x assume "x \ S" + then obtain e where "0 < e" and S: "\y. dist y x < e \ y \ S" + using * by fast + def r \ "\i::'b. e / sqrt (of_nat CARD('b))" + from `0 < e` have r: "\i. 0 < r i" + unfolding r_def by (simp_all add: divide_pos_pos) + from `0 < e` have e: "e = setL2 r UNIV" + unfolding r_def by (simp add: setL2_constant) + def A \ "\i. {y. dist (x $ i) y < r i}" + have "\i. open (A i) \ x $ i \ A i" + unfolding A_def by (simp add: open_ball r) + moreover have "\y. (\i. y $ i \ A i) \ y \ S" + by (simp add: A_def S dist_vec_def e setL2_strict_mono dist_commute) + ultimately show "\A. (\i. open (A i) \ x $ i \ A i) \ + (\y. (\i. y $ i \ A i) \ y \ S)" by metis + qed + qed qed end