doc-src/TutorialI/Rules/Primes.thy
author blanchet
Mon, 19 Apr 2010 18:14:45 +0200
changeset 36230 43d10a494c91
parent 35416 d8d7d1b785af
child 36745 403585a89772
permissions -rw-r--r--
added warning about inconsistent context to Metis; it makes more sense here than in Sledgehammer, because Sledgehammer is unsound and there's no point in having people panicking about the consistency of their context when their context is in fact consistent
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10341
6eb91805a012 added the $Id:$ line
paulson
parents: 10300
diff changeset
     1
(* ID:         $Id$ *)
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
     2
(* EXTRACT from HOL/ex/Primes.thy*)
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
     3
11080
22855d091249 various revisions in response to comments from Tobias
paulson
parents: 10986
diff changeset
     4
(*Euclid's algorithm 
22855d091249 various revisions in response to comments from Tobias
paulson
parents: 10986
diff changeset
     5
  This material now appears AFTER that of Forward.thy *)
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 11234
diff changeset
     6
theory Primes imports Main begin
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
     7
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 22097
diff changeset
     8
fun gcd :: "nat \<Rightarrow> nat \<Rightarrow> nat" where
3dc292be0b54 recdef -> fun
nipkow
parents: 22097
diff changeset
     9
  "gcd m n = (if n=0 then m else gcd n (m mod n))"
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    10
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    11
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    12
ML "Pretty.setmargin 64"
22097
7ee0529c5674 renamed IsarOutput to ThyOutput;
wenzelm
parents: 16417
diff changeset
    13
ML "ThyOutput.indent := 5"  (*that is, Doc/TutorialI/settings.ML*)
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    14
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    15
11234
6902638af59e quantifier instantiation
paulson
parents: 11080
diff changeset
    16
text {*Now in Basic.thy!
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    17
@{thm[display]"dvd_def"}
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    18
\rulename{dvd_def}
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    19
*};
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    20
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    21
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    22
(*** Euclid's Algorithm ***)
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    23
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 22097
diff changeset
    24
lemma gcd_0 [simp]: "gcd m 0 = m"
10846
623141a08705 reformatting, and splitting the end of "Primes" to create "Forward"
paulson
parents: 10795
diff changeset
    25
apply (simp);
623141a08705 reformatting, and splitting the end of "Primes" to create "Forward"
paulson
parents: 10795
diff changeset
    26
done
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    27
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 22097
diff changeset
    28
lemma gcd_non_0 [simp]: "0<n \<Longrightarrow> gcd m n = gcd n (m mod n)"
10846
623141a08705 reformatting, and splitting the end of "Primes" to create "Forward"
paulson
parents: 10795
diff changeset
    29
apply (simp)
623141a08705 reformatting, and splitting the end of "Primes" to create "Forward"
paulson
parents: 10795
diff changeset
    30
done;
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    31
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    32
declare gcd.simps [simp del];
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    33
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    34
(*gcd(m,n) divides m and n.  The conjunctions don't seem provable separately*)
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 22097
diff changeset
    35
lemma gcd_dvd_both: "(gcd m n dvd m) \<and> (gcd m n dvd n)"
10846
623141a08705 reformatting, and splitting the end of "Primes" to create "Forward"
paulson
parents: 10795
diff changeset
    36
apply (induct_tac m n rule: gcd.induct)
11080
22855d091249 various revisions in response to comments from Tobias
paulson
parents: 10986
diff changeset
    37
  --{* @{subgoals[display,indent=0,margin=65]} *}
10846
623141a08705 reformatting, and splitting the end of "Primes" to create "Forward"
paulson
parents: 10795
diff changeset
    38
apply (case_tac "n=0")
11080
22855d091249 various revisions in response to comments from Tobias
paulson
parents: 10986
diff changeset
    39
txt{*subgoals after the case tac
22855d091249 various revisions in response to comments from Tobias
paulson
parents: 10986
diff changeset
    40
@{subgoals[display,indent=0,margin=65]}
22855d091249 various revisions in response to comments from Tobias
paulson
parents: 10986
diff changeset
    41
*};
22855d091249 various revisions in response to comments from Tobias
paulson
parents: 10986
diff changeset
    42
apply (simp_all) 
22855d091249 various revisions in response to comments from Tobias
paulson
parents: 10986
diff changeset
    43
  --{* @{subgoals[display,indent=0,margin=65]} *}
10846
623141a08705 reformatting, and splitting the end of "Primes" to create "Forward"
paulson
parents: 10795
diff changeset
    44
by (blast dest: dvd_mod_imp_dvd)
623141a08705 reformatting, and splitting the end of "Primes" to create "Forward"
paulson
parents: 10795
diff changeset
    45
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    46
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    47
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    48
text {*
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    49
@{thm[display] dvd_mod_imp_dvd}
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    50
\rulename{dvd_mod_imp_dvd}
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    51
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    52
@{thm[display] dvd_trans}
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    53
\rulename{dvd_trans}
11080
22855d091249 various revisions in response to comments from Tobias
paulson
parents: 10986
diff changeset
    54
*}
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    55
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    56
lemmas gcd_dvd1 [iff] = gcd_dvd_both [THEN conjunct1]
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    57
lemmas gcd_dvd2 [iff] = gcd_dvd_both [THEN conjunct2];
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    58
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    59
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    60
text {*
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    61
\begin{quote}
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    62
@{thm[display] gcd_dvd1}
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    63
\rulename{gcd_dvd1}
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    64
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    65
@{thm[display] gcd_dvd2}
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    66
\rulename{gcd_dvd2}
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    67
\end{quote}
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    68
*};
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    69
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    70
(*Maximality: for all m,n,k naturals, 
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    71
                if k divides m and k divides n then k divides gcd(m,n)*)
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    72
lemma gcd_greatest [rule_format]:
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 22097
diff changeset
    73
      "k dvd m \<longrightarrow> k dvd n \<longrightarrow> k dvd gcd m n"
10846
623141a08705 reformatting, and splitting the end of "Primes" to create "Forward"
paulson
parents: 10795
diff changeset
    74
apply (induct_tac m n rule: gcd.induct)
623141a08705 reformatting, and splitting the end of "Primes" to create "Forward"
paulson
parents: 10795
diff changeset
    75
apply (case_tac "n=0")
10853
2c64c7991f7c case_tac subgoals
paulson
parents: 10846
diff changeset
    76
txt{*subgoals after the case tac
2c64c7991f7c case_tac subgoals
paulson
parents: 10846
diff changeset
    77
@{subgoals[display,indent=0,margin=65]}
2c64c7991f7c case_tac subgoals
paulson
parents: 10846
diff changeset
    78
*};
10846
623141a08705 reformatting, and splitting the end of "Primes" to create "Forward"
paulson
parents: 10795
diff changeset
    79
apply (simp_all add: dvd_mod)
623141a08705 reformatting, and splitting the end of "Primes" to create "Forward"
paulson
parents: 10795
diff changeset
    80
done
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    81
11080
22855d091249 various revisions in response to comments from Tobias
paulson
parents: 10986
diff changeset
    82
text {*
22855d091249 various revisions in response to comments from Tobias
paulson
parents: 10986
diff changeset
    83
@{thm[display] dvd_mod}
22855d091249 various revisions in response to comments from Tobias
paulson
parents: 10986
diff changeset
    84
\rulename{dvd_mod}
22855d091249 various revisions in response to comments from Tobias
paulson
parents: 10986
diff changeset
    85
*}
22855d091249 various revisions in response to comments from Tobias
paulson
parents: 10986
diff changeset
    86
10853
2c64c7991f7c case_tac subgoals
paulson
parents: 10846
diff changeset
    87
(*just checking the claim that case_tac "n" works too*)
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 22097
diff changeset
    88
lemma "k dvd m \<longrightarrow> k dvd n \<longrightarrow> k dvd gcd m n"
10853
2c64c7991f7c case_tac subgoals
paulson
parents: 10846
diff changeset
    89
apply (induct_tac m n rule: gcd.induct)
2c64c7991f7c case_tac subgoals
paulson
parents: 10846
diff changeset
    90
apply (case_tac "n")
11080
22855d091249 various revisions in response to comments from Tobias
paulson
parents: 10986
diff changeset
    91
apply (simp_all add: dvd_mod)
22855d091249 various revisions in response to comments from Tobias
paulson
parents: 10986
diff changeset
    92
done
22855d091249 various revisions in response to comments from Tobias
paulson
parents: 10986
diff changeset
    93
10853
2c64c7991f7c case_tac subgoals
paulson
parents: 10846
diff changeset
    94
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    95
theorem gcd_greatest_iff [iff]: 
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 22097
diff changeset
    96
        "(k dvd gcd m n) = (k dvd m \<and> k dvd n)"
10846
623141a08705 reformatting, and splitting the end of "Primes" to create "Forward"
paulson
parents: 10795
diff changeset
    97
by (blast intro!: gcd_greatest intro: dvd_trans)
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    98
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
    99
10846
623141a08705 reformatting, and splitting the end of "Primes" to create "Forward"
paulson
parents: 10795
diff changeset
   100
(**** The material below was omitted from the book ****)
623141a08705 reformatting, and splitting the end of "Primes" to create "Forward"
paulson
parents: 10795
diff changeset
   101
35416
d8d7d1b785af replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
haftmann
parents: 33750
diff changeset
   102
definition is_gcd :: "[nat,nat,nat] \<Rightarrow> bool" where        (*gcd as a relation*)
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   103
    "is_gcd p m n == p dvd m  \<and>  p dvd n  \<and>
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   104
                     (ALL d. d dvd m \<and> d dvd n \<longrightarrow> d dvd p)"
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   105
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   106
(*Function gcd yields the Greatest Common Divisor*)
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 22097
diff changeset
   107
lemma is_gcd: "is_gcd (gcd m n) m n"
10846
623141a08705 reformatting, and splitting the end of "Primes" to create "Forward"
paulson
parents: 10795
diff changeset
   108
apply (simp add: is_gcd_def gcd_greatest);
623141a08705 reformatting, and splitting the end of "Primes" to create "Forward"
paulson
parents: 10795
diff changeset
   109
done
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   110
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   111
(*uniqueness of GCDs*)
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   112
lemma is_gcd_unique: "\<lbrakk> is_gcd m a b; is_gcd n a b \<rbrakk> \<Longrightarrow> m=n"
10846
623141a08705 reformatting, and splitting the end of "Primes" to create "Forward"
paulson
parents: 10795
diff changeset
   113
apply (simp add: is_gcd_def);
33750
0a0d6d79d984 anti_sym -> antisym
nipkow
parents: 27657
diff changeset
   114
apply (blast intro: dvd_antisym)
10846
623141a08705 reformatting, and splitting the end of "Primes" to create "Forward"
paulson
parents: 10795
diff changeset
   115
done
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   116
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   117
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   118
text {*
33750
0a0d6d79d984 anti_sym -> antisym
nipkow
parents: 27657
diff changeset
   119
@{thm[display] dvd_antisym}
0a0d6d79d984 anti_sym -> antisym
nipkow
parents: 27657
diff changeset
   120
\rulename{dvd_antisym}
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   121
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   122
\begin{isabelle}
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   123
proof\ (prove):\ step\ 1\isanewline
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   124
\isanewline
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   125
goal\ (lemma\ is_gcd_unique):\isanewline
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   126
\isasymlbrakk is_gcd\ m\ a\ b;\ is_gcd\ n\ a\ b\isasymrbrakk \ \isasymLongrightarrow \ m\ =\ n\isanewline
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   127
\ 1.\ \isasymlbrakk m\ dvd\ a\ \isasymand \ m\ dvd\ b\ \isasymand \ (\isasymforall d.\ d\ dvd\ a\ \isasymand \ d\ dvd\ b\ \isasymlongrightarrow \ d\ dvd\ m);\isanewline
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   128
\ \ \ \ \ \ \ n\ dvd\ a\ \isasymand \ n\ dvd\ b\ \isasymand \ (\isasymforall d.\ d\ dvd\ a\ \isasymand \ d\ dvd\ b\ \isasymlongrightarrow \ d\ dvd\ n)\isasymrbrakk \isanewline
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   129
\ \ \ \ \isasymLongrightarrow \ m\ =\ n
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   130
\end{isabelle}
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   131
*};
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   132
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 22097
diff changeset
   133
lemma gcd_assoc: "gcd (gcd k m) n = gcd k (gcd m n)"
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   134
  apply (rule is_gcd_unique)
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   135
  apply (rule is_gcd)
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   136
  apply (simp add: is_gcd_def);
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   137
  apply (blast intro: dvd_trans);
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 22097
diff changeset
   138
  done
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   139
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   140
text{*
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   141
\begin{isabelle}
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   142
proof\ (prove):\ step\ 3\isanewline
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   143
\isanewline
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   144
goal\ (lemma\ gcd_assoc):\isanewline
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   145
gcd\ (gcd\ (k,\ m),\ n)\ =\ gcd\ (k,\ gcd\ (m,\ n))\isanewline
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   146
\ 1.\ gcd\ (k,\ gcd\ (m,\ n))\ dvd\ k\ \isasymand \isanewline
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   147
\ \ \ \ gcd\ (k,\ gcd\ (m,\ n))\ dvd\ m\ \isasymand \ gcd\ (k,\ gcd\ (m,\ n))\ dvd\ n
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   148
\end{isabelle}
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   149
*}
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   150
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   151
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 22097
diff changeset
   152
lemma gcd_dvd_gcd_mult: "gcd m n dvd gcd (k*m) n"
27657
0efc8b68ee4a (adjusted)
haftmann
parents: 25261
diff changeset
   153
  apply (auto intro: dvd_trans [of _ m])
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   154
  done
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   155
33750
0a0d6d79d984 anti_sym -> antisym
nipkow
parents: 27657
diff changeset
   156
(*This is half of the proof (by dvd_antisym) of*)
25261
3dc292be0b54 recdef -> fun
nipkow
parents: 22097
diff changeset
   157
lemma gcd_mult_cancel: "gcd k n = 1 \<Longrightarrow> gcd (k*m) n = gcd m n"
10295
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   158
  oops
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   159
8eb12693cead the Rules chapter and theories
paulson
parents:
diff changeset
   160
end