doc-src/TutorialI/Rules/Primes.thy
author haftmann
Mon, 01 Mar 2010 13:40:23 +0100
changeset 35416 d8d7d1b785af
parent 33750 0a0d6d79d984
child 36745 403585a89772
permissions -rw-r--r--
replaced a couple of constsdefs by definitions (also some old primrecs by modern ones)
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