doc-src/IsarAdvanced/Codegen/Thy/document/Program.tex
author haftmann
Wed, 04 Feb 2009 10:59:31 +0100
changeset 29798 6df726203e39
parent 29560 fa6c5d62adf5
child 30121 5c7bcb296600
permissions -rw-r--r--
proper datatype abstraction example
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
29560
fa6c5d62adf5 "code equation" replaces "defining equation"
haftmann
parents: 29297
diff changeset
    33
  can be changed, e.g. by providing different code 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
29560
fa6c5d62adf5 "code equation" replaces "defining equation"
haftmann
parents: 29297
diff changeset
    47
  could provide an alternative code equations for \isa{dequeue}
28447
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
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
    59
\ \ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}AQueue\ xs\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
    60
\ \ \ \ \ {\isacharparenleft}if\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ then\ {\isacharparenleft}None{\isacharcomma}\ AQueue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
    61
\ \ \ \ \ \ \ else\ dequeue\ {\isacharparenleft}AQueue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharparenleft}rev\ xs{\isacharparenright}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
    62
\ \ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}AQueue\ xs\ {\isacharparenleft}y\ {\isacharhash}\ ys{\isacharparenright}{\isacharparenright}\ {\isacharequal}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
    63
\ \ \ \ \ {\isacharparenleft}Some\ y{\isacharcomma}\ AQueue\ xs\ ys{\isacharparenright}{\isachardoublequoteclose}\isanewline
28447
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
29560
fa6c5d62adf5 "code equation" replaces "defining equation"
haftmann
parents: 29297
diff changeset
    76
  considered as code equations for a \isa{fun} statement --
28447
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%
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
    90
\hspace*{0pt}dequeue ::~forall a.~Queue a -> (Maybe a,~Queue a);\\
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
    91
\hspace*{0pt}dequeue (AQueue xs (y :~ys)) = (Just y,~AQueue xs ys);\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
    92
\hspace*{0pt}dequeue (AQueue xs []) =\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
    93
\hspace*{0pt} ~(if nulla xs then (Nothing,~AQueue [] [])\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
    94
\hspace*{0pt} ~~~else dequeue (AQueue [] (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
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   111
  possible.  See \secref{sec:datatypes} for an example.
28447
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}%
29560
fa6c5d62adf5 "code equation" replaces "defining equation"
haftmann
parents: 29297
diff changeset
   135
\noindent prints a table with \emph{all} code equations
28447
haftmann
parents:
diff changeset
   136
  for \isa{dequeue}, including
29560
fa6c5d62adf5 "code equation" replaces "defining equation"
haftmann
parents: 29297
diff changeset
   137
  \emph{all} code equations those equations depend
28447
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
29560
fa6c5d62adf5 "code equation" replaces "defining equation"
haftmann
parents: 29297
diff changeset
   141
  visualising dependencies between code equations.%
28447
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%
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   161
\ semigroup\ {\isacharequal}\isanewline
28447
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}\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
   289
\hspace*{0pt}pow ::~forall a.~(Monoid a) => Nat -> a -> a;\\
28714
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}\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
   349
\hspace*{0pt}type 'a monoid = {\char123}Program{\char95}{\char95}semigroup{\char95}monoid :~'a semigroup,~neutral :~'a{\char125};\\
28714
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}\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
   359
\hspace*{0pt}val neutral{\char95}nat :~nat = Suc Zero{\char95}nat\\
28714
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 =\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
   367
\hspace*{0pt} ~{\char123}Program{\char95}{\char95}semigroup{\char95}monoid = semigroup{\char95}nat,~neutral = neutral{\char95}nat{\char125}~:\\
28714
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}\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
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
29560
fa6c5d62adf5 "code equation" replaces "defining equation"
haftmann
parents: 29297
diff changeset
   401
  as code equations, rewrites are applied to the right
28447
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
29560
fa6c5d62adf5 "code equation" replaces "defining equation"
haftmann
parents: 29297
diff changeset
   492
  on code equations.
28447
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
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   509
  \emph{constructors} of type \isa{{\isasymtau}\ {\isacharequal}\ {\isasymdots}\ {\isasymRightarrow}\ {\isasymkappa}\ {\isasymalpha}\isactrlisub {\isadigit{1}}\ {\isasymdots}\ {\isasymalpha}\isactrlisub n} where \isa{{\isacharbraceleft}{\isasymalpha}\isactrlisub {\isadigit{1}}{\isacharcomma}\ {\isasymdots}{\isacharcomma}\ {\isasymalpha}\isactrlisub n{\isacharbraceright}} is exactly the set of \emph{all} type variables in
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   510
  \isa{{\isasymtau}}.  The HOL datatype package by default registers any new
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   511
  datatype in the table of datatypes, which may be inspected using the
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   512
  \hyperlink{command.print-codesetup}{\mbox{\isa{\isacommand{print{\isacharunderscore}codesetup}}}} command.
28447
haftmann
parents:
diff changeset
   513
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   514
  In some cases, it is appropriate to alter or extend this table.  As
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   515
  an example, we will develop an alternative representation of the
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   516
  queue example given in \secref{sec:intro}.  The amortised
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   517
  representation is convenient for generating code but exposes its
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   518
  \qt{implementation} details, which may be cumbersome when proving
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   519
  theorems about it.  Therefore, here a simple, straightforward
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   520
  representation of queues:%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   521
\end{isamarkuptext}%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   522
\isamarkuptrue%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   523
%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   524
\isadelimquote
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   525
%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   526
\endisadelimquote
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   527
%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   528
\isatagquote
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   529
\isacommand{datatype}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   530
\ {\isacharprime}a\ queue\ {\isacharequal}\ Queue\ {\isachardoublequoteopen}{\isacharprime}a\ list{\isachardoublequoteclose}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   531
\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   532
\isacommand{definition}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   533
\ empty\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ queue{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   534
\ \ {\isachardoublequoteopen}empty\ {\isacharequal}\ Queue\ {\isacharbrackleft}{\isacharbrackright}{\isachardoublequoteclose}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   535
\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   536
\isacommand{primrec}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   537
\ enqueue\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a\ queue\ {\isasymRightarrow}\ {\isacharprime}a\ queue{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   538
\ \ {\isachardoublequoteopen}enqueue\ x\ {\isacharparenleft}Queue\ xs{\isacharparenright}\ {\isacharequal}\ Queue\ {\isacharparenleft}xs\ {\isacharat}\ {\isacharbrackleft}x{\isacharbrackright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   539
\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   540
\isacommand{fun}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   541
\ dequeue\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ queue\ {\isasymRightarrow}\ {\isacharprime}a\ option\ {\isasymtimes}\ {\isacharprime}a\ queue{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   542
\ \ \ \ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}Queue\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}None{\isacharcomma}\ Queue\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   543
\ \ {\isacharbar}\ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}Queue\ {\isacharparenleft}x\ {\isacharhash}\ xs{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}Some\ x{\isacharcomma}\ Queue\ xs{\isacharparenright}{\isachardoublequoteclose}%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   544
\endisatagquote
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   545
{\isafoldquote}%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   546
%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   547
\isadelimquote
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   548
%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   549
\endisadelimquote
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   550
%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   551
\begin{isamarkuptext}%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   552
\noindent This we can use directly for proving;  for executing,
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   553
  we provide an alternative characterisation:%
28447
haftmann
parents:
diff changeset
   554
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   555
\isamarkuptrue%
haftmann
parents:
diff changeset
   556
%
28564
haftmann
parents: 28562
diff changeset
   557
\isadelimquote
28447
haftmann
parents:
diff changeset
   558
%
28564
haftmann
parents: 28562
diff changeset
   559
\endisadelimquote
28447
haftmann
parents:
diff changeset
   560
%
28564
haftmann
parents: 28562
diff changeset
   561
\isatagquote
28447
haftmann
parents:
diff changeset
   562
\isacommand{definition}\isamarkupfalse%
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   563
\ AQueue\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ queue{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   564
\ \ {\isachardoublequoteopen}AQueue\ xs\ ys\ {\isacharequal}\ Queue\ {\isacharparenleft}ys\ {\isacharat}\ rev\ xs{\isacharparenright}{\isachardoublequoteclose}\isanewline
28447
haftmann
parents:
diff changeset
   565
\isanewline
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   566
\isacommand{code{\isacharunderscore}datatype}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   567
\ AQueue%
28564
haftmann
parents: 28562
diff changeset
   568
\endisatagquote
haftmann
parents: 28562
diff changeset
   569
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   570
%
28564
haftmann
parents: 28562
diff changeset
   571
\isadelimquote
28447
haftmann
parents:
diff changeset
   572
%
28564
haftmann
parents: 28562
diff changeset
   573
\endisadelimquote
28447
haftmann
parents:
diff changeset
   574
%
haftmann
parents:
diff changeset
   575
\begin{isamarkuptext}%
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   576
\noindent Here we define a \qt{constructor} \isa{Program{\isachardot}AQueue} which
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   577
  is defined in terms of \isa{Queue} and interprets its arguments
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   578
  according to what the \emph{content} of an amortised queue is supposed
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   579
  to be.  Equipped with this, we are able to prove the following equations
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   580
  for our primitive queue operations which \qt{implement} the simple
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   581
  queues in an amortised fashion:%
28447
haftmann
parents:
diff changeset
   582
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   583
\isamarkuptrue%
haftmann
parents:
diff changeset
   584
%
28564
haftmann
parents: 28562
diff changeset
   585
\isadelimquote
28447
haftmann
parents:
diff changeset
   586
%
28564
haftmann
parents: 28562
diff changeset
   587
\endisadelimquote
28447
haftmann
parents:
diff changeset
   588
%
28564
haftmann
parents: 28562
diff changeset
   589
\isatagquote
28447
haftmann
parents:
diff changeset
   590
\isacommand{lemma}\isamarkupfalse%
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   591
\ empty{\isacharunderscore}AQueue\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   592
\ \ {\isachardoublequoteopen}empty\ {\isacharequal}\ AQueue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbrackleft}{\isacharbrackright}{\isachardoublequoteclose}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   593
\ \ \isacommand{unfolding}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   594
\ AQueue{\isacharunderscore}def\ empty{\isacharunderscore}def\ \isacommand{by}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   595
\ simp\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   596
\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   597
\isacommand{lemma}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   598
\ enqueue{\isacharunderscore}AQueue\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   599
\ \ {\isachardoublequoteopen}enqueue\ x\ {\isacharparenleft}AQueue\ xs\ ys{\isacharparenright}\ {\isacharequal}\ AQueue\ {\isacharparenleft}x\ {\isacharhash}\ xs{\isacharparenright}\ ys{\isachardoublequoteclose}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   600
\ \ \isacommand{unfolding}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   601
\ AQueue{\isacharunderscore}def\ \isacommand{by}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   602
\ simp\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   603
\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   604
\isacommand{lemma}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   605
\ dequeue{\isacharunderscore}AQueue\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   606
\ \ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}AQueue\ xs\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   607
\ \ \ \ {\isacharparenleft}if\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ then\ {\isacharparenleft}None{\isacharcomma}\ AQueue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   608
\ \ \ \ else\ dequeue\ {\isacharparenleft}AQueue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharparenleft}rev\ xs{\isacharparenright}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   609
\ \ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}AQueue\ xs\ {\isacharparenleft}y\ {\isacharhash}\ ys{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}Some\ y{\isacharcomma}\ AQueue\ xs\ ys{\isacharparenright}{\isachardoublequoteclose}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   610
\ \ \isacommand{unfolding}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   611
\ AQueue{\isacharunderscore}def\ \isacommand{by}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   612
\ simp{\isacharunderscore}all%
28564
haftmann
parents: 28562
diff changeset
   613
\endisatagquote
haftmann
parents: 28562
diff changeset
   614
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   615
%
28564
haftmann
parents: 28562
diff changeset
   616
\isadelimquote
28447
haftmann
parents:
diff changeset
   617
%
28564
haftmann
parents: 28562
diff changeset
   618
\endisadelimquote
28447
haftmann
parents:
diff changeset
   619
%
haftmann
parents:
diff changeset
   620
\begin{isamarkuptext}%
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   621
\noindent For completeness, we provide a substitute for the
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   622
  \isa{case} combinator on queues:%
28447
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
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   631
\isacommand{definition}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   632
\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   633
\ \ aqueue{\isacharunderscore}case{\isacharunderscore}def{\isacharcolon}\ {\isachardoublequoteopen}aqueue{\isacharunderscore}case\ {\isacharequal}\ queue{\isacharunderscore}case{\isachardoublequoteclose}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   634
\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   635
\isacommand{lemma}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   636
\ aqueue{\isacharunderscore}case\ {\isacharbrackleft}code{\isacharcomma}\ code\ inline{\isacharbrackright}{\isacharcolon}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   637
\ \ {\isachardoublequoteopen}queue{\isacharunderscore}case\ {\isacharequal}\ aqueue{\isacharunderscore}case{\isachardoublequoteclose}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   638
\ \ \isacommand{unfolding}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   639
\ aqueue{\isacharunderscore}case{\isacharunderscore}def\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   640
\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   641
\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   642
\isacommand{lemma}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   643
\ case{\isacharunderscore}AQueue\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   644
\ \ {\isachardoublequoteopen}aqueue{\isacharunderscore}case\ f\ {\isacharparenleft}AQueue\ xs\ ys{\isacharparenright}\ {\isacharequal}\ f\ {\isacharparenleft}ys\ {\isacharat}\ rev\ xs{\isacharparenright}{\isachardoublequoteclose}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   645
\ \ \isacommand{unfolding}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   646
\ aqueue{\isacharunderscore}case{\isacharunderscore}def\ AQueue{\isacharunderscore}def\ \isacommand{by}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   647
\ simp%
28564
haftmann
parents: 28562
diff changeset
   648
\endisatagquote
haftmann
parents: 28562
diff changeset
   649
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   650
%
28564
haftmann
parents: 28562
diff changeset
   651
\isadelimquote
28447
haftmann
parents:
diff changeset
   652
%
28564
haftmann
parents: 28562
diff changeset
   653
\endisadelimquote
28447
haftmann
parents:
diff changeset
   654
%
haftmann
parents:
diff changeset
   655
\begin{isamarkuptext}%
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   656
\noindent The resulting code looks as expected:%
28447
haftmann
parents:
diff changeset
   657
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   658
\isamarkuptrue%
haftmann
parents:
diff changeset
   659
%
28564
haftmann
parents: 28562
diff changeset
   660
\isadelimquote
28447
haftmann
parents:
diff changeset
   661
%
28564
haftmann
parents: 28562
diff changeset
   662
\endisadelimquote
28447
haftmann
parents:
diff changeset
   663
%
28564
haftmann
parents: 28562
diff changeset
   664
\isatagquote
28447
haftmann
parents:
diff changeset
   665
%
haftmann
parents:
diff changeset
   666
\begin{isamarkuptext}%
28727
185110a4b97a clarified verbatim vs. typewriter
haftmann
parents: 28714
diff changeset
   667
\isatypewriter%
28447
haftmann
parents:
diff changeset
   668
\noindent%
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   669
\hspace*{0pt}structure Example = \\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   670
\hspace*{0pt}struct\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   671
\hspace*{0pt}\\
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   672
\hspace*{0pt}fun foldl f a [] = a\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   673
\hspace*{0pt} ~| foldl f a (x ::~xs) = foldl f (f a x) xs;\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   674
\hspace*{0pt}\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   675
\hspace*{0pt}fun rev xs = foldl (fn xsa => fn x => x ::~xsa) [] xs;\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   676
\hspace*{0pt}\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   677
\hspace*{0pt}fun null [] = true\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   678
\hspace*{0pt} ~| null (x ::~xs) = false;\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   679
\hspace*{0pt}\\
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   680
\hspace*{0pt}datatype 'a queue = AQueue of 'a list * 'a list;\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   681
\hspace*{0pt}\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   682
\hspace*{0pt}val empty :~'a queue = AQueue ([],~[])\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   683
\hspace*{0pt}\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   684
\hspace*{0pt}fun dequeue (AQueue (xs,~y ::~ys)) = (SOME y,~AQueue (xs,~ys))\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   685
\hspace*{0pt} ~| dequeue (AQueue (xs,~[])) =\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   686
\hspace*{0pt} ~~~(if null xs then (NONE,~AQueue ([],~[]))\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   687
\hspace*{0pt} ~~~~~else dequeue (AQueue ([],~rev xs)));\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   688
\hspace*{0pt}\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   689
\hspace*{0pt}fun enqueue x (AQueue (xs,~ys)) = AQueue (x ::~xs,~ys);\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   690
\hspace*{0pt}\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
   691
\hspace*{0pt}end;~(*struct Example*)%
28447
haftmann
parents:
diff changeset
   692
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   693
\isamarkuptrue%
haftmann
parents:
diff changeset
   694
%
28564
haftmann
parents: 28562
diff changeset
   695
\endisatagquote
haftmann
parents: 28562
diff changeset
   696
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   697
%
28564
haftmann
parents: 28562
diff changeset
   698
\isadelimquote
28447
haftmann
parents:
diff changeset
   699
%
28564
haftmann
parents: 28562
diff changeset
   700
\endisadelimquote
28447
haftmann
parents:
diff changeset
   701
%
haftmann
parents:
diff changeset
   702
\begin{isamarkuptext}%
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   703
\noindent From this example, it can be glimpsed that using own
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   704
  constructor sets is a little delicate since it changes the set of
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   705
  valid patterns for values of that type.  Without going into much
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   706
  detail, here some practical hints:
28447
haftmann
parents:
diff changeset
   707
haftmann
parents:
diff changeset
   708
  \begin{itemize}
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   709
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   710
    \item When changing the constructor set for datatypes, take care
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   711
      to provide an alternative for the \isa{case} combinator
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   712
      (e.g.~by replacing it using the preprocessor).
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   713
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   714
    \item Values in the target language need not to be normalised --
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   715
      different values in the target language may represent the same
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   716
      value in the logic.
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   717
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   718
    \item Usually, a good methodology to deal with the subtleties of
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   719
      pattern matching is to see the type as an abstract type: provide
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   720
      a set of operations which operate on the concrete representation
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   721
      of the type, and derive further operations by combinations of
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   722
      these primitive ones, without relying on a particular
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   723
      representation.
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   724
28447
haftmann
parents:
diff changeset
   725
  \end{itemize}%
haftmann
parents:
diff changeset
   726
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   727
\isamarkuptrue%
haftmann
parents:
diff changeset
   728
%
haftmann
parents:
diff changeset
   729
\isamarkupsubsection{Equality and wellsortedness%
haftmann
parents:
diff changeset
   730
}
haftmann
parents:
diff changeset
   731
\isamarkuptrue%
haftmann
parents:
diff changeset
   732
%
haftmann
parents:
diff changeset
   733
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   734
Surely you have already noticed how equality is treated
haftmann
parents:
diff changeset
   735
  by the code generator:%
haftmann
parents:
diff changeset
   736
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   737
\isamarkuptrue%
haftmann
parents:
diff changeset
   738
%
28564
haftmann
parents: 28562
diff changeset
   739
\isadelimquote
28447
haftmann
parents:
diff changeset
   740
%
28564
haftmann
parents: 28562
diff changeset
   741
\endisadelimquote
28447
haftmann
parents:
diff changeset
   742
%
28564
haftmann
parents: 28562
diff changeset
   743
\isatagquote
28447
haftmann
parents:
diff changeset
   744
\isacommand{primrec}\isamarkupfalse%
haftmann
parents:
diff changeset
   745
\ 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
   746
\ \ {\isachardoublequoteopen}collect{\isacharunderscore}duplicates\ xs\ ys\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ xs{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   747
\ \ {\isacharbar}\ {\isachardoublequoteopen}collect{\isacharunderscore}duplicates\ xs\ ys\ {\isacharparenleft}z{\isacharhash}zs{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}if\ z\ {\isasymin}\ set\ xs\isanewline
haftmann
parents:
diff changeset
   748
\ \ \ \ \ \ then\ if\ z\ {\isasymin}\ set\ ys\isanewline
haftmann
parents:
diff changeset
   749
\ \ \ \ \ \ \ \ then\ collect{\isacharunderscore}duplicates\ xs\ ys\ zs\isanewline
haftmann
parents:
diff changeset
   750
\ \ \ \ \ \ \ \ else\ collect{\isacharunderscore}duplicates\ xs\ {\isacharparenleft}z{\isacharhash}ys{\isacharparenright}\ zs\isanewline
haftmann
parents:
diff changeset
   751
\ \ \ \ \ \ else\ collect{\isacharunderscore}duplicates\ {\isacharparenleft}z{\isacharhash}xs{\isacharparenright}\ {\isacharparenleft}z{\isacharhash}ys{\isacharparenright}\ zs{\isacharparenright}{\isachardoublequoteclose}%
28564
haftmann
parents: 28562
diff changeset
   752
\endisatagquote
haftmann
parents: 28562
diff changeset
   753
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   754
%
28564
haftmann
parents: 28562
diff changeset
   755
\isadelimquote
28447
haftmann
parents:
diff changeset
   756
%
28564
haftmann
parents: 28562
diff changeset
   757
\endisadelimquote
28447
haftmann
parents:
diff changeset
   758
%
haftmann
parents:
diff changeset
   759
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   760
\noindent The membership test during preprocessing is rewritten,
haftmann
parents:
diff changeset
   761
  resulting in \isa{op\ mem}, which itself
haftmann
parents:
diff changeset
   762
  performs an explicit equality check.%
haftmann
parents:
diff changeset
   763
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   764
\isamarkuptrue%
haftmann
parents:
diff changeset
   765
%
28564
haftmann
parents: 28562
diff changeset
   766
\isadelimquote
28447
haftmann
parents:
diff changeset
   767
%
28564
haftmann
parents: 28562
diff changeset
   768
\endisadelimquote
28447
haftmann
parents:
diff changeset
   769
%
28564
haftmann
parents: 28562
diff changeset
   770
\isatagquote
28447
haftmann
parents:
diff changeset
   771
%
haftmann
parents:
diff changeset
   772
\begin{isamarkuptext}%
28727
185110a4b97a clarified verbatim vs. typewriter
haftmann
parents: 28714
diff changeset
   773
\isatypewriter%
28447
haftmann
parents:
diff changeset
   774
\noindent%
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   775
\hspace*{0pt}structure Example = \\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   776
\hspace*{0pt}struct\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   777
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   778
\hspace*{0pt}type 'a eq = {\char123}eq :~'a -> 'a -> bool{\char125};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   779
\hspace*{0pt}fun eq (A{\char95}:'a eq) = {\char35}eq A{\char95};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   780
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   781
\hspace*{0pt}fun eqop A{\char95}~a b = eq A{\char95}~a b;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   782
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   783
\hspace*{0pt}fun member A{\char95}~x [] = false\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   784
\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
   785
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   786
\hspace*{0pt}fun collect{\char95}duplicates A{\char95}~xs ys [] = xs\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   787
\hspace*{0pt} ~| collect{\char95}duplicates A{\char95}~xs ys (z ::~zs) =\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   788
\hspace*{0pt} ~~~(if member A{\char95}~z xs\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   789
\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
   790
\hspace*{0pt} ~~~~~~~~~~~~else collect{\char95}duplicates A{\char95}~xs (z ::~ys) zs)\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   791
\hspace*{0pt} ~~~~~else collect{\char95}duplicates A{\char95}~(z ::~xs) (z ::~ys) zs);\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   792
\hspace*{0pt}\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
   793
\hspace*{0pt}end;~(*struct Example*)%
28447
haftmann
parents:
diff changeset
   794
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   795
\isamarkuptrue%
haftmann
parents:
diff changeset
   796
%
28564
haftmann
parents: 28562
diff changeset
   797
\endisatagquote
haftmann
parents: 28562
diff changeset
   798
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   799
%
28564
haftmann
parents: 28562
diff changeset
   800
\isadelimquote
28447
haftmann
parents:
diff changeset
   801
%
28564
haftmann
parents: 28562
diff changeset
   802
\endisadelimquote
28447
haftmann
parents:
diff changeset
   803
%
haftmann
parents:
diff changeset
   804
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   805
\noindent Obviously, polymorphic equality is implemented the Haskell
haftmann
parents:
diff changeset
   806
  way using a type class.  How is this achieved?  HOL introduces
haftmann
parents:
diff changeset
   807
  an explicit class \isa{eq} with a corresponding operation
haftmann
parents:
diff changeset
   808
  \isa{eq{\isacharunderscore}class{\isachardot}eq} such that \isa{eq{\isacharunderscore}class{\isachardot}eq\ {\isacharequal}\ op\ {\isacharequal}}.
haftmann
parents:
diff changeset
   809
  The preprocessing framework does the rest by propagating the
29560
fa6c5d62adf5 "code equation" replaces "defining equation"
haftmann
parents: 29297
diff changeset
   810
  \isa{eq} constraints through all dependent code equations.
28447
haftmann
parents:
diff changeset
   811
  For datatypes, instances of \isa{eq} are implicitly derived
haftmann
parents:
diff changeset
   812
  when possible.  For other types, you may instantiate \isa{eq}
haftmann
parents:
diff changeset
   813
  manually like any other type class.
haftmann
parents:
diff changeset
   814
haftmann
parents:
diff changeset
   815
  Though this \isa{eq} class is designed to get rarely in
haftmann
parents:
diff changeset
   816
  the way, a subtlety
haftmann
parents:
diff changeset
   817
  enters the stage when definitions of overloaded constants
haftmann
parents:
diff changeset
   818
  are dependent on operational equality.  For example, let
haftmann
parents:
diff changeset
   819
  us define a lexicographic ordering on tuples
haftmann
parents:
diff changeset
   820
  (also see theory \hyperlink{theory.Product-ord}{\mbox{\isa{Product{\isacharunderscore}ord}}}):%
haftmann
parents:
diff changeset
   821
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   822
\isamarkuptrue%
haftmann
parents:
diff changeset
   823
%
28564
haftmann
parents: 28562
diff changeset
   824
\isadelimquote
28447
haftmann
parents:
diff changeset
   825
%
28564
haftmann
parents: 28562
diff changeset
   826
\endisadelimquote
28447
haftmann
parents:
diff changeset
   827
%
28564
haftmann
parents: 28562
diff changeset
   828
\isatagquote
28447
haftmann
parents:
diff changeset
   829
\isacommand{instantiation}\isamarkupfalse%
haftmann
parents:
diff changeset
   830
\ {\isachardoublequoteopen}{\isacharasterisk}{\isachardoublequoteclose}\ {\isacharcolon}{\isacharcolon}\ {\isacharparenleft}order{\isacharcomma}\ order{\isacharparenright}\ order\isanewline
haftmann
parents:
diff changeset
   831
\isakeyword{begin}\isanewline
haftmann
parents:
diff changeset
   832
\isanewline
haftmann
parents:
diff changeset
   833
\isacommand{definition}\isamarkupfalse%
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 28462
diff changeset
   834
\ {\isacharbrackleft}code\ del{\isacharbrackright}{\isacharcolon}\isanewline
28447
haftmann
parents:
diff changeset
   835
\ \ {\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
   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\ {\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
   840
\isanewline
haftmann
parents:
diff changeset
   841
\isacommand{instance}\isamarkupfalse%
haftmann
parents:
diff changeset
   842
\ \isacommand{proof}\isamarkupfalse%
haftmann
parents:
diff changeset
   843
\isanewline
haftmann
parents:
diff changeset
   844
\isacommand{qed}\isamarkupfalse%
haftmann
parents:
diff changeset
   845
\ {\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
   846
\isanewline
haftmann
parents:
diff changeset
   847
\isacommand{end}\isamarkupfalse%
haftmann
parents:
diff changeset
   848
\isanewline
haftmann
parents:
diff changeset
   849
\isanewline
haftmann
parents:
diff changeset
   850
\isacommand{lemma}\isamarkupfalse%
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 28462
diff changeset
   851
\ order{\isacharunderscore}prod\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
28447
haftmann
parents:
diff changeset
   852
\ \ {\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
   853
\ \ \ \ \ 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
   854
\ \ {\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
   855
\ \ \ \ \ 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
   856
\ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   857
\ {\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
   858
\endisatagquote
haftmann
parents: 28562
diff changeset
   859
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   860
%
28564
haftmann
parents: 28562
diff changeset
   861
\isadelimquote
28447
haftmann
parents:
diff changeset
   862
%
28564
haftmann
parents: 28562
diff changeset
   863
\endisadelimquote
28447
haftmann
parents:
diff changeset
   864
%
haftmann
parents:
diff changeset
   865
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   866
\noindent Then code generation will fail.  Why?  The definition
haftmann
parents:
diff changeset
   867
  of \isa{op\ {\isasymle}} depends on equality on both arguments,
haftmann
parents:
diff changeset
   868
  which are polymorphic and impose an additional \isa{eq}
haftmann
parents:
diff changeset
   869
  class constraint, which the preprocessor does not propagate
haftmann
parents:
diff changeset
   870
  (for technical reasons).
haftmann
parents:
diff changeset
   871
haftmann
parents:
diff changeset
   872
  The solution is to add \isa{eq} explicitly to the first sort arguments in the
haftmann
parents:
diff changeset
   873
  code theorems:%
haftmann
parents:
diff changeset
   874
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   875
\isamarkuptrue%
haftmann
parents:
diff changeset
   876
%
28564
haftmann
parents: 28562
diff changeset
   877
\isadelimquote
28447
haftmann
parents:
diff changeset
   878
%
28564
haftmann
parents: 28562
diff changeset
   879
\endisadelimquote
28447
haftmann
parents:
diff changeset
   880
%
28564
haftmann
parents: 28562
diff changeset
   881
\isatagquote
28447
haftmann
parents:
diff changeset
   882
\isacommand{lemma}\isamarkupfalse%
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 28462
diff changeset
   883
\ order{\isacharunderscore}prod{\isacharunderscore}code\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
28447
haftmann
parents:
diff changeset
   884
\ \ {\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
   885
\ \ \ \ \ 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
   886
\ \ {\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
   887
\ \ \ \ \ 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
   888
\ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   889
\ {\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
   890
\endisatagquote
haftmann
parents: 28562
diff changeset
   891
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   892
%
28564
haftmann
parents: 28562
diff changeset
   893
\isadelimquote
28447
haftmann
parents:
diff changeset
   894
%
28564
haftmann
parents: 28562
diff changeset
   895
\endisadelimquote
28447
haftmann
parents:
diff changeset
   896
%
haftmann
parents:
diff changeset
   897
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   898
\noindent Then code generation succeeds:%
haftmann
parents:
diff changeset
   899
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   900
\isamarkuptrue%
haftmann
parents:
diff changeset
   901
%
28564
haftmann
parents: 28562
diff changeset
   902
\isadelimquote
28447
haftmann
parents:
diff changeset
   903
%
28564
haftmann
parents: 28562
diff changeset
   904
\endisadelimquote
28447
haftmann
parents:
diff changeset
   905
%
28564
haftmann
parents: 28562
diff changeset
   906
\isatagquote
28447
haftmann
parents:
diff changeset
   907
%
haftmann
parents:
diff changeset
   908
\begin{isamarkuptext}%
28727
185110a4b97a clarified verbatim vs. typewriter
haftmann
parents: 28714
diff changeset
   909
\isatypewriter%
28447
haftmann
parents:
diff changeset
   910
\noindent%
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   911
\hspace*{0pt}structure Example = \\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   912
\hspace*{0pt}struct\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   913
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   914
\hspace*{0pt}type 'a eq = {\char123}eq :~'a -> 'a -> bool{\char125};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   915
\hspace*{0pt}fun eq (A{\char95}:'a eq) = {\char35}eq A{\char95};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   916
\hspace*{0pt}\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
   917
\hspace*{0pt}type 'a ord = {\char123}less{\char95}eq :~'a -> 'a -> bool,~less :~'a -> 'a -> bool{\char125};\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   918
\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
   919
\hspace*{0pt}fun less (A{\char95}:'a ord) = {\char35}less 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}fun eqop A{\char95}~a b = eq A{\char95}~a b;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   922
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   923
\hspace*{0pt}type 'a preorder = {\char123}Orderings{\char95}{\char95}ord{\char95}preorder :~'a ord{\char125};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   924
\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
   925
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   926
\hspace*{0pt}type 'a order = {\char123}Orderings{\char95}{\char95}preorder{\char95}order :~'a preorder{\char125};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   927
\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
   928
\hspace*{0pt}\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
   929
\hspace*{0pt}fun less{\char95}eqa (A1{\char95},~A2{\char95}) B{\char95}~(x1,~y1) (x2,~y2) =\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   930
\hspace*{0pt} ~less ((ord{\char95}preorder o preorder{\char95}order) A2{\char95}) x1 x2 orelse\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   931
\hspace*{0pt} ~~~eqop A1{\char95}~x1 x2 andalso\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
   932
\hspace*{0pt} ~~~~~less{\char95}eq ((ord{\char95}preorder o preorder{\char95}order) B{\char95}) y1 y2\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
   933
\hspace*{0pt} ~| less{\char95}eqa (A1{\char95},~A2{\char95}) B{\char95}~(x1,~y1) (x2,~y2) =\\
28714
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}\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
   938
\hspace*{0pt}end;~(*struct Example*)%
28447
haftmann
parents:
diff changeset
   939
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   940
\isamarkuptrue%
haftmann
parents:
diff changeset
   941
%
28564
haftmann
parents: 28562
diff changeset
   942
\endisatagquote
haftmann
parents: 28562
diff changeset
   943
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   944
%
28564
haftmann
parents: 28562
diff changeset
   945
\isadelimquote
28447
haftmann
parents:
diff changeset
   946
%
28564
haftmann
parents: 28562
diff changeset
   947
\endisadelimquote
28447
haftmann
parents:
diff changeset
   948
%
haftmann
parents:
diff changeset
   949
\begin{isamarkuptext}%
29560
fa6c5d62adf5 "code equation" replaces "defining equation"
haftmann
parents: 29297
diff changeset
   950
In some cases, the automatically derived code equations
28447
haftmann
parents:
diff changeset
   951
  for equality on a particular type may not be appropriate.
haftmann
parents:
diff changeset
   952
  As example, watch the following datatype representing
haftmann
parents:
diff changeset
   953
  monomorphic parametric types (where type constructors
haftmann
parents:
diff changeset
   954
  are referred to by natural numbers):%
haftmann
parents:
diff changeset
   955
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   956
\isamarkuptrue%
haftmann
parents:
diff changeset
   957
%
28564
haftmann
parents: 28562
diff changeset
   958
\isadelimquote
28447
haftmann
parents:
diff changeset
   959
%
28564
haftmann
parents: 28562
diff changeset
   960
\endisadelimquote
28447
haftmann
parents:
diff changeset
   961
%
28564
haftmann
parents: 28562
diff changeset
   962
\isatagquote
28447
haftmann
parents:
diff changeset
   963
\isacommand{datatype}\isamarkupfalse%
haftmann
parents:
diff changeset
   964
\ monotype\ {\isacharequal}\ Mono\ nat\ {\isachardoublequoteopen}monotype\ list{\isachardoublequoteclose}%
28564
haftmann
parents: 28562
diff changeset
   965
\endisatagquote
haftmann
parents: 28562
diff changeset
   966
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   967
%
28564
haftmann
parents: 28562
diff changeset
   968
\isadelimquote
28447
haftmann
parents:
diff changeset
   969
%
28564
haftmann
parents: 28562
diff changeset
   970
\endisadelimquote
28447
haftmann
parents:
diff changeset
   971
%
haftmann
parents:
diff changeset
   972
\isadelimproof
haftmann
parents:
diff changeset
   973
%
haftmann
parents:
diff changeset
   974
\endisadelimproof
haftmann
parents:
diff changeset
   975
%
haftmann
parents:
diff changeset
   976
\isatagproof
haftmann
parents:
diff changeset
   977
%
haftmann
parents:
diff changeset
   978
\endisatagproof
haftmann
parents:
diff changeset
   979
{\isafoldproof}%
haftmann
parents:
diff changeset
   980
%
haftmann
parents:
diff changeset
   981
\isadelimproof
haftmann
parents:
diff changeset
   982
%
haftmann
parents:
diff changeset
   983
\endisadelimproof
haftmann
parents:
diff changeset
   984
%
haftmann
parents:
diff changeset
   985
\begin{isamarkuptext}%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
   986
\noindent Then code generation for SML would fail with a message
28447
haftmann
parents:
diff changeset
   987
  that the generated code contains illegal mutual dependencies:
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
   988
  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
   989
  instance \isa{monotype\ {\isasymColon}\ eq}, which itself requires
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
   990
  \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
   991
  recursive \isa{instance} and \isa{function} definitions,
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28564
diff changeset
   992
  but the SML serialiser does not support this.
28447
haftmann
parents:
diff changeset
   993
haftmann
parents:
diff changeset
   994
  In such cases, you have to provide your own equality equations
haftmann
parents:
diff changeset
   995
  involving auxiliary constants.  In our case,
haftmann
parents:
diff changeset
   996
  \isa{list{\isacharunderscore}all{\isadigit{2}}} can do the job:%
haftmann
parents:
diff changeset
   997
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   998
\isamarkuptrue%
haftmann
parents:
diff changeset
   999
%
28564
haftmann
parents: 28562
diff changeset
  1000
\isadelimquote
28447
haftmann
parents:
diff changeset
  1001
%
28564
haftmann
parents: 28562
diff changeset
  1002
\endisadelimquote
28447
haftmann
parents:
diff changeset
  1003
%
28564
haftmann
parents: 28562
diff changeset
  1004
\isatagquote
28447
haftmann
parents:
diff changeset
  1005
\isacommand{lemma}\isamarkupfalse%
28562
4e74209f113e `code func` now just `code`
haftmann
parents: 28462
diff changeset
  1006
\ monotype{\isacharunderscore}eq{\isacharunderscore}list{\isacharunderscore}all{\isadigit{2}}\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
28447
haftmann
parents:
diff changeset
  1007
\ \ {\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
  1008
\ \ \ \ \ 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
  1009
\ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
  1010
\ {\isacharparenleft}simp\ add{\isacharcolon}\ eq\ list{\isacharunderscore}all{\isadigit{2}}{\isacharunderscore}eq\ {\isacharbrackleft}symmetric{\isacharbrackright}{\isacharparenright}%
28564
haftmann
parents: 28562
diff changeset
  1011
\endisatagquote
haftmann
parents: 28562
diff changeset
  1012
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
  1013
%
28564
haftmann
parents: 28562
diff changeset
  1014
\isadelimquote
28447
haftmann
parents:
diff changeset
  1015
%
28564
haftmann
parents: 28562
diff changeset
  1016
\endisadelimquote
28447
haftmann
parents:
diff changeset
  1017
%
haftmann
parents:
diff changeset
  1018
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
  1019
\noindent does not depend on instance \isa{monotype\ {\isasymColon}\ eq}:%
haftmann
parents:
diff changeset
  1020
\end{isamarkuptext}%
haftmann
parents:
diff changeset
  1021
\isamarkuptrue%
haftmann
parents:
diff changeset
  1022
%
28564
haftmann
parents: 28562
diff changeset
  1023
\isadelimquote
28447
haftmann
parents:
diff changeset
  1024
%
28564
haftmann
parents: 28562
diff changeset
  1025
\endisadelimquote
28447
haftmann
parents:
diff changeset
  1026
%
28564
haftmann
parents: 28562
diff changeset
  1027
\isatagquote
28447
haftmann
parents:
diff changeset
  1028
%
haftmann
parents:
diff changeset
  1029
\begin{isamarkuptext}%
28727
185110a4b97a clarified verbatim vs. typewriter
haftmann
parents: 28714
diff changeset
  1030
\isatypewriter%
28447
haftmann
parents:
diff changeset
  1031
\noindent%
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1032
\hspace*{0pt}structure Example = \\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1033
\hspace*{0pt}struct\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1034
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1035
\hspace*{0pt}datatype nat = Suc of nat | Zero{\char95}nat;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1036
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1037
\hspace*{0pt}fun null [] = true\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1038
\hspace*{0pt} ~| null (x ::~xs) = false;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1039
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1040
\hspace*{0pt}fun eq{\char95}nat (Suc a) Zero{\char95}nat = false\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1041
\hspace*{0pt} ~| eq{\char95}nat Zero{\char95}nat (Suc a) = false\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1042
\hspace*{0pt} ~| eq{\char95}nat (Suc nat) (Suc nat') = eq{\char95}nat nat nat'\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1043
\hspace*{0pt} ~| eq{\char95}nat Zero{\char95}nat Zero{\char95}nat = true;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1044
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1045
\hspace*{0pt}datatype monotype = Mono of nat * monotype list;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1046
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1047
\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
  1048
\hspace*{0pt} ~| list{\char95}all2 p xs [] = null xs\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1049
\hspace*{0pt} ~| list{\char95}all2 p [] ys = null ys;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1050
\hspace*{0pt}\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
  1051
\hspace*{0pt}fun eq{\char95}monotype (Mono (tyco1,~typargs1)) (Mono (tyco2,~typargs2)) =\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1052
\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
  1053
\hspace*{0pt}\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
  1054
\hspace*{0pt}end;~(*struct Example*)%
28447
haftmann
parents:
diff changeset
  1055
\end{isamarkuptext}%
haftmann
parents:
diff changeset
  1056
\isamarkuptrue%
haftmann
parents:
diff changeset
  1057
%
28564
haftmann
parents: 28562
diff changeset
  1058
\endisatagquote
haftmann
parents: 28562
diff changeset
  1059
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
  1060
%
28564
haftmann
parents: 28562
diff changeset
  1061
\isadelimquote
28447
haftmann
parents:
diff changeset
  1062
%
28564
haftmann
parents: 28562
diff changeset
  1063
\endisadelimquote
28447
haftmann
parents:
diff changeset
  1064
%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1065
\isamarkupsubsection{Explicit partiality%
28447
haftmann
parents:
diff changeset
  1066
}
haftmann
parents:
diff changeset
  1067
\isamarkuptrue%
haftmann
parents:
diff changeset
  1068
%
haftmann
parents:
diff changeset
  1069
\begin{isamarkuptext}%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1070
Partiality usually enters the game by partial patterns, as
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1071
  in the following example, again for amortised queues:%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1072
\end{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1073
\isamarkuptrue%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1074
%
28564
haftmann
parents: 28562
diff changeset
  1075
\isadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1076
%
28564
haftmann
parents: 28562
diff changeset
  1077
\endisadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1078
%
28564
haftmann
parents: 28562
diff changeset
  1079
\isatagquote
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1080
\isacommand{definition}\isamarkupfalse%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1081
\ strict{\isacharunderscore}dequeue\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ queue\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymtimes}\ {\isacharprime}a\ queue{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1082
\ \ {\isachardoublequoteopen}strict{\isacharunderscore}dequeue\ q\ {\isacharequal}\ {\isacharparenleft}case\ dequeue\ q\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1083
\ \ \ \ of\ {\isacharparenleft}Some\ x{\isacharcomma}\ q{\isacharprime}{\isacharparenright}\ {\isasymRightarrow}\ {\isacharparenleft}x{\isacharcomma}\ q{\isacharprime}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1084
\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1085
\isacommand{lemma}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1086
\ strict{\isacharunderscore}dequeue{\isacharunderscore}AQueue\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1087
\ \ {\isachardoublequoteopen}strict{\isacharunderscore}dequeue\ {\isacharparenleft}AQueue\ xs\ {\isacharparenleft}y\ {\isacharhash}\ ys{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}y{\isacharcomma}\ AQueue\ xs\ ys{\isacharparenright}{\isachardoublequoteclose}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1088
\ \ {\isachardoublequoteopen}strict{\isacharunderscore}dequeue\ {\isacharparenleft}AQueue\ xs\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1089
\ \ \ \ {\isacharparenleft}case\ rev\ xs\ of\ y\ {\isacharhash}\ ys\ {\isasymRightarrow}\ {\isacharparenleft}y{\isacharcomma}\ AQueue\ {\isacharbrackleft}{\isacharbrackright}\ ys{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1090
\ \ \isacommand{by}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1091
\ {\isacharparenleft}simp{\isacharunderscore}all\ add{\isacharcolon}\ strict{\isacharunderscore}dequeue{\isacharunderscore}def\ dequeue{\isacharunderscore}AQueue\ split{\isacharcolon}\ list{\isachardot}splits{\isacharparenright}%
28564
haftmann
parents: 28562
diff changeset
  1092
\endisatagquote
haftmann
parents: 28562
diff changeset
  1093
{\isafoldquote}%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1094
%
28564
haftmann
parents: 28562
diff changeset
  1095
\isadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1096
%
28564
haftmann
parents: 28562
diff changeset
  1097
\endisadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1098
%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1099
\begin{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1100
\noindent In the corresponding code, there is no equation
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1101
  for the pattern \isa{Program{\isachardot}AQueue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbrackleft}{\isacharbrackright}}:%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1102
\end{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1103
\isamarkuptrue%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1104
%
28564
haftmann
parents: 28562
diff changeset
  1105
\isadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1106
%
28564
haftmann
parents: 28562
diff changeset
  1107
\endisadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1108
%
28564
haftmann
parents: 28562
diff changeset
  1109
\isatagquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1110
%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1111
\begin{isamarkuptext}%
28727
185110a4b97a clarified verbatim vs. typewriter
haftmann
parents: 28714
diff changeset
  1112
\isatypewriter%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1113
\noindent%
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
  1114
\hspace*{0pt}strict{\char95}dequeue ::~forall a.~Queue a -> (a,~Queue a);\\
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1115
\hspace*{0pt}strict{\char95}dequeue (AQueue xs []) =\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1116
\hspace*{0pt} ~let {\char123}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1117
\hspace*{0pt} ~~~(y :~ys) = rev xs;\\
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1118
\hspace*{0pt} ~{\char125}~in (y,~AQueue [] ys);\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1119
\hspace*{0pt}strict{\char95}dequeue (AQueue xs (y :~ys)) = (y,~AQueue xs ys);%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1120
\end{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1121
\isamarkuptrue%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1122
%
28564
haftmann
parents: 28562
diff changeset
  1123
\endisatagquote
haftmann
parents: 28562
diff changeset
  1124
{\isafoldquote}%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1125
%
28564
haftmann
parents: 28562
diff changeset
  1126
\isadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1127
%
28564
haftmann
parents: 28562
diff changeset
  1128
\endisadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1129
%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1130
\begin{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1131
\noindent In some cases it is desirable to have this
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1132
  pseudo-\qt{partiality} more explicitly, e.g.~as follows:%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1133
\end{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1134
\isamarkuptrue%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1135
%
28564
haftmann
parents: 28562
diff changeset
  1136
\isadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1137
%
28564
haftmann
parents: 28562
diff changeset
  1138
\endisadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1139
%
28564
haftmann
parents: 28562
diff changeset
  1140
\isatagquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1141
\isacommand{axiomatization}\isamarkupfalse%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1142
\ empty{\isacharunderscore}queue\ {\isacharcolon}{\isacharcolon}\ {\isacharprime}a\isanewline
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1143
\isanewline
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1144
\isacommand{definition}\isamarkupfalse%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1145
\ strict{\isacharunderscore}dequeue{\isacharprime}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ queue\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymtimes}\ {\isacharprime}a\ queue{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1146
\ \ {\isachardoublequoteopen}strict{\isacharunderscore}dequeue{\isacharprime}\ q\ {\isacharequal}\ {\isacharparenleft}case\ dequeue\ q\ of\ {\isacharparenleft}Some\ x{\isacharcomma}\ q{\isacharprime}{\isacharparenright}\ {\isasymRightarrow}\ {\isacharparenleft}x{\isacharcomma}\ q{\isacharprime}{\isacharparenright}\ {\isacharbar}\ {\isacharunderscore}\ {\isasymRightarrow}\ empty{\isacharunderscore}queue{\isacharparenright}{\isachardoublequoteclose}\isanewline
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1147
\isanewline
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1148
\isacommand{lemma}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1149
\ strict{\isacharunderscore}dequeue{\isacharprime}{\isacharunderscore}AQueue\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1150
\ \ {\isachardoublequoteopen}strict{\isacharunderscore}dequeue{\isacharprime}\ {\isacharparenleft}AQueue\ xs\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}if\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ then\ empty{\isacharunderscore}queue\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1151
\ \ \ \ \ else\ strict{\isacharunderscore}dequeue{\isacharprime}\ {\isacharparenleft}AQueue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharparenleft}rev\ xs{\isacharparenright}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1152
\ \ {\isachardoublequoteopen}strict{\isacharunderscore}dequeue{\isacharprime}\ {\isacharparenleft}AQueue\ xs\ {\isacharparenleft}y\ {\isacharhash}\ ys{\isacharparenright}{\isacharparenright}\ {\isacharequal}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1153
\ \ \ \ \ {\isacharparenleft}y{\isacharcomma}\ AQueue\ xs\ ys{\isacharparenright}{\isachardoublequoteclose}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1154
\ \ \isacommand{by}\isamarkupfalse%
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1155
\ {\isacharparenleft}simp{\isacharunderscore}all\ add{\isacharcolon}\ strict{\isacharunderscore}dequeue{\isacharprime}{\isacharunderscore}def\ dequeue{\isacharunderscore}AQueue\ split{\isacharcolon}\ list{\isachardot}splits{\isacharparenright}%
28564
haftmann
parents: 28562
diff changeset
  1156
\endisatagquote
haftmann
parents: 28562
diff changeset
  1157
{\isafoldquote}%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1158
%
28564
haftmann
parents: 28562
diff changeset
  1159
\isadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1160
%
28564
haftmann
parents: 28562
diff changeset
  1161
\endisadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1162
%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1163
\begin{isamarkuptext}%
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1164
Observe that on the right hand side of the definition of \isa{strict{\isacharunderscore}dequeue{\isacharprime}} the constant \isa{empty{\isacharunderscore}queue} occurs
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1165
  which is unspecified.
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1166
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1167
  Normally, if constants without any code equations occur in a
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1168
  program, the code generator complains (since in most cases this is
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1169
  not what the user expects).  But such constants can also be thought
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1170
  of as function definitions with no equations which always fail,
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1171
  since there is never a successful pattern match on the left hand
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1172
  side.  In order to categorise a constant into that category
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1173
  explicitly, use \hyperlink{command.code-abort}{\mbox{\isa{\isacommand{code{\isacharunderscore}abort}}}}:%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1174
\end{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1175
\isamarkuptrue%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1176
%
28564
haftmann
parents: 28562
diff changeset
  1177
\isadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1178
%
28564
haftmann
parents: 28562
diff changeset
  1179
\endisadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1180
%
28564
haftmann
parents: 28562
diff changeset
  1181
\isatagquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1182
\isacommand{code{\isacharunderscore}abort}\isamarkupfalse%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1183
\ empty{\isacharunderscore}queue%
28564
haftmann
parents: 28562
diff changeset
  1184
\endisatagquote
haftmann
parents: 28562
diff changeset
  1185
{\isafoldquote}%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1186
%
28564
haftmann
parents: 28562
diff changeset
  1187
\isadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1188
%
28564
haftmann
parents: 28562
diff changeset
  1189
\endisadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1190
%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1191
\begin{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1192
\noindent Then the code generator will just insert an error or
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1193
  exception at the appropriate position:%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1194
\end{isamarkuptext}%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1195
\isamarkuptrue%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1196
%
28564
haftmann
parents: 28562
diff changeset
  1197
\isadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1198
%
28564
haftmann
parents: 28562
diff changeset
  1199
\endisadelimquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1200
%
28564
haftmann
parents: 28562
diff changeset
  1201
\isatagquote
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1202
%
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1203
\begin{isamarkuptext}%
28727
185110a4b97a clarified verbatim vs. typewriter
haftmann
parents: 28714
diff changeset
  1204
\isatypewriter%
28462
6ec603695aaf added partiality section
haftmann
parents: 28456
diff changeset
  1205
\noindent%
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
  1206
\hspace*{0pt}empty{\char95}queue ::~forall a.~a;\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1207
\hspace*{0pt}empty{\char95}queue = error {\char34}empty{\char95}queue{\char34};\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28593
diff changeset
  1208
\hspace*{0pt}\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
  1209
\hspace*{0pt}strict{\char95}dequeue' ::~forall a.~Queue a -> (a,~Queue a);\\
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1210
\hspace*{0pt}strict{\char95}dequeue' (AQueue xs (y :~ys)) = (y,~AQueue xs ys);\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1211
\hspace*{0pt}strict{\char95}dequeue' (AQueue xs []) =\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1212
\hspace*{0pt} ~(if nulla xs then empty{\char95}queue\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
  1213
\hspace*{0pt} ~~~else strict{\char95}dequeue' (AQueue [] (rev xs)));%
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: