doc-src/IsarAdvanced/Functions/Thy/document/Functions.tex
author urbanc
Fri, 17 Nov 2006 17:32:30 +0100
changeset 21405 26b51f724fe6
parent 21346 c8aa120fa05d
child 22065 cdd077905eee
permissions -rw-r--r--
added an intro lemma for freshness of products; set up the simplifier so that it can deal with the compact and long notation for freshness constraints (FIXME: it should also be able to deal with the special case of freshness of atoms)
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
21346
c8aa120fa05d updated
krauss
parents: 21212
diff changeset
    45
{\isacharbar}\ {\isachardoublequoteopen}fib\ {\isacharparenleft}Suc\ {\isacharparenleft}Suc\ n{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ fib\ n\ {\isacharplus}\ fib\ {\isacharparenleft}Suc\ n{\isacharparenright}{\isachardoublequoteclose}%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    46
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    47
The function always terminates, since the argument of gets smaller in every
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    48
  recursive call. Termination is an
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    49
  important requirement, since it prevents inconsistencies: From
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    50
  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
    51
  \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
    52
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    53
  Isabelle tries to prove termination automatically when a function is
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    54
  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
    55
  do then.%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    56
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    57
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    58
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    59
\isamarkupsubsection{Pattern matching%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    60
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    61
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    62
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    63
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    64
Like in functional programming, functions can be defined by pattern
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    65
  matching. At the moment we will only consider \emph{datatype
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    66
  patterns}, which only consist of datatype constructors and
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    67
  variables.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    68
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    69
  If patterns overlap, the order of the equations is taken into
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    70
  account. The following function inserts a fixed element between any
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    71
  two elements of a list:%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    72
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    73
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    74
\isacommand{fun}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    75
\ 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
    76
\isakeyword{where}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    77
\ \ {\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
    78
{\isacharbar}\ {\isachardoublequoteopen}sep\ a\ xs\ \ \ \ \ \ \ {\isacharequal}\ xs{\isachardoublequoteclose}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    79
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    80
Overlapping patterns are interpreted as "increments" to what is
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    81
  already there: The second equation is only meant for the cases where
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    82
  the first one does not match. Consequently, Isabelle replaces it
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    83
  internally by the remaining cases, making the patterns disjoint.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    84
  This results in the equations \begin{isabelle}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    85
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
    86
sep\ a\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\isasep\isanewline%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    87
sep\ a\ {\isacharbrackleft}v{\isacharbrackright}\ {\isacharequal}\ {\isacharbrackleft}v{\isacharbrackright}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    88
\end{isabelle}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    89
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    90
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    91
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    92
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    93
The equations from function definitions are automatically used in
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    94
  simplification:%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    95
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    96
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    97
\isacommand{lemma}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    98
\ {\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
    99
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   100
\isadelimproof
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
\endisadelimproof
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
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   105
\isacommand{by}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   106
\ simp%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   107
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   108
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   109
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   110
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   111
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   112
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   113
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   114
\isamarkupsubsection{Induction%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   115
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   116
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   117
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   118
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   119
FIXME%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   120
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   121
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   122
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   123
\isamarkupsection{If it does not work%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   124
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   125
\isamarkuptrue%
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
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   128
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
   129
  convenient shorthand notation for simple function definitions. In
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   130
  this mode, Isabelle tries to solve all the necessary proof obligations
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   131
  automatically. If a proof does not go through, the definition is
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   132
  rejected. This can mean that the definition is indeed faulty, like,
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   133
  or that the default proof procedures are not smart enough (or
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   134
  rather: not designed) to handle the specific definition.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   135
.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   136
  By expanding the abbreviation to the full \cmd{function} command, the
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   137
  proof obligations become visible and can be analyzed and solved manually.%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   138
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   139
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   140
\isacommand{fun}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   141
\ f\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isasymtau}{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   142
\isakeyword{where}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   143
\ \ %
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   144
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   145
\vspace{-0.8cm}\emph{equations}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   146
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   147
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   148
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   149
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   150
\noindent abbreviates%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   151
\end{isamarkuptext}%
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
\isacommand{function}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   154
\ {\isacharparenleft}\isakeyword{sequential}{\isacharparenright}\ fo\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isasymtau}{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   155
\isakeyword{where}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   156
\ \ %
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   157
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   158
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   159
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   160
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   161
\isatagproof
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
\begin{isamarkuptxt}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   164
\vspace{-0.8cm}\emph{equations}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   165
\end{isamarkuptxt}%
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{by}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   168
\ pat{\isacharunderscore}completeness\ auto%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   169
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   170
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   171
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   172
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   173
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   174
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   175
\ \isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   176
\isacommand{termination}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   177
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   178
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   179
\ %
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   180
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   181
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   182
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   183
\isacommand{by}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   184
\ lexicographic{\isacharunderscore}order%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   185
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   186
{\isafoldproof}%
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
\isadelimproof
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
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   191
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   192
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   193
Some declarations and proofs have now become explicit:
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   194
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   195
  \begin{enumerate}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   196
  \item The "sequential" option enables the preprocessing of
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   197
  pattern overlaps we already saw. Without this option, the equations
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   198
  must already be disjoint and complete. The automatic completion only
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   199
  works with datatype patterns.
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
  \item A function definition now produces a proof obligation which
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   202
  expresses completeness and compatibility of patterns (We talk about
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   203
  this later). The combination of the methods {\tt pat\_completeness} and
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   204
  {\tt auto} is used to solve this proof obligation.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   205
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   206
  \item A termination proof follows the definition, started by the
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   207
  \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
   208
  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
   209
  measures.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   210
  \end{enumerate}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   211
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   212
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   213
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   214
\isamarkupsection{Proving termination%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   215
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   216
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   217
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   218
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   219
Consider the following function, which sums up natural numbers up to
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   220
  \isa{N}, using a counter \isa{i}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   221
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   222
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   223
\isacommand{function}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   224
\ sum\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   225
\isakeyword{where}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   226
\ \ {\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
   227
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   228
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   229
\ \ %
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   230
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   231
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   232
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   233
\isacommand{by}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   234
\ pat{\isacharunderscore}completeness\ auto%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   235
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   236
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   237
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   238
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   239
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   240
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   241
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   242
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   243
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
   244
  arguments decreases in the recursive call.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   245
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   246
  A more general method for termination proofs is to supply a wellfounded
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   247
  relation on the argument type, and to show that the argument
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   248
  decreases in every recursive call. 
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   249
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   250
  The termination argument for \isa{sum} is based on the fact that
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   251
  the \emph{difference} between \isa{i} and \isa{N} gets
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   252
  smaller in every step, and that the recursion stops when \isa{i}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   253
  is greater then \isa{n}. Phrased differently, the expression 
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   254
  \isa{N\ {\isacharplus}\ {\isadigit{1}}\ {\isacharminus}\ i} decreases in every recursive call.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   255
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   256
  We can use this expression as a measure function to construct a
21346
c8aa120fa05d updated
krauss
parents: 21212
diff changeset
   257
  wellfounded relation, which can prove termination.%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   258
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   259
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   260
\isacommand{termination}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   261
\ \isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   262
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   263
\isadelimproof
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
\endisadelimproof
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
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   268
\isacommand{by}\isamarkupfalse%
21346
c8aa120fa05d updated
krauss
parents: 21212
diff changeset
   269
\ {\isacharparenleft}relation\ {\isachardoublequoteopen}measure\ {\isacharparenleft}{\isasymlambda}{\isacharparenleft}i{\isacharcomma}N{\isacharparenright}{\isachardot}\ N\ {\isacharplus}\ {\isadigit{1}}\ {\isacharminus}\ i{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}\ auto%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   270
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   271
{\isafoldproof}%
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
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   274
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   275
\endisadelimproof
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
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   278
Note that the two (curried) function arguments appear as a pair in
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   279
  the measure function. The \cmd{function} command packs together curried
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   280
  arguments into a tuple to simplify its internal operation. Hence,
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   281
  measure functions and termination relations always work on the
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   282
  tupled type.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   283
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   284
  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
   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{function}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   288
\ foo\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   289
\isakeyword{where}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   290
\ \ {\isachardoublequoteopen}foo\ i\ N\ {\isacharequal}\ {\isacharparenleft}if\ i\ {\isachargreater}\ N\ \isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   291
\ \ \ \ \ \ \ \ \ \ \ \ \ \ 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
   292
\ \ \ \ \ \ \ \ \ \ \ \ \ \ else\ i\ {\isacharplus}\ foo\ {\isacharparenleft}Suc\ i{\isacharparenright}\ N{\isacharparenright}{\isachardoublequoteclose}\isanewline
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
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   295
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   296
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   297
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   298
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   299
\isacommand{by}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   300
\ pat{\isacharunderscore}completeness\ auto%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   301
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   302
{\isafoldproof}%
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
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   305
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   306
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   307
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   308
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   309
When \isa{i} has reached \isa{N}, it starts at zero again
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   310
  and \isa{N} is decremented.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   311
  This corresponds to a nested
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   312
  loop where one index counts up and the other down. Termination can
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   313
  be proved using a lexicographic combination of two measures, namely
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   314
  the value of \isa{N} and the above difference. The \isa{measures}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   315
  combinator generalizes \isa{measure} by taking a list of measure functions.%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   316
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   317
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   318
\isacommand{termination}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   319
\ \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%
21346
c8aa120fa05d updated
krauss
parents: 21212
diff changeset
   327
\ {\isacharparenleft}relation\ {\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}\ auto%
21212
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
\isamarkupsection{Mutual Recursion%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   336
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   337
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   338
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   339
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   340
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
   341
  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
   342
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   343
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   344
\isacommand{function}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   345
\ even\ odd\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ bool{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   346
\isakeyword{where}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   347
\ \ {\isachardoublequoteopen}even\ {\isadigit{0}}\ {\isacharequal}\ True{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   348
{\isacharbar}\ {\isachardoublequoteopen}odd\ {\isadigit{0}}\ {\isacharequal}\ False{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   349
{\isacharbar}\ {\isachardoublequoteopen}even\ {\isacharparenleft}Suc\ n{\isacharparenright}\ {\isacharequal}\ odd\ n{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   350
{\isacharbar}\ {\isachardoublequoteopen}odd\ {\isacharparenleft}Suc\ n{\isacharparenright}\ {\isacharequal}\ even\ n{\isachardoublequoteclose}\isanewline
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
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   353
\ \ %
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   354
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   355
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   356
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   357
\isacommand{by}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   358
\ pat{\isacharunderscore}completeness\ auto%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   359
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   360
{\isafoldproof}%
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
\isadelimproof
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
\endisadelimproof
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
To solve the problem of mutual dependencies, Isabelle internally
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   368
  creates a single function operating on the sum
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   369
  type. Then the original functions are defined as
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   370
  projections. Consequently, termination has to be proved
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   371
  simultaneously for both functions, by specifying a measure on the
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   372
  sum type:%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   373
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   374
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   375
\isacommand{termination}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   376
\ \isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   377
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   378
\isadelimproof
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
\endisadelimproof
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
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   383
\isacommand{by}\isamarkupfalse%
21346
c8aa120fa05d updated
krauss
parents: 21212
diff changeset
   384
\ {\isacharparenleft}relation\ {\isachardoublequoteopen}measure\ {\isacharparenleft}sum{\isacharunderscore}case\ {\isacharparenleft}{\isacharpercent}n{\isachardot}\ n{\isacharparenright}\ {\isacharparenleft}{\isacharpercent}n{\isachardot}\ n{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}\ auto%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   385
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   386
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   387
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   388
\isadelimproof
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
\endisadelimproof
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
\isamarkupsection{Nested recursion%
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
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   395
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   396
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   397
FIXME%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   398
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   399
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   400
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   401
\isamarkupsection{More general patterns%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   402
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   403
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   404
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   405
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   406
FIXME%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   407
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   408
\isamarkuptrue%
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
\isadelimtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   411
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   412
\endisadelimtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   413
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   414
\isatagtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   415
\isacommand{end}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   416
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   417
\endisatagtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   418
{\isafoldtheory}%
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
\isadelimtheory
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
\endisadelimtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   423
\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   424
\end{isabellebody}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   425
%%% Local Variables:
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   426
%%% mode: latex
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   427
%%% TeX-master: "root"
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   428
%%% End: