doc-src/IsarAdvanced/Functions/Thy/document/Functions.tex
author haftmann
Mon, 13 Nov 2006 15:42:59 +0100
changeset 21324 a5089fc012b5
parent 21212 547224bf9348
child 21346 c8aa120fa05d
permissions -rw-r--r--
adjusted
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
     1
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
     2
\begin{isabellebody}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
     3
\def\isabellecontext{Functions}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
     4
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
     5
\isadelimtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
     6
\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
     7
\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
     8
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
     9
\endisadelimtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    10
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    11
\isatagtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    12
\isacommand{theory}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    13
\ Functions\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    14
\isakeyword{imports}\ Main\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    15
\isakeyword{begin}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    16
\endisatagtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    17
{\isafoldtheory}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    18
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    19
\isadelimtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    20
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    21
\endisadelimtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    22
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    23
\isamarkupchapter{Defining Recursive Functions in Isabelle/HOL%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    24
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    25
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    26
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    27
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    28
\cite{isa-tutorial}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    29
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    30
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    31
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    32
\isamarkupsection{Function Definition for Dummies%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    33
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    34
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    35
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    36
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    37
In most cases, defining a recursive function is just as simple as other definitions:%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    38
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    39
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    40
\isacommand{fun}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    41
\ fib\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    42
\isakeyword{where}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    43
\ \ {\isachardoublequoteopen}fib\ {\isadigit{0}}\ {\isacharequal}\ {\isadigit{1}}{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    44
{\isacharbar}\ {\isachardoublequoteopen}fib\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}\ {\isacharequal}\ {\isadigit{1}}{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    45
{\isacharbar}\ {\isachardoublequoteopen}fib\ {\isacharparenleft}Suc\ {\isacharparenleft}Suc\ n{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ fib\ n\ {\isacharplus}\ fib\ {\isacharparenleft}Suc\ n{\isacharparenright}{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    46
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    47
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    48
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    49
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    50
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    51
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    52
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    53
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    54
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    55
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    56
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    57
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    58
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    59
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    60
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    61
The function always terminates, since the argument of gets smaller in every
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    62
  recursive call. Termination is an
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    63
  important requirement, since it prevents inconsistencies: From
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    64
  the "definition" \isa{f{\isacharparenleft}n{\isacharparenright}\ {\isacharequal}\ f{\isacharparenleft}n{\isacharparenright}\ {\isacharplus}\ {\isadigit{1}}} we could prove 
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    65
  \isa{{\isadigit{0}}\ \ {\isacharequal}\ {\isadigit{1}}} by subtracting \isa{f{\isacharparenleft}n{\isacharparenright}} on both sides.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    66
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    67
  Isabelle tries to prove termination automatically when a function is
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    68
  defined. We will later look at cases where this fails and see what to
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    69
  do then.%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    70
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    71
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    72
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    73
\isamarkupsubsection{Pattern matching%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    74
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    75
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    76
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    77
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    78
Like in functional programming, functions can be defined by pattern
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    79
  matching. At the moment we will only consider \emph{datatype
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    80
  patterns}, which only consist of datatype constructors and
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    81
  variables.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    82
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    83
  If patterns overlap, the order of the equations is taken into
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    84
  account. The following function inserts a fixed element between any
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    85
  two elements of a list:%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    86
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    87
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    88
\isacommand{fun}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    89
\ sep\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    90
\isakeyword{where}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    91
\ \ {\isachardoublequoteopen}sep\ a\ {\isacharparenleft}x{\isacharhash}y{\isacharhash}xs{\isacharparenright}\ {\isacharequal}\ x\ {\isacharhash}\ a\ {\isacharhash}\ sep\ a\ {\isacharparenleft}y\ {\isacharhash}\ xs{\isacharparenright}{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    92
{\isacharbar}\ {\isachardoublequoteopen}sep\ a\ xs\ \ \ \ \ \ \ {\isacharequal}\ xs{\isachardoublequoteclose}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    93
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    94
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    95
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    96
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    97
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    98
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    99
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   100
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   101
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   102
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   103
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   104
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   105
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   106
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   107
Overlapping patterns are interpreted as "increments" to what is
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   108
  already there: The second equation is only meant for the cases where
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   109
  the first one does not match. Consequently, Isabelle replaces it
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   110
  internally by the remaining cases, making the patterns disjoint.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   111
  This results in the equations \begin{isabelle}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   112
sep\ a\ {\isacharparenleft}x\ {\isacharhash}\ y\ {\isacharhash}\ xs{\isacharparenright}\ {\isacharequal}\ x\ {\isacharhash}\ a\ {\isacharhash}\ sep\ a\ {\isacharparenleft}y\ {\isacharhash}\ xs{\isacharparenright}\isasep\isanewline%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   113
sep\ a\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\isasep\isanewline%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   114
sep\ a\ {\isacharbrackleft}v{\isacharbrackright}\ {\isacharequal}\ {\isacharbrackleft}v{\isacharbrackright}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   115
\end{isabelle}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   116
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   117
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   118
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   119
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   120
The equations from function definitions are automatically used in
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   121
  simplification:%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   122
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   123
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   124
\isacommand{lemma}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   125
\ {\isachardoublequoteopen}fib\ {\isacharparenleft}Suc\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}Suc\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   126
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   127
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   128
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   129
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   130
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   131
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   132
\isacommand{by}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   133
\ simp%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   134
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   135
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   136
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   137
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   138
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   139
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   140
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   141
\isamarkupsubsection{Induction%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   142
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   143
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   144
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   145
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   146
FIXME%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   147
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   148
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   149
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   150
\isamarkupsection{If it does not work%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   151
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   152
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   153
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   154
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   155
Up to now, we were using the \cmd{fun} command, which provides a
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   156
  convenient shorthand notation for simple function definitions. In
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   157
  this mode, Isabelle tries to solve all the necessary proof obligations
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   158
  automatically. If a proof does not go through, the definition is
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   159
  rejected. This can mean that the definition is indeed faulty, like,
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   160
  or that the default proof procedures are not smart enough (or
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   161
  rather: not designed) to handle the specific definition.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   162
.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   163
  By expanding the abbreviation to the full \cmd{function} command, the
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   164
  proof obligations become visible and can be analyzed and solved manually.%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   165
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   166
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   167
\isacommand{fun}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   168
\ f\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isasymtau}{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   169
\isakeyword{where}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   170
\ \ %
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   171
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   172
\vspace{-0.8cm}\emph{equations}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   173
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   174
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   175
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   176
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   177
\noindent abbreviates%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   178
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   179
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   180
\isacommand{function}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   181
\ {\isacharparenleft}\isakeyword{sequential}{\isacharparenright}\ fo\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isasymtau}{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   182
\isakeyword{where}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   183
\ \ %
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   184
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   185
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   186
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   187
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   188
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   189
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   190
\begin{isamarkuptxt}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   191
\vspace{-0.8cm}\emph{equations}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   192
\end{isamarkuptxt}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   193
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   194
\isacommand{by}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   195
\ pat{\isacharunderscore}completeness\ auto%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   196
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   197
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   198
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   199
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   200
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   201
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   202
\ \isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   203
\isacommand{termination}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   204
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   205
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   206
\ %
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   207
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   208
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   209
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   210
\isacommand{by}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   211
\ lexicographic{\isacharunderscore}order%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   212
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   213
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   214
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   215
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   216
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   217
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   218
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   219
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   220
Some declarations and proofs have now become explicit:
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   221
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   222
  \begin{enumerate}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   223
  \item The "sequential" option enables the preprocessing of
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   224
  pattern overlaps we already saw. Without this option, the equations
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   225
  must already be disjoint and complete. The automatic completion only
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   226
  works with datatype patterns.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   227
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   228
  \item A function definition now produces a proof obligation which
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   229
  expresses completeness and compatibility of patterns (We talk about
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   230
  this later). The combination of the methods {\tt pat\_completeness} and
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   231
  {\tt auto} is used to solve this proof obligation.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   232
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   233
  \item A termination proof follows the definition, started by the
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   234
  \cmd{termination} command. The {\tt lexicographic\_order} method can prove termination of a
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   235
  certain class of functions by searching for a suitable lexicographic combination of size
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   236
  measures.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   237
  \end{enumerate}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   238
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   239
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   240
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   241
\isamarkupsection{Proving termination%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   242
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   243
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   244
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   245
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   246
Consider the following function, which sums up natural numbers up to
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   247
  \isa{N}, using a counter \isa{i}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   248
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   249
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   250
\isacommand{function}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   251
\ sum\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   252
\isakeyword{where}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   253
\ \ {\isachardoublequoteopen}sum\ i\ N\ {\isacharequal}\ {\isacharparenleft}if\ i\ {\isachargreater}\ N\ then\ {\isadigit{0}}\ else\ i\ {\isacharplus}\ sum\ {\isacharparenleft}Suc\ i{\isacharparenright}\ N{\isacharparenright}{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   254
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   255
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   256
\ \ %
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   257
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   258
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   259
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   260
\isacommand{by}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   261
\ pat{\isacharunderscore}completeness\ auto%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   262
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   263
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   264
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   265
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   266
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   267
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   268
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   269
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   270
The {\tt lexicographic\_order} method fails on this example, because none of the
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   271
  arguments decreases in the recursive call.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   272
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   273
  A more general method for termination proofs is to supply a wellfounded
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   274
  relation on the argument type, and to show that the argument
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   275
  decreases in every recursive call. 
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   276
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   277
  The termination argument for \isa{sum} is based on the fact that
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   278
  the \emph{difference} between \isa{i} and \isa{N} gets
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   279
  smaller in every step, and that the recursion stops when \isa{i}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   280
  is greater then \isa{n}. Phrased differently, the expression 
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   281
  \isa{N\ {\isacharplus}\ {\isadigit{1}}\ {\isacharminus}\ i} decreases in every recursive call.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   282
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   283
  We can use this expression as a measure function to construct a
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   284
  wellfounded relation, which is a proof of termination:%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   285
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   286
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   287
\isacommand{termination}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   288
\ \isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   289
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   290
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   291
\ \ %
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   292
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   293
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   294
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   295
\isacommand{by}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   296
\ {\isacharparenleft}auto{\isacharunderscore}term\ {\isachardoublequoteopen}measure\ {\isacharparenleft}{\isasymlambda}{\isacharparenleft}i{\isacharcomma}N{\isacharparenright}{\isachardot}\ N\ {\isacharplus}\ {\isadigit{1}}\ {\isacharminus}\ i{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   297
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   298
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   299
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   300
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   301
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   302
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   303
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   304
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   305
Note that the two (curried) function arguments appear as a pair in
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   306
  the measure function. The \cmd{function} command packs together curried
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   307
  arguments into a tuple to simplify its internal operation. Hence,
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   308
  measure functions and termination relations always work on the
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   309
  tupled type.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   310
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   311
  Let us complicate the function a little, by adding some more recursive calls:%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   312
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   313
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   314
\isacommand{function}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   315
\ foo\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   316
\isakeyword{where}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   317
\ \ {\isachardoublequoteopen}foo\ i\ N\ {\isacharequal}\ {\isacharparenleft}if\ i\ {\isachargreater}\ N\ \isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   318
\ \ \ \ \ \ \ \ \ \ \ \ \ \ then\ {\isacharparenleft}if\ N\ {\isacharequal}\ {\isadigit{0}}\ then\ {\isadigit{0}}\ else\ foo\ {\isadigit{0}}\ {\isacharparenleft}N\ {\isacharminus}\ {\isadigit{1}}{\isacharparenright}{\isacharparenright}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   319
\ \ \ \ \ \ \ \ \ \ \ \ \ \ else\ i\ {\isacharplus}\ foo\ {\isacharparenleft}Suc\ i{\isacharparenright}\ N{\isacharparenright}{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   320
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   321
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   322
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   323
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   324
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   325
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   326
\isacommand{by}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   327
\ pat{\isacharunderscore}completeness\ auto%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   328
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   329
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   330
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   331
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   332
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   333
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   334
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   335
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   336
When \isa{i} has reached \isa{N}, it starts at zero again
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   337
  and \isa{N} is decremented.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   338
  This corresponds to a nested
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   339
  loop where one index counts up and the other down. Termination can
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   340
  be proved using a lexicographic combination of two measures, namely
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   341
  the value of \isa{N} and the above difference. The \isa{measures}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   342
  combinator generalizes \isa{measure} by taking a list of measure functions.%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   343
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   344
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   345
\isacommand{termination}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   346
\ \isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   347
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   348
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   349
\ \ %
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   350
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   351
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   352
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   353
\isacommand{by}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   354
\ {\isacharparenleft}auto{\isacharunderscore}term\ {\isachardoublequoteopen}measures\ {\isacharbrackleft}{\isasymlambda}{\isacharparenleft}i{\isacharcomma}\ N{\isacharparenright}{\isachardot}\ N{\isacharcomma}\ {\isasymlambda}{\isacharparenleft}i{\isacharcomma}N{\isacharparenright}{\isachardot}\ N\ {\isacharplus}\ {\isadigit{1}}\ {\isacharminus}\ i{\isacharbrackright}{\isachardoublequoteclose}{\isacharparenright}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   355
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   356
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   357
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   358
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   359
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   360
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   361
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   362
\isamarkupsection{Mutual Recursion%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   363
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   364
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   365
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   366
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   367
If two or more functions call one another mutually, they have to be defined
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   368
  in one step. The simplest example are probably \isa{even} and \isa{odd}:%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   369
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   370
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   371
\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   372
\isacommand{function}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   373
\ even\ odd\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ bool{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   374
\isakeyword{where}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   375
\ \ {\isachardoublequoteopen}even\ {\isadigit{0}}\ {\isacharequal}\ True{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   376
{\isacharbar}\ {\isachardoublequoteopen}odd\ {\isadigit{0}}\ {\isacharequal}\ False{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   377
{\isacharbar}\ {\isachardoublequoteopen}even\ {\isacharparenleft}Suc\ n{\isacharparenright}\ {\isacharequal}\ odd\ n{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   378
{\isacharbar}\ {\isachardoublequoteopen}odd\ {\isacharparenleft}Suc\ n{\isacharparenright}\ {\isacharequal}\ even\ n{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   379
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   380
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   381
\ \ %
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   382
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   383
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   384
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   385
\isacommand{by}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   386
\ pat{\isacharunderscore}completeness\ auto%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   387
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   388
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   389
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   390
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   391
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   392
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   393
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   394
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   395
To solve the problem of mutual dependencies, Isabelle internally
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   396
  creates a single function operating on the sum
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   397
  type. Then the original functions are defined as
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   398
  projections. Consequently, termination has to be proved
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   399
  simultaneously for both functions, by specifying a measure on the
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   400
  sum type:%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   401
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   402
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   403
\isacommand{termination}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   404
\ \isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   405
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   406
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   407
\ \ %
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   408
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   409
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   410
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   411
\isacommand{by}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   412
\ {\isacharparenleft}auto{\isacharunderscore}term\ {\isachardoublequoteopen}measure\ {\isacharparenleft}sum{\isacharunderscore}case\ {\isacharparenleft}{\isacharpercent}n{\isachardot}\ n{\isacharparenright}\ {\isacharparenleft}{\isacharpercent}n{\isachardot}\ n{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   413
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   414
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   415
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   416
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   417
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   418
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   419
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   420
\isamarkupsection{Nested recursion%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   421
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   422
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   423
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   424
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   425
FIXME%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   426
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   427
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   428
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   429
\isamarkupsection{More general patterns%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   430
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   431
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   432
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   433
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   434
FIXME%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   435
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   436
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   437
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   438
\isadelimtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   439
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   440
\endisadelimtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   441
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   442
\isatagtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   443
\isacommand{end}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   444
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   445
\endisatagtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   446
{\isafoldtheory}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   447
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   448
\isadelimtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   449
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   450
\endisadelimtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   451
\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   452
\end{isabellebody}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   453
%%% Local Variables:
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   454
%%% mode: latex
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   455
%%% TeX-master: "root"
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   456
%%% End: