336 |
336 |
337 (* real multiplication is an AC operator *) |
337 (* real multiplication is an AC operator *) |
338 bind_thms ("real_mult_ac", |
338 bind_thms ("real_mult_ac", |
339 [real_mult_assoc, real_mult_commute, real_mult_left_commute]); |
339 [real_mult_assoc, real_mult_commute, real_mult_left_commute]); |
340 |
340 |
341 Goalw [real_one_def,pnat_one_def] "1r * z = z"; |
341 Goalw [real_one_def,pnat_one_def] "(1::real) * z = z"; |
342 by (res_inst_tac [("z","z")] eq_Abs_REAL 1); |
342 by (res_inst_tac [("z","z")] eq_Abs_REAL 1); |
343 by (asm_full_simp_tac |
343 by (asm_full_simp_tac |
344 (simpset() addsimps [real_mult, |
344 (simpset() addsimps [real_mult, |
345 preal_add_mult_distrib2,preal_mult_1_right] |
345 preal_add_mult_distrib2,preal_mult_1_right] |
346 @ preal_mult_ac @ preal_add_ac) 1); |
346 @ preal_mult_ac @ preal_add_ac) 1); |
347 qed "real_mult_1"; |
347 qed "real_mult_1"; |
348 |
348 |
349 Addsimps [real_mult_1]; |
349 Addsimps [real_mult_1]; |
350 |
350 |
351 Goal "z * 1r = z"; |
351 Goal "z * (1::real) = z"; |
352 by (simp_tac (simpset() addsimps [real_mult_commute]) 1); |
352 by (simp_tac (simpset() addsimps [real_mult_commute]) 1); |
353 qed "real_mult_1_right"; |
353 qed "real_mult_1_right"; |
354 |
354 |
355 Addsimps [real_mult_1_right]; |
355 Addsimps [real_mult_1_right]; |
356 |
356 |
380 real_minus_mult_eq1]) 1); |
380 real_minus_mult_eq1]) 1); |
381 qed "real_minus_mult_eq2"; |
381 qed "real_minus_mult_eq2"; |
382 |
382 |
383 Addsimps [real_minus_mult_eq1 RS sym, real_minus_mult_eq2 RS sym]; |
383 Addsimps [real_minus_mult_eq1 RS sym, real_minus_mult_eq2 RS sym]; |
384 |
384 |
385 Goal "(- 1r) * z = -z"; |
385 Goal "(- (1::real)) * z = -z"; |
386 by (Simp_tac 1); |
386 by (Simp_tac 1); |
387 qed "real_mult_minus_1"; |
387 qed "real_mult_minus_1"; |
388 |
388 |
389 Goal "z * (- 1r) = -z"; |
389 Goal "z * (- (1::real)) = -z"; |
390 by (stac real_mult_commute 1); |
390 by (stac real_mult_commute 1); |
391 by (Simp_tac 1); |
391 by (Simp_tac 1); |
392 qed "real_mult_minus_1_right"; |
392 qed "real_mult_minus_1_right"; |
393 |
393 |
394 Addsimps [real_mult_minus_1_right]; |
394 Addsimps [real_mult_minus_1_right]; |
439 by (simp_tac (simpset() addsimps [real_mult_commute', |
439 by (simp_tac (simpset() addsimps [real_mult_commute', |
440 real_diff_mult_distrib]) 1); |
440 real_diff_mult_distrib]) 1); |
441 qed "real_diff_mult_distrib2"; |
441 qed "real_diff_mult_distrib2"; |
442 |
442 |
443 (*** one and zero are distinct ***) |
443 (*** one and zero are distinct ***) |
444 Goalw [real_zero_def,real_one_def] "0 ~= 1r"; |
444 Goalw [real_zero_def,real_one_def] "0 ~= (1::real)"; |
445 by (auto_tac (claset(), |
445 by (auto_tac (claset(), |
446 simpset() addsimps [preal_self_less_add_left RS preal_not_refl2])); |
446 simpset() addsimps [preal_self_less_add_left RS preal_not_refl2])); |
447 qed "real_zero_not_eq_one"; |
447 qed "real_zero_not_eq_one"; |
448 |
448 |
449 (*** existence of inverse ***) |
449 (*** existence of inverse ***) |
451 Goalw [real_zero_def] "0 = Abs_REAL (realrel `` {(x, x)})"; |
451 Goalw [real_zero_def] "0 = Abs_REAL (realrel `` {(x, x)})"; |
452 by (auto_tac (claset(),simpset() addsimps [preal_add_commute])); |
452 by (auto_tac (claset(),simpset() addsimps [preal_add_commute])); |
453 qed "real_zero_iff"; |
453 qed "real_zero_iff"; |
454 |
454 |
455 Goalw [real_zero_def,real_one_def] |
455 Goalw [real_zero_def,real_one_def] |
456 "!!(x::real). x ~= 0 ==> EX y. x*y = 1r"; |
456 "!!(x::real). x ~= 0 ==> EX y. x*y = (1::real)"; |
457 by (res_inst_tac [("z","x")] eq_Abs_REAL 1); |
457 by (res_inst_tac [("z","x")] eq_Abs_REAL 1); |
458 by (cut_inst_tac [("r1.0","xa"),("r2.0","y")] preal_linear 1); |
458 by (cut_inst_tac [("r1.0","xa"),("r2.0","y")] preal_linear 1); |
459 by (auto_tac (claset() addSDs [preal_less_add_left_Ex], |
459 by (auto_tac (claset() addSDs [preal_less_add_left_Ex], |
460 simpset() addsimps [real_zero_iff RS sym])); |
460 simpset() addsimps [real_zero_iff RS sym])); |
461 by (res_inst_tac [("x","Abs_REAL (realrel `` \ |
461 by (res_inst_tac [("x","Abs_REAL (realrel `` \ |
469 pnat_one_def,preal_mult_1_right,preal_add_mult_distrib2, |
469 pnat_one_def,preal_mult_1_right,preal_add_mult_distrib2, |
470 preal_add_mult_distrib,preal_mult_1,preal_mult_inv_right] |
470 preal_add_mult_distrib,preal_mult_1,preal_mult_inv_right] |
471 @ preal_add_ac @ preal_mult_ac)); |
471 @ preal_add_ac @ preal_mult_ac)); |
472 qed "real_mult_inv_right_ex"; |
472 qed "real_mult_inv_right_ex"; |
473 |
473 |
474 Goal "x ~= 0 ==> EX y. y*x = 1r"; |
474 Goal "x ~= 0 ==> EX y. y*x = (1::real)"; |
475 by (dtac real_mult_inv_right_ex 1); |
475 by (dtac real_mult_inv_right_ex 1); |
476 by (auto_tac (claset(), simpset() addsimps [real_mult_commute])); |
476 by (auto_tac (claset(), simpset() addsimps [real_mult_commute])); |
477 qed "real_mult_inv_left_ex"; |
477 qed "real_mult_inv_left_ex"; |
478 |
478 |
479 Goalw [real_inverse_def] "x ~= 0 ==> inverse(x)*x = 1r"; |
479 Goalw [real_inverse_def] "x ~= 0 ==> inverse(x)*x = (1::real)"; |
480 by (ftac real_mult_inv_left_ex 1); |
480 by (ftac real_mult_inv_left_ex 1); |
481 by (Step_tac 1); |
481 by (Step_tac 1); |
482 by (rtac someI2 1); |
482 by (rtac someI2 1); |
483 by Auto_tac; |
483 by Auto_tac; |
484 qed "real_mult_inv_left"; |
484 qed "real_mult_inv_left"; |
485 Addsimps [real_mult_inv_left]; |
485 Addsimps [real_mult_inv_left]; |
486 |
486 |
487 Goal "x ~= 0 ==> x*inverse(x) = 1r"; |
487 Goal "x ~= 0 ==> x*inverse(x) = (1::real)"; |
488 by (stac real_mult_commute 1); |
488 by (stac real_mult_commute 1); |
489 by (auto_tac (claset(), simpset() addsimps [real_mult_inv_left])); |
489 by (auto_tac (claset(), simpset() addsimps [real_mult_inv_left])); |
490 qed "real_mult_inv_right"; |
490 qed "real_mult_inv_right"; |
491 Addsimps [real_mult_inv_right]; |
491 Addsimps [real_mult_inv_right]; |
492 |
492 |
546 by (etac real_inverse_not_zero 1); |
546 by (etac real_inverse_not_zero 1); |
547 by (auto_tac (claset() addDs [real_inverse_not_zero],simpset())); |
547 by (auto_tac (claset() addDs [real_inverse_not_zero],simpset())); |
548 qed "real_inverse_inverse"; |
548 qed "real_inverse_inverse"; |
549 Addsimps [real_inverse_inverse]; |
549 Addsimps [real_inverse_inverse]; |
550 |
550 |
551 Goalw [real_inverse_def] "inverse(1r) = 1r"; |
551 Goalw [real_inverse_def] "inverse((1::real)) = (1::real)"; |
552 by (cut_facts_tac [real_zero_not_eq_one RS |
552 by (cut_facts_tac [real_zero_not_eq_one RS |
553 not_sym RS real_mult_inv_left_ex] 1); |
553 not_sym RS real_mult_inv_left_ex] 1); |
554 by (auto_tac (claset(), |
554 by (auto_tac (claset(), |
555 simpset() addsimps [real_zero_not_eq_one RS not_sym])); |
555 simpset() addsimps [real_zero_not_eq_one RS not_sym])); |
556 qed "real_inverse_1"; |
556 qed "real_inverse_1"; |