diff -r 0d399131008f -r d50b993b4fb9 src/HOL/Number_Theory/Primes.thy --- a/src/HOL/Number_Theory/Primes.thy Mon Nov 30 14:24:51 2015 +0100 +++ b/src/HOL/Number_Theory/Primes.thy Tue Dec 01 14:09:10 2015 +0000 @@ -37,38 +37,33 @@ definition prime :: "nat \ bool" where "prime p = (1 < p \ (\m. m dvd p \ m = 1 \ m = p))" -lemmas prime_nat_def = prime_def - - subsection \Primes\ lemma prime_odd_nat: "prime p \ p > 2 \ odd p" - apply (auto simp add: prime_nat_def even_iff_mod_2_eq_zero dvd_eq_mod_eq_0) + apply (auto simp add: prime_def even_iff_mod_2_eq_zero dvd_eq_mod_eq_0) apply (metis dvd_eq_mod_eq_0 even_Suc mod_by_1 nat_dvd_not_less not_mod_2_eq_0_eq_1 zero_less_numeral) done -(* FIXME Is there a better way to handle these, rather than making them elim rules? *) +lemma prime_gt_0_nat: "prime p \ p > 0" + unfolding prime_def by auto -lemma prime_gt_0_nat [elim]: "prime p \ p > 0" - unfolding prime_nat_def by auto +lemma prime_ge_1_nat: "prime p \ p >= 1" + unfolding prime_def by auto -lemma prime_ge_1_nat [elim]: "prime p \ p >= 1" - unfolding prime_nat_def by auto +lemma prime_gt_1_nat: "prime p \ p > 1" + unfolding prime_def by auto -lemma prime_gt_1_nat [elim]: "prime p \ p > 1" - unfolding prime_nat_def by auto - -lemma prime_ge_Suc_0_nat [elim]: "prime p \ p >= Suc 0" - unfolding prime_nat_def by auto +lemma prime_ge_Suc_0_nat: "prime p \ p >= Suc 0" + unfolding prime_def by auto -lemma prime_gt_Suc_0_nat [elim]: "prime p \ p > Suc 0" - unfolding prime_nat_def by auto +lemma prime_gt_Suc_0_nat: "prime p \ p > Suc 0" + unfolding prime_def by auto -lemma prime_ge_2_nat [elim]: "prime p \ p >= 2" - unfolding prime_nat_def by auto +lemma prime_ge_2_nat: "prime p \ p >= 2" + unfolding prime_def by auto lemma prime_imp_coprime_nat: "prime p \ \ p dvd n \ coprime p n" - apply (unfold prime_nat_def) + apply (unfold prime_def) apply (metis gcd_dvd1_nat gcd_dvd2_nat) done @@ -105,7 +100,7 @@ lemma not_prime_eq_prod_nat: "(n::nat) > 1 \ ~ prime n \ EX m k. n = m * k & 1 < m & m < n & 1 < k & k < n" - unfolding prime_nat_def dvd_def apply auto + unfolding prime_def dvd_def apply auto by (metis mult.commute linorder_neq_iff linorder_not_le mult_1 n_less_n_mult_m one_le_mult_iff less_imp_le_nat) @@ -129,18 +124,18 @@ subsubsection \Make prime naively executable\ lemma zero_not_prime_nat [simp]: "~prime (0::nat)" - by (simp add: prime_nat_def) + by (simp add: prime_def) lemma one_not_prime_nat [simp]: "~prime (1::nat)" - by (simp add: prime_nat_def) + by (simp add: prime_def) lemma Suc_0_not_prime_nat [simp]: "~prime (Suc 0)" - by (simp add: prime_nat_def) + by (simp add: prime_def) lemma prime_nat_code [code]: "prime p \ p > 1 \ (\n \ {1<..One property of coprimality is easier to prove via prime factors.\ @@ -239,7 +234,8 @@ by (rule dvd_diff_nat) then have "p dvd 1" by simp then have "p <= 1" by auto - moreover from \prime p\ have "p > 1" by auto + moreover from \prime p\ have "p > 1" + using prime_def by blast ultimately have False by auto} then have "n < p" by presburger with \prime p\ and \p <= fact n + 1\ show ?thesis by auto @@ -270,7 +266,7 @@ proof - from assms have "1 < p * q" and P: "\m. m dvd p * q \ m = 1 \ m = p * q" - unfolding prime_nat_def by auto + unfolding prime_def by auto from \1 < p * q\ have "p \ 0" by (cases p) auto then have Q: "p = p * q \ q = 1" by auto have "p dvd p * q" by simp