doc-src/IsarAdvanced/Functions/Thy/document/Functions.tex
author krauss
Thu, 17 May 2007 23:03:47 +0200
changeset 23003 4b0bf04a4d68
parent 22065 cdd077905eee
child 23188 595a0e24bd8e
permissions -rw-r--r--
updated
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
\isamarkupsection{Function Definition for Dummies%
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}%
23003
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
    28
In most cases, defining a recursive function is just as simple as other definitions:
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
    29
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
    30
  Like in functional programming, a function definition consists of a%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    31
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    32
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    33
\isacommand{fun}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    34
\ fib\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    35
\isakeyword{where}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    36
\ \ {\isachardoublequoteopen}fib\ {\isadigit{0}}\ {\isacharequal}\ {\isadigit{1}}{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    37
{\isacharbar}\ {\isachardoublequoteopen}fib\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}\ {\isacharequal}\ {\isadigit{1}}{\isachardoublequoteclose}\isanewline
21346
c8aa120fa05d updated
krauss
parents: 21212
diff changeset
    38
{\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
    39
\begin{isamarkuptext}%
23003
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
    40
The syntax is rather self-explanatory: We introduce a function by
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
    41
  giving its name, its type and a set of defining recursive
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
    42
  equations.%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
    43
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
    44
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
    45
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
    46
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
    47
The function always terminates, since its argument gets smaller in
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
    48
  every recursive call. Termination is an important requirement, since
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
    49
  it prevents inconsistencies: From the "definition" \isa{f{\isacharparenleft}n{\isacharparenright}\ {\isacharequal}\ f{\isacharparenleft}n{\isacharparenright}\ {\isacharplus}\ {\isadigit{1}}} we could prove \isa{{\isadigit{0}}\ {\isacharequal}\ {\isadigit{1}}} by subtracting \isa{f{\isacharparenleft}n{\isacharparenright}} on both sides.
21212
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
  Isabelle tries to prove termination automatically when a function is
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    52
  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
    53
  do then.%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    54
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    55
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    56
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    57
\isamarkupsubsection{Pattern matching%
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
\isamarkuptrue%
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
\begin{isamarkuptext}%
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
    62
\label{patmatch}
23003
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
    63
  Like in functional programming, we can use pattern matching to
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
    64
  define functions. At the moment we will only consider \emph{constructor
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    65
  patterns}, which only consist of datatype constructors and
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    66
  variables.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    67
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    68
  If patterns overlap, the order of the equations is taken into
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    69
  account. The following function inserts a fixed element between any
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    70
  two elements of a list:%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    71
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    72
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    73
\isacommand{fun}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    74
\ 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
    75
\isakeyword{where}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    76
\ \ {\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
    77
{\isacharbar}\ {\isachardoublequoteopen}sep\ a\ xs\ \ \ \ \ \ \ {\isacharequal}\ xs{\isachardoublequoteclose}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    78
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    79
Overlapping patterns are interpreted as "increments" to what is
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    80
  already there: The second equation is only meant for the cases where
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    81
  the first one does not match. Consequently, Isabelle replaces it
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
    82
  internally by the remaining cases, making the patterns disjoint:%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
    83
\end{isamarkuptext}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
    84
\isamarkuptrue%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
    85
\isacommand{thm}\isamarkupfalse%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
    86
\ sep{\isachardot}simps%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
    87
\begin{isamarkuptext}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
    88
\begin{isabelle}%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    89
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
    90
sep\ a\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\isasep\isanewline%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    91
sep\ a\ {\isacharbrackleft}v{\isacharbrackright}\ {\isacharequal}\ {\isacharbrackleft}v{\isacharbrackright}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    92
\end{isabelle}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    93
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    94
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    95
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    96
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    97
The equations from function definitions are automatically used in
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    98
  simplification:%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
    99
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   100
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   101
\isacommand{lemma}\isamarkupfalse%
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   102
\ {\isachardoublequoteopen}sep\ {\isacharparenleft}{\isadigit{0}}{\isacharcolon}{\isacharcolon}nat{\isacharparenright}\ {\isacharbrackleft}{\isadigit{1}}{\isacharcomma}\ {\isadigit{2}}{\isacharcomma}\ {\isadigit{3}}{\isacharbrackright}\ {\isacharequal}\ {\isacharbrackleft}{\isadigit{1}}{\isacharcomma}\ {\isadigit{0}}{\isacharcomma}\ {\isadigit{2}}{\isacharcomma}\ {\isadigit{0}}{\isacharcomma}\ {\isadigit{3}}{\isacharbrackright}{\isachardoublequoteclose}\isanewline
21212
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
\isadelimproof
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
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   107
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   108
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   109
\isacommand{by}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   110
\ simp%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   111
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   112
{\isafoldproof}%
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
\isadelimproof
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
\endisadelimproof
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
\isamarkupsubsection{Induction%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   119
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   120
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   121
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   122
\begin{isamarkuptext}%
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   123
Isabelle provides customized induction rules for recursive functions.  
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   124
  See \cite[\S3.5.4]{isa-tutorial}.%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   125
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   126
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   127
%
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   128
\isamarkupsection{Full form definitions%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   129
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   130
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   131
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   132
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   133
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
   134
  convenient shorthand notation for simple function definitions. In
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   135
  this mode, Isabelle tries to solve all the necessary proof obligations
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   136
  automatically. If a proof does not go through, the definition is
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   137
  rejected. This can either mean that the definition is indeed faulty,
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   138
  or that the default proof procedures are just not smart enough (or
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   139
  rather: not designed) to handle the definition.
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   140
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   141
  By expanding the abbreviated \cmd{fun} to the full \cmd{function}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   142
  command, the proof obligations become visible and can be analyzed or
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   143
  solved manually.
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   144
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   145
\end{isamarkuptext}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   146
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   147
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   148
\fbox{\parbox{\textwidth}{
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   149
\noindent\cmd{fun} \isa{f\ {\isacharcolon}{\isacharcolon}\ {\isasymtau}}\\%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   150
\cmd{where}\isanewline%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   151
\ \ {\it equations}\isanewline%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   152
\ \ \quad\vdots
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   153
}}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   154
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   155
\begin{isamarkuptext}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   156
\vspace*{1em}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   157
\noindent abbreviates
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   158
\end{isamarkuptext}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   159
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   160
\fbox{\parbox{\textwidth}{
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   161
\noindent\cmd{function} \isa{{\isacharparenleft}}\cmd{sequential}\isa{{\isacharparenright}\ f\ {\isacharcolon}{\isacharcolon}\ {\isasymtau}}\\%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   162
\cmd{where}\isanewline%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   163
\ \ {\it equations}\isanewline%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   164
\ \ \quad\vdots\\%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   165
\cmd{by} \isa{pat{\isacharunderscore}completeness\ auto}\\%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   166
\cmd{termination by} \isa{lexicographic{\isacharunderscore}order}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   167
}}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   168
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   169
\begin{isamarkuptext}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   170
  \vspace*{1em}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   171
  \noindent Some declarations and proofs have now become explicit:
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   172
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   173
  \begin{enumerate}
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   174
  \item The \cmd{sequential} option enables the preprocessing of
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   175
  pattern overlaps we already saw. Without this option, the equations
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   176
  must already be disjoint and complete. The automatic completion only
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   177
  works with datatype patterns.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   178
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   179
  \item A function definition now produces a proof obligation which
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   180
  expresses completeness and compatibility of patterns (We talk about
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   181
  this later). The combination of the methods \isa{pat{\isacharunderscore}completeness} and
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   182
  \isa{auto} is used to solve this proof obligation.
21212
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
  \item A termination proof follows the definition, started by the
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   185
  \cmd{termination} command, which sets up the goal. The \isa{lexicographic{\isacharunderscore}order} method can prove termination of a certain
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   186
  class of functions by searching for a suitable lexicographic
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   187
  combination of size measures.
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   188
 \end{enumerate}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   189
  Whenever a \cmd{fun} command fails, it is usually a good idea to
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   190
  expand the syntax to the more verbose \cmd{function} form, to see
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   191
  what is actually going on.%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   192
\end{isamarkuptext}%
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
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   195
\isamarkupsection{Proving termination%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   196
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   197
\isamarkuptrue%
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
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   200
Consider the following function, which sums up natural numbers up to
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   201
  \isa{N}, using a counter \isa{i}:%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   202
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   203
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   204
\isacommand{function}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   205
\ sum\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   206
\isakeyword{where}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   207
\ \ {\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
   208
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   209
\isadelimproof
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   210
%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   211
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   212
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   213
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   214
\isacommand{by}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   215
\ pat{\isacharunderscore}completeness\ auto%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   216
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   217
{\isafoldproof}%
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
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   220
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   221
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   222
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   223
\begin{isamarkuptext}%
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   224
\noindent The \isa{lexicographic{\isacharunderscore}order} method fails on this example, because none of the
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   225
  arguments decreases in the recursive call.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   226
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   227
  A more general method for termination proofs is to supply a wellfounded
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   228
  relation on the argument type, and to show that the argument
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   229
  decreases in every recursive call. 
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   230
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   231
  The termination argument for \isa{sum} is based on the fact that
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   232
  the \emph{difference} between \isa{i} and \isa{N} gets
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   233
  smaller in every step, and that the recursion stops when \isa{i}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   234
  is greater then \isa{n}. Phrased differently, the expression 
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   235
  \isa{N\ {\isacharplus}\ {\isadigit{1}}\ {\isacharminus}\ i} decreases in every recursive call.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   236
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   237
  We can use this expression as a measure function suitable to prove termination.%
21212
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
\isacommand{termination}\isamarkupfalse%
23003
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   241
\ sum\isanewline
21212
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
\isadelimproof
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   244
%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   245
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   246
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   247
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   248
\isacommand{by}\isamarkupfalse%
21346
c8aa120fa05d updated
krauss
parents: 21212
diff changeset
   249
\ {\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
   250
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   251
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   252
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   253
\isadelimproof
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
\endisadelimproof
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
\begin{isamarkuptext}%
23003
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   258
The \cmd{termination} command sets up the termination goal for the
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   259
  specified function \isa{sum}. If the function name is omitted it
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   260
  implicitly refers to the last function definition.
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   261
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   262
  The \isa{relation} method takes a relation of
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   263
  type \isa{{\isacharparenleft}{\isacharprime}a\ {\isasymtimes}\ {\isacharprime}a{\isacharparenright}\ set}, where \isa{{\isacharprime}a} is the argument type of
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   264
  the function. If the function has multiple curried arguments, then
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   265
  these are packed together into a tuple, as it happened in the above
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   266
  example.
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   267
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   268
  The predefined function \isa{measure{\isasymColon}{\isacharparenleft}{\isacharprime}a\ {\isasymRightarrow}\ nat{\isacharparenright}\ {\isasymRightarrow}\ {\isacharparenleft}{\isacharprime}a\ {\isasymtimes}\ {\isacharprime}a{\isacharparenright}\ set} is a very common way of
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   269
  specifying termination relations in terms of a mapping into the
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   270
  natural numbers.
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   271
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   272
  After the invocation of \isa{relation}, we must prove that (a)
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   273
  the relation we supplied is wellfounded, and (b) that the arguments
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   274
  of recursive calls indeed decrease with respect to the
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   275
  relation. These goals are all solved by the subsequent call to
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   276
  \isa{auto}.
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   277
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   278
  Let us complicate the function a little, by adding some more
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   279
  recursive calls:%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   280
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   281
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   282
\isacommand{function}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   283
\ foo\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   284
\isakeyword{where}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   285
\ \ {\isachardoublequoteopen}foo\ i\ N\ {\isacharequal}\ {\isacharparenleft}if\ i\ {\isachargreater}\ N\ \isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   286
\ \ \ \ \ \ \ \ \ \ \ \ \ \ 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
   287
\ \ \ \ \ \ \ \ \ \ \ \ \ \ else\ i\ {\isacharplus}\ foo\ {\isacharparenleft}Suc\ i{\isacharparenright}\ N{\isacharparenright}{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   288
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   289
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   290
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   291
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   292
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   293
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   294
\isacommand{by}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   295
\ pat{\isacharunderscore}completeness\ auto%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   296
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   297
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   298
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   299
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   300
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   301
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   302
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   303
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   304
When \isa{i} has reached \isa{N}, it starts at zero again
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   305
  and \isa{N} is decremented.
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   306
  This corresponds to a nested
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   307
  loop where one index counts up and the other down. Termination can
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   308
  be proved using a lexicographic combination of two measures, namely
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   309
  the value of \isa{N} and the above difference. The \isa{measures} combinator generalizes \isa{measure} by taking a
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   310
  list of measure functions.%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   311
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   312
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   313
\isacommand{termination}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   314
\ \isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   315
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   316
\isadelimproof
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   317
%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   318
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   319
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   320
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   321
\isacommand{by}\isamarkupfalse%
21346
c8aa120fa05d updated
krauss
parents: 21212
diff changeset
   322
\ {\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
   323
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   324
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   325
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   326
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   327
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   328
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   329
%
23003
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   330
\isamarkupsubsection{Manual Termination Proofs%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   331
}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   332
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   333
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   334
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   335
The \isa{relation} method is often useful, but not
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   336
  necessary. Since termination proofs are just normal Isabelle proofs,
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   337
  they can also be carried out manually:%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   338
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   339
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   340
\isacommand{function}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   341
\ id\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   342
\isakeyword{where}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   343
\ \ {\isachardoublequoteopen}id\ {\isadigit{0}}\ {\isacharequal}\ {\isadigit{0}}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   344
{\isacharbar}\ {\isachardoublequoteopen}id\ {\isacharparenleft}Suc\ n{\isacharparenright}\ {\isacharequal}\ Suc\ {\isacharparenleft}id\ n{\isacharparenright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   345
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   346
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   347
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   348
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   349
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   350
\isatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   351
\isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   352
\ pat{\isacharunderscore}completeness\ auto%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   353
\endisatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   354
{\isafoldproof}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   355
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   356
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   357
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   358
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   359
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   360
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   361
\isacommand{termination}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   362
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   363
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   364
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   365
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   366
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   367
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   368
\isatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   369
\isacommand{proof}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   370
\ \isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   371
\ \ \isacommand{show}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   372
\ {\isachardoublequoteopen}wf\ less{\isacharunderscore}than{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   373
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   374
\isacommand{next}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   375
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   376
\ \ \isacommand{fix}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   377
\ n\ \isacommand{show}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   378
\ {\isachardoublequoteopen}{\isacharparenleft}n{\isacharcomma}\ Suc\ n{\isacharparenright}\ {\isasymin}\ less{\isacharunderscore}than{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   379
\ simp\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   380
\isacommand{qed}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   381
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   382
\endisatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   383
{\isafoldproof}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   384
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   385
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   386
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   387
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   388
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   389
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   390
Of course this is just a trivial example, but manual proofs can
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   391
  sometimes be the only choice if faced with very hard termination problems.%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   392
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   393
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   394
%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   395
\isamarkupsection{Mutual Recursion%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   396
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   397
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   398
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   399
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   400
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
   401
  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
   402
\end{isamarkuptext}%
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
\isacommand{function}\isamarkupfalse%
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   405
\ even\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ bool{\isachardoublequoteclose}\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   406
\ \ \ \ \isakeyword{and}\ odd\ \ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ bool{\isachardoublequoteclose}\isanewline
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   407
\isakeyword{where}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   408
\ \ {\isachardoublequoteopen}even\ {\isadigit{0}}\ {\isacharequal}\ True{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   409
{\isacharbar}\ {\isachardoublequoteopen}odd\ {\isadigit{0}}\ {\isacharequal}\ False{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   410
{\isacharbar}\ {\isachardoublequoteopen}even\ {\isacharparenleft}Suc\ n{\isacharparenright}\ {\isacharequal}\ odd\ n{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   411
{\isacharbar}\ {\isachardoublequoteopen}odd\ {\isacharparenleft}Suc\ n{\isacharparenright}\ {\isacharequal}\ even\ n{\isachardoublequoteclose}\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   412
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   413
\isadelimproof
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   414
%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   415
\endisadelimproof
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
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   418
\isacommand{by}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   419
\ pat{\isacharunderscore}completeness\ auto%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   420
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   421
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   422
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   423
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   424
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   425
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   426
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   427
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   428
To solve the problem of mutual dependencies, Isabelle internally
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   429
  creates a single function operating on the sum
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   430
  type. Then the original functions are defined as
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   431
  projections. Consequently, termination has to be proved
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   432
  simultaneously for both functions, by specifying a measure on the
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   433
  sum type:%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   434
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   435
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   436
\isacommand{termination}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   437
\ \isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   438
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   439
\isadelimproof
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   440
%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   441
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   442
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   443
\isatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   444
\isacommand{by}\isamarkupfalse%
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   445
\ {\isacharparenleft}relation\ {\isachardoublequoteopen}measure\ {\isacharparenleft}{\isasymlambda}x{\isachardot}\ case\ x\ of\ Inl\ n\ {\isasymRightarrow}\ n\ {\isacharbar}\ Inr\ n\ {\isasymRightarrow}\ n{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}\ \isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   446
\ \ \ auto%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   447
\endisatagproof
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   448
{\isafoldproof}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   449
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   450
\isadelimproof
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   451
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   452
\endisadelimproof
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   453
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   454
\isamarkupsubsection{Induction for mutual recursion%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   455
}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   456
\isamarkuptrue%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   457
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   458
\begin{isamarkuptext}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   459
When functions are mutually recursive, proving properties about them
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   460
  generally requires simultaneous induction. The induction rules
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   461
  generated from the definitions reflect this.
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   462
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   463
  Let us prove something about \isa{even} and \isa{odd}:%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   464
\end{isamarkuptext}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   465
\isamarkuptrue%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   466
\isacommand{lemma}\isamarkupfalse%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   467
\ \isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   468
\ \ {\isachardoublequoteopen}even\ n\ {\isacharequal}\ {\isacharparenleft}n\ mod\ {\isadigit{2}}\ {\isacharequal}\ {\isadigit{0}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   469
\ \ {\isachardoublequoteopen}odd\ n\ {\isacharequal}\ {\isacharparenleft}n\ mod\ {\isadigit{2}}\ {\isacharequal}\ {\isadigit{1}}{\isacharparenright}{\isachardoublequoteclose}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   470
\isadelimproof
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   471
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   472
\endisadelimproof
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   473
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   474
\isatagproof
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   475
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   476
\begin{isamarkuptxt}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   477
We apply simultaneous induction, specifying the induction variable
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   478
  for both goals, separated by \cmd{and}:%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   479
\end{isamarkuptxt}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   480
\isamarkuptrue%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   481
\isacommand{apply}\isamarkupfalse%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   482
\ {\isacharparenleft}induct\ n\ \isakeyword{and}\ n\ rule{\isacharcolon}\ even{\isacharunderscore}odd{\isachardot}induct{\isacharparenright}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   483
\begin{isamarkuptxt}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   484
We get four subgoals, which correspond to the clauses in the
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   485
  definition of \isa{even} and \isa{odd}:
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   486
  \begin{isabelle}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   487
\ {\isadigit{1}}{\isachardot}\ even\ {\isadigit{0}}\ {\isacharequal}\ {\isacharparenleft}{\isadigit{0}}\ mod\ {\isadigit{2}}\ {\isacharequal}\ {\isadigit{0}}{\isacharparenright}\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   488
\ {\isadigit{2}}{\isachardot}\ odd\ {\isadigit{0}}\ {\isacharequal}\ {\isacharparenleft}{\isadigit{0}}\ mod\ {\isadigit{2}}\ {\isacharequal}\ {\isadigit{1}}{\isacharparenright}\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   489
\ {\isadigit{3}}{\isachardot}\ {\isasymAnd}n{\isachardot}\ odd\ n\ {\isacharequal}\ {\isacharparenleft}n\ mod\ {\isadigit{2}}\ {\isacharequal}\ {\isadigit{1}}{\isacharparenright}\ {\isasymLongrightarrow}\ even\ {\isacharparenleft}Suc\ n{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}Suc\ n\ mod\ {\isadigit{2}}\ {\isacharequal}\ {\isadigit{0}}{\isacharparenright}\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   490
\ {\isadigit{4}}{\isachardot}\ {\isasymAnd}n{\isachardot}\ even\ n\ {\isacharequal}\ {\isacharparenleft}n\ mod\ {\isadigit{2}}\ {\isacharequal}\ {\isadigit{0}}{\isacharparenright}\ {\isasymLongrightarrow}\ odd\ {\isacharparenleft}Suc\ n{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}Suc\ n\ mod\ {\isadigit{2}}\ {\isacharequal}\ {\isadigit{1}}{\isacharparenright}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   491
\end{isabelle}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   492
  Simplification solves the first two goals, leaving us with two
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   493
  statements about the \isa{mod} operation to prove:%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   494
\end{isamarkuptxt}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   495
\isamarkuptrue%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   496
\isacommand{apply}\isamarkupfalse%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   497
\ simp{\isacharunderscore}all%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   498
\begin{isamarkuptxt}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   499
\begin{isabelle}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   500
\ {\isadigit{1}}{\isachardot}\ {\isasymAnd}n{\isachardot}\ odd\ n\ {\isacharequal}\ {\isacharparenleft}n\ mod\ {\isadigit{2}}\ {\isacharequal}\ Suc\ {\isadigit{0}}{\isacharparenright}\ {\isasymLongrightarrow}\ {\isacharparenleft}n\ mod\ {\isadigit{2}}\ {\isacharequal}\ Suc\ {\isadigit{0}}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}Suc\ n\ mod\ {\isadigit{2}}\ {\isacharequal}\ {\isadigit{0}}{\isacharparenright}\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   501
\ {\isadigit{2}}{\isachardot}\ {\isasymAnd}n{\isachardot}\ even\ n\ {\isacharequal}\ {\isacharparenleft}n\ mod\ {\isadigit{2}}\ {\isacharequal}\ {\isadigit{0}}{\isacharparenright}\ {\isasymLongrightarrow}\ {\isacharparenleft}n\ mod\ {\isadigit{2}}\ {\isacharequal}\ {\isadigit{0}}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}Suc\ n\ mod\ {\isadigit{2}}\ {\isacharequal}\ Suc\ {\isadigit{0}}{\isacharparenright}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   502
\end{isabelle} 
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   503
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   504
  \noindent These can be handeled by the descision procedure for
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   505
  presburger arithmethic.%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   506
\end{isamarkuptxt}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   507
\isamarkuptrue%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   508
\isacommand{apply}\isamarkupfalse%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   509
\ presburger\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   510
\isacommand{apply}\isamarkupfalse%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   511
\ presburger\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   512
\isacommand{done}\isamarkupfalse%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   513
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   514
\endisatagproof
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   515
{\isafoldproof}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   516
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   517
\isadelimproof
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   518
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   519
\endisadelimproof
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   520
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   521
\begin{isamarkuptext}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   522
Even if we were just interested in one of the statements proved by
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   523
  simultaneous induction, the other ones may be necessary to
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   524
  strengthen the induction hypothesis. If we had left out the statement
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   525
  about \isa{odd} (by substituting it with \isa{True}, our
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   526
  proof would have failed:%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   527
\end{isamarkuptext}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   528
\isamarkuptrue%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   529
\isacommand{lemma}\isamarkupfalse%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   530
\ \isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   531
\ \ {\isachardoublequoteopen}even\ n\ {\isacharequal}\ {\isacharparenleft}n\ mod\ {\isadigit{2}}\ {\isacharequal}\ {\isadigit{0}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   532
\ \ {\isachardoublequoteopen}True{\isachardoublequoteclose}\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   533
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   534
\isadelimproof
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   535
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   536
\endisadelimproof
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   537
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   538
\isatagproof
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   539
\isacommand{apply}\isamarkupfalse%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   540
\ {\isacharparenleft}induct\ n\ rule{\isacharcolon}\ even{\isacharunderscore}odd{\isachardot}induct{\isacharparenright}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   541
\begin{isamarkuptxt}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   542
\noindent Now the third subgoal is a dead end, since we have no
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   543
  useful induction hypothesis:
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   544
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   545
  \begin{isabelle}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   546
\ {\isadigit{1}}{\isachardot}\ even\ {\isadigit{0}}\ {\isacharequal}\ {\isacharparenleft}{\isadigit{0}}\ mod\ {\isadigit{2}}\ {\isacharequal}\ {\isadigit{0}}{\isacharparenright}\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   547
\ {\isadigit{2}}{\isachardot}\ True\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   548
\ {\isadigit{3}}{\isachardot}\ {\isasymAnd}n{\isachardot}\ True\ {\isasymLongrightarrow}\ even\ {\isacharparenleft}Suc\ n{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}Suc\ n\ mod\ {\isadigit{2}}\ {\isacharequal}\ {\isadigit{0}}{\isacharparenright}\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   549
\ {\isadigit{4}}{\isachardot}\ {\isasymAnd}n{\isachardot}\ even\ n\ {\isacharequal}\ {\isacharparenleft}n\ mod\ {\isadigit{2}}\ {\isacharequal}\ {\isadigit{0}}{\isacharparenright}\ {\isasymLongrightarrow}\ True%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   550
\end{isabelle}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   551
\end{isamarkuptxt}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   552
\isamarkuptrue%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   553
\isacommand{oops}\isamarkupfalse%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   554
%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   555
\endisatagproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   556
{\isafoldproof}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   557
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   558
\isadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   559
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   560
\endisadelimproof
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   561
%
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   562
\isamarkupsection{More general patterns%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   563
}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   564
\isamarkuptrue%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   565
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   566
\isamarkupsubsection{Avoiding pattern splitting%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   567
}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   568
\isamarkuptrue%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   569
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   570
\begin{isamarkuptext}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   571
Up to now, we used pattern matching only on datatypes, and the
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   572
  patterns were always disjoint and complete, and if they weren't,
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   573
  they were made disjoint automatically like in the definition of
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   574
  \isa{sep} in \S\ref{patmatch}.
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   575
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   576
  This splitting can significantly increase the number of equations
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   577
  involved, and is not always necessary. The following simple example
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   578
  shows the problem:
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   579
  
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   580
  Suppose we are modelling incomplete knowledge about the world by a
23003
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   581
  three-valued datatype, which has values \isa{T}, \isa{F}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   582
  and \isa{X} for true, false and uncertain propositions, respectively.%
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   583
\end{isamarkuptext}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   584
\isamarkuptrue%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   585
\isacommand{datatype}\isamarkupfalse%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   586
\ P{\isadigit{3}}\ {\isacharequal}\ T\ {\isacharbar}\ F\ {\isacharbar}\ X%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   587
\begin{isamarkuptext}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   588
Then the conjunction of such values can be defined as follows:%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   589
\end{isamarkuptext}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   590
\isamarkuptrue%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   591
\isacommand{fun}\isamarkupfalse%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   592
\ And\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}P{\isadigit{3}}\ {\isasymRightarrow}\ P{\isadigit{3}}\ {\isasymRightarrow}\ P{\isadigit{3}}{\isachardoublequoteclose}\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   593
\isakeyword{where}\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   594
\ \ {\isachardoublequoteopen}And\ T\ p\ {\isacharequal}\ p{\isachardoublequoteclose}\isanewline
23003
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   595
{\isacharbar}\ {\isachardoublequoteopen}And\ p\ T\ {\isacharequal}\ p{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   596
{\isacharbar}\ {\isachardoublequoteopen}And\ p\ F\ {\isacharequal}\ F{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   597
{\isacharbar}\ {\isachardoublequoteopen}And\ F\ p\ {\isacharequal}\ F{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   598
{\isacharbar}\ {\isachardoublequoteopen}And\ X\ X\ {\isacharequal}\ X{\isachardoublequoteclose}%
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   599
\begin{isamarkuptext}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   600
This definition is useful, because the equations can directly be used
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   601
  as rules to simplify expressions. But the patterns overlap, e.g.~the
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   602
  expression \isa{And\ T\ T} is matched by the first two
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   603
  equations. By default, Isabelle makes the patterns disjoint by
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   604
  splitting them up, producing instances:%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   605
\end{isamarkuptext}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   606
\isamarkuptrue%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   607
\isacommand{thm}\isamarkupfalse%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   608
\ And{\isachardot}simps%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   609
\begin{isamarkuptext}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   610
\isa{And\ T\ {\isacharquery}p\ {\isacharequal}\ {\isacharquery}p\isasep\isanewline%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   611
And\ F\ T\ {\isacharequal}\ F\isasep\isanewline%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   612
And\ X\ T\ {\isacharequal}\ X\isasep\isanewline%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   613
And\ F\ F\ {\isacharequal}\ F\isasep\isanewline%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   614
And\ X\ F\ {\isacharequal}\ F\isasep\isanewline%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   615
And\ F\ X\ {\isacharequal}\ F\isasep\isanewline%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   616
And\ X\ X\ {\isacharequal}\ X}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   617
  
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   618
  \vspace*{1em}
23003
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   619
  \noindent There are several problems with this:
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   620
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   621
  \begin{enumerate}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   622
  \item When datatypes have many constructors, there can be an
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   623
  explosion of equations. For \isa{And}, we get seven instead of
23003
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   624
  five equations, which can be tolerated, but this is just a small
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   625
  example.
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   626
23003
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   627
  \item Since splitting makes the equations "less general", they
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   628
  do not always match in rewriting. While the term \isa{And\ x\ F}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   629
  can be simplified to \isa{F} by the original specification, a
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   630
  (manual) case split on \isa{x} is now necessary.
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   631
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   632
  \item The splitting also concerns the induction rule \isa{And{\isachardot}induct}. Instead of five premises it now has seven, which
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   633
  means that our induction proofs will have more cases.
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   634
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   635
  \item In general, it increases clarity if we get the same definition
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   636
  back which we put in.
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   637
  \end{enumerate}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   638
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   639
  On the other hand, a definition needs to be consistent and defining
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   640
  both \isa{f\ x\ {\isacharequal}\ True} and \isa{f\ x\ {\isacharequal}\ False} is a bad
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   641
  idea. So if we don't want Isabelle to mangle our definitions, we
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   642
  will have to prove that this is not necessary. By using the full
23003
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   643
  definition form without the \cmd{sequential} option, we get this
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   644
  behaviour:%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   645
\end{isamarkuptext}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   646
\isamarkuptrue%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   647
\isacommand{function}\isamarkupfalse%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   648
\ And{\isadigit{2}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}P{\isadigit{3}}\ {\isasymRightarrow}\ P{\isadigit{3}}\ {\isasymRightarrow}\ P{\isadigit{3}}{\isachardoublequoteclose}\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   649
\isakeyword{where}\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   650
\ \ {\isachardoublequoteopen}And{\isadigit{2}}\ T\ p\ {\isacharequal}\ p{\isachardoublequoteclose}\isanewline
23003
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   651
{\isacharbar}\ {\isachardoublequoteopen}And{\isadigit{2}}\ p\ T\ {\isacharequal}\ p{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   652
{\isacharbar}\ {\isachardoublequoteopen}And{\isadigit{2}}\ p\ F\ {\isacharequal}\ F{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   653
{\isacharbar}\ {\isachardoublequoteopen}And{\isadigit{2}}\ F\ p\ {\isacharequal}\ F{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   654
{\isacharbar}\ {\isachardoublequoteopen}And{\isadigit{2}}\ X\ X\ {\isacharequal}\ X{\isachardoublequoteclose}%
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   655
\isadelimproof
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   656
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   657
\endisadelimproof
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   658
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   659
\isatagproof
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   660
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   661
\begin{isamarkuptxt}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   662
Now it is also time to look at the subgoals generated by a
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   663
  function definition. In this case, they are:
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   664
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   665
  \begin{isabelle}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   666
\ {\isadigit{1}}{\isachardot}\ {\isasymAnd}P\ x{\isachardot}\ {\isasymlbrakk}{\isasymAnd}p{\isachardot}\ x\ {\isacharequal}\ {\isacharparenleft}T{\isacharcomma}\ p{\isacharparenright}\ {\isasymLongrightarrow}\ P{\isacharsemicolon}\ {\isasymAnd}p{\isachardot}\ x\ {\isacharequal}\ {\isacharparenleft}p{\isacharcomma}\ T{\isacharparenright}\ {\isasymLongrightarrow}\ P{\isacharsemicolon}\ {\isasymAnd}p{\isachardot}\ x\ {\isacharequal}\ {\isacharparenleft}p{\isacharcomma}\ F{\isacharparenright}\ {\isasymLongrightarrow}\ P{\isacharsemicolon}\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   667
\isaindent{\ {\isadigit{1}}{\isachardot}\ {\isasymAnd}P\ x{\isachardot}\ \ }{\isasymAnd}p{\isachardot}\ x\ {\isacharequal}\ {\isacharparenleft}F{\isacharcomma}\ p{\isacharparenright}\ {\isasymLongrightarrow}\ P{\isacharsemicolon}\ x\ {\isacharequal}\ {\isacharparenleft}X{\isacharcomma}\ X{\isacharparenright}\ {\isasymLongrightarrow}\ P{\isasymrbrakk}\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   668
\isaindent{\ {\isadigit{1}}{\isachardot}\ {\isasymAnd}P\ x{\isachardot}\ }{\isasymLongrightarrow}\ P\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   669
\ {\isadigit{2}}{\isachardot}\ {\isasymAnd}p\ pa{\isachardot}\ {\isacharparenleft}T{\isacharcomma}\ p{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}T{\isacharcomma}\ pa{\isacharparenright}\ {\isasymLongrightarrow}\ p\ {\isacharequal}\ pa\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   670
\ {\isadigit{3}}{\isachardot}\ {\isasymAnd}p\ pa{\isachardot}\ {\isacharparenleft}T{\isacharcomma}\ p{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}pa{\isacharcomma}\ T{\isacharparenright}\ {\isasymLongrightarrow}\ p\ {\isacharequal}\ pa\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   671
\ {\isadigit{4}}{\isachardot}\ {\isasymAnd}p\ pa{\isachardot}\ {\isacharparenleft}T{\isacharcomma}\ p{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}pa{\isacharcomma}\ F{\isacharparenright}\ {\isasymLongrightarrow}\ p\ {\isacharequal}\ F\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   672
\ {\isadigit{5}}{\isachardot}\ {\isasymAnd}p\ pa{\isachardot}\ {\isacharparenleft}T{\isacharcomma}\ p{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}F{\isacharcomma}\ pa{\isacharparenright}\ {\isasymLongrightarrow}\ p\ {\isacharequal}\ F\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   673
\ {\isadigit{6}}{\isachardot}\ {\isasymAnd}p{\isachardot}\ {\isacharparenleft}T{\isacharcomma}\ p{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}X{\isacharcomma}\ X{\isacharparenright}\ {\isasymLongrightarrow}\ p\ {\isacharequal}\ X\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   674
\ {\isadigit{7}}{\isachardot}\ {\isasymAnd}p\ pa{\isachardot}\ {\isacharparenleft}p{\isacharcomma}\ T{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}pa{\isacharcomma}\ T{\isacharparenright}\ {\isasymLongrightarrow}\ p\ {\isacharequal}\ pa\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   675
\ {\isadigit{8}}{\isachardot}\ {\isasymAnd}p\ pa{\isachardot}\ {\isacharparenleft}p{\isacharcomma}\ T{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}pa{\isacharcomma}\ F{\isacharparenright}\ {\isasymLongrightarrow}\ p\ {\isacharequal}\ F\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   676
\ {\isadigit{9}}{\isachardot}\ {\isasymAnd}p\ pa{\isachardot}\ {\isacharparenleft}p{\isacharcomma}\ T{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}F{\isacharcomma}\ pa{\isacharparenright}\ {\isasymLongrightarrow}\ p\ {\isacharequal}\ F\isanewline
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   677
\ {\isadigit{1}}{\isadigit{0}}{\isachardot}\ {\isasymAnd}p{\isachardot}\ {\isacharparenleft}p{\isacharcomma}\ T{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}X{\isacharcomma}\ X{\isacharparenright}\ {\isasymLongrightarrow}\ p\ {\isacharequal}\ X%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   678
\end{isabelle} 
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   679
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   680
  The first subgoal expresses the completeness of the patterns. It has
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   681
  the form of an elimination rule and states that every \isa{x} of
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   682
  the function's input type must match one of the patterns. It could
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   683
  be equivalently stated as a disjunction of existential statements: 
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   684
\isa{{\isacharparenleft}{\isasymexists}p{\isachardot}\ x\ {\isacharequal}\ {\isacharparenleft}T{\isacharcomma}\ p{\isacharparenright}{\isacharparenright}\ {\isasymor}\ {\isacharparenleft}{\isasymexists}p{\isachardot}\ x\ {\isacharequal}\ {\isacharparenleft}p{\isacharcomma}\ T{\isacharparenright}{\isacharparenright}\ {\isasymor}\ {\isacharparenleft}{\isasymexists}p{\isachardot}\ x\ {\isacharequal}\ {\isacharparenleft}p{\isacharcomma}\ F{\isacharparenright}{\isacharparenright}\ {\isasymor}\ {\isacharparenleft}{\isasymexists}p{\isachardot}\ x\ {\isacharequal}\ {\isacharparenleft}F{\isacharcomma}\ p{\isacharparenright}{\isacharparenright}\ {\isasymor}\ x\ {\isacharequal}\ {\isacharparenleft}X{\isacharcomma}\ X{\isacharparenright}} If the patterns just involve
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   685
  datatypes, we can solve it with the \isa{pat{\isacharunderscore}completeness} method:%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   686
\end{isamarkuptxt}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   687
\isamarkuptrue%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   688
\isacommand{apply}\isamarkupfalse%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   689
\ pat{\isacharunderscore}completeness%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   690
\begin{isamarkuptxt}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   691
The remaining subgoals express \emph{pattern compatibility}. We do
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   692
  allow that a value is matched by more than one patterns, but in this
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   693
  case, the result (i.e.~the right hand sides of the equations) must
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   694
  also be equal. For each pair of two patterns, there is one such
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   695
  subgoal. Usually this needs injectivity of the constructors, which
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   696
  is used automatically by \isa{auto}.%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   697
\end{isamarkuptxt}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   698
\isamarkuptrue%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   699
\isacommand{by}\isamarkupfalse%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   700
\ auto%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   701
\endisatagproof
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   702
{\isafoldproof}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   703
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   704
\isadelimproof
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   705
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   706
\endisadelimproof
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   707
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   708
\isamarkupsubsection{Non-constructor patterns%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   709
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   710
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   711
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   712
\begin{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   713
FIXME%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   714
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   715
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
   716
%
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   717
\isamarkupsection{Partiality%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   718
}
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   719
\isamarkuptrue%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   720
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   721
\begin{isamarkuptext}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   722
In HOL, all functions are total. A function \isa{f} applied to
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   723
  \isa{x} always has a value \isa{f\ x}, and there is no notion
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   724
  of undefinedness. 
23003
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   725
  
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   726
  This property of HOL is the reason why we have to do termination
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   727
  proofs when defining functions: The termination proof justifies the
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   728
  definition of the function by wellfounded recursion.
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
   729
23003
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   730
  However, the \cmd{function} package still supports partiality. Let's
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   731
  look at the following function which searches for a zero in the
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   732
  function f.%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   733
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   734
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   735
\isacommand{function}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   736
\ findzero\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharparenleft}nat\ {\isasymRightarrow}\ nat{\isacharparenright}\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   737
\isakeyword{where}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   738
\ \ {\isachardoublequoteopen}findzero\ f\ n\ {\isacharequal}\ {\isacharparenleft}if\ f\ n\ {\isacharequal}\ {\isadigit{0}}\ then\ n\ else\ findzero\ f\ {\isacharparenleft}Suc\ n{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   739
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   740
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   741
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   742
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   743
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   744
\isatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   745
\isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   746
\ pat{\isacharunderscore}completeness\ auto%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   747
\endisatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   748
{\isafoldproof}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   749
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   750
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   751
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   752
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   753
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   754
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   755
Clearly, any attempt of a termination proof must fail. And without
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   756
  that, we do not get the usual rules \isa{findzero{\isachardot}simp} and 
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   757
  \isa{findzero{\isachardot}induct}. So what was the definition good for at all?%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   758
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   759
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   760
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   761
\isamarkupsubsection{Domain predicates%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   762
}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   763
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   764
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   765
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   766
The trick is that Isabelle has not only defined the function \isa{findzero}, but also
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   767
  a predicate \isa{findzero{\isacharunderscore}dom} that characterizes the values where the function
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   768
  terminates: the \emph{domain} of the function. In Isabelle/HOL, a
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   769
  partial function is just a total function with an additional domain
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   770
  predicate. Like with total functions, we get simplification and
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   771
  induction rules, but they are guarded by the domain conditions and
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   772
  called \isa{psimps} and \isa{pinduct}:%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   773
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   774
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   775
\isacommand{thm}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   776
\ findzero{\isachardot}psimps%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   777
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   778
\begin{isabelle}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   779
findzero{\isacharunderscore}dom\ {\isacharparenleft}{\isacharquery}f{\isacharcomma}\ {\isacharquery}n{\isacharparenright}\ {\isasymLongrightarrow}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   780
findzero\ {\isacharquery}f\ {\isacharquery}n\ {\isacharequal}\ {\isacharparenleft}if\ {\isacharquery}f\ {\isacharquery}n\ {\isacharequal}\ {\isadigit{0}}\ then\ {\isacharquery}n\ else\ findzero\ {\isacharquery}f\ {\isacharparenleft}Suc\ {\isacharquery}n{\isacharparenright}{\isacharparenright}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   781
\end{isabelle}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   782
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   783
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   784
\isacommand{thm}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   785
\ findzero{\isachardot}pinduct%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   786
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   787
\begin{isabelle}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   788
{\isasymlbrakk}findzero{\isacharunderscore}dom\ {\isacharparenleft}{\isacharquery}a{\isadigit{0}}{\isachardot}{\isadigit{0}}{\isacharcomma}\ {\isacharquery}a{\isadigit{1}}{\isachardot}{\isadigit{0}}{\isacharparenright}{\isacharsemicolon}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   789
\isaindent{\ }{\isasymAnd}f\ n{\isachardot}\ {\isasymlbrakk}findzero{\isacharunderscore}dom\ {\isacharparenleft}f{\isacharcomma}\ n{\isacharparenright}{\isacharsemicolon}\ f\ n\ {\isasymnoteq}\ {\isadigit{0}}\ {\isasymLongrightarrow}\ {\isacharquery}P\ f\ {\isacharparenleft}Suc\ n{\isacharparenright}{\isasymrbrakk}\ {\isasymLongrightarrow}\ {\isacharquery}P\ f\ n{\isasymrbrakk}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   790
{\isasymLongrightarrow}\ {\isacharquery}P\ {\isacharquery}a{\isadigit{0}}{\isachardot}{\isadigit{0}}\ {\isacharquery}a{\isadigit{1}}{\isachardot}{\isadigit{0}}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   791
\end{isabelle}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   792
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   793
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   794
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   795
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   796
As already mentioned, HOL does not support true partiality. All we
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   797
  are doing here is using some tricks to make a total function appear
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   798
  as if it was partial. We can still write the term \isa{findzero\ {\isacharparenleft}{\isasymlambda}x{\isachardot}\ {\isadigit{1}}{\isacharparenright}\ {\isadigit{0}}} and like any other term of type \isa{nat} it is equal
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   799
  to some natural number, although we might not be able to find out
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   800
  which one (we will discuss this further in \S\ref{default}). The
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   801
  function is \emph{underdefined}.
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   802
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   803
  But it is enough defined to prove something about it. We can prove
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   804
  that if \isa{findzero\ f\ n}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   805
  it terminates, it indeed returns a zero of \isa{f}:%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   806
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   807
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   808
\isacommand{lemma}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   809
\ findzero{\isacharunderscore}zero{\isacharcolon}\ {\isachardoublequoteopen}findzero{\isacharunderscore}dom\ {\isacharparenleft}f{\isacharcomma}\ n{\isacharparenright}\ {\isasymLongrightarrow}\ f\ {\isacharparenleft}findzero\ f\ n{\isacharparenright}\ {\isacharequal}\ {\isadigit{0}}{\isachardoublequoteclose}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   810
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   811
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   812
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   813
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   814
\isatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   815
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   816
\begin{isamarkuptxt}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   817
We apply induction as usual, but using the partial induction
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   818
  rule:%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   819
\end{isamarkuptxt}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   820
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   821
\isacommand{apply}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   822
\ {\isacharparenleft}induct\ f\ n\ rule{\isacharcolon}\ findzero{\isachardot}pinduct{\isacharparenright}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   823
\begin{isamarkuptxt}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   824
This gives the following subgoals:
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   825
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   826
  \begin{isabelle}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   827
\ {\isadigit{1}}{\isachardot}\ {\isasymAnd}f\ n{\isachardot}\ {\isasymlbrakk}findzero{\isacharunderscore}dom\ {\isacharparenleft}f{\isacharcomma}\ n{\isacharparenright}{\isacharsemicolon}\ f\ n\ {\isasymnoteq}\ {\isadigit{0}}\ {\isasymLongrightarrow}\ f\ {\isacharparenleft}findzero\ f\ {\isacharparenleft}Suc\ n{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ {\isadigit{0}}{\isasymrbrakk}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   828
\isaindent{\ {\isadigit{1}}{\isachardot}\ {\isasymAnd}f\ n{\isachardot}\ }{\isasymLongrightarrow}\ f\ {\isacharparenleft}findzero\ f\ n{\isacharparenright}\ {\isacharequal}\ {\isadigit{0}}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   829
\end{isabelle}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   830
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   831
  The premise in our lemma was used to satisfy the first premise in
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   832
  the induction rule. However, now we can also use \isa{findzero{\isacharunderscore}dom\ {\isacharparenleft}f{\isacharcomma}\ n{\isacharparenright}} as an assumption in the induction step. This
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   833
  allows to unfold \isa{findzero\ f\ n} using the \isa{psimps}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   834
  rule, and the rest is trivial. Since \isa{psimps} rules carry the
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   835
  \isa{{\isacharbrackleft}simp{\isacharbrackright}} attribute by default, we just need a single step:%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   836
\end{isamarkuptxt}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   837
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   838
\isacommand{apply}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   839
\ simp\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   840
\isacommand{done}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   841
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   842
\endisatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   843
{\isafoldproof}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   844
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   845
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   846
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   847
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   848
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   849
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   850
Proofs about partial functions are often not harder than for total
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   851
  functions. Fig.~\ref{findzero_isar} shows a slightly more
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   852
  complicated proof written in Isar. It is verbose enough to show how
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   853
  partiality comes into play: From the partial induction, we get an
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   854
  additional domain condition hypothesis. Observe how this condition
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   855
  is applied when calls to \isa{findzero} are unfolded.%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   856
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   857
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   858
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   859
\begin{figure}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   860
\begin{center}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   861
\begin{minipage}{0.8\textwidth}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   862
\isabellestyle{it}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   863
\isastyle\isamarkuptrue
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   864
\isacommand{lemma}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   865
\ {\isachardoublequoteopen}{\isasymlbrakk}findzero{\isacharunderscore}dom\ {\isacharparenleft}f{\isacharcomma}\ n{\isacharparenright}{\isacharsemicolon}\ x\ {\isasymin}\ {\isacharbraceleft}n\ {\isachardot}{\isachardot}{\isacharless}\ findzero\ f\ n{\isacharbraceright}{\isasymrbrakk}\ {\isasymLongrightarrow}\ f\ x\ {\isasymnoteq}\ {\isadigit{0}}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   866
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   867
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   868
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   869
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   870
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   871
\isatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   872
\isacommand{proof}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   873
\ {\isacharparenleft}induct\ rule{\isacharcolon}\ findzero{\isachardot}pinduct{\isacharparenright}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   874
\ \ \isacommand{fix}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   875
\ f\ n\ \isacommand{assume}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   876
\ dom{\isacharcolon}\ {\isachardoublequoteopen}findzero{\isacharunderscore}dom\ {\isacharparenleft}f{\isacharcomma}\ n{\isacharparenright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   877
\ \ \ \ \isakeyword{and}\ IH{\isacharcolon}\ {\isachardoublequoteopen}{\isasymlbrakk}f\ n\ {\isasymnoteq}\ {\isadigit{0}}{\isacharsemicolon}\ x\ {\isasymin}\ {\isacharbraceleft}Suc\ n{\isachardot}{\isachardot}{\isacharless}findzero\ f\ {\isacharparenleft}Suc\ n{\isacharparenright}{\isacharbraceright}{\isasymrbrakk}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   878
\ \ \ \ \ \ \ \ \ \ \ \ \ {\isasymLongrightarrow}\ f\ x\ {\isasymnoteq}\ {\isadigit{0}}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   879
\ \ \ \ \isakeyword{and}\ x{\isacharunderscore}range{\isacharcolon}\ {\isachardoublequoteopen}x\ {\isasymin}\ {\isacharbraceleft}n{\isachardot}{\isachardot}{\isacharless}findzero\ f\ n{\isacharbraceright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   880
\ \ \isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   881
\ \ \isacommand{have}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   882
\ {\isachardoublequoteopen}f\ n\ {\isasymnoteq}\ {\isadigit{0}}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   883
\ \ \isacommand{proof}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   884
\ \isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   885
\ \ \ \ \isacommand{assume}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   886
\ {\isachardoublequoteopen}f\ n\ {\isacharequal}\ {\isadigit{0}}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   887
\ \ \ \ \isacommand{with}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   888
\ dom\ \isacommand{have}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   889
\ {\isachardoublequoteopen}findzero\ f\ n\ {\isacharequal}\ n{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   890
\ simp\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   891
\ \ \ \ \isacommand{with}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   892
\ x{\isacharunderscore}range\ \isacommand{show}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   893
\ False\ \isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   894
\ auto\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   895
\ \ \isacommand{qed}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   896
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   897
\ \ \isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   898
\ \ \isacommand{from}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   899
\ x{\isacharunderscore}range\ \isacommand{have}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   900
\ {\isachardoublequoteopen}x\ {\isacharequal}\ n\ {\isasymor}\ x\ {\isasymin}\ {\isacharbraceleft}Suc\ n\ {\isachardot}{\isachardot}{\isacharless}\ findzero\ f\ n{\isacharbraceright}{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   901
\ auto\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   902
\ \ \isacommand{thus}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   903
\ {\isachardoublequoteopen}f\ x\ {\isasymnoteq}\ {\isadigit{0}}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   904
\ \ \isacommand{proof}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   905
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   906
\ \ \ \ \isacommand{assume}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   907
\ {\isachardoublequoteopen}x\ {\isacharequal}\ n{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   908
\ \ \ \ \isacommand{with}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   909
\ {\isacharbackquoteopen}f\ n\ {\isasymnoteq}\ {\isadigit{0}}{\isacharbackquoteclose}\ \isacommand{show}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   910
\ {\isacharquery}thesis\ \isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   911
\ simp\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   912
\ \ \isacommand{next}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   913
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   914
\ \ \ \ \isacommand{assume}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   915
\ {\isachardoublequoteopen}x\ {\isasymin}\ {\isacharbraceleft}Suc\ n{\isachardot}{\isachardot}{\isacharless}findzero\ f\ n{\isacharbraceright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   916
\ \ \ \ \isacommand{with}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   917
\ dom\ \isakeyword{and}\ {\isacharbackquoteopen}f\ n\ {\isasymnoteq}\ {\isadigit{0}}{\isacharbackquoteclose}\ \isacommand{have}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   918
\ {\isachardoublequoteopen}x\ {\isasymin}\ {\isacharbraceleft}Suc\ n\ {\isachardot}{\isachardot}{\isacharless}\ findzero\ f\ {\isacharparenleft}Suc\ n{\isacharparenright}{\isacharbraceright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   919
\ \ \ \ \ \ \isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   920
\ simp\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   921
\ \ \ \ \isacommand{with}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   922
\ IH\ \isakeyword{and}\ {\isacharbackquoteopen}f\ n\ {\isasymnoteq}\ {\isadigit{0}}{\isacharbackquoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   923
\ \ \ \ \isacommand{show}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   924
\ {\isacharquery}thesis\ \isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   925
\ simp\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   926
\ \ \isacommand{qed}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   927
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   928
\isacommand{qed}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   929
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   930
\endisatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   931
{\isafoldproof}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   932
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   933
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   934
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   935
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   936
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   937
\isamarkupfalse\isabellestyle{tt}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   938
\end{minipage}\end{center}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   939
\caption{A proof about a partial function}\label{findzero_isar}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   940
\end{figure}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   941
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   942
\isamarkupsubsection{Partial termination proofs%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   943
}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   944
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   945
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   946
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   947
Now that we have proved some interesting properties about our
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   948
  function, we should turn to the domain predicate and see if it is
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   949
  actually true for some values. Otherwise we would have just proved
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   950
  lemmas with \isa{False} as a premise.
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   951
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   952
  Essentially, we need some introduction rules for \isa{findzero{\isacharunderscore}dom}. The function package can prove such domain
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   953
  introduction rules automatically. But since they are not used very
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   954
  often (they are almost never needed if the function is total), they
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   955
  are disabled by default for efficiency reasons. So we have to go
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   956
  back and ask for them explicitly by passing the \isa{{\isacharparenleft}domintros{\isacharparenright}} option to the function package:
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   957
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   958
\noindent\cmd{function} \isa{{\isacharparenleft}domintros{\isacharparenright}\ findzero\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}{\isacharparenleft}nat\ {\isasymRightarrow}\ nat{\isacharparenright}\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ nat{\isachardoublequote}}\\%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   959
\cmd{where}\isanewline%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   960
\ \ \ldots\\
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   961
\cmd{by} \isa{pat{\isacharunderscore}completeness\ auto}\\%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   962
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   963
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   964
  Now the package has proved an introduction rule for \isa{findzero{\isacharunderscore}dom}:%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   965
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   966
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   967
\isacommand{thm}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   968
\ findzero{\isachardot}domintros%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   969
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   970
\begin{isabelle}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   971
{\isacharparenleft}{\isadigit{0}}\ {\isacharless}\ {\isacharquery}f\ {\isacharquery}n\ {\isasymLongrightarrow}\ findzero{\isacharunderscore}dom\ {\isacharparenleft}{\isacharquery}f{\isacharcomma}\ Suc\ {\isacharquery}n{\isacharparenright}{\isacharparenright}\ {\isasymLongrightarrow}\ findzero{\isacharunderscore}dom\ {\isacharparenleft}{\isacharquery}f{\isacharcomma}\ {\isacharquery}n{\isacharparenright}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   972
\end{isabelle}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   973
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   974
  Domain introduction rules allow to show that a given value lies in the
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   975
  domain of a function, if the arguments of all recursive calls
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   976
  are in the domain as well. They allow to do a \qt{single step} in a
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   977
  termination proof. Usually, you want to combine them with a suitable
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   978
  induction principle.
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   979
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   980
  Since our function increases its argument at recursive calls, we
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   981
  need an induction principle which works \qt{backwards}. We will use
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   982
  \isa{inc{\isacharunderscore}induct}, which allows to do induction from a fixed number
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   983
  \qt{downwards}:
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   984
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   985
  \begin{isabelle}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   986
{\isasymlbrakk}{\isacharquery}i\ {\isasymle}\ {\isacharquery}j{\isacharsemicolon}\ {\isacharquery}P\ {\isacharquery}j{\isacharsemicolon}\ {\isasymAnd}i{\isachardot}\ {\isasymlbrakk}i\ {\isacharless}\ {\isacharquery}j{\isacharsemicolon}\ {\isacharquery}P\ {\isacharparenleft}Suc\ i{\isacharparenright}{\isasymrbrakk}\ {\isasymLongrightarrow}\ {\isacharquery}P\ i{\isasymrbrakk}\ {\isasymLongrightarrow}\ {\isacharquery}P\ {\isacharquery}i%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   987
\end{isabelle}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   988
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   989
  Fig.~\ref{findzero_term} gives a detailed Isar proof of the fact
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   990
  that \isa{findzero} terminates if there is a zero which is greater
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   991
  or equal to \isa{n}. First we derive two useful rules which will
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   992
  solve the base case and the step case of the induction. The
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   993
  induction is then straightforward, except for the unusal induction
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   994
  principle.%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   995
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   996
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   997
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   998
\begin{figure}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
   999
\begin{center}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1000
\begin{minipage}{0.8\textwidth}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1001
\isabellestyle{it}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1002
\isastyle\isamarkuptrue
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1003
\isacommand{lemma}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1004
\ findzero{\isacharunderscore}termination{\isacharcolon}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1005
\ \ \isakeyword{assumes}\ {\isachardoublequoteopen}x\ {\isachargreater}{\isacharequal}\ n{\isachardoublequoteclose}\ \isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1006
\ \ \isakeyword{assumes}\ {\isachardoublequoteopen}f\ x\ {\isacharequal}\ {\isadigit{0}}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1007
\ \ \isakeyword{shows}\ {\isachardoublequoteopen}findzero{\isacharunderscore}dom\ {\isacharparenleft}f{\isacharcomma}\ n{\isacharparenright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1008
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1009
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1010
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1011
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1012
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1013
\isatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1014
\isacommand{proof}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1015
\ {\isacharminus}\ \isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1016
\ \ \isacommand{have}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1017
\ base{\isacharcolon}\ {\isachardoublequoteopen}findzero{\isacharunderscore}dom\ {\isacharparenleft}f{\isacharcomma}\ x{\isacharparenright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1018
\ \ \ \ \isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1019
\ {\isacharparenleft}rule\ findzero{\isachardot}domintros{\isacharparenright}\ {\isacharparenleft}simp\ add{\isacharcolon}{\isacharbackquoteopen}f\ x\ {\isacharequal}\ {\isadigit{0}}{\isacharbackquoteclose}{\isacharparenright}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1020
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1021
\ \ \isacommand{have}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1022
\ step{\isacharcolon}\ {\isachardoublequoteopen}{\isasymAnd}i{\isachardot}\ findzero{\isacharunderscore}dom\ {\isacharparenleft}f{\isacharcomma}\ Suc\ i{\isacharparenright}\ \isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1023
\ \ \ \ {\isasymLongrightarrow}\ findzero{\isacharunderscore}dom\ {\isacharparenleft}f{\isacharcomma}\ i{\isacharparenright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1024
\ \ \ \ \isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1025
\ {\isacharparenleft}rule\ findzero{\isachardot}domintros{\isacharparenright}\ simp\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1026
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1027
\ \ \isacommand{from}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1028
\ {\isacharbackquoteopen}x\ {\isasymge}\ n{\isacharbackquoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1029
\ \ \isacommand{show}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1030
\ {\isacharquery}thesis\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1031
\ \ \isacommand{proof}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1032
\ {\isacharparenleft}induct\ rule{\isacharcolon}inc{\isacharunderscore}induct{\isacharparenright}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1033
\ \ \ \ \isacommand{show}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1034
\ {\isachardoublequoteopen}findzero{\isacharunderscore}dom\ {\isacharparenleft}f{\isacharcomma}\ x{\isacharparenright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1035
\ \ \ \ \ \ \isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1036
\ {\isacharparenleft}rule\ base{\isacharparenright}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1037
\ \ \isacommand{next}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1038
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1039
\ \ \ \ \isacommand{fix}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1040
\ i\ \isacommand{assume}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1041
\ {\isachardoublequoteopen}findzero{\isacharunderscore}dom\ {\isacharparenleft}f{\isacharcomma}\ Suc\ i{\isacharparenright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1042
\ \ \ \ \isacommand{thus}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1043
\ {\isachardoublequoteopen}findzero{\isacharunderscore}dom\ {\isacharparenleft}f{\isacharcomma}\ i{\isacharparenright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1044
\ \ \ \ \ \ \isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1045
\ {\isacharparenleft}rule\ step{\isacharparenright}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1046
\ \ \isacommand{qed}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1047
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1048
\isacommand{qed}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1049
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1050
\endisatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1051
{\isafoldproof}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1052
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1053
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1054
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1055
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1056
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1057
\isamarkupfalse\isabellestyle{tt}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1058
\end{minipage}\end{center}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1059
\caption{Termination proof for \isa{findzero}}\label{findzero_term}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1060
\end{figure}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1061
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1062
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1063
Again, the proof given in Fig.~\ref{findzero_term} has a lot of
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1064
  detail in order to explain the principles. Using more automation, we
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1065
  can also have a short proof:%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1066
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1067
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1068
\isacommand{lemma}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1069
\ findzero{\isacharunderscore}termination{\isacharunderscore}short{\isacharcolon}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1070
\ \ \isakeyword{assumes}\ zero{\isacharcolon}\ {\isachardoublequoteopen}x\ {\isachargreater}{\isacharequal}\ n{\isachardoublequoteclose}\ \isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1071
\ \ \isakeyword{assumes}\ {\isacharbrackleft}simp{\isacharbrackright}{\isacharcolon}\ {\isachardoublequoteopen}f\ x\ {\isacharequal}\ {\isadigit{0}}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1072
\ \ \isakeyword{shows}\ {\isachardoublequoteopen}findzero{\isacharunderscore}dom\ {\isacharparenleft}f{\isacharcomma}\ n{\isacharparenright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1073
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1074
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1075
\ \ %
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1076
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1077
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1078
\isatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1079
\isacommand{using}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1080
\ zero\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1081
\ \ \isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1082
\ {\isacharparenleft}induct\ rule{\isacharcolon}inc{\isacharunderscore}induct{\isacharparenright}\ {\isacharparenleft}auto\ intro{\isacharcolon}\ findzero{\isachardot}domintros{\isacharparenright}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1083
\endisatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1084
{\isafoldproof}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1085
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1086
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1087
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1088
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1089
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1090
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1091
It is simple to combine the partial correctness result with the
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1092
  termination lemma:%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1093
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1094
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1095
\isacommand{lemma}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1096
\ findzero{\isacharunderscore}total{\isacharunderscore}correctness{\isacharcolon}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1097
\ \ {\isachardoublequoteopen}f\ x\ {\isacharequal}\ {\isadigit{0}}\ {\isasymLongrightarrow}\ f\ {\isacharparenleft}findzero\ f\ {\isadigit{0}}{\isacharparenright}\ {\isacharequal}\ {\isadigit{0}}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1098
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1099
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1100
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1101
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1102
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1103
\isatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1104
\isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1105
\ {\isacharparenleft}blast\ intro{\isacharcolon}\ findzero{\isacharunderscore}zero\ findzero{\isacharunderscore}termination{\isacharparenright}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1106
\endisatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1107
{\isafoldproof}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1108
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1109
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1110
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1111
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1112
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1113
\isamarkupsubsection{Definition of the domain predicate%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1114
}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1115
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1116
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1117
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1118
Sometimes it is useful to know what the definition of the domain
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1119
  predicate actually is. Actually, \isa{findzero{\isacharunderscore}dom} is just an
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1120
  abbreviation:
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1121
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1122
  \begin{isabelle}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1123
findzero{\isacharunderscore}dom\ {\isasymequiv}\ acc\ findzero{\isacharunderscore}rel%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1124
\end{isabelle}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1125
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1126
  The domain predicate is the accessible part of a relation \isa{findzero{\isacharunderscore}rel}, which was also created internally by the function
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1127
  package. \isa{findzero{\isacharunderscore}rel} is just a normal
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1128
  inductively defined predicate, so we can inspect its definition by
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1129
  looking at the introduction rules \isa{findzero{\isacharunderscore}rel{\isachardot}intros}.
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1130
  In our case there is just a single rule:
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1131
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1132
  \begin{isabelle}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1133
{\isacharquery}f\ {\isacharquery}n\ {\isasymnoteq}\ {\isadigit{0}}\ {\isasymLongrightarrow}\ findzero{\isacharunderscore}rel\ {\isacharparenleft}{\isacharquery}f{\isacharcomma}\ Suc\ {\isacharquery}n{\isacharparenright}\ {\isacharparenleft}{\isacharquery}f{\isacharcomma}\ {\isacharquery}n{\isacharparenright}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1134
\end{isabelle}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1135
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1136
  The relation \isa{findzero{\isacharunderscore}rel}, expressed as a binary predicate,
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1137
  describes the \emph{recursion relation} of the function
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1138
  definition. The recursion relation is a binary relation on
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1139
  the arguments of the function that relates each argument to its
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1140
  recursive calls. In general, there is one introduction rule for each
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1141
  recursive call.
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1142
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1143
  The predicate \isa{findzero{\isacharunderscore}dom} is the \emph{accessible part} of
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1144
  that relation. An argument belongs to the accessible part, if it can
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1145
  be reached in a finite number of steps. 
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1146
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1147
  Since the domain predicate is just an abbreviation, you can use
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1148
  lemmas for \isa{acc} and \isa{findzero{\isacharunderscore}rel} directly. Some
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1149
  lemmas which are occasionally useful are \isa{accI}, \isa{acc{\isacharunderscore}downward}, and of course the introduction and elimination rules
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1150
  for the recursion relation \isa{findzero{\isachardot}intros} and \isa{findzero{\isachardot}cases}.%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1151
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1152
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1153
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1154
\isamarkupsubsection{A Useful Special Case: Tail recursion%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1155
}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1156
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1157
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1158
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1159
The domain predicate is our trick that allows us to model partiality
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1160
  in a world of total functions. The downside of this is that we have
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1161
  to carry it around all the time. The termination proof above allowed
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1162
  us to replace the abstract \isa{findzero{\isacharunderscore}dom\ {\isacharparenleft}f{\isacharcomma}\ n{\isacharparenright}} by the more
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1163
  concrete \isa{n\ {\isasymle}\ x\ {\isasymand}\ f\ x\ {\isacharequal}\ {\isacharparenleft}{\isadigit{0}}{\isasymColon}{\isacharprime}b{\isacharparenright}}, but the condition is still
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1164
  there and it won't go away soon. 
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1165
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1166
  In particular, the domain predicate guard the unfolding of our
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1167
  function, since it is there as a condition in the \isa{psimp}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1168
  rules. 
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1169
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1170
  On the other hand, we must be happy about the domain predicate,
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1171
  since it guarantees that all this is at all possible without losing
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1172
  consistency. 
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1173
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1174
  Now there is an important special case: We can actually get rid
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1175
  of the condition in the simplification rules, \emph{if the function
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1176
  is tail-recursive}. The reason is that for all tail-recursive
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1177
  equations there is a total function satisfying them, even if they
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1178
  are non-terminating. 
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1179
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1180
  The function package internally does the right construction and can
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1181
  derive the unconditional simp rules, if we ask it to do so. Luckily,
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1182
  our \isa{findzero} function is tail-recursive, so we can just go
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1183
  back and add another option to the \cmd{function} command:
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1184
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1185
\noindent\cmd{function} \isa{{\isacharparenleft}domintros{\isacharcomma}\ tailrec{\isacharparenright}\ findzero\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}{\isacharparenleft}nat\ {\isasymRightarrow}\ nat{\isacharparenright}\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ nat{\isachardoublequote}}\\%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1186
\cmd{where}\isanewline%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1187
\ \ \ldots\\%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1188
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1189
  
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1190
  Now, we actually get the unconditional simplification rules, even
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1191
  though the function is partial:%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1192
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1193
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1194
\isacommand{thm}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1195
\ findzero{\isachardot}simps%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1196
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1197
\begin{isabelle}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1198
findzero\ {\isacharquery}f\ {\isacharquery}n\ {\isacharequal}\ {\isacharparenleft}if\ {\isacharquery}f\ {\isacharquery}n\ {\isacharequal}\ {\isadigit{0}}\ then\ {\isacharquery}n\ else\ findzero\ {\isacharquery}f\ {\isacharparenleft}Suc\ {\isacharquery}n{\isacharparenright}{\isacharparenright}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1199
\end{isabelle}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1200
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1201
  Of course these would make the simplifier loop, so we better remove
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1202
  them from the simpset:%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1203
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1204
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1205
\isacommand{declare}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1206
\ findzero{\isachardot}simps{\isacharbrackleft}simp\ del{\isacharbrackright}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1207
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1208
\fixme{Code generation ???}%
22065
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
  1209
\end{isamarkuptext}%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
  1210
\isamarkuptrue%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
  1211
%
cdd077905eee added sections on mutual induction and patterns
krauss
parents: 21346
diff changeset
  1212
\isamarkupsection{Nested recursion%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1213
}
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1214
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1215
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1216
\begin{isamarkuptext}%
23003
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1217
Recursive calls which are nested in one another frequently cause
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1218
  complications, since their termination proof can depend on a partial
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1219
  correctness property of the function itself. 
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1220
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1221
  As a small example, we define the \qt{nested zero} function:%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1222
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1223
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1224
\isacommand{function}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1225
\ nz\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1226
\isakeyword{where}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1227
\ \ {\isachardoublequoteopen}nz\ {\isadigit{0}}\ {\isacharequal}\ {\isadigit{0}}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1228
{\isacharbar}\ {\isachardoublequoteopen}nz\ {\isacharparenleft}Suc\ n{\isacharparenright}\ {\isacharequal}\ nz\ {\isacharparenleft}nz\ n{\isacharparenright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1229
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1230
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1231
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1232
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1233
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1234
\isatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1235
\isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1236
\ pat{\isacharunderscore}completeness\ auto%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1237
\endisatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1238
{\isafoldproof}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1239
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1240
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1241
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1242
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1243
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1244
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1245
If we attempt to prove termination using the identity measure on
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1246
  naturals, this fails:%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1247
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1248
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1249
\isacommand{termination}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1250
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1251
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1252
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1253
\ \ %
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1254
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1255
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1256
\isatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1257
\isacommand{apply}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1258
\ {\isacharparenleft}relation\ {\isachardoublequoteopen}measure\ {\isacharparenleft}{\isasymlambda}n{\isachardot}\ n{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1259
\ \ \isacommand{apply}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1260
\ auto%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1261
\begin{isamarkuptxt}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1262
We get stuck with the subgoal
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1263
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1264
  \begin{isabelle}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1265
\ {\isadigit{1}}{\isachardot}\ {\isasymAnd}n{\isachardot}\ nz{\isacharunderscore}dom\ n\ {\isasymLongrightarrow}\ nz\ n\ {\isacharless}\ Suc\ n%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1266
\end{isabelle}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1267
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1268
  Of course this statement is true, since we know that \isa{nz} is
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1269
  the zero function. And in fact we have no problem proving this
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1270
  property by induction.%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1271
\end{isamarkuptxt}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1272
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1273
\isacommand{oops}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1274
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1275
\endisatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1276
{\isafoldproof}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1277
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1278
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1279
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1280
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1281
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1282
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1283
\isacommand{lemma}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1284
\ nz{\isacharunderscore}is{\isacharunderscore}zero{\isacharcolon}\ {\isachardoublequoteopen}nz{\isacharunderscore}dom\ n\ {\isasymLongrightarrow}\ nz\ n\ {\isacharequal}\ {\isadigit{0}}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1285
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1286
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1287
\ \ %
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1288
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1289
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1290
\isatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1291
\isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1292
\ {\isacharparenleft}induct\ rule{\isacharcolon}nz{\isachardot}pinduct{\isacharparenright}\ auto%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1293
\endisatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1294
{\isafoldproof}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1295
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1296
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1297
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1298
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1299
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1300
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1301
We formulate this as a partial correctness lemma with the condition
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1302
  \isa{nz{\isacharunderscore}dom\ n}. This allows us to prove it with the \isa{pinduct} rule before we have proved termination. With this lemma,
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1303
  the termination proof works as expected:%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1304
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1305
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1306
\isacommand{termination}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1307
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1308
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1309
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1310
\ \ %
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1311
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1312
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1313
\isatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1314
\isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1315
\ {\isacharparenleft}relation\ {\isachardoublequoteopen}measure\ {\isacharparenleft}{\isasymlambda}n{\isachardot}\ n{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}\ {\isacharparenleft}auto\ simp{\isacharcolon}\ nz{\isacharunderscore}is{\isacharunderscore}zero{\isacharparenright}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1316
\endisatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1317
{\isafoldproof}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1318
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1319
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1320
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1321
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1322
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1323
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1324
As a general strategy, one should prove the statements needed for
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1325
  termination as a partial property first. Then they can be used to do
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1326
  the termination proof. This also works for less trivial
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1327
  examples. Figure \ref{f91} defines the well-known 91-function by
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1328
  McCarthy \cite{?} and proves its termination.%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1329
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1330
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1331
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1332
\begin{figure}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1333
\begin{center}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1334
\begin{minipage}{0.8\textwidth}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1335
\isabellestyle{it}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1336
\isastyle\isamarkuptrue
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1337
\isacommand{function}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1338
\ f{\isadigit{9}}{\isadigit{1}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isacharequal}{\isachargreater}\ nat{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1339
\isakeyword{where}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1340
\ \ {\isachardoublequoteopen}f{\isadigit{9}}{\isadigit{1}}\ n\ {\isacharequal}\ {\isacharparenleft}if\ {\isadigit{1}}{\isadigit{0}}{\isadigit{0}}\ {\isacharless}\ n\ then\ n\ {\isacharminus}\ {\isadigit{1}}{\isadigit{0}}\ else\ f{\isadigit{9}}{\isadigit{1}}\ {\isacharparenleft}f{\isadigit{9}}{\isadigit{1}}\ {\isacharparenleft}n\ {\isacharplus}\ {\isadigit{1}}{\isadigit{1}}{\isacharparenright}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1341
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1342
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1343
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1344
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1345
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1346
\isatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1347
\isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1348
\ pat{\isacharunderscore}completeness\ auto%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1349
\endisatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1350
{\isafoldproof}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1351
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1352
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1353
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1354
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1355
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1356
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1357
\isacommand{lemma}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1358
\ f{\isadigit{9}}{\isadigit{1}}{\isacharunderscore}estimate{\isacharcolon}\ \isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1359
\ \ \isakeyword{assumes}\ trm{\isacharcolon}\ {\isachardoublequoteopen}f{\isadigit{9}}{\isadigit{1}}{\isacharunderscore}dom\ n{\isachardoublequoteclose}\ \isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1360
\ \ \isakeyword{shows}\ {\isachardoublequoteopen}n\ {\isacharless}\ f{\isadigit{9}}{\isadigit{1}}\ n\ {\isacharplus}\ {\isadigit{1}}{\isadigit{1}}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1361
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1362
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1363
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1364
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1365
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1366
\isatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1367
\isacommand{using}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1368
\ trm\ \isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1369
\ induct\ auto%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1370
\endisatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1371
{\isafoldproof}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1372
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1373
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1374
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1375
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1376
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1377
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1378
\isacommand{termination}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1379
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1380
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1381
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1382
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1383
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1384
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1385
\isatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1386
\isacommand{proof}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1387
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1388
\ \ \isacommand{let}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1389
\ {\isacharquery}R\ {\isacharequal}\ {\isachardoublequoteopen}measure\ {\isacharparenleft}{\isasymlambda}x{\isachardot}\ {\isadigit{1}}{\isadigit{0}}{\isadigit{1}}\ {\isacharminus}\ x{\isacharparenright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1390
\ \ \isacommand{show}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1391
\ {\isachardoublequoteopen}wf\ {\isacharquery}R{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1392
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1393
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1394
\ \ \isacommand{fix}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1395
\ n\ {\isacharcolon}{\isacharcolon}\ nat\ \isacommand{assume}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1396
\ {\isachardoublequoteopen}{\isasymnot}\ {\isadigit{1}}{\isadigit{0}}{\isadigit{0}}\ {\isacharless}\ n{\isachardoublequoteclose}\ %
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1397
\isamarkupcmt{Assumptions for both calls%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1398
}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1399
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1400
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1401
\ \ \isacommand{thus}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1402
\ {\isachardoublequoteopen}{\isacharparenleft}n\ {\isacharplus}\ {\isadigit{1}}{\isadigit{1}}{\isacharcomma}\ n{\isacharparenright}\ {\isasymin}\ {\isacharquery}R{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1403
\ simp\ %
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1404
\isamarkupcmt{Inner call%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1405
}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1406
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1407
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1408
\ \ \isacommand{assume}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1409
\ inner{\isacharunderscore}trm{\isacharcolon}\ {\isachardoublequoteopen}f{\isadigit{9}}{\isadigit{1}}{\isacharunderscore}dom\ {\isacharparenleft}n\ {\isacharplus}\ {\isadigit{1}}{\isadigit{1}}{\isacharparenright}{\isachardoublequoteclose}\ %
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1410
\isamarkupcmt{Outer call%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1411
}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1412
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1413
\ \ \isacommand{with}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1414
\ f{\isadigit{9}}{\isadigit{1}}{\isacharunderscore}estimate\ \isacommand{have}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1415
\ {\isachardoublequoteopen}n\ {\isacharplus}\ {\isadigit{1}}{\isadigit{1}}\ {\isacharless}\ f{\isadigit{9}}{\isadigit{1}}\ {\isacharparenleft}n\ {\isacharplus}\ {\isadigit{1}}{\isadigit{1}}{\isacharparenright}\ {\isacharplus}\ {\isadigit{1}}{\isadigit{1}}{\isachardoublequoteclose}\ \isacommand{{\isachardot}}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1416
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1417
\ \ \isacommand{with}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1418
\ {\isacharbackquoteopen}{\isasymnot}\ {\isadigit{1}}{\isadigit{0}}{\isadigit{0}}\ {\isacharless}\ n{\isacharbackquoteclose}\ \isacommand{show}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1419
\ {\isachardoublequoteopen}{\isacharparenleft}f{\isadigit{9}}{\isadigit{1}}\ {\isacharparenleft}n\ {\isacharplus}\ {\isadigit{1}}{\isadigit{1}}{\isacharparenright}{\isacharcomma}\ n{\isacharparenright}\ {\isasymin}\ {\isacharquery}R{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1420
\ simp\ \isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1421
\isacommand{qed}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1422
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1423
\endisatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1424
{\isafoldproof}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1425
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1426
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1427
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1428
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1429
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1430
\isamarkupfalse\isabellestyle{tt}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1431
\end{minipage}\end{center}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1432
\caption{McCarthy's 91-function}\label{f91}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1433
\end{figure}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1434
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1435
\isamarkupsection{Higher-Order Recursion%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1436
}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1437
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1438
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1439
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1440
Higher-order recursion occurs when recursive calls
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1441
  are passed as arguments to higher-order combinators such as \isa{map}, \isa{filter} etc.
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1442
  As an example, imagine a data type of n-ary trees:%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1443
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1444
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1445
\isacommand{datatype}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1446
\ {\isacharprime}a\ tree\ {\isacharequal}\ \isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1447
\ \ Leaf\ {\isacharprime}a\ \isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1448
{\isacharbar}\ Branch\ {\isachardoublequoteopen}{\isacharprime}a\ tree\ list{\isachardoublequoteclose}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1449
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1450
\noindent We can define a map function for trees, using the predefined
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1451
  map function for lists.%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1452
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1453
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1454
\isacommand{function}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1455
\ treemap\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharparenleft}{\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a{\isacharparenright}\ {\isasymRightarrow}\ {\isacharprime}a\ tree\ {\isasymRightarrow}\ {\isacharprime}a\ tree{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1456
\isakeyword{where}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1457
\ \ {\isachardoublequoteopen}treemap\ f\ {\isacharparenleft}Leaf\ n{\isacharparenright}\ {\isacharequal}\ Leaf\ {\isacharparenleft}f\ n{\isacharparenright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1458
{\isacharbar}\ {\isachardoublequoteopen}treemap\ f\ {\isacharparenleft}Branch\ l{\isacharparenright}\ {\isacharequal}\ Branch\ {\isacharparenleft}map\ {\isacharparenleft}treemap\ f{\isacharparenright}\ l{\isacharparenright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1459
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1460
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1461
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1462
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1463
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1464
\isatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1465
\isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1466
\ pat{\isacharunderscore}completeness\ auto%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1467
\endisatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1468
{\isafoldproof}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1469
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1470
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1471
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1472
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1473
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1474
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1475
We do the termination proof manually, to point out what happens
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1476
  here:%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1477
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1478
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1479
\isacommand{termination}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1480
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1481
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1482
\ %
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1483
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1484
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1485
\isatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1486
\isacommand{proof}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1487
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1488
\begin{isamarkuptxt}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1489
As usual, we have to give a wellfounded relation, such that the
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1490
  arguments of the recursive calls get smaller. But what exactly are
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1491
  the arguments of the recursive calls? Isabelle gives us the
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1492
  subgoals
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1493
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1494
  \begin{isabelle}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1495
\ {\isadigit{1}}{\isachardot}\ wf\ {\isacharquery}R\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1496
\ {\isadigit{2}}{\isachardot}\ {\isasymAnd}f\ l\ x{\isachardot}\ x\ {\isasymin}\ set\ l\ {\isasymLongrightarrow}\ {\isacharparenleft}{\isacharparenleft}f{\isacharcomma}\ x{\isacharparenright}{\isacharcomma}\ f{\isacharcomma}\ Branch\ l{\isacharparenright}\ {\isasymin}\ {\isacharquery}R%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1497
\end{isabelle} 
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1498
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1499
  So Isabelle seems to know that \isa{map} behaves nicely and only
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1500
  applies the recursive call \isa{treemap\ f} to elements
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1501
  of \isa{l}. Before we discuss where this knowledge comes from,
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1502
  let us finish the termination proof:%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1503
\end{isamarkuptxt}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1504
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1505
\ \ \isacommand{show}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1506
\ {\isachardoublequoteopen}wf\ {\isacharparenleft}measure\ {\isacharparenleft}size\ o\ snd{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1507
\ simp\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1508
\isacommand{next}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1509
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1510
\ \ \isacommand{fix}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1511
\ f\ l\ \isakeyword{and}\ x\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ tree{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1512
\ \ \isacommand{assume}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1513
\ {\isachardoublequoteopen}x\ {\isasymin}\ set\ l{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1514
\ \ \isacommand{thus}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1515
\ {\isachardoublequoteopen}{\isacharparenleft}{\isacharparenleft}f{\isacharcomma}\ x{\isacharparenright}{\isacharcomma}\ {\isacharparenleft}f{\isacharcomma}\ Branch\ l{\isacharparenright}{\isacharparenright}\ {\isasymin}\ measure\ {\isacharparenleft}size\ o\ snd{\isacharparenright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1516
\ \ \ \ \isacommand{apply}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1517
\ simp%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1518
\begin{isamarkuptxt}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1519
Simplification returns the following subgoal: 
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1520
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1521
      \begin{isabelle}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1522
\ {\isadigit{1}}{\isachardot}\ x{\isacharunderscore}{\isacharunderscore}\ {\isasymin}\ set\ l{\isacharunderscore}{\isacharunderscore}\ {\isasymLongrightarrow}\ size\ x{\isacharunderscore}{\isacharunderscore}\ {\isacharless}\ Suc\ {\isacharparenleft}tree{\isacharunderscore}list{\isacharunderscore}size\ l{\isacharunderscore}{\isacharunderscore}{\isacharparenright}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1523
\end{isabelle} 
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1524
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1525
      We are lacking a property about the function \isa{tree{\isacharunderscore}list{\isacharunderscore}size}, which was generated automatically at the
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1526
      definition of the \isa{tree} type. We should go back and prove
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1527
      it, by induction.%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1528
\end{isamarkuptxt}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1529
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1530
\ \ \ \ \isacommand{oops}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1531
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1532
\endisatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1533
{\isafoldproof}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1534
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1535
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1536
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1537
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1538
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1539
\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1540
\ \ \isacommand{lemma}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1541
\ tree{\isacharunderscore}list{\isacharunderscore}size{\isacharbrackleft}simp{\isacharbrackright}{\isacharcolon}\ {\isachardoublequoteopen}x\ {\isasymin}\ set\ l\ {\isasymLongrightarrow}\ size\ x\ {\isacharless}\ Suc\ {\isacharparenleft}tree{\isacharunderscore}list{\isacharunderscore}size\ l{\isacharparenright}{\isachardoublequoteclose}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1542
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1543
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1544
\ \ \ \ %
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1545
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1546
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1547
\isatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1548
\isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1549
\ {\isacharparenleft}induct\ l{\isacharparenright}\ auto%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1550
\endisatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1551
{\isafoldproof}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1552
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1553
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1554
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1555
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1556
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1557
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1558
Now the whole termination proof is automatic:%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1559
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1560
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1561
\ \ \isacommand{termination}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1562
\ \isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1563
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1564
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1565
\ \ \ \ %
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1566
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1567
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1568
\isatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1569
\isacommand{by}\isamarkupfalse%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1570
\ lexicographic{\isacharunderscore}order%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1571
\endisatagproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1572
{\isafoldproof}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1573
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1574
\isadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1575
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1576
\endisadelimproof
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1577
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1578
\isamarkupsubsection{Congruence Rules%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1579
}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1580
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1581
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1582
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1583
Let's come back to the question how Isabelle knows about \isa{map}.
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1584
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1585
  The knowledge about map is encoded in so-called congruence rules,
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1586
  which are special theorems known to the \cmd{function} command. The
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1587
  rule for map is
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1588
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1589
  \begin{isabelle}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1590
{\isasymlbrakk}{\isacharquery}xs\ {\isacharequal}\ {\isacharquery}ys{\isacharsemicolon}\ {\isasymAnd}x{\isachardot}\ x\ {\isasymin}\ set\ {\isacharquery}ys\ {\isasymLongrightarrow}\ {\isacharquery}f\ x\ {\isacharequal}\ {\isacharquery}g\ x{\isasymrbrakk}\ {\isasymLongrightarrow}\ map\ {\isacharquery}f\ {\isacharquery}xs\ {\isacharequal}\ map\ {\isacharquery}g\ {\isacharquery}ys%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1591
\end{isabelle}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1592
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1593
  You can read this in the following way: Two applications of \isa{map} are equal, if the list arguments are equal and the functions
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1594
  coincide on the elements of the list. This means that for the value 
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1595
  \isa{map\ f\ l} we only have to know how \isa{f} behaves on
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1596
  \isa{l}.
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1597
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1598
  Usually, one such congruence rule is
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1599
  needed for each higher-order construct that is used when defining
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1600
  new functions. In fact, even basic functions like \isa{If} and \isa{Let} are handeled by this mechanism. The congruence
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1601
  rule for \isa{If} states that the \isa{then} branch is only
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1602
  relevant if the condition is true, and the \isa{else} branch only if it
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1603
  is false:
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1604
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1605
  \begin{isabelle}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1606
{\isasymlbrakk}{\isacharquery}b\ {\isacharequal}\ {\isacharquery}c{\isacharsemicolon}\ {\isacharquery}c\ {\isasymLongrightarrow}\ {\isacharquery}x\ {\isacharequal}\ {\isacharquery}u{\isacharsemicolon}\ {\isasymnot}\ {\isacharquery}c\ {\isasymLongrightarrow}\ {\isacharquery}y\ {\isacharequal}\ {\isacharquery}v{\isasymrbrakk}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1607
{\isasymLongrightarrow}\ {\isacharparenleft}if\ {\isacharquery}b\ then\ {\isacharquery}x\ else\ {\isacharquery}y{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}if\ {\isacharquery}c\ then\ {\isacharquery}u\ else\ {\isacharquery}v{\isacharparenright}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1608
\end{isabelle}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1609
  
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1610
  Congruence rules can be added to the
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1611
  function package by giving them the \isa{fundef{\isacharunderscore}cong} attribute.
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1612
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1613
  Isabelle comes with predefined congruence rules for most of the
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1614
  definitions.
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1615
  But if you define your own higher-order constructs, you will have to
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1616
  come up with the congruence rules yourself, if you want to use your
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1617
  functions in recursive definitions. Since the structure of
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1618
  congruence rules is a little unintuitive, here are some exercises:%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1619
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1620
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1621
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1622
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1623
\begin{exercise}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1624
    Find a suitable congruence rule for the following function which
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1625
  maps only over the even numbers in a list:
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1626
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1627
  \begin{isabelle}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1628
mapeven\ {\isacharquery}f\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\isasep\isanewline%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1629
mapeven\ {\isacharquery}f\ {\isacharparenleft}{\isacharquery}x\ {\isacharhash}\ {\isacharquery}xs{\isacharparenright}\ {\isacharequal}\isanewline
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1630
{\isacharparenleft}if\ {\isacharquery}x\ mod\ {\isadigit{2}}\ {\isacharequal}\ {\isadigit{0}}\ then\ {\isacharquery}f\ {\isacharquery}x\ {\isacharhash}\ mapeven\ {\isacharquery}f\ {\isacharquery}xs\ else\ {\isacharquery}x\ {\isacharhash}\ mapeven\ {\isacharquery}f\ {\isacharquery}xs{\isacharparenright}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1631
\end{isabelle}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1632
  \end{exercise}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1633
  
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1634
  \begin{exercise}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1635
  What happens if the congruence rule for \isa{If} is
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1636
  disabled by declaring \isa{if{\isacharunderscore}cong{\isacharbrackleft}fundef{\isacharunderscore}cong\ del{\isacharbrackright}}?
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1637
  \end{exercise}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1638
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1639
  Note that in some cases there is no \qt{best} congruence rule.
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1640
  \fixme%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1641
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1642
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1643
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1644
\isamarkupsection{Appendix: Predefined Congruence Rules%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1645
}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1646
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1647
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1648
\isadelimML
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1649
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1650
\endisadelimML
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1651
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1652
\isatagML
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1653
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1654
\endisatagML
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1655
{\isafoldML}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1656
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1657
\isadelimML
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1658
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1659
\endisadelimML
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1660
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1661
\isamarkupsubsection{Basic Control Structures%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1662
}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1663
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1664
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1665
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1666
\isa{\mbox{}\inferrule{\mbox{{\isacharquery}b\ {\isacharequal}\ {\isacharquery}c}\\\ \mbox{{\isacharquery}c\ {\isasymLongrightarrow}\ {\isacharquery}x\ {\isacharequal}\ {\isacharquery}u}\\\ \mbox{{\isasymnot}\ {\isacharquery}c\ {\isasymLongrightarrow}\ {\isacharquery}y\ {\isacharequal}\ {\isacharquery}v}}{\mbox{{\isacharparenleft}if\ {\isacharquery}b\ then\ {\isacharquery}x\ else\ {\isacharquery}y{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}if\ {\isacharquery}c\ then\ {\isacharquery}u\ else\ {\isacharquery}v{\isacharparenright}}}}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1667
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1668
\isa{\mbox{}\inferrule{\mbox{{\isacharquery}M\ {\isacharequal}\ {\isacharquery}N}\\\ \mbox{{\isasymAnd}x{\isachardot}\ x\ {\isacharequal}\ {\isacharquery}N\ {\isasymLongrightarrow}\ {\isacharquery}f\ x\ {\isacharequal}\ {\isacharquery}g\ x}}{\mbox{Let\ {\isacharquery}M\ {\isacharquery}f\ {\isacharequal}\ Let\ {\isacharquery}N\ {\isacharquery}g}}}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1669
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1670
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1671
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1672
\isamarkupsubsection{Data Types%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1673
}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1674
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1675
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1676
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1677
For each \cmd{datatype} definition, a congruence rule for the case
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1678
  combinator is registeres automatically. Here are the rules for
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1679
  \isa{nat} and \isa{list}:
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1680
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1681
\begin{center}\isa{\mbox{}\inferrule{\mbox{{\isacharquery}M\ {\isacharequal}\ {\isacharquery}M{\isacharprime}}\\\ \mbox{{\isacharquery}M{\isacharprime}\ {\isacharequal}\ {\isadigit{0}}\ {\isasymLongrightarrow}\ {\isacharquery}f{\isadigit{1}}{\isachardot}{\isadigit{0}}\ {\isacharequal}\ {\isacharquery}g{\isadigit{1}}{\isachardot}{\isadigit{0}}}\\\ \mbox{{\isasymAnd}nat{\isachardot}\ {\isacharquery}M{\isacharprime}\ {\isacharequal}\ Suc\ nat\ {\isasymLongrightarrow}\ {\isacharquery}f{\isadigit{2}}{\isachardot}{\isadigit{0}}\ nat\ {\isacharequal}\ {\isacharquery}g{\isadigit{2}}{\isachardot}{\isadigit{0}}\ nat}}{\mbox{nat{\isacharunderscore}case\ {\isacharquery}f{\isadigit{1}}{\isachardot}{\isadigit{0}}\ {\isacharquery}f{\isadigit{2}}{\isachardot}{\isadigit{0}}\ {\isacharquery}M\ {\isacharequal}\ nat{\isacharunderscore}case\ {\isacharquery}g{\isadigit{1}}{\isachardot}{\isadigit{0}}\ {\isacharquery}g{\isadigit{2}}{\isachardot}{\isadigit{0}}\ {\isacharquery}M{\isacharprime}}}}\end{center}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1682
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1683
\begin{center}\isa{\mbox{}\inferrule{\mbox{{\isacharquery}M\ {\isacharequal}\ {\isacharquery}M{\isacharprime}}\\\ \mbox{{\isacharquery}M{\isacharprime}\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymLongrightarrow}\ {\isacharquery}f{\isadigit{1}}{\isachardot}{\isadigit{0}}\ {\isacharequal}\ {\isacharquery}g{\isadigit{1}}{\isachardot}{\isadigit{0}}}\\\ \mbox{{\isasymAnd}a\ list{\isachardot}\ {\isacharquery}M{\isacharprime}\ {\isacharequal}\ a\ {\isacharhash}\ list\ {\isasymLongrightarrow}\ {\isacharquery}f{\isadigit{2}}{\isachardot}{\isadigit{0}}\ a\ list\ {\isacharequal}\ {\isacharquery}g{\isadigit{2}}{\isachardot}{\isadigit{0}}\ a\ list}}{\mbox{list{\isacharunderscore}case\ {\isacharquery}f{\isadigit{1}}{\isachardot}{\isadigit{0}}\ {\isacharquery}f{\isadigit{2}}{\isachardot}{\isadigit{0}}\ {\isacharquery}M\ {\isacharequal}\ list{\isacharunderscore}case\ {\isacharquery}g{\isadigit{1}}{\isachardot}{\isadigit{0}}\ {\isacharquery}g{\isadigit{2}}{\isachardot}{\isadigit{0}}\ {\isacharquery}M{\isacharprime}}}}\end{center}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1684
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1685
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1686
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1687
\isamarkupsubsection{List combinators%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1688
}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1689
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1690
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1691
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1692
\isa{\mbox{}\inferrule{\mbox{{\isacharquery}xs\ {\isacharequal}\ {\isacharquery}ys}\\\ \mbox{{\isasymAnd}x{\isachardot}\ x\ {\isasymin}\ set\ {\isacharquery}ys\ {\isasymLongrightarrow}\ {\isacharquery}f\ x\ {\isacharequal}\ {\isacharquery}g\ x}}{\mbox{map\ {\isacharquery}f\ {\isacharquery}xs\ {\isacharequal}\ map\ {\isacharquery}g\ {\isacharquery}ys}}}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1693
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1694
\isa{\mbox{}\inferrule{\mbox{{\isacharquery}xs\ {\isacharequal}\ {\isacharquery}ys}\\\ \mbox{{\isasymAnd}x{\isachardot}\ x\ {\isasymin}\ set\ {\isacharquery}ys\ {\isasymLongrightarrow}\ {\isacharquery}P\ x\ {\isacharequal}\ {\isacharquery}Q\ x}}{\mbox{filter\ {\isacharquery}P\ {\isacharquery}xs\ {\isacharequal}\ filter\ {\isacharquery}Q\ {\isacharquery}ys}}}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1695
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1696
\isa{\mbox{}\inferrule{\mbox{{\isacharquery}a\ {\isacharequal}\ {\isacharquery}b}\\\ \mbox{{\isacharquery}l\ {\isacharequal}\ {\isacharquery}k}\\\ \mbox{{\isasymAnd}a\ x{\isachardot}\ x\ {\isasymin}\ set\ {\isacharquery}l\ {\isasymLongrightarrow}\ {\isacharquery}f\ x\ a\ {\isacharequal}\ {\isacharquery}g\ x\ a}}{\mbox{foldr\ {\isacharquery}f\ {\isacharquery}l\ {\isacharquery}a\ {\isacharequal}\ foldr\ {\isacharquery}g\ {\isacharquery}k\ {\isacharquery}b}}}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1697
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1698
\isa{\mbox{}\inferrule{\mbox{{\isacharquery}a\ {\isacharequal}\ {\isacharquery}b}\\\ \mbox{{\isacharquery}l\ {\isacharequal}\ {\isacharquery}k}\\\ \mbox{{\isasymAnd}a\ x{\isachardot}\ x\ {\isasymin}\ set\ {\isacharquery}l\ {\isasymLongrightarrow}\ {\isacharquery}f\ a\ x\ {\isacharequal}\ {\isacharquery}g\ a\ x}}{\mbox{foldl\ {\isacharquery}f\ {\isacharquery}a\ {\isacharquery}l\ {\isacharequal}\ foldl\ {\isacharquery}g\ {\isacharquery}b\ {\isacharquery}k}}}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1699
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1700
Similar: takewhile, dropwhile%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1701
\end{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1702
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1703
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1704
\isamarkupsubsection{Sets%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1705
}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1706
\isamarkuptrue%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1707
%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1708
\begin{isamarkuptext}%
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1709
\isa{\mbox{}\inferrule{\mbox{{\isacharquery}A\ {\isacharequal}\ {\isacharquery}B}\\\ \mbox{{\isasymAnd}x{\isachardot}\ x\ {\isasymin}\ {\isacharquery}B\ {\isasymLongrightarrow}\ {\isacharquery}P\ x\ {\isacharequal}\ {\isacharquery}Q\ x}}{\mbox{{\isacharparenleft}{\isasymforall}x{\isasymin}{\isacharquery}A{\isachardot}\ {\isacharquery}P\ x{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}{\isasymforall}x{\isasymin}{\isacharquery}B{\isachardot}\ {\isacharquery}Q\ x{\isacharparenright}}}}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1710
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1711
\isa{\mbox{}\inferrule{\mbox{{\isacharquery}A\ {\isacharequal}\ {\isacharquery}B}\\\ \mbox{{\isasymAnd}x{\isachardot}\ x\ {\isasymin}\ {\isacharquery}B\ {\isasymLongrightarrow}\ {\isacharquery}P\ x\ {\isacharequal}\ {\isacharquery}Q\ x}}{\mbox{{\isacharparenleft}{\isasymexists}x{\isasymin}{\isacharquery}A{\isachardot}\ {\isacharquery}P\ x{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}{\isasymexists}x{\isasymin}{\isacharquery}B{\isachardot}\ {\isacharquery}Q\ x{\isacharparenright}}}}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1712
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1713
\isa{\mbox{}\inferrule{\mbox{{\isacharquery}A\ {\isacharequal}\ {\isacharquery}B}\\\ \mbox{{\isasymAnd}x{\isachardot}\ x\ {\isasymin}\ {\isacharquery}B\ {\isasymLongrightarrow}\ {\isacharquery}C\ x\ {\isacharequal}\ {\isacharquery}D\ x}}{\mbox{{\isacharparenleft}{\isasymUnion}\isactrlbsub x{\isasymin}{\isacharquery}A\isactrlesub \ {\isacharquery}C\ x{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}{\isasymUnion}\isactrlbsub x{\isasymin}{\isacharquery}B\isactrlesub \ {\isacharquery}D\ x{\isacharparenright}}}}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1714
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1715
\isa{\mbox{}\inferrule{\mbox{{\isacharquery}A\ {\isacharequal}\ {\isacharquery}B}\\\ \mbox{{\isasymAnd}x{\isachardot}\ x\ {\isasymin}\ {\isacharquery}B\ {\isasymLongrightarrow}\ {\isacharquery}C\ x\ {\isacharequal}\ {\isacharquery}D\ x}}{\mbox{{\isacharparenleft}{\isasymInter}\isactrlbsub x{\isasymin}{\isacharquery}A\isactrlesub \ {\isacharquery}C\ x{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}{\isasymInter}\isactrlbsub x{\isasymin}{\isacharquery}B\isactrlesub \ {\isacharquery}D\ x{\isacharparenright}}}}
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1716
4b0bf04a4d68 updated
krauss
parents: 22065
diff changeset
  1717
\isa{\mbox{}\inferrule{\mbox{{\isacharquery}M\ {\isacharequal}\ {\isacharquery}N}\\\ \mbox{{\isasymAnd}x{\isachardot}\ x\ {\isasymin}\ {\isacharquery}N\ {\isasymLongrightarrow}\ {\isacharquery}f\ x\ {\isacharequal}\ {\isacharquery}g\ x}}{\mbox{{\isacharquery}f\ {\isacharbackquote}\ {\isacharquery}M\ {\isacharequal}\ {\isacharquery}g\ {\isacharbackquote}\ {\isacharquery}N}}}%
21212
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1718
\end{isamarkuptext}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1719
\isamarkuptrue%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1720
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1721
\isadelimtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1722
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1723
\endisadelimtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1724
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1725
\isatagtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1726
\isacommand{end}\isamarkupfalse%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1727
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1728
\endisatagtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1729
{\isafoldtheory}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1730
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1731
\isadelimtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1732
%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1733
\endisadelimtheory
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1734
\isanewline
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1735
\end{isabellebody}%
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1736
%%% Local Variables:
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1737
%%% mode: latex
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1738
%%% TeX-master: "root"
547224bf9348 Added a (stub of a) function tutorial
krauss
parents:
diff changeset
  1739
%%% End: