# HG changeset patch # User hoelzl # Date 1271779114 -7200 # Node ID e393a91f86df9e59cc6956a989c1c8c11d0d9381 # Parent 6ed6112f0a954a79db70f72c5d4bb4a03ca82fa2 Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1. diff -r 6ed6112f0a95 -r e393a91f86df src/HOL/Big_Operators.thy --- a/src/HOL/Big_Operators.thy Mon May 03 07:59:51 2010 +0200 +++ b/src/HOL/Big_Operators.thy Tue Apr 20 17:58:34 2010 +0200 @@ -554,6 +554,26 @@ case False thus ?thesis by (simp add: setsum_def) qed +lemma setsum_nonneg_leq_bound: + fixes f :: "'a \ 'b::{ordered_ab_group_add}" + assumes "finite s" "\i. i \ s \ f i \ 0" "(\i \ s. f i) = B" "i \ s" + shows "f i \ B" +proof - + have "0 \ (\ i \ s - {i}. f i)" and "0 \ f i" + using assms by (auto intro!: setsum_nonneg) + moreover + have "(\ i \ s - {i}. f i) + f i = B" + using assms by (simp add: setsum_diff1) + ultimately show ?thesis by auto +qed + +lemma setsum_nonneg_0: + fixes f :: "'a \ 'b::{ordered_ab_group_add}" + assumes "finite s" and pos: "\ i. i \ s \ f i \ 0" + and "(\ i \ s. f i) = 0" and i: "i \ s" + shows "f i = 0" + using setsum_nonneg_leq_bound[OF assms] pos[OF i] by auto + lemma setsum_mono2: fixes f :: "'a \ 'b :: ordered_comm_monoid_add" assumes fin: "finite B" and sub: "A \ B" and nn: "\b. b \ B-A \ 0 \ f b" diff -r 6ed6112f0a95 -r e393a91f86df src/HOL/List.thy --- a/src/HOL/List.thy Mon May 03 07:59:51 2010 +0200 +++ b/src/HOL/List.thy Tue Apr 20 17:58:34 2010 +0200 @@ -3039,6 +3039,9 @@ lemma length_replicate [simp]: "length (replicate n x) = n" by (induct n) auto +lemma Ex_list_of_length: "\xs. length xs = n" +by (rule exI[of _ "replicate n undefined"]) simp + lemma map_replicate [simp]: "map f (replicate n x) = replicate n (f x)" by (induct n) auto diff -r 6ed6112f0a95 -r e393a91f86df src/HOL/Log.thy --- a/src/HOL/Log.thy Mon May 03 07:59:51 2010 +0200 +++ b/src/HOL/Log.thy Tue Apr 20 17:58:34 2010 +0200 @@ -145,6 +145,21 @@ apply (drule_tac a = "log a x" in powr_less_mono, auto) done +lemma log_inj: assumes "1 < b" shows "inj_on (log b) {0 <..}" +proof (rule inj_onI, simp) + fix x y assume pos: "0 < x" "0 < y" and *: "log b x = log b y" + show "x = y" + proof (cases rule: linorder_cases) + assume "x < y" hence "log b x < log b y" + using log_less_cancel_iff[OF `1 < b`] pos by simp + thus ?thesis using * by simp + next + assume "y < x" hence "log b y < log b x" + using log_less_cancel_iff[OF `1 < b`] pos by simp + thus ?thesis using * by simp + qed simp +qed + lemma log_le_cancel_iff [simp]: "[| 1 < a; 0 < x; 0 < y |] ==> (log a x \ log a y) = (x \ y)" by (simp add: linorder_not_less [symmetric]) diff -r 6ed6112f0a95 -r e393a91f86df src/HOL/Product_Type.thy --- a/src/HOL/Product_Type.thy Mon May 03 07:59:51 2010 +0200 +++ b/src/HOL/Product_Type.thy Tue Apr 20 17:58:34 2010 +0200 @@ -990,6 +990,15 @@ lemma Times_Diff_distrib1: "(A - B) <*> C = (A <*> C) - (B <*> C)" by blast +lemma Times_empty[simp]: "A \ B = {} \ A = {} \ B = {}" + by auto + +lemma fst_image_times[simp]: "fst ` (A \ B) = (if B = {} then {} else A)" + by (auto intro!: image_eqI) + +lemma snd_image_times[simp]: "snd ` (A \ B) = (if A = {} then {} else B)" + by (auto intro!: image_eqI) + lemma insert_times_insert[simp]: "insert a A \ insert b B = insert (a,b) (A \ insert b B \ insert a A \ B)" @@ -999,13 +1008,20 @@ by (auto, rule_tac p = "f x" in PairE, auto) lemma swap_inj_on: - "inj_on (%(i, j). (j, i)) (A \ B)" - by (unfold inj_on_def) fast + "inj_on (\(i, j). (j, i)) A" + by (auto intro!: inj_onI) lemma swap_product: "(%(i, j). (j, i)) ` (A \ B) = B \ A" by (simp add: split_def image_def) blast +lemma image_split_eq_Sigma: + "(\x. (f x, g x)) ` A = Sigma (f ` A) (\x. g ` (f -` {x} \ A))" +proof (safe intro!: imageI vimageI) + fix a b assume *: "a \ A" "b \ A" and eq: "f a = f b" + show "(f b, g a) \ (\x. (f x, g x)) ` A" + using * eq[symmetric] by auto +qed simp_all subsubsection {* Code generator setup *} diff -r 6ed6112f0a95 -r e393a91f86df src/HOL/Rings.thy --- a/src/HOL/Rings.thy Mon May 03 07:59:51 2010 +0200 +++ b/src/HOL/Rings.thy Tue Apr 20 17:58:34 2010 +0200 @@ -684,6 +684,18 @@ end class linordered_semiring_1 = linordered_semiring + semiring_1 +begin + +lemma convex_bound_le: + assumes "x \ a" "y \ a" "0 \ u" "0 \ v" "u + v = 1" + shows "u * x + v * y \ a" +proof- + from assms have "u * x + v * y \ u * a + v * a" + by (simp add: add_mono mult_left_mono) + thus ?thesis using assms unfolding left_distrib[symmetric] by simp +qed + +end class linordered_semiring_strict = semiring + comm_monoid_add + linordered_cancel_ab_semigroup_add + assumes mult_strict_left_mono: "a < b \ 0 < c \ c * a < c * b" @@ -803,6 +815,21 @@ end class linordered_semiring_1_strict = linordered_semiring_strict + semiring_1 +begin + +subclass linordered_semiring_1 .. + +lemma convex_bound_lt: + assumes "x < a" "y < a" "0 \ u" "0 \ v" "u + v = 1" + shows "u * x + v * y < a" +proof - + from assms have "u * x + v * y < u * a + v * a" + by (cases "u = 0") + (auto intro!: add_less_le_mono mult_strict_left_mono mult_left_mono) + thus ?thesis using assms unfolding left_distrib[symmetric] by simp +qed + +end class mult_mono1 = times + zero + ord + assumes mult_mono1: "a \ b \ 0 \ c \ c * a \ c * b" @@ -1108,6 +1135,7 @@ (*previously linordered_ring*) begin +subclass linordered_semiring_1_strict .. subclass linordered_ring_strict .. subclass ordered_comm_ring .. subclass idom ..