150 by (rtac hcomplex_add_number_of_left 1); |
150 by (rtac hcomplex_add_number_of_left 1); |
151 qed "hcomplex_add_number_of_diff1"; |
151 qed "hcomplex_add_number_of_diff1"; |
152 |
152 |
153 Goal "number_of v + (c - number_of w) = \ |
153 Goal "number_of v + (c - number_of w) = \ |
154 \ number_of (bin_add v (bin_minus w)) + (c::hcomplex)"; |
154 \ number_of (bin_add v (bin_minus w)) + (c::hcomplex)"; |
155 by (auto_tac (claset(),simpset() addsimps [hcomplex_diff_def]@ hcomplex_add_ac)); |
155 by (auto_tac (claset(),simpset() addsimps [hcomplex_diff_def]@ add_ac)); |
156 qed "hcomplex_add_number_of_diff2"; |
156 qed "hcomplex_add_number_of_diff2"; |
157 |
157 |
158 Addsimps [hcomplex_add_number_of_left, hcomplex_mult_number_of_left, |
158 Addsimps [hcomplex_add_number_of_left, hcomplex_mult_number_of_left, |
159 hcomplex_add_number_of_diff1, hcomplex_add_number_of_diff2]; |
159 hcomplex_add_number_of_diff1, hcomplex_add_number_of_diff2]; |
160 |
160 |
169 |
169 |
170 (** For combine_numerals **) |
170 (** For combine_numerals **) |
171 |
171 |
172 Goal "i*u + (j*u + k) = (i+j)*u + (k::hcomplex)"; |
172 Goal "i*u + (j*u + k) = (i+j)*u + (k::hcomplex)"; |
173 by (asm_simp_tac (simpset() addsimps [hcomplex_add_mult_distrib] |
173 by (asm_simp_tac (simpset() addsimps [hcomplex_add_mult_distrib] |
174 @ hcomplex_add_ac) 1); |
174 @ add_ac) 1); |
175 qed "left_hcomplex_add_mult_distrib"; |
175 qed "left_hcomplex_add_mult_distrib"; |
176 |
176 |
177 (** For cancel_numerals **) |
177 (** For cancel_numerals **) |
178 |
178 |
179 Goal "((x::hcomplex) = u + v) = (x - (u + v) = 0)"; |
179 Goal "((x::hcomplex) = u + v) = (x - (u + v) = 0)"; |
186 |
186 |
187 val hcomplex_rel_iff_rel_0_rls = [hcomplex_eq_diff_eq_0,hcomplex_eq_add_diff_eq_0]; |
187 val hcomplex_rel_iff_rel_0_rls = [hcomplex_eq_diff_eq_0,hcomplex_eq_add_diff_eq_0]; |
188 |
188 |
189 Goal "!!i::hcomplex. (i*u + m = j*u + n) = ((i-j)*u + m = n)"; |
189 Goal "!!i::hcomplex. (i*u + m = j*u + n) = ((i-j)*u + m = n)"; |
190 by (auto_tac (claset(), simpset() addsimps [hcomplex_add_mult_distrib, |
190 by (auto_tac (claset(), simpset() addsimps [hcomplex_add_mult_distrib, |
191 hcomplex_diff_def] @ hcomplex_add_ac)); |
191 hcomplex_diff_def] @ add_ac)); |
192 by (asm_simp_tac (simpset() addsimps [hcomplex_add_assoc RS sym]) 1); |
192 by (asm_simp_tac (simpset() addsimps [hcomplex_add_assoc RS sym]) 1); |
193 by (simp_tac (simpset() addsimps [hcomplex_add_assoc]) 1); |
193 by (simp_tac (simpset() addsimps [hcomplex_add_assoc]) 1); |
194 qed "hcomplex_eq_add_iff1"; |
194 qed "hcomplex_eq_add_iff1"; |
195 |
195 |
196 Goal "!!i::hcomplex. (i*u + m = j*u + n) = (m = (j-i)*u + n)"; |
196 Goal "!!i::hcomplex. (i*u + m = j*u + n) = (m = (j-i)*u + n)"; |
307 bin_minus_1, bin_minus_0, bin_minus_Pls, bin_minus_Min, |
307 bin_minus_1, bin_minus_0, bin_minus_Pls, bin_minus_Min, |
308 bin_pred_1, bin_pred_0, bin_pred_Pls, bin_pred_Min]; |
308 bin_pred_1, bin_pred_0, bin_pred_Pls, bin_pred_Min]; |
309 |
309 |
310 |
310 |
311 (*To let us treat subtraction as addition*) |
311 (*To let us treat subtraction as addition*) |
312 val diff_simps = [hcomplex_diff_def, hcomplex_minus_add_distrib, |
312 val diff_simps = [hcomplex_diff_def, minus_add_distrib, minus_minus]; |
313 minus_minus]; |
|
314 |
313 |
315 (*push the unary minus down: - x * y = x * - y *) |
314 (*push the unary minus down: - x * y = x * - y *) |
316 val hcomplex_minus_mult_eq_1_to_2 = |
315 val hcomplex_minus_mult_eq_1_to_2 = |
317 [hcomplex_minus_mult_eq1 RS sym, hcomplex_minus_mult_eq2] MRS trans |
316 [minus_mult_left RS sym, minus_mult_right] MRS trans |
318 |> standard; |
317 |> standard; |
319 |
318 |
320 (*to extract again any uncancelled minuses*) |
319 (*to extract again any uncancelled minuses*) |
321 val hcomplex_minus_from_mult_simps = |
320 val hcomplex_minus_from_mult_simps = |
322 [minus_minus, hcomplex_minus_mult_eq1 RS sym, |
321 [minus_minus, minus_mult_left RS sym, minus_mult_right RS sym]; |
323 hcomplex_minus_mult_eq2 RS sym]; |
|
324 |
322 |
325 (*combine unary minus with numeric literals, however nested within a product*) |
323 (*combine unary minus with numeric literals, however nested within a product*) |
326 val hcomplex_mult_minus_simps = |
324 val hcomplex_mult_minus_simps = |
327 [hcomplex_mult_assoc, hcomplex_minus_mult_eq1, hcomplex_minus_mult_eq_1_to_2]; |
325 [hcomplex_mult_assoc, minus_mult_left, hcomplex_minus_mult_eq_1_to_2]; |
328 |
326 |
329 (*Final simplification: cancel + and * *) |
327 (*Final simplification: cancel + and * *) |
330 val simplify_meta_eq = |
328 val simplify_meta_eq = |
331 Int_Numeral_Simprocs.simplify_meta_eq |
329 Int_Numeral_Simprocs.simplify_meta_eq |
332 [hcomplex_add_zero_left, hcomplex_add_zero_right, |
330 [add_zero_left, add_zero_right, |
333 hcomplex_mult_zero_left, hcomplex_mult_zero_right, hcomplex_mult_one_left, |
331 mult_left_zero, mult_right_zero, mult_1, |
334 hcomplex_mult_one_right]; |
332 mult_1_right]; |
335 |
333 |
336 val prep_simproc = Complex_Numeral_Simprocs.prep_simproc; |
334 val prep_simproc = Complex_Numeral_Simprocs.prep_simproc; |
337 |
335 |
338 |
336 |
339 structure CancelNumeralsCommon = |
337 structure CancelNumeralsCommon = |
344 val dest_coeff = dest_coeff 1 |
342 val dest_coeff = dest_coeff 1 |
345 val find_first_coeff = find_first_coeff [] |
343 val find_first_coeff = find_first_coeff [] |
346 val trans_tac = Real_Numeral_Simprocs.trans_tac |
344 val trans_tac = Real_Numeral_Simprocs.trans_tac |
347 val norm_tac = |
345 val norm_tac = |
348 ALLGOALS (simp_tac (HOL_ss addsimps add_0s@mult_1s@diff_simps@ |
346 ALLGOALS (simp_tac (HOL_ss addsimps add_0s@mult_1s@diff_simps@ |
349 hcomplex_minus_simps@hcomplex_add_ac)) |
347 hcomplex_minus_simps@add_ac)) |
350 THEN ALLGOALS (simp_tac (HOL_ss addsimps non_add_bin_simps@hcomplex_mult_minus_simps)) |
348 THEN ALLGOALS (simp_tac (HOL_ss addsimps non_add_bin_simps@hcomplex_mult_minus_simps)) |
351 THEN ALLGOALS |
349 THEN ALLGOALS |
352 (simp_tac (HOL_ss addsimps hcomplex_minus_from_mult_simps@ |
350 (simp_tac (HOL_ss addsimps hcomplex_minus_from_mult_simps@ |
353 hcomplex_add_ac@hcomplex_mult_ac)) |
351 add_ac@mult_ac)) |
354 val numeral_simp_tac = ALLGOALS (simp_tac (HOL_ss addsimps add_0s@bin_simps)) |
352 val numeral_simp_tac = ALLGOALS (simp_tac (HOL_ss addsimps add_0s@bin_simps)) |
355 val simplify_meta_eq = simplify_meta_eq |
353 val simplify_meta_eq = simplify_meta_eq |
356 end; |
354 end; |
357 |
355 |
358 |
356 |
384 val left_distrib = left_hcomplex_add_mult_distrib RS trans |
382 val left_distrib = left_hcomplex_add_mult_distrib RS trans |
385 val prove_conv = Bin_Simprocs.prove_conv_nohyps |
383 val prove_conv = Bin_Simprocs.prove_conv_nohyps |
386 val trans_tac = Real_Numeral_Simprocs.trans_tac |
384 val trans_tac = Real_Numeral_Simprocs.trans_tac |
387 val norm_tac = |
385 val norm_tac = |
388 ALLGOALS (simp_tac (HOL_ss addsimps add_0s@mult_1s@diff_simps@ |
386 ALLGOALS (simp_tac (HOL_ss addsimps add_0s@mult_1s@diff_simps@ |
389 hcomplex_minus_simps@hcomplex_add_ac)) |
387 hcomplex_minus_simps@add_ac)) |
390 THEN ALLGOALS (simp_tac (HOL_ss addsimps non_add_bin_simps@hcomplex_mult_minus_simps)) |
388 THEN ALLGOALS (simp_tac (HOL_ss addsimps non_add_bin_simps@hcomplex_mult_minus_simps)) |
391 THEN ALLGOALS (simp_tac (HOL_ss addsimps hcomplex_minus_from_mult_simps@ |
389 THEN ALLGOALS (simp_tac (HOL_ss addsimps hcomplex_minus_from_mult_simps@ |
392 hcomplex_add_ac@hcomplex_mult_ac)) |
390 add_ac@mult_ac)) |
393 val numeral_simp_tac = ALLGOALS |
391 val numeral_simp_tac = ALLGOALS |
394 (simp_tac (HOL_ss addsimps add_0s@bin_simps)) |
392 (simp_tac (HOL_ss addsimps add_0s@bin_simps)) |
395 val simplify_meta_eq = simplify_meta_eq |
393 val simplify_meta_eq = simplify_meta_eq |
396 end; |
394 end; |
397 |
395 |
499 val ss = HOL_ss |
497 val ss = HOL_ss |
500 val eq_reflection = eq_reflection |
498 val eq_reflection = eq_reflection |
501 val sg_ref = Sign.self_ref (Theory.sign_of (the_context ())) |
499 val sg_ref = Sign.self_ref (Theory.sign_of (the_context ())) |
502 val T = HComplex_Numeral_Simprocs.hcomplexT |
500 val T = HComplex_Numeral_Simprocs.hcomplexT |
503 val plus = Const ("op *", [T,T] ---> T) |
501 val plus = Const ("op *", [T,T] ---> T) |
504 val add_ac = hcomplex_mult_ac |
502 val add_ac = mult_ac |
505 end; |
503 end; |
506 |
504 |
507 structure HComplex_Times_Assoc = Assoc_Fold (HComplex_Times_Assoc_Data); |
505 structure HComplex_Times_Assoc = Assoc_Fold (HComplex_Times_Assoc_Data); |
508 |
506 |
509 Addsimprocs [HComplex_Times_Assoc.conv]; |
507 Addsimprocs [HComplex_Times_Assoc.conv]; |