558 |
560 |
559 text {* Useful in certain inductive arguments *} |
561 text {* Useful in certain inductive arguments *} |
560 lemma less_Suc_eq_0_disj: "(m < Suc n) = (m = 0 | (\<exists>j. m = Suc j & j < n))" |
562 lemma less_Suc_eq_0_disj: "(m < Suc n) = (m = 0 | (\<exists>j. m = Suc j & j < n))" |
561 by (case_tac m) simp_all |
563 by (case_tac m) simp_all |
562 |
564 |
563 lemma nat_induct2: "P 0 ==> P (Suc 0) ==> (!!k. P k ==> P (Suc (Suc k))) ==> P n" |
565 lemma nat_induct2: "[|P 0; P (Suc 0); !!k. P k ==> P (Suc (Suc k))|] ==> P n" |
564 apply (rule nat_less_induct) |
566 apply (rule nat_less_induct) |
565 apply (case_tac n) |
567 apply (case_tac n) |
566 apply (case_tac [2] nat) |
568 apply (case_tac [2] nat) |
567 apply (blast intro: less_trans)+ |
569 apply (blast intro: less_trans)+ |
568 done |
570 done |
688 lemma add_eq_self_zero: "!!m::nat. m + n = m ==> n = 0" |
690 lemma add_eq_self_zero: "!!m::nat. m + n = m ==> n = 0" |
689 apply (drule add_0_right [THEN ssubst]) |
691 apply (drule add_0_right [THEN ssubst]) |
690 apply (simp add: nat_add_assoc del: add_0_right) |
692 apply (simp add: nat_add_assoc del: add_0_right) |
691 done |
693 done |
692 |
694 |
693 subsection {* Monotonicity of Addition *} |
|
694 |
|
695 text {* strict, in 1st argument *} |
|
696 lemma add_less_mono1: "i < j ==> i + k < j + (k::nat)" |
|
697 by (induct k) simp_all |
|
698 |
|
699 text {* strict, in both arguments *} |
|
700 lemma add_less_mono: "[|i < j; k < l|] ==> i + k < j + (l::nat)" |
|
701 apply (rule add_less_mono1 [THEN less_trans], assumption+) |
|
702 apply (induct_tac j, simp_all) |
|
703 done |
|
704 |
|
705 text {* Deleted @{text less_natE}; use @{text "less_imp_Suc_add RS exE"} *} |
|
706 lemma less_imp_Suc_add: "m < n ==> (\<exists>k. n = Suc (m + k))" |
|
707 apply (induct n) |
|
708 apply (simp_all add: order_le_less) |
|
709 apply (blast elim!: less_SucE intro!: add_0_right [symmetric] add_Suc_right [symmetric]) |
|
710 done |
|
711 |
|
712 |
695 |
713 subsection {* Multiplication *} |
696 subsection {* Multiplication *} |
714 |
697 |
715 text {* right annihilation in product *} |
698 text {* right annihilation in product *} |
716 lemma mult_0_right [simp]: "(m::nat) * 0 = 0" |
699 lemma mult_0_right [simp]: "(m::nat) * 0 = 0" |
733 |
716 |
734 text {* Associative law for multiplication *} |
717 text {* Associative law for multiplication *} |
735 lemma nat_mult_assoc: "(m * n) * k = m * ((n * k)::nat)" |
718 lemma nat_mult_assoc: "(m * n) * k = m * ((n * k)::nat)" |
736 by (induct m) (simp_all add: add_mult_distrib) |
719 by (induct m) (simp_all add: add_mult_distrib) |
737 |
720 |
738 lemma mult_is_0 [simp]: "((m::nat) * n = 0) = (m=0 | n=0)" |
721 |
739 apply (induct_tac m) |
722 text{*The Naturals Form A Semiring*} |
740 apply (induct_tac [2] n, simp_all) |
723 instance nat :: semiring |
741 done |
|
742 |
|
743 text {* strict, in 1st argument; proof is by induction on @{text "k > 0"} *} |
|
744 lemma mult_less_mono2: "(i::nat) < j ==> 0 < k ==> k * i < k * j" |
|
745 apply (erule_tac m1 = 0 in less_imp_Suc_add [THEN exE], simp) |
|
746 apply (induct_tac x) |
|
747 apply (simp_all add: add_less_mono) |
|
748 done |
|
749 |
|
750 text{*The Naturals Form an Ordered Semiring*} |
|
751 instance nat :: ordered_semiring |
|
752 proof |
724 proof |
753 fix i j k :: nat |
725 fix i j k :: nat |
754 show "(i + j) + k = i + (j + k)" by (rule nat_add_assoc) |
726 show "(i + j) + k = i + (j + k)" by (rule nat_add_assoc) |
755 show "i + j = j + i" by (rule nat_add_commute) |
727 show "i + j = j + i" by (rule nat_add_commute) |
756 show "0 + i = i" by simp |
728 show "0 + i = i" by simp |
757 show "(i * j) * k = i * (j * k)" by (rule nat_mult_assoc) |
729 show "(i * j) * k = i * (j * k)" by (rule nat_mult_assoc) |
758 show "i * j = j * i" by (rule nat_mult_commute) |
730 show "i * j = j * i" by (rule nat_mult_commute) |
759 show "1 * i = i" by simp |
731 show "1 * i = i" by simp |
760 show "(i + j) * k = i * k + j * k" by (simp add: add_mult_distrib) |
732 show "(i + j) * k = i * k + j * k" by (simp add: add_mult_distrib) |
761 show "0 \<noteq> (1::nat)" by simp |
733 show "0 \<noteq> (1::nat)" by simp |
|
734 assume "k+i = k+j" thus "i=j" by simp |
|
735 qed |
|
736 |
|
737 lemma mult_is_0 [simp]: "((m::nat) * n = 0) = (m=0 | n=0)" |
|
738 apply (induct_tac m) |
|
739 apply (induct_tac [2] n, simp_all) |
|
740 done |
|
741 |
|
742 subsection {* Monotonicity of Addition *} |
|
743 |
|
744 text {* strict, in 1st argument *} |
|
745 lemma add_less_mono1: "i < j ==> i + k < j + (k::nat)" |
|
746 by (induct k) simp_all |
|
747 |
|
748 text {* strict, in both arguments *} |
|
749 lemma add_less_mono: "[|i < j; k < l|] ==> i + k < j + (l::nat)" |
|
750 apply (rule add_less_mono1 [THEN less_trans], assumption+) |
|
751 apply (induct_tac j, simp_all) |
|
752 done |
|
753 |
|
754 text {* Deleted @{text less_natE}; use @{text "less_imp_Suc_add RS exE"} *} |
|
755 lemma less_imp_Suc_add: "m < n ==> (\<exists>k. n = Suc (m + k))" |
|
756 apply (induct n) |
|
757 apply (simp_all add: order_le_less) |
|
758 apply (blast elim!: less_SucE |
|
759 intro!: add_0_right [symmetric] add_Suc_right [symmetric]) |
|
760 done |
|
761 |
|
762 text {* strict, in 1st argument; proof is by induction on @{text "k > 0"} *} |
|
763 lemma mult_less_mono2: "(i::nat) < j ==> 0 < k ==> k * i < k * j" |
|
764 apply (erule_tac m1 = 0 in less_imp_Suc_add [THEN exE], simp) |
|
765 apply (induct_tac x) |
|
766 apply (simp_all add: add_less_mono) |
|
767 done |
|
768 |
|
769 |
|
770 text{*The Naturals Form an Ordered Semiring*} |
|
771 instance nat :: ordered_semiring |
|
772 proof |
|
773 fix i j k :: nat |
762 show "i \<le> j ==> k + i \<le> k + j" by simp |
774 show "i \<le> j ==> k + i \<le> k + j" by simp |
763 show "i < j ==> 0 < k ==> k * i < k * j" by (simp add: mult_less_mono2) |
775 show "i < j ==> 0 < k ==> k * i < k * j" by (simp add: mult_less_mono2) |
764 qed |
776 qed |
765 |
777 |
766 lemma nat_mult_1: "(1::nat) * n = n" |
778 lemma nat_mult_1: "(1::nat) * n = n" |
788 text {* non-strict, in both arguments *} |
800 text {* non-strict, in both arguments *} |
789 lemma add_le_mono: "[| i \<le> j; k \<le> l |] ==> i + k \<le> j + (l::nat)" |
801 lemma add_le_mono: "[| i \<le> j; k \<le> l |] ==> i + k \<le> j + (l::nat)" |
790 by (rule add_mono) |
802 by (rule add_mono) |
791 |
803 |
792 lemma le_add2: "n \<le> ((m + n)::nat)" |
804 lemma le_add2: "n \<le> ((m + n)::nat)" |
793 apply (induct m, simp_all) |
805 by (insert add_right_mono [of 0 m n], simp) |
794 apply (erule le_SucI) |
|
795 done |
|
796 |
806 |
797 lemma le_add1: "n \<le> ((n + m)::nat)" |
807 lemma le_add1: "n \<le> ((n + m)::nat)" |
798 apply (simp add: add_ac) |
808 by (simp add: add_commute, rule le_add2) |
799 apply (rule le_add2) |
|
800 done |
|
801 |
809 |
802 lemma less_add_Suc1: "i < Suc (i + m)" |
810 lemma less_add_Suc1: "i < Suc (i + m)" |
803 by (rule le_less_trans, rule le_add1, rule lessI) |
811 by (rule le_less_trans, rule le_add1, rule lessI) |
804 |
812 |
805 lemma less_add_Suc2: "i < Suc (m + i)" |
813 lemma less_add_Suc2: "i < Suc (m + i)" |
806 by (rule le_less_trans, rule le_add2, rule lessI) |
814 by (rule le_less_trans, rule le_add2, rule lessI) |
807 |
815 |
808 lemma less_iff_Suc_add: "(m < n) = (\<exists>k. n = Suc (m + k))" |
816 lemma less_iff_Suc_add: "(m < n) = (\<exists>k. n = Suc (m + k))" |
809 by (rules intro!: less_add_Suc1 less_imp_Suc_add) |
817 by (rules intro!: less_add_Suc1 less_imp_Suc_add) |
810 |
818 |
811 |
|
812 lemma trans_le_add1: "(i::nat) \<le> j ==> i \<le> j + m" |
819 lemma trans_le_add1: "(i::nat) \<le> j ==> i \<le> j + m" |
813 by (rule le_trans, assumption, rule le_add1) |
820 by (rule le_trans, assumption, rule le_add1) |
814 |
821 |
815 lemma trans_le_add2: "(i::nat) \<le> j ==> i \<le> m + j" |
822 lemma trans_le_add2: "(i::nat) \<le> j ==> i \<le> m + j" |
816 by (rule le_trans, assumption, rule le_add2) |
823 by (rule le_trans, assumption, rule le_add2) |
820 |
827 |
821 lemma trans_less_add2: "(i::nat) < j ==> i < m + j" |
828 lemma trans_less_add2: "(i::nat) < j ==> i < m + j" |
822 by (rule less_le_trans, assumption, rule le_add2) |
829 by (rule less_le_trans, assumption, rule le_add2) |
823 |
830 |
824 lemma add_lessD1: "i + j < (k::nat) ==> i < k" |
831 lemma add_lessD1: "i + j < (k::nat) ==> i < k" |
825 apply (induct j, simp_all) |
832 apply (rule le_less_trans [of _ "i+j"]) |
826 apply (blast dest: Suc_lessD) |
833 apply (simp_all add: le_add1) |
827 done |
834 done |
828 |
835 |
829 lemma not_add_less1 [iff]: "~ (i + j < (i::nat))" |
836 lemma not_add_less1 [iff]: "~ (i + j < (i::nat))" |
830 apply (rule notI) |
837 apply (rule notI) |
831 apply (erule add_lessD1 [THEN less_irrefl]) |
838 apply (erule add_lessD1 [THEN less_irrefl]) |
833 |
840 |
834 lemma not_add_less2 [iff]: "~ (j + i < (i::nat))" |
841 lemma not_add_less2 [iff]: "~ (j + i < (i::nat))" |
835 by (simp add: add_commute not_add_less1) |
842 by (simp add: add_commute not_add_less1) |
836 |
843 |
837 lemma add_leD1: "m + k \<le> n ==> m \<le> (n::nat)" |
844 lemma add_leD1: "m + k \<le> n ==> m \<le> (n::nat)" |
838 by (induct k) (simp_all add: le_simps) |
845 apply (rule order_trans [of _ "m+k"]) |
|
846 apply (simp_all add: le_add1) |
|
847 done |
839 |
848 |
840 lemma add_leD2: "m + k \<le> n ==> k \<le> (n::nat)" |
849 lemma add_leD2: "m + k \<le> n ==> k \<le> (n::nat)" |
841 apply (simp add: add_commute) |
850 apply (simp add: add_commute) |
842 apply (erule add_leD1) |
851 apply (erule add_leD1) |
843 done |
852 done |
967 |
976 |
968 |
977 |
969 subsection {* Monotonicity of Multiplication *} |
978 subsection {* Monotonicity of Multiplication *} |
970 |
979 |
971 lemma mult_le_mono1: "i \<le> (j::nat) ==> i * k \<le> j * k" |
980 lemma mult_le_mono1: "i \<le> (j::nat) ==> i * k \<le> j * k" |
972 by (induct k) (simp_all add: add_le_mono) |
981 by (simp add: mult_right_mono) |
973 |
982 |
974 lemma mult_le_mono2: "i \<le> (j::nat) ==> k * i \<le> k * j" |
983 lemma mult_le_mono2: "i \<le> (j::nat) ==> k * i \<le> k * j" |
975 apply (drule mult_le_mono1) |
984 by (simp add: mult_left_mono) |
976 apply (simp add: mult_commute) |
|
977 done |
|
978 |
985 |
979 text {* @{text "\<le>"} monotonicity, BOTH arguments *} |
986 text {* @{text "\<le>"} monotonicity, BOTH arguments *} |
980 lemma mult_le_mono: "i \<le> (j::nat) ==> k \<le> l ==> i * k \<le> j * l" |
987 lemma mult_le_mono: "i \<le> (j::nat) ==> k \<le> l ==> i * k \<le> j * l" |
981 apply (erule mult_le_mono1 [THEN le_trans]) |
988 by (simp add: mult_mono) |
982 apply (erule mult_le_mono2) |
|
983 done |
|
984 |
989 |
985 lemma mult_less_mono1: "(i::nat) < j ==> 0 < k ==> i * k < j * k" |
990 lemma mult_less_mono1: "(i::nat) < j ==> 0 < k ==> i * k < j * k" |
986 by (drule mult_less_mono2) (simp_all add: mult_commute) |
991 by (simp add: mult_strict_right_mono) |
987 |
992 |
988 text{*Differs from the standard @{text zero_less_mult_iff} in that |
993 text{*Differs from the standard @{text zero_less_mult_iff} in that |
989 there are no negative numbers.*} |
994 there are no negative numbers.*} |
990 lemma nat_0_less_mult_iff [simp]: "(0 < (m::nat) * n) = (0 < m & 0 < n)" |
995 lemma nat_0_less_mult_iff [simp]: "(0 < (m::nat) * n) = (0 < m & 0 < n)" |
991 apply (induct m) |
996 apply (induct m) |
1005 lemma one_eq_mult_iff [simp]: "(Suc 0 = m * n) = (m = 1 & n = 1)" |
1010 lemma one_eq_mult_iff [simp]: "(Suc 0 = m * n) = (m = 1 & n = 1)" |
1006 apply (rule trans) |
1011 apply (rule trans) |
1007 apply (rule_tac [2] mult_eq_1_iff, fastsimp) |
1012 apply (rule_tac [2] mult_eq_1_iff, fastsimp) |
1008 done |
1013 done |
1009 |
1014 |
1010 lemma mult_less_cancel2: "((m::nat) * k < n * k) = (0 < k & m < n)" |
1015 lemma mult_less_cancel2 [simp]: "((m::nat) * k < n * k) = (0 < k & m < n)" |
1011 apply (safe intro!: mult_less_mono1) |
1016 apply (safe intro!: mult_less_mono1) |
1012 apply (case_tac k, auto) |
1017 apply (case_tac k, auto) |
1013 apply (simp del: le_0_eq add: linorder_not_le [symmetric]) |
1018 apply (simp del: le_0_eq add: linorder_not_le [symmetric]) |
1014 apply (blast intro: mult_le_mono1) |
1019 apply (blast intro: mult_le_mono1) |
1015 done |
1020 done |
1016 |
1021 |
1017 lemma mult_less_cancel1 [simp]: "(k * (m::nat) < k * n) = (0 < k & m < n)" |
1022 lemma mult_less_cancel1 [simp]: "(k * (m::nat) < k * n) = (0 < k & m < n)" |
1018 by (simp add: mult_less_cancel2 mult_commute [of k]) |
1023 by (simp add: mult_commute [of k]) |
1019 |
|
1020 declare mult_less_cancel2 [simp] |
|
1021 |
1024 |
1022 lemma mult_le_cancel1 [simp]: "(k * (m::nat) \<le> k * n) = (0 < k --> m \<le> n)" |
1025 lemma mult_le_cancel1 [simp]: "(k * (m::nat) \<le> k * n) = (0 < k --> m \<le> n)" |
1023 by (simp add: linorder_not_less [symmetric], auto) |
1026 by (simp add: linorder_not_less [symmetric], auto) |
1024 |
1027 |
1025 lemma mult_le_cancel2 [simp]: "((m::nat) * k \<le> n * k) = (0 < k --> m \<le> n)" |
1028 lemma mult_le_cancel2 [simp]: "((m::nat) * k \<le> n * k) = (0 < k --> m \<le> n)" |
1026 by (simp add: linorder_not_less [symmetric], auto) |
1029 by (simp add: linorder_not_less [symmetric], auto) |
1027 |
1030 |
1028 lemma mult_cancel2: "(m * k = n * k) = (m = n | (k = (0::nat)))" |
1031 lemma mult_cancel2 [simp]: "(m * k = n * k) = (m = n | (k = (0::nat)))" |
1029 apply (cut_tac less_linear, safe, auto) |
1032 apply (cut_tac less_linear, safe, auto) |
1030 apply (drule mult_less_mono1, assumption, simp)+ |
1033 apply (drule mult_less_mono1, assumption, simp)+ |
1031 done |
1034 done |
1032 |
1035 |
1033 lemma mult_cancel1 [simp]: "(k * m = k * n) = (m = n | (k = (0::nat)))" |
1036 lemma mult_cancel1 [simp]: "(k * m = k * n) = (m = n | (k = (0::nat)))" |
1034 by (simp add: mult_cancel2 mult_commute [of k]) |
1037 by (simp add: mult_commute [of k]) |
1035 |
|
1036 declare mult_cancel2 [simp] |
|
1037 |
1038 |
1038 lemma Suc_mult_less_cancel1: "(Suc k * m < Suc k * n) = (m < n)" |
1039 lemma Suc_mult_less_cancel1: "(Suc k * m < Suc k * n) = (m < n)" |
1039 by (subst mult_less_cancel1) simp |
1040 by (subst mult_less_cancel1) simp |
1040 |
1041 |
1041 lemma Suc_mult_le_cancel1: "(Suc k * m \<le> Suc k * n) = (m \<le> n)" |
1042 lemma Suc_mult_le_cancel1: "(Suc k * m \<le> Suc k * n) = (m \<le> n)" |
1042 by (subst mult_le_cancel1) simp |
1043 by (subst mult_le_cancel1) simp |
1043 |
1044 |
1044 lemma Suc_mult_cancel1: "(Suc k * m = Suc k * n) = (m = n)" |
1045 lemma Suc_mult_cancel1: "(Suc k * m = Suc k * n) = (m = n)" |
1045 by (subst mult_cancel1) simp |
1046 by (subst mult_cancel1) simp |
1046 |
|
1047 |
1047 |
1048 text {* Lemma for @{text gcd} *} |
1048 text {* Lemma for @{text gcd} *} |
1049 lemma mult_eq_self_implies_10: "(m::nat) = m * n ==> n = 1 | m = 0" |
1049 lemma mult_eq_self_implies_10: "(m::nat) = m * n ==> n = 1 | m = 0" |
1050 apply (drule sym) |
1050 apply (drule sym) |
1051 apply (rule disjCI) |
1051 apply (rule disjCI) |
1052 apply (rule nat_less_cases, erule_tac [2] _) |
1052 apply (rule nat_less_cases, erule_tac [2] _) |
1053 apply (fastsimp elim!: less_SucE) |
1053 apply (fastsimp elim!: less_SucE) |
1054 apply (fastsimp dest: mult_less_mono2) |
1054 apply (fastsimp dest: mult_less_mono2) |
1055 done |
1055 done |
1056 |
1056 |
1057 |
|
1058 end |
1057 end |