src/HOL/Integ/Int.ML
changeset 9633 a71a83253997
parent 9582 38e58ed53e7b
child 9945 a0efbd7c88dc
equal deleted inserted replaced
9632:1c13360689cb 9633:a71a83253997
   425     (force_tac (claset() addDs [zmult_zless_mono1_neg, zmult_zless_mono1], 
   425     (force_tac (claset() addDs [zmult_zless_mono1_neg, zmult_zless_mono1], 
   426 		simpset()) 1));
   426 		simpset()) 1));
   427 qed "zmult_eq_int0_iff";
   427 qed "zmult_eq_int0_iff";
   428 
   428 
   429 
   429 
   430 Goal "int 0 < k ==> (m*k < n*k) = (m<n)";
   430 (** Cancellation laws for k*m < k*n and m*k < n*k, also for <= and =,
   431 by (safe_tac (claset() addSIs [zmult_zless_mono1]));
   431     but not (yet?) for k*m < n*k. **)
   432 by (cut_facts_tac [linorder_less_linear] 1);
   432 
   433 by (blast_tac (claset() addIs [zmult_zless_mono1] addEs [order_less_asym]) 1);
   433 Goal "(m*k < n*k) = ((int 0 < k & m<n) | (k < int 0 & n<m))";
       
   434 by (case_tac "k = int 0" 1);
       
   435 by (auto_tac (claset(), simpset() addsimps [linorder_neq_iff, 
       
   436                               zmult_zless_mono1, zmult_zless_mono1_neg]));  
       
   437 by (auto_tac (claset(), 
       
   438               simpset() addsimps [linorder_not_less,
       
   439 				  inst "y1" "m*k" (linorder_not_le RS sym),
       
   440                                   inst "y1" "m" (linorder_not_le RS sym)]));
       
   441 by (ALLGOALS (etac notE));
       
   442 by (auto_tac (claset(), simpset() addsimps [zless_imp_zle, zmult_zle_mono1,
       
   443                                             zmult_zle_mono1_neg]));  
   434 qed "zmult_zless_cancel2";
   444 qed "zmult_zless_cancel2";
   435 
   445 
   436 Goal "int 0 < k ==> (k*m < k*n) = (m<n)";
   446 
   437 by (dtac zmult_zless_cancel2 1);
   447 Goal "(k*m < k*n) = ((int 0 < k & m<n) | (k < int 0 & n<m))";
   438 by (asm_full_simp_tac (simpset() addsimps [zmult_commute]) 1);
   448 by (simp_tac (simpset() addsimps [inst "z" "k" zmult_commute, 
       
   449                                   zmult_zless_cancel2]) 1);
   439 qed "zmult_zless_cancel1";
   450 qed "zmult_zless_cancel1";
   440 Addsimps [zmult_zless_cancel1, zmult_zless_cancel2];
   451 
   441 
   452 Goal "(m*k <= n*k) = ((int 0 < k --> m<=n) & (k < int 0 --> n<=m))";
   442 Goal "k < int 0 ==> (m*k < n*k) = (n<m)";
   453 by (simp_tac (simpset() addsimps [linorder_not_less RS sym, 
   443 by (safe_tac (claset() addSIs [zmult_zless_mono1_neg]));
   454                                   zmult_zless_cancel2]) 1);
   444 by (cut_facts_tac [linorder_less_linear] 1);
       
   445 by (blast_tac (claset() addIs [zmult_zless_mono1_neg] 
       
   446                         addEs [order_less_asym]) 1);
       
   447 qed "zmult_zless_cancel2_neg";
       
   448 
       
   449 Goal "k < int 0 ==> (k*m < k*n) = (n<m)";
       
   450 by (dtac zmult_zless_cancel2_neg 1);
       
   451 by (asm_full_simp_tac (simpset() addsimps [zmult_commute]) 1);
       
   452 qed "zmult_zless_cancel1_neg";
       
   453 Addsimps [zmult_zless_cancel1_neg, zmult_zless_cancel2_neg];
       
   454 
       
   455 Goal "int 0 < k ==> (m*k <= n*k) = (m<=n)";
       
   456 by (asm_full_simp_tac (simpset() addsimps [linorder_not_less RS sym]) 1);
       
   457 qed "zmult_zle_cancel2";
   455 qed "zmult_zle_cancel2";
   458 
   456 
   459 Goal "int 0 < k ==> (k*m <= k*n) = (m<=n)";
   457 Goal "(k*m <= k*n) = ((int 0 < k --> m<=n) & (k < int 0 --> n<=m))";
   460 by (asm_full_simp_tac (simpset() addsimps [linorder_not_less RS sym]) 1);
   458 by (simp_tac (simpset() addsimps [linorder_not_less RS sym, 
       
   459                                   zmult_zless_cancel1]) 1);
   461 qed "zmult_zle_cancel1";
   460 qed "zmult_zle_cancel1";
   462 Addsimps [zmult_zle_cancel1, zmult_zle_cancel2];
   461 
   463 
   462 Goal "(m*k = n*k) = (k = int 0 | m=n)";
   464 Goal "k < int 0 ==> (m*k <= n*k) = (n<=m)";
       
   465 by (asm_full_simp_tac (simpset() addsimps [linorder_not_less RS sym]) 1);
       
   466 qed "zmult_zle_cancel2_neg";
       
   467 
       
   468 Goal "k < int 0 ==> (k*m <= k*n) = (n<=m)";
       
   469 by (asm_full_simp_tac (simpset() addsimps [linorder_not_less RS sym]) 1);
       
   470 qed "zmult_zle_cancel1_neg";
       
   471 Addsimps [zmult_zle_cancel1_neg, zmult_zle_cancel2_neg];
       
   472 
       
   473 Goal "k ~= int 0 ==> (m*k = n*k) = (m=n)";
       
   474 by (cut_facts_tac [linorder_less_linear] 1);
   463 by (cut_facts_tac [linorder_less_linear] 1);
   475 by Safe_tac;
   464 by Safe_tac;
   476 by (assume_tac 2);
   465 by Auto_tac;  
   477 by (REPEAT 
   466 by (REPEAT 
   478     (force_tac (claset() addD2 ("mono_neg", zmult_zless_mono1_neg)
   467     (force_tac (claset() addD2 ("mono_neg", zmult_zless_mono1_neg)
   479                          addD2 ("mono_pos", zmult_zless_mono1), 
   468                          addD2 ("mono_pos", zmult_zless_mono1), 
   480 		simpset() addsimps [linorder_neq_iff]) 1));
   469 		simpset() addsimps [linorder_neq_iff]) 1));
       
   470 
   481 qed "zmult_cancel2";
   471 qed "zmult_cancel2";
   482 
   472 
   483 Goal "k ~= int 0 ==> (k*m = k*n) = (m=n)";
   473 Goal "(k*m = k*n) = (k = int 0 | m=n)";
   484 by (dtac zmult_cancel2 1);
   474 by (simp_tac (simpset() addsimps [inst "z" "k" zmult_commute, 
   485 by (asm_full_simp_tac (simpset() addsimps [zmult_commute]) 1);
   475                                   zmult_cancel2]) 1);
   486 qed "zmult_cancel1";
   476 qed "zmult_cancel1";
   487 Addsimps [zmult_cancel1, zmult_cancel2];
   477 Addsimps [zmult_cancel1, zmult_cancel2];