985 by (simp add: linorder_not_le [symmetric] pos_imp_zdiv_nonneg_iff) |
982 by (simp add: linorder_not_le [symmetric] pos_imp_zdiv_nonneg_iff) |
986 |
983 |
987 (*Again the law fails for <=: consider a = -1, b = -2 when a div b = 0*) |
984 (*Again the law fails for <=: consider a = -1, b = -2 when a div b = 0*) |
988 lemma neg_imp_zdiv_neg_iff: "b < (0::int) ==> (a div b < 0) = (0 < a)" |
985 lemma neg_imp_zdiv_neg_iff: "b < (0::int) ==> (a div b < 0) = (0 < a)" |
989 by (simp add: linorder_not_le [symmetric] neg_imp_zdiv_nonneg_iff) |
986 by (simp add: linorder_not_le [symmetric] neg_imp_zdiv_nonneg_iff) |
|
987 |
|
988 |
|
989 subsection {* Divides relation *} |
|
990 |
|
991 lemma zdvd_iff_zmod_eq_0: "(m dvd n) = (n mod m = (0::int))" |
|
992 by(simp add:dvd_def zmod_eq_0_iff) |
|
993 |
|
994 lemma zdvd_0_right [iff]: "(m::int) dvd 0" |
|
995 apply (unfold dvd_def) |
|
996 apply (blast intro: zmult_0_right [symmetric]) |
|
997 done |
|
998 |
|
999 lemma zdvd_0_left [iff]: "(0 dvd (m::int)) = (m = 0)" |
|
1000 by (unfold dvd_def, auto) |
|
1001 |
|
1002 lemma zdvd_1_left [iff]: "1 dvd (m::int)" |
|
1003 by (unfold dvd_def, simp) |
|
1004 |
|
1005 lemma zdvd_refl [simp]: "m dvd (m::int)" |
|
1006 apply (unfold dvd_def) |
|
1007 apply (blast intro: zmult_1_right [symmetric]) |
|
1008 done |
|
1009 |
|
1010 lemma zdvd_trans: "m dvd n ==> n dvd k ==> m dvd (k::int)" |
|
1011 apply (unfold dvd_def) |
|
1012 apply (blast intro: zmult_assoc) |
|
1013 done |
|
1014 |
|
1015 lemma zdvd_zminus_iff: "(m dvd -n) = (m dvd (n::int))" |
|
1016 apply (unfold dvd_def, auto) |
|
1017 apply (rule_tac [!] x = "-k" in exI, auto) |
|
1018 done |
|
1019 |
|
1020 lemma zdvd_zminus2_iff: "(-m dvd n) = (m dvd (n::int))" |
|
1021 apply (unfold dvd_def, auto) |
|
1022 apply (rule_tac [!] x = "-k" in exI, auto) |
|
1023 done |
|
1024 |
|
1025 lemma zdvd_anti_sym: |
|
1026 "0 < m ==> 0 < n ==> m dvd n ==> n dvd m ==> m = (n::int)" |
|
1027 apply (unfold dvd_def, auto) |
|
1028 apply (simp add: zmult_assoc zmult_eq_self_iff int_0_less_mult_iff zmult_eq_1_iff) |
|
1029 done |
|
1030 |
|
1031 lemma zdvd_zadd: "k dvd m ==> k dvd n ==> k dvd (m + n :: int)" |
|
1032 apply (unfold dvd_def) |
|
1033 apply (blast intro: zadd_zmult_distrib2 [symmetric]) |
|
1034 done |
|
1035 |
|
1036 lemma zdvd_zdiff: "k dvd m ==> k dvd n ==> k dvd (m - n :: int)" |
|
1037 apply (unfold dvd_def) |
|
1038 apply (blast intro: zdiff_zmult_distrib2 [symmetric]) |
|
1039 done |
|
1040 |
|
1041 lemma zdvd_zdiffD: "k dvd m - n ==> k dvd n ==> k dvd (m::int)" |
|
1042 apply (subgoal_tac "m = n + (m - n)") |
|
1043 apply (erule ssubst) |
|
1044 apply (blast intro: zdvd_zadd, simp) |
|
1045 done |
|
1046 |
|
1047 lemma zdvd_zmult: "k dvd (n::int) ==> k dvd m * n" |
|
1048 apply (unfold dvd_def) |
|
1049 apply (blast intro: zmult_left_commute) |
|
1050 done |
|
1051 |
|
1052 lemma zdvd_zmult2: "k dvd (m::int) ==> k dvd m * n" |
|
1053 apply (subst zmult_commute) |
|
1054 apply (erule zdvd_zmult) |
|
1055 done |
|
1056 |
|
1057 lemma [iff]: "(k::int) dvd m * k" |
|
1058 apply (rule zdvd_zmult) |
|
1059 apply (rule zdvd_refl) |
|
1060 done |
|
1061 |
|
1062 lemma [iff]: "(k::int) dvd k * m" |
|
1063 apply (rule zdvd_zmult2) |
|
1064 apply (rule zdvd_refl) |
|
1065 done |
|
1066 |
|
1067 lemma zdvd_zmultD2: "j * k dvd n ==> j dvd (n::int)" |
|
1068 apply (unfold dvd_def) |
|
1069 apply (simp add: zmult_assoc, blast) |
|
1070 done |
|
1071 |
|
1072 lemma zdvd_zmultD: "j * k dvd n ==> k dvd (n::int)" |
|
1073 apply (rule zdvd_zmultD2) |
|
1074 apply (subst zmult_commute, assumption) |
|
1075 done |
|
1076 |
|
1077 lemma zdvd_zmult_mono: "i dvd m ==> j dvd (n::int) ==> i * j dvd m * n" |
|
1078 apply (unfold dvd_def, clarify) |
|
1079 apply (rule_tac x = "k * ka" in exI) |
|
1080 apply (simp add: zmult_ac) |
|
1081 done |
|
1082 |
|
1083 lemma zdvd_reduce: "(k dvd n + k * m) = (k dvd (n::int))" |
|
1084 apply (rule iffI) |
|
1085 apply (erule_tac [2] zdvd_zadd) |
|
1086 apply (subgoal_tac "n = (n + k * m) - k * m") |
|
1087 apply (erule ssubst) |
|
1088 apply (erule zdvd_zdiff, simp_all) |
|
1089 done |
|
1090 |
|
1091 lemma zdvd_zmod: "f dvd m ==> f dvd (n::int) ==> f dvd m mod n" |
|
1092 apply (unfold dvd_def) |
|
1093 apply (auto simp add: zmod_zmult_zmult1) |
|
1094 done |
|
1095 |
|
1096 lemma zdvd_zmod_imp_zdvd: "k dvd m mod n ==> k dvd n ==> k dvd (m::int)" |
|
1097 apply (subgoal_tac "k dvd n * (m div n) + m mod n") |
|
1098 apply (simp add: zmod_zdiv_equality [symmetric]) |
|
1099 apply (simp only: zdvd_zadd zdvd_zmult2) |
|
1100 done |
|
1101 |
|
1102 lemma zdvd_not_zless: "0 < m ==> m < n ==> \<not> n dvd (m::int)" |
|
1103 apply (unfold dvd_def, auto) |
|
1104 apply (subgoal_tac "0 < n") |
|
1105 prefer 2 |
|
1106 apply (blast intro: zless_trans) |
|
1107 apply (simp add: int_0_less_mult_iff) |
|
1108 apply (subgoal_tac "n * k < n * 1") |
|
1109 apply (drule zmult_zless_cancel1 [THEN iffD1], auto) |
|
1110 done |
|
1111 |
|
1112 lemma int_dvd_iff: "(int m dvd z) = (m dvd nat (abs z))" |
|
1113 apply (auto simp add: dvd_def nat_abs_mult_distrib) |
|
1114 apply (auto simp add: nat_eq_iff zabs_eq_iff) |
|
1115 apply (rule_tac [2] x = "-(int k)" in exI) |
|
1116 apply (auto simp add: zmult_int [symmetric]) |
|
1117 done |
|
1118 |
|
1119 lemma dvd_int_iff: "(z dvd int m) = (nat (abs z) dvd m)" |
|
1120 apply (auto simp add: dvd_def zabs_def zmult_int [symmetric]) |
|
1121 apply (rule_tac [3] x = "nat k" in exI) |
|
1122 apply (rule_tac [2] x = "-(int k)" in exI) |
|
1123 apply (rule_tac x = "nat (-k)" in exI) |
|
1124 apply (cut_tac [3] k = m in int_less_0_conv) |
|
1125 apply (cut_tac k = m in int_less_0_conv) |
|
1126 apply (auto simp add: int_0_le_mult_iff zmult_less_0_iff |
|
1127 nat_mult_distrib [symmetric] nat_eq_iff2) |
|
1128 done |
|
1129 |
|
1130 lemma nat_dvd_iff: "(nat z dvd m) = (if 0 \<le> z then (z dvd int m) else m = 0)" |
|
1131 apply (auto simp add: dvd_def zmult_int [symmetric]) |
|
1132 apply (rule_tac x = "nat k" in exI) |
|
1133 apply (cut_tac k = m in int_less_0_conv) |
|
1134 apply (auto simp add: int_0_le_mult_iff zmult_less_0_iff |
|
1135 nat_mult_distrib [symmetric] nat_eq_iff2) |
|
1136 done |
|
1137 |
|
1138 lemma zminus_dvd_iff [iff]: "(-z dvd w) = (z dvd (w::int))" |
|
1139 apply (auto simp add: dvd_def) |
|
1140 apply (rule_tac [!] x = "-k" in exI, auto) |
|
1141 done |
|
1142 |
|
1143 lemma dvd_zminus_iff [iff]: "(z dvd -w) = (z dvd (w::int))" |
|
1144 apply (auto simp add: dvd_def) |
|
1145 apply (drule zminus_equation [THEN iffD1]) |
|
1146 apply (rule_tac [!] x = "-k" in exI, auto) |
|
1147 done |
|
1148 |
|
1149 lemma zdvd_imp_le: "[| z dvd n; 0 < n |] ==> z <= (n::int)" |
|
1150 apply (rule_tac z=n in int_cases) |
|
1151 apply (auto simp add: dvd_int_iff) |
|
1152 apply (rule_tac z=z in int_cases) |
|
1153 apply (auto simp add: dvd_imp_le) |
|
1154 done |
|
1155 |
990 |
1156 |
991 ML |
1157 ML |
992 {* |
1158 {* |
993 val quorem_def = thm "quorem_def"; |
1159 val quorem_def = thm "quorem_def"; |
994 |
1160 |