doc-src/Exercises/0304/a5/a5.thy
author wenzelm
Wed, 09 Jun 2004 18:52:42 +0200
changeset 14898 a25550451b51
parent 14499 f08ea8e964d8
permissions -rw-r--r--
Url.File;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14499
streckem
parents:
diff changeset
     1
streckem
parents:
diff changeset
     2
(*<*) theory a5 = Main: (*>*)
streckem
parents:
diff changeset
     3
streckem
parents:
diff changeset
     4
subsection {* The Euclidean Algorithm -- Inductively *}
streckem
parents:
diff changeset
     5
streckem
parents:
diff changeset
     6
subsubsection {* Rules without Base Case *}
streckem
parents:
diff changeset
     7
streckem
parents:
diff changeset
     8
text {* Show that the following
streckem
parents:
diff changeset
     9
*}
streckem
parents:
diff changeset
    10
streckem
parents:
diff changeset
    11
consts evenempty :: "nat set"
streckem
parents:
diff changeset
    12
inductive evenempty
streckem
parents:
diff changeset
    13
  intros
streckem
parents:
diff changeset
    14
  Add2Ie: "n \<in> evenempty \<Longrightarrow> Suc(Suc n) \<in> evenempty"
streckem
parents:
diff changeset
    15
streckem
parents:
diff changeset
    16
text {* defines the empty set: *}
streckem
parents:
diff changeset
    17
streckem
parents:
diff changeset
    18
lemma evenempty_empty: "evenempty = {}"
streckem
parents:
diff changeset
    19
(*<*) oops (*>*)
streckem
parents:
diff changeset
    20
streckem
parents:
diff changeset
    21
streckem
parents:
diff changeset
    22
subsubsection {* The Euclidean Algorithm *}
streckem
parents:
diff changeset
    23
streckem
parents:
diff changeset
    24
text {* Define inductively the set @{text gcd}, which characterizes
streckem
parents:
diff changeset
    25
the greatest common divisor of two natural numbers: *}
streckem
parents:
diff changeset
    26
streckem
parents:
diff changeset
    27
(*<*)consts(*>*)
streckem
parents:
diff changeset
    28
  gcd :: "(nat \<times> nat \<times> nat) set"
streckem
parents:
diff changeset
    29
streckem
parents:
diff changeset
    30
text {* Here, @{text "(a,b,g) \<in> gcd"} means that @{text g} is the gcd
streckem
parents:
diff changeset
    31
of @{text a} und @{text b}. The definition should closely follow the
streckem
parents:
diff changeset
    32
Euclidean algorithm.
streckem
parents:
diff changeset
    33
streckem
parents:
diff changeset
    34
Reminder: The Euclidean algorithm repeatedly subtracts the smaller
streckem
parents:
diff changeset
    35
from the larger number, until one of the numbers is 0. Then, the other
streckem
parents:
diff changeset
    36
number is the gcd. *}
streckem
parents:
diff changeset
    37
streckem
parents:
diff changeset
    38
text {* Now, compute the gcd of 15 and 10: *}
streckem
parents:
diff changeset
    39
lemma "(15, 10, ?g)  \<in> gcd"
streckem
parents:
diff changeset
    40
(*<*) oops (*>*)
streckem
parents:
diff changeset
    41
streckem
parents:
diff changeset
    42
text {* How does your algorithm behave on special cases as the following?  *}
streckem
parents:
diff changeset
    43
lemma "(0, 0, ?g)  \<in> gcd"
streckem
parents:
diff changeset
    44
(*<*) oops (*>*)
streckem
parents:
diff changeset
    45
streckem
parents:
diff changeset
    46
text {* Show that the gcd is really a divisor (for the proof, you need an appropriate lemma): *}
streckem
parents:
diff changeset
    47
streckem
parents:
diff changeset
    48
lemma gcd_divides: "(a,b,g) \<in> gcd \<Longrightarrow> g dvd a \<and> g dvd b"
streckem
parents:
diff changeset
    49
(*<*) oops (*>*)
streckem
parents:
diff changeset
    50
streckem
parents:
diff changeset
    51
text {* Show that the gcd is the greatest common divisor: *}
streckem
parents:
diff changeset
    52
streckem
parents:
diff changeset
    53
lemma gcd_greatest [rule_format]: "(a,b,g) \<in> gcd \<Longrightarrow>
streckem
parents:
diff changeset
    54
  0 < a \<or> 0 < b \<longrightarrow> (\<forall> d. d dvd a \<longrightarrow> d dvd b \<longrightarrow> d \<le> g)"
streckem
parents:
diff changeset
    55
(*<*) oops (*>*)
streckem
parents:
diff changeset
    56
streckem
parents:
diff changeset
    57
text {* Here as well, you will have to prove a suitable lemma. What is
streckem
parents:
diff changeset
    58
the precondition @{text "0 < a \<or> 0 < b"} good for?
streckem
parents:
diff changeset
    59
streckem
parents:
diff changeset
    60
So far, we have only shown that @{text gcd} is correct, but your
streckem
parents:
diff changeset
    61
algorithm might not compute a result for all values @{text
streckem
parents:
diff changeset
    62
"a,b"}. Thus, show completeness of the algorithm: *}
streckem
parents:
diff changeset
    63
streckem
parents:
diff changeset
    64
lemma gcd_defined: "\<forall> a b. \<exists> g. (a, b, g) \<in> gcd"
streckem
parents:
diff changeset
    65
(*<*) oops (*>*)
streckem
parents:
diff changeset
    66
streckem
parents:
diff changeset
    67
text {* The following lemma, proved by course-of-value recursion over
streckem
parents:
diff changeset
    68
@{text n}, may be useful. Why does standard induction over natural
streckem
parents:
diff changeset
    69
numbers not work here?  *}
streckem
parents:
diff changeset
    70
streckem
parents:
diff changeset
    71
lemma gcd_defined_aux [rule_format]: 
streckem
parents:
diff changeset
    72
  "\<forall> a b. (a + b) \<le> n \<longrightarrow> (\<exists> g. (a, b, g) \<in> gcd)"
streckem
parents:
diff changeset
    73
apply (induct rule: nat_less_induct)
streckem
parents:
diff changeset
    74
apply clarify
streckem
parents:
diff changeset
    75
streckem
parents:
diff changeset
    76
(*<*) oops (*>*)
streckem
parents:
diff changeset
    77
streckem
parents:
diff changeset
    78
text {* The idea is to show that @{text gcd} yields a result for all
streckem
parents:
diff changeset
    79
@{text "a, b"} whenever it is known that @{text gcd} yields a result
streckem
parents:
diff changeset
    80
for all @{text "a', b'"} whose sum is smaller than @{text "a + b"}.
streckem
parents:
diff changeset
    81
streckem
parents:
diff changeset
    82
In order to prove this lemma, make case distinctions corresponding to
streckem
parents:
diff changeset
    83
the different clauses of the algorithm, and show how to reduce
streckem
parents:
diff changeset
    84
computation of @{text gcd} for @{text "a, b"} to computation of @{text
streckem
parents:
diff changeset
    85
gcd} for suitable smaller @{text "a', b'"}.
streckem
parents:
diff changeset
    86
streckem
parents:
diff changeset
    87
*}
streckem
parents:
diff changeset
    88
streckem
parents:
diff changeset
    89
streckem
parents:
diff changeset
    90
(*<*) end (*>*)
streckem
parents:
diff changeset
    91