# HG changeset patch # User hoelzl # Date 1455289747 -3600 # Node ID ace69956d01852f7d5992a97851473d2f96eec9b # Parent 85f38d5f88079843262a90015e21cb30d54acf92 moved more proofs to ordered_comm_monoid_add; introduced strict_ordered_ab_semigroup/comm_monoid_add diff -r 85f38d5f8807 -r ace69956d018 src/HOL/Groups.thy --- a/src/HOL/Groups.thy Wed Feb 10 18:43:19 2016 +0100 +++ b/src/HOL/Groups.thy Fri Feb 12 16:09:07 2016 +0100 @@ -589,6 +589,10 @@ end +text\Strict monotonicity in both arguments\ +class strict_ordered_ab_semigroup_add = ordered_ab_semigroup_add + + assumes add_strict_mono: "a < b \ c < d \ a + c < b + d" + class ordered_cancel_ab_semigroup_add = ordered_ab_semigroup_add + cancel_ab_semigroup_add begin @@ -601,12 +605,11 @@ "a < b \ a + c < b + c" by (simp add: add.commute [of _ c] add_strict_left_mono) -text\Strict monotonicity in both arguments\ -lemma add_strict_mono: - "a < b \ c < d \ a + c < b + d" -apply (erule add_strict_right_mono [THEN less_trans]) -apply (erule add_strict_left_mono) -done +subclass strict_ordered_ab_semigroup_add + apply standard + apply (erule add_strict_right_mono [THEN less_trans]) + apply (erule add_strict_left_mono) + done lemma add_less_le_mono: "a < b \ c \ d \ a + c < b + d" @@ -622,8 +625,7 @@ end -class ordered_ab_semigroup_add_imp_le = - ordered_cancel_ab_semigroup_add + +class ordered_ab_semigroup_add_imp_le = ordered_cancel_ab_semigroup_add + assumes add_le_imp_le_left: "c + a \ c + b \ a \ b" begin @@ -695,40 +697,20 @@ begin lemma add_nonneg_nonneg [simp]: - assumes "0 \ a" and "0 \ b" shows "0 \ a + b" -proof - - have "0 + 0 \ a + b" - using assms by (rule add_mono) - then show ?thesis by simp -qed + "0 \ a \ 0 \ b \ 0 \ a + b" + using add_mono[of 0 a 0 b] by simp lemma add_nonpos_nonpos: - assumes "a \ 0" and "b \ 0" shows "a + b \ 0" -proof - - have "a + b \ 0 + 0" - using assms by (rule add_mono) - then show ?thesis by simp -qed + "a \ 0 \ b \ 0 \ a + b \ 0" + using add_mono[of a 0 b 0] by simp lemma add_nonneg_eq_0_iff: - assumes x: "0 \ x" and y: "0 \ y" - shows "x + y = 0 \ x = 0 \ y = 0" -proof (intro iffI conjI) - have "x = x + 0" by simp - also have "x + 0 \ x + y" using y by (rule add_left_mono) - also assume "x + y = 0" - also have "0 \ x" using x . - finally show "x = 0" . -next - have "y = 0 + y" by simp - also have "0 + y \ x + y" using x by (rule add_right_mono) - also assume "x + y = 0" - also have "0 \ y" using y . - finally show "y = 0" . -next - assume "x = 0 \ y = 0" - then show "x + y = 0" by simp -qed + "0 \ x \ 0 \ y \ x + y = 0 \ x = 0 \ y = 0" + using add_left_mono[of 0 y x] add_right_mono[of 0 x y] by auto + +lemma add_nonpos_eq_0_iff: + "x \ 0 \ y \ 0 \ x + y = 0 \ x = 0 \ y = 0" + using add_left_mono[of y 0 x] add_right_mono[of x 0 y] by auto lemma add_increasing: "0 \ a \ b \ c \ b \ a + c" @@ -738,134 +720,46 @@ "0 \ c \ b \ a \ b \ a + c" by (simp add: add_increasing add.commute [of a]) -end - -class canonically_ordered_monoid_add = comm_monoid_add + order + - assumes le_iff_add: "a \ b \ (\c. b = a + c)" -begin - -subclass ordered_comm_monoid_add - proof qed (auto simp: le_iff_add add_ac) - -lemma zero_le: "0 \ x" - by (auto simp: le_iff_add) - -lemma add_eq_0_iff_both_eq_0: "x + y = 0 \ x = 0 \ y = 0" - by (intro add_nonneg_eq_0_iff zero_le) - -end - -class ordered_cancel_comm_monoid_diff = - canonically_ordered_monoid_add + comm_monoid_diff + ordered_ab_semigroup_add_imp_le -begin - -context - fixes a b - assumes "a \ b" -begin - -lemma add_diff_inverse: - "a + (b - a) = b" - using \a \ b\ by (auto simp add: le_iff_add) +lemma add_decreasing: + "a \ 0 \ c \ b \ a + c \ b" + using add_mono[of a 0 c b] by simp -lemma add_diff_assoc: - "c + (b - a) = c + b - a" - using \a \ b\ by (auto simp add: le_iff_add add.left_commute [of c]) - -lemma add_diff_assoc2: - "b - a + c = b + c - a" - using \a \ b\ by (auto simp add: le_iff_add add.assoc) - -lemma diff_add_assoc: - "c + b - a = c + (b - a)" - using \a \ b\ by (simp add: add.commute add_diff_assoc) - -lemma diff_add_assoc2: - "b + c - a = b - a + c" - using \a \ b\by (simp add: add.commute add_diff_assoc) +lemma add_decreasing2: + "c \ 0 \ a \ b \ a + c \ b" + using add_mono[of a b c 0] by simp -lemma diff_diff_right: - "c - (b - a) = c + a - b" - by (simp add: add_diff_inverse add_diff_cancel_left [of a c "b - a", symmetric] add.commute) - -lemma diff_add: - "b - a + a = b" - by (simp add: add.commute add_diff_inverse) - -lemma le_add_diff: - "c \ b + c - a" - by (auto simp add: add.commute diff_add_assoc2 le_iff_add) - -lemma le_imp_diff_is_add: - "a \ b \ b - a = c \ b = c + a" - by (auto simp add: add.commute add_diff_inverse) +lemma add_pos_nonneg: "0 < a \ 0 \ b \ 0 < a + b" + using less_le_trans[of 0 a "a + b"] by (simp add: add_increasing2) -lemma le_diff_conv2: - "c \ b - a \ c + a \ b" (is "?P \ ?Q") -proof - assume ?P - then have "c + a \ b - a + a" by (rule add_right_mono) - then show ?Q by (simp add: add_diff_inverse add.commute) -next - assume ?Q - then have "a + c \ a + (b - a)" by (simp add: add_diff_inverse add.commute) - then show ?P by simp -qed - -end +lemma add_pos_pos: "0 < a \ 0 < b \ 0 < a + b" + by (intro add_pos_nonneg less_imp_le) -end - -class ordered_cancel_comm_monoid_add = - ordered_comm_monoid_add + cancel_ab_semigroup_add -begin - -subclass ordered_cancel_ab_semigroup_add .. - -lemma add_neg_nonpos: - assumes "a < 0" and "b \ 0" shows "a + b < 0" -proof - - have "a + b < 0 + 0" - using assms by (rule add_less_le_mono) - then show ?thesis by simp -qed +lemma add_nonneg_pos: "0 \ a \ 0 < b \ 0 < a + b" + using add_pos_nonneg[of b a] by (simp add: add_commute) -lemma add_neg_neg: - assumes "a < 0" and "b < 0" shows "a + b < 0" -by (rule add_neg_nonpos) (insert assms, auto) - -lemma add_nonpos_neg: - assumes "a \ 0" and "b < 0" shows "a + b < 0" -proof - - have "a + b < 0 + 0" - using assms by (rule add_le_less_mono) - then show ?thesis by simp -qed +lemma add_neg_nonpos: "a < 0 \ b \ 0 \ a + b < 0" + using le_less_trans[of "a + b" a 0] by (simp add: add_decreasing2) -lemma add_pos_nonneg: - assumes "0 < a" and "0 \ b" shows "0 < a + b" -proof - - have "0 + 0 < a + b" - using assms by (rule add_less_le_mono) - then show ?thesis by simp -qed +lemma add_neg_neg: "a < 0 \ b < 0 \ a + b < 0" + by (intro add_neg_nonpos less_imp_le) -lemma add_pos_pos: - assumes "0 < a" and "0 < b" shows "0 < a + b" -by (rule add_pos_nonneg) (insert assms, auto) - -lemma add_nonneg_pos: - assumes "0 \ a" and "0 < b" shows "0 < a + b" -proof - - have "0 + 0 < a + b" - using assms by (rule add_le_less_mono) - then show ?thesis by simp -qed +lemma add_nonpos_neg: "a \ 0 \ b < 0 \ a + b < 0" + using add_neg_nonpos[of b a] by (simp add: add_commute) lemmas add_sign_intros = add_pos_nonneg add_pos_pos add_nonneg_pos add_nonneg_nonneg add_neg_nonpos add_neg_neg add_nonpos_neg add_nonpos_nonpos +end + +class strict_ordered_comm_monoid_add = comm_monoid_add + strict_ordered_ab_semigroup_add + +class ordered_cancel_comm_monoid_add = ordered_comm_monoid_add + cancel_ab_semigroup_add +begin + +subclass ordered_cancel_ab_semigroup_add .. +subclass strict_ordered_comm_monoid_add .. + lemma add_strict_increasing: "0 < a \ b \ c \ b < a + c" by (insert add_less_le_mono [of 0 a b c], simp) @@ -1409,6 +1303,86 @@ lemmas ab_left_minus = left_minus \ \FIXME duplicate\ lemmas diff_diff_eq = diff_diff_add \ \FIXME duplicate\ +subsection \Canonically ordered monoids\ + +text \Canonically ordered monoids are never groups.\ + +class canonically_ordered_monoid_add = comm_monoid_add + order + + assumes le_iff_add: "a \ b \ (\c. b = a + c)" +begin + +lemma zero_le: "0 \ x" + by (auto simp: le_iff_add) + +subclass ordered_comm_monoid_add + proof qed (auto simp: le_iff_add add_ac) + +lemma add_eq_0_iff_both_eq_0: "x + y = 0 \ x = 0 \ y = 0" + by (intro add_nonneg_eq_0_iff zero_le) + +end + +class ordered_cancel_comm_monoid_diff = + canonically_ordered_monoid_add + comm_monoid_diff + ordered_ab_semigroup_add_imp_le +begin + +context + fixes a b + assumes "a \ b" +begin + +lemma add_diff_inverse: + "a + (b - a) = b" + using \a \ b\ by (auto simp add: le_iff_add) + +lemma add_diff_assoc: + "c + (b - a) = c + b - a" + using \a \ b\ by (auto simp add: le_iff_add add.left_commute [of c]) + +lemma add_diff_assoc2: + "b - a + c = b + c - a" + using \a \ b\ by (auto simp add: le_iff_add add.assoc) + +lemma diff_add_assoc: + "c + b - a = c + (b - a)" + using \a \ b\ by (simp add: add.commute add_diff_assoc) + +lemma diff_add_assoc2: + "b + c - a = b - a + c" + using \a \ b\by (simp add: add.commute add_diff_assoc) + +lemma diff_diff_right: + "c - (b - a) = c + a - b" + by (simp add: add_diff_inverse add_diff_cancel_left [of a c "b - a", symmetric] add.commute) + +lemma diff_add: + "b - a + a = b" + by (simp add: add.commute add_diff_inverse) + +lemma le_add_diff: + "c \ b + c - a" + by (auto simp add: add.commute diff_add_assoc2 le_iff_add) + +lemma le_imp_diff_is_add: + "a \ b \ b - a = c \ b = c + a" + by (auto simp add: add.commute add_diff_inverse) + +lemma le_diff_conv2: + "c \ b - a \ c + a \ b" (is "?P \ ?Q") +proof + assume ?P + then have "c + a \ b - a + a" by (rule add_right_mono) + then show ?Q by (simp add: add_diff_inverse add.commute) +next + assume ?Q + then have "a + c \ a + (b - a)" by (simp add: add_diff_inverse add.commute) + then show ?P by simp +qed + +end + +end + subsection \Tools setup\ lemma add_mono_thms_linordered_semiring: @@ -1433,4 +1407,3 @@ code_module Groups \ (SML) Arith and (OCaml) Arith and (Haskell) Arith end - diff -r 85f38d5f8807 -r ace69956d018 src/HOL/Groups_Big.thy --- a/src/HOL/Groups_Big.thy Wed Feb 10 18:43:19 2016 +0100 +++ b/src/HOL/Groups_Big.thy Fri Feb 12 16:09:07 2016 +0100 @@ -579,7 +579,7 @@ case False then show ?thesis by simp qed -lemma (in ordered_cancel_comm_monoid_add) setsum_strict_mono: +lemma (in strict_ordered_comm_monoid_add) setsum_strict_mono: assumes "finite A" "A \ {}" and "\x. x \ A \ f x < g x" shows "setsum f A < setsum g A" using assms @@ -591,7 +591,7 @@ lemma setsum_strict_mono_ex1: fixes f g :: "'i \ 'a::ordered_cancel_comm_monoid_add" - assumes "finite A" and "ALL x:A. f x \ g x" and "\a\A. f a < g a" + assumes "finite A" and "\x\A. f x \ g x" and "\a\A. f a < g a" shows "setsum f A < setsum g A" proof- from assms(3) obtain a where a: "a:A" "f a < g a" by blast @@ -882,15 +882,17 @@ "(\a. a \ A \ d dvd f a) \ d dvd setsum f A" by (induct A rule: infinite_finite_induct) simp_all -lemma setsum_pos2: - assumes "finite I" "i \ I" "0 < f i" "(\i. i \ I \ 0 \ f i)" - shows "(0::'a::{ordered_ab_group_add,comm_monoid_add}) < setsum f I" +lemma (in ordered_comm_monoid_add) setsum_pos: + "finite I \ I \ {} \ (\i. i \ I \ 0 < f i) \ 0 < setsum f I" + by (induct I rule: finite_ne_induct) (auto intro: add_pos_pos) + +lemma (in ordered_comm_monoid_add) setsum_pos2: + assumes I: "finite I" "i \ I" "0 < f i" "\i. i \ I \ 0 \ f i" + shows "0 < setsum f I" proof - - have "0 \ setsum f (I-{i})" - using assms by (simp add: setsum_nonneg) - also have "... < setsum f (I-{i}) + f i" - using assms by auto - also have "... = setsum f I" + have "0 < f i + setsum f (I - {i})" + using assms by (intro add_pos_nonneg setsum_nonneg) auto + also have "\ = setsum f I" using assms by (simp add: setsum.remove) finally show ?thesis . qed @@ -992,11 +994,6 @@ finally show ?thesis by auto qed -lemma (in ordered_cancel_comm_monoid_add) setsum_pos: - "finite I \ I \ {} \ (\i. i \ I \ 0 < f i) \ 0 < setsum f I" - by (induct I rule: finite_ne_induct) (auto intro: add_pos_pos) - - subsubsection \Cardinality of products\ lemma card_SigmaI [simp]: diff -r 85f38d5f8807 -r ace69956d018 src/HOL/Rings.thy --- a/src/HOL/Rings.thy Wed Feb 10 18:43:19 2016 +0100 +++ b/src/HOL/Rings.thy Fri Feb 12 16:09:07 2016 +0100 @@ -1296,11 +1296,9 @@ end -class ordered_cancel_semiring = ordered_semiring + cancel_comm_monoid_add +class ordered_semiring_0 = semiring_0 + ordered_semiring begin -subclass semiring_0_cancel .. - lemma mult_nonneg_nonneg[simp]: "0 \ a \ 0 \ b \ 0 \ a * b" using mult_left_mono [of 0 b a] by simp @@ -1319,6 +1317,14 @@ end +class ordered_cancel_semiring = ordered_semiring + cancel_comm_monoid_add +begin + +subclass semiring_0_cancel .. +subclass ordered_semiring_0 .. + +end + class linordered_semiring = ordered_semiring + linordered_cancel_ab_semigroup_add begin diff -r 85f38d5f8807 -r ace69956d018 src/HOL/Series.thy --- a/src/HOL/Series.thy Wed Feb 10 18:43:19 2016 +0100 +++ b/src/HOL/Series.thy Fri Feb 12 16:09:07 2016 +0100 @@ -228,6 +228,24 @@ by (auto intro!: antisym) qed (metis suminf_zero fun_eq_iff) +lemma suminf_pos_iff: + "summable f \ \n. 0 \ f n \ 0 < suminf f \ (\i. 0 < f i)" + using setsum_le_suminf[of 0] suminf_eq_zero_iff by (simp add: less_le) + +lemma suminf_pos2: + assumes "summable f" "\n. 0 \ f n" "0 < f i" + shows "0 < suminf f" +proof - + have "0 < (\n \ suminf f" + using assms by (intro setsum_le_suminf) auto + finally show ?thesis . +qed + +lemma suminf_pos: "summable f \ \n. 0 < f n \ 0 < suminf f" + by (intro suminf_pos2[where i=0]) (auto intro: less_imp_le) + end context @@ -244,16 +262,6 @@ lemma setsum_less_suminf: "summable f \ \m\n. 0 < f m \ setsum f {.. \n. 0 \ f n \ 0 < f i \ 0 < suminf f" - using setsum_less_suminf2[of 0 i] by simp - -lemma suminf_pos: "summable f \ \n. 0 < f n \ 0 < suminf f" - using suminf_pos2[of 0] by (simp add: less_imp_le) - -lemma suminf_pos_iff: - "summable f \ \n. 0 \ f n \ 0 < suminf f \ (\i. 0 < f i)" - using setsum_le_suminf[of f 0] suminf_eq_zero_iff[of f] by (simp add: less_le) - end lemma summableI_nonneg_bounded: @@ -261,23 +269,18 @@ assumes pos[simp]: "\n. 0 \ f n" and le: "\n. (\i x" shows "summable f" unfolding summable_def sums_def[abs_def] -proof (intro exI order_tendstoI) - have [simp, intro]: "bdd_above (range (\n. \in. setsum f {..iim. n \ m \ a < (\in. a < (\iin. (\i (SUP n. \in. (\in. setsum f {.. 'a::{canonically_ordered_monoid_add, linorder_topology, complete_linorder}" + shows "summable f" + by (intro summableI_nonneg_bounded[where x=top] zero_le top_greatest) + subsection \Infinite summability on topological monoids\ lemma Zero_notin_Suc: "0 \ Suc ` A"