| author | blanchet | 
| Wed, 16 Nov 2011 17:59:58 +0100 | |
| changeset 45524 | 43ca06e6c168 | 
| parent 44921 | 58eef4843641 | 
| child 49962 | a8cc904a6820 | 
| permissions | -rw-r--r-- | 
| 
35050
 
9f841f20dca6
renamed OrderedGroup to Groups; split theory Ring_and_Field into Rings Fields
 
haftmann 
parents: 
35043 
diff
changeset
 | 
1  | 
(* Title: HOL/Rings.thy  | 
| 
32960
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
30961 
diff
changeset
 | 
2  | 
Author: Gertrud Bauer  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
30961 
diff
changeset
 | 
3  | 
Author: Steven Obua  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
30961 
diff
changeset
 | 
4  | 
Author: Tobias Nipkow  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
30961 
diff
changeset
 | 
5  | 
Author: Lawrence C Paulson  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
30961 
diff
changeset
 | 
6  | 
Author: Markus Wenzel  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
30961 
diff
changeset
 | 
7  | 
Author: Jeremy Avigad  | 
| 
14265
 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 
paulson 
parents:  
diff
changeset
 | 
8  | 
*)  | 
| 
 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 
paulson 
parents:  
diff
changeset
 | 
9  | 
|
| 
35050
 
9f841f20dca6
renamed OrderedGroup to Groups; split theory Ring_and_Field into Rings Fields
 
haftmann 
parents: 
35043 
diff
changeset
 | 
10  | 
header {* Rings *}
 | 
| 
14265
 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 
paulson 
parents:  
diff
changeset
 | 
11  | 
|
| 
35050
 
9f841f20dca6
renamed OrderedGroup to Groups; split theory Ring_and_Field into Rings Fields
 
haftmann 
parents: 
35043 
diff
changeset
 | 
12  | 
theory Rings  | 
| 
 
9f841f20dca6
renamed OrderedGroup to Groups; split theory Ring_and_Field into Rings Fields
 
haftmann 
parents: 
35043 
diff
changeset
 | 
13  | 
imports Groups  | 
| 15131 | 14  | 
begin  | 
| 14504 | 15  | 
|
| 22390 | 16  | 
class semiring = ab_semigroup_add + semigroup_mult +  | 
| 
36348
 
89c54f51f55a
dropped group_simps, ring_simps, field_eq_simps; classes division_ring_inverse_zero, field_inverse_zero, linordered_field_inverse_zero
 
haftmann 
parents: 
36304 
diff
changeset
 | 
17  | 
assumes left_distrib[algebra_simps, field_simps]: "(a + b) * c = a * c + b * c"  | 
| 
 
89c54f51f55a
dropped group_simps, ring_simps, field_eq_simps; classes division_ring_inverse_zero, field_inverse_zero, linordered_field_inverse_zero
 
haftmann 
parents: 
36304 
diff
changeset
 | 
18  | 
assumes right_distrib[algebra_simps, field_simps]: "a * (b + c) = a * b + a * c"  | 
| 25152 | 19  | 
begin  | 
20  | 
||
21  | 
text{*For the @{text combine_numerals} simproc*}
 | 
|
22  | 
lemma combine_common_factor:  | 
|
23  | 
"a * e + (b * e + c) = (a + b) * e + c"  | 
|
| 29667 | 24  | 
by (simp add: left_distrib add_ac)  | 
| 25152 | 25  | 
|
26  | 
end  | 
|
| 14504 | 27  | 
|
| 22390 | 28  | 
class mult_zero = times + zero +  | 
| 25062 | 29  | 
assumes mult_zero_left [simp]: "0 * a = 0"  | 
30  | 
assumes mult_zero_right [simp]: "a * 0 = 0"  | 
|
| 
21199
 
2d83f93c3580
* Added annihilation axioms ("x * 0 = 0") to axclass semiring_0.
 
krauss 
parents: 
20633 
diff
changeset
 | 
31  | 
|
| 22390 | 32  | 
class semiring_0 = semiring + comm_monoid_add + mult_zero  | 
| 
21199
 
2d83f93c3580
* Added annihilation axioms ("x * 0 = 0") to axclass semiring_0.
 
krauss 
parents: 
20633 
diff
changeset
 | 
33  | 
|
| 29904 | 34  | 
class semiring_0_cancel = semiring + cancel_comm_monoid_add  | 
| 25186 | 35  | 
begin  | 
| 14504 | 36  | 
|
| 25186 | 37  | 
subclass semiring_0  | 
| 28823 | 38  | 
proof  | 
| 
21199
 
2d83f93c3580
* Added annihilation axioms ("x * 0 = 0") to axclass semiring_0.
 
krauss 
parents: 
20633 
diff
changeset
 | 
39  | 
fix a :: 'a  | 
| 29667 | 40  | 
have "0 * a + 0 * a = 0 * a + 0" by (simp add: left_distrib [symmetric])  | 
41  | 
thus "0 * a = 0" by (simp only: add_left_cancel)  | 
|
| 25152 | 42  | 
next  | 
43  | 
fix a :: 'a  | 
|
| 29667 | 44  | 
have "a * 0 + a * 0 = a * 0 + 0" by (simp add: right_distrib [symmetric])  | 
45  | 
thus "a * 0 = 0" by (simp only: add_left_cancel)  | 
|
| 
21199
 
2d83f93c3580
* Added annihilation axioms ("x * 0 = 0") to axclass semiring_0.
 
krauss 
parents: 
20633 
diff
changeset
 | 
46  | 
qed  | 
| 14940 | 47  | 
|
| 25186 | 48  | 
end  | 
| 25152 | 49  | 
|
| 22390 | 50  | 
class comm_semiring = ab_semigroup_add + ab_semigroup_mult +  | 
| 25062 | 51  | 
assumes distrib: "(a + b) * c = a * c + b * c"  | 
| 25152 | 52  | 
begin  | 
| 14504 | 53  | 
|
| 25152 | 54  | 
subclass semiring  | 
| 28823 | 55  | 
proof  | 
| 14738 | 56  | 
fix a b c :: 'a  | 
57  | 
show "(a + b) * c = a * c + b * c" by (simp add: distrib)  | 
|
58  | 
have "a * (b + c) = (b + c) * a" by (simp add: mult_ac)  | 
|
59  | 
also have "... = b * a + c * a" by (simp only: distrib)  | 
|
60  | 
also have "... = a * b + a * c" by (simp add: mult_ac)  | 
|
61  | 
finally show "a * (b + c) = a * b + a * c" by blast  | 
|
| 14504 | 62  | 
qed  | 
63  | 
||
| 25152 | 64  | 
end  | 
| 14504 | 65  | 
|
| 25152 | 66  | 
class comm_semiring_0 = comm_semiring + comm_monoid_add + mult_zero  | 
67  | 
begin  | 
|
68  | 
||
| 27516 | 69  | 
subclass semiring_0 ..  | 
| 25152 | 70  | 
|
71  | 
end  | 
|
| 14504 | 72  | 
|
| 29904 | 73  | 
class comm_semiring_0_cancel = comm_semiring + cancel_comm_monoid_add  | 
| 25186 | 74  | 
begin  | 
| 14940 | 75  | 
|
| 27516 | 76  | 
subclass semiring_0_cancel ..  | 
| 14940 | 77  | 
|
| 
28141
 
193c3ea0f63b
instances comm_semiring_0_cancel < comm_semiring_0, comm_ring < comm_semiring_0_cancel
 
huffman 
parents: 
27651 
diff
changeset
 | 
78  | 
subclass comm_semiring_0 ..  | 
| 
 
193c3ea0f63b
instances comm_semiring_0_cancel < comm_semiring_0, comm_ring < comm_semiring_0_cancel
 
huffman 
parents: 
27651 
diff
changeset
 | 
79  | 
|
| 25186 | 80  | 
end  | 
| 
21199
 
2d83f93c3580
* Added annihilation axioms ("x * 0 = 0") to axclass semiring_0.
 
krauss 
parents: 
20633 
diff
changeset
 | 
81  | 
|
| 22390 | 82  | 
class zero_neq_one = zero + one +  | 
| 25062 | 83  | 
assumes zero_neq_one [simp]: "0 \<noteq> 1"  | 
| 26193 | 84  | 
begin  | 
85  | 
||
86  | 
lemma one_neq_zero [simp]: "1 \<noteq> 0"  | 
|
| 29667 | 87  | 
by (rule not_sym) (rule zero_neq_one)  | 
| 26193 | 88  | 
|
89  | 
end  | 
|
| 
14265
 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 
paulson 
parents:  
diff
changeset
 | 
90  | 
|
| 22390 | 91  | 
class semiring_1 = zero_neq_one + semiring_0 + monoid_mult  | 
| 14504 | 92  | 
|
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
93  | 
text {* Abstract divisibility *}
 | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
94  | 
|
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
95  | 
class dvd = times  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
96  | 
begin  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
97  | 
|
| 28559 | 98  | 
definition dvd :: "'a \<Rightarrow> 'a \<Rightarrow> bool" (infixl "dvd" 50) where  | 
| 37767 | 99  | 
"b dvd a \<longleftrightarrow> (\<exists>k. a = b * k)"  | 
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
100  | 
|
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
101  | 
lemma dvdI [intro?]: "a = b * k \<Longrightarrow> b dvd a"  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
102  | 
unfolding dvd_def ..  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
103  | 
|
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
104  | 
lemma dvdE [elim?]: "b dvd a \<Longrightarrow> (\<And>k. a = b * k \<Longrightarrow> P) \<Longrightarrow> P"  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
105  | 
unfolding dvd_def by blast  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
106  | 
|
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
107  | 
end  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
108  | 
|
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
109  | 
class comm_semiring_1 = zero_neq_one + comm_semiring_0 + comm_monoid_mult + dvd  | 
| 22390 | 110  | 
(*previously almost_semiring*)  | 
| 25152 | 111  | 
begin  | 
| 14738 | 112  | 
|
| 27516 | 113  | 
subclass semiring_1 ..  | 
| 25152 | 114  | 
|
| 29925 | 115  | 
lemma dvd_refl[simp]: "a dvd a"  | 
| 28559 | 116  | 
proof  | 
117  | 
show "a = a * 1" by simp  | 
|
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
118  | 
qed  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
119  | 
|
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
120  | 
lemma dvd_trans:  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
121  | 
assumes "a dvd b" and "b dvd c"  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
122  | 
shows "a dvd c"  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
123  | 
proof -  | 
| 28559 | 124  | 
from assms obtain v where "b = a * v" by (auto elim!: dvdE)  | 
125  | 
moreover from assms obtain w where "c = b * w" by (auto elim!: dvdE)  | 
|
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
126  | 
ultimately have "c = a * (v * w)" by (simp add: mult_assoc)  | 
| 28559 | 127  | 
then show ?thesis ..  | 
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
128  | 
qed  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
129  | 
|
| 
35828
 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 
blanchet 
parents: 
35631 
diff
changeset
 | 
130  | 
lemma dvd_0_left_iff [no_atp, simp]: "0 dvd a \<longleftrightarrow> a = 0"  | 
| 29667 | 131  | 
by (auto intro: dvd_refl elim!: dvdE)  | 
| 28559 | 132  | 
|
133  | 
lemma dvd_0_right [iff]: "a dvd 0"  | 
|
134  | 
proof  | 
|
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
135  | 
show "0 = a * 0" by simp  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
136  | 
qed  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
137  | 
|
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
138  | 
lemma one_dvd [simp]: "1 dvd a"  | 
| 29667 | 139  | 
by (auto intro!: dvdI)  | 
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
140  | 
|
| 30042 | 141  | 
lemma dvd_mult[simp]: "a dvd c \<Longrightarrow> a dvd (b * c)"  | 
| 29667 | 142  | 
by (auto intro!: mult_left_commute dvdI elim!: dvdE)  | 
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
143  | 
|
| 30042 | 144  | 
lemma dvd_mult2[simp]: "a dvd b \<Longrightarrow> a dvd (b * c)"  | 
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
145  | 
apply (subst mult_commute)  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
146  | 
apply (erule dvd_mult)  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
147  | 
done  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
148  | 
|
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
149  | 
lemma dvd_triv_right [simp]: "a dvd b * a"  | 
| 29667 | 150  | 
by (rule dvd_mult) (rule dvd_refl)  | 
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
151  | 
|
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
152  | 
lemma dvd_triv_left [simp]: "a dvd a * b"  | 
| 29667 | 153  | 
by (rule dvd_mult2) (rule dvd_refl)  | 
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
154  | 
|
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
155  | 
lemma mult_dvd_mono:  | 
| 30042 | 156  | 
assumes "a dvd b"  | 
157  | 
and "c dvd d"  | 
|
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
158  | 
shows "a * c dvd b * d"  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
159  | 
proof -  | 
| 30042 | 160  | 
from `a dvd b` obtain b' where "b = a * b'" ..  | 
161  | 
moreover from `c dvd d` obtain d' where "d = c * d'" ..  | 
|
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
162  | 
ultimately have "b * d = (a * c) * (b' * d')" by (simp add: mult_ac)  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
163  | 
then show ?thesis ..  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
164  | 
qed  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
165  | 
|
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
166  | 
lemma dvd_mult_left: "a * b dvd c \<Longrightarrow> a dvd c"  | 
| 29667 | 167  | 
by (simp add: dvd_def mult_assoc, blast)  | 
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
168  | 
|
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
169  | 
lemma dvd_mult_right: "a * b dvd c \<Longrightarrow> b dvd c"  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
170  | 
unfolding mult_ac [of a] by (rule dvd_mult_left)  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
171  | 
|
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
172  | 
lemma dvd_0_left: "0 dvd a \<Longrightarrow> a = 0"  | 
| 29667 | 173  | 
by simp  | 
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
174  | 
|
| 29925 | 175  | 
lemma dvd_add[simp]:  | 
176  | 
assumes "a dvd b" and "a dvd c" shows "a dvd (b + c)"  | 
|
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
177  | 
proof -  | 
| 29925 | 178  | 
from `a dvd b` obtain b' where "b = a * b'" ..  | 
179  | 
moreover from `a dvd c` obtain c' where "c = a * c'" ..  | 
|
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
180  | 
ultimately have "b + c = a * (b' + c')" by (simp add: right_distrib)  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
181  | 
then show ?thesis ..  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
182  | 
qed  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
183  | 
|
| 25152 | 184  | 
end  | 
| 
14421
 
ee97b6463cb4
new Ring_and_Field hierarchy, eliminating redundant axioms
 
paulson 
parents: 
14398 
diff
changeset
 | 
185  | 
|
| 22390 | 186  | 
class no_zero_divisors = zero + times +  | 
| 25062 | 187  | 
assumes no_zero_divisors: "a \<noteq> 0 \<Longrightarrow> b \<noteq> 0 \<Longrightarrow> a * b \<noteq> 0"  | 
| 36719 | 188  | 
begin  | 
189  | 
||
190  | 
lemma divisors_zero:  | 
|
191  | 
assumes "a * b = 0"  | 
|
192  | 
shows "a = 0 \<or> b = 0"  | 
|
193  | 
proof (rule classical)  | 
|
194  | 
assume "\<not> (a = 0 \<or> b = 0)"  | 
|
195  | 
then have "a \<noteq> 0" and "b \<noteq> 0" by auto  | 
|
196  | 
with no_zero_divisors have "a * b \<noteq> 0" by blast  | 
|
197  | 
with assms show ?thesis by simp  | 
|
198  | 
qed  | 
|
199  | 
||
200  | 
end  | 
|
| 14504 | 201  | 
|
| 29904 | 202  | 
class semiring_1_cancel = semiring + cancel_comm_monoid_add  | 
203  | 
+ zero_neq_one + monoid_mult  | 
|
| 25267 | 204  | 
begin  | 
| 14940 | 205  | 
|
| 27516 | 206  | 
subclass semiring_0_cancel ..  | 
| 
25512
 
4134f7c782e2
using intro_locales instead of unfold_locales if appropriate
 
haftmann 
parents: 
25450 
diff
changeset
 | 
207  | 
|
| 27516 | 208  | 
subclass semiring_1 ..  | 
| 25267 | 209  | 
|
210  | 
end  | 
|
| 
21199
 
2d83f93c3580
* Added annihilation axioms ("x * 0 = 0") to axclass semiring_0.
 
krauss 
parents: 
20633 
diff
changeset
 | 
211  | 
|
| 29904 | 212  | 
class comm_semiring_1_cancel = comm_semiring + cancel_comm_monoid_add  | 
213  | 
+ zero_neq_one + comm_monoid_mult  | 
|
| 25267 | 214  | 
begin  | 
| 14738 | 215  | 
|
| 27516 | 216  | 
subclass semiring_1_cancel ..  | 
217  | 
subclass comm_semiring_0_cancel ..  | 
|
218  | 
subclass comm_semiring_1 ..  | 
|
| 25267 | 219  | 
|
220  | 
end  | 
|
| 25152 | 221  | 
|
| 22390 | 222  | 
class ring = semiring + ab_group_add  | 
| 25267 | 223  | 
begin  | 
| 25152 | 224  | 
|
| 27516 | 225  | 
subclass semiring_0_cancel ..  | 
| 25152 | 226  | 
|
227  | 
text {* Distribution rules *}
 | 
|
228  | 
||
229  | 
lemma minus_mult_left: "- (a * b) = - a * b"  | 
|
| 
34146
 
14595e0c27e8
rename equals_zero_I to minus_unique (keep old name too)
 
huffman 
parents: 
33676 
diff
changeset
 | 
230  | 
by (rule minus_unique) (simp add: left_distrib [symmetric])  | 
| 25152 | 231  | 
|
232  | 
lemma minus_mult_right: "- (a * b) = a * - b"  | 
|
| 
34146
 
14595e0c27e8
rename equals_zero_I to minus_unique (keep old name too)
 
huffman 
parents: 
33676 
diff
changeset
 | 
233  | 
by (rule minus_unique) (simp add: right_distrib [symmetric])  | 
| 25152 | 234  | 
|
| 
29407
 
5ef7e97fd9e4
move lemmas mult_minus{left,right} inside class ring
 
huffman 
parents: 
29406 
diff
changeset
 | 
235  | 
text{*Extract signs from products*}
 | 
| 
35828
 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 
blanchet 
parents: 
35631 
diff
changeset
 | 
236  | 
lemmas mult_minus_left [simp, no_atp] = minus_mult_left [symmetric]  | 
| 
 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 
blanchet 
parents: 
35631 
diff
changeset
 | 
237  | 
lemmas mult_minus_right [simp,no_atp] = minus_mult_right [symmetric]  | 
| 
29407
 
5ef7e97fd9e4
move lemmas mult_minus{left,right} inside class ring
 
huffman 
parents: 
29406 
diff
changeset
 | 
238  | 
|
| 25152 | 239  | 
lemma minus_mult_minus [simp]: "- a * - b = a * b"  | 
| 29667 | 240  | 
by simp  | 
| 25152 | 241  | 
|
242  | 
lemma minus_mult_commute: "- a * b = a * - b"  | 
|
| 29667 | 243  | 
by simp  | 
244  | 
||
| 
36348
 
89c54f51f55a
dropped group_simps, ring_simps, field_eq_simps; classes division_ring_inverse_zero, field_inverse_zero, linordered_field_inverse_zero
 
haftmann 
parents: 
36304 
diff
changeset
 | 
245  | 
lemma right_diff_distrib[algebra_simps, field_simps]: "a * (b - c) = a * b - a * c"  | 
| 29667 | 246  | 
by (simp add: right_distrib diff_minus)  | 
247  | 
||
| 
36348
 
89c54f51f55a
dropped group_simps, ring_simps, field_eq_simps; classes division_ring_inverse_zero, field_inverse_zero, linordered_field_inverse_zero
 
haftmann 
parents: 
36304 
diff
changeset
 | 
248  | 
lemma left_diff_distrib[algebra_simps, field_simps]: "(a - b) * c = a * c - b * c"  | 
| 29667 | 249  | 
by (simp add: left_distrib diff_minus)  | 
| 25152 | 250  | 
|
| 
35828
 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 
blanchet 
parents: 
35631 
diff
changeset
 | 
251  | 
lemmas ring_distribs[no_atp] =  | 
| 25152 | 252  | 
right_distrib left_distrib left_diff_distrib right_diff_distrib  | 
253  | 
||
| 25230 | 254  | 
lemma eq_add_iff1:  | 
255  | 
"a * e + c = b * e + d \<longleftrightarrow> (a - b) * e + c = d"  | 
|
| 29667 | 256  | 
by (simp add: algebra_simps)  | 
| 25230 | 257  | 
|
258  | 
lemma eq_add_iff2:  | 
|
259  | 
"a * e + c = b * e + d \<longleftrightarrow> c = (b - a) * e + d"  | 
|
| 29667 | 260  | 
by (simp add: algebra_simps)  | 
| 25230 | 261  | 
|
| 25152 | 262  | 
end  | 
263  | 
||
| 
35828
 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 
blanchet 
parents: 
35631 
diff
changeset
 | 
264  | 
lemmas ring_distribs[no_atp] =  | 
| 25152 | 265  | 
right_distrib left_distrib left_diff_distrib right_diff_distrib  | 
266  | 
||
| 22390 | 267  | 
class comm_ring = comm_semiring + ab_group_add  | 
| 25267 | 268  | 
begin  | 
| 14738 | 269  | 
|
| 27516 | 270  | 
subclass ring ..  | 
| 
28141
 
193c3ea0f63b
instances comm_semiring_0_cancel < comm_semiring_0, comm_ring < comm_semiring_0_cancel
 
huffman 
parents: 
27651 
diff
changeset
 | 
271  | 
subclass comm_semiring_0_cancel ..  | 
| 25267 | 272  | 
|
| 
44350
 
63cddfbc5a09
replace lemma realpow_two_diff with new lemma square_diff_square_factored
 
huffman 
parents: 
44346 
diff
changeset
 | 
273  | 
lemma square_diff_square_factored:  | 
| 
 
63cddfbc5a09
replace lemma realpow_two_diff with new lemma square_diff_square_factored
 
huffman 
parents: 
44346 
diff
changeset
 | 
274  | 
"x * x - y * y = (x + y) * (x - y)"  | 
| 
 
63cddfbc5a09
replace lemma realpow_two_diff with new lemma square_diff_square_factored
 
huffman 
parents: 
44346 
diff
changeset
 | 
275  | 
by (simp add: algebra_simps)  | 
| 
 
63cddfbc5a09
replace lemma realpow_two_diff with new lemma square_diff_square_factored
 
huffman 
parents: 
44346 
diff
changeset
 | 
276  | 
|
| 25267 | 277  | 
end  | 
| 14738 | 278  | 
|
| 22390 | 279  | 
class ring_1 = ring + zero_neq_one + monoid_mult  | 
| 25267 | 280  | 
begin  | 
| 
14265
 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 
paulson 
parents:  
diff
changeset
 | 
281  | 
|
| 27516 | 282  | 
subclass semiring_1_cancel ..  | 
| 25267 | 283  | 
|
| 
44346
 
00dd3c4dabe0
rename real_squared_diff_one_factored to square_diff_one_factored and move to Rings.thy
 
huffman 
parents: 
44064 
diff
changeset
 | 
284  | 
lemma square_diff_one_factored:  | 
| 
 
00dd3c4dabe0
rename real_squared_diff_one_factored to square_diff_one_factored and move to Rings.thy
 
huffman 
parents: 
44064 
diff
changeset
 | 
285  | 
"x * x - 1 = (x + 1) * (x - 1)"  | 
| 
 
00dd3c4dabe0
rename real_squared_diff_one_factored to square_diff_one_factored and move to Rings.thy
 
huffman 
parents: 
44064 
diff
changeset
 | 
286  | 
by (simp add: algebra_simps)  | 
| 
 
00dd3c4dabe0
rename real_squared_diff_one_factored to square_diff_one_factored and move to Rings.thy
 
huffman 
parents: 
44064 
diff
changeset
 | 
287  | 
|
| 25267 | 288  | 
end  | 
| 25152 | 289  | 
|
| 22390 | 290  | 
class comm_ring_1 = comm_ring + zero_neq_one + comm_monoid_mult  | 
291  | 
(*previously ring*)  | 
|
| 25267 | 292  | 
begin  | 
| 14738 | 293  | 
|
| 27516 | 294  | 
subclass ring_1 ..  | 
295  | 
subclass comm_semiring_1_cancel ..  | 
|
| 25267 | 296  | 
|
| 
29465
 
b2cfb5d0a59e
change dvd_minus_iff, minus_dvd_iff from [iff] to [simp] (due to problems with Library/Primes.thy)
 
huffman 
parents: 
29461 
diff
changeset
 | 
297  | 
lemma dvd_minus_iff [simp]: "x dvd - y \<longleftrightarrow> x dvd y"  | 
| 
29408
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
298  | 
proof  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
299  | 
assume "x dvd - y"  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
300  | 
then have "x dvd - 1 * - y" by (rule dvd_mult)  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
301  | 
then show "x dvd y" by simp  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
302  | 
next  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
303  | 
assume "x dvd y"  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
304  | 
then have "x dvd - 1 * y" by (rule dvd_mult)  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
305  | 
then show "x dvd - y" by simp  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
306  | 
qed  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
307  | 
|
| 
29465
 
b2cfb5d0a59e
change dvd_minus_iff, minus_dvd_iff from [iff] to [simp] (due to problems with Library/Primes.thy)
 
huffman 
parents: 
29461 
diff
changeset
 | 
308  | 
lemma minus_dvd_iff [simp]: "- x dvd y \<longleftrightarrow> x dvd y"  | 
| 
29408
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
309  | 
proof  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
310  | 
assume "- x dvd y"  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
311  | 
then obtain k where "y = - x * k" ..  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
312  | 
then have "y = x * - k" by simp  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
313  | 
then show "x dvd y" ..  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
314  | 
next  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
315  | 
assume "x dvd y"  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
316  | 
then obtain k where "y = x * k" ..  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
317  | 
then have "y = - x * - k" by simp  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
318  | 
then show "- x dvd y" ..  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
319  | 
qed  | 
| 
 
6d10cf26b5dc
add lemmas dvd_minus_iff and minus_dvd_iff in class comm_ring_1
 
huffman 
parents: 
29407 
diff
changeset
 | 
320  | 
|
| 30042 | 321  | 
lemma dvd_diff[simp]: "x dvd y \<Longrightarrow> x dvd z \<Longrightarrow> x dvd (y - z)"  | 
| 35216 | 322  | 
by (simp only: diff_minus dvd_add dvd_minus_iff)  | 
| 29409 | 323  | 
|
| 25267 | 324  | 
end  | 
| 25152 | 325  | 
|
| 
22990
 
775e9de3db48
added classes ring_no_zero_divisors and dom (non-commutative version of idom);
 
huffman 
parents: 
22987 
diff
changeset
 | 
326  | 
class ring_no_zero_divisors = ring + no_zero_divisors  | 
| 25230 | 327  | 
begin  | 
328  | 
||
329  | 
lemma mult_eq_0_iff [simp]:  | 
|
330  | 
shows "a * b = 0 \<longleftrightarrow> (a = 0 \<or> b = 0)"  | 
|
331  | 
proof (cases "a = 0 \<or> b = 0")  | 
|
332  | 
case False then have "a \<noteq> 0" and "b \<noteq> 0" by auto  | 
|
333  | 
then show ?thesis using no_zero_divisors by simp  | 
|
334  | 
next  | 
|
335  | 
case True then show ?thesis by auto  | 
|
336  | 
qed  | 
|
337  | 
||
| 26193 | 338  | 
text{*Cancellation of equalities with a common factor*}
 | 
| 
35828
 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 
blanchet 
parents: 
35631 
diff
changeset
 | 
339  | 
lemma mult_cancel_right [simp, no_atp]:  | 
| 26193 | 340  | 
"a * c = b * c \<longleftrightarrow> c = 0 \<or> a = b"  | 
341  | 
proof -  | 
|
342  | 
have "(a * c = b * c) = ((a - b) * c = 0)"  | 
|
| 35216 | 343  | 
by (simp add: algebra_simps)  | 
344  | 
thus ?thesis by (simp add: disj_commute)  | 
|
| 26193 | 345  | 
qed  | 
346  | 
||
| 
35828
 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 
blanchet 
parents: 
35631 
diff
changeset
 | 
347  | 
lemma mult_cancel_left [simp, no_atp]:  | 
| 26193 | 348  | 
"c * a = c * b \<longleftrightarrow> c = 0 \<or> a = b"  | 
349  | 
proof -  | 
|
350  | 
have "(c * a = c * b) = (c * (a - b) = 0)"  | 
|
| 35216 | 351  | 
by (simp add: algebra_simps)  | 
352  | 
thus ?thesis by simp  | 
|
| 26193 | 353  | 
qed  | 
354  | 
||
| 25230 | 355  | 
end  | 
| 
22990
 
775e9de3db48
added classes ring_no_zero_divisors and dom (non-commutative version of idom);
 
huffman 
parents: 
22987 
diff
changeset
 | 
356  | 
|
| 23544 | 357  | 
class ring_1_no_zero_divisors = ring_1 + ring_no_zero_divisors  | 
| 26274 | 358  | 
begin  | 
359  | 
||
| 36970 | 360  | 
lemma square_eq_1_iff:  | 
| 
36821
 
9207505d1ee5
move lemma real_mult_is_one to Rings.thy, renamed to square_eq_1_iff
 
huffman 
parents: 
36719 
diff
changeset
 | 
361  | 
"x * x = 1 \<longleftrightarrow> x = 1 \<or> x = - 1"  | 
| 
 
9207505d1ee5
move lemma real_mult_is_one to Rings.thy, renamed to square_eq_1_iff
 
huffman 
parents: 
36719 
diff
changeset
 | 
362  | 
proof -  | 
| 
 
9207505d1ee5
move lemma real_mult_is_one to Rings.thy, renamed to square_eq_1_iff
 
huffman 
parents: 
36719 
diff
changeset
 | 
363  | 
have "(x - 1) * (x + 1) = x * x - 1"  | 
| 
 
9207505d1ee5
move lemma real_mult_is_one to Rings.thy, renamed to square_eq_1_iff
 
huffman 
parents: 
36719 
diff
changeset
 | 
364  | 
by (simp add: algebra_simps)  | 
| 
 
9207505d1ee5
move lemma real_mult_is_one to Rings.thy, renamed to square_eq_1_iff
 
huffman 
parents: 
36719 
diff
changeset
 | 
365  | 
hence "x * x = 1 \<longleftrightarrow> (x - 1) * (x + 1) = 0"  | 
| 
 
9207505d1ee5
move lemma real_mult_is_one to Rings.thy, renamed to square_eq_1_iff
 
huffman 
parents: 
36719 
diff
changeset
 | 
366  | 
by simp  | 
| 
 
9207505d1ee5
move lemma real_mult_is_one to Rings.thy, renamed to square_eq_1_iff
 
huffman 
parents: 
36719 
diff
changeset
 | 
367  | 
thus ?thesis  | 
| 
 
9207505d1ee5
move lemma real_mult_is_one to Rings.thy, renamed to square_eq_1_iff
 
huffman 
parents: 
36719 
diff
changeset
 | 
368  | 
by (simp add: eq_neg_iff_add_eq_0)  | 
| 
 
9207505d1ee5
move lemma real_mult_is_one to Rings.thy, renamed to square_eq_1_iff
 
huffman 
parents: 
36719 
diff
changeset
 | 
369  | 
qed  | 
| 
 
9207505d1ee5
move lemma real_mult_is_one to Rings.thy, renamed to square_eq_1_iff
 
huffman 
parents: 
36719 
diff
changeset
 | 
370  | 
|
| 26274 | 371  | 
lemma mult_cancel_right1 [simp]:  | 
372  | 
"c = b * c \<longleftrightarrow> c = 0 \<or> b = 1"  | 
|
| 29667 | 373  | 
by (insert mult_cancel_right [of 1 c b], force)  | 
| 26274 | 374  | 
|
375  | 
lemma mult_cancel_right2 [simp]:  | 
|
376  | 
"a * c = c \<longleftrightarrow> c = 0 \<or> a = 1"  | 
|
| 29667 | 377  | 
by (insert mult_cancel_right [of a c 1], simp)  | 
| 26274 | 378  | 
|
379  | 
lemma mult_cancel_left1 [simp]:  | 
|
380  | 
"c = c * b \<longleftrightarrow> c = 0 \<or> b = 1"  | 
|
| 29667 | 381  | 
by (insert mult_cancel_left [of c 1 b], force)  | 
| 26274 | 382  | 
|
383  | 
lemma mult_cancel_left2 [simp]:  | 
|
384  | 
"c * a = c \<longleftrightarrow> c = 0 \<or> a = 1"  | 
|
| 29667 | 385  | 
by (insert mult_cancel_left [of c a 1], simp)  | 
| 26274 | 386  | 
|
387  | 
end  | 
|
| 
22990
 
775e9de3db48
added classes ring_no_zero_divisors and dom (non-commutative version of idom);
 
huffman 
parents: 
22987 
diff
changeset
 | 
388  | 
|
| 22390 | 389  | 
class idom = comm_ring_1 + no_zero_divisors  | 
| 25186 | 390  | 
begin  | 
| 
14421
 
ee97b6463cb4
new Ring_and_Field hierarchy, eliminating redundant axioms
 
paulson 
parents: 
14398 
diff
changeset
 | 
391  | 
|
| 27516 | 392  | 
subclass ring_1_no_zero_divisors ..  | 
| 
22990
 
775e9de3db48
added classes ring_no_zero_divisors and dom (non-commutative version of idom);
 
huffman 
parents: 
22987 
diff
changeset
 | 
393  | 
|
| 
29915
 
2146e512cec9
generalize lemma fps_square_eq_iff, move to Ring_and_Field
 
huffman 
parents: 
29904 
diff
changeset
 | 
394  | 
lemma square_eq_iff: "a * a = b * b \<longleftrightarrow> (a = b \<or> a = - b)"  | 
| 
 
2146e512cec9
generalize lemma fps_square_eq_iff, move to Ring_and_Field
 
huffman 
parents: 
29904 
diff
changeset
 | 
395  | 
proof  | 
| 
 
2146e512cec9
generalize lemma fps_square_eq_iff, move to Ring_and_Field
 
huffman 
parents: 
29904 
diff
changeset
 | 
396  | 
assume "a * a = b * b"  | 
| 
 
2146e512cec9
generalize lemma fps_square_eq_iff, move to Ring_and_Field
 
huffman 
parents: 
29904 
diff
changeset
 | 
397  | 
then have "(a - b) * (a + b) = 0"  | 
| 
 
2146e512cec9
generalize lemma fps_square_eq_iff, move to Ring_and_Field
 
huffman 
parents: 
29904 
diff
changeset
 | 
398  | 
by (simp add: algebra_simps)  | 
| 
 
2146e512cec9
generalize lemma fps_square_eq_iff, move to Ring_and_Field
 
huffman 
parents: 
29904 
diff
changeset
 | 
399  | 
then show "a = b \<or> a = - b"  | 
| 35216 | 400  | 
by (simp add: eq_neg_iff_add_eq_0)  | 
| 
29915
 
2146e512cec9
generalize lemma fps_square_eq_iff, move to Ring_and_Field
 
huffman 
parents: 
29904 
diff
changeset
 | 
401  | 
next  | 
| 
 
2146e512cec9
generalize lemma fps_square_eq_iff, move to Ring_and_Field
 
huffman 
parents: 
29904 
diff
changeset
 | 
402  | 
assume "a = b \<or> a = - b"  | 
| 
 
2146e512cec9
generalize lemma fps_square_eq_iff, move to Ring_and_Field
 
huffman 
parents: 
29904 
diff
changeset
 | 
403  | 
then show "a * a = b * b" by auto  | 
| 
 
2146e512cec9
generalize lemma fps_square_eq_iff, move to Ring_and_Field
 
huffman 
parents: 
29904 
diff
changeset
 | 
404  | 
qed  | 
| 
 
2146e512cec9
generalize lemma fps_square_eq_iff, move to Ring_and_Field
 
huffman 
parents: 
29904 
diff
changeset
 | 
405  | 
|
| 
29981
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
406  | 
lemma dvd_mult_cancel_right [simp]:  | 
| 
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
407  | 
"a * c dvd b * c \<longleftrightarrow> c = 0 \<or> a dvd b"  | 
| 
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
408  | 
proof -  | 
| 
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
409  | 
have "a * c dvd b * c \<longleftrightarrow> (\<exists>k. b * c = (a * k) * c)"  | 
| 
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
410  | 
unfolding dvd_def by (simp add: mult_ac)  | 
| 
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
411  | 
also have "(\<exists>k. b * c = (a * k) * c) \<longleftrightarrow> c = 0 \<or> a dvd b"  | 
| 
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
412  | 
unfolding dvd_def by simp  | 
| 
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
413  | 
finally show ?thesis .  | 
| 
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
414  | 
qed  | 
| 
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
415  | 
|
| 
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
416  | 
lemma dvd_mult_cancel_left [simp]:  | 
| 
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
417  | 
"c * a dvd c * b \<longleftrightarrow> c = 0 \<or> a dvd b"  | 
| 
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
418  | 
proof -  | 
| 
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
419  | 
have "c * a dvd c * b \<longleftrightarrow> (\<exists>k. b * c = (a * k) * c)"  | 
| 
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
420  | 
unfolding dvd_def by (simp add: mult_ac)  | 
| 
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
421  | 
also have "(\<exists>k. b * c = (a * k) * c) \<longleftrightarrow> c = 0 \<or> a dvd b"  | 
| 
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
422  | 
unfolding dvd_def by simp  | 
| 
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
423  | 
finally show ?thesis .  | 
| 
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
424  | 
qed  | 
| 
 
7d0ed261b712
generalize int_dvd_cancel_factor simproc to idom class
 
huffman 
parents: 
29949 
diff
changeset
 | 
425  | 
|
| 25186 | 426  | 
end  | 
| 25152 | 427  | 
|
| 35302 | 428  | 
text {*
 | 
429  | 
The theory of partially ordered rings is taken from the books:  | 
|
430  | 
  \begin{itemize}
 | 
|
431  | 
  \item \emph{Lattice Theory} by Garret Birkhoff, American Mathematical Society 1979 
 | 
|
432  | 
  \item \emph{Partially Ordered Algebraic Systems}, Pergamon Press 1963
 | 
|
433  | 
  \end{itemize}
 | 
|
434  | 
Most of the used notions can also be looked up in  | 
|
435  | 
  \begin{itemize}
 | 
|
436  | 
  \item \url{http://www.mathworld.com} by Eric Weisstein et. al.
 | 
|
437  | 
  \item \emph{Algebra I} by van der Waerden, Springer.
 | 
|
438  | 
  \end{itemize}
 | 
|
439  | 
*}  | 
|
440  | 
||
| 
38642
 
8fa437809c67
dropped type classes mult_mono and mult_mono1; tuned names of technical rule duplicates
 
haftmann 
parents: 
37767 
diff
changeset
 | 
441  | 
class ordered_semiring = semiring + comm_monoid_add + ordered_ab_semigroup_add +  | 
| 
 
8fa437809c67
dropped type classes mult_mono and mult_mono1; tuned names of technical rule duplicates
 
haftmann 
parents: 
37767 
diff
changeset
 | 
442  | 
assumes mult_left_mono: "a \<le> b \<Longrightarrow> 0 \<le> c \<Longrightarrow> c * a \<le> c * b"  | 
| 
 
8fa437809c67
dropped type classes mult_mono and mult_mono1; tuned names of technical rule duplicates
 
haftmann 
parents: 
37767 
diff
changeset
 | 
443  | 
assumes mult_right_mono: "a \<le> b \<Longrightarrow> 0 \<le> c \<Longrightarrow> a * c \<le> b * c"  | 
| 25230 | 444  | 
begin  | 
445  | 
||
446  | 
lemma mult_mono:  | 
|
| 
38642
 
8fa437809c67
dropped type classes mult_mono and mult_mono1; tuned names of technical rule duplicates
 
haftmann 
parents: 
37767 
diff
changeset
 | 
447  | 
"a \<le> b \<Longrightarrow> c \<le> d \<Longrightarrow> 0 \<le> b \<Longrightarrow> 0 \<le> c \<Longrightarrow> a * c \<le> b * d"  | 
| 25230 | 448  | 
apply (erule mult_right_mono [THEN order_trans], assumption)  | 
449  | 
apply (erule mult_left_mono, assumption)  | 
|
450  | 
done  | 
|
451  | 
||
452  | 
lemma mult_mono':  | 
|
| 
38642
 
8fa437809c67
dropped type classes mult_mono and mult_mono1; tuned names of technical rule duplicates
 
haftmann 
parents: 
37767 
diff
changeset
 | 
453  | 
"a \<le> b \<Longrightarrow> c \<le> d \<Longrightarrow> 0 \<le> a \<Longrightarrow> 0 \<le> c \<Longrightarrow> a * c \<le> b * d"  | 
| 25230 | 454  | 
apply (rule mult_mono)  | 
455  | 
apply (fast intro: order_trans)+  | 
|
456  | 
done  | 
|
457  | 
||
458  | 
end  | 
|
| 
21199
 
2d83f93c3580
* Added annihilation axioms ("x * 0 = 0") to axclass semiring_0.
 
krauss 
parents: 
20633 
diff
changeset
 | 
459  | 
|
| 
38642
 
8fa437809c67
dropped type classes mult_mono and mult_mono1; tuned names of technical rule duplicates
 
haftmann 
parents: 
37767 
diff
changeset
 | 
460  | 
class ordered_cancel_semiring = ordered_semiring + cancel_comm_monoid_add  | 
| 25267 | 461  | 
begin  | 
| 
14268
 
5cf13e80be0e
Removal of Hyperreal/ExtraThms2.ML, sending the material to the correct files.
 
paulson 
parents: 
14267 
diff
changeset
 | 
462  | 
|
| 27516 | 463  | 
subclass semiring_0_cancel ..  | 
| 23521 | 464  | 
|
| 25230 | 465  | 
lemma mult_nonneg_nonneg: "0 \<le> a \<Longrightarrow> 0 \<le> b \<Longrightarrow> 0 \<le> a * b"  | 
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
466  | 
using mult_left_mono [of 0 b a] by simp  | 
| 25230 | 467  | 
|
468  | 
lemma mult_nonneg_nonpos: "0 \<le> a \<Longrightarrow> b \<le> 0 \<Longrightarrow> a * b \<le> 0"  | 
|
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
469  | 
using mult_left_mono [of b 0 a] by simp  | 
| 
30692
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
470  | 
|
| 
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
471  | 
lemma mult_nonpos_nonneg: "a \<le> 0 \<Longrightarrow> 0 \<le> b \<Longrightarrow> a * b \<le> 0"  | 
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
472  | 
using mult_right_mono [of a 0 b] by simp  | 
| 
30692
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
473  | 
|
| 
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
474  | 
text {* Legacy - use @{text mult_nonpos_nonneg} *}
 | 
| 25230 | 475  | 
lemma mult_nonneg_nonpos2: "0 \<le> a \<Longrightarrow> b \<le> 0 \<Longrightarrow> b * a \<le> 0"  | 
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
476  | 
by (drule mult_right_mono [of b 0], auto)  | 
| 25230 | 477  | 
|
| 26234 | 478  | 
lemma split_mult_neg_le: "(0 \<le> a & b \<le> 0) | (a \<le> 0 & 0 \<le> b) \<Longrightarrow> a * b \<le> 0"  | 
| 29667 | 479  | 
by (auto simp add: mult_nonneg_nonpos mult_nonneg_nonpos2)  | 
| 25230 | 480  | 
|
481  | 
end  | 
|
482  | 
||
| 
38642
 
8fa437809c67
dropped type classes mult_mono and mult_mono1; tuned names of technical rule duplicates
 
haftmann 
parents: 
37767 
diff
changeset
 | 
483  | 
class linordered_semiring = ordered_semiring + linordered_cancel_ab_semigroup_add  | 
| 25267 | 484  | 
begin  | 
| 25230 | 485  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
486  | 
subclass ordered_cancel_semiring ..  | 
| 
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
487  | 
|
| 
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
488  | 
subclass ordered_comm_monoid_add ..  | 
| 
25304
 
7491c00f0915
removed subclass edge ordered_ring < lordered_ring
 
haftmann 
parents: 
25267 
diff
changeset
 | 
489  | 
|
| 25230 | 490  | 
lemma mult_left_less_imp_less:  | 
491  | 
"c * a < c * b \<Longrightarrow> 0 \<le> c \<Longrightarrow> a < b"  | 
|
| 29667 | 492  | 
by (force simp add: mult_left_mono not_le [symmetric])  | 
| 25230 | 493  | 
|
494  | 
lemma mult_right_less_imp_less:  | 
|
495  | 
"a * c < b * c \<Longrightarrow> 0 \<le> c \<Longrightarrow> a < b"  | 
|
| 29667 | 496  | 
by (force simp add: mult_right_mono not_le [symmetric])  | 
| 23521 | 497  | 
|
| 25186 | 498  | 
end  | 
| 25152 | 499  | 
|
| 
35043
 
07dbdf60d5ad
dropped accidental duplication of "lin" prefix from cs. 108662d50512
 
haftmann 
parents: 
35032 
diff
changeset
 | 
500  | 
class linordered_semiring_1 = linordered_semiring + semiring_1  | 
| 
36622
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
501  | 
begin  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
502  | 
|
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
503  | 
lemma convex_bound_le:  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
504  | 
assumes "x \<le> a" "y \<le> a" "0 \<le> u" "0 \<le> v" "u + v = 1"  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
505  | 
shows "u * x + v * y \<le> a"  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
506  | 
proof-  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
507  | 
from assms have "u * x + v * y \<le> u * a + v * a"  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
508  | 
by (simp add: add_mono mult_left_mono)  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
509  | 
thus ?thesis using assms unfolding left_distrib[symmetric] by simp  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
510  | 
qed  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
511  | 
|
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
512  | 
end  | 
| 
35043
 
07dbdf60d5ad
dropped accidental duplication of "lin" prefix from cs. 108662d50512
 
haftmann 
parents: 
35032 
diff
changeset
 | 
513  | 
|
| 
 
07dbdf60d5ad
dropped accidental duplication of "lin" prefix from cs. 108662d50512
 
haftmann 
parents: 
35032 
diff
changeset
 | 
514  | 
class linordered_semiring_strict = semiring + comm_monoid_add + linordered_cancel_ab_semigroup_add +  | 
| 25062 | 515  | 
assumes mult_strict_left_mono: "a < b \<Longrightarrow> 0 < c \<Longrightarrow> c * a < c * b"  | 
516  | 
assumes mult_strict_right_mono: "a < b \<Longrightarrow> 0 < c \<Longrightarrow> a * c < b * c"  | 
|
| 25267 | 517  | 
begin  | 
| 
14341
 
a09441bd4f1e
Ring_and_Field now requires axiom add_left_imp_eq for semirings.
 
paulson 
parents: 
14334 
diff
changeset
 | 
518  | 
|
| 27516 | 519  | 
subclass semiring_0_cancel ..  | 
| 14940 | 520  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
521  | 
subclass linordered_semiring  | 
| 28823 | 522  | 
proof  | 
| 23550 | 523  | 
fix a b c :: 'a  | 
524  | 
assume A: "a \<le> b" "0 \<le> c"  | 
|
525  | 
from A show "c * a \<le> c * b"  | 
|
| 25186 | 526  | 
unfolding le_less  | 
527  | 
using mult_strict_left_mono by (cases "c = 0") auto  | 
|
| 23550 | 528  | 
from A show "a * c \<le> b * c"  | 
| 25152 | 529  | 
unfolding le_less  | 
| 25186 | 530  | 
using mult_strict_right_mono by (cases "c = 0") auto  | 
| 25152 | 531  | 
qed  | 
532  | 
||
| 25230 | 533  | 
lemma mult_left_le_imp_le:  | 
534  | 
"c * a \<le> c * b \<Longrightarrow> 0 < c \<Longrightarrow> a \<le> b"  | 
|
| 29667 | 535  | 
by (force simp add: mult_strict_left_mono _not_less [symmetric])  | 
| 25230 | 536  | 
|
537  | 
lemma mult_right_le_imp_le:  | 
|
538  | 
"a * c \<le> b * c \<Longrightarrow> 0 < c \<Longrightarrow> a \<le> b"  | 
|
| 29667 | 539  | 
by (force simp add: mult_strict_right_mono not_less [symmetric])  | 
| 25230 | 540  | 
|
| 
30692
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
541  | 
lemma mult_pos_pos: "0 < a \<Longrightarrow> 0 < b \<Longrightarrow> 0 < a * b"  | 
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
542  | 
using mult_strict_left_mono [of 0 b a] by simp  | 
| 
30692
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
543  | 
|
| 
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
544  | 
lemma mult_pos_neg: "0 < a \<Longrightarrow> b < 0 \<Longrightarrow> a * b < 0"  | 
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
545  | 
using mult_strict_left_mono [of b 0 a] by simp  | 
| 
30692
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
546  | 
|
| 
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
547  | 
lemma mult_neg_pos: "a < 0 \<Longrightarrow> 0 < b \<Longrightarrow> a * b < 0"  | 
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
548  | 
using mult_strict_right_mono [of a 0 b] by simp  | 
| 
30692
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
549  | 
|
| 
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
550  | 
text {* Legacy - use @{text mult_neg_pos} *}
 | 
| 
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
551  | 
lemma mult_pos_neg2: "0 < a \<Longrightarrow> b < 0 \<Longrightarrow> b * a < 0"  | 
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
552  | 
by (drule mult_strict_right_mono [of b 0], auto)  | 
| 25230 | 553  | 
|
554  | 
lemma zero_less_mult_pos:  | 
|
555  | 
"0 < a * b \<Longrightarrow> 0 < a \<Longrightarrow> 0 < b"  | 
|
| 
30692
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
556  | 
apply (cases "b\<le>0")  | 
| 25230 | 557  | 
apply (auto simp add: le_less not_less)  | 
| 
30692
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
558  | 
apply (drule_tac mult_pos_neg [of a b])  | 
| 25230 | 559  | 
apply (auto dest: less_not_sym)  | 
560  | 
done  | 
|
561  | 
||
562  | 
lemma zero_less_mult_pos2:  | 
|
563  | 
"0 < b * a \<Longrightarrow> 0 < a \<Longrightarrow> 0 < b"  | 
|
| 
30692
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
564  | 
apply (cases "b\<le>0")  | 
| 25230 | 565  | 
apply (auto simp add: le_less not_less)  | 
| 
30692
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
566  | 
apply (drule_tac mult_pos_neg2 [of a b])  | 
| 25230 | 567  | 
apply (auto dest: less_not_sym)  | 
568  | 
done  | 
|
569  | 
||
| 26193 | 570  | 
text{*Strict monotonicity in both arguments*}
 | 
571  | 
lemma mult_strict_mono:  | 
|
572  | 
assumes "a < b" and "c < d" and "0 < b" and "0 \<le> c"  | 
|
573  | 
shows "a * c < b * d"  | 
|
574  | 
using assms apply (cases "c=0")  | 
|
| 
30692
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
575  | 
apply (simp add: mult_pos_pos)  | 
| 26193 | 576  | 
apply (erule mult_strict_right_mono [THEN less_trans])  | 
| 
30692
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
577  | 
apply (force simp add: le_less)  | 
| 26193 | 578  | 
apply (erule mult_strict_left_mono, assumption)  | 
579  | 
done  | 
|
580  | 
||
581  | 
text{*This weaker variant has more natural premises*}
 | 
|
582  | 
lemma mult_strict_mono':  | 
|
583  | 
assumes "a < b" and "c < d" and "0 \<le> a" and "0 \<le> c"  | 
|
584  | 
shows "a * c < b * d"  | 
|
| 29667 | 585  | 
by (rule mult_strict_mono) (insert assms, auto)  | 
| 26193 | 586  | 
|
587  | 
lemma mult_less_le_imp_less:  | 
|
588  | 
assumes "a < b" and "c \<le> d" and "0 \<le> a" and "0 < c"  | 
|
589  | 
shows "a * c < b * d"  | 
|
590  | 
using assms apply (subgoal_tac "a * c < b * c")  | 
|
591  | 
apply (erule less_le_trans)  | 
|
592  | 
apply (erule mult_left_mono)  | 
|
593  | 
apply simp  | 
|
594  | 
apply (erule mult_strict_right_mono)  | 
|
595  | 
apply assumption  | 
|
596  | 
done  | 
|
597  | 
||
598  | 
lemma mult_le_less_imp_less:  | 
|
599  | 
assumes "a \<le> b" and "c < d" and "0 < a" and "0 \<le> c"  | 
|
600  | 
shows "a * c < b * d"  | 
|
601  | 
using assms apply (subgoal_tac "a * c \<le> b * c")  | 
|
602  | 
apply (erule le_less_trans)  | 
|
603  | 
apply (erule mult_strict_left_mono)  | 
|
604  | 
apply simp  | 
|
605  | 
apply (erule mult_right_mono)  | 
|
606  | 
apply simp  | 
|
607  | 
done  | 
|
608  | 
||
609  | 
lemma mult_less_imp_less_left:  | 
|
610  | 
assumes less: "c * a < c * b" and nonneg: "0 \<le> c"  | 
|
611  | 
shows "a < b"  | 
|
612  | 
proof (rule ccontr)  | 
|
613  | 
assume "\<not> a < b"  | 
|
614  | 
hence "b \<le> a" by (simp add: linorder_not_less)  | 
|
615  | 
hence "c * b \<le> c * a" using nonneg by (rule mult_left_mono)  | 
|
| 29667 | 616  | 
with this and less show False by (simp add: not_less [symmetric])  | 
| 26193 | 617  | 
qed  | 
618  | 
||
619  | 
lemma mult_less_imp_less_right:  | 
|
620  | 
assumes less: "a * c < b * c" and nonneg: "0 \<le> c"  | 
|
621  | 
shows "a < b"  | 
|
622  | 
proof (rule ccontr)  | 
|
623  | 
assume "\<not> a < b"  | 
|
624  | 
hence "b \<le> a" by (simp add: linorder_not_less)  | 
|
625  | 
hence "b * c \<le> a * c" using nonneg by (rule mult_right_mono)  | 
|
| 29667 | 626  | 
with this and less show False by (simp add: not_less [symmetric])  | 
| 26193 | 627  | 
qed  | 
628  | 
||
| 25230 | 629  | 
end  | 
630  | 
||
| 
35097
 
4554bb2abfa3
dropped last occurence of the linlinordered accident
 
haftmann 
parents: 
35092 
diff
changeset
 | 
631  | 
class linordered_semiring_1_strict = linordered_semiring_strict + semiring_1  | 
| 
36622
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
632  | 
begin  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
633  | 
|
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
634  | 
subclass linordered_semiring_1 ..  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
635  | 
|
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
636  | 
lemma convex_bound_lt:  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
637  | 
assumes "x < a" "y < a" "0 \<le> u" "0 \<le> v" "u + v = 1"  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
638  | 
shows "u * x + v * y < a"  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
639  | 
proof -  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
640  | 
from assms have "u * x + v * y < u * a + v * a"  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
641  | 
by (cases "u = 0")  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
642  | 
(auto intro!: add_less_le_mono mult_strict_left_mono mult_left_mono)  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
643  | 
thus ?thesis using assms unfolding left_distrib[symmetric] by simp  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
644  | 
qed  | 
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
645  | 
|
| 
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
646  | 
end  | 
| 33319 | 647  | 
|
| 
38642
 
8fa437809c67
dropped type classes mult_mono and mult_mono1; tuned names of technical rule duplicates
 
haftmann 
parents: 
37767 
diff
changeset
 | 
648  | 
class ordered_comm_semiring = comm_semiring_0 + ordered_ab_semigroup_add +  | 
| 
 
8fa437809c67
dropped type classes mult_mono and mult_mono1; tuned names of technical rule duplicates
 
haftmann 
parents: 
37767 
diff
changeset
 | 
649  | 
assumes comm_mult_left_mono: "a \<le> b \<Longrightarrow> 0 \<le> c \<Longrightarrow> c * a \<le> c * b"  | 
| 25186 | 650  | 
begin  | 
| 25152 | 651  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
652  | 
subclass ordered_semiring  | 
| 28823 | 653  | 
proof  | 
| 
21199
 
2d83f93c3580
* Added annihilation axioms ("x * 0 = 0") to axclass semiring_0.
 
krauss 
parents: 
20633 
diff
changeset
 | 
654  | 
fix a b c :: 'a  | 
| 23550 | 655  | 
assume "a \<le> b" "0 \<le> c"  | 
| 
38642
 
8fa437809c67
dropped type classes mult_mono and mult_mono1; tuned names of technical rule duplicates
 
haftmann 
parents: 
37767 
diff
changeset
 | 
656  | 
thus "c * a \<le> c * b" by (rule comm_mult_left_mono)  | 
| 23550 | 657  | 
thus "a * c \<le> b * c" by (simp only: mult_commute)  | 
| 
21199
 
2d83f93c3580
* Added annihilation axioms ("x * 0 = 0") to axclass semiring_0.
 
krauss 
parents: 
20633 
diff
changeset
 | 
658  | 
qed  | 
| 
14265
 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 
paulson 
parents:  
diff
changeset
 | 
659  | 
|
| 25267 | 660  | 
end  | 
661  | 
||
| 
38642
 
8fa437809c67
dropped type classes mult_mono and mult_mono1; tuned names of technical rule duplicates
 
haftmann 
parents: 
37767 
diff
changeset
 | 
662  | 
class ordered_cancel_comm_semiring = ordered_comm_semiring + cancel_comm_monoid_add  | 
| 25267 | 663  | 
begin  | 
| 
14265
 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 
paulson 
parents:  
diff
changeset
 | 
664  | 
|
| 
38642
 
8fa437809c67
dropped type classes mult_mono and mult_mono1; tuned names of technical rule duplicates
 
haftmann 
parents: 
37767 
diff
changeset
 | 
665  | 
subclass comm_semiring_0_cancel ..  | 
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
666  | 
subclass ordered_comm_semiring ..  | 
| 
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
667  | 
subclass ordered_cancel_semiring ..  | 
| 25267 | 668  | 
|
669  | 
end  | 
|
670  | 
||
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
671  | 
class linordered_comm_semiring_strict = comm_semiring_0 + linordered_cancel_ab_semigroup_add +  | 
| 
38642
 
8fa437809c67
dropped type classes mult_mono and mult_mono1; tuned names of technical rule duplicates
 
haftmann 
parents: 
37767 
diff
changeset
 | 
672  | 
assumes comm_mult_strict_left_mono: "a < b \<Longrightarrow> 0 < c \<Longrightarrow> c * a < c * b"  | 
| 25267 | 673  | 
begin  | 
674  | 
||
| 
35043
 
07dbdf60d5ad
dropped accidental duplication of "lin" prefix from cs. 108662d50512
 
haftmann 
parents: 
35032 
diff
changeset
 | 
675  | 
subclass linordered_semiring_strict  | 
| 28823 | 676  | 
proof  | 
| 23550 | 677  | 
fix a b c :: 'a  | 
678  | 
assume "a < b" "0 < c"  | 
|
| 
38642
 
8fa437809c67
dropped type classes mult_mono and mult_mono1; tuned names of technical rule duplicates
 
haftmann 
parents: 
37767 
diff
changeset
 | 
679  | 
thus "c * a < c * b" by (rule comm_mult_strict_left_mono)  | 
| 23550 | 680  | 
thus "a * c < b * c" by (simp only: mult_commute)  | 
681  | 
qed  | 
|
| 
14272
 
5efbb548107d
Tidying of the integer development; towards removing the
 
paulson 
parents: 
14270 
diff
changeset
 | 
682  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
683  | 
subclass ordered_cancel_comm_semiring  | 
| 28823 | 684  | 
proof  | 
| 23550 | 685  | 
fix a b c :: 'a  | 
686  | 
assume "a \<le> b" "0 \<le> c"  | 
|
687  | 
thus "c * a \<le> c * b"  | 
|
| 25186 | 688  | 
unfolding le_less  | 
| 26193 | 689  | 
using mult_strict_left_mono by (cases "c = 0") auto  | 
| 23550 | 690  | 
qed  | 
| 
14272
 
5efbb548107d
Tidying of the integer development; towards removing the
 
paulson 
parents: 
14270 
diff
changeset
 | 
691  | 
|
| 25267 | 692  | 
end  | 
| 25230 | 693  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
694  | 
class ordered_ring = ring + ordered_cancel_semiring  | 
| 25267 | 695  | 
begin  | 
| 25230 | 696  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
697  | 
subclass ordered_ab_group_add ..  | 
| 14270 | 698  | 
|
| 25230 | 699  | 
lemma less_add_iff1:  | 
700  | 
"a * e + c < b * e + d \<longleftrightarrow> (a - b) * e + c < d"  | 
|
| 29667 | 701  | 
by (simp add: algebra_simps)  | 
| 25230 | 702  | 
|
703  | 
lemma less_add_iff2:  | 
|
704  | 
"a * e + c < b * e + d \<longleftrightarrow> c < (b - a) * e + d"  | 
|
| 29667 | 705  | 
by (simp add: algebra_simps)  | 
| 25230 | 706  | 
|
707  | 
lemma le_add_iff1:  | 
|
708  | 
"a * e + c \<le> b * e + d \<longleftrightarrow> (a - b) * e + c \<le> d"  | 
|
| 29667 | 709  | 
by (simp add: algebra_simps)  | 
| 25230 | 710  | 
|
711  | 
lemma le_add_iff2:  | 
|
712  | 
"a * e + c \<le> b * e + d \<longleftrightarrow> c \<le> (b - a) * e + d"  | 
|
| 29667 | 713  | 
by (simp add: algebra_simps)  | 
| 25230 | 714  | 
|
715  | 
lemma mult_left_mono_neg:  | 
|
716  | 
"b \<le> a \<Longrightarrow> c \<le> 0 \<Longrightarrow> c * a \<le> c * b"  | 
|
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
717  | 
apply (drule mult_left_mono [of _ _ "- c"])  | 
| 35216 | 718  | 
apply simp_all  | 
| 25230 | 719  | 
done  | 
720  | 
||
721  | 
lemma mult_right_mono_neg:  | 
|
722  | 
"b \<le> a \<Longrightarrow> c \<le> 0 \<Longrightarrow> a * c \<le> b * c"  | 
|
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
723  | 
apply (drule mult_right_mono [of _ _ "- c"])  | 
| 35216 | 724  | 
apply simp_all  | 
| 25230 | 725  | 
done  | 
726  | 
||
| 
30692
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
727  | 
lemma mult_nonpos_nonpos: "a \<le> 0 \<Longrightarrow> b \<le> 0 \<Longrightarrow> 0 \<le> a * b"  | 
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
728  | 
using mult_right_mono_neg [of a 0 b] by simp  | 
| 25230 | 729  | 
|
730  | 
lemma split_mult_pos_le:  | 
|
731  | 
"(0 \<le> a \<and> 0 \<le> b) \<or> (a \<le> 0 \<and> b \<le> 0) \<Longrightarrow> 0 \<le> a * b"  | 
|
| 29667 | 732  | 
by (auto simp add: mult_nonneg_nonneg mult_nonpos_nonpos)  | 
| 25186 | 733  | 
|
734  | 
end  | 
|
| 14270 | 735  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
736  | 
class linordered_ring = ring + linordered_semiring + linordered_ab_group_add + abs_if  | 
| 
25304
 
7491c00f0915
removed subclass edge ordered_ring < lordered_ring
 
haftmann 
parents: 
25267 
diff
changeset
 | 
737  | 
begin  | 
| 
 
7491c00f0915
removed subclass edge ordered_ring < lordered_ring
 
haftmann 
parents: 
25267 
diff
changeset
 | 
738  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
739  | 
subclass ordered_ring ..  | 
| 
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
740  | 
|
| 
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
741  | 
subclass ordered_ab_group_add_abs  | 
| 28823 | 742  | 
proof  | 
| 
25304
 
7491c00f0915
removed subclass edge ordered_ring < lordered_ring
 
haftmann 
parents: 
25267 
diff
changeset
 | 
743  | 
fix a b  | 
| 
 
7491c00f0915
removed subclass edge ordered_ring < lordered_ring
 
haftmann 
parents: 
25267 
diff
changeset
 | 
744  | 
show "\<bar>a + b\<bar> \<le> \<bar>a\<bar> + \<bar>b\<bar>"  | 
| 35216 | 745  | 
by (auto simp add: abs_if not_less)  | 
746  | 
(auto simp del: minus_add_distrib simp add: minus_add_distrib [symmetric],  | 
|
| 
36977
 
71c8973a604b
declare add_nonneg_nonneg [simp]; remove now-redundant lemmas realpow_two_le_order(2)
 
huffman 
parents: 
36970 
diff
changeset
 | 
747  | 
auto intro!: less_imp_le add_neg_neg)  | 
| 35216 | 748  | 
qed (auto simp add: abs_if)  | 
| 
25304
 
7491c00f0915
removed subclass edge ordered_ring < lordered_ring
 
haftmann 
parents: 
25267 
diff
changeset
 | 
749  | 
|
| 
35631
 
0b8a5fd339ab
generalize some lemmas from class linordered_ring_strict to linordered_ring
 
huffman 
parents: 
35302 
diff
changeset
 | 
750  | 
lemma zero_le_square [simp]: "0 \<le> a * a"  | 
| 
 
0b8a5fd339ab
generalize some lemmas from class linordered_ring_strict to linordered_ring
 
huffman 
parents: 
35302 
diff
changeset
 | 
751  | 
using linear [of 0 a]  | 
| 
 
0b8a5fd339ab
generalize some lemmas from class linordered_ring_strict to linordered_ring
 
huffman 
parents: 
35302 
diff
changeset
 | 
752  | 
by (auto simp add: mult_nonneg_nonneg mult_nonpos_nonpos)  | 
| 
 
0b8a5fd339ab
generalize some lemmas from class linordered_ring_strict to linordered_ring
 
huffman 
parents: 
35302 
diff
changeset
 | 
753  | 
|
| 
 
0b8a5fd339ab
generalize some lemmas from class linordered_ring_strict to linordered_ring
 
huffman 
parents: 
35302 
diff
changeset
 | 
754  | 
lemma not_square_less_zero [simp]: "\<not> (a * a < 0)"  | 
| 
 
0b8a5fd339ab
generalize some lemmas from class linordered_ring_strict to linordered_ring
 
huffman 
parents: 
35302 
diff
changeset
 | 
755  | 
by (simp add: not_less)  | 
| 
 
0b8a5fd339ab
generalize some lemmas from class linordered_ring_strict to linordered_ring
 
huffman 
parents: 
35302 
diff
changeset
 | 
756  | 
|
| 
25304
 
7491c00f0915
removed subclass edge ordered_ring < lordered_ring
 
haftmann 
parents: 
25267 
diff
changeset
 | 
757  | 
end  | 
| 23521 | 758  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
759  | 
(* The "strict" suffix can be seen as describing the combination of linordered_ring and no_zero_divisors.  | 
| 
35043
 
07dbdf60d5ad
dropped accidental duplication of "lin" prefix from cs. 108662d50512
 
haftmann 
parents: 
35032 
diff
changeset
 | 
760  | 
Basically, linordered_ring + no_zero_divisors = linordered_ring_strict.  | 
| 25230 | 761  | 
*)  | 
| 
35043
 
07dbdf60d5ad
dropped accidental duplication of "lin" prefix from cs. 108662d50512
 
haftmann 
parents: 
35032 
diff
changeset
 | 
762  | 
class linordered_ring_strict = ring + linordered_semiring_strict  | 
| 
25304
 
7491c00f0915
removed subclass edge ordered_ring < lordered_ring
 
haftmann 
parents: 
25267 
diff
changeset
 | 
763  | 
+ ordered_ab_group_add + abs_if  | 
| 25230 | 764  | 
begin  | 
| 
14348
 
744c868ee0b7
Defining the type class "ringpower" and deleting superseded theorems for
 
paulson 
parents: 
14341 
diff
changeset
 | 
765  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
766  | 
subclass linordered_ring ..  | 
| 
25304
 
7491c00f0915
removed subclass edge ordered_ring < lordered_ring
 
haftmann 
parents: 
25267 
diff
changeset
 | 
767  | 
|
| 
30692
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
768  | 
lemma mult_strict_left_mono_neg: "b < a \<Longrightarrow> c < 0 \<Longrightarrow> c * a < c * b"  | 
| 
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
769  | 
using mult_strict_left_mono [of b a "- c"] by simp  | 
| 
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
770  | 
|
| 
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
771  | 
lemma mult_strict_right_mono_neg: "b < a \<Longrightarrow> c < 0 \<Longrightarrow> a * c < b * c"  | 
| 
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
772  | 
using mult_strict_right_mono [of b a "- c"] by simp  | 
| 
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
773  | 
|
| 
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
774  | 
lemma mult_neg_neg: "a < 0 \<Longrightarrow> b < 0 \<Longrightarrow> 0 < a * b"  | 
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
775  | 
using mult_strict_right_mono_neg [of a 0 b] by simp  | 
| 14738 | 776  | 
|
| 25917 | 777  | 
subclass ring_no_zero_divisors  | 
| 28823 | 778  | 
proof  | 
| 25917 | 779  | 
fix a b  | 
780  | 
assume "a \<noteq> 0" then have A: "a < 0 \<or> 0 < a" by (simp add: neq_iff)  | 
|
781  | 
assume "b \<noteq> 0" then have B: "b < 0 \<or> 0 < b" by (simp add: neq_iff)  | 
|
782  | 
have "a * b < 0 \<or> 0 < a * b"  | 
|
783  | 
proof (cases "a < 0")  | 
|
784  | 
case True note A' = this  | 
|
785  | 
show ?thesis proof (cases "b < 0")  | 
|
786  | 
case True with A'  | 
|
787  | 
show ?thesis by (auto dest: mult_neg_neg)  | 
|
788  | 
next  | 
|
789  | 
case False with B have "0 < b" by auto  | 
|
790  | 
with A' show ?thesis by (auto dest: mult_strict_right_mono)  | 
|
791  | 
qed  | 
|
792  | 
next  | 
|
793  | 
case False with A have A': "0 < a" by auto  | 
|
794  | 
show ?thesis proof (cases "b < 0")  | 
|
795  | 
case True with A'  | 
|
796  | 
show ?thesis by (auto dest: mult_strict_right_mono_neg)  | 
|
797  | 
next  | 
|
798  | 
case False with B have "0 < b" by auto  | 
|
799  | 
with A' show ?thesis by (auto dest: mult_pos_pos)  | 
|
800  | 
qed  | 
|
801  | 
qed  | 
|
802  | 
then show "a * b \<noteq> 0" by (simp add: neq_iff)  | 
|
803  | 
qed  | 
|
| 
25304
 
7491c00f0915
removed subclass edge ordered_ring < lordered_ring
 
haftmann 
parents: 
25267 
diff
changeset
 | 
804  | 
|
| 
14265
 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 
paulson 
parents:  
diff
changeset
 | 
805  | 
lemma zero_less_mult_iff:  | 
| 25917 | 806  | 
"0 < a * b \<longleftrightarrow> 0 < a \<and> 0 < b \<or> a < 0 \<and> b < 0"  | 
807  | 
apply (auto simp add: mult_pos_pos mult_neg_neg)  | 
|
808  | 
apply (simp_all add: not_less le_less)  | 
|
809  | 
apply (erule disjE) apply assumption defer  | 
|
810  | 
apply (erule disjE) defer apply (drule sym) apply simp  | 
|
811  | 
apply (erule disjE) defer apply (drule sym) apply simp  | 
|
812  | 
apply (erule disjE) apply assumption apply (drule sym) apply simp  | 
|
813  | 
apply (drule sym) apply simp  | 
|
814  | 
apply (blast dest: zero_less_mult_pos)  | 
|
| 25230 | 815  | 
apply (blast dest: zero_less_mult_pos2)  | 
816  | 
done  | 
|
| 
22990
 
775e9de3db48
added classes ring_no_zero_divisors and dom (non-commutative version of idom);
 
huffman 
parents: 
22987 
diff
changeset
 | 
817  | 
|
| 
14265
 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 
paulson 
parents:  
diff
changeset
 | 
818  | 
lemma zero_le_mult_iff:  | 
| 25917 | 819  | 
"0 \<le> a * b \<longleftrightarrow> 0 \<le> a \<and> 0 \<le> b \<or> a \<le> 0 \<and> b \<le> 0"  | 
| 29667 | 820  | 
by (auto simp add: eq_commute [of 0] le_less not_less zero_less_mult_iff)  | 
| 
14265
 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 
paulson 
parents:  
diff
changeset
 | 
821  | 
|
| 
 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 
paulson 
parents:  
diff
changeset
 | 
822  | 
lemma mult_less_0_iff:  | 
| 25917 | 823  | 
"a * b < 0 \<longleftrightarrow> 0 < a \<and> b < 0 \<or> a < 0 \<and> 0 < b"  | 
| 35216 | 824  | 
apply (insert zero_less_mult_iff [of "-a" b])  | 
825  | 
apply force  | 
|
| 25917 | 826  | 
done  | 
| 
14265
 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 
paulson 
parents:  
diff
changeset
 | 
827  | 
|
| 
 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 
paulson 
parents:  
diff
changeset
 | 
828  | 
lemma mult_le_0_iff:  | 
| 25917 | 829  | 
"a * b \<le> 0 \<longleftrightarrow> 0 \<le> a \<and> b \<le> 0 \<or> a \<le> 0 \<and> 0 \<le> b"  | 
830  | 
apply (insert zero_le_mult_iff [of "-a" b])  | 
|
| 35216 | 831  | 
apply force  | 
| 25917 | 832  | 
done  | 
833  | 
||
| 26193 | 834  | 
text{*Cancellation laws for @{term "c*a < c*b"} and @{term "a*c < b*c"},
 | 
835  | 
   also with the relations @{text "\<le>"} and equality.*}
 | 
|
836  | 
||
837  | 
text{*These ``disjunction'' versions produce two cases when the comparison is
 | 
|
838  | 
an assumption, but effectively four when the comparison is a goal.*}  | 
|
839  | 
||
840  | 
lemma mult_less_cancel_right_disj:  | 
|
841  | 
"a * c < b * c \<longleftrightarrow> 0 < c \<and> a < b \<or> c < 0 \<and> b < a"  | 
|
842  | 
apply (cases "c = 0")  | 
|
843  | 
apply (auto simp add: neq_iff mult_strict_right_mono  | 
|
844  | 
mult_strict_right_mono_neg)  | 
|
845  | 
apply (auto simp add: not_less  | 
|
846  | 
not_le [symmetric, of "a*c"]  | 
|
847  | 
not_le [symmetric, of a])  | 
|
848  | 
apply (erule_tac [!] notE)  | 
|
849  | 
apply (auto simp add: less_imp_le mult_right_mono  | 
|
850  | 
mult_right_mono_neg)  | 
|
851  | 
done  | 
|
852  | 
||
853  | 
lemma mult_less_cancel_left_disj:  | 
|
854  | 
"c * a < c * b \<longleftrightarrow> 0 < c \<and> a < b \<or> c < 0 \<and> b < a"  | 
|
855  | 
apply (cases "c = 0")  | 
|
856  | 
apply (auto simp add: neq_iff mult_strict_left_mono  | 
|
857  | 
mult_strict_left_mono_neg)  | 
|
858  | 
apply (auto simp add: not_less  | 
|
859  | 
not_le [symmetric, of "c*a"]  | 
|
860  | 
not_le [symmetric, of a])  | 
|
861  | 
apply (erule_tac [!] notE)  | 
|
862  | 
apply (auto simp add: less_imp_le mult_left_mono  | 
|
863  | 
mult_left_mono_neg)  | 
|
864  | 
done  | 
|
865  | 
||
866  | 
text{*The ``conjunction of implication'' lemmas produce two cases when the
 | 
|
867  | 
comparison is a goal, but give four when the comparison is an assumption.*}  | 
|
868  | 
||
869  | 
lemma mult_less_cancel_right:  | 
|
870  | 
"a * c < b * c \<longleftrightarrow> (0 \<le> c \<longrightarrow> a < b) \<and> (c \<le> 0 \<longrightarrow> b < a)"  | 
|
871  | 
using mult_less_cancel_right_disj [of a c b] by auto  | 
|
872  | 
||
873  | 
lemma mult_less_cancel_left:  | 
|
874  | 
"c * a < c * b \<longleftrightarrow> (0 \<le> c \<longrightarrow> a < b) \<and> (c \<le> 0 \<longrightarrow> b < a)"  | 
|
875  | 
using mult_less_cancel_left_disj [of c a b] by auto  | 
|
876  | 
||
877  | 
lemma mult_le_cancel_right:  | 
|
878  | 
"a * c \<le> b * c \<longleftrightarrow> (0 < c \<longrightarrow> a \<le> b) \<and> (c < 0 \<longrightarrow> b \<le> a)"  | 
|
| 29667 | 879  | 
by (simp add: not_less [symmetric] mult_less_cancel_right_disj)  | 
| 26193 | 880  | 
|
881  | 
lemma mult_le_cancel_left:  | 
|
882  | 
"c * a \<le> c * b \<longleftrightarrow> (0 < c \<longrightarrow> a \<le> b) \<and> (c < 0 \<longrightarrow> b \<le> a)"  | 
|
| 29667 | 883  | 
by (simp add: not_less [symmetric] mult_less_cancel_left_disj)  | 
| 26193 | 884  | 
|
| 
30649
 
57753e0ec1d4
1. New cancellation simprocs for common factors in inequations
 
nipkow 
parents: 
30242 
diff
changeset
 | 
885  | 
lemma mult_le_cancel_left_pos:  | 
| 
 
57753e0ec1d4
1. New cancellation simprocs for common factors in inequations
 
nipkow 
parents: 
30242 
diff
changeset
 | 
886  | 
"0 < c \<Longrightarrow> c * a \<le> c * b \<longleftrightarrow> a \<le> b"  | 
| 
 
57753e0ec1d4
1. New cancellation simprocs for common factors in inequations
 
nipkow 
parents: 
30242 
diff
changeset
 | 
887  | 
by (auto simp: mult_le_cancel_left)  | 
| 
 
57753e0ec1d4
1. New cancellation simprocs for common factors in inequations
 
nipkow 
parents: 
30242 
diff
changeset
 | 
888  | 
|
| 
 
57753e0ec1d4
1. New cancellation simprocs for common factors in inequations
 
nipkow 
parents: 
30242 
diff
changeset
 | 
889  | 
lemma mult_le_cancel_left_neg:  | 
| 
 
57753e0ec1d4
1. New cancellation simprocs for common factors in inequations
 
nipkow 
parents: 
30242 
diff
changeset
 | 
890  | 
"c < 0 \<Longrightarrow> c * a \<le> c * b \<longleftrightarrow> b \<le> a"  | 
| 
 
57753e0ec1d4
1. New cancellation simprocs for common factors in inequations
 
nipkow 
parents: 
30242 
diff
changeset
 | 
891  | 
by (auto simp: mult_le_cancel_left)  | 
| 
 
57753e0ec1d4
1. New cancellation simprocs for common factors in inequations
 
nipkow 
parents: 
30242 
diff
changeset
 | 
892  | 
|
| 
 
57753e0ec1d4
1. New cancellation simprocs for common factors in inequations
 
nipkow 
parents: 
30242 
diff
changeset
 | 
893  | 
lemma mult_less_cancel_left_pos:  | 
| 
 
57753e0ec1d4
1. New cancellation simprocs for common factors in inequations
 
nipkow 
parents: 
30242 
diff
changeset
 | 
894  | 
"0 < c \<Longrightarrow> c * a < c * b \<longleftrightarrow> a < b"  | 
| 
 
57753e0ec1d4
1. New cancellation simprocs for common factors in inequations
 
nipkow 
parents: 
30242 
diff
changeset
 | 
895  | 
by (auto simp: mult_less_cancel_left)  | 
| 
 
57753e0ec1d4
1. New cancellation simprocs for common factors in inequations
 
nipkow 
parents: 
30242 
diff
changeset
 | 
896  | 
|
| 
 
57753e0ec1d4
1. New cancellation simprocs for common factors in inequations
 
nipkow 
parents: 
30242 
diff
changeset
 | 
897  | 
lemma mult_less_cancel_left_neg:  | 
| 
 
57753e0ec1d4
1. New cancellation simprocs for common factors in inequations
 
nipkow 
parents: 
30242 
diff
changeset
 | 
898  | 
"c < 0 \<Longrightarrow> c * a < c * b \<longleftrightarrow> b < a"  | 
| 
 
57753e0ec1d4
1. New cancellation simprocs for common factors in inequations
 
nipkow 
parents: 
30242 
diff
changeset
 | 
899  | 
by (auto simp: mult_less_cancel_left)  | 
| 
 
57753e0ec1d4
1. New cancellation simprocs for common factors in inequations
 
nipkow 
parents: 
30242 
diff
changeset
 | 
900  | 
|
| 25917 | 901  | 
end  | 
| 
14265
 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 
paulson 
parents:  
diff
changeset
 | 
902  | 
|
| 
30692
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
903  | 
lemmas mult_sign_intros =  | 
| 
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
904  | 
mult_nonneg_nonneg mult_nonneg_nonpos  | 
| 
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
905  | 
mult_nonpos_nonneg mult_nonpos_nonpos  | 
| 
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
906  | 
mult_pos_pos mult_pos_neg  | 
| 
 
44ea10bc07a7
clean up proofs of sign rules for multiplication; add list of lemmas mult_sign_intros
 
huffman 
parents: 
30650 
diff
changeset
 | 
907  | 
mult_neg_pos mult_neg_neg  | 
| 25230 | 908  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
909  | 
class ordered_comm_ring = comm_ring + ordered_comm_semiring  | 
| 25267 | 910  | 
begin  | 
| 25230 | 911  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
912  | 
subclass ordered_ring ..  | 
| 
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
913  | 
subclass ordered_cancel_comm_semiring ..  | 
| 25230 | 914  | 
|
| 25267 | 915  | 
end  | 
| 25230 | 916  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
917  | 
class linordered_semidom = comm_semiring_1_cancel + linordered_comm_semiring_strict +  | 
| 
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
918  | 
(*previously linordered_semiring*)  | 
| 25230 | 919  | 
assumes zero_less_one [simp]: "0 < 1"  | 
920  | 
begin  | 
|
921  | 
||
922  | 
lemma pos_add_strict:  | 
|
923  | 
shows "0 < a \<Longrightarrow> b < c \<Longrightarrow> b < a + c"  | 
|
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
924  | 
using add_strict_mono [of 0 a b c] by simp  | 
| 25230 | 925  | 
|
| 26193 | 926  | 
lemma zero_le_one [simp]: "0 \<le> 1"  | 
| 29667 | 927  | 
by (rule zero_less_one [THEN less_imp_le])  | 
| 26193 | 928  | 
|
929  | 
lemma not_one_le_zero [simp]: "\<not> 1 \<le> 0"  | 
|
| 29667 | 930  | 
by (simp add: not_le)  | 
| 26193 | 931  | 
|
932  | 
lemma not_one_less_zero [simp]: "\<not> 1 < 0"  | 
|
| 29667 | 933  | 
by (simp add: not_less)  | 
| 26193 | 934  | 
|
935  | 
lemma less_1_mult:  | 
|
936  | 
assumes "1 < m" and "1 < n"  | 
|
937  | 
shows "1 < m * n"  | 
|
938  | 
using assms mult_strict_mono [of 1 m 1 n]  | 
|
939  | 
by (simp add: less_trans [OF zero_less_one])  | 
|
940  | 
||
| 25230 | 941  | 
end  | 
942  | 
||
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
943  | 
class linordered_idom = comm_ring_1 +  | 
| 
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
944  | 
linordered_comm_semiring_strict + ordered_ab_group_add +  | 
| 25230 | 945  | 
abs_if + sgn_if  | 
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
946  | 
(*previously linordered_ring*)  | 
| 25917 | 947  | 
begin  | 
948  | 
||
| 
36622
 
e393a91f86df
Generalize swap_inj_on; add simps for Times; add Ex_list_of_length, log_inj; Added missing locale edges for linordered semiring with 1.
 
hoelzl 
parents: 
36348 
diff
changeset
 | 
949  | 
subclass linordered_semiring_1_strict ..  | 
| 
35043
 
07dbdf60d5ad
dropped accidental duplication of "lin" prefix from cs. 108662d50512
 
haftmann 
parents: 
35032 
diff
changeset
 | 
950  | 
subclass linordered_ring_strict ..  | 
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
951  | 
subclass ordered_comm_ring ..  | 
| 27516 | 952  | 
subclass idom ..  | 
| 25917 | 953  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
954  | 
subclass linordered_semidom  | 
| 28823 | 955  | 
proof  | 
| 26193 | 956  | 
have "0 \<le> 1 * 1" by (rule zero_le_square)  | 
957  | 
thus "0 < 1" by (simp add: le_less)  | 
|
| 25917 | 958  | 
qed  | 
959  | 
||
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
960  | 
lemma linorder_neqE_linordered_idom:  | 
| 26193 | 961  | 
assumes "x \<noteq> y" obtains "x < y" | "y < x"  | 
962  | 
using assms by (rule neqE)  | 
|
963  | 
||
| 26274 | 964  | 
text {* These cancellation simprules also produce two cases when the comparison is a goal. *}
 | 
965  | 
||
966  | 
lemma mult_le_cancel_right1:  | 
|
967  | 
"c \<le> b * c \<longleftrightarrow> (0 < c \<longrightarrow> 1 \<le> b) \<and> (c < 0 \<longrightarrow> b \<le> 1)"  | 
|
| 29667 | 968  | 
by (insert mult_le_cancel_right [of 1 c b], simp)  | 
| 26274 | 969  | 
|
970  | 
lemma mult_le_cancel_right2:  | 
|
971  | 
"a * c \<le> c \<longleftrightarrow> (0 < c \<longrightarrow> a \<le> 1) \<and> (c < 0 \<longrightarrow> 1 \<le> a)"  | 
|
| 29667 | 972  | 
by (insert mult_le_cancel_right [of a c 1], simp)  | 
| 26274 | 973  | 
|
974  | 
lemma mult_le_cancel_left1:  | 
|
975  | 
"c \<le> c * b \<longleftrightarrow> (0 < c \<longrightarrow> 1 \<le> b) \<and> (c < 0 \<longrightarrow> b \<le> 1)"  | 
|
| 29667 | 976  | 
by (insert mult_le_cancel_left [of c 1 b], simp)  | 
| 26274 | 977  | 
|
978  | 
lemma mult_le_cancel_left2:  | 
|
979  | 
"c * a \<le> c \<longleftrightarrow> (0 < c \<longrightarrow> a \<le> 1) \<and> (c < 0 \<longrightarrow> 1 \<le> a)"  | 
|
| 29667 | 980  | 
by (insert mult_le_cancel_left [of c a 1], simp)  | 
| 26274 | 981  | 
|
982  | 
lemma mult_less_cancel_right1:  | 
|
983  | 
"c < b * c \<longleftrightarrow> (0 \<le> c \<longrightarrow> 1 < b) \<and> (c \<le> 0 \<longrightarrow> b < 1)"  | 
|
| 29667 | 984  | 
by (insert mult_less_cancel_right [of 1 c b], simp)  | 
| 26274 | 985  | 
|
986  | 
lemma mult_less_cancel_right2:  | 
|
987  | 
"a * c < c \<longleftrightarrow> (0 \<le> c \<longrightarrow> a < 1) \<and> (c \<le> 0 \<longrightarrow> 1 < a)"  | 
|
| 29667 | 988  | 
by (insert mult_less_cancel_right [of a c 1], simp)  | 
| 26274 | 989  | 
|
990  | 
lemma mult_less_cancel_left1:  | 
|
991  | 
"c < c * b \<longleftrightarrow> (0 \<le> c \<longrightarrow> 1 < b) \<and> (c \<le> 0 \<longrightarrow> b < 1)"  | 
|
| 29667 | 992  | 
by (insert mult_less_cancel_left [of c 1 b], simp)  | 
| 26274 | 993  | 
|
994  | 
lemma mult_less_cancel_left2:  | 
|
995  | 
"c * a < c \<longleftrightarrow> (0 \<le> c \<longrightarrow> a < 1) \<and> (c \<le> 0 \<longrightarrow> 1 < a)"  | 
|
| 29667 | 996  | 
by (insert mult_less_cancel_left [of c a 1], simp)  | 
| 26274 | 997  | 
|
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
998  | 
lemma sgn_sgn [simp]:  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
999  | 
"sgn (sgn a) = sgn a"  | 
| 29700 | 1000  | 
unfolding sgn_if by simp  | 
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
1001  | 
|
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
1002  | 
lemma sgn_0_0:  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
1003  | 
"sgn a = 0 \<longleftrightarrow> a = 0"  | 
| 29700 | 1004  | 
unfolding sgn_if by simp  | 
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
1005  | 
|
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
1006  | 
lemma sgn_1_pos:  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
1007  | 
"sgn a = 1 \<longleftrightarrow> a > 0"  | 
| 35216 | 1008  | 
unfolding sgn_if by simp  | 
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
1009  | 
|
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
1010  | 
lemma sgn_1_neg:  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
1011  | 
"sgn a = - 1 \<longleftrightarrow> a < 0"  | 
| 35216 | 1012  | 
unfolding sgn_if by auto  | 
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
1013  | 
|
| 29940 | 1014  | 
lemma sgn_pos [simp]:  | 
1015  | 
"0 < a \<Longrightarrow> sgn a = 1"  | 
|
1016  | 
unfolding sgn_1_pos .  | 
|
1017  | 
||
1018  | 
lemma sgn_neg [simp]:  | 
|
1019  | 
"a < 0 \<Longrightarrow> sgn a = - 1"  | 
|
1020  | 
unfolding sgn_1_neg .  | 
|
1021  | 
||
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
1022  | 
lemma sgn_times:  | 
| 
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
1023  | 
"sgn (a * b) = sgn a * sgn b"  | 
| 29667 | 1024  | 
by (auto simp add: sgn_if zero_less_mult_iff)  | 
| 
27651
 
16a26996c30e
moved op dvd to theory Ring_and_Field; generalized a couple of lemmas
 
haftmann 
parents: 
27516 
diff
changeset
 | 
1025  | 
|
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1026  | 
lemma abs_sgn: "\<bar>k\<bar> = k * sgn k"  | 
| 29700 | 1027  | 
unfolding sgn_if abs_if by auto  | 
1028  | 
||
| 29940 | 1029  | 
lemma sgn_greater [simp]:  | 
1030  | 
"0 < sgn a \<longleftrightarrow> 0 < a"  | 
|
1031  | 
unfolding sgn_if by auto  | 
|
1032  | 
||
1033  | 
lemma sgn_less [simp]:  | 
|
1034  | 
"sgn a < 0 \<longleftrightarrow> a < 0"  | 
|
1035  | 
unfolding sgn_if by auto  | 
|
1036  | 
||
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1037  | 
lemma abs_dvd_iff [simp]: "\<bar>m\<bar> dvd k \<longleftrightarrow> m dvd k"  | 
| 29949 | 1038  | 
by (simp add: abs_if)  | 
1039  | 
||
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1040  | 
lemma dvd_abs_iff [simp]: "m dvd \<bar>k\<bar> \<longleftrightarrow> m dvd k"  | 
| 29949 | 1041  | 
by (simp add: abs_if)  | 
| 29653 | 1042  | 
|
| 
33676
 
802f5e233e48
moved lemma from Algebra/IntRing to Ring_and_Field
 
nipkow 
parents: 
33364 
diff
changeset
 | 
1043  | 
lemma dvd_if_abs_eq:  | 
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1044  | 
"\<bar>l\<bar> = \<bar>k\<bar> \<Longrightarrow> l dvd k"  | 
| 
33676
 
802f5e233e48
moved lemma from Algebra/IntRing to Ring_and_Field
 
nipkow 
parents: 
33364 
diff
changeset
 | 
1045  | 
by(subst abs_dvd_iff[symmetric]) simp  | 
| 
 
802f5e233e48
moved lemma from Algebra/IntRing to Ring_and_Field
 
nipkow 
parents: 
33364 
diff
changeset
 | 
1046  | 
|
| 25917 | 1047  | 
end  | 
| 25230 | 1048  | 
|
| 26274 | 1049  | 
text {* Simprules for comparisons where common factors can be cancelled. *}
 | 
| 
15234
 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 
paulson 
parents: 
15229 
diff
changeset
 | 
1050  | 
|
| 
35828
 
46cfc4b8112e
now use "Named_Thms" for "noatp", and renamed "noatp" to "no_atp"
 
blanchet 
parents: 
35631 
diff
changeset
 | 
1051  | 
lemmas mult_compare_simps[no_atp] =  | 
| 
15234
 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 
paulson 
parents: 
15229 
diff
changeset
 | 
1052  | 
mult_le_cancel_right mult_le_cancel_left  | 
| 
 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 
paulson 
parents: 
15229 
diff
changeset
 | 
1053  | 
mult_le_cancel_right1 mult_le_cancel_right2  | 
| 
 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 
paulson 
parents: 
15229 
diff
changeset
 | 
1054  | 
mult_le_cancel_left1 mult_le_cancel_left2  | 
| 
 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 
paulson 
parents: 
15229 
diff
changeset
 | 
1055  | 
mult_less_cancel_right mult_less_cancel_left  | 
| 
 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 
paulson 
parents: 
15229 
diff
changeset
 | 
1056  | 
mult_less_cancel_right1 mult_less_cancel_right2  | 
| 
 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 
paulson 
parents: 
15229 
diff
changeset
 | 
1057  | 
mult_less_cancel_left1 mult_less_cancel_left2  | 
| 
 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 
paulson 
parents: 
15229 
diff
changeset
 | 
1058  | 
mult_cancel_right mult_cancel_left  | 
| 
 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 
paulson 
parents: 
15229 
diff
changeset
 | 
1059  | 
mult_cancel_right1 mult_cancel_right2  | 
| 
 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 
paulson 
parents: 
15229 
diff
changeset
 | 
1060  | 
mult_cancel_left1 mult_cancel_left2  | 
| 
 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 
paulson 
parents: 
15229 
diff
changeset
 | 
1061  | 
|
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1062  | 
text {* Reasoning about inequalities with division *}
 | 
| 
16775
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16568 
diff
changeset
 | 
1063  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
1064  | 
context linordered_semidom  | 
| 25193 | 1065  | 
begin  | 
1066  | 
||
1067  | 
lemma less_add_one: "a < a + 1"  | 
|
| 14293 | 1068  | 
proof -  | 
| 25193 | 1069  | 
have "a + 0 < a + 1"  | 
| 23482 | 1070  | 
by (blast intro: zero_less_one add_strict_left_mono)  | 
| 14293 | 1071  | 
thus ?thesis by simp  | 
1072  | 
qed  | 
|
1073  | 
||
| 25193 | 1074  | 
lemma zero_less_two: "0 < 1 + 1"  | 
| 29667 | 1075  | 
by (blast intro: less_trans zero_less_one less_add_one)  | 
| 25193 | 1076  | 
|
1077  | 
end  | 
|
| 
14365
 
3d4df8c166ae
replacing HOL/Real/PRat, PNat by the rational number development
 
paulson 
parents: 
14353 
diff
changeset
 | 
1078  | 
|
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1079  | 
context linordered_idom  | 
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1080  | 
begin  | 
| 
15234
 
ec91a90c604e
simplification tweaks for better arithmetic reasoning
 
paulson 
parents: 
15229 
diff
changeset
 | 
1081  | 
|
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1082  | 
lemma mult_right_le_one_le:  | 
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1083  | 
"0 \<le> x \<Longrightarrow> 0 \<le> y \<Longrightarrow> y \<le> 1 \<Longrightarrow> x * y \<le> x"  | 
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1084  | 
by (auto simp add: mult_le_cancel_left2)  | 
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1085  | 
|
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1086  | 
lemma mult_left_le_one_le:  | 
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1087  | 
"0 \<le> x \<Longrightarrow> 0 \<le> y \<Longrightarrow> y \<le> 1 \<Longrightarrow> y * x \<le> x"  | 
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1088  | 
by (auto simp add: mult_le_cancel_right2)  | 
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1089  | 
|
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1090  | 
end  | 
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1091  | 
|
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1092  | 
text {* Absolute Value *}
 | 
| 14293 | 1093  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
1094  | 
context linordered_idom  | 
| 
25304
 
7491c00f0915
removed subclass edge ordered_ring < lordered_ring
 
haftmann 
parents: 
25267 
diff
changeset
 | 
1095  | 
begin  | 
| 
 
7491c00f0915
removed subclass edge ordered_ring < lordered_ring
 
haftmann 
parents: 
25267 
diff
changeset
 | 
1096  | 
|
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1097  | 
lemma mult_sgn_abs:  | 
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1098  | 
"sgn x * \<bar>x\<bar> = x"  | 
| 
25304
 
7491c00f0915
removed subclass edge ordered_ring < lordered_ring
 
haftmann 
parents: 
25267 
diff
changeset
 | 
1099  | 
unfolding abs_if sgn_if by auto  | 
| 
 
7491c00f0915
removed subclass edge ordered_ring < lordered_ring
 
haftmann 
parents: 
25267 
diff
changeset
 | 
1100  | 
|
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1101  | 
lemma abs_one [simp]:  | 
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1102  | 
"\<bar>1\<bar> = 1"  | 
| 44921 | 1103  | 
by (simp add: abs_if)  | 
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1104  | 
|
| 
25304
 
7491c00f0915
removed subclass edge ordered_ring < lordered_ring
 
haftmann 
parents: 
25267 
diff
changeset
 | 
1105  | 
end  | 
| 24491 | 1106  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
1107  | 
class ordered_ring_abs = ordered_ring + ordered_ab_group_add_abs +  | 
| 
25304
 
7491c00f0915
removed subclass edge ordered_ring < lordered_ring
 
haftmann 
parents: 
25267 
diff
changeset
 | 
1108  | 
assumes abs_eq_mult:  | 
| 
 
7491c00f0915
removed subclass edge ordered_ring < lordered_ring
 
haftmann 
parents: 
25267 
diff
changeset
 | 
1109  | 
"(0 \<le> a \<or> a \<le> 0) \<and> (0 \<le> b \<or> b \<le> 0) \<Longrightarrow> \<bar>a * b\<bar> = \<bar>a\<bar> * \<bar>b\<bar>"  | 
| 
 
7491c00f0915
removed subclass edge ordered_ring < lordered_ring
 
haftmann 
parents: 
25267 
diff
changeset
 | 
1110  | 
|
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
1111  | 
context linordered_idom  | 
| 30961 | 1112  | 
begin  | 
1113  | 
||
| 
35028
 
108662d50512
more consistent naming of type classes involving orderings (and lattices) -- c.f. NEWS
 
haftmann 
parents: 
34146 
diff
changeset
 | 
1114  | 
subclass ordered_ring_abs proof  | 
| 35216 | 1115  | 
qed (auto simp add: abs_if not_less mult_less_0_iff)  | 
| 30961 | 1116  | 
|
1117  | 
lemma abs_mult:  | 
|
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1118  | 
"\<bar>a * b\<bar> = \<bar>a\<bar> * \<bar>b\<bar>"  | 
| 30961 | 1119  | 
by (rule abs_eq_mult) auto  | 
1120  | 
||
1121  | 
lemma abs_mult_self:  | 
|
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1122  | 
"\<bar>a\<bar> * \<bar>a\<bar> = a * a"  | 
| 30961 | 1123  | 
by (simp add: abs_if)  | 
1124  | 
||
| 
14294
 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 
paulson 
parents: 
14293 
diff
changeset
 | 
1125  | 
lemma abs_mult_less:  | 
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1126  | 
"\<bar>a\<bar> < c \<Longrightarrow> \<bar>b\<bar> < d \<Longrightarrow> \<bar>a\<bar> * \<bar>b\<bar> < c * d"  | 
| 
14294
 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 
paulson 
parents: 
14293 
diff
changeset
 | 
1127  | 
proof -  | 
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1128  | 
assume ac: "\<bar>a\<bar> < c"  | 
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1129  | 
hence cpos: "0<c" by (blast intro: le_less_trans abs_ge_zero)  | 
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1130  | 
assume "\<bar>b\<bar> < d"  | 
| 
14294
 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 
paulson 
parents: 
14293 
diff
changeset
 | 
1131  | 
thus ?thesis by (simp add: ac cpos mult_strict_mono)  | 
| 
 
f4d806fd72ce
absolute value theorems moved to HOL/Ring_and_Field
 
paulson 
parents: 
14293 
diff
changeset
 | 
1132  | 
qed  | 
| 14293 | 1133  | 
|
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1134  | 
lemma less_minus_self_iff:  | 
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1135  | 
"a < - a \<longleftrightarrow> a < 0"  | 
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1136  | 
by (simp only: less_le less_eq_neg_nonpos equal_neg_zero)  | 
| 14738 | 1137  | 
|
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1138  | 
lemma abs_less_iff:  | 
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1139  | 
"\<bar>a\<bar> < b \<longleftrightarrow> a < b \<and> - a < b"  | 
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1140  | 
by (simp add: less_le abs_le_iff) (auto simp add: abs_if)  | 
| 14738 | 1141  | 
|
| 
36301
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1142  | 
lemma abs_mult_pos:  | 
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1143  | 
"0 \<le> x \<Longrightarrow> \<bar>y\<bar> * x = \<bar>y * x\<bar>"  | 
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1144  | 
by (simp add: abs_mult)  | 
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1145  | 
|
| 
 
72f4d079ebf8
more localization; factored out lemmas for division_ring
 
haftmann 
parents: 
35828 
diff
changeset
 | 
1146  | 
end  | 
| 
16775
 
c1b87ef4a1c3
added lemmas to OrderedGroup.thy (reasoning about signs, absolute value, triangle inequalities)
 
avigad 
parents: 
16568 
diff
changeset
 | 
1147  | 
|
| 33364 | 1148  | 
code_modulename SML  | 
| 
35050
 
9f841f20dca6
renamed OrderedGroup to Groups; split theory Ring_and_Field into Rings Fields
 
haftmann 
parents: 
35043 
diff
changeset
 | 
1149  | 
Rings Arith  | 
| 33364 | 1150  | 
|
1151  | 
code_modulename OCaml  | 
|
| 
35050
 
9f841f20dca6
renamed OrderedGroup to Groups; split theory Ring_and_Field into Rings Fields
 
haftmann 
parents: 
35043 
diff
changeset
 | 
1152  | 
Rings Arith  | 
| 33364 | 1153  | 
|
1154  | 
code_modulename Haskell  | 
|
| 
35050
 
9f841f20dca6
renamed OrderedGroup to Groups; split theory Ring_and_Field into Rings Fields
 
haftmann 
parents: 
35043 
diff
changeset
 | 
1155  | 
Rings Arith  | 
| 33364 | 1156  | 
|
| 
14265
 
95b42e69436c
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
 
paulson 
parents:  
diff
changeset
 | 
1157  | 
end  |