src/HOL/Proofs/Extraction/Euclid.thy
author wenzelm
Wed, 25 Jun 2025 16:35:25 +0200
changeset 82768 8f866fd6fae1
parent 76987 4c275405faae
permissions -rw-r--r--
merged
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
39157
b98909faaea8 more explicit HOL-Proofs sessions, including former ex/Hilbert_Classical.thy which works in parallel mode without the antiquotation option "margin" (which is still critical);
wenzelm
parents: 37598
diff changeset
     1
(*  Title:      HOL/Proofs/Extraction/Euclid.thy
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
     2
    Author:     Markus Wenzel, TU Muenchen
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
     3
    Author:     Freek Wiedijk, Radboud University Nijmegen
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
     4
    Author:     Stefan Berghofer, TU Muenchen
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
     5
*)
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
     6
61986
2461779da2b8 isabelle update_cartouches -c -t;
wenzelm
parents: 61954
diff changeset
     7
section \<open>Euclid's theorem\<close>
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
     8
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
     9
theory Euclid
41413
64cd30d6b0b8 explicit file specifications -- avoid secondary load path;
wenzelm
parents: 39157
diff changeset
    10
imports
66453
cc19f7ca2ed6 session-qualified theory imports: isabelle imports -U -i -d '~~/src/Benchmarks' -a;
wenzelm
parents: 66258
diff changeset
    11
  "HOL-Computational_Algebra.Primes"
41413
64cd30d6b0b8 explicit file specifications -- avoid secondary load path;
wenzelm
parents: 39157
diff changeset
    12
  Util
66453
cc19f7ca2ed6 session-qualified theory imports: isabelle imports -U -i -d '~~/src/Benchmarks' -a;
wenzelm
parents: 66258
diff changeset
    13
  "HOL-Library.Code_Target_Numeral"
67320
6afba546f0e5 updated dependencies + compile
blanchet
parents: 66453
diff changeset
    14
  "HOL-Library.Realizers"
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    15
begin
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    16
61986
2461779da2b8 isabelle update_cartouches -c -t;
wenzelm
parents: 61954
diff changeset
    17
text \<open>
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
    18
  A constructive version of the proof of Euclid's theorem by
76987
4c275405faae isabelle update -u cite;
wenzelm
parents: 67320
diff changeset
    19
  Markus Wenzel and Freek Wiedijk \<^cite>\<open>"Wenzel-Wiedijk-JAR2002"\<close>.
61986
2461779da2b8 isabelle update_cartouches -c -t;
wenzelm
parents: 61954
diff changeset
    20
\<close>
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    21
37288
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
    22
lemma factor_greater_one1: "n = m * k \<Longrightarrow> m < n \<Longrightarrow> k < n \<Longrightarrow> Suc 0 < m"
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
    23
  by (induct m) auto
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
    24
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
    25
lemma factor_greater_one2: "n = m * k \<Longrightarrow> m < n \<Longrightarrow> k < n \<Longrightarrow> Suc 0 < k"
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
    26
  by (induct k) auto
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
    27
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
    28
lemma prod_mn_less_k: "0 < n \<Longrightarrow> 0 < k \<Longrightarrow> Suc 0 < m \<Longrightarrow> m * n = k \<Longrightarrow> n < k"
37288
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
    29
  by (induct m) auto
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
    30
63534
523b488b15c9 Overhaul of prime/multiplicity/prime_factors
eberlm <eberlm@in.tum.de>
parents: 63361
diff changeset
    31
lemma prime_eq: "prime (p::nat) \<longleftrightarrow> 1 < p \<and> (\<forall>m. m dvd p \<longrightarrow> 1 < m \<longrightarrow> m = p)"
63633
2accfb71e33b is_prime -> prime
eberlm <eberlm@in.tum.de>
parents: 63537
diff changeset
    32
  apply (simp add: prime_nat_iff)
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    33
  apply (rule iffI)
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    34
  apply blast
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    35
  apply (erule conjE)
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    36
  apply (rule conjI)
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    37
  apply assumption
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    38
  apply (rule allI impI)+
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    39
  apply (erule allE)
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    40
  apply (erule impE)
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    41
  apply assumption
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
    42
  apply (case_tac "m = 0")
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    43
  apply simp
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
    44
  apply (case_tac "m = Suc 0")
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    45
  apply simp
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    46
  apply simp
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    47
  done
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    48
63534
523b488b15c9 Overhaul of prime/multiplicity/prime_factors
eberlm <eberlm@in.tum.de>
parents: 63361
diff changeset
    49
lemma prime_eq': "prime (p::nat) \<longleftrightarrow> 1 < p \<and> (\<forall>m k. p = m * k \<longrightarrow> 1 < m \<longrightarrow> m = p)"
37598
893dcabf0c04 explicit is better than implicit
haftmann
parents: 37336
diff changeset
    50
  by (simp add: prime_eq dvd_def HOL.all_simps [symmetric] del: HOL.all_simps)
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    51
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    52
lemma not_prime_ex_mk:
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    53
  assumes n: "Suc 0 < n"
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    54
  shows "(\<exists>m k. Suc 0 < m \<and> Suc 0 < k \<and> m < n \<and> k < n \<and> n = m * k) \<or> prime n"
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    55
proof -
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
    56
  from nat_eq_dec have "(\<exists>m<n. n = m * k) \<or> \<not> (\<exists>m<n. n = m * k)" for k
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    57
    by (rule search)
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
    58
  then have "(\<exists>k<n. \<exists>m<n. n = m * k) \<or> \<not> (\<exists>k<n. \<exists>m<n. n = m * k)"
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
    59
    by (rule search)
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
    60
  then show ?thesis
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    61
  proof
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    62
    assume "\<exists>k<n. \<exists>m<n. n = m * k"
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    63
    then obtain k m where k: "k<n" and m: "m<n" and nmk: "n = m * k"
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    64
      by iprover
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    65
    from nmk m k have "Suc 0 < m" by (rule factor_greater_one1)
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    66
    moreover from nmk m k have "Suc 0 < k" by (rule factor_greater_one2)
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    67
    ultimately show ?thesis using k m nmk by iprover
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    68
  next
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    69
    assume "\<not> (\<exists>k<n. \<exists>m<n. n = m * k)"
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
    70
    then have A: "\<forall>k<n. \<forall>m<n. n \<noteq> m * k" by iprover
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    71
    have "\<forall>m k. n = m * k \<longrightarrow> Suc 0 < m \<longrightarrow> m = n"
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    72
    proof (intro allI impI)
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    73
      fix m k
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    74
      assume nmk: "n = m * k"
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    75
      assume m: "Suc 0 < m"
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    76
      from n m nmk have k: "0 < k"
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
    77
        by (cases k) auto
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    78
      moreover from n have n: "0 < n" by simp
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    79
      moreover note m
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    80
      moreover from nmk have "m * k = n" by simp
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    81
      ultimately have kn: "k < n" by (rule prod_mn_less_k)
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    82
      show "m = n"
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    83
      proof (cases "k = Suc 0")
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
    84
        case True
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
    85
        with nmk show ?thesis by (simp only: mult_Suc_right)
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    86
      next
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
    87
        case False
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
    88
        from m have "0 < m" by simp
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
    89
        moreover note n
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
    90
        moreover from False n nmk k have "Suc 0 < k" by auto
57514
bdc2c6b40bf2 prefer ac_simps collections over separate name bindings for add and mult
haftmann
parents: 57512
diff changeset
    91
        moreover from nmk have "k * m = n" by (simp only: ac_simps)
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
    92
        ultimately have mn: "m < n" by (rule prod_mn_less_k)
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32479
diff changeset
    93
        with kn A nmk show ?thesis by iprover
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    94
      qed
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    95
    qed
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    96
    with n have "prime n"
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    97
      by (simp only: prime_eq' One_nat_def simp_thms)
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
    98
    then show ?thesis ..
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
    99
  qed
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   100
qed
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   101
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   102
lemma dvd_factorial: "0 < m \<Longrightarrow> m \<le> n \<Longrightarrow> m dvd fact n"
37288
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   103
proof (induct n rule: nat_induct)
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   104
  case 0
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   105
  then show ?case by simp
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   106
next
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   107
  case (Suc n)
61986
2461779da2b8 isabelle update_cartouches -c -t;
wenzelm
parents: 61954
diff changeset
   108
  from \<open>m \<le> Suc n\<close> show ?case
37288
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   109
  proof (rule le_SucE)
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   110
    assume "m \<le> n"
61986
2461779da2b8 isabelle update_cartouches -c -t;
wenzelm
parents: 61954
diff changeset
   111
    with \<open>0 < m\<close> have "m dvd fact n" by (rule Suc)
37288
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   112
    then have "m dvd (fact n * Suc n)" by (rule dvd_mult2)
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 51143
diff changeset
   113
    then show ?thesis by (simp add: mult.commute)
37288
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   114
  next
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   115
    assume "m = Suc n"
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   116
    then have "m dvd (fact n * Suc n)"
57514
bdc2c6b40bf2 prefer ac_simps collections over separate name bindings for add and mult
haftmann
parents: 57512
diff changeset
   117
      by (auto intro: dvdI simp: ac_simps)
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 51143
diff changeset
   118
    then show ?thesis by (simp add: mult.commute)
37288
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   119
  qed
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   120
qed
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   121
61954
1d43f86f48be more symbols;
wenzelm
parents: 61762
diff changeset
   122
lemma dvd_prod [iff]: "n dvd (\<Prod>m::nat \<in># mset (n # ns). m)"
63830
2ea3725a34bd msetsum -> set_mset, msetprod -> prod_mset
nipkow
parents: 63633
diff changeset
   123
  by (simp add: prod_mset_Un)
37288
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   124
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   125
definition all_prime :: "nat list \<Rightarrow> bool"
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   126
  where "all_prime ps \<longleftrightarrow> (\<forall>p\<in>set ps. prime p)"
37335
381b391351b5 avoid flowerish abbreviation
haftmann
parents: 37291
diff changeset
   127
381b391351b5 avoid flowerish abbreviation
haftmann
parents: 37291
diff changeset
   128
lemma all_prime_simps:
381b391351b5 avoid flowerish abbreviation
haftmann
parents: 37291
diff changeset
   129
  "all_prime []"
381b391351b5 avoid flowerish abbreviation
haftmann
parents: 37291
diff changeset
   130
  "all_prime (p # ps) \<longleftrightarrow> prime p \<and> all_prime ps"
381b391351b5 avoid flowerish abbreviation
haftmann
parents: 37291
diff changeset
   131
  by (simp_all add: all_prime_def)
37288
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   132
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   133
lemma all_prime_append: "all_prime (ps @ qs) \<longleftrightarrow> all_prime ps \<and> all_prime qs"
37335
381b391351b5 avoid flowerish abbreviation
haftmann
parents: 37291
diff changeset
   134
  by (simp add: all_prime_def ball_Un)
37288
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   135
37335
381b391351b5 avoid flowerish abbreviation
haftmann
parents: 37291
diff changeset
   136
lemma split_all_prime:
381b391351b5 avoid flowerish abbreviation
haftmann
parents: 37291
diff changeset
   137
  assumes "all_prime ms" and "all_prime ns"
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   138
  shows "\<exists>qs. all_prime qs \<and>
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   139
    (\<Prod>m::nat \<in># mset qs. m) = (\<Prod>m::nat \<in># mset ms. m) * (\<Prod>m::nat \<in># mset ns. m)"
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   140
  (is "\<exists>qs. ?P qs \<and> ?Q qs")
37288
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   141
proof -
37335
381b391351b5 avoid flowerish abbreviation
haftmann
parents: 37291
diff changeset
   142
  from assms have "all_prime (ms @ ns)"
381b391351b5 avoid flowerish abbreviation
haftmann
parents: 37291
diff changeset
   143
    by (simp add: all_prime_append)
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   144
  moreover
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   145
  have "(\<Prod>m::nat \<in># mset (ms @ ns). m) = (\<Prod>m::nat \<in># mset ms. m) * (\<Prod>m::nat \<in># mset ns. m)"
63830
2ea3725a34bd msetsum -> set_mset, msetprod -> prod_mset
nipkow
parents: 63633
diff changeset
   146
    using assms by (simp add: prod_mset_Un)
37288
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   147
  ultimately have "?P (ms @ ns) \<and> ?Q (ms @ ns)" ..
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   148
  then show ?thesis ..
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   149
qed
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   150
37335
381b391351b5 avoid flowerish abbreviation
haftmann
parents: 37291
diff changeset
   151
lemma all_prime_nempty_g_one:
381b391351b5 avoid flowerish abbreviation
haftmann
parents: 37291
diff changeset
   152
  assumes "all_prime ps" and "ps \<noteq> []"
61954
1d43f86f48be more symbols;
wenzelm
parents: 61762
diff changeset
   153
  shows "Suc 0 < (\<Prod>m::nat \<in># mset ps. m)"
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   154
  using \<open>ps \<noteq> []\<close> \<open>all_prime ps\<close>
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   155
  unfolding One_nat_def [symmetric]
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   156
  by (induct ps rule: list_nonempty_induct)
63830
2ea3725a34bd msetsum -> set_mset, msetprod -> prod_mset
nipkow
parents: 63633
diff changeset
   157
    (simp_all add: all_prime_simps prod_mset_Un prime_gt_1_nat less_1_mult del: One_nat_def)
37288
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   158
61954
1d43f86f48be more symbols;
wenzelm
parents: 61762
diff changeset
   159
lemma factor_exists: "Suc 0 < n \<Longrightarrow> (\<exists>ps. all_prime ps \<and> (\<Prod>m::nat \<in># mset ps. m) = n)"
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   160
proof (induct n rule: nat_wf_ind)
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   161
  case (1 n)
61986
2461779da2b8 isabelle update_cartouches -c -t;
wenzelm
parents: 61954
diff changeset
   162
  from \<open>Suc 0 < n\<close>
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   163
  have "(\<exists>m k. Suc 0 < m \<and> Suc 0 < k \<and> m < n \<and> k < n \<and> n = m * k) \<or> prime n"
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   164
    by (rule not_prime_ex_mk)
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   165
  then show ?case
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   166
  proof
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   167
    assume "\<exists>m k. Suc 0 < m \<and> Suc 0 < k \<and> m < n \<and> k < n \<and> n = m * k"
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   168
    then obtain m k where m: "Suc 0 < m" and k: "Suc 0 < k" and mn: "m < n"
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   169
      and kn: "k < n" and nmk: "n = m * k"
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   170
      by iprover
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   171
    from mn and m have "\<exists>ps. all_prime ps \<and> (\<Prod>m::nat \<in># mset ps. m) = m"
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   172
      by (rule 1)
61954
1d43f86f48be more symbols;
wenzelm
parents: 61762
diff changeset
   173
    then obtain ps1 where "all_prime ps1" and prod_ps1_m: "(\<Prod>m::nat \<in># mset ps1. m) = m"
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   174
      by iprover
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   175
    from kn and k have "\<exists>ps. all_prime ps \<and> (\<Prod>m::nat \<in># mset ps. m) = k"
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   176
      by (rule 1)
61954
1d43f86f48be more symbols;
wenzelm
parents: 61762
diff changeset
   177
    then obtain ps2 where "all_prime ps2" and prod_ps2_k: "(\<Prod>m::nat \<in># mset ps2. m) = k"
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   178
      by iprover
61986
2461779da2b8 isabelle update_cartouches -c -t;
wenzelm
parents: 61954
diff changeset
   179
    from \<open>all_prime ps1\<close> \<open>all_prime ps2\<close>
61954
1d43f86f48be more symbols;
wenzelm
parents: 61762
diff changeset
   180
    have "\<exists>ps. all_prime ps \<and> (\<Prod>m::nat \<in># mset ps. m) =
1d43f86f48be more symbols;
wenzelm
parents: 61762
diff changeset
   181
      (\<Prod>m::nat \<in># mset ps1. m) * (\<Prod>m::nat \<in># mset ps2. m)"
37335
381b391351b5 avoid flowerish abbreviation
haftmann
parents: 37291
diff changeset
   182
      by (rule split_all_prime)
381b391351b5 avoid flowerish abbreviation
haftmann
parents: 37291
diff changeset
   183
    with prod_ps1_m prod_ps2_k nmk show ?thesis by simp
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   184
  next
37335
381b391351b5 avoid flowerish abbreviation
haftmann
parents: 37291
diff changeset
   185
    assume "prime n" then have "all_prime [n]" by (simp add: all_prime_simps)
63830
2ea3725a34bd msetsum -> set_mset, msetprod -> prod_mset
nipkow
parents: 63633
diff changeset
   186
    moreover have "(\<Prod>m::nat \<in># mset [n]. m) = n" by (simp)
61954
1d43f86f48be more symbols;
wenzelm
parents: 61762
diff changeset
   187
    ultimately have "all_prime [n] \<and> (\<Prod>m::nat \<in># mset [n]. m) = n" ..
37288
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   188
    then show ?thesis ..
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   189
  qed
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   190
qed
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   191
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   192
lemma prime_factor_exists:
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   193
  assumes N: "(1::nat) < n"
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   194
  shows "\<exists>p. prime p \<and> p dvd n"
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   195
proof -
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   196
  from N obtain ps where "all_prime ps" and prod_ps: "n = (\<Prod>m::nat \<in># mset ps. m)"
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   197
    using factor_exists by simp iprover
37335
381b391351b5 avoid flowerish abbreviation
haftmann
parents: 37291
diff changeset
   198
  with N have "ps \<noteq> []"
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   199
    by (auto simp add: all_prime_nempty_g_one)
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   200
  then obtain p qs where ps: "ps = p # qs"
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   201
    by (cases ps) simp
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   202
  with \<open>all_prime ps\<close> have "prime p"
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   203
    by (simp add: all_prime_simps)
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   204
  moreover from \<open>all_prime ps\<close> ps prod_ps have "p dvd n"
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   205
    by (simp only: dvd_prod)
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   206
  ultimately show ?thesis by iprover
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   207
qed
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   208
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   209
text \<open>Euclid's theorem: there are infinitely many primes.\<close>
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   210
63534
523b488b15c9 Overhaul of prime/multiplicity/prime_factors
eberlm <eberlm@in.tum.de>
parents: 63361
diff changeset
   211
lemma Euclid: "\<exists>p::nat. prime p \<and> n < p"
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   212
proof -
59730
b7c394c7a619 The factorial function, "fact", now has type "nat => 'a"
paulson <lp15@cam.ac.uk>
parents: 58889
diff changeset
   213
  let ?k = "fact n + (1::nat)"
b7c394c7a619 The factorial function, "fact", now has type "nat => 'a"
paulson <lp15@cam.ac.uk>
parents: 58889
diff changeset
   214
  have "1 < ?k" by simp
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   215
  then obtain p where prime: "prime p" and dvd: "p dvd ?k"
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   216
    using prime_factor_exists by iprover
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   217
  have "n < p"
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   218
  proof -
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   219
    have "\<not> p \<le> n"
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   220
    proof
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   221
      assume pn: "p \<le> n"
61986
2461779da2b8 isabelle update_cartouches -c -t;
wenzelm
parents: 61954
diff changeset
   222
      from \<open>prime p\<close> have "0 < p" by (rule prime_gt_0_nat)
37288
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   223
      then have "p dvd fact n" using pn by (rule dvd_factorial)
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   224
      with dvd have "p dvd ?k - fact n" by (rule dvd_diff_nat)
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   225
      then have "p dvd 1" by simp
37288
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   226
      with prime show False by auto
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   227
    qed
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   228
    then show ?thesis by simp
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   229
  qed
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   230
  with prime show ?thesis by iprover
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   231
qed
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   232
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   233
extract Euclid
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   234
61986
2461779da2b8 isabelle update_cartouches -c -t;
wenzelm
parents: 61954
diff changeset
   235
text \<open>
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   236
  The program extracted from the proof of Euclid's theorem looks as follows.
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   237
  @{thm [display] Euclid_def}
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   238
  The program corresponding to the proof of the factorization theorem is
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   239
  @{thm [display] factor_exists_def}
61986
2461779da2b8 isabelle update_cartouches -c -t;
wenzelm
parents: 61954
diff changeset
   240
\<close>
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   241
27982
2aaa4a5569a6 default replaces arbitrary
haftmann
parents: 25976
diff changeset
   242
instantiation nat :: default
2aaa4a5569a6 default replaces arbitrary
haftmann
parents: 25976
diff changeset
   243
begin
2aaa4a5569a6 default replaces arbitrary
haftmann
parents: 25976
diff changeset
   244
2aaa4a5569a6 default replaces arbitrary
haftmann
parents: 25976
diff changeset
   245
definition "default = (0::nat)"
2aaa4a5569a6 default replaces arbitrary
haftmann
parents: 25976
diff changeset
   246
2aaa4a5569a6 default replaces arbitrary
haftmann
parents: 25976
diff changeset
   247
instance ..
2aaa4a5569a6 default replaces arbitrary
haftmann
parents: 25976
diff changeset
   248
2aaa4a5569a6 default replaces arbitrary
haftmann
parents: 25976
diff changeset
   249
end
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   250
27982
2aaa4a5569a6 default replaces arbitrary
haftmann
parents: 25976
diff changeset
   251
instantiation list :: (type) default
2aaa4a5569a6 default replaces arbitrary
haftmann
parents: 25976
diff changeset
   252
begin
2aaa4a5569a6 default replaces arbitrary
haftmann
parents: 25976
diff changeset
   253
2aaa4a5569a6 default replaces arbitrary
haftmann
parents: 25976
diff changeset
   254
definition "default = []"
2aaa4a5569a6 default replaces arbitrary
haftmann
parents: 25976
diff changeset
   255
2aaa4a5569a6 default replaces arbitrary
haftmann
parents: 25976
diff changeset
   256
instance ..
2aaa4a5569a6 default replaces arbitrary
haftmann
parents: 25976
diff changeset
   257
2aaa4a5569a6 default replaces arbitrary
haftmann
parents: 25976
diff changeset
   258
end
2aaa4a5569a6 default replaces arbitrary
haftmann
parents: 25976
diff changeset
   259
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   260
primrec iterate :: "nat \<Rightarrow> ('a \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'a list"
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   261
where
37288
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   262
  "iterate 0 f x = []"
63361
d10eab0672f9 misc tuning and modernization;
wenzelm
parents: 61986
diff changeset
   263
| "iterate (Suc n) f x = (let y = f x in y # iterate n f y)"
37288
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   264
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   265
lemma "factor_exists 1007 = [53, 19]" by eval
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   266
lemma "factor_exists 567 = [7, 3, 3, 3, 3]" by eval
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   267
lemma "factor_exists 345 = [23, 5, 3]" by eval
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   268
lemma "factor_exists 999 = [37, 3, 3, 3]" by eval
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   269
lemma "factor_exists 876 = [73, 3, 2, 2]" by eval
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   270
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   271
lemma "iterate 4 Euclid 0 = [2, 3, 7, 71]" by eval
2b1c6dd48995 removed dependency of Euclid on Old_Number_Theory
haftmann
parents: 32960
diff changeset
   272
25422
37e991068d96 New case studies for program extraction.
berghofe
parents:
diff changeset
   273
end