src/HOL/Real/RealDef.ML
changeset 10648 a8c647cfa31f
parent 10606 e3229a37d53f
child 10712 351ba950d4d9
equal deleted inserted replaced
10647:a4529a251b6f 10648:a8c647cfa31f
   486     pnat_one_def,preal_mult_1_right,preal_add_mult_distrib2,
   486     pnat_one_def,preal_mult_1_right,preal_add_mult_distrib2,
   487     preal_add_mult_distrib,preal_mult_1,preal_mult_inv_right] 
   487     preal_add_mult_distrib,preal_mult_1,preal_mult_inv_right] 
   488     @ preal_add_ac @ preal_mult_ac));
   488     @ preal_add_ac @ preal_mult_ac));
   489 qed "real_mult_inv_right_ex";
   489 qed "real_mult_inv_right_ex";
   490 
   490 
   491 Goal "!!(x::real). x ~= 0 ==> EX y. y*x = 1r";
   491 Goal "x ~= 0 ==> EX y. y*x = 1r";
   492 by (asm_simp_tac (simpset() addsimps [real_mult_commute,
   492 by (dtac real_mult_inv_right_ex 1); 
   493 				      real_mult_inv_right_ex]) 1);
   493 by (auto_tac (claset(), simpset() addsimps [real_mult_commute]));  
   494 qed "real_mult_inv_left_ex";
   494 qed "real_mult_inv_left_ex";
   495 
   495 
   496 Goalw [real_inverse_def] "x ~= 0 ==> inverse(x)*x = 1r";
   496 Goalw [real_inverse_def] "x ~= 0 ==> inverse(x)*x = 1r";
   497 by (ftac real_mult_inv_left_ex 1);
   497 by (ftac real_mult_inv_left_ex 1);
   498 by (Step_tac 1);
   498 by (Step_tac 1);
   499 by (rtac someI2 1);
   499 by (rtac someI2 1);
   500 by Auto_tac;
   500 by Auto_tac;
   501 qed "real_mult_inv_left";
   501 qed "real_mult_inv_left";
       
   502 Addsimps [real_mult_inv_left];
   502 
   503 
   503 Goal "x ~= 0 ==> x*inverse(x) = 1r";
   504 Goal "x ~= 0 ==> x*inverse(x) = 1r";
   504 by (auto_tac (claset() addIs [real_mult_commute RS subst],
   505 by (stac real_mult_commute 1);
   505               simpset() addsimps [real_mult_inv_left]));
   506 by (auto_tac (claset(), simpset() addsimps [real_mult_inv_left]));
   506 qed "real_mult_inv_right";
   507 qed "real_mult_inv_right";
       
   508 Addsimps [real_mult_inv_right];
       
   509 
       
   510 (** Inverse of zero!  Useful to simplify certain equations **)
       
   511 
       
   512 Goalw [real_inverse_def] "inverse 0 = (0::real)";
       
   513 by (rtac someI2 1);
       
   514 by (auto_tac (claset(), simpset() addsimps [real_zero_not_eq_one]));  
       
   515 qed "INVERSE_ZERO";
       
   516 
       
   517 Goal "a / (0::real) = 0";
       
   518 by (simp_tac (simpset() addsimps [real_divide_def, INVERSE_ZERO]) 1);
       
   519 qed "DIVISION_BY_ZERO";  (*NOT for adding to default simpset*)
       
   520 
       
   521 fun real_div_undefined_case_tac s i =
       
   522   case_tac s i THEN 
       
   523   asm_simp_tac (simpset() addsimps [DIVISION_BY_ZERO, INVERSE_ZERO]) i;
       
   524 
   507 
   525 
   508 Goal "(c::real) ~= 0 ==> (c*a=c*b) = (a=b)";
   526 Goal "(c::real) ~= 0 ==> (c*a=c*b) = (a=b)";
   509 by Auto_tac;
   527 by Auto_tac;
   510 by (dres_inst_tac [("f","%x. x*inverse c")] arg_cong 1);
   528 by (dres_inst_tac [("f","%x. x*inverse c")] arg_cong 1);
   511 by (asm_full_simp_tac (simpset() addsimps [real_mult_inv_right] @ real_mult_ac)  1);
   529 by (asm_full_simp_tac (simpset() addsimps real_mult_ac)  1);
   512 qed "real_mult_left_cancel";
   530 qed "real_mult_left_cancel";
   513     
   531     
   514 Goal "(c::real) ~= 0 ==> (a*c=b*c) = (a=b)";
   532 Goal "(c::real) ~= 0 ==> (a*c=b*c) = (a=b)";
   515 by (Step_tac 1);
   533 by (Step_tac 1);
   516 by (dres_inst_tac [("f","%x. x*inverse c")] arg_cong 1);
   534 by (dres_inst_tac [("f","%x. x*inverse c")] arg_cong 1);
   517 by (asm_full_simp_tac
   535 by (asm_full_simp_tac (simpset() addsimps real_mult_ac)  1);
   518     (simpset() addsimps [real_mult_inv_right] @ real_mult_ac)  1);
       
   519 qed "real_mult_right_cancel";
   536 qed "real_mult_right_cancel";
   520 
   537 
   521 Goal "c*a ~= c*b ==> a ~= b";
   538 Goal "c*a ~= c*b ==> a ~= b";
   522 by Auto_tac;
   539 by Auto_tac;
   523 qed "real_mult_left_cancel_ccontr";
   540 qed "real_mult_left_cancel_ccontr";
   529 Goalw [real_inverse_def] "x ~= 0 ==> inverse(x::real) ~= 0";
   546 Goalw [real_inverse_def] "x ~= 0 ==> inverse(x::real) ~= 0";
   530 by (ftac real_mult_inv_left_ex 1);
   547 by (ftac real_mult_inv_left_ex 1);
   531 by (etac exE 1);
   548 by (etac exE 1);
   532 by (rtac someI2 1);
   549 by (rtac someI2 1);
   533 by (auto_tac (claset(),
   550 by (auto_tac (claset(),
   534 	      simpset() addsimps [real_mult_0,
   551 	      simpset() addsimps [real_mult_0, real_zero_not_eq_one]));
   535     real_zero_not_eq_one]));
       
   536 qed "real_inverse_not_zero";
   552 qed "real_inverse_not_zero";
   537 
       
   538 Addsimps [real_mult_inv_left,real_mult_inv_right];
       
   539 
   553 
   540 Goal "[| x ~= 0; y ~= 0 |] ==> x * y ~= (0::real)";
   554 Goal "[| x ~= 0; y ~= 0 |] ==> x * y ~= (0::real)";
   541 by (Step_tac 1);
   555 by (Step_tac 1);
   542 by (dres_inst_tac [("f","%z. inverse x*z")] arg_cong 1);
   556 by (dres_inst_tac [("f","%z. inverse x*z")] arg_cong 1);
   543 by (asm_full_simp_tac (simpset() addsimps [real_mult_assoc RS sym]) 1);
   557 by (asm_full_simp_tac (simpset() addsimps [real_mult_assoc RS sym]) 1);
   544 qed "real_mult_not_zero";
   558 qed "real_mult_not_zero";
   545 
   559 
   546 bind_thm ("real_mult_not_zeroE",real_mult_not_zero RS notE);
   560 bind_thm ("real_mult_not_zeroE",real_mult_not_zero RS notE);
   547 
   561 
   548 Goal "x ~= 0 ==> inverse(inverse (x::real)) = x";
   562 Goal "inverse(inverse (x::real)) = x";
       
   563 by (real_div_undefined_case_tac "x=0" 1);
   549 by (res_inst_tac [("c1","inverse x")] (real_mult_right_cancel RS iffD1) 1);
   564 by (res_inst_tac [("c1","inverse x")] (real_mult_right_cancel RS iffD1) 1);
   550 by (etac real_inverse_not_zero 1);
   565 by (etac real_inverse_not_zero 1);
   551 by (auto_tac (claset() addDs [real_inverse_not_zero],simpset()));
   566 by (auto_tac (claset() addDs [real_inverse_not_zero],simpset()));
   552 qed "real_inverse_inverse";
   567 qed "real_inverse_inverse";
       
   568 Addsimps [real_inverse_inverse];
   553 
   569 
   554 Goalw [real_inverse_def] "inverse(1r) = 1r";
   570 Goalw [real_inverse_def] "inverse(1r) = 1r";
   555 by (cut_facts_tac [real_zero_not_eq_one RS 
   571 by (cut_facts_tac [real_zero_not_eq_one RS 
   556                    not_sym RS real_mult_inv_left_ex] 1);
   572                    not_sym RS real_mult_inv_left_ex] 1);
   557 by (auto_tac (claset(),
   573 by (auto_tac (claset(),
   558 	      simpset() addsimps [real_zero_not_eq_one RS not_sym]));
   574 	      simpset() addsimps [real_zero_not_eq_one RS not_sym]));
   559 qed "real_inverse_1";
   575 qed "real_inverse_1";
   560 Addsimps [real_inverse_1];
   576 Addsimps [real_inverse_1];
   561 
   577 
   562 Goal "x ~= 0 ==> inverse(-x) = -inverse(x::real)";
   578 Goal "inverse(-x) = -inverse(x::real)";
       
   579 by (real_div_undefined_case_tac "x=0" 1);
   563 by (res_inst_tac [("c1","-x")] (real_mult_right_cancel RS iffD1) 1);
   580 by (res_inst_tac [("c1","-x")] (real_mult_right_cancel RS iffD1) 1);
   564 by (stac real_mult_inv_left 2);
   581 by (stac real_mult_inv_left 2);
   565 by Auto_tac;
   582 by Auto_tac;
   566 qed "real_minus_inverse";
   583 qed "real_minus_inverse";
   567 
   584 
   568 Goal "[| x ~= 0; y ~= 0 |] ==> inverse(x*y) = inverse(x)*inverse(y::real)";
   585 Goal "inverse(x*y) = inverse(x)*inverse(y::real)";
       
   586 by (real_div_undefined_case_tac "x=0" 1);
       
   587 by (real_div_undefined_case_tac "y=0" 1);
   569 by (forw_inst_tac [("y","y")] real_mult_not_zero 1 THEN assume_tac 1);
   588 by (forw_inst_tac [("y","y")] real_mult_not_zero 1 THEN assume_tac 1);
   570 by (res_inst_tac [("c1","x")] (real_mult_left_cancel RS iffD1) 1);
   589 by (res_inst_tac [("c1","x")] (real_mult_left_cancel RS iffD1) 1);
   571 by (auto_tac (claset(),simpset() addsimps [real_mult_assoc RS sym]));
   590 by (auto_tac (claset(),simpset() addsimps [real_mult_assoc RS sym]));
   572 by (res_inst_tac [("c1","y")] (real_mult_left_cancel RS iffD1) 1);
   591 by (res_inst_tac [("c1","y")] (real_mult_left_cancel RS iffD1) 1);
   573 by (auto_tac (claset(),simpset() addsimps [real_mult_left_commute]));
   592 by (auto_tac (claset(),simpset() addsimps [real_mult_left_commute]));
   574 by (asm_simp_tac (simpset() addsimps [real_mult_assoc RS sym]) 1);
   593 by (asm_simp_tac (simpset() addsimps [real_mult_assoc RS sym]) 1);
   575 qed "real_inverse_distrib";
   594 qed "real_inverse_distrib";
       
   595 
       
   596 Goal "(x::real) * (y/z) = (x*y)/z";
       
   597 by (simp_tac (simpset() addsimps [real_divide_def, real_mult_assoc]) 1); 
       
   598 qed "real_times_divide1_eq";
       
   599 
       
   600 Goal "(y/z) * (x::real) = (y*x)/z";
       
   601 by (simp_tac (simpset() addsimps [real_divide_def]@real_mult_ac) 1); 
       
   602 qed "real_times_divide2_eq";
       
   603 
       
   604 Addsimps [real_times_divide1_eq, real_times_divide2_eq];
       
   605 
       
   606 Goal "(x::real) / (y/z) = (x*z)/y";
       
   607 by (simp_tac (simpset() addsimps [real_divide_def, real_inverse_distrib]@
       
   608                                  real_mult_ac) 1); 
       
   609 qed "real_divide_divide1_eq";
       
   610 
       
   611 Goal "((x::real) / y) / z = x/(y*z)";
       
   612 by (simp_tac (simpset() addsimps [real_divide_def, real_inverse_distrib, 
       
   613                                   real_mult_assoc]) 1); 
       
   614 qed "real_divide_divide2_eq";
       
   615 
       
   616 Addsimps [real_divide_divide1_eq, real_divide_divide2_eq];
       
   617 
       
   618 (** As with multiplication, pull minus signs OUT of the / operator **)
       
   619 
       
   620 Goal "(-x) / (y::real) = - (x/y)";
       
   621 by (simp_tac (simpset() addsimps [real_divide_def]) 1); 
       
   622 qed "real_minus_divide_eq";
       
   623 Addsimps [real_minus_divide_eq];
       
   624 
       
   625 Goal "(x / -(y::real)) = - (x/y)";
       
   626 by (simp_tac (simpset() addsimps [real_divide_def, real_minus_inverse]) 1); 
       
   627 qed "real_divide_minus_eq";
       
   628 Addsimps [real_divide_minus_eq];
       
   629 
       
   630 Goal "(x+y)/(z::real) = x/z + y/z";
       
   631 by (simp_tac (simpset() addsimps [real_divide_def, real_add_mult_distrib]) 1); 
       
   632 qed "real_add_divide_distrib";
       
   633 
       
   634 (*The following would e.g. convert (x+y)/2 to x/2 + y/2.  Sometimes that
       
   635   leads to cancellations in x or y, but is also prevents "multiplying out"
       
   636   the 2 in e.g. (x+y)/2 = 5.
       
   637   
       
   638 Addsimps [inst "z" "number_of ?w" real_add_divide_distrib];
       
   639 **)
       
   640 
   576 
   641 
   577 (*---------------------------------------------------------
   642 (*---------------------------------------------------------
   578      Theorems for ordering
   643      Theorems for ordering
   579  --------------------------------------------------------*)
   644  --------------------------------------------------------*)
   580 (* prove introduction and elimination rules for real_less *)
   645 (* prove introduction and elimination rules for real_less *)