117 then show ?thesis by (simp add: mult.commute) |
117 then show ?thesis by (simp add: mult.commute) |
118 qed |
118 qed |
119 qed |
119 qed |
120 |
120 |
121 lemma dvd_prod [iff]: "n dvd (\<Prod>m::nat \<in># mset (n # ns). m)" |
121 lemma dvd_prod [iff]: "n dvd (\<Prod>m::nat \<in># mset (n # ns). m)" |
122 by (simp add: msetprod_Un) |
122 by (simp add: prod_mset_Un) |
123 |
123 |
124 definition all_prime :: "nat list \<Rightarrow> bool" |
124 definition all_prime :: "nat list \<Rightarrow> bool" |
125 where "all_prime ps \<longleftrightarrow> (\<forall>p\<in>set ps. prime p)" |
125 where "all_prime ps \<longleftrightarrow> (\<forall>p\<in>set ps. prime p)" |
126 |
126 |
127 lemma all_prime_simps: |
127 lemma all_prime_simps: |
140 proof - |
140 proof - |
141 from assms have "all_prime (ms @ ns)" |
141 from assms have "all_prime (ms @ ns)" |
142 by (simp add: all_prime_append) |
142 by (simp add: all_prime_append) |
143 moreover |
143 moreover |
144 have "(\<Prod>m::nat \<in># mset (ms @ ns). m) = (\<Prod>m::nat \<in># mset ms. m) * (\<Prod>m::nat \<in># mset ns. m)" |
144 have "(\<Prod>m::nat \<in># mset (ms @ ns). m) = (\<Prod>m::nat \<in># mset ms. m) * (\<Prod>m::nat \<in># mset ns. m)" |
145 using assms by (simp add: msetprod_Un) |
145 using assms by (simp add: prod_mset_Un) |
146 ultimately have "?P (ms @ ns) \<and> ?Q (ms @ ns)" .. |
146 ultimately have "?P (ms @ ns) \<and> ?Q (ms @ ns)" .. |
147 then show ?thesis .. |
147 then show ?thesis .. |
148 qed |
148 qed |
149 |
149 |
150 lemma all_prime_nempty_g_one: |
150 lemma all_prime_nempty_g_one: |
151 assumes "all_prime ps" and "ps \<noteq> []" |
151 assumes "all_prime ps" and "ps \<noteq> []" |
152 shows "Suc 0 < (\<Prod>m::nat \<in># mset ps. m)" |
152 shows "Suc 0 < (\<Prod>m::nat \<in># mset ps. m)" |
153 using \<open>ps \<noteq> []\<close> \<open>all_prime ps\<close> |
153 using \<open>ps \<noteq> []\<close> \<open>all_prime ps\<close> |
154 unfolding One_nat_def [symmetric] |
154 unfolding One_nat_def [symmetric] |
155 by (induct ps rule: list_nonempty_induct) |
155 by (induct ps rule: list_nonempty_induct) |
156 (simp_all add: all_prime_simps msetprod_Un prime_gt_1_nat less_1_mult del: One_nat_def) |
156 (simp_all add: all_prime_simps prod_mset_Un prime_gt_1_nat less_1_mult del: One_nat_def) |
157 |
157 |
158 lemma factor_exists: "Suc 0 < n \<Longrightarrow> (\<exists>ps. all_prime ps \<and> (\<Prod>m::nat \<in># mset ps. m) = n)" |
158 lemma factor_exists: "Suc 0 < n \<Longrightarrow> (\<exists>ps. all_prime ps \<and> (\<Prod>m::nat \<in># mset ps. m) = n)" |
159 proof (induct n rule: nat_wf_ind) |
159 proof (induct n rule: nat_wf_ind) |
160 case (1 n) |
160 case (1 n) |
161 from \<open>Suc 0 < n\<close> |
161 from \<open>Suc 0 < n\<close> |
180 (\<Prod>m::nat \<in># mset ps1. m) * (\<Prod>m::nat \<in># mset ps2. m)" |
180 (\<Prod>m::nat \<in># mset ps1. m) * (\<Prod>m::nat \<in># mset ps2. m)" |
181 by (rule split_all_prime) |
181 by (rule split_all_prime) |
182 with prod_ps1_m prod_ps2_k nmk show ?thesis by simp |
182 with prod_ps1_m prod_ps2_k nmk show ?thesis by simp |
183 next |
183 next |
184 assume "prime n" then have "all_prime [n]" by (simp add: all_prime_simps) |
184 assume "prime n" then have "all_prime [n]" by (simp add: all_prime_simps) |
185 moreover have "(\<Prod>m::nat \<in># mset [n]. m) = n" by (simp add: msetprod_singleton) |
185 moreover have "(\<Prod>m::nat \<in># mset [n]. m) = n" by (simp) |
186 ultimately have "all_prime [n] \<and> (\<Prod>m::nat \<in># mset [n]. m) = n" .. |
186 ultimately have "all_prime [n] \<and> (\<Prod>m::nat \<in># mset [n]. m) = n" .. |
187 then show ?thesis .. |
187 then show ?thesis .. |
188 qed |
188 qed |
189 qed |
189 qed |
190 |
190 |