2 Author: Jacques D. Fleuriot |
2 Author: Jacques D. Fleuriot |
3 Copyright: 2001 University of Edinburgh |
3 Copyright: 2001 University of Edinburgh |
4 Description: Assorted facts that need binary literals |
4 Description: Assorted facts that need binary literals |
5 Also, common factor cancellation (see e.g. HyperArith0) |
5 Also, common factor cancellation (see e.g. HyperArith0) |
6 *) |
6 *) |
7 |
|
8 (** Division and inverse **) |
|
9 |
|
10 Goal "0/x = (0::complex)"; |
|
11 by (simp_tac (simpset() addsimps [complex_divide_def]) 1); |
|
12 qed "complex_0_divide"; |
|
13 Addsimps [complex_0_divide]; |
|
14 |
|
15 Goalw [complex_divide_def] "x/(0::complex) = 0"; |
|
16 by (stac COMPLEX_INVERSE_ZERO 1); |
|
17 by (Simp_tac 1); |
|
18 qed "COMPLEX_DIVIDE_ZERO"; |
|
19 |
|
20 Goal "inverse (x::complex) = 1/x"; |
|
21 by (simp_tac (simpset() addsimps [complex_divide_def]) 1); |
|
22 qed "complex_inverse_eq_divide"; |
|
23 |
|
24 Goal "(inverse(x::complex) = 0) = (x = 0)"; |
|
25 by (auto_tac (claset(), |
|
26 simpset() addsimps [COMPLEX_INVERSE_ZERO])); |
|
27 qed "complex_inverse_zero_iff"; |
|
28 Addsimps [complex_inverse_zero_iff]; |
|
29 |
|
30 Goal "(x/y = 0) = (x=0 | y=(0::complex))"; |
|
31 by (auto_tac (claset(), simpset() addsimps [complex_divide_def])); |
|
32 qed "complex_divide_eq_0_iff"; |
|
33 Addsimps [complex_divide_eq_0_iff]; |
|
34 |
|
35 Goal "h ~= (0::complex) ==> h/h = 1"; |
|
36 by (asm_simp_tac |
|
37 (simpset() addsimps [complex_divide_def]) 1); |
|
38 qed "complex_divide_self_eq"; |
|
39 Addsimps [complex_divide_self_eq]; |
|
40 |
|
41 bind_thm ("complex_mult_minus_right", complex_minus_mult_eq2 RS sym); |
|
42 |
|
43 Goal "!!k::complex. (k*m = k*n) = (k = 0 | m=n)"; |
|
44 by (case_tac "k=0" 1); |
|
45 by (auto_tac (claset(), simpset() addsimps [complex_mult_left_cancel])); |
|
46 qed "complex_mult_eq_cancel1"; |
|
47 |
|
48 Goal "!!k::complex. (m*k = n*k) = (k = 0 | m=n)"; |
|
49 by (case_tac "k=0" 1); |
|
50 by (auto_tac (claset(), simpset() addsimps [complex_mult_right_cancel])); |
|
51 qed "complex_mult_eq_cancel2"; |
|
52 |
|
53 Goal "!!k::complex. k~=0 ==> (k*m) / (k*n) = (m/n)"; |
|
54 by (asm_simp_tac |
|
55 (simpset() addsimps [complex_divide_def, complex_inverse_distrib]) 1); |
|
56 by (subgoal_tac "k * m * (inverse k * inverse n) = \ |
|
57 \ (k * inverse k) * (m * inverse n)" 1); |
|
58 by (Asm_full_simp_tac 1); |
|
59 by (asm_full_simp_tac (HOL_ss addsimps complex_mult_ac) 1); |
|
60 qed "complex_mult_div_cancel1"; |
|
61 |
|
62 (*For ExtractCommonTerm*) |
|
63 Goal "(k*m) / (k*n) = (if k = (0::complex) then 0 else m/n)"; |
|
64 by (simp_tac (simpset() addsimps [complex_mult_div_cancel1]) 1); |
|
65 qed "complex_mult_div_cancel_disj"; |
|
66 |
|
67 |
7 |
68 local |
8 local |
69 open Complex_Numeral_Simprocs |
9 open Complex_Numeral_Simprocs |
70 in |
10 in |
71 |
11 |
88 structure DivCancelNumeralFactor = CancelNumeralFactorFun |
28 structure DivCancelNumeralFactor = CancelNumeralFactorFun |
89 (open CancelNumeralFactorCommon |
29 (open CancelNumeralFactorCommon |
90 val prove_conv = Bin_Simprocs.prove_conv |
30 val prove_conv = Bin_Simprocs.prove_conv |
91 val mk_bal = HOLogic.mk_binop "HOL.divide" |
31 val mk_bal = HOLogic.mk_binop "HOL.divide" |
92 val dest_bal = HOLogic.dest_bin "HOL.divide" complexT |
32 val dest_bal = HOLogic.dest_bin "HOL.divide" complexT |
93 val cancel = complex_mult_div_cancel1 RS trans |
33 val cancel = mult_divide_cancel_left RS trans |
94 val neg_exchanges = false |
34 val neg_exchanges = false |
95 ) |
35 ) |
96 |
36 |
97 |
37 |
98 structure EqCancelNumeralFactor = CancelNumeralFactorFun |
38 structure EqCancelNumeralFactor = CancelNumeralFactorFun |
99 (open CancelNumeralFactorCommon |
39 (open CancelNumeralFactorCommon |
100 val prove_conv = Bin_Simprocs.prove_conv |
40 val prove_conv = Bin_Simprocs.prove_conv |
101 val mk_bal = HOLogic.mk_eq |
41 val mk_bal = HOLogic.mk_eq |
102 val dest_bal = HOLogic.dest_bin "op =" complexT |
42 val dest_bal = HOLogic.dest_bin "op =" complexT |
103 val cancel = complex_mult_eq_cancel1 RS trans |
43 val cancel = field_mult_cancel_left RS trans |
104 val neg_exchanges = false |
44 val neg_exchanges = false |
105 ) |
45 ) |
106 |
46 |
107 val complex_cancel_numeral_factors_relations = |
47 val complex_cancel_numeral_factors_relations = |
108 map prep_simproc |
48 map prep_simproc |
172 structure EqCancelFactor = ExtractCommonTermFun |
112 structure EqCancelFactor = ExtractCommonTermFun |
173 (open CancelFactorCommon |
113 (open CancelFactorCommon |
174 val prove_conv = Bin_Simprocs.prove_conv |
114 val prove_conv = Bin_Simprocs.prove_conv |
175 val mk_bal = HOLogic.mk_eq |
115 val mk_bal = HOLogic.mk_eq |
176 val dest_bal = HOLogic.dest_bin "op =" complexT |
116 val dest_bal = HOLogic.dest_bin "op =" complexT |
177 val simplify_meta_eq = cancel_simplify_meta_eq complex_mult_eq_cancel1 |
117 val simplify_meta_eq = cancel_simplify_meta_eq field_mult_cancel_left |
178 ); |
118 ); |
179 |
119 |
180 |
120 |
181 structure DivideCancelFactor = ExtractCommonTermFun |
121 structure DivideCancelFactor = ExtractCommonTermFun |
182 (open CancelFactorCommon |
122 (open CancelFactorCommon |
183 val prove_conv = Bin_Simprocs.prove_conv |
123 val prove_conv = Bin_Simprocs.prove_conv |
184 val mk_bal = HOLogic.mk_binop "HOL.divide" |
124 val mk_bal = HOLogic.mk_binop "HOL.divide" |
185 val dest_bal = HOLogic.dest_bin "HOL.divide" complexT |
125 val dest_bal = HOLogic.dest_bin "HOL.divide" complexT |
186 val simplify_meta_eq = cancel_simplify_meta_eq complex_mult_div_cancel_disj |
126 val simplify_meta_eq = cancel_simplify_meta_eq mult_divide_cancel_eq_if |
187 ); |
127 ); |
188 |
128 |
189 val complex_cancel_factor = |
129 val complex_cancel_factor = |
190 map prep_simproc |
130 map prep_simproc |
191 [("complex_eq_cancel_factor", ["(l::complex) * m = n", "(l::complex) = m * n"], |
131 [("complex_eq_cancel_factor", ["(l::complex) * m = n", "(l::complex) = m * n"], |
218 (*FIXME: what do we do about this?*) |
158 (*FIXME: what do we do about this?*) |
219 test "a*(b*c)/(y*z) = d*(b::complex)*(x*a)/z"; |
159 test "a*(b*c)/(y*z) = d*(b::complex)*(x*a)/z"; |
220 *) |
160 *) |
221 |
161 |
222 |
162 |
223 Goal "z~=0 ==> ((x::complex) = y/z) = (x*z = y)"; |
|
224 by (subgoal_tac "(x*z = y) = (x*z = (y/z)*z)" 1); |
|
225 by (asm_simp_tac (simpset() addsimps [complex_divide_def, complex_mult_assoc]) 2); |
|
226 by (etac ssubst 1); |
|
227 by (stac complex_mult_eq_cancel2 1); |
|
228 by (Asm_simp_tac 1); |
|
229 qed "complex_eq_divide_eq"; |
|
230 Addsimps [inst "z" "number_of ?w" complex_eq_divide_eq]; |
|
231 |
|
232 Goal "z~=0 ==> (y/z = (x::complex)) = (y = x*z)"; |
|
233 by (subgoal_tac "(y = x*z) = ((y/z)*z = x*z)" 1); |
|
234 by (asm_simp_tac (simpset() addsimps [complex_divide_def, complex_mult_assoc]) 2); |
|
235 by (etac ssubst 1); |
|
236 by (stac complex_mult_eq_cancel2 1); |
|
237 by (Asm_simp_tac 1); |
|
238 qed "complex_divide_eq_eq"; |
|
239 Addsimps [inst "z" "number_of ?w" complex_divide_eq_eq]; |
|
240 |
|
241 Goal "(m/k = n/k) = (k = 0 | m = (n::complex))"; |
|
242 by (case_tac "k=0" 1); |
|
243 by (asm_simp_tac (simpset() addsimps [COMPLEX_DIVIDE_ZERO]) 1); |
|
244 by (asm_simp_tac (simpset() addsimps [complex_divide_eq_eq, complex_eq_divide_eq, |
|
245 complex_mult_eq_cancel2]) 1); |
|
246 qed "complex_divide_eq_cancel2"; |
|
247 |
|
248 Goal "(k/m = k/n) = (k = 0 | m = (n::complex))"; |
|
249 by (case_tac "m=0 | n = 0" 1); |
|
250 by (auto_tac (claset(), |
|
251 simpset() addsimps [COMPLEX_DIVIDE_ZERO, complex_divide_eq_eq, |
|
252 complex_eq_divide_eq, complex_mult_eq_cancel1])); |
|
253 qed "complex_divide_eq_cancel1"; |
|
254 |
|
255 (** Division by 1, -1 **) |
163 (** Division by 1, -1 **) |
256 |
|
257 Goal "(x::complex)/1 = x"; |
|
258 by (simp_tac (simpset() addsimps [complex_divide_def]) 1); |
|
259 qed "complex_divide_1"; |
|
260 Addsimps [complex_divide_1]; |
|
261 |
164 |
262 Goal "x/-1 = -(x::complex)"; |
165 Goal "x/-1 = -(x::complex)"; |
263 by (Simp_tac 1); |
166 by (Simp_tac 1); |
264 qed "complex_divide_minus1"; |
167 qed "complex_divide_minus1"; |
265 Addsimps [complex_divide_minus1]; |
168 Addsimps [complex_divide_minus1]; |
267 Goal "-1/(x::complex) = - (1/x)"; |
170 Goal "-1/(x::complex) = - (1/x)"; |
268 by (simp_tac (simpset() addsimps [complex_divide_def, complex_minus_inverse]) 1); |
171 by (simp_tac (simpset() addsimps [complex_divide_def, complex_minus_inverse]) 1); |
269 qed "complex_minus1_divide"; |
172 qed "complex_minus1_divide"; |
270 Addsimps [complex_minus1_divide]; |
173 Addsimps [complex_minus1_divide]; |
271 |
174 |
272 |
|
273 Goal "(x = - y) = (y = - (x::complex))"; |
|
274 by Auto_tac; |
|
275 qed "complex_equation_minus"; |
|
276 |
|
277 Goal "(- x = y) = (- (y::complex) = x)"; |
|
278 by Auto_tac; |
|
279 qed "complex_minus_equation"; |
|
280 |
|
281 Goal "(x + - a = (0::complex)) = (x=a)"; |
175 Goal "(x + - a = (0::complex)) = (x=a)"; |
282 by (simp_tac (simpset() addsimps [complex_diff_eq_eq,symmetric complex_diff_def]) 1); |
176 by (simp_tac (simpset() addsimps [complex_diff_eq_eq,symmetric complex_diff_def]) 1); |
283 qed "complex_add_minus_iff"; |
177 qed "complex_add_minus_iff"; |
284 Addsimps [complex_add_minus_iff]; |
178 Addsimps [complex_add_minus_iff]; |
285 |
|
286 Goal "(-b = -a) = (b = (a::complex))"; |
|
287 by Auto_tac; |
|
288 qed "complex_minus_eq_cancel"; |
|
289 Addsimps [complex_minus_eq_cancel]; |
|
290 |
|
291 (*Distributive laws for literals*) |
|
292 Addsimps (map (inst "w" "number_of ?v") |
|
293 [complex_add_mult_distrib, complex_add_mult_distrib2, |
|
294 complex_diff_mult_distrib, complex_diff_mult_distrib2]); |
|
295 |
|
296 Addsimps [inst "x" "number_of ?v" complex_equation_minus]; |
|
297 |
|
298 Addsimps [inst "y" "number_of ?v" complex_minus_equation]; |
|
299 |
179 |
300 Goal "(x+y = (0::complex)) = (y = -x)"; |
180 Goal "(x+y = (0::complex)) = (y = -x)"; |
301 by Auto_tac; |
181 by Auto_tac; |
302 by (dtac (sym RS (complex_diff_eq_eq RS iffD2)) 1); |
182 by (dtac (sym RS (complex_diff_eq_eq RS iffD2)) 1); |
303 by Auto_tac; |
183 by Auto_tac; |
304 qed "complex_add_eq_0_iff"; |
184 qed "complex_add_eq_0_iff"; |
305 AddIffs [complex_add_eq_0_iff]; |
185 AddIffs [complex_add_eq_0_iff]; |
306 |
186 |
307 Goalw [complex_diff_def]"-(x-y) = y - (x::complex)"; |
|
308 by (auto_tac (claset(),simpset() addsimps [complex_add_commute])); |
|
309 qed "complex_minus_diff_eq"; |
|
310 Addsimps [complex_minus_diff_eq]; |
|
311 |
187 |
312 Addsimps [inst "x" "number_of ?w" complex_inverse_eq_divide]; |
|
313 |
|