751 add_neg_nonpos add_neg_neg add_nonpos_neg add_nonpos_nonpos |
751 add_neg_nonpos add_neg_neg add_nonpos_neg add_nonpos_nonpos |
752 |
752 |
753 end |
753 end |
754 |
754 |
755 class strict_ordered_comm_monoid_add = comm_monoid_add + strict_ordered_ab_semigroup_add |
755 class strict_ordered_comm_monoid_add = comm_monoid_add + strict_ordered_ab_semigroup_add |
|
756 begin |
|
757 |
|
758 lemma pos_add_strict: |
|
759 shows "0 < a \<Longrightarrow> b < c \<Longrightarrow> b < a + c" |
|
760 using add_strict_mono [of 0 a b c] by simp |
|
761 |
|
762 end |
756 |
763 |
757 class ordered_cancel_comm_monoid_add = ordered_comm_monoid_add + cancel_ab_semigroup_add |
764 class ordered_cancel_comm_monoid_add = ordered_comm_monoid_add + cancel_ab_semigroup_add |
758 begin |
765 begin |
759 |
766 |
760 subclass ordered_cancel_ab_semigroup_add .. |
767 subclass ordered_cancel_ab_semigroup_add .. |
1309 |
1316 |
1310 class canonically_ordered_monoid_add = comm_monoid_add + order + |
1317 class canonically_ordered_monoid_add = comm_monoid_add + order + |
1311 assumes le_iff_add: "a \<le> b \<longleftrightarrow> (\<exists>c. b = a + c)" |
1318 assumes le_iff_add: "a \<le> b \<longleftrightarrow> (\<exists>c. b = a + c)" |
1312 begin |
1319 begin |
1313 |
1320 |
1314 lemma zero_le: "0 \<le> x" |
1321 lemma zero_le[simp]: "0 \<le> x" |
1315 by (auto simp: le_iff_add) |
1322 by (auto simp: le_iff_add) |
|
1323 |
|
1324 lemma le_zero_eq[simp]: "n \<le> 0 \<longleftrightarrow> n = 0" |
|
1325 by (auto intro: antisym) |
|
1326 |
|
1327 lemma not_less_zero[simp]: "\<not> n < 0" |
|
1328 by (auto simp: less_le) |
|
1329 |
|
1330 lemma zero_less_iff_neq_zero: "(0 < n) \<longleftrightarrow> (n \<noteq> 0)" |
|
1331 by (auto simp: less_le) |
|
1332 |
|
1333 text \<open>This theorem is useful with \<open>blast\<close>\<close> |
|
1334 lemma gr_zeroI: "(n = 0 \<Longrightarrow> False) \<Longrightarrow> 0 < n" |
|
1335 by (rule zero_less_iff_neq_zero[THEN iffD2]) iprover |
|
1336 |
|
1337 lemma not_gr_zero[simp]: "(\<not> (0 < n)) \<longleftrightarrow> (n = 0)" |
|
1338 by (simp add: zero_less_iff_neq_zero) |
1316 |
1339 |
1317 subclass ordered_comm_monoid_add |
1340 subclass ordered_comm_monoid_add |
1318 proof qed (auto simp: le_iff_add add_ac) |
1341 proof qed (auto simp: le_iff_add add_ac) |
1319 |
1342 |
1320 lemma add_eq_0_iff_both_eq_0: "x + y = 0 \<longleftrightarrow> x = 0 \<and> y = 0" |
1343 lemma add_eq_0_iff_both_eq_0: "x + y = 0 \<longleftrightarrow> x = 0 \<and> y = 0" |
1321 by (intro add_nonneg_eq_0_iff zero_le) |
1344 by (intro add_nonneg_eq_0_iff zero_le) |
|
1345 |
|
1346 lemma gr_implies_not_zero: "m < n \<Longrightarrow> n \<noteq> 0" |
|
1347 using add_eq_0_iff_both_eq_0[of m] by (auto simp: le_iff_add less_le) |
|
1348 |
|
1349 lemmas zero_order = zero_le le_zero_eq not_less_zero zero_less_iff_neq_zero not_gr_zero |
|
1350 -- \<open>This should be attributed with \<open>[iff]\<close>, but then \<open>blast\<close> fails in \<open>Set\<close>.\<close> |
1322 |
1351 |
1323 end |
1352 end |
1324 |
1353 |
1325 class ordered_cancel_comm_monoid_diff = |
1354 class ordered_cancel_comm_monoid_diff = |
1326 canonically_ordered_monoid_add + comm_monoid_diff + ordered_ab_semigroup_add_imp_le |
1355 canonically_ordered_monoid_add + comm_monoid_diff + ordered_ab_semigroup_add_imp_le |