doc-src/TutorialI/Recdef/termination.thy
author nipkow
Fri, 15 Sep 2000 19:59:05 +0200
changeset 9992 4281ccea43f0
parent 9933 9feb1e0c4cb3
child 10171 59d6633835fa
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     1
(*<*)
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
     2
theory termination = examples:
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     3
(*>*)
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     4
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     5
text{*
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     6
When a function is defined via \isacommand{recdef}, Isabelle tries to prove
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     7
its termination with the help of the user-supplied measure.  All of the above
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     8
examples are simple enough that Isabelle can prove automatically that the
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8745
diff changeset
     9
measure of the argument goes down in each recursive call. As a result,
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    10
$f$@{text".simps"} will contain the defining equations (or variants derived
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    11
from them) as theorems. For example, look (via \isacommand{thm}) at
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    12
@{thm[source]sep.simps} and @{thm[source]sep1.simps} to see that they define
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    13
the same function. What is more, those equations are automatically declared as
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    14
simplification rules.
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    15
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    16
In general, Isabelle may not be able to prove all termination condition
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    17
(there is one for each recursive call) automatically. For example,
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    18
termination of the following artificial function
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    19
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    20
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    21
consts f :: "nat\<times>nat \<Rightarrow> nat";
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    22
recdef f "measure(\<lambda>(x,y). x-y)"
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    23
  "f(x,y) = (if x \<le> y then x else f(x,y+1))";
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    24
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    25
text{*\noindent
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    26
is not proved automatically (although maybe it should be). Isabelle prints a
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    27
kind of error message showing you what it was unable to prove. You will then
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    28
have to prove it as a separate lemma before you attempt the definition
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    29
of your function once more. In our case the required lemma is the obvious one:
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    30
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    31
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    32
lemma termi_lem: "\<not> x \<le> y \<Longrightarrow> x - Suc y < x - y";
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    33
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    34
txt{*\noindent
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    35
It was not proved automatically because of the special nature of @{text"-"}
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    36
on @{typ"nat"}. This requires more arithmetic than is tried by default:
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    37
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    38
9458
c613cd06d5cf apply. -> by
nipkow
parents: 8771
diff changeset
    39
by(arith);
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    40
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    41
text{*\noindent
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8745
diff changeset
    42
Because \isacommand{recdef}'s termination prover involves simplification,
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    43
we include with our second attempt the hint to use @{thm[source]termi_lem} as
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    44
a simplification rule:
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    45
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    46
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    47
consts g :: "nat\<times>nat \<Rightarrow> nat";
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    48
recdef g "measure(\<lambda>(x,y). x-y)"
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    49
  "g(x,y) = (if x \<le> y then x else g(x,y+1))"
9992
4281ccea43f0 *** empty log message ***
nipkow
parents: 9933
diff changeset
    50
(hints recdef_simp: termi_lem)
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    51
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    52
text{*\noindent
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    53
This time everything works fine. Now @{thm[source]g.simps} contains precisely
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    54
the stated recursion equation for @{term"g"} and they are simplification
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    55
rules. Thus we can automatically prove
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    56
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    57
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    58
theorem "g(1,0) = g(1,1)";
9458
c613cd06d5cf apply. -> by
nipkow
parents: 8771
diff changeset
    59
by(simp);
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    60
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    61
text{*\noindent
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    62
More exciting theorems require induction, which is discussed below.
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    63
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    64
If the termination proof requires a new lemma that is of general use, you can
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    65
turn it permanently into a simplification rule, in which case the above
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    66
\isacommand{hint} is not necessary. But our @{thm[source]termi_lem} is not
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    67
sufficiently general to warrant this distinction.
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    68
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    69
The attentive reader may wonder why we chose to call our function @{term"g"}
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    70
rather than @{term"f"} the second time around. The reason is that, despite
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    71
the failed termination proof, the definition of @{term"f"} did not
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    72
fail, and thus we could not define it a second time. However, all theorems
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    73
about @{term"f"}, for example @{thm[source]f.simps}, carry as a precondition
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    74
the unproved termination condition. Moreover, the theorems
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    75
@{thm[source]f.simps} are not simplification rules. However, this mechanism
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    76
allows a delayed proof of termination: instead of proving
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    77
@{thm[source]termi_lem} up front, we could prove 
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    78
it later on and then use it to remove the preconditions from the theorems
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    79
about @{term"f"}. In most cases this is more cumbersome than proving things
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    80
up front.
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    81
%FIXME, with one exception: nested recursion.
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    82
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    83
Although all the above examples employ measure functions, \isacommand{recdef}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    84
allows arbitrary wellfounded relations. For example, termination of
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    85
Ackermann's function requires the lexicographic product @{text"<*lex*>"}:
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    86
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    87
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    88
consts ack :: "nat\<times>nat \<Rightarrow> nat";
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9458
diff changeset
    89
recdef ack "measure(\<lambda>m. m) <*lex*> measure(\<lambda>n. n)"
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    90
  "ack(0,n)         = Suc n"
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    91
  "ack(Suc m,0)     = ack(m, 1)"
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    92
  "ack(Suc m,Suc n) = ack(m,ack(Suc m,n))";
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    93
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    94
text{*\noindent
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    95
For details see the manual~\cite{isabelle-HOL} and the examples in the
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    96
library.
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    97
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    98
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    99
(*<*)
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   100
end
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   101
(*>*)