91 lemma nat_mult_div_cancel_disj[simp]: |
91 lemma nat_mult_div_cancel_disj[simp]: |
92 "(k*m) div (k*n) = (if k = (0::nat) then 0 else m div n)" |
92 "(k*m) div (k*n) = (if k = (0::nat) then 0 else m div n)" |
93 by (simp add: nat_mult_div_cancel1) |
93 by (simp add: nat_mult_div_cancel1) |
94 |
94 |
95 use "Tools/numeral_simprocs.ML" |
95 use "Tools/numeral_simprocs.ML" |
|
96 |
|
97 simproc_setup semiring_assoc_fold |
|
98 ("(a::'a::comm_semiring_1_cancel) * b") = |
|
99 {* fn phi => Numeral_Simprocs.assoc_fold *} |
|
100 |
|
101 simproc_setup int_combine_numerals |
|
102 ("(i::'a::number_ring) + j" | "(i::'a::number_ring) - j") = |
|
103 {* fn phi => Numeral_Simprocs.combine_numerals *} |
|
104 |
|
105 simproc_setup field_combine_numerals |
|
106 ("(i::'a::{field_inverse_zero, number_ring}) + j" |
|
107 |"(i::'a::{field_inverse_zero, number_ring}) - j") = |
|
108 {* fn phi => Numeral_Simprocs.field_combine_numerals *} |
|
109 |
|
110 simproc_setup inteq_cancel_numerals |
|
111 ("(l::'a::number_ring) + m = n" |
|
112 |"(l::'a::number_ring) = m + n" |
|
113 |"(l::'a::number_ring) - m = n" |
|
114 |"(l::'a::number_ring) = m - n" |
|
115 |"(l::'a::number_ring) * m = n" |
|
116 |"(l::'a::number_ring) = m * n") = |
|
117 {* fn phi => Numeral_Simprocs.eq_cancel_numerals *} |
|
118 |
|
119 simproc_setup intless_cancel_numerals |
|
120 ("(l::'a::{linordered_idom,number_ring}) + m < n" |
|
121 |"(l::'a::{linordered_idom,number_ring}) < m + n" |
|
122 |"(l::'a::{linordered_idom,number_ring}) - m < n" |
|
123 |"(l::'a::{linordered_idom,number_ring}) < m - n" |
|
124 |"(l::'a::{linordered_idom,number_ring}) * m < n" |
|
125 |"(l::'a::{linordered_idom,number_ring}) < m * n") = |
|
126 {* fn phi => Numeral_Simprocs.less_cancel_numerals *} |
|
127 |
|
128 simproc_setup intle_cancel_numerals |
|
129 ("(l::'a::{linordered_idom,number_ring}) + m \<le> n" |
|
130 |"(l::'a::{linordered_idom,number_ring}) \<le> m + n" |
|
131 |"(l::'a::{linordered_idom,number_ring}) - m \<le> n" |
|
132 |"(l::'a::{linordered_idom,number_ring}) \<le> m - n" |
|
133 |"(l::'a::{linordered_idom,number_ring}) * m \<le> n" |
|
134 |"(l::'a::{linordered_idom,number_ring}) \<le> m * n") = |
|
135 {* fn phi => Numeral_Simprocs.le_cancel_numerals *} |
|
136 |
|
137 simproc_setup ring_eq_cancel_numeral_factor |
|
138 ("(l::'a::{idom,number_ring}) * m = n" |
|
139 |"(l::'a::{idom,number_ring}) = m * n") = |
|
140 {* fn phi => Numeral_Simprocs.eq_cancel_numeral_factor *} |
|
141 |
|
142 simproc_setup ring_less_cancel_numeral_factor |
|
143 ("(l::'a::{linordered_idom,number_ring}) * m < n" |
|
144 |"(l::'a::{linordered_idom,number_ring}) < m * n") = |
|
145 {* fn phi => Numeral_Simprocs.less_cancel_numeral_factor *} |
|
146 |
|
147 simproc_setup ring_le_cancel_numeral_factor |
|
148 ("(l::'a::{linordered_idom,number_ring}) * m <= n" |
|
149 |"(l::'a::{linordered_idom,number_ring}) <= m * n") = |
|
150 {* fn phi => Numeral_Simprocs.le_cancel_numeral_factor *} |
|
151 |
|
152 simproc_setup int_div_cancel_numeral_factors |
|
153 ("((l::'a::{semiring_div,number_ring}) * m) div n" |
|
154 |"(l::'a::{semiring_div,number_ring}) div (m * n)") = |
|
155 {* fn phi => Numeral_Simprocs.div_cancel_numeral_factor *} |
|
156 |
|
157 simproc_setup divide_cancel_numeral_factor |
|
158 ("((l::'a::{field_inverse_zero,number_ring}) * m) / n" |
|
159 |"(l::'a::{field_inverse_zero,number_ring}) / (m * n)" |
|
160 |"((number_of v)::'a::{field_inverse_zero,number_ring}) / (number_of w)") = |
|
161 {* fn phi => Numeral_Simprocs.divide_cancel_numeral_factor *} |
|
162 |
|
163 simproc_setup ring_eq_cancel_factor |
|
164 ("(l::'a::idom) * m = n" | "(l::'a::idom) = m * n") = |
|
165 {* fn phi => Numeral_Simprocs.eq_cancel_factor *} |
|
166 |
|
167 simproc_setup linordered_ring_le_cancel_factor |
|
168 ("(l::'a::linordered_ring) * m <= n" |
|
169 |"(l::'a::linordered_ring) <= m * n") = |
|
170 {* fn phi => Numeral_Simprocs.le_cancel_factor *} |
|
171 |
|
172 simproc_setup linordered_ring_less_cancel_factor |
|
173 ("(l::'a::linordered_ring) * m < n" |
|
174 |"(l::'a::linordered_ring) < m * n") = |
|
175 {* fn phi => Numeral_Simprocs.less_cancel_factor *} |
|
176 |
|
177 simproc_setup int_div_cancel_factor |
|
178 ("((l::'a::semiring_div) * m) div n" |
|
179 |"(l::'a::semiring_div) div (m * n)") = |
|
180 {* fn phi => Numeral_Simprocs.div_cancel_factor *} |
|
181 |
|
182 simproc_setup int_mod_cancel_factor |
|
183 ("((l::'a::semiring_div) * m) mod n" |
|
184 |"(l::'a::semiring_div) mod (m * n)") = |
|
185 {* fn phi => Numeral_Simprocs.mod_cancel_factor *} |
|
186 |
|
187 simproc_setup dvd_cancel_factor |
|
188 ("((l::'a::idom) * m) dvd n" |
|
189 |"(l::'a::idom) dvd (m * n)") = |
|
190 {* fn phi => Numeral_Simprocs.dvd_cancel_factor *} |
|
191 |
|
192 simproc_setup divide_cancel_factor |
|
193 ("((l::'a::field_inverse_zero) * m) / n" |
|
194 |"(l::'a::field_inverse_zero) / (m * n)") = |
|
195 {* fn phi => Numeral_Simprocs.divide_cancel_factor *} |
96 |
196 |
97 use "Tools/nat_numeral_simprocs.ML" |
197 use "Tools/nat_numeral_simprocs.ML" |
98 |
198 |
99 declaration {* |
199 declaration {* |
100 K (Lin_Arith.add_simps (@{thms neg_simps} @ [@{thm Suc_nat_number_of}, @{thm int_nat_number_of}]) |
200 K (Lin_Arith.add_simps (@{thms neg_simps} @ [@{thm Suc_nat_number_of}, @{thm int_nat_number_of}]) |
108 @{thm mult_Suc}, @{thm mult_Suc_right}, |
208 @{thm mult_Suc}, @{thm mult_Suc_right}, |
109 @{thm add_Suc}, @{thm add_Suc_right}, |
209 @{thm add_Suc}, @{thm add_Suc_right}, |
110 @{thm eq_number_of_0}, @{thm eq_0_number_of}, @{thm less_0_number_of}, |
210 @{thm eq_number_of_0}, @{thm eq_0_number_of}, @{thm less_0_number_of}, |
111 @{thm of_int_number_of_eq}, @{thm of_nat_number_of_eq}, @{thm nat_number_of}, |
211 @{thm of_int_number_of_eq}, @{thm of_nat_number_of_eq}, @{thm nat_number_of}, |
112 @{thm if_True}, @{thm if_False}]) |
212 @{thm if_True}, @{thm if_False}]) |
113 #> Lin_Arith.add_simprocs (Numeral_Simprocs.assoc_fold_simproc |
213 #> Lin_Arith.add_simprocs |
114 :: Numeral_Simprocs.combine_numerals |
214 [@{simproc semiring_assoc_fold}, |
115 :: Numeral_Simprocs.cancel_numerals) |
215 @{simproc int_combine_numerals}, |
|
216 @{simproc inteq_cancel_numerals}, |
|
217 @{simproc intless_cancel_numerals}, |
|
218 @{simproc intle_cancel_numerals}] |
116 #> Lin_Arith.add_simprocs (Nat_Numeral_Simprocs.combine_numerals :: Nat_Numeral_Simprocs.cancel_numerals)) |
219 #> Lin_Arith.add_simprocs (Nat_Numeral_Simprocs.combine_numerals :: Nat_Numeral_Simprocs.cancel_numerals)) |
117 *} |
220 *} |
118 |
221 |
119 end |
222 end |