src/HOL/Proofs/Extraction/Euclid.thy
changeset 63830 2ea3725a34bd
parent 63633 2accfb71e33b
child 65417 fc41a5650fb1
equal deleted inserted replaced
63829:6a05c8cbf7de 63830:2ea3725a34bd
   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