doc-src/IsarAdvanced/Codegen/Thy/document/Program.tex
author wenzelm
Sun, 28 Dec 2008 23:20:57 +0100
changeset 29186 3d25e96ceb98
parent 28727 185110a4b97a
child 29297 62e0f892e525
permissions -rw-r--r--
disabled old jedit plugin;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28447
haftmann
parents:
diff changeset
     1
%
haftmann
parents:
diff changeset
     2
\begin{isabellebody}%
haftmann
parents:
diff changeset
     3
\def\isabellecontext{Program}%
haftmann
parents:
diff changeset
     4
%
haftmann
parents:
diff changeset
     5
\isadelimtheory
haftmann
parents:
diff changeset
     6
%
haftmann
parents:
diff changeset
     7
\endisadelimtheory
haftmann
parents:
diff changeset
     8
%
haftmann
parents:
diff changeset
     9
\isatagtheory
haftmann
parents:
diff changeset
    10
\isacommand{theory}\isamarkupfalse%
haftmann
parents:
diff changeset
    11
\ Program\isanewline
haftmann
parents:
diff changeset
    12
\isakeyword{imports}\ Introduction\isanewline
haftmann
parents:
diff changeset
    13
\isakeyword{begin}%
haftmann
parents:
diff changeset
    14
\endisatagtheory
haftmann
parents:
diff changeset
    15
{\isafoldtheory}%
haftmann
parents:
diff changeset
    16
%
haftmann
parents:
diff changeset
    17
\isadelimtheory
haftmann
parents:
diff changeset
    18
%
haftmann
parents:
diff changeset
    19
\endisadelimtheory
haftmann
parents:
diff changeset
    20
%
haftmann
parents:
diff changeset
    21
\isamarkupsection{Turning Theories into Programs \label{sec:program}%
haftmann
parents:
diff changeset
    22
}
haftmann
parents:
diff changeset
    23
\isamarkuptrue%
haftmann
parents:
diff changeset
    24
%
haftmann
parents:
diff changeset
    25
\isamarkupsubsection{The \isa{Isabelle{\isacharslash}HOL} default setup%
haftmann
parents:
diff changeset
    26
}
haftmann
parents:
diff changeset
    27
\isamarkuptrue%
haftmann
parents:
diff changeset
    28
%
haftmann
parents:
diff changeset
    29
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
    30
We have already seen how by default equations stemming from
haftmann
parents:
diff changeset
    31
  \hyperlink{command.definition}{\mbox{\isa{\isacommand{definition}}}}/\hyperlink{command.primrec}{\mbox{\isa{\isacommand{primrec}}}}/\hyperlink{command.fun}{\mbox{\isa{\isacommand{fun}}}}
haftmann
parents:
diff changeset
    32
  statements are used for code generation.  This default behaviour
haftmann
parents:
diff changeset
    33
  can be changed, e.g. by providing different defining equations.
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28564
diff changeset
    34
  All kinds of customisation shown in this section is \emph{safe}
28447
haftmann
parents:
diff changeset
    35
  in the sense that the user does not have to worry about
haftmann
parents:
diff changeset
    36
  correctness -- all programs generatable that way are partially
haftmann
parents:
diff changeset
    37
  correct.%
haftmann
parents:
diff changeset
    38
\end{isamarkuptext}%
haftmann
parents:
diff changeset
    39
\isamarkuptrue%
haftmann
parents:
diff changeset
    40
%
haftmann
parents:
diff changeset
    41
\isamarkupsubsection{Selecting code equations%
haftmann
parents:
diff changeset
    42
}
haftmann
parents:
diff changeset
    43
\isamarkuptrue%
haftmann
parents:
diff changeset
    44
%
haftmann
parents:
diff changeset
    45
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
    46
Coming back to our introductory example, we
haftmann
parents:
diff changeset
    47
  could provide an alternative defining equations for \isa{dequeue}
haftmann
parents:
diff changeset
    48
  explicitly:%
haftmann
parents:
diff changeset
    49
\end{isamarkuptext}%
haftmann
parents:
diff changeset
    50
\isamarkuptrue%
haftmann
parents:
diff changeset
    51
%
28564
haftmann
parents: 28562
diff changeset
    52
\isadelimquote
28447
haftmann
parents:
diff changeset
    53
%
28564
haftmann
parents: 28562
diff changeset
    54
\endisadelimquote
28447
haftmann
parents:
diff changeset
    55
%
28564
haftmann
parents: 28562
diff changeset
    56
\isatagquote
28447
haftmann
parents:
diff changeset
    57
\isacommand{lemma}\isamarkupfalse%
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 28462
diff changeset
    58
\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
28447
haftmann
parents:
diff changeset
    59
\ \ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}Queue\ xs\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\isanewline
28456
haftmann
parents: 28447
diff changeset
    60
\ \ \ \ \ {\isacharparenleft}if\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ then\ {\isacharparenleft}None{\isacharcomma}\ Queue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\isanewline
haftmann
parents: 28447
diff changeset
    61
\ \ \ \ \ \ \ else\ dequeue\ {\isacharparenleft}Queue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharparenleft}rev\ xs{\isacharparenright}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
28447
haftmann
parents:
diff changeset
    62
\ \ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}Queue\ xs\ {\isacharparenleft}y\ {\isacharhash}\ ys{\isacharparenright}{\isacharparenright}\ {\isacharequal}\isanewline
haftmann
parents:
diff changeset
    63
\ \ \ \ \ {\isacharparenleft}Some\ y{\isacharcomma}\ Queue\ xs\ ys{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
    64
\ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
    65
\ {\isacharparenleft}cases\ xs{\isacharcomma}\ simp{\isacharunderscore}all{\isacharparenright}\ {\isacharparenleft}cases\ {\isachardoublequoteopen}rev\ xs{\isachardoublequoteclose}{\isacharcomma}\ simp{\isacharunderscore}all{\isacharparenright}%
28564
haftmann
parents: 28562
diff changeset
    66
\endisatagquote
haftmann
parents: 28562
diff changeset
    67
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
    68
%
28564
haftmann
parents: 28562
diff changeset
    69
\isadelimquote
28447
haftmann
parents:
diff changeset
    70
%
28564
haftmann
parents: 28562
diff changeset
    71
\endisadelimquote
28447
haftmann
parents:
diff changeset
    72
%
haftmann
parents:
diff changeset
    73
\begin{isamarkuptext}%
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 28462
diff changeset
    74
\noindent The annotation \isa{{\isacharbrackleft}code{\isacharbrackright}} is an \isa{Isar}
28447
haftmann
parents:
diff changeset
    75
  \isa{attribute} which states that the given theorems should be
haftmann
parents:
diff changeset
    76
  considered as defining equations for a \isa{fun} statement --
haftmann
parents:
diff changeset
    77
  the corresponding constant is determined syntactically.  The resulting code:%
haftmann
parents:
diff changeset
    78
\end{isamarkuptext}%
haftmann
parents:
diff changeset
    79
\isamarkuptrue%
haftmann
parents:
diff changeset
    80
%
28564
haftmann
parents: 28562
diff changeset
    81
\isadelimquote
28447
haftmann
parents:
diff changeset
    82
%
28564
haftmann
parents: 28562
diff changeset
    83
\endisadelimquote
28447
haftmann
parents:
diff changeset
    84
%
28564
haftmann
parents: 28562
diff changeset
    85
\isatagquote
28447
haftmann
parents:
diff changeset
    86
%
haftmann
parents:
diff changeset
    87
\begin{isamarkuptext}%
28727
185110a4b97a clarified verbatim vs. typewriter
haftmann
parents: 28714
diff changeset
    88
\isatypewriter%
28447
haftmann
parents:
diff changeset
    89
\noindent%
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
    90
\hspace*{0pt}dequeue ::~forall a. Queue a -> (Maybe a, Queue a);\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
    91
\hspace*{0pt}dequeue (Queue xs (y :~ys)) = (Just y, Queue xs ys);\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
    92
\hspace*{0pt}dequeue (Queue xs []) =\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
    93
\hspace*{0pt} ~(if nulla xs then (Nothing, Queue [] [])\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
    94
\hspace*{0pt} ~~~else dequeue (Queue [] (rev xs)));%
28447
haftmann
parents:
diff changeset
    95
\end{isamarkuptext}%
haftmann
parents:
diff changeset
    96
\isamarkuptrue%
haftmann
parents:
diff changeset
    97
%
28564
haftmann
parents: 28562
diff changeset
    98
\endisatagquote
haftmann
parents: 28562
diff changeset
    99
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   100
%
28564
haftmann
parents: 28562
diff changeset
   101
\isadelimquote
28447
haftmann
parents:
diff changeset
   102
%
28564
haftmann
parents: 28562
diff changeset
   103
\endisadelimquote
28447
haftmann
parents:
diff changeset
   104
%
haftmann
parents:
diff changeset
   105
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   106
\noindent You may note that the equality test \isa{xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}} has been
haftmann
parents:
diff changeset
   107
  replaced by the predicate \isa{null\ xs}.  This is due to the default
haftmann
parents:
diff changeset
   108
  setup in the \qn{preprocessor} to be discussed further below (\secref{sec:preproc}).
haftmann
parents:
diff changeset
   109
haftmann
parents:
diff changeset
   110
  Changing the default constructor set of datatypes is also
haftmann
parents:
diff changeset
   111
  possible but rarely desired in practice.  See \secref{sec:datatypes} for an example.
haftmann
parents:
diff changeset
   112
haftmann
parents:
diff changeset
   113
  As told in \secref{sec:concept}, code generation is based
haftmann
parents:
diff changeset
   114
  on a structured collection of code theorems.
haftmann
parents:
diff changeset
   115
  For explorative purpose, this collection
haftmann
parents:
diff changeset
   116
  may be inspected using the \hyperlink{command.code-thms}{\mbox{\isa{\isacommand{code{\isacharunderscore}thms}}}} command:%
haftmann
parents:
diff changeset
   117
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   118
\isamarkuptrue%
haftmann
parents:
diff changeset
   119
%
28564
haftmann
parents: 28562
diff changeset
   120
\isadelimquote
28447
haftmann
parents:
diff changeset
   121
%
28564
haftmann
parents: 28562
diff changeset
   122
\endisadelimquote
28447
haftmann
parents:
diff changeset
   123
%
28564
haftmann
parents: 28562
diff changeset
   124
\isatagquote
28447
haftmann
parents:
diff changeset
   125
\isacommand{code{\isacharunderscore}thms}\isamarkupfalse%
haftmann
parents:
diff changeset
   126
\ dequeue%
28564
haftmann
parents: 28562
diff changeset
   127
\endisatagquote
haftmann
parents: 28562
diff changeset
   128
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   129
%
28564
haftmann
parents: 28562
diff changeset
   130
\isadelimquote
28447
haftmann
parents:
diff changeset
   131
%
28564
haftmann
parents: 28562
diff changeset
   132
\endisadelimquote
28447
haftmann
parents:
diff changeset
   133
%
haftmann
parents:
diff changeset
   134
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   135
\noindent prints a table with \emph{all} defining equations
haftmann
parents:
diff changeset
   136
  for \isa{dequeue}, including
haftmann
parents:
diff changeset
   137
  \emph{all} defining equations those equations depend
haftmann
parents:
diff changeset
   138
  on recursively.
haftmann
parents:
diff changeset
   139
  
haftmann
parents:
diff changeset
   140
  Similarly, the \hyperlink{command.code-deps}{\mbox{\isa{\isacommand{code{\isacharunderscore}deps}}}} command shows a graph
haftmann
parents:
diff changeset
   141
  visualising dependencies between defining equations.%
haftmann
parents:
diff changeset
   142
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   143
\isamarkuptrue%
haftmann
parents:
diff changeset
   144
%
haftmann
parents:
diff changeset
   145
\isamarkupsubsection{\isa{class} and \isa{instantiation}%
haftmann
parents:
diff changeset
   146
}
haftmann
parents:
diff changeset
   147
\isamarkuptrue%
haftmann
parents:
diff changeset
   148
%
haftmann
parents:
diff changeset
   149
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   150
Concerning type classes and code generation, let us examine an example
haftmann
parents:
diff changeset
   151
  from abstract algebra:%
haftmann
parents:
diff changeset
   152
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   153
\isamarkuptrue%
haftmann
parents:
diff changeset
   154
%
28564
haftmann
parents: 28562
diff changeset
   155
\isadelimquote
28447
haftmann
parents:
diff changeset
   156
%
28564
haftmann
parents: 28562
diff changeset
   157
\endisadelimquote
28447
haftmann
parents:
diff changeset
   158
%
28564
haftmann
parents: 28562
diff changeset
   159
\isatagquote
28447
haftmann
parents:
diff changeset
   160
\isacommand{class}\isamarkupfalse%
haftmann
parents:
diff changeset
   161
\ semigroup\ {\isacharequal}\ type\ {\isacharplus}\isanewline
haftmann
parents:
diff changeset
   162
\ \ \isakeyword{fixes}\ mult\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\ {\isacharparenleft}\isakeyword{infixl}\ {\isachardoublequoteopen}{\isasymotimes}{\isachardoublequoteclose}\ {\isadigit{7}}{\isadigit{0}}{\isacharparenright}\isanewline
haftmann
parents:
diff changeset
   163
\ \ \isakeyword{assumes}\ assoc{\isacharcolon}\ {\isachardoublequoteopen}{\isacharparenleft}x\ {\isasymotimes}\ y{\isacharparenright}\ {\isasymotimes}\ z\ {\isacharequal}\ x\ {\isasymotimes}\ {\isacharparenleft}y\ {\isasymotimes}\ z{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   164
\isanewline
haftmann
parents:
diff changeset
   165
\isacommand{class}\isamarkupfalse%
haftmann
parents:
diff changeset
   166
\ monoid\ {\isacharequal}\ semigroup\ {\isacharplus}\isanewline
haftmann
parents:
diff changeset
   167
\ \ \isakeyword{fixes}\ neutral\ {\isacharcolon}{\isacharcolon}\ {\isacharprime}a\ {\isacharparenleft}{\isachardoublequoteopen}{\isasymone}{\isachardoublequoteclose}{\isacharparenright}\isanewline
haftmann
parents:
diff changeset
   168
\ \ \isakeyword{assumes}\ neutl{\isacharcolon}\ {\isachardoublequoteopen}{\isasymone}\ {\isasymotimes}\ x\ {\isacharequal}\ x{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   169
\ \ \ \ \isakeyword{and}\ neutr{\isacharcolon}\ {\isachardoublequoteopen}x\ {\isasymotimes}\ {\isasymone}\ {\isacharequal}\ x{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   170
\isanewline
haftmann
parents:
diff changeset
   171
\isacommand{instantiation}\isamarkupfalse%
haftmann
parents:
diff changeset
   172
\ nat\ {\isacharcolon}{\isacharcolon}\ monoid\isanewline
haftmann
parents:
diff changeset
   173
\isakeyword{begin}\isanewline
haftmann
parents:
diff changeset
   174
\isanewline
haftmann
parents:
diff changeset
   175
\isacommand{primrec}\isamarkupfalse%
haftmann
parents:
diff changeset
   176
\ mult{\isacharunderscore}nat\ \isakeyword{where}\isanewline
haftmann
parents:
diff changeset
   177
\ \ \ \ {\isachardoublequoteopen}{\isadigit{0}}\ {\isasymotimes}\ n\ {\isacharequal}\ {\isacharparenleft}{\isadigit{0}}{\isasymColon}nat{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   178
\ \ {\isacharbar}\ {\isachardoublequoteopen}Suc\ m\ {\isasymotimes}\ n\ {\isacharequal}\ n\ {\isacharplus}\ m\ {\isasymotimes}\ n{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   179
\isanewline
haftmann
parents:
diff changeset
   180
\isacommand{definition}\isamarkupfalse%
haftmann
parents:
diff changeset
   181
\ neutral{\isacharunderscore}nat\ \isakeyword{where}\isanewline
haftmann
parents:
diff changeset
   182
\ \ {\isachardoublequoteopen}{\isasymone}\ {\isacharequal}\ Suc\ {\isadigit{0}}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   183
\isanewline
haftmann
parents:
diff changeset
   184
\isacommand{lemma}\isamarkupfalse%
haftmann
parents:
diff changeset
   185
\ add{\isacharunderscore}mult{\isacharunderscore}distrib{\isacharcolon}\isanewline
haftmann
parents:
diff changeset
   186
\ \ \isakeyword{fixes}\ n\ m\ q\ {\isacharcolon}{\isacharcolon}\ nat\isanewline
haftmann
parents:
diff changeset
   187
\ \ \isakeyword{shows}\ {\isachardoublequoteopen}{\isacharparenleft}n\ {\isacharplus}\ m{\isacharparenright}\ {\isasymotimes}\ q\ {\isacharequal}\ n\ {\isasymotimes}\ q\ {\isacharplus}\ m\ {\isasymotimes}\ q{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   188
\ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   189
\ {\isacharparenleft}induct\ n{\isacharparenright}\ simp{\isacharunderscore}all\isanewline
haftmann
parents:
diff changeset
   190
\isanewline
haftmann
parents:
diff changeset
   191
\isacommand{instance}\isamarkupfalse%
haftmann
parents:
diff changeset
   192
\ \isacommand{proof}\isamarkupfalse%
haftmann
parents:
diff changeset
   193
\isanewline
haftmann
parents:
diff changeset
   194
\ \ \isacommand{fix}\isamarkupfalse%
haftmann
parents:
diff changeset
   195
\ m\ n\ q\ {\isacharcolon}{\isacharcolon}\ nat\isanewline
haftmann
parents:
diff changeset
   196
\ \ \isacommand{show}\isamarkupfalse%
haftmann
parents:
diff changeset
   197
\ {\isachardoublequoteopen}m\ {\isasymotimes}\ n\ {\isasymotimes}\ q\ {\isacharequal}\ m\ {\isasymotimes}\ {\isacharparenleft}n\ {\isasymotimes}\ q{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   198
\ \ \ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   199
\ {\isacharparenleft}induct\ m{\isacharparenright}\ {\isacharparenleft}simp{\isacharunderscore}all\ add{\isacharcolon}\ add{\isacharunderscore}mult{\isacharunderscore}distrib{\isacharparenright}\isanewline
haftmann
parents:
diff changeset
   200
\ \ \isacommand{show}\isamarkupfalse%
haftmann
parents:
diff changeset
   201
\ {\isachardoublequoteopen}{\isasymone}\ {\isasymotimes}\ n\ {\isacharequal}\ n{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   202
\ \ \ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   203
\ {\isacharparenleft}simp\ add{\isacharcolon}\ neutral{\isacharunderscore}nat{\isacharunderscore}def{\isacharparenright}\isanewline
haftmann
parents:
diff changeset
   204
\ \ \isacommand{show}\isamarkupfalse%
haftmann
parents:
diff changeset
   205
\ {\isachardoublequoteopen}m\ {\isasymotimes}\ {\isasymone}\ {\isacharequal}\ m{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   206
\ \ \ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   207
\ {\isacharparenleft}induct\ m{\isacharparenright}\ {\isacharparenleft}simp{\isacharunderscore}all\ add{\isacharcolon}\ neutral{\isacharunderscore}nat{\isacharunderscore}def{\isacharparenright}\isanewline
haftmann
parents:
diff changeset
   208
\isacommand{qed}\isamarkupfalse%
haftmann
parents:
diff changeset
   209
\isanewline
haftmann
parents:
diff changeset
   210
\isanewline
haftmann
parents:
diff changeset
   211
\isacommand{end}\isamarkupfalse%
haftmann
parents:
diff changeset
   212
%
28564
haftmann
parents: 28562
diff changeset
   213
\endisatagquote
haftmann
parents: 28562
diff changeset
   214
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   215
%
28564
haftmann
parents: 28562
diff changeset
   216
\isadelimquote
28447
haftmann
parents:
diff changeset
   217
%
28564
haftmann
parents: 28562
diff changeset
   218
\endisadelimquote
28447
haftmann
parents:
diff changeset
   219
%
haftmann
parents:
diff changeset
   220
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   221
\noindent We define the natural operation of the natural numbers
haftmann
parents:
diff changeset
   222
  on monoids:%
haftmann
parents:
diff changeset
   223
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   224
\isamarkuptrue%
haftmann
parents:
diff changeset
   225
%
28564
haftmann
parents: 28562
diff changeset
   226
\isadelimquote
28447
haftmann
parents:
diff changeset
   227
%
28564
haftmann
parents: 28562
diff changeset
   228
\endisadelimquote
28447
haftmann
parents:
diff changeset
   229
%
28564
haftmann
parents: 28562
diff changeset
   230
\isatagquote
28447
haftmann
parents:
diff changeset
   231
\isacommand{primrec}\isamarkupfalse%
haftmann
parents:
diff changeset
   232
\ {\isacharparenleft}\isakeyword{in}\ monoid{\isacharparenright}\ pow\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
haftmann
parents:
diff changeset
   233
\ \ \ \ {\isachardoublequoteopen}pow\ {\isadigit{0}}\ a\ {\isacharequal}\ {\isasymone}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   234
\ \ {\isacharbar}\ {\isachardoublequoteopen}pow\ {\isacharparenleft}Suc\ n{\isacharparenright}\ a\ {\isacharequal}\ a\ {\isasymotimes}\ pow\ n\ a{\isachardoublequoteclose}%
28564
haftmann
parents: 28562
diff changeset
   235
\endisatagquote
haftmann
parents: 28562
diff changeset
   236
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   237
%
28564
haftmann
parents: 28562
diff changeset
   238
\isadelimquote
28447
haftmann
parents:
diff changeset
   239
%
28564
haftmann
parents: 28562
diff changeset
   240
\endisadelimquote
28447
haftmann
parents:
diff changeset
   241
%
haftmann
parents:
diff changeset
   242
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   243
\noindent This we use to define the discrete exponentiation function:%
haftmann
parents:
diff changeset
   244
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   245
\isamarkuptrue%
haftmann
parents:
diff changeset
   246
%
28564
haftmann
parents: 28562
diff changeset
   247
\isadelimquote
28447
haftmann
parents:
diff changeset
   248
%
28564
haftmann
parents: 28562
diff changeset
   249
\endisadelimquote
28447
haftmann
parents:
diff changeset
   250
%
28564
haftmann
parents: 28562
diff changeset
   251
\isatagquote
28447
haftmann
parents:
diff changeset
   252
\isacommand{definition}\isamarkupfalse%
haftmann
parents:
diff changeset
   253
\ bexp\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
haftmann
parents:
diff changeset
   254
\ \ {\isachardoublequoteopen}bexp\ n\ {\isacharequal}\ pow\ n\ {\isacharparenleft}Suc\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}%
28564
haftmann
parents: 28562
diff changeset
   255
\endisatagquote
haftmann
parents: 28562
diff changeset
   256
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   257
%
28564
haftmann
parents: 28562
diff changeset
   258
\isadelimquote
28447
haftmann
parents:
diff changeset
   259
%
28564
haftmann
parents: 28562
diff changeset
   260
\endisadelimquote
28447
haftmann
parents:
diff changeset
   261
%
haftmann
parents:
diff changeset
   262
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   263
\noindent The corresponding code:%
haftmann
parents:
diff changeset
   264
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   265
\isamarkuptrue%
haftmann
parents:
diff changeset
   266
%
28564
haftmann
parents: 28562
diff changeset
   267
\isadelimquote
28447
haftmann
parents:
diff changeset
   268
%
28564
haftmann
parents: 28562
diff changeset
   269
\endisadelimquote
28447
haftmann
parents:
diff changeset
   270
%
28564
haftmann
parents: 28562
diff changeset
   271
\isatagquote
28447
haftmann
parents:
diff changeset
   272
%
haftmann
parents:
diff changeset
   273
\begin{isamarkuptext}%
28727
185110a4b97a clarified verbatim vs. typewriter
haftmann
parents: 28714
diff changeset
   274
\isatypewriter%
28447
haftmann
parents:
diff changeset
   275
\noindent%
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   276
\hspace*{0pt}module Example where {\char123}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   277
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   278
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   279
\hspace*{0pt}data Nat = Suc Nat | Zero{\char95}nat;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   280
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   281
\hspace*{0pt}class Semigroup a where {\char123}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   282
\hspace*{0pt} ~mult ::~a -> a -> a;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   283
\hspace*{0pt}{\char125};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   284
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   285
\hspace*{0pt}class (Semigroup a) => Monoid a where {\char123}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   286
\hspace*{0pt} ~neutral ::~a;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   287
\hspace*{0pt}{\char125};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   288
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   289
\hspace*{0pt}pow ::~forall a. (Monoid a) => Nat -> a -> a;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   290
\hspace*{0pt}pow Zero{\char95}nat a = neutral;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   291
\hspace*{0pt}pow (Suc n) a = mult a (pow n a);\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   292
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   293
\hspace*{0pt}plus{\char95}nat ::~Nat -> Nat -> Nat;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   294
\hspace*{0pt}plus{\char95}nat (Suc m) n = plus{\char95}nat m (Suc n);\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   295
\hspace*{0pt}plus{\char95}nat Zero{\char95}nat n = n;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   296
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   297
\hspace*{0pt}neutral{\char95}nat ::~Nat;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   298
\hspace*{0pt}neutral{\char95}nat = Suc Zero{\char95}nat;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   299
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   300
\hspace*{0pt}mult{\char95}nat ::~Nat -> Nat -> Nat;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   301
\hspace*{0pt}mult{\char95}nat Zero{\char95}nat n = Zero{\char95}nat;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   302
\hspace*{0pt}mult{\char95}nat (Suc m) n = plus{\char95}nat n (mult{\char95}nat m n);\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   303
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   304
\hspace*{0pt}instance Semigroup Nat where {\char123}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   305
\hspace*{0pt} ~mult = mult{\char95}nat;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   306
\hspace*{0pt}{\char125};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   307
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   308
\hspace*{0pt}instance Monoid Nat where {\char123}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   309
\hspace*{0pt} ~neutral = neutral{\char95}nat;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   310
\hspace*{0pt}{\char125};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   311
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   312
\hspace*{0pt}bexp ::~Nat -> Nat;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   313
\hspace*{0pt}bexp n = pow n (Suc (Suc Zero{\char95}nat));\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   314
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   315
\hspace*{0pt}{\char125}%
28447
haftmann
parents:
diff changeset
   316
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   317
\isamarkuptrue%
haftmann
parents:
diff changeset
   318
%
28564
haftmann
parents: 28562
diff changeset
   319
\endisatagquote
haftmann
parents: 28562
diff changeset
   320
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   321
%
28564
haftmann
parents: 28562
diff changeset
   322
\isadelimquote
28447
haftmann
parents:
diff changeset
   323
%
28564
haftmann
parents: 28562
diff changeset
   324
\endisadelimquote
28447
haftmann
parents:
diff changeset
   325
%
haftmann
parents:
diff changeset
   326
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   327
\noindent This is a convenient place to show how explicit dictionary construction
haftmann
parents:
diff changeset
   328
  manifests in generated code (here, the same example in \isa{SML}):%
haftmann
parents:
diff changeset
   329
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   330
\isamarkuptrue%
haftmann
parents:
diff changeset
   331
%
28564
haftmann
parents: 28562
diff changeset
   332
\isadelimquote
28447
haftmann
parents:
diff changeset
   333
%
28564
haftmann
parents: 28562
diff changeset
   334
\endisadelimquote
28447
haftmann
parents:
diff changeset
   335
%
28564
haftmann
parents: 28562
diff changeset
   336
\isatagquote
28447
haftmann
parents:
diff changeset
   337
%
haftmann
parents:
diff changeset
   338
\begin{isamarkuptext}%
28727
185110a4b97a clarified verbatim vs. typewriter
haftmann
parents: 28714
diff changeset
   339
\isatypewriter%
28447
haftmann
parents:
diff changeset
   340
\noindent%
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   341
\hspace*{0pt}structure Example = \\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   342
\hspace*{0pt}struct\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   343
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   344
\hspace*{0pt}datatype nat = Suc of nat | Zero{\char95}nat;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   345
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   346
\hspace*{0pt}type 'a semigroup = {\char123}mult :~'a -> 'a -> 'a{\char125};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   347
\hspace*{0pt}fun mult (A{\char95}:'a semigroup) = {\char35}mult A{\char95};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   348
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   349
\hspace*{0pt}type 'a monoid = {\char123}Program{\char95}{\char95}semigroup{\char95}monoid :~'a semigroup, neutral :~'a{\char125};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   350
\hspace*{0pt}fun semigroup{\char95}monoid (A{\char95}:'a monoid) = {\char35}Program{\char95}{\char95}semigroup{\char95}monoid A{\char95};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   351
\hspace*{0pt}fun neutral (A{\char95}:'a monoid) = {\char35}neutral A{\char95};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   352
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   353
\hspace*{0pt}fun pow A{\char95}~Zero{\char95}nat a = neutral A{\char95}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   354
\hspace*{0pt} ~| pow A{\char95}~(Suc n) a = mult (semigroup{\char95}monoid A{\char95}) a (pow A{\char95}~n a);\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   355
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   356
\hspace*{0pt}fun plus{\char95}nat (Suc m) n = plus{\char95}nat m (Suc n)\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   357
\hspace*{0pt} ~| plus{\char95}nat Zero{\char95}nat n = n;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   358
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   359
\hspace*{0pt}val neutral{\char95}nat :~nat = Suc Zero{\char95}nat;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   360
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   361
\hspace*{0pt}fun mult{\char95}nat Zero{\char95}nat n = Zero{\char95}nat\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   362
\hspace*{0pt} ~| mult{\char95}nat (Suc m) n = plus{\char95}nat n (mult{\char95}nat m n);\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   363
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   364
\hspace*{0pt}val semigroup{\char95}nat = {\char123}mult = mult{\char95}nat{\char125}~:~nat semigroup;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   365
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   366
\hspace*{0pt}val monoid{\char95}nat =\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   367
\hspace*{0pt} ~{\char123}Program{\char95}{\char95}semigroup{\char95}monoid = semigroup{\char95}nat, neutral = neutral{\char95}nat{\char125}~:\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   368
\hspace*{0pt} ~nat monoid;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   369
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   370
\hspace*{0pt}fun bexp n = pow monoid{\char95}nat n (Suc (Suc Zero{\char95}nat));\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   371
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   372
\hspace*{0pt}end; (*struct Example*)%
28447
haftmann
parents:
diff changeset
   373
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   374
\isamarkuptrue%
haftmann
parents:
diff changeset
   375
%
28564
haftmann
parents: 28562
diff changeset
   376
\endisatagquote
haftmann
parents: 28562
diff changeset
   377
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   378
%
28564
haftmann
parents: 28562
diff changeset
   379
\isadelimquote
28447
haftmann
parents:
diff changeset
   380
%
28564
haftmann
parents: 28562
diff changeset
   381
\endisadelimquote
28447
haftmann
parents:
diff changeset
   382
%
haftmann
parents:
diff changeset
   383
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   384
\noindent Note the parameters with trailing underscore (\verb|A_|)
haftmann
parents:
diff changeset
   385
    which are the dictionary parameters.%
haftmann
parents:
diff changeset
   386
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   387
\isamarkuptrue%
haftmann
parents:
diff changeset
   388
%
haftmann
parents:
diff changeset
   389
\isamarkupsubsection{The preprocessor \label{sec:preproc}%
haftmann
parents:
diff changeset
   390
}
haftmann
parents:
diff changeset
   391
\isamarkuptrue%
haftmann
parents:
diff changeset
   392
%
haftmann
parents:
diff changeset
   393
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   394
Before selected function theorems are turned into abstract
haftmann
parents:
diff changeset
   395
  code, a chain of definitional transformation steps is carried
haftmann
parents:
diff changeset
   396
  out: \emph{preprocessing}.  In essence, the preprocessor
haftmann
parents:
diff changeset
   397
  consists of two components: a \emph{simpset} and \emph{function transformers}.
haftmann
parents:
diff changeset
   398
haftmann
parents:
diff changeset
   399
  The \emph{simpset} allows to employ the full generality of the Isabelle
haftmann
parents:
diff changeset
   400
  simplifier.  Due to the interpretation of theorems
haftmann
parents:
diff changeset
   401
  as defining equations, rewrites are applied to the right
haftmann
parents:
diff changeset
   402
  hand side and the arguments of the left hand side of an
haftmann
parents:
diff changeset
   403
  equation, but never to the constant heading the left hand side.
haftmann
parents:
diff changeset
   404
  An important special case are \emph{inline theorems} which may be
haftmann
parents:
diff changeset
   405
  declared and undeclared using the
haftmann
parents:
diff changeset
   406
  \emph{code inline} or \emph{code inline del} attribute respectively.
haftmann
parents:
diff changeset
   407
haftmann
parents:
diff changeset
   408
  Some common applications:%
haftmann
parents:
diff changeset
   409
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   410
\isamarkuptrue%
haftmann
parents:
diff changeset
   411
%
haftmann
parents:
diff changeset
   412
\begin{itemize}
haftmann
parents:
diff changeset
   413
%
haftmann
parents:
diff changeset
   414
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   415
\item replacing non-executable constructs by executable ones:%
haftmann
parents:
diff changeset
   416
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   417
\isamarkuptrue%
haftmann
parents:
diff changeset
   418
%
28564
haftmann
parents: 28562
diff changeset
   419
\isadelimquote
28447
haftmann
parents:
diff changeset
   420
%
28564
haftmann
parents: 28562
diff changeset
   421
\endisadelimquote
28447
haftmann
parents:
diff changeset
   422
%
28564
haftmann
parents: 28562
diff changeset
   423
\isatagquote
28447
haftmann
parents:
diff changeset
   424
\isacommand{lemma}\isamarkupfalse%
haftmann
parents:
diff changeset
   425
\ {\isacharbrackleft}code\ inline{\isacharbrackright}{\isacharcolon}\isanewline
haftmann
parents:
diff changeset
   426
\ \ {\isachardoublequoteopen}x\ {\isasymin}\ set\ xs\ {\isasymlongleftrightarrow}\ x\ mem\ xs{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   427
\ {\isacharparenleft}induct\ xs{\isacharparenright}\ simp{\isacharunderscore}all%
28564
haftmann
parents: 28562
diff changeset
   428
\endisatagquote
haftmann
parents: 28562
diff changeset
   429
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   430
%
28564
haftmann
parents: 28562
diff changeset
   431
\isadelimquote
28447
haftmann
parents:
diff changeset
   432
%
28564
haftmann
parents: 28562
diff changeset
   433
\endisadelimquote
28447
haftmann
parents:
diff changeset
   434
%
haftmann
parents:
diff changeset
   435
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   436
\item eliminating superfluous constants:%
haftmann
parents:
diff changeset
   437
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   438
\isamarkuptrue%
haftmann
parents:
diff changeset
   439
%
28564
haftmann
parents: 28562
diff changeset
   440
\isadelimquote
28447
haftmann
parents:
diff changeset
   441
%
28564
haftmann
parents: 28562
diff changeset
   442
\endisadelimquote
28447
haftmann
parents:
diff changeset
   443
%
28564
haftmann
parents: 28562
diff changeset
   444
\isatagquote
28447
haftmann
parents:
diff changeset
   445
\isacommand{lemma}\isamarkupfalse%
haftmann
parents:
diff changeset
   446
\ {\isacharbrackleft}code\ inline{\isacharbrackright}{\isacharcolon}\isanewline
haftmann
parents:
diff changeset
   447
\ \ {\isachardoublequoteopen}{\isadigit{1}}\ {\isacharequal}\ Suc\ {\isadigit{0}}{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   448
\ simp%
28564
haftmann
parents: 28562
diff changeset
   449
\endisatagquote
haftmann
parents: 28562
diff changeset
   450
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   451
%
28564
haftmann
parents: 28562
diff changeset
   452
\isadelimquote
28447
haftmann
parents:
diff changeset
   453
%
28564
haftmann
parents: 28562
diff changeset
   454
\endisadelimquote
28447
haftmann
parents:
diff changeset
   455
%
haftmann
parents:
diff changeset
   456
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   457
\item replacing executable but inconvenient constructs:%
haftmann
parents:
diff changeset
   458
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   459
\isamarkuptrue%
haftmann
parents:
diff changeset
   460
%
28564
haftmann
parents: 28562
diff changeset
   461
\isadelimquote
28447
haftmann
parents:
diff changeset
   462
%
28564
haftmann
parents: 28562
diff changeset
   463
\endisadelimquote
28447
haftmann
parents:
diff changeset
   464
%
28564
haftmann
parents: 28562
diff changeset
   465
\isatagquote
28447
haftmann
parents:
diff changeset
   466
\isacommand{lemma}\isamarkupfalse%
haftmann
parents:
diff changeset
   467
\ {\isacharbrackleft}code\ inline{\isacharbrackright}{\isacharcolon}\isanewline
haftmann
parents:
diff changeset
   468
\ \ {\isachardoublequoteopen}xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymlongleftrightarrow}\ List{\isachardot}null\ xs{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   469
\ {\isacharparenleft}induct\ xs{\isacharparenright}\ simp{\isacharunderscore}all%
28564
haftmann
parents: 28562
diff changeset
   470
\endisatagquote
haftmann
parents: 28562
diff changeset
   471
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   472
%
28564
haftmann
parents: 28562
diff changeset
   473
\isadelimquote
28447
haftmann
parents:
diff changeset
   474
%
28564
haftmann
parents: 28562
diff changeset
   475
\endisadelimquote
28447
haftmann
parents:
diff changeset
   476
%
haftmann
parents:
diff changeset
   477
\end{itemize}
haftmann
parents:
diff changeset
   478
%
haftmann
parents:
diff changeset
   479
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   480
\noindent \emph{Function transformers} provide a very general interface,
haftmann
parents:
diff changeset
   481
  transforming a list of function theorems to another
haftmann
parents:
diff changeset
   482
  list of function theorems, provided that neither the heading
haftmann
parents:
diff changeset
   483
  constant nor its type change.  The \isa{{\isadigit{0}}} / \isa{Suc}
haftmann
parents:
diff changeset
   484
  pattern elimination implemented in
haftmann
parents:
diff changeset
   485
  theory \isa{Efficient{\isacharunderscore}Nat} (see \secref{eff_nat}) uses this
haftmann
parents:
diff changeset
   486
  interface.
haftmann
parents:
diff changeset
   487
haftmann
parents:
diff changeset
   488
  \noindent The current setup of the preprocessor may be inspected using
haftmann
parents:
diff changeset
   489
  the \hyperlink{command.print-codesetup}{\mbox{\isa{\isacommand{print{\isacharunderscore}codesetup}}}} command.
haftmann
parents:
diff changeset
   490
  \hyperlink{command.code-thms}{\mbox{\isa{\isacommand{code{\isacharunderscore}thms}}}} provides a convenient
haftmann
parents:
diff changeset
   491
  mechanism to inspect the impact of a preprocessor setup
haftmann
parents:
diff changeset
   492
  on defining equations.
haftmann
parents:
diff changeset
   493
haftmann
parents:
diff changeset
   494
  \begin{warn}
haftmann
parents:
diff changeset
   495
    The attribute \emph{code unfold}
haftmann
parents:
diff changeset
   496
    associated with the \isa{SML\ code\ generator} also applies to
haftmann
parents:
diff changeset
   497
    the \isa{generic\ code\ generator}:
haftmann
parents:
diff changeset
   498
    \emph{code unfold} implies \emph{code inline}.
haftmann
parents:
diff changeset
   499
  \end{warn}%
haftmann
parents:
diff changeset
   500
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   501
\isamarkuptrue%
haftmann
parents:
diff changeset
   502
%
haftmann
parents:
diff changeset
   503
\isamarkupsubsection{Datatypes \label{sec:datatypes}%
haftmann
parents:
diff changeset
   504
}
haftmann
parents:
diff changeset
   505
\isamarkuptrue%
haftmann
parents:
diff changeset
   506
%
haftmann
parents:
diff changeset
   507
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   508
Conceptually, any datatype is spanned by a set of
haftmann
parents:
diff changeset
   509
  \emph{constructors} of type \isa{{\isasymtau}\ {\isacharequal}\ {\isasymdots}\ {\isasymRightarrow}\ {\isasymkappa}\ {\isasymalpha}\isactrlisub {\isadigit{1}}\ {\isasymdots}\ {\isasymalpha}\isactrlisub n}
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28564
diff changeset
   510
  where \isa{{\isacharbraceleft}{\isasymalpha}\isactrlisub {\isadigit{1}}{\isacharcomma}\ {\isasymdots}{\isacharcomma}\ {\isasymalpha}\isactrlisub n{\isacharbraceright}} is exactly the set of \emph{all}
28447
haftmann
parents:
diff changeset
   511
  type variables in \isa{{\isasymtau}}.  The HOL datatype package
haftmann
parents:
diff changeset
   512
  by default registers any new datatype in the table
haftmann
parents:
diff changeset
   513
  of datatypes, which may be inspected using
haftmann
parents:
diff changeset
   514
  the \hyperlink{command.print-codesetup}{\mbox{\isa{\isacommand{print{\isacharunderscore}codesetup}}}} command.
haftmann
parents:
diff changeset
   515
haftmann
parents:
diff changeset
   516
  In some cases, it may be convenient to alter or
haftmann
parents:
diff changeset
   517
  extend this table;  as an example, we will develop an alternative
haftmann
parents:
diff changeset
   518
  representation of natural numbers as binary digits, whose
haftmann
parents:
diff changeset
   519
  size does increase logarithmically with its value, not linear
haftmann
parents:
diff changeset
   520
  \footnote{Indeed, the \hyperlink{theory.Efficient-Nat}{\mbox{\isa{Efficient{\isacharunderscore}Nat}}} theory (see \ref{eff_nat})
haftmann
parents:
diff changeset
   521
    does something similar}.  First, the digit representation:%
haftmann
parents:
diff changeset
   522
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   523
\isamarkuptrue%
haftmann
parents:
diff changeset
   524
%
28564
haftmann
parents: 28562
diff changeset
   525
\isadelimquote
28447
haftmann
parents:
diff changeset
   526
%
28564
haftmann
parents: 28562
diff changeset
   527
\endisadelimquote
28447
haftmann
parents:
diff changeset
   528
%
28564
haftmann
parents: 28562
diff changeset
   529
\isatagquote
28447
haftmann
parents:
diff changeset
   530
\isacommand{definition}\isamarkupfalse%
haftmann
parents:
diff changeset
   531
\ Dig{\isadigit{0}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
haftmann
parents:
diff changeset
   532
\ \ {\isachardoublequoteopen}Dig{\isadigit{0}}\ n\ {\isacharequal}\ {\isadigit{2}}\ {\isacharasterisk}\ n{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   533
\isanewline
haftmann
parents:
diff changeset
   534
\isacommand{definition}\isamarkupfalse%
haftmann
parents:
diff changeset
   535
\ \ Dig{\isadigit{1}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
haftmann
parents:
diff changeset
   536
\ \ {\isachardoublequoteopen}Dig{\isadigit{1}}\ n\ {\isacharequal}\ Suc\ {\isacharparenleft}{\isadigit{2}}\ {\isacharasterisk}\ n{\isacharparenright}{\isachardoublequoteclose}%
28564
haftmann
parents: 28562
diff changeset
   537
\endisatagquote
haftmann
parents: 28562
diff changeset
   538
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   539
%
28564
haftmann
parents: 28562
diff changeset
   540
\isadelimquote
28447
haftmann
parents:
diff changeset
   541
%
28564
haftmann
parents: 28562
diff changeset
   542
\endisadelimquote
28447
haftmann
parents:
diff changeset
   543
%
haftmann
parents:
diff changeset
   544
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   545
\noindent We will use these two \qt{digits} to represent natural numbers
haftmann
parents:
diff changeset
   546
  in binary digits, e.g.:%
haftmann
parents:
diff changeset
   547
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   548
\isamarkuptrue%
haftmann
parents:
diff changeset
   549
%
28564
haftmann
parents: 28562
diff changeset
   550
\isadelimquote
28447
haftmann
parents:
diff changeset
   551
%
28564
haftmann
parents: 28562
diff changeset
   552
\endisadelimquote
28447
haftmann
parents:
diff changeset
   553
%
28564
haftmann
parents: 28562
diff changeset
   554
\isatagquote
28447
haftmann
parents:
diff changeset
   555
\isacommand{lemma}\isamarkupfalse%
haftmann
parents:
diff changeset
   556
\ {\isadigit{4}}{\isadigit{2}}{\isacharcolon}\ {\isachardoublequoteopen}{\isadigit{4}}{\isadigit{2}}\ {\isacharequal}\ Dig{\isadigit{0}}\ {\isacharparenleft}Dig{\isadigit{1}}\ {\isacharparenleft}Dig{\isadigit{0}}\ {\isacharparenleft}Dig{\isadigit{1}}\ {\isacharparenleft}Dig{\isadigit{0}}\ {\isadigit{1}}{\isacharparenright}{\isacharparenright}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   557
\ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   558
\ {\isacharparenleft}simp\ add{\isacharcolon}\ Dig{\isadigit{0}}{\isacharunderscore}def\ Dig{\isadigit{1}}{\isacharunderscore}def{\isacharparenright}%
28564
haftmann
parents: 28562
diff changeset
   559
\endisatagquote
haftmann
parents: 28562
diff changeset
   560
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   561
%
28564
haftmann
parents: 28562
diff changeset
   562
\isadelimquote
28447
haftmann
parents:
diff changeset
   563
%
28564
haftmann
parents: 28562
diff changeset
   564
\endisadelimquote
28447
haftmann
parents:
diff changeset
   565
%
haftmann
parents:
diff changeset
   566
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   567
\noindent Of course we also have to provide proper code equations for
haftmann
parents:
diff changeset
   568
  the operations, e.g. \isa{op\ {\isacharplus}}:%
haftmann
parents:
diff changeset
   569
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   570
\isamarkuptrue%
haftmann
parents:
diff changeset
   571
%
28564
haftmann
parents: 28562
diff changeset
   572
\isadelimquote
28447
haftmann
parents:
diff changeset
   573
%
28564
haftmann
parents: 28562
diff changeset
   574
\endisadelimquote
28447
haftmann
parents:
diff changeset
   575
%
28564
haftmann
parents: 28562
diff changeset
   576
\isatagquote
28447
haftmann
parents:
diff changeset
   577
\isacommand{lemma}\isamarkupfalse%
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 28462
diff changeset
   578
\ plus{\isacharunderscore}Dig\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
28447
haftmann
parents:
diff changeset
   579
\ \ {\isachardoublequoteopen}{\isadigit{0}}\ {\isacharplus}\ n\ {\isacharequal}\ n{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   580
\ \ {\isachardoublequoteopen}m\ {\isacharplus}\ {\isadigit{0}}\ {\isacharequal}\ m{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   581
\ \ {\isachardoublequoteopen}{\isadigit{1}}\ {\isacharplus}\ Dig{\isadigit{0}}\ n\ {\isacharequal}\ Dig{\isadigit{1}}\ n{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   582
\ \ {\isachardoublequoteopen}Dig{\isadigit{0}}\ m\ {\isacharplus}\ {\isadigit{1}}\ {\isacharequal}\ Dig{\isadigit{1}}\ m{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   583
\ \ {\isachardoublequoteopen}{\isadigit{1}}\ {\isacharplus}\ Dig{\isadigit{1}}\ n\ {\isacharequal}\ Dig{\isadigit{0}}\ {\isacharparenleft}n\ {\isacharplus}\ {\isadigit{1}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   584
\ \ {\isachardoublequoteopen}Dig{\isadigit{1}}\ m\ {\isacharplus}\ {\isadigit{1}}\ {\isacharequal}\ Dig{\isadigit{0}}\ {\isacharparenleft}m\ {\isacharplus}\ {\isadigit{1}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   585
\ \ {\isachardoublequoteopen}Dig{\isadigit{0}}\ m\ {\isacharplus}\ Dig{\isadigit{0}}\ n\ {\isacharequal}\ Dig{\isadigit{0}}\ {\isacharparenleft}m\ {\isacharplus}\ n{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   586
\ \ {\isachardoublequoteopen}Dig{\isadigit{0}}\ m\ {\isacharplus}\ Dig{\isadigit{1}}\ n\ {\isacharequal}\ Dig{\isadigit{1}}\ {\isacharparenleft}m\ {\isacharplus}\ n{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   587
\ \ {\isachardoublequoteopen}Dig{\isadigit{1}}\ m\ {\isacharplus}\ Dig{\isadigit{0}}\ n\ {\isacharequal}\ Dig{\isadigit{1}}\ {\isacharparenleft}m\ {\isacharplus}\ n{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   588
\ \ {\isachardoublequoteopen}Dig{\isadigit{1}}\ m\ {\isacharplus}\ Dig{\isadigit{1}}\ n\ {\isacharequal}\ Dig{\isadigit{0}}\ {\isacharparenleft}m\ {\isacharplus}\ n\ {\isacharplus}\ {\isadigit{1}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   589
\ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   590
\ {\isacharparenleft}simp{\isacharunderscore}all\ add{\isacharcolon}\ Dig{\isadigit{0}}{\isacharunderscore}def\ Dig{\isadigit{1}}{\isacharunderscore}def{\isacharparenright}%
28564
haftmann
parents: 28562
diff changeset
   591
\endisatagquote
haftmann
parents: 28562
diff changeset
   592
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   593
%
28564
haftmann
parents: 28562
diff changeset
   594
\isadelimquote
28447
haftmann
parents:
diff changeset
   595
%
28564
haftmann
parents: 28562
diff changeset
   596
\endisadelimquote
28447
haftmann
parents:
diff changeset
   597
%
haftmann
parents:
diff changeset
   598
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   599
\noindent We then instruct the code generator to view \isa{{\isadigit{0}}},
haftmann
parents:
diff changeset
   600
  \isa{{\isadigit{1}}}, \isa{Dig{\isadigit{0}}} and \isa{Dig{\isadigit{1}}} as
haftmann
parents:
diff changeset
   601
  datatype constructors:%
haftmann
parents:
diff changeset
   602
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   603
\isamarkuptrue%
haftmann
parents:
diff changeset
   604
%
28564
haftmann
parents: 28562
diff changeset
   605
\isadelimquote
28447
haftmann
parents:
diff changeset
   606
%
28564
haftmann
parents: 28562
diff changeset
   607
\endisadelimquote
28447
haftmann
parents:
diff changeset
   608
%
28564
haftmann
parents: 28562
diff changeset
   609
\isatagquote
28447
haftmann
parents:
diff changeset
   610
\isacommand{code{\isacharunderscore}datatype}\isamarkupfalse%
haftmann
parents:
diff changeset
   611
\ {\isachardoublequoteopen}{\isadigit{0}}{\isasymColon}nat{\isachardoublequoteclose}\ {\isachardoublequoteopen}{\isadigit{1}}{\isasymColon}nat{\isachardoublequoteclose}\ Dig{\isadigit{0}}\ Dig{\isadigit{1}}%
28564
haftmann
parents: 28562
diff changeset
   612
\endisatagquote
haftmann
parents: 28562
diff changeset
   613
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   614
%
28564
haftmann
parents: 28562
diff changeset
   615
\isadelimquote
28447
haftmann
parents:
diff changeset
   616
%
28564
haftmann
parents: 28562
diff changeset
   617
\endisadelimquote
28447
haftmann
parents:
diff changeset
   618
%
haftmann
parents:
diff changeset
   619
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   620
\noindent For the former constructor \isa{Suc}, we provide a code
haftmann
parents:
diff changeset
   621
  equation and remove some parts of the default code generator setup
haftmann
parents:
diff changeset
   622
  which are an obstacle here:%
haftmann
parents:
diff changeset
   623
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   624
\isamarkuptrue%
haftmann
parents:
diff changeset
   625
%
28564
haftmann
parents: 28562
diff changeset
   626
\isadelimquote
28447
haftmann
parents:
diff changeset
   627
%
28564
haftmann
parents: 28562
diff changeset
   628
\endisadelimquote
28447
haftmann
parents:
diff changeset
   629
%
28564
haftmann
parents: 28562
diff changeset
   630
\isatagquote
28447
haftmann
parents:
diff changeset
   631
\isacommand{lemma}\isamarkupfalse%
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 28462
diff changeset
   632
\ Suc{\isacharunderscore}Dig\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
28447
haftmann
parents:
diff changeset
   633
\ \ {\isachardoublequoteopen}Suc\ n\ {\isacharequal}\ n\ {\isacharplus}\ {\isadigit{1}}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   634
\ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   635
\ simp\isanewline
haftmann
parents:
diff changeset
   636
\isanewline
haftmann
parents:
diff changeset
   637
\isacommand{declare}\isamarkupfalse%
haftmann
parents:
diff changeset
   638
\ One{\isacharunderscore}nat{\isacharunderscore}def\ {\isacharbrackleft}code\ inline\ del{\isacharbrackright}\isanewline
haftmann
parents:
diff changeset
   639
\isacommand{declare}\isamarkupfalse%
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 28462
diff changeset
   640
\ add{\isacharunderscore}Suc{\isacharunderscore}shift\ {\isacharbrackleft}code\ del{\isacharbrackright}%
28564
haftmann
parents: 28562
diff changeset
   641
\endisatagquote
haftmann
parents: 28562
diff changeset
   642
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   643
%
28564
haftmann
parents: 28562
diff changeset
   644
\isadelimquote
28447
haftmann
parents:
diff changeset
   645
%
28564
haftmann
parents: 28562
diff changeset
   646
\endisadelimquote
28447
haftmann
parents:
diff changeset
   647
%
haftmann
parents:
diff changeset
   648
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   649
\noindent This yields the following code:%
haftmann
parents:
diff changeset
   650
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   651
\isamarkuptrue%
haftmann
parents:
diff changeset
   652
%
28564
haftmann
parents: 28562
diff changeset
   653
\isadelimquote
28447
haftmann
parents:
diff changeset
   654
%
28564
haftmann
parents: 28562
diff changeset
   655
\endisadelimquote
28447
haftmann
parents:
diff changeset
   656
%
28564
haftmann
parents: 28562
diff changeset
   657
\isatagquote
28447
haftmann
parents:
diff changeset
   658
%
haftmann
parents:
diff changeset
   659
\begin{isamarkuptext}%
28727
185110a4b97a clarified verbatim vs. typewriter
haftmann
parents: 28714
diff changeset
   660
\isatypewriter%
28447
haftmann
parents:
diff changeset
   661
\noindent%
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   662
\hspace*{0pt}structure Example = \\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   663
\hspace*{0pt}struct\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   664
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   665
\hspace*{0pt}datatype nat = Dig1 of nat | Dig0 of nat | One{\char95}nat | Zero{\char95}nat;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   666
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   667
\hspace*{0pt}fun plus{\char95}nat (Dig1 m) (Dig1 n) = Dig0 (plus{\char95}nat (plus{\char95}nat m n) One{\char95}nat)\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   668
\hspace*{0pt} ~| plus{\char95}nat (Dig1 m) (Dig0 n) = Dig1 (plus{\char95}nat m n)\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   669
\hspace*{0pt} ~| plus{\char95}nat (Dig0 m) (Dig1 n) = Dig1 (plus{\char95}nat m n)\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   670
\hspace*{0pt} ~| plus{\char95}nat (Dig0 m) (Dig0 n) = Dig0 (plus{\char95}nat m n)\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   671
\hspace*{0pt} ~| plus{\char95}nat (Dig1 m) One{\char95}nat = Dig0 (plus{\char95}nat m One{\char95}nat)\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   672
\hspace*{0pt} ~| plus{\char95}nat One{\char95}nat (Dig1 n) = Dig0 (plus{\char95}nat n One{\char95}nat)\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   673
\hspace*{0pt} ~| plus{\char95}nat (Dig0 m) One{\char95}nat = Dig1 m\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   674
\hspace*{0pt} ~| plus{\char95}nat One{\char95}nat (Dig0 n) = Dig1 n\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   675
\hspace*{0pt} ~| plus{\char95}nat m Zero{\char95}nat = m\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   676
\hspace*{0pt} ~| plus{\char95}nat Zero{\char95}nat n = n;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   677
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   678
\hspace*{0pt}end; (*struct Example*)%
28447
haftmann
parents:
diff changeset
   679
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   680
\isamarkuptrue%
haftmann
parents:
diff changeset
   681
%
28564
haftmann
parents: 28562
diff changeset
   682
\endisatagquote
haftmann
parents: 28562
diff changeset
   683
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   684
%
28564
haftmann
parents: 28562
diff changeset
   685
\isadelimquote
28447
haftmann
parents:
diff changeset
   686
%
28564
haftmann
parents: 28562
diff changeset
   687
\endisadelimquote
28447
haftmann
parents:
diff changeset
   688
%
haftmann
parents:
diff changeset
   689
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   690
\noindent From this example, it can be easily glimpsed that using own constructor sets
haftmann
parents:
diff changeset
   691
  is a little delicate since it changes the set of valid patterns for values
haftmann
parents:
diff changeset
   692
  of that type.  Without going into much detail, here some practical hints:
haftmann
parents:
diff changeset
   693
haftmann
parents:
diff changeset
   694
  \begin{itemize}
haftmann
parents:
diff changeset
   695
    \item When changing the constructor set for datatypes, take care to
haftmann
parents:
diff changeset
   696
      provide an alternative for the \isa{case} combinator (e.g.~by replacing
haftmann
parents:
diff changeset
   697
      it using the preprocessor).
haftmann
parents:
diff changeset
   698
    \item Values in the target language need not to be normalised -- different
haftmann
parents:
diff changeset
   699
      values in the target language may represent the same value in the
haftmann
parents:
diff changeset
   700
      logic (e.g. \isa{Dig{\isadigit{1}}\ {\isadigit{0}}\ {\isacharequal}\ {\isadigit{1}}}).
haftmann
parents:
diff changeset
   701
    \item Usually, a good methodology to deal with the subtleties of pattern
haftmann
parents:
diff changeset
   702
      matching is to see the type as an abstract type: provide a set
haftmann
parents:
diff changeset
   703
      of operations which operate on the concrete representation of the type,
haftmann
parents:
diff changeset
   704
      and derive further operations by combinations of these primitive ones,
haftmann
parents:
diff changeset
   705
      without relying on a particular representation.
haftmann
parents:
diff changeset
   706
  \end{itemize}%
haftmann
parents:
diff changeset
   707
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   708
\isamarkuptrue%
haftmann
parents:
diff changeset
   709
%
haftmann
parents:
diff changeset
   710
\isadeliminvisible
haftmann
parents:
diff changeset
   711
%
haftmann
parents:
diff changeset
   712
\endisadeliminvisible
haftmann
parents:
diff changeset
   713
%
haftmann
parents:
diff changeset
   714
\isataginvisible
haftmann
parents:
diff changeset
   715
\isacommand{code{\isacharunderscore}datatype}\isamarkupfalse%
haftmann
parents:
diff changeset
   716
\ {\isachardoublequoteopen}{\isadigit{0}}{\isacharcolon}{\isacharcolon}nat{\isachardoublequoteclose}\ Suc\isanewline
haftmann
parents:
diff changeset
   717
\isacommand{declare}\isamarkupfalse%
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 28462
diff changeset
   718
\ plus{\isacharunderscore}Dig\ {\isacharbrackleft}code\ del{\isacharbrackright}\isanewline
28447
haftmann
parents:
diff changeset
   719
\isacommand{declare}\isamarkupfalse%
haftmann
parents:
diff changeset
   720
\ One{\isacharunderscore}nat{\isacharunderscore}def\ {\isacharbrackleft}code\ inline{\isacharbrackright}\isanewline
haftmann
parents:
diff changeset
   721
\isacommand{declare}\isamarkupfalse%
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 28462
diff changeset
   722
\ add{\isacharunderscore}Suc{\isacharunderscore}shift\ {\isacharbrackleft}code{\isacharbrackright}\ \isanewline
28447
haftmann
parents:
diff changeset
   723
\isacommand{lemma}\isamarkupfalse%
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 28462
diff changeset
   724
\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\ {\isachardoublequoteopen}{\isadigit{0}}\ {\isacharplus}\ n\ {\isacharequal}\ {\isacharparenleft}n\ {\isasymColon}\ nat{\isacharparenright}{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
28447
haftmann
parents:
diff changeset
   725
\ simp%
haftmann
parents:
diff changeset
   726
\endisataginvisible
haftmann
parents:
diff changeset
   727
{\isafoldinvisible}%
haftmann
parents:
diff changeset
   728
%
haftmann
parents:
diff changeset
   729
\isadeliminvisible
haftmann
parents:
diff changeset
   730
%
haftmann
parents:
diff changeset
   731
\endisadeliminvisible
haftmann
parents:
diff changeset
   732
%
haftmann
parents:
diff changeset
   733
\isamarkupsubsection{Equality and wellsortedness%
haftmann
parents:
diff changeset
   734
}
haftmann
parents:
diff changeset
   735
\isamarkuptrue%
haftmann
parents:
diff changeset
   736
%
haftmann
parents:
diff changeset
   737
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   738
Surely you have already noticed how equality is treated
haftmann
parents:
diff changeset
   739
  by the code generator:%
haftmann
parents:
diff changeset
   740
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   741
\isamarkuptrue%
haftmann
parents:
diff changeset
   742
%
28564
haftmann
parents: 28562
diff changeset
   743
\isadelimquote
28447
haftmann
parents:
diff changeset
   744
%
28564
haftmann
parents: 28562
diff changeset
   745
\endisadelimquote
28447
haftmann
parents:
diff changeset
   746
%
28564
haftmann
parents: 28562
diff changeset
   747
\isatagquote
28447
haftmann
parents:
diff changeset
   748
\isacommand{primrec}\isamarkupfalse%
haftmann
parents:
diff changeset
   749
\ collect{\isacharunderscore}duplicates\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
haftmann
parents:
diff changeset
   750
\ \ {\isachardoublequoteopen}collect{\isacharunderscore}duplicates\ xs\ ys\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ xs{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   751
\ \ {\isacharbar}\ {\isachardoublequoteopen}collect{\isacharunderscore}duplicates\ xs\ ys\ {\isacharparenleft}z{\isacharhash}zs{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}if\ z\ {\isasymin}\ set\ xs\isanewline
haftmann
parents:
diff changeset
   752
\ \ \ \ \ \ then\ if\ z\ {\isasymin}\ set\ ys\isanewline
haftmann
parents:
diff changeset
   753
\ \ \ \ \ \ \ \ then\ collect{\isacharunderscore}duplicates\ xs\ ys\ zs\isanewline
haftmann
parents:
diff changeset
   754
\ \ \ \ \ \ \ \ else\ collect{\isacharunderscore}duplicates\ xs\ {\isacharparenleft}z{\isacharhash}ys{\isacharparenright}\ zs\isanewline
haftmann
parents:
diff changeset
   755
\ \ \ \ \ \ else\ collect{\isacharunderscore}duplicates\ {\isacharparenleft}z{\isacharhash}xs{\isacharparenright}\ {\isacharparenleft}z{\isacharhash}ys{\isacharparenright}\ zs{\isacharparenright}{\isachardoublequoteclose}%
28564
haftmann
parents: 28562
diff changeset
   756
\endisatagquote
haftmann
parents: 28562
diff changeset
   757
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   758
%
28564
haftmann
parents: 28562
diff changeset
   759
\isadelimquote
28447
haftmann
parents:
diff changeset
   760
%
28564
haftmann
parents: 28562
diff changeset
   761
\endisadelimquote
28447
haftmann
parents:
diff changeset
   762
%
haftmann
parents:
diff changeset
   763
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   764
\noindent The membership test during preprocessing is rewritten,
haftmann
parents:
diff changeset
   765
  resulting in \isa{op\ mem}, which itself
haftmann
parents:
diff changeset
   766
  performs an explicit equality check.%
haftmann
parents:
diff changeset
   767
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   768
\isamarkuptrue%
haftmann
parents:
diff changeset
   769
%
28564
haftmann
parents: 28562
diff changeset
   770
\isadelimquote
28447
haftmann
parents:
diff changeset
   771
%
28564
haftmann
parents: 28562
diff changeset
   772
\endisadelimquote
28447
haftmann
parents:
diff changeset
   773
%
28564
haftmann
parents: 28562
diff changeset
   774
\isatagquote
28447
haftmann
parents:
diff changeset
   775
%
haftmann
parents:
diff changeset
   776
\begin{isamarkuptext}%
28727
185110a4b97a clarified verbatim vs. typewriter
haftmann
parents: 28714
diff changeset
   777
\isatypewriter%
28447
haftmann
parents:
diff changeset
   778
\noindent%
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   779
\hspace*{0pt}structure Example = \\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   780
\hspace*{0pt}struct\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   781
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   782
\hspace*{0pt}type 'a eq = {\char123}eq :~'a -> 'a -> bool{\char125};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   783
\hspace*{0pt}fun eq (A{\char95}:'a eq) = {\char35}eq A{\char95};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   784
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   785
\hspace*{0pt}fun eqop A{\char95}~a b = eq A{\char95}~a b;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   786
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   787
\hspace*{0pt}fun member A{\char95}~x [] = false\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   788
\hspace*{0pt} ~| member A{\char95}~x (y ::~ys) = eqop A{\char95}~x y orelse member A{\char95}~x ys;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   789
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   790
\hspace*{0pt}fun collect{\char95}duplicates A{\char95}~xs ys [] = xs\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   791
\hspace*{0pt} ~| collect{\char95}duplicates A{\char95}~xs ys (z ::~zs) =\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   792
\hspace*{0pt} ~~~(if member A{\char95}~z xs\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   793
\hspace*{0pt} ~~~~~then (if member A{\char95}~z ys then collect{\char95}duplicates A{\char95}~xs ys zs\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   794
\hspace*{0pt} ~~~~~~~~~~~~else collect{\char95}duplicates A{\char95}~xs (z ::~ys) zs)\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   795
\hspace*{0pt} ~~~~~else collect{\char95}duplicates A{\char95}~(z ::~xs) (z ::~ys) zs);\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   796
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   797
\hspace*{0pt}end; (*struct Example*)%
28447
haftmann
parents:
diff changeset
   798
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   799
\isamarkuptrue%
haftmann
parents:
diff changeset
   800
%
28564
haftmann
parents: 28562
diff changeset
   801
\endisatagquote
haftmann
parents: 28562
diff changeset
   802
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   803
%
28564
haftmann
parents: 28562
diff changeset
   804
\isadelimquote
28447
haftmann
parents:
diff changeset
   805
%
28564
haftmann
parents: 28562
diff changeset
   806
\endisadelimquote
28447
haftmann
parents:
diff changeset
   807
%
haftmann
parents:
diff changeset
   808
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   809
\noindent Obviously, polymorphic equality is implemented the Haskell
haftmann
parents:
diff changeset
   810
  way using a type class.  How is this achieved?  HOL introduces
haftmann
parents:
diff changeset
   811
  an explicit class \isa{eq} with a corresponding operation
haftmann
parents:
diff changeset
   812
  \isa{eq{\isacharunderscore}class{\isachardot}eq} such that \isa{eq{\isacharunderscore}class{\isachardot}eq\ {\isacharequal}\ op\ {\isacharequal}}.
haftmann
parents:
diff changeset
   813
  The preprocessing framework does the rest by propagating the
haftmann
parents:
diff changeset
   814
  \isa{eq} constraints through all dependent defining equations.
haftmann
parents:
diff changeset
   815
  For datatypes, instances of \isa{eq} are implicitly derived
haftmann
parents:
diff changeset
   816
  when possible.  For other types, you may instantiate \isa{eq}
haftmann
parents:
diff changeset
   817
  manually like any other type class.
haftmann
parents:
diff changeset
   818
haftmann
parents:
diff changeset
   819
  Though this \isa{eq} class is designed to get rarely in
haftmann
parents:
diff changeset
   820
  the way, a subtlety
haftmann
parents:
diff changeset
   821
  enters the stage when definitions of overloaded constants
haftmann
parents:
diff changeset
   822
  are dependent on operational equality.  For example, let
haftmann
parents:
diff changeset
   823
  us define a lexicographic ordering on tuples
haftmann
parents:
diff changeset
   824
  (also see theory \hyperlink{theory.Product-ord}{\mbox{\isa{Product{\isacharunderscore}ord}}}):%
haftmann
parents:
diff changeset
   825
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   826
\isamarkuptrue%
haftmann
parents:
diff changeset
   827
%
28564
haftmann
parents: 28562
diff changeset
   828
\isadelimquote
28447
haftmann
parents:
diff changeset
   829
%
28564
haftmann
parents: 28562
diff changeset
   830
\endisadelimquote
28447
haftmann
parents:
diff changeset
   831
%
28564
haftmann
parents: 28562
diff changeset
   832
\isatagquote
28447
haftmann
parents:
diff changeset
   833
\isacommand{instantiation}\isamarkupfalse%
haftmann
parents:
diff changeset
   834
\ {\isachardoublequoteopen}{\isacharasterisk}{\isachardoublequoteclose}\ {\isacharcolon}{\isacharcolon}\ {\isacharparenleft}order{\isacharcomma}\ order{\isacharparenright}\ order\isanewline
haftmann
parents:
diff changeset
   835
\isakeyword{begin}\isanewline
haftmann
parents:
diff changeset
   836
\isanewline
haftmann
parents:
diff changeset
   837
\isacommand{definition}\isamarkupfalse%
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 28462
diff changeset
   838
\ {\isacharbrackleft}code\ del{\isacharbrackright}{\isacharcolon}\isanewline
28447
haftmann
parents:
diff changeset
   839
\ \ {\isachardoublequoteopen}x\ {\isasymle}\ y\ {\isasymlongleftrightarrow}\ fst\ x\ {\isacharless}\ fst\ y\ {\isasymor}\ fst\ x\ {\isacharequal}\ fst\ y\ {\isasymand}\ snd\ x\ {\isasymle}\ snd\ y{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   840
\isanewline
haftmann
parents:
diff changeset
   841
\isacommand{definition}\isamarkupfalse%
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 28462
diff changeset
   842
\ {\isacharbrackleft}code\ del{\isacharbrackright}{\isacharcolon}\isanewline
28447
haftmann
parents:
diff changeset
   843
\ \ {\isachardoublequoteopen}x\ {\isacharless}\ y\ {\isasymlongleftrightarrow}\ fst\ x\ {\isacharless}\ fst\ y\ {\isasymor}\ fst\ x\ {\isacharequal}\ fst\ y\ {\isasymand}\ snd\ x\ {\isacharless}\ snd\ y{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   844
\isanewline
haftmann
parents:
diff changeset
   845
\isacommand{instance}\isamarkupfalse%
haftmann
parents:
diff changeset
   846
\ \isacommand{proof}\isamarkupfalse%
haftmann
parents:
diff changeset
   847
\isanewline
haftmann
parents:
diff changeset
   848
\isacommand{qed}\isamarkupfalse%
haftmann
parents:
diff changeset
   849
\ {\isacharparenleft}auto\ simp{\isacharcolon}\ less{\isacharunderscore}eq{\isacharunderscore}prod{\isacharunderscore}def\ less{\isacharunderscore}prod{\isacharunderscore}def\ intro{\isacharcolon}\ order{\isacharunderscore}less{\isacharunderscore}trans{\isacharparenright}\isanewline
haftmann
parents:
diff changeset
   850
\isanewline
haftmann
parents:
diff changeset
   851
\isacommand{end}\isamarkupfalse%
haftmann
parents:
diff changeset
   852
\isanewline
haftmann
parents:
diff changeset
   853
\isanewline
haftmann
parents:
diff changeset
   854
\isacommand{lemma}\isamarkupfalse%
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 28462
diff changeset
   855
\ order{\isacharunderscore}prod\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
28447
haftmann
parents:
diff changeset
   856
\ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}order{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}order{\isacharparenright}\ {\isacharless}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
haftmann
parents:
diff changeset
   857
\ \ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isacharless}\ y{\isadigit{2}}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   858
\ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}order{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}order{\isacharparenright}\ {\isasymle}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
haftmann
parents:
diff changeset
   859
\ \ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isasymle}\ y{\isadigit{2}}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   860
\ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   861
\ {\isacharparenleft}simp{\isacharunderscore}all\ add{\isacharcolon}\ less{\isacharunderscore}prod{\isacharunderscore}def\ less{\isacharunderscore}eq{\isacharunderscore}prod{\isacharunderscore}def{\isacharparenright}%
28564
haftmann
parents: 28562
diff changeset
   862
\endisatagquote
haftmann
parents: 28562
diff changeset
   863
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   864
%
28564
haftmann
parents: 28562
diff changeset
   865
\isadelimquote
28447
haftmann
parents:
diff changeset
   866
%
28564
haftmann
parents: 28562
diff changeset
   867
\endisadelimquote
28447
haftmann
parents:
diff changeset
   868
%
haftmann
parents:
diff changeset
   869
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   870
\noindent Then code generation will fail.  Why?  The definition
haftmann
parents:
diff changeset
   871
  of \isa{op\ {\isasymle}} depends on equality on both arguments,
haftmann
parents:
diff changeset
   872
  which are polymorphic and impose an additional \isa{eq}
haftmann
parents:
diff changeset
   873
  class constraint, which the preprocessor does not propagate
haftmann
parents:
diff changeset
   874
  (for technical reasons).
haftmann
parents:
diff changeset
   875
haftmann
parents:
diff changeset
   876
  The solution is to add \isa{eq} explicitly to the first sort arguments in the
haftmann
parents:
diff changeset
   877
  code theorems:%
haftmann
parents:
diff changeset
   878
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   879
\isamarkuptrue%
haftmann
parents:
diff changeset
   880
%
28564
haftmann
parents: 28562
diff changeset
   881
\isadelimquote
28447
haftmann
parents:
diff changeset
   882
%
28564
haftmann
parents: 28562
diff changeset
   883
\endisadelimquote
28447
haftmann
parents:
diff changeset
   884
%
28564
haftmann
parents: 28562
diff changeset
   885
\isatagquote
28447
haftmann
parents:
diff changeset
   886
\isacommand{lemma}\isamarkupfalse%
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 28462
diff changeset
   887
\ order{\isacharunderscore}prod{\isacharunderscore}code\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
28447
haftmann
parents:
diff changeset
   888
\ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}{\isacharbraceleft}order{\isacharcomma}\ eq{\isacharbraceright}{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}order{\isacharparenright}\ {\isacharless}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
haftmann
parents:
diff changeset
   889
\ \ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isacharless}\ y{\isadigit{2}}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   890
\ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}{\isacharbraceleft}order{\isacharcomma}\ eq{\isacharbraceright}{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}order{\isacharparenright}\ {\isasymle}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
haftmann
parents:
diff changeset
   891
\ \ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isasymle}\ y{\isadigit{2}}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   892
\ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   893
\ {\isacharparenleft}simp{\isacharunderscore}all\ add{\isacharcolon}\ less{\isacharunderscore}prod{\isacharunderscore}def\ less{\isacharunderscore}eq{\isacharunderscore}prod{\isacharunderscore}def{\isacharparenright}%
28564
haftmann
parents: 28562
diff changeset
   894
\endisatagquote
haftmann
parents: 28562
diff changeset
   895
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   896
%
28564
haftmann
parents: 28562
diff changeset
   897
\isadelimquote
28447
haftmann
parents:
diff changeset
   898
%
28564
haftmann
parents: 28562
diff changeset
   899
\endisadelimquote
28447
haftmann
parents:
diff changeset
   900
%
haftmann
parents:
diff changeset
   901
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   902
\noindent Then code generation succeeds:%
haftmann
parents:
diff changeset
   903
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   904
\isamarkuptrue%
haftmann
parents:
diff changeset
   905
%
28564
haftmann
parents: 28562
diff changeset
   906
\isadelimquote
28447
haftmann
parents:
diff changeset
   907
%
28564
haftmann
parents: 28562
diff changeset
   908
\endisadelimquote
28447
haftmann
parents:
diff changeset
   909
%
28564
haftmann
parents: 28562
diff changeset
   910
\isatagquote
28447
haftmann
parents:
diff changeset
   911
%
haftmann
parents:
diff changeset
   912
\begin{isamarkuptext}%
28727
185110a4b97a clarified verbatim vs. typewriter
haftmann
parents: 28714
diff changeset
   913
\isatypewriter%
28447
haftmann
parents:
diff changeset
   914
\noindent%
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   915
\hspace*{0pt}structure Example = \\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   916
\hspace*{0pt}struct\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   917
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   918
\hspace*{0pt}type 'a eq = {\char123}eq :~'a -> 'a -> bool{\char125};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   919
\hspace*{0pt}fun eq (A{\char95}:'a eq) = {\char35}eq A{\char95};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   920
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   921
\hspace*{0pt}type 'a ord = {\char123}less{\char95}eq :~'a -> 'a -> bool, less :~'a -> 'a -> bool{\char125};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   922
\hspace*{0pt}fun less{\char95}eq (A{\char95}:'a ord) = {\char35}less{\char95}eq A{\char95};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   923
\hspace*{0pt}fun less (A{\char95}:'a ord) = {\char35}less A{\char95};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   924
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   925
\hspace*{0pt}fun eqop A{\char95}~a b = eq A{\char95}~a b;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   926
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   927
\hspace*{0pt}type 'a preorder = {\char123}Orderings{\char95}{\char95}ord{\char95}preorder :~'a ord{\char125};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   928
\hspace*{0pt}fun ord{\char95}preorder (A{\char95}:'a preorder) = {\char35}Orderings{\char95}{\char95}ord{\char95}preorder A{\char95};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   929
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   930
\hspace*{0pt}type 'a order = {\char123}Orderings{\char95}{\char95}preorder{\char95}order :~'a preorder{\char125};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   931
\hspace*{0pt}fun preorder{\char95}order (A{\char95}:'a order) = {\char35}Orderings{\char95}{\char95}preorder{\char95}order A{\char95};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   932
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   933
\hspace*{0pt}fun less{\char95}eqa (A1{\char95}, A2{\char95}) B{\char95}~(x1, y1) (x2, y2) =\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   934
\hspace*{0pt} ~less ((ord{\char95}preorder o preorder{\char95}order) A2{\char95}) x1 x2 orelse\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   935
\hspace*{0pt} ~~~eqop A1{\char95}~x1 x2 andalso\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   936
\hspace*{0pt} ~~~~~less{\char95}eq ((ord{\char95}preorder o preorder{\char95}order) B{\char95}) y1 y2\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   937
\hspace*{0pt} ~| less{\char95}eqa (A1{\char95}, A2{\char95}) B{\char95}~(x1, y1) (x2, y2) =\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   938
\hspace*{0pt} ~~~less ((ord{\char95}preorder o preorder{\char95}order) A2{\char95}) x1 x2 orelse\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   939
\hspace*{0pt} ~~~~~eqop A1{\char95}~x1 x2 andalso\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   940
\hspace*{0pt} ~~~~~~~less{\char95}eq ((ord{\char95}preorder o preorder{\char95}order) B{\char95}) y1 y2;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   941
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   942
\hspace*{0pt}end; (*struct Example*)%
28447
haftmann
parents:
diff changeset
   943
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   944
\isamarkuptrue%
haftmann
parents:
diff changeset
   945
%
28564
haftmann
parents: 28562
diff changeset
   946
\endisatagquote
haftmann
parents: 28562
diff changeset
   947
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   948
%
28564
haftmann
parents: 28562
diff changeset
   949
\isadelimquote
28447
haftmann
parents:
diff changeset
   950
%
28564
haftmann
parents: 28562
diff changeset
   951
\endisadelimquote
28447
haftmann
parents:
diff changeset
   952
%
haftmann
parents:
diff changeset
   953
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   954
In some cases, the automatically derived defining equations
haftmann
parents:
diff changeset
   955
  for equality on a particular type may not be appropriate.
haftmann
parents:
diff changeset
   956
  As example, watch the following datatype representing
haftmann
parents:
diff changeset
   957
  monomorphic parametric types (where type constructors
haftmann
parents:
diff changeset
   958
  are referred to by natural numbers):%
haftmann
parents:
diff changeset
   959
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   960
\isamarkuptrue%
haftmann
parents:
diff changeset
   961
%
28564
haftmann
parents: 28562
diff changeset
   962
\isadelimquote
28447
haftmann
parents:
diff changeset
   963
%
28564
haftmann
parents: 28562
diff changeset
   964
\endisadelimquote
28447
haftmann
parents:
diff changeset
   965
%
28564
haftmann
parents: 28562
diff changeset
   966
\isatagquote
28447
haftmann
parents:
diff changeset
   967
\isacommand{datatype}\isamarkupfalse%
haftmann
parents:
diff changeset
   968
\ monotype\ {\isacharequal}\ Mono\ nat\ {\isachardoublequoteopen}monotype\ list{\isachardoublequoteclose}%
28564
haftmann
parents: 28562
diff changeset
   969
\endisatagquote
haftmann
parents: 28562
diff changeset
   970
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   971
%
28564
haftmann
parents: 28562
diff changeset
   972
\isadelimquote
28447
haftmann
parents:
diff changeset
   973
%
28564
haftmann
parents: 28562
diff changeset
   974
\endisadelimquote
28447
haftmann
parents:
diff changeset
   975
%
haftmann
parents:
diff changeset
   976
\isadelimproof
haftmann
parents:
diff changeset
   977
%
haftmann
parents:
diff changeset
   978
\endisadelimproof
haftmann
parents:
diff changeset
   979
%
haftmann
parents:
diff changeset
   980
\isatagproof
haftmann
parents:
diff changeset
   981
%
haftmann
parents:
diff changeset
   982
\endisatagproof
haftmann
parents:
diff changeset
   983
{\isafoldproof}%
haftmann
parents:
diff changeset
   984
%
haftmann
parents:
diff changeset
   985
\isadelimproof
haftmann
parents:
diff changeset
   986
%
haftmann
parents:
diff changeset
   987
\endisadelimproof
haftmann
parents:
diff changeset
   988
%
haftmann
parents:
diff changeset
   989
\begin{isamarkuptext}%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
   990
\noindent Then code generation for SML would fail with a message
28447
haftmann
parents:
diff changeset
   991
  that the generated code contains illegal mutual dependencies:
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
   992
  the theorem \isa{eq{\isacharunderscore}class{\isachardot}eq\ {\isacharparenleft}Mono\ tyco{\isadigit{1}}\ typargs{\isadigit{1}}{\isacharparenright}\ {\isacharparenleft}Mono\ tyco{\isadigit{2}}\ typargs{\isadigit{2}}{\isacharparenright}\ {\isasymequiv}\ eq{\isacharunderscore}class{\isachardot}eq\ tyco{\isadigit{1}}\ tyco{\isadigit{2}}\ {\isasymand}\ eq{\isacharunderscore}class{\isachardot}eq\ typargs{\isadigit{1}}\ typargs{\isadigit{2}}} already requires the
28447
haftmann
parents:
diff changeset
   993
  instance \isa{monotype\ {\isasymColon}\ eq}, which itself requires
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
   994
  \isa{eq{\isacharunderscore}class{\isachardot}eq\ {\isacharparenleft}Mono\ tyco{\isadigit{1}}\ typargs{\isadigit{1}}{\isacharparenright}\ {\isacharparenleft}Mono\ tyco{\isadigit{2}}\ typargs{\isadigit{2}}{\isacharparenright}\ {\isasymequiv}\ eq{\isacharunderscore}class{\isachardot}eq\ tyco{\isadigit{1}}\ tyco{\isadigit{2}}\ {\isasymand}\ eq{\isacharunderscore}class{\isachardot}eq\ typargs{\isadigit{1}}\ typargs{\isadigit{2}}};  Haskell has no problem with mutually
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
   995
  recursive \isa{instance} and \isa{function} definitions,
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28564
diff changeset
   996
  but the SML serialiser does not support this.
28447
haftmann
parents:
diff changeset
   997
haftmann
parents:
diff changeset
   998
  In such cases, you have to provide your own equality equations
haftmann
parents:
diff changeset
   999
  involving auxiliary constants.  In our case,
haftmann
parents:
diff changeset
  1000
  \isa{list{\isacharunderscore}all{\isadigit{2}}} can do the job:%
haftmann
parents:
diff changeset
  1001
\end{isamarkuptext}%
haftmann
parents:
diff changeset
  1002
\isamarkuptrue%
haftmann
parents:
diff changeset
  1003
%
28564
haftmann
parents: 28562
diff changeset
  1004
\isadelimquote
28447
haftmann
parents:
diff changeset
  1005
%
28564
haftmann
parents: 28562
diff changeset
  1006
\endisadelimquote
28447
haftmann
parents:
diff changeset
  1007
%
28564
haftmann
parents: 28562
diff changeset
  1008
\isatagquote
28447
haftmann
parents:
diff changeset
  1009
\isacommand{lemma}\isamarkupfalse%
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 28462
diff changeset
  1010
\ monotype{\isacharunderscore}eq{\isacharunderscore}list{\isacharunderscore}all{\isadigit{2}}\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
28447
haftmann
parents:
diff changeset
  1011
\ \ {\isachardoublequoteopen}eq{\isacharunderscore}class{\isachardot}eq\ {\isacharparenleft}Mono\ tyco{\isadigit{1}}\ typargs{\isadigit{1}}{\isacharparenright}\ {\isacharparenleft}Mono\ tyco{\isadigit{2}}\ typargs{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1012
\ \ \ \ \ eq{\isacharunderscore}class{\isachardot}eq\ tyco{\isadigit{1}}\ tyco{\isadigit{2}}\ {\isasymand}\ list{\isacharunderscore}all{\isadigit{2}}\ eq{\isacharunderscore}class{\isachardot}eq\ typargs{\isadigit{1}}\ typargs{\isadigit{2}}{\isachardoublequoteclose}\isanewline
28447
haftmann
parents:
diff changeset
  1013
\ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
  1014
\ {\isacharparenleft}simp\ add{\isacharcolon}\ eq\ list{\isacharunderscore}all{\isadigit{2}}{\isacharunderscore}eq\ {\isacharbrackleft}symmetric{\isacharbrackright}{\isacharparenright}%
28564
haftmann
parents: 28562
diff changeset
  1015
\endisatagquote
haftmann
parents: 28562
diff changeset
  1016
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
  1017
%
28564
haftmann
parents: 28562
diff changeset
  1018
\isadelimquote
28447
haftmann
parents:
diff changeset
  1019
%
28564
haftmann
parents: 28562
diff changeset
  1020
\endisadelimquote
28447
haftmann
parents:
diff changeset
  1021
%
haftmann
parents:
diff changeset
  1022
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
  1023
\noindent does not depend on instance \isa{monotype\ {\isasymColon}\ eq}:%
haftmann
parents:
diff changeset
  1024
\end{isamarkuptext}%
haftmann
parents:
diff changeset
  1025
\isamarkuptrue%
haftmann
parents:
diff changeset
  1026
%
28564
haftmann
parents: 28562
diff changeset
  1027
\isadelimquote
28447
haftmann
parents:
diff changeset
  1028
%
28564
haftmann
parents: 28562
diff changeset
  1029
\endisadelimquote
28447
haftmann
parents:
diff changeset
  1030
%
28564
haftmann
parents: 28562
diff changeset
  1031
\isatagquote
28447
haftmann
parents:
diff changeset
  1032
%
haftmann
parents:
diff changeset
  1033
\begin{isamarkuptext}%
28727
185110a4b97a clarified verbatim vs. typewriter
haftmann
parents: 28714
diff changeset
  1034
\isatypewriter%
28447
haftmann
parents:
diff changeset
  1035
\noindent%
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1036
\hspace*{0pt}structure Example = \\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1037
\hspace*{0pt}struct\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1038
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1039
\hspace*{0pt}datatype nat = Suc of nat | Zero{\char95}nat;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1040
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1041
\hspace*{0pt}fun null [] = true\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1042
\hspace*{0pt} ~| null (x ::~xs) = false;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1043
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1044
\hspace*{0pt}fun eq{\char95}nat (Suc a) Zero{\char95}nat = false\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1045
\hspace*{0pt} ~| eq{\char95}nat Zero{\char95}nat (Suc a) = false\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1046
\hspace*{0pt} ~| eq{\char95}nat (Suc nat) (Suc nat') = eq{\char95}nat nat nat'\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1047
\hspace*{0pt} ~| eq{\char95}nat Zero{\char95}nat Zero{\char95}nat = true;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1048
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1049
\hspace*{0pt}datatype monotype = Mono of nat * monotype list;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1050
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1051
\hspace*{0pt}fun list{\char95}all2 p (x ::~xs) (y ::~ys) = p x y andalso list{\char95}all2 p xs ys\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1052
\hspace*{0pt} ~| list{\char95}all2 p xs [] = null xs\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1053
\hspace*{0pt} ~| list{\char95}all2 p [] ys = null ys;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1054
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1055
\hspace*{0pt}fun eq{\char95}monotype (Mono (tyco1, typargs1)) (Mono (tyco2, typargs2)) =\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1056
\hspace*{0pt} ~eq{\char95}nat tyco1 tyco2 andalso list{\char95}all2 eq{\char95}monotype typargs1 typargs2;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1057
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1058
\hspace*{0pt}end; (*struct Example*)%
28447
haftmann
parents:
diff changeset
  1059
\end{isamarkuptext}%
haftmann
parents:
diff changeset
  1060
\isamarkuptrue%
haftmann
parents:
diff changeset
  1061
%
28564
haftmann
parents: 28562
diff changeset
  1062
\endisatagquote
haftmann
parents: 28562
diff changeset
  1063
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
  1064
%
28564
haftmann
parents: 28562
diff changeset
  1065
\isadelimquote
28447
haftmann
parents:
diff changeset
  1066
%
28564
haftmann
parents: 28562
diff changeset
  1067
\endisadelimquote
28447
haftmann
parents:
diff changeset
  1068
%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1069
\isamarkupsubsection{Explicit partiality%
28447
haftmann
parents:
diff changeset
  1070
}
haftmann
parents:
diff changeset
  1071
\isamarkuptrue%
haftmann
parents:
diff changeset
  1072
%
haftmann
parents:
diff changeset
  1073
\begin{isamarkuptext}%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1074
Partiality usually enters the game by partial patterns, as
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1075
  in the following example, again for amortised queues:%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1076
\end{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1077
\isamarkuptrue%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1078
%
28564
haftmann
parents: 28562
diff changeset
  1079
\isadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1080
%
28564
haftmann
parents: 28562
diff changeset
  1081
\endisadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1082
%
28564
haftmann
parents: 28562
diff changeset
  1083
\isatagquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1084
\isacommand{fun}\isamarkupfalse%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1085
\ strict{\isacharunderscore}dequeue\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ queue\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymtimes}\ {\isacharprime}a\ queue{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1086
\ \ {\isachardoublequoteopen}strict{\isacharunderscore}dequeue\ {\isacharparenleft}Queue\ xs\ {\isacharparenleft}y\ {\isacharhash}\ ys{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}y{\isacharcomma}\ Queue\ xs\ ys{\isacharparenright}{\isachardoublequoteclose}\isanewline
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1087
\ \ {\isacharbar}\ {\isachardoublequoteopen}strict{\isacharunderscore}dequeue\ {\isacharparenleft}Queue\ xs\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\isanewline
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1088
\ \ \ \ \ \ {\isacharparenleft}case\ rev\ xs\ of\ y\ {\isacharhash}\ ys\ {\isasymRightarrow}\ {\isacharparenleft}y{\isacharcomma}\ Queue\ {\isacharbrackleft}{\isacharbrackright}\ ys{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}%
28564
haftmann
parents: 28562
diff changeset
  1089
\endisatagquote
haftmann
parents: 28562
diff changeset
  1090
{\isafoldquote}%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1091
%
28564
haftmann
parents: 28562
diff changeset
  1092
\isadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1093
%
28564
haftmann
parents: 28562
diff changeset
  1094
\endisadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1095
%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1096
\begin{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1097
\noindent In the corresponding code, there is no equation
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1098
  for the pattern \isa{Queue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbrackleft}{\isacharbrackright}}:%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1099
\end{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1100
\isamarkuptrue%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1101
%
28564
haftmann
parents: 28562
diff changeset
  1102
\isadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1103
%
28564
haftmann
parents: 28562
diff changeset
  1104
\endisadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1105
%
28564
haftmann
parents: 28562
diff changeset
  1106
\isatagquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1107
%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1108
\begin{isamarkuptext}%
28727
185110a4b97a clarified verbatim vs. typewriter
haftmann
parents: 28714
diff changeset
  1109
\isatypewriter%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1110
\noindent%
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1111
\hspace*{0pt}strict{\char95}dequeue ::~forall a. Queue a -> (a, Queue a);\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1112
\hspace*{0pt}strict{\char95}dequeue (Queue xs (y :~ys)) = (y, Queue xs ys);\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1113
\hspace*{0pt}strict{\char95}dequeue (Queue xs []) =\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1114
\hspace*{0pt} ~let {\char123}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1115
\hspace*{0pt} ~~~(y :~ys) = rev xs;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1116
\hspace*{0pt} ~{\char125}~in (y, Queue [] ys);%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1117
\end{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1118
\isamarkuptrue%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1119
%
28564
haftmann
parents: 28562
diff changeset
  1120
\endisatagquote
haftmann
parents: 28562
diff changeset
  1121
{\isafoldquote}%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1122
%
28564
haftmann
parents: 28562
diff changeset
  1123
\isadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1124
%
28564
haftmann
parents: 28562
diff changeset
  1125
\endisadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1126
%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1127
\begin{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1128
\noindent In some cases it is desirable to have this
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1129
  pseudo-\qt{partiality} more explicitly, e.g.~as follows:%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1130
\end{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1131
\isamarkuptrue%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1132
%
28564
haftmann
parents: 28562
diff changeset
  1133
\isadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1134
%
28564
haftmann
parents: 28562
diff changeset
  1135
\endisadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1136
%
28564
haftmann
parents: 28562
diff changeset
  1137
\isatagquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1138
\isacommand{axiomatization}\isamarkupfalse%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1139
\ empty{\isacharunderscore}queue\ {\isacharcolon}{\isacharcolon}\ {\isacharprime}a\isanewline
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1140
\isanewline
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1141
\isacommand{function}\isamarkupfalse%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1142
\ strict{\isacharunderscore}dequeue{\isacharprime}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ queue\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymtimes}\ {\isacharprime}a\ queue{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1143
\ \ {\isachardoublequoteopen}strict{\isacharunderscore}dequeue{\isacharprime}\ {\isacharparenleft}Queue\ xs\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}if\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ then\ empty{\isacharunderscore}queue\isanewline
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1144
\ \ \ \ \ else\ strict{\isacharunderscore}dequeue{\isacharprime}\ {\isacharparenleft}Queue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharparenleft}rev\ xs{\isacharparenright}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1145
\ \ {\isacharbar}\ {\isachardoublequoteopen}strict{\isacharunderscore}dequeue{\isacharprime}\ {\isacharparenleft}Queue\ xs\ {\isacharparenleft}y\ {\isacharhash}\ ys{\isacharparenright}{\isacharparenright}\ {\isacharequal}\isanewline
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1146
\ \ \ \ \ \ \ {\isacharparenleft}y{\isacharcomma}\ Queue\ xs\ ys{\isacharparenright}{\isachardoublequoteclose}\isanewline
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1147
\isacommand{by}\isamarkupfalse%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1148
\ pat{\isacharunderscore}completeness\ auto\isanewline
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1149
\isanewline
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1150
\isacommand{termination}\isamarkupfalse%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1151
\ strict{\isacharunderscore}dequeue{\isacharprime}\isanewline
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1152
\isacommand{by}\isamarkupfalse%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1153
\ {\isacharparenleft}relation\ {\isachardoublequoteopen}measure\ {\isacharparenleft}{\isasymlambda}q{\isacharcolon}{\isacharcolon}{\isacharprime}a\ queue{\isachardot}\ case\ q\ of\ Queue\ xs\ ys\ {\isasymRightarrow}\ length\ xs{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}\ simp{\isacharunderscore}all%
28564
haftmann
parents: 28562
diff changeset
  1154
\endisatagquote
haftmann
parents: 28562
diff changeset
  1155
{\isafoldquote}%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1156
%
28564
haftmann
parents: 28562
diff changeset
  1157
\isadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1158
%
28564
haftmann
parents: 28562
diff changeset
  1159
\endisadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1160
%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1161
\begin{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1162
\noindent For technical reasons the definition of
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1163
  \isa{strict{\isacharunderscore}dequeue{\isacharprime}} is more involved since it requires
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1164
  a manual termination proof.  Apart from that observe that
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1165
  on the right hand side of its first equation the constant
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1166
  \isa{empty{\isacharunderscore}queue} occurs which is unspecified.
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1167
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1168
  Normally, if constants without any defining equations occur in
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1169
  a program, the code generator complains (since in most cases
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1170
  this is not what the user expects).  But such constants can also
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1171
  be thought of as function definitions with no equations which
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1172
  always fail, since there is never a successful pattern match
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28564
diff changeset
  1173
  on the left hand side.  In order to categorise a constant into
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1174
  that category explicitly, use \hyperlink{command.code-abort}{\mbox{\isa{\isacommand{code{\isacharunderscore}abort}}}}:%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1175
\end{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1176
\isamarkuptrue%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1177
%
28564
haftmann
parents: 28562
diff changeset
  1178
\isadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1179
%
28564
haftmann
parents: 28562
diff changeset
  1180
\endisadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1181
%
28564
haftmann
parents: 28562
diff changeset
  1182
\isatagquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1183
\isacommand{code{\isacharunderscore}abort}\isamarkupfalse%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1184
\ empty{\isacharunderscore}queue%
28564
haftmann
parents: 28562
diff changeset
  1185
\endisatagquote
haftmann
parents: 28562
diff changeset
  1186
{\isafoldquote}%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1187
%
28564
haftmann
parents: 28562
diff changeset
  1188
\isadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1189
%
28564
haftmann
parents: 28562
diff changeset
  1190
\endisadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1191
%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1192
\begin{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1193
\noindent Then the code generator will just insert an error or
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1194
  exception at the appropriate position:%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1195
\end{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1196
\isamarkuptrue%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1197
%
28564
haftmann
parents: 28562
diff changeset
  1198
\isadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1199
%
28564
haftmann
parents: 28562
diff changeset
  1200
\endisadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1201
%
28564
haftmann
parents: 28562
diff changeset
  1202
\isatagquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1203
%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1204
\begin{isamarkuptext}%
28727
185110a4b97a clarified verbatim vs. typewriter
haftmann
parents: 28714
diff changeset
  1205
\isatypewriter%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1206
\noindent%
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1207
\hspace*{0pt}empty{\char95}queue ::~forall a. a;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1208
\hspace*{0pt}empty{\char95}queue = error {\char34}empty{\char95}queue{\char34};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1209
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1210
\hspace*{0pt}strict{\char95}dequeue' ::~forall a. Queue a -> (a, Queue a);\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1211
\hspace*{0pt}strict{\char95}dequeue' (Queue xs []) =\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1212
\hspace*{0pt} ~(if nulla xs then empty{\char95}queue else strict{\char95}dequeue' (Queue [] (rev xs)));\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1213
\hspace*{0pt}strict{\char95}dequeue' (Queue xs (y :~ys)) = (y, Queue xs ys);%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1214
\end{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1215
\isamarkuptrue%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1216
%
28564
haftmann
parents: 28562
diff changeset
  1217
\endisatagquote
haftmann
parents: 28562
diff changeset
  1218
{\isafoldquote}%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1219
%
28564
haftmann
parents: 28562
diff changeset
  1220
\isadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1221
%
28564
haftmann
parents: 28562
diff changeset
  1222
\endisadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1223
%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1224
\begin{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1225
\noindent This feature however is rarely needed in practice.
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1226
  Note also that the \isa{HOL} default setup already declares
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1227
  \isa{undefined} as \hyperlink{command.code-abort}{\mbox{\isa{\isacommand{code{\isacharunderscore}abort}}}}, which is most
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1228
  likely to be used in such situations.%
28447
haftmann
parents:
diff changeset
  1229
\end{isamarkuptext}%
haftmann
parents:
diff changeset
  1230
\isamarkuptrue%
haftmann
parents:
diff changeset
  1231
%
haftmann
parents:
diff changeset
  1232
\isadelimtheory
haftmann
parents:
diff changeset
  1233
%
haftmann
parents:
diff changeset
  1234
\endisadelimtheory
haftmann
parents:
diff changeset
  1235
%
haftmann
parents:
diff changeset
  1236
\isatagtheory
haftmann
parents:
diff changeset
  1237
\isacommand{end}\isamarkupfalse%
haftmann
parents:
diff changeset
  1238
%
haftmann
parents:
diff changeset
  1239
\endisatagtheory
haftmann
parents:
diff changeset
  1240
{\isafoldtheory}%
haftmann
parents:
diff changeset
  1241
%
haftmann
parents:
diff changeset
  1242
\isadelimtheory
haftmann
parents:
diff changeset
  1243
%
haftmann
parents:
diff changeset
  1244
\endisadelimtheory
haftmann
parents:
diff changeset
  1245
\isanewline
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1246
\ \end{isabellebody}%
28447
haftmann
parents:
diff changeset
  1247
%%% Local Variables:
haftmann
parents:
diff changeset
  1248
%%% mode: latex
haftmann
parents:
diff changeset
  1249
%%% TeX-master: "root"
haftmann
parents:
diff changeset
  1250
%%% End: