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]; |