doc-src/IsarAdvanced/Codegen/Thy/document/Codegen.tex
author haftmann
Fri, 26 Jan 2007 09:24:35 +0100
changeset 22188 a63889770d57
parent 22060 8a37090726e8
child 22292 3b118010ec08
permissions -rw-r--r--
adjusted manual to improved treatment of overloaded constants
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
     1
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
     2
\begin{isabellebody}%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
     3
\def\isabellecontext{Codegen}%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
     4
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
     5
\isadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
     6
\isanewline
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
     7
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
     8
\endisadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
     9
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    10
\isatagtheory
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    11
%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    12
\endisatagtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    13
{\isafoldtheory}%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    14
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    15
\isadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    16
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    17
\endisadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    18
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    19
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    20
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    21
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    22
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    23
\isatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    24
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    25
\endisatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    26
{\isafoldML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    27
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    28
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    29
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    30
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    31
%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    32
\isamarkupchapter{Code generation from Isabelle theories%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    33
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    34
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    35
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    36
\isamarkupsection{Introduction%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    37
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    38
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    39
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    40
\isamarkupsubsection{Motivation%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    41
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    42
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    43
%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    44
\begin{isamarkuptext}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    45
Executing formal specifications as programs is a well-established
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    46
  topic in the theorem proving community.  With increasing
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    47
  application of theorem proving systems in the area of
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    48
  software development and verification, its relevance manifests
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    49
  for running test cases and rapid prototyping.  In logical
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    50
  calculi like constructive type theory,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    51
  a notion of executability is implicit due to the nature
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    52
  of the calculus.  In contrast, specifications in Isabelle/HOL
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    53
  can be highly non-executable.  In order to bridge
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    54
  the gap between logic and executable specifications,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    55
  an explicit non-trivial transformation has to be applied:
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    56
  code generation.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    57
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    58
  This tutorial introduces a generic code generator for the
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    59
  Isabelle system \cite{isa-tutorial}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    60
  Generic in the sense that the
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    61
  \qn{target language} for which code shall ultimately be
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    62
  generated is not fixed but may be an arbitrary state-of-the-art
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    63
  functional programming language (currently, the implementation
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    64
  supports SML \cite{web:sml} and Haskell \cite{web:haskell}).
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    65
  We aim to provide a
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    66
  versatile environment
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    67
  suitable for software development and verification,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    68
  structuring the process
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    69
  of code generation into a small set of orthogonal principles
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    70
  while achieving a big coverage of application areas
21348
haftmann
parents: 21186
diff changeset
    71
  with maximum flexibility.
haftmann
parents: 21186
diff changeset
    72
haftmann
parents: 21186
diff changeset
    73
  For readers, some familiarity and experience
haftmann
parents: 21186
diff changeset
    74
  with the the ingredients
haftmann
parents: 21186
diff changeset
    75
  of the HOL \emph{Main} theory is assumed.%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    76
\end{isamarkuptext}%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    77
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    78
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    79
\isamarkupsubsection{Overview%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    80
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    81
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    82
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    83
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    84
The code generator aims to be usable with no further ado
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    85
  in most cases while allowing for detailed customization.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    86
  This manifests in the structure of this tutorial: this introduction
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    87
  continues with a short introduction of concepts.  Section
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
    88
  \secref{sec:basics} explains how to use the framework naively,
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    89
  presuming a reasonable default setup.  Then, section
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    90
  \secref{sec:advanced} deals with advanced topics,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    91
  introducing further aspects of the code generator framework
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    92
  in a motivation-driven manner.  Last, section \secref{sec:ml}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    93
  introduces the framework's internal programming interfaces.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    94
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    95
  \begin{warn}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    96
    Ultimately, the code generator which this tutorial deals with
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    97
    is supposed to replace the already established code generator
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    98
    by Stefan Berghofer \cite{Berghofer-Nipkow:2002}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    99
    So, for the moment, there are two distinct code generators
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   100
    in Isabelle.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   101
    Also note that while the framework itself is largely
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   102
    object-logic independent, only HOL provides a reasonable
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   103
    framework setup.    
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   104
  \end{warn}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   105
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   106
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   107
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   108
\isamarkupsubsection{Code generation process%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   109
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   110
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   111
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   112
\begin{isamarkuptext}%
21348
haftmann
parents: 21186
diff changeset
   113
\begin{figure}[h]
haftmann
parents: 21186
diff changeset
   114
  \centering
haftmann
parents: 21186
diff changeset
   115
  \includegraphics[width=0.7\textwidth]{codegen_process}
haftmann
parents: 21186
diff changeset
   116
  \caption{code generator -- processing overview}
haftmann
parents: 21186
diff changeset
   117
  \label{fig:process}
haftmann
parents: 21186
diff changeset
   118
  \end{figure}
haftmann
parents: 21186
diff changeset
   119
haftmann
parents: 21186
diff changeset
   120
  The code generator employs a notion of executability
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   121
  for three foundational executable ingredients known
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   122
  from functional programming:
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   123
  \emph{defining equations}, \emph{datatypes}, and
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   124
  \emph{type classes}. A defining equation as a first approximation
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   125
  is a theorem of the form \isa{f\ t\isactrlisub {\isadigit{1}}\ t\isactrlisub {\isadigit{2}}\ {\isasymdots}\ t\isactrlisub n\ {\isasymequiv}\ t}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   126
  (an equation headed by a constant \isa{f} with arguments
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   127
  \isa{t\isactrlisub {\isadigit{1}}\ t\isactrlisub {\isadigit{2}}\ {\isasymdots}\ t\isactrlisub n} and right hand side \isa{t}.
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   128
  Code generation aims to turn defining equations
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   129
  into a functional program by running through
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   130
  a process (see figure \ref{fig:process}):
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   131
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   132
  \begin{itemize}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   133
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   134
    \item Out of the vast collection of theorems proven in a
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   135
      \qn{theory}, a reasonable subset modeling
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   136
      defining equations is \qn{selected}.
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   137
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   138
    \item On those selected theorems, certain
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   139
      transformations are carried out
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   140
      (\qn{preprocessing}).  Their purpose is to turn theorems
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   141
      representing non- or badly executable
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   142
      specifications into equivalent but executable counterparts.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   143
      The result is a structured collection of \qn{code theorems}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   144
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   145
    \item These \qn{code theorems} then are extracted
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   146
      into an Haskell-like intermediate
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   147
      language.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   148
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   149
    \item Finally, out of the intermediate language the final
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   150
      code in the desired \qn{target language} is \qn{serialized}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   151
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   152
  \end{itemize}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   153
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   154
  From these steps, only the two last are carried out
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   155
  outside the logic; by keeping this layer as
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   156
  thin as possible, the amount of code to trust is
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   157
  kept to a minimum.%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   158
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   159
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   160
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   161
\isamarkupsection{Basics \label{sec:basics}%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   162
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   163
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   164
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   165
\isamarkupsubsection{Invoking the code generator%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   166
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   167
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   168
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   169
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   170
Thanks to a reasonable setup of the HOL theories, in
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   171
  most cases code generation proceeds without further ado:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   172
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   173
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   174
\isacommand{consts}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   175
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   176
\ \ fac\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   177
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   178
\isacommand{primrec}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   179
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   180
\ \ {\isachardoublequoteopen}fac\ {\isadigit{0}}\ {\isacharequal}\ {\isadigit{1}}{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   181
\ \ {\isachardoublequoteopen}fac\ {\isacharparenleft}Suc\ n{\isacharparenright}\ {\isacharequal}\ Suc\ n\ {\isacharasterisk}\ fac\ n{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   182
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   183
This executable specification is now turned to SML code:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   184
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   185
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   186
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   187
\ fac\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}fac{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   188
\begin{isamarkuptext}%
21348
haftmann
parents: 21186
diff changeset
   189
The \isa{{\isasymCODEGEN}} command takes a space-separated list of
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   190
  constants together with \qn{serialization directives}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   191
  in parentheses. These start with a \qn{target language}
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   192
  identifier, followed by arguments, their semantics
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   193
  depending on the target. In the SML case, a filename
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   194
  is given where to write the generated code to.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   195
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   196
  Internally, the defining equations for all selected
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   197
  constants are taken, including any transitively required
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   198
  constants, datatypes and classes, resulting in the following
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   199
  code:
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   200
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   201
  \lstsml{Thy/examples/fac.ML}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   202
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   203
  The code generator will complain when a required
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   204
  ingredient does not provide a executable counterpart.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   205
  This is the case if an involved type is not a datatype:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   206
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   207
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   208
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   209
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   210
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   211
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   212
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   213
\isatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   214
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   215
\endisatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   216
{\isafoldML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   217
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   218
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   219
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   220
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   221
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   222
\isacommand{typedecl}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   223
\ {\isacharprime}a\ foo\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   224
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   225
\isacommand{definition}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   226
\isanewline
21993
4b802a9e0738 updated manual
haftmann
parents: 21452
diff changeset
   227
\ \ bar\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ foo\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   228
\ \ {\isachardoublequoteopen}bar\ x\ y\ {\isacharequal}\ y{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   229
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   230
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   231
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   232
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   233
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   234
\isatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   235
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   236
\endisatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   237
{\isafoldML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   238
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   239
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   240
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   241
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   242
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   243
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   244
\ bar\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}fail{\isacharunderscore}type{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   245
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   246
\noindent will result in an error. Likewise, generating code
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   247
  for constants not yielding
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   248
  a defining equation will fail, e.g.~the Hilbert choice
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   249
  operation \isa{SOME}:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   250
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   251
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   252
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   253
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   254
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   255
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   256
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   257
\isatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   258
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   259
\endisatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   260
{\isafoldML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   261
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   262
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   263
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   264
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   265
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   266
\isacommand{definition}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   267
\isanewline
21993
4b802a9e0738 updated manual
haftmann
parents: 21452
diff changeset
   268
\ \ pick{\isacharunderscore}some\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   269
\ \ {\isachardoublequoteopen}pick{\isacharunderscore}some\ xs\ {\isacharequal}\ {\isacharparenleft}SOME\ x{\isachardot}\ x\ {\isasymin}\ set\ xs{\isacharparenright}{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   270
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   271
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   272
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   273
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   274
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   275
\isatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   276
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   277
\endisatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   278
{\isafoldML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   279
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   280
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   281
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   282
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   283
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   284
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   285
\ pick{\isacharunderscore}some\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}fail{\isacharunderscore}const{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   286
\isamarkupsubsection{Theorem selection%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   287
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   288
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   289
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   290
\begin{isamarkuptext}%
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   291
The list of all defining equations in a theory may be inspected
21348
haftmann
parents: 21186
diff changeset
   292
  using the \isa{{\isasymPRINTCODETHMS}} command:%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   293
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   294
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   295
\isacommand{print{\isacharunderscore}codethms}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   296
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   297
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   298
\noindent which displays a table of constant with corresponding
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   299
  defining equations (the additional stuff displayed
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   300
  shall not bother us for the moment). If this table does
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   301
  not provide at least one function
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   302
  equation, the table of primitive definitions is searched
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   303
  whether it provides one.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   304
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   305
  The typical HOL tools are already set up in a way that
21348
haftmann
parents: 21186
diff changeset
   306
  function definitions introduced by \isa{{\isasymFUN}},
haftmann
parents: 21186
diff changeset
   307
  \isa{{\isasymFUNCTION}}, \isa{{\isasymPRIMREC}}
haftmann
parents: 21186
diff changeset
   308
  \isa{{\isasymRECDEF}} are implicitly propagated
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   309
  to this defining equation table. Specific theorems may be
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   310
  selected using an attribute: \emph{code func}. As example,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   311
  a weight selector function:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   312
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   313
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   314
\isacommand{consts}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   315
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   316
\ \ pick\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharparenleft}nat\ {\isasymtimes}\ {\isacharprime}a{\isacharparenright}\ list\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   317
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   318
\isacommand{primrec}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   319
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   320
\ \ {\isachardoublequoteopen}pick\ {\isacharparenleft}x{\isacharhash}xs{\isacharparenright}\ n\ {\isacharequal}\ {\isacharparenleft}let\ {\isacharparenleft}k{\isacharcomma}\ v{\isacharparenright}\ {\isacharequal}\ x\ in\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   321
\ \ \ \ if\ n\ {\isacharless}\ k\ then\ v\ else\ pick\ xs\ {\isacharparenleft}n\ {\isacharminus}\ k{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   322
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   323
We want to eliminate the explicit destruction
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   324
  of \isa{x} to \isa{{\isacharparenleft}k{\isacharcomma}\ v{\isacharparenright}}:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   325
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   326
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   327
\isacommand{lemma}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   328
\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   329
\ \ {\isachardoublequoteopen}pick\ {\isacharparenleft}{\isacharparenleft}k{\isacharcomma}\ v{\isacharparenright}{\isacharhash}xs{\isacharparenright}\ n\ {\isacharequal}\ {\isacharparenleft}if\ n\ {\isacharless}\ k\ then\ v\ else\ pick\ xs\ {\isacharparenleft}n\ {\isacharminus}\ k{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   330
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   331
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   332
\ \ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   333
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   334
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   335
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   336
\isacommand{by}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   337
\ simp%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   338
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   339
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   340
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   341
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   342
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   343
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   344
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   345
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   346
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   347
\ pick\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}pick{\isadigit{1}}{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   348
\begin{isamarkuptext}%
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   349
This theorem is now added to the defining equation table:
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   350
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   351
  \lstsml{Thy/examples/pick1.ML}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   352
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   353
  It might be convenient to remove the pointless original
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   354
  equation, using the \emph{nofunc} attribute:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   355
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   356
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   357
\isacommand{lemmas}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   358
\ {\isacharbrackleft}code\ nofunc{\isacharbrackright}\ {\isacharequal}\ pick{\isachardot}simps\ \isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   359
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   360
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   361
\ pick\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}pick{\isadigit{2}}{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   362
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   363
\lstsml{Thy/examples/pick2.ML}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   364
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   365
  Syntactic redundancies are implicitly dropped. For example,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   366
  using a modified version of the \isa{fac} function
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   367
  as defining equation, the then redundant (since
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   368
  syntactically subsumed) original defining equations
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   369
  are dropped, resulting in a warning:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   370
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   371
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   372
\isacommand{lemma}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   373
\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   374
\ \ {\isachardoublequoteopen}fac\ n\ {\isacharequal}\ {\isacharparenleft}case\ n\ of\ {\isadigit{0}}\ {\isasymRightarrow}\ {\isadigit{1}}\ {\isacharbar}\ Suc\ m\ {\isasymRightarrow}\ n\ {\isacharasterisk}\ fac\ m{\isacharparenright}{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   375
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   376
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   377
\ \ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   378
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   379
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   380
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   381
\isacommand{by}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   382
\ {\isacharparenleft}cases\ n{\isacharparenright}\ simp{\isacharunderscore}all%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   383
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   384
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   385
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   386
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   387
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   388
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   389
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   390
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   391
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   392
\ fac\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}fac{\isacharunderscore}case{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   393
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   394
\lstsml{Thy/examples/fac_case.ML}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   395
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   396
  \begin{warn}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   397
    Some statements in this section have to be treated with some
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   398
    caution. First, since the HOL function package is still
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   399
    under development, its setup with respect to code generation
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   400
    may differ from what is presumed here.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   401
    Further, the attributes \emph{code} and \emph{code del}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   402
    associated with the existing code generator also apply to
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   403
    the new one: \emph{code} implies \emph{code func},
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   404
    and \emph{code del} implies \emph{code nofunc}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   405
  \end{warn}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   406
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   407
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   408
%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   409
\isamarkupsubsection{Type classes%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   410
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   411
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   412
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   413
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   414
Type classes enter the game via the Isar class package.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   415
  For a short introduction how to use it, see \cite{isabelle-classes};
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   416
  here we just illustrate its impact on code generation.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   417
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   418
  In a target language, type classes may be represented
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   419
  natively (as in the case of Haskell). For languages
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   420
  like SML, they are implemented using \emph{dictionaries}.
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   421
  Our following example specifies a class \qt{null},
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   422
  assigning to each of its inhabitants a \qt{null} value:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   423
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   424
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   425
\isacommand{class}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   426
\ null\ {\isacharequal}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   427
\ \ \isakeyword{fixes}\ null\ {\isacharcolon}{\isacharcolon}\ {\isacharprime}a\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   428
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   429
\isacommand{consts}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   430
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   431
\ \ head\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a{\isasymColon}null\ list\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   432
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   433
\isacommand{primrec}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   434
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   435
\ \ {\isachardoublequoteopen}head\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ null{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   436
\ \ {\isachardoublequoteopen}head\ {\isacharparenleft}x{\isacharhash}xs{\isacharparenright}\ {\isacharequal}\ x{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   437
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   438
We provide some instances for our \isa{null}:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   439
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   440
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   441
\isacommand{instance}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   442
\ option\ {\isacharcolon}{\isacharcolon}\ {\isacharparenleft}type{\isacharparenright}\ null\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   443
\ \ {\isachardoublequoteopen}null\ {\isasymequiv}\ None{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   444
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   445
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   446
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   447
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   448
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   449
\isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   450
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   451
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   452
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   453
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   454
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   455
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   456
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   457
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   458
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   459
\isacommand{instance}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   460
\ list\ {\isacharcolon}{\isacharcolon}\ {\isacharparenleft}type{\isacharparenright}\ null\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   461
\ \ {\isachardoublequoteopen}null\ {\isasymequiv}\ {\isacharbrackleft}{\isacharbrackright}{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   462
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   463
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   464
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   465
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   466
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   467
\isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   468
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   469
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   470
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   471
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   472
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   473
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   474
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   475
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   476
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   477
Constructing a dummy example:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   478
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   479
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   480
\isacommand{definition}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   481
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   482
\ \ {\isachardoublequoteopen}dummy\ {\isacharequal}\ head\ {\isacharbrackleft}Some\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}{\isacharcomma}\ None{\isacharbrackright}{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   483
\begin{isamarkuptext}%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   484
Type classes offer a suitable occasion to introduce
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   485
  the Haskell serializer.  Its usage is almost the same
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   486
  as SML, but, in accordance with conventions
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   487
  some Haskell systems enforce, each module ends
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   488
  up in a single file. The module hierarchy is reflected in
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   489
  the file system, with root given by the user.%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   490
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   491
\isamarkuptrue%
22188
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
   492
%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
   493
\isadelimML
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
   494
%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
   495
\endisadelimML
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
   496
%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
   497
\isatagML
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
   498
\isacommand{ML}\isamarkupfalse%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
   499
\ {\isacharverbatimopen}\ set\ Toplevel{\isachardot}debug\ {\isacharverbatimclose}%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
   500
\endisatagML
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
   501
{\isafoldML}%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
   502
%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
   503
\isadelimML
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
   504
%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
   505
\endisadelimML
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
   506
\isanewline
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   507
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   508
\ dummy\ {\isacharparenleft}Haskell\ {\isachardoublequoteopen}examples{\isacharslash}{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   509
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   510
\lsthaskell{Thy/examples/Codegen.hs}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   511
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   512
  (we have left out all other modules).
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   513
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   514
  The whole code in SML with explicit dictionary passing:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   515
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   516
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   517
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   518
\ dummy\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}class{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   519
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   520
\lstsml{Thy/examples/class.ML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   521
\end{isamarkuptext}%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   522
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   523
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   524
\isamarkupsubsection{Incremental code generation%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   525
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   526
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   527
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   528
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   529
Code generation is \emph{incremental}: theorems
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   530
  and abstract intermediate code are cached and extended on demand.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   531
  The cache may be partially or fully dropped if the underlying
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   532
  executable content of the theory changes.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   533
  Implementation of caching is supposed to transparently
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   534
  hid away the details from the user.  Anyway, caching
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   535
  reaches the surface by using a slightly more general form
21348
haftmann
parents: 21186
diff changeset
   536
  of the \isa{{\isasymCODEGEN}}: either the list of constants or the
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   537
  list of serialization expressions may be dropped.  If no
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   538
  serialization expressions are given, only abstract code
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   539
  is generated and cached; if no constants are given, the
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   540
  current cache is serialized.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   541
21348
haftmann
parents: 21186
diff changeset
   542
  For explorative purpose, an extended version of the
haftmann
parents: 21186
diff changeset
   543
  \isa{{\isasymCODEGEN}} command may prove useful:%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   544
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   545
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   546
\isacommand{print{\isacharunderscore}codethms}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   547
\ {\isacharparenleft}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   548
\begin{isamarkuptext}%
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   549
\noindent print all cached defining equations (i.e.~\emph{after}
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
   550
  any applied transformation). Inside the brackets a
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   551
  list of constants may be given; their function
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   552
  equations are added to the cache if not already present.%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   553
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   554
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   555
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   556
\isamarkupsection{Recipes and advanced topics \label{sec:advanced}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   557
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   558
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   559
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   560
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   561
In this tutorial, we do not attempt to give an exhaustive
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   562
  description of the code generator framework; instead,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   563
  we cast a light on advanced topics by introducing
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   564
  them together with practically motivated examples.  Concerning
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   565
  further reading, see
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   566
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   567
  \begin{itemize}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   568
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   569
  \item the Isabelle/Isar Reference Manual \cite{isabelle-isar-ref}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   570
    for exhaustive syntax diagrams.
21348
haftmann
parents: 21186
diff changeset
   571
  \item or \fixme[ref] which deals with foundational issues
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   572
    of the code generator framework.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   573
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   574
  \end{itemize}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   575
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   576
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   577
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   578
\isamarkupsubsection{Library theories%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   579
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   580
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   581
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   582
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   583
The HOL \emph{Main} theory already provides a code generator setup
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   584
  which should be suitable for most applications. Common extensions
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   585
  and modifications are available by certain theories of the HOL
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   586
  library; beside being useful in applications, they may serve
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   587
  as a tutorial for customizing the code generator setup.
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   588
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   589
  \begin{description}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   590
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
   591
    \item[\isa{ExecutableSet}] allows to generate code
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   592
       for finite sets using lists.
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
   593
    \item[\isa{ExecutableRat}] \label{exec_rat} implements rational
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   594
       numbers as triples \isa{{\isacharparenleft}sign{\isacharcomma}\ enumerator{\isacharcomma}\ denominator{\isacharparenright}}.
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
   595
    \item[\isa{EfficientNat}] \label{eff_nat} implements natural numbers by integers,
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   596
       which in general will result in higher efficency; pattern
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   597
       matching with \isa{{\isadigit{0}}} / \isa{Suc}
21348
haftmann
parents: 21186
diff changeset
   598
       is eliminated.
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
   599
    \item[\isa{MLString}] provides an additional datatype \isa{mlstring};
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   600
       in the HOL default setup, strings in HOL are mapped to list
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   601
       of chars in SML; values of type \isa{mlstring} are
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   602
       mapped to strings in SML.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   603
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   604
  \end{description}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   605
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   606
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   607
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   608
\isamarkupsubsection{Preprocessing%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   609
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   610
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   611
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   612
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   613
Before selected function theorems are turned into abstract
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   614
  code, a chain of definitional transformation steps is carried
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   615
  out: \emph{preprocessing}. There are three possibilities
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   616
  to customize preprocessing: \emph{inline theorems},
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   617
  \emph{inline procedures} and \emph{generic preprocessors}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   618
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   619
  \emph{Inline theorems} are rewriting rules applied to each
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   620
  defining equation.  Due to the interpretation of theorems
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   621
  of defining equations, rewrites are applied to the right
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   622
  hand side and the arguments of the left hand side of an
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   623
  equation, but never to the constant heading the left hand side.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   624
  Inline theorems may be declared an undeclared using the
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   625
  \emph{code inline} or \emph{code noinline} attribute respectively.
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   626
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   627
  Some common applications:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   628
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   629
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   630
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   631
\begin{itemize}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   632
     \item replacing non-executable constructs by executable ones: \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   633
\isacommand{lemma}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   634
\ {\isacharbrackleft}code\ inline{\isacharbrackright}{\isacharcolon}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   635
\ \ {\isachardoublequoteopen}x\ {\isasymin}\ set\ xs\ {\isasymlongleftrightarrow}\ x\ mem\ xs{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   636
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   637
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   638
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   639
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   640
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   641
\isacommand{by}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   642
\ {\isacharparenleft}induct\ xs{\isacharparenright}\ simp{\isacharunderscore}all%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   643
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   644
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   645
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   646
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   647
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   648
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   649
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   650
\item eliminating superfluous constants: \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   651
\isacommand{lemma}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   652
\ {\isacharbrackleft}code\ inline{\isacharbrackright}{\isacharcolon}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   653
\ \ {\isachardoublequoteopen}{\isadigit{1}}\ {\isacharequal}\ Suc\ {\isadigit{0}}{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   654
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   655
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   656
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   657
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   658
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   659
\isacommand{by}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   660
\ simp%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   661
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   662
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   663
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   664
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   665
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   666
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   667
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   668
\item replacing executable but inconvenient constructs: \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   669
\isacommand{lemma}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   670
\ {\isacharbrackleft}code\ inline{\isacharbrackright}{\isacharcolon}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   671
\ \ {\isachardoublequoteopen}xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymlongleftrightarrow}\ List{\isachardot}null\ xs{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   672
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   673
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   674
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   675
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   676
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   677
\isacommand{by}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   678
\ {\isacharparenleft}induct\ xs{\isacharparenright}\ simp{\isacharunderscore}all%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   679
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   680
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   681
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   682
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   683
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   684
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   685
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   686
\end{itemize}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   687
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   688
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   689
The current set of inline theorems may be inspected using
21348
haftmann
parents: 21186
diff changeset
   690
  the \isa{{\isasymPRINTCODETHMS}} command.
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   691
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   692
  \emph{Inline procedures} are a generalized version of inline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   693
  theorems written in ML -- rewrite rules are generated dependent
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   694
  on the function theorems for a certain function.  One
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   695
  application is the implicit expanding of \isa{nat} numerals
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   696
  to \isa{{\isadigit{0}}} / \isa{Suc} representation.  See further
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   697
  \secref{sec:ml}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   698
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   699
  \emph{Generic preprocessors} provide a most general interface,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   700
  transforming a list of function theorems to another
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   701
  list of function theorems, provided that neither the heading
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   702
  constant nor its type change.  The \isa{{\isadigit{0}}} / \isa{Suc}
21348
haftmann
parents: 21186
diff changeset
   703
  pattern elimination implemented in
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
   704
  theory \isa{EfficientNat} (\secref{eff_nat}) uses this
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   705
  interface.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   706
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   707
  \begin{warn}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   708
    The order in which single preprocessing steps are carried
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   709
    out currently is not specified; in particular, preprocessing
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   710
    is \emph{no} fix point process.  Keep this in mind when
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   711
    setting up the preprocessor.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   712
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   713
    Further, the attribute \emph{code unfold}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   714
    associated with the existing code generator also applies to
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   715
    the new one: \emph{code unfold} implies \emph{code inline}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   716
  \end{warn}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   717
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   718
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   719
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   720
\isamarkupsubsection{Customizing serialization%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   721
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   722
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   723
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   724
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   725
Consider the following function and its corresponding
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   726
  SML code:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   727
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   728
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   729
\isacommand{fun}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   730
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   731
\ \ in{\isacharunderscore}interval\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymtimes}\ nat\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ bool{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
21348
haftmann
parents: 21186
diff changeset
   732
\ \ {\isachardoublequoteopen}in{\isacharunderscore}interval\ {\isacharparenleft}k{\isacharcomma}\ l{\isacharparenright}\ n\ {\isasymlongleftrightarrow}\ k\ {\isasymle}\ n\ {\isasymand}\ n\ {\isasymle}\ l{\isachardoublequoteclose}%
haftmann
parents: 21186
diff changeset
   733
\isadelimtt
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   734
%
21348
haftmann
parents: 21186
diff changeset
   735
\endisadelimtt
haftmann
parents: 21186
diff changeset
   736
%
haftmann
parents: 21186
diff changeset
   737
\isatagtt
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   738
%
21348
haftmann
parents: 21186
diff changeset
   739
\endisatagtt
haftmann
parents: 21186
diff changeset
   740
{\isafoldtt}%
haftmann
parents: 21186
diff changeset
   741
%
haftmann
parents: 21186
diff changeset
   742
\isadelimtt
haftmann
parents: 21186
diff changeset
   743
\isanewline
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   744
%
21348
haftmann
parents: 21186
diff changeset
   745
\endisadelimtt
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   746
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
21348
haftmann
parents: 21186
diff changeset
   747
\ in{\isacharunderscore}interval\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}bool{\isacharunderscore}literal{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   748
\begin{isamarkuptext}%
21348
haftmann
parents: 21186
diff changeset
   749
\lstsml{Thy/examples/bool_literal.ML}
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   750
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   751
  Though this is correct code, it is a little bit unsatisfactory:
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   752
  boolean values and operators are materialized as distinguished
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   753
  entities with have nothing to do with the SML-builtin notion
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   754
  of \qt{bool}.  This results in less readable code;
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   755
  additionally, eager evaluation may cause programs to
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   756
  loop or break which would perfectly terminate when
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   757
  the existing SML \qt{bool} would be used.  To map
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   758
  the HOL \qt{bool} on SML \qt{bool}, we may use
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   759
  \qn{custom serializations}:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   760
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   761
\isamarkuptrue%
21348
haftmann
parents: 21186
diff changeset
   762
%
haftmann
parents: 21186
diff changeset
   763
\isadelimtt
haftmann
parents: 21186
diff changeset
   764
%
haftmann
parents: 21186
diff changeset
   765
\endisadelimtt
haftmann
parents: 21186
diff changeset
   766
%
haftmann
parents: 21186
diff changeset
   767
\isatagtt
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   768
\isacommand{code{\isacharunderscore}type}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   769
\ bool\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   770
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}bool{\isachardoublequoteclose}{\isacharparenright}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   771
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   772
\ True\ \isakeyword{and}\ False\ \isakeyword{and}\ {\isachardoublequoteopen}op\ {\isasymand}{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   773
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}true{\isachardoublequoteclose}\ \isakeyword{and}\ {\isachardoublequoteopen}false{\isachardoublequoteclose}\ \isakeyword{and}\ {\isachardoublequoteopen}{\isacharunderscore}\ andalso\ {\isacharunderscore}{\isachardoublequoteclose}{\isacharparenright}%
21348
haftmann
parents: 21186
diff changeset
   774
\endisatagtt
haftmann
parents: 21186
diff changeset
   775
{\isafoldtt}%
haftmann
parents: 21186
diff changeset
   776
%
haftmann
parents: 21186
diff changeset
   777
\isadelimtt
haftmann
parents: 21186
diff changeset
   778
%
haftmann
parents: 21186
diff changeset
   779
\endisadelimtt
haftmann
parents: 21186
diff changeset
   780
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   781
\begin{isamarkuptext}%
21348
haftmann
parents: 21186
diff changeset
   782
The \isa{{\isasymCODETYPE}} commad takes a type constructor
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   783
  as arguments together with a list of custom serializations.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   784
  Each custom serialization starts with a target language
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   785
  identifier followed by an expression, which during
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   786
  code serialization is inserted whenever the type constructor
21348
haftmann
parents: 21186
diff changeset
   787
  would occur.  For constants, \isa{{\isasymCODECONST}} implements
haftmann
parents: 21186
diff changeset
   788
  the corresponding mechanism.  Each ``\verb|_|'' in
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   789
  a serialization expression is treated as a placeholder
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   790
  for the type constructor's (the constant's) arguments.%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   791
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   792
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   793
\isacommand{code{\isacharunderscore}reserved}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   794
\ SML\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   795
\ \ bool\ true\ false%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   796
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   797
To assert that the existing \qt{bool}, \qt{true} and \qt{false}
21348
haftmann
parents: 21186
diff changeset
   798
  is not used for generated code, we use \isa{{\isasymCODERESERVED}}.
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   799
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   800
  After this setup, code looks quite more readable:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   801
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   802
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   803
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
21348
haftmann
parents: 21186
diff changeset
   804
\ in{\isacharunderscore}interval\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}bool{\isacharunderscore}mlbool{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   805
\begin{isamarkuptext}%
21348
haftmann
parents: 21186
diff changeset
   806
\lstsml{Thy/examples/bool_mlbool.ML}
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   807
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   808
  This still is not perfect: the parentheses
21348
haftmann
parents: 21186
diff changeset
   809
  around the \qt{andalso} expression are superfluous.
haftmann
parents: 21186
diff changeset
   810
  Though the serializer
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   811
  by no means attempts to imitate the rich Isabelle syntax
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   812
  framework, it provides some common idioms, notably
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   813
  associative infixes with precedences which may be used here:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   814
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   815
\isamarkuptrue%
21348
haftmann
parents: 21186
diff changeset
   816
%
haftmann
parents: 21186
diff changeset
   817
\isadelimtt
haftmann
parents: 21186
diff changeset
   818
%
haftmann
parents: 21186
diff changeset
   819
\endisadelimtt
haftmann
parents: 21186
diff changeset
   820
%
haftmann
parents: 21186
diff changeset
   821
\isatagtt
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   822
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   823
\ {\isachardoublequoteopen}op\ {\isasymand}{\isachardoublequoteclose}\isanewline
21348
haftmann
parents: 21186
diff changeset
   824
\ \ {\isacharparenleft}SML\ \isakeyword{infixl}\ {\isadigit{1}}\ {\isachardoublequoteopen}andalso{\isachardoublequoteclose}{\isacharparenright}%
haftmann
parents: 21186
diff changeset
   825
\endisatagtt
haftmann
parents: 21186
diff changeset
   826
{\isafoldtt}%
haftmann
parents: 21186
diff changeset
   827
%
haftmann
parents: 21186
diff changeset
   828
\isadelimtt
haftmann
parents: 21186
diff changeset
   829
%
haftmann
parents: 21186
diff changeset
   830
\endisadelimtt
haftmann
parents: 21186
diff changeset
   831
\isanewline
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   832
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   833
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
21348
haftmann
parents: 21186
diff changeset
   834
\ in{\isacharunderscore}interval\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}bool{\isacharunderscore}infix{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   835
\begin{isamarkuptext}%
21348
haftmann
parents: 21186
diff changeset
   836
\lstsml{Thy/examples/bool_infix.ML}
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   837
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   838
  Next, we try to map HOL pairs to SML pairs, using the
21348
haftmann
parents: 21186
diff changeset
   839
  infix ``\verb|*|'' type constructor and parentheses:%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   840
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   841
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   842
\isanewline
21348
haftmann
parents: 21186
diff changeset
   843
%
haftmann
parents: 21186
diff changeset
   844
\isadelimtt
haftmann
parents: 21186
diff changeset
   845
%
haftmann
parents: 21186
diff changeset
   846
\endisadelimtt
haftmann
parents: 21186
diff changeset
   847
%
haftmann
parents: 21186
diff changeset
   848
\isatagtt
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   849
\isacommand{code{\isacharunderscore}type}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   850
\ {\isacharasterisk}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   851
\ \ {\isacharparenleft}SML\ \isakeyword{infix}\ {\isadigit{2}}\ {\isachardoublequoteopen}{\isacharasterisk}{\isachardoublequoteclose}{\isacharparenright}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   852
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   853
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   854
\ Pair\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   855
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}{\isacharbang}{\isacharparenleft}{\isacharparenleft}{\isacharunderscore}{\isacharparenright}{\isacharcomma}{\isacharslash}\ {\isacharparenleft}{\isacharunderscore}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}%
21348
haftmann
parents: 21186
diff changeset
   856
\endisatagtt
haftmann
parents: 21186
diff changeset
   857
{\isafoldtt}%
haftmann
parents: 21186
diff changeset
   858
%
haftmann
parents: 21186
diff changeset
   859
\isadelimtt
haftmann
parents: 21186
diff changeset
   860
%
haftmann
parents: 21186
diff changeset
   861
\endisadelimtt
haftmann
parents: 21186
diff changeset
   862
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   863
\begin{isamarkuptext}%
21348
haftmann
parents: 21186
diff changeset
   864
The initial bang ``\verb|!|'' tells the serializer to never put
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   865
  parentheses around the whole expression (they are already present),
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   866
  while the parentheses around argument place holders
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   867
  tell not to put parentheses around the arguments.
21348
haftmann
parents: 21186
diff changeset
   868
  The slash ``\verb|/|'' (followed by arbitrary white space)
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   869
  inserts a space which may be used as a break if necessary
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   870
  during pretty printing.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   871
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   872
  So far, we did only provide more idiomatic serializations for
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   873
  constructs which would be executable on their own.  Target-specific
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   874
  serializations may also be used to \emph{implement} constructs
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   875
  which have no implicit notion of executability.  For example,
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   876
  take the HOL integers:%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   877
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   878
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   879
\isacommand{definition}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   880
\isanewline
21993
4b802a9e0738 updated manual
haftmann
parents: 21452
diff changeset
   881
\ \ double{\isacharunderscore}inc\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}int\ {\isasymRightarrow}\ int{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   882
\ \ {\isachardoublequoteopen}double{\isacharunderscore}inc\ k\ {\isacharequal}\ {\isadigit{2}}\ {\isacharasterisk}\ k\ {\isacharplus}\ {\isadigit{1}}{\isachardoublequoteclose}\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   883
\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   884
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   885
\ double{\isacharunderscore}inc\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}integers{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   886
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   887
will fail: \isa{int} in HOL is implemented using a quotient
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   888
  type, which does not provide any notion of executability.
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   889
  \footnote{Eventually, we also want to provide executability
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   890
  for quotients.}.  However, we could use the SML builtin
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   891
  integers:%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   892
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   893
\isamarkuptrue%
21348
haftmann
parents: 21186
diff changeset
   894
%
haftmann
parents: 21186
diff changeset
   895
\isadelimtt
haftmann
parents: 21186
diff changeset
   896
%
haftmann
parents: 21186
diff changeset
   897
\endisadelimtt
haftmann
parents: 21186
diff changeset
   898
%
haftmann
parents: 21186
diff changeset
   899
\isatagtt
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   900
\isacommand{code{\isacharunderscore}type}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   901
\ int\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   902
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}IntInf{\isachardot}int{\isachardoublequoteclose}{\isacharparenright}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   903
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   904
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   905
\ {\isachardoublequoteopen}op\ {\isacharplus}\ {\isasymColon}\ int\ {\isasymRightarrow}\ int\ {\isasymRightarrow}\ int{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   906
\ \ \ \ \isakeyword{and}\ {\isachardoublequoteopen}op\ {\isacharasterisk}\ {\isasymColon}\ int\ {\isasymRightarrow}\ int\ {\isasymRightarrow}\ int{\isachardoublequoteclose}\isanewline
21348
haftmann
parents: 21186
diff changeset
   907
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}IntInf{\isachardot}{\isacharplus}\ {\isacharparenleft}{\isacharunderscore}{\isacharcomma}\ {\isacharunderscore}{\isacharparenright}{\isachardoublequoteclose}\ \isakeyword{and}\ {\isachardoublequoteopen}IntInf{\isachardot}{\isacharasterisk}\ {\isacharparenleft}{\isacharunderscore}{\isacharcomma}\ {\isacharunderscore}{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}%
haftmann
parents: 21186
diff changeset
   908
\endisatagtt
haftmann
parents: 21186
diff changeset
   909
{\isafoldtt}%
haftmann
parents: 21186
diff changeset
   910
%
haftmann
parents: 21186
diff changeset
   911
\isadelimtt
haftmann
parents: 21186
diff changeset
   912
%
haftmann
parents: 21186
diff changeset
   913
\endisadelimtt
haftmann
parents: 21186
diff changeset
   914
\isanewline
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   915
\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   916
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   917
\ double{\isacharunderscore}inc\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}integers{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   918
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   919
resulting in:
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   920
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   921
  \lstsml{Thy/examples/integers.ML}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   922
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   923
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   924
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   925
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   926
These examples give a glimpse what powerful mechanisms
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   927
  custom serializations provide; however their usage
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   928
  requires careful thinking in order not to introduce
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   929
  inconsistencies -- or, in other words:
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   930
  custom serializations are completely axiomatic.
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   931
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   932
  A further noteworthy details is that any special
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   933
  character in a custom serialization may be quoted
21348
haftmann
parents: 21186
diff changeset
   934
  using ``\verb|'|''; thus, in
haftmann
parents: 21186
diff changeset
   935
  ``\verb|fn '_ => _|'' the first
haftmann
parents: 21186
diff changeset
   936
  ``\verb|_|'' is a proper underscore while the
haftmann
parents: 21186
diff changeset
   937
  second ``\verb|_|'' is a placeholder.
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   938
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   939
  The HOL theories provide further
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   940
  examples for custom serializations and form
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   941
  a recommended tutorial on how to use them properly.%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   942
\end{isamarkuptext}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   943
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   944
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   945
\isamarkupsubsection{Concerning operational equality%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   946
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   947
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   948
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   949
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   950
Surely you have already noticed how equality is treated
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   951
  by the code generator:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   952
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   953
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   954
\isacommand{fun}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   955
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   956
\ \ 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
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   957
\ \ {\isachardoublequoteopen}collect{\isacharunderscore}duplicates\ xs\ ys\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ xs{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   958
\ \ {\isachardoublequoteopen}collect{\isacharunderscore}duplicates\ xs\ ys\ {\isacharparenleft}z{\isacharhash}zs{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}if\ z\ {\isasymin}\ set\ xs\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   959
\ \ \ \ then\ if\ z\ {\isasymin}\ set\ ys\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   960
\ \ \ \ \ \ then\ collect{\isacharunderscore}duplicates\ xs\ ys\ zs\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   961
\ \ \ \ \ \ else\ collect{\isacharunderscore}duplicates\ xs\ {\isacharparenleft}z{\isacharhash}ys{\isacharparenright}\ zs\isanewline
21348
haftmann
parents: 21186
diff changeset
   962
\ \ \ \ else\ collect{\isacharunderscore}duplicates\ {\isacharparenleft}z{\isacharhash}xs{\isacharparenright}\ {\isacharparenleft}z{\isacharhash}ys{\isacharparenright}\ zs{\isacharparenright}{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   963
\begin{isamarkuptext}%
21348
haftmann
parents: 21186
diff changeset
   964
The membership test during preprocessing is rewritten,
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   965
  resulting in \isa{op\ mem}, which itself
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   966
  performs an explicit equality check.%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   967
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   968
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   969
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   970
\ collect{\isacharunderscore}duplicates\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}collect{\isacharunderscore}duplicates{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   971
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   972
\lstsml{Thy/examples/collect_duplicates.ML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   973
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   974
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   975
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   976
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   977
Obviously, polymorphic equality is implemented the Haskell
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   978
  way using a type class.  How is this achieved?  By an
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   979
  almost trivial definition in the HOL setup:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   980
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   981
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   982
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   983
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   984
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   985
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   986
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   987
\isatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   988
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   989
\endisatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   990
{\isafoldML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   991
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   992
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   993
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   994
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   995
\isanewline
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
   996
\isacommand{axclass}\isamarkupfalse%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
   997
\ eq\ {\isasymsubseteq}\ type\isanewline
21993
4b802a9e0738 updated manual
haftmann
parents: 21452
diff changeset
   998
\ \ {\isacharparenleft}\isakeyword{attach}\ {\isachardoublequoteopen}op\ {\isacharequal}{\isachardoublequoteclose}{\isacharparenright}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   999
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1000
This merely introduces a class \isa{eq} with corresponding
21994
dfa5133dbe73 updated manual
haftmann
parents: 21993
diff changeset
  1001
  operation \isa{op\ {\isacharequal}};
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1002
  the preprocessing framework does the rest.%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1003
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1004
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1005
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1006
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1007
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1008
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1009
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1010
\isatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1011
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1012
\endisatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1013
{\isafoldML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1014
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1015
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1016
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1017
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1018
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1019
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1020
For datatypes, instances of \isa{eq} are implicitly derived
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1021
  when possible.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1022
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1023
  Though this class is designed to get rarely in the way, there
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1024
  are some cases when it suddenly comes to surface:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1025
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1026
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1027
%
21348
haftmann
parents: 21186
diff changeset
  1028
\isamarkupsubsubsection{typedecls interpreted by customary serializations%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1029
}
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1030
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1031
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1032
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1033
A common idiom is to use unspecified types for formalizations
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1034
  and interpret them for a specific target language:%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1035
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1036
\isamarkuptrue%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1037
\isacommand{typedecl}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1038
\ key\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1039
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1040
\isacommand{fun}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1041
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1042
\ \ lookup\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharparenleft}key\ {\isasymtimes}\ {\isacharprime}a{\isacharparenright}\ list\ {\isasymRightarrow}\ key\ {\isasymRightarrow}\ {\isacharprime}a\ option{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1043
\ \ {\isachardoublequoteopen}lookup\ {\isacharbrackleft}{\isacharbrackright}\ l\ {\isacharequal}\ None{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1044
\ \ {\isachardoublequoteopen}lookup\ {\isacharparenleft}{\isacharparenleft}k{\isacharcomma}\ v{\isacharparenright}\ {\isacharhash}\ xs{\isacharparenright}\ l\ {\isacharequal}\ {\isacharparenleft}if\ k\ {\isacharequal}\ l\ then\ Some\ v\ else\ lookup\ xs\ l{\isacharparenright}{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1045
%
21348
haftmann
parents: 21186
diff changeset
  1046
\isadelimtt
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1047
%
21348
haftmann
parents: 21186
diff changeset
  1048
\endisadelimtt
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1049
%
21348
haftmann
parents: 21186
diff changeset
  1050
\isatagtt
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1051
\isacommand{code{\isacharunderscore}type}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1052
\ key\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1053
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}string{\isachardoublequoteclose}{\isacharparenright}%
21348
haftmann
parents: 21186
diff changeset
  1054
\endisatagtt
haftmann
parents: 21186
diff changeset
  1055
{\isafoldtt}%
haftmann
parents: 21186
diff changeset
  1056
%
haftmann
parents: 21186
diff changeset
  1057
\isadelimtt
haftmann
parents: 21186
diff changeset
  1058
%
haftmann
parents: 21186
diff changeset
  1059
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1060
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1061
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1062
This, though, is not sufficient: \isa{key} is no instance
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1063
  of \isa{eq} since \isa{key} is no datatype; the instance
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1064
  has to be declared manually, including a serialization
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1065
  for the particular instance of \isa{op\ {\isacharequal}}:%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1066
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1067
\isamarkuptrue%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1068
\isacommand{instance}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1069
\ key\ {\isacharcolon}{\isacharcolon}\ eq%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1070
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1071
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1072
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1073
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1074
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1075
\isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1076
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1077
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1078
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1079
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1080
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1081
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1082
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1083
\isanewline
21348
haftmann
parents: 21186
diff changeset
  1084
%
haftmann
parents: 21186
diff changeset
  1085
\isadelimtt
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1086
\isanewline
21348
haftmann
parents: 21186
diff changeset
  1087
%
haftmann
parents: 21186
diff changeset
  1088
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1089
%
haftmann
parents: 21186
diff changeset
  1090
\isatagtt
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1091
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1092
\ {\isachardoublequoteopen}op\ {\isacharequal}\ {\isasymColon}\ key\ {\isasymRightarrow}\ key\ {\isasymRightarrow}\ bool{\isachardoublequoteclose}\isanewline
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1093
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}{\isacharbang}{\isacharparenleft}{\isacharparenleft}{\isacharunderscore}\ {\isacharcolon}\ string{\isacharparenright}\ {\isacharequal}\ {\isacharunderscore}{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}%
21348
haftmann
parents: 21186
diff changeset
  1094
\endisatagtt
haftmann
parents: 21186
diff changeset
  1095
{\isafoldtt}%
haftmann
parents: 21186
diff changeset
  1096
%
haftmann
parents: 21186
diff changeset
  1097
\isadelimtt
haftmann
parents: 21186
diff changeset
  1098
%
haftmann
parents: 21186
diff changeset
  1099
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1100
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1101
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1102
Then everything goes fine:%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1103
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1104
\isamarkuptrue%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1105
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1106
\ lookup\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}lookup{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1107
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1108
\lstsml{Thy/examples/lookup.ML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1109
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1110
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1111
%
22188
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1112
\isamarkupsubsubsection{lexicographic orderings%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1113
}
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1114
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1115
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1116
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1117
Another subtlety
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1118
  enters the stage when definitions of overloaded constants
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1119
  are dependent on operational equality.  For example, let
21348
haftmann
parents: 21186
diff changeset
  1120
  us define a lexicographic ordering on tuples:%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1121
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1122
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1123
\isacommand{instance}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1124
\ {\isacharasterisk}\ {\isacharcolon}{\isacharcolon}\ {\isacharparenleft}ord{\isacharcomma}\ ord{\isacharparenright}\ ord\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1125
\ \ {\isachardoublequoteopen}p{\isadigit{1}}\ {\isacharless}\ p{\isadigit{2}}\ {\isasymequiv}\ let\ {\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}ord{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}ord{\isacharparenright}\ {\isacharequal}\ p{\isadigit{1}}{\isacharsemicolon}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isacharequal}\ p{\isadigit{2}}\ in\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1126
\ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ {\isacharparenleft}x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isacharless}\ y{\isadigit{2}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
22188
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1127
\ \ {\isachardoublequoteopen}p{\isadigit{1}}\ {\isasymle}\ p{\isadigit{2}}\ {\isasymequiv}\ let\ {\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}ord{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}ord{\isacharparenright}\ {\isacharequal}\ p{\isadigit{1}}{\isacharsemicolon}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isacharequal}\ p{\isadigit{2}}\ in\isanewline
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1128
\ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ {\isacharparenleft}x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isasymle}\ y{\isadigit{2}}{\isacharparenright}{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1129
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1130
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1131
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1132
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1133
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1134
\isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1135
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1136
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1137
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1138
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1139
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1140
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1141
\endisadelimproof
22188
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1142
\isanewline
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1143
\isanewline
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1144
\isacommand{lemma}\isamarkupfalse%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1145
\ ord{\isacharunderscore}prod\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1146
\ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}ord{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}ord{\isacharparenright}\ {\isacharless}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ {\isacharparenleft}x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isacharless}\ y{\isadigit{2}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1147
\ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}ord{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}ord{\isacharparenright}\ {\isasymle}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ {\isacharparenleft}x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isasymle}\ y{\isadigit{2}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1148
%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1149
\isadelimproof
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1150
\ \ %
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1151
\endisadelimproof
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1152
%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1153
\isatagproof
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1154
\isacommand{unfolding}\isamarkupfalse%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1155
\ {\isachardoublequoteopen}less{\isacharunderscore}eq{\isacharunderscore}{\isacharasterisk}{\isacharunderscore}def{\isachardoublequoteclose}\ {\isachardoublequoteopen}less{\isacharunderscore}{\isacharasterisk}{\isacharunderscore}def{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1156
\ simp{\isacharunderscore}all%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1157
\endisatagproof
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1158
{\isafoldproof}%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1159
%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1160
\isadelimproof
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1161
%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1162
\endisadelimproof
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1163
%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1164
\begin{isamarkuptext}%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1165
Then code generation will fail.  Why?  The definition
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1166
  of \isa{op\ {\isasymle}} depends on equality on both arguments,
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1167
  which are polymorphic and impose an additional \isa{eq}
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1168
  class constraint, thus violating the type discipline
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1169
  for class operations.
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1170
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1171
  The solution is to add \isa{eq} explicitly to the first sort arguments in the
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1172
  code theorems:%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1173
\end{isamarkuptext}%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1174
\isamarkuptrue%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1175
\isanewline
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1176
\isacommand{lemma}\isamarkupfalse%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1177
\ ord{\isacharunderscore}prod{\isacharunderscore}code\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1178
\ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}{\isacharbraceleft}ord{\isacharcomma}\ eq{\isacharbraceright}{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}ord{\isacharparenright}\ {\isacharless}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ {\isacharparenleft}x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isacharless}\ y{\isadigit{2}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1179
\ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}{\isacharbraceleft}ord{\isacharcomma}\ eq{\isacharbraceright}{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}ord{\isacharparenright}\ {\isasymle}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ {\isacharparenleft}x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isasymle}\ y{\isadigit{2}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1180
%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1181
\isadelimproof
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1182
\ \ %
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1183
\endisadelimproof
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1184
%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1185
\isatagproof
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1186
\isacommand{unfolding}\isamarkupfalse%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1187
\ ord{\isacharunderscore}prod\ \isacommand{by}\isamarkupfalse%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1188
\ rule{\isacharplus}%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1189
\endisatagproof
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1190
{\isafoldproof}%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1191
%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1192
\isadelimproof
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1193
%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1194
\endisadelimproof
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1195
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1196
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1197
Then code generation succeeds:%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1198
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1199
\isamarkuptrue%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1200
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
22188
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1201
\ {\isachardoublequoteopen}op\ {\isasymle}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}{\isacharbraceleft}eq{\isacharcomma}\ ord{\isacharbraceright}\ {\isasymtimes}\ {\isacharprime}b{\isasymColon}ord\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymtimes}\ {\isacharprime}b\ {\isasymRightarrow}\ bool{\isachardoublequoteclose}\isanewline
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1202
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}lexicographic{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1203
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1204
\lstsml{Thy/examples/lexicographic.ML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1205
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1206
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1207
%
22188
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1208
\begin{isamarkuptext}%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1209
In general, code theorems for overloaded constants may have more
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1210
  restrictive sort constraints than the underlying instance relation
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1211
  between class and type constructor as long as the whole system of
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1212
  constraints is coregular; code theorems violating coregularity
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1213
  are rejected immediately.%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1214
\end{isamarkuptext}%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1215
\isamarkuptrue%
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1216
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1217
\isamarkupsubsubsection{Haskell serialization%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1218
}
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1219
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1220
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1221
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1222
For convenience, the default
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1223
  HOL setup for Haskell maps the \isa{eq} class to
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1224
  its counterpart in Haskell, giving custom serializations
21348
haftmann
parents: 21186
diff changeset
  1225
  for the class (\isa{{\isasymCODECLASS}}) and its operation:%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1226
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1227
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1228
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1229
\isadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1230
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1231
\endisadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1232
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1233
\isatagML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1234
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1235
\endisatagML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1236
{\isafoldML}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1237
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1238
\isadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1239
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1240
\endisadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1241
\isanewline
21348
haftmann
parents: 21186
diff changeset
  1242
%
haftmann
parents: 21186
diff changeset
  1243
\isadelimtt
haftmann
parents: 21186
diff changeset
  1244
%
haftmann
parents: 21186
diff changeset
  1245
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1246
%
haftmann
parents: 21186
diff changeset
  1247
\isatagtt
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1248
\isacommand{code{\isacharunderscore}class}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1249
\ eq\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1250
\ \ {\isacharparenleft}Haskell\ {\isachardoublequoteopen}Eq{\isachardoublequoteclose}\ \isakeyword{where}\ eq\ {\isasymequiv}\ {\isachardoublequoteopen}{\isacharparenleft}{\isacharequal}{\isacharequal}{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1251
\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1252
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1253
\ eq\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1254
\ \ {\isacharparenleft}Haskell\ \isakeyword{infixl}\ {\isadigit{4}}\ {\isachardoublequoteopen}{\isacharequal}{\isacharequal}{\isachardoublequoteclose}{\isacharparenright}\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1255
%
21348
haftmann
parents: 21186
diff changeset
  1256
\endisatagtt
haftmann
parents: 21186
diff changeset
  1257
{\isafoldtt}%
haftmann
parents: 21186
diff changeset
  1258
%
haftmann
parents: 21186
diff changeset
  1259
\isadelimtt
haftmann
parents: 21186
diff changeset
  1260
%
haftmann
parents: 21186
diff changeset
  1261
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1262
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1263
\isadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1264
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1265
\endisadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1266
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1267
\isatagML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1268
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1269
\endisatagML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1270
{\isafoldML}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1271
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1272
\isadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1273
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1274
\endisadelimML
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1275
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1276
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1277
A problem now occurs whenever a type which
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1278
  is an instance of \isa{eq} in HOL is mapped
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1279
  on a Haskell-builtin type which is also an instance
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1280
  of Haskell \isa{Eq}:%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1281
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1282
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1283
\isacommand{typedecl}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1284
\ bar\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1285
\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1286
\isacommand{instance}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1287
\ bar\ {\isacharcolon}{\isacharcolon}\ eq%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1288
\isadelimproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1289
\ %
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1290
\endisadelimproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1291
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1292
\isatagproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1293
\isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1294
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1295
\endisatagproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1296
{\isafoldproof}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1297
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1298
\isadelimproof
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1299
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1300
\endisadelimproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1301
\isanewline
21348
haftmann
parents: 21186
diff changeset
  1302
%
haftmann
parents: 21186
diff changeset
  1303
\isadelimtt
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1304
\isanewline
21348
haftmann
parents: 21186
diff changeset
  1305
%
haftmann
parents: 21186
diff changeset
  1306
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1307
%
haftmann
parents: 21186
diff changeset
  1308
\isatagtt
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1309
\isacommand{code{\isacharunderscore}type}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1310
\ bar\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1311
\ \ {\isacharparenleft}Haskell\ {\isachardoublequoteopen}Integer{\isachardoublequoteclose}{\isacharparenright}%
21348
haftmann
parents: 21186
diff changeset
  1312
\endisatagtt
haftmann
parents: 21186
diff changeset
  1313
{\isafoldtt}%
haftmann
parents: 21186
diff changeset
  1314
%
haftmann
parents: 21186
diff changeset
  1315
\isadelimtt
haftmann
parents: 21186
diff changeset
  1316
%
haftmann
parents: 21186
diff changeset
  1317
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1318
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1319
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1320
The code generator would produce
22188
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1321
  an additional instance, which of course is rejected.
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1322
  To suppress this additional instance, use
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1323
  \isa{{\isasymCODEINSTANCE}}:%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1324
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1325
\isamarkuptrue%
21348
haftmann
parents: 21186
diff changeset
  1326
%
haftmann
parents: 21186
diff changeset
  1327
\isadelimtt
haftmann
parents: 21186
diff changeset
  1328
%
haftmann
parents: 21186
diff changeset
  1329
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1330
%
haftmann
parents: 21186
diff changeset
  1331
\isatagtt
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1332
\isacommand{code{\isacharunderscore}instance}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1333
\ bar\ {\isacharcolon}{\isacharcolon}\ eq\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1334
\ \ {\isacharparenleft}Haskell\ {\isacharminus}{\isacharparenright}%
21348
haftmann
parents: 21186
diff changeset
  1335
\endisatagtt
haftmann
parents: 21186
diff changeset
  1336
{\isafoldtt}%
haftmann
parents: 21186
diff changeset
  1337
%
haftmann
parents: 21186
diff changeset
  1338
\isadelimtt
haftmann
parents: 21186
diff changeset
  1339
%
haftmann
parents: 21186
diff changeset
  1340
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1341
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1342
\isamarkupsubsection{Types matter%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1343
}
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1344
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1345
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1346
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1347
Imagine the following quick-and-dirty setup for implementing
21348
haftmann
parents: 21186
diff changeset
  1348
  some kind of sets as lists in SML:%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1349
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1350
\isamarkuptrue%
21348
haftmann
parents: 21186
diff changeset
  1351
%
haftmann
parents: 21186
diff changeset
  1352
\isadelimtt
haftmann
parents: 21186
diff changeset
  1353
%
haftmann
parents: 21186
diff changeset
  1354
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1355
%
haftmann
parents: 21186
diff changeset
  1356
\isatagtt
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1357
\isacommand{code{\isacharunderscore}type}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1358
\ set\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1359
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}{\isacharunderscore}\ list{\isachardoublequoteclose}{\isacharparenright}\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1360
\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1361
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1362
\ {\isachardoublequoteopen}{\isacharbraceleft}{\isacharbraceright}{\isachardoublequoteclose}\ \isakeyword{and}\ insert\isanewline
21348
haftmann
parents: 21186
diff changeset
  1363
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}{\isacharbang}{\isacharbrackleft}{\isacharbrackright}{\isachardoublequoteclose}\ \isakeyword{and}\ \isakeyword{infixl}\ {\isadigit{7}}\ {\isachardoublequoteopen}{\isacharcolon}{\isacharcolon}{\isachardoublequoteclose}{\isacharparenright}%
haftmann
parents: 21186
diff changeset
  1364
\endisatagtt
haftmann
parents: 21186
diff changeset
  1365
{\isafoldtt}%
haftmann
parents: 21186
diff changeset
  1366
%
haftmann
parents: 21186
diff changeset
  1367
\isadelimtt
haftmann
parents: 21186
diff changeset
  1368
%
haftmann
parents: 21186
diff changeset
  1369
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1370
\isanewline
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1371
\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1372
\isacommand{definition}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1373
\isanewline
21993
4b802a9e0738 updated manual
haftmann
parents: 21452
diff changeset
  1374
\ \ dummy{\isacharunderscore}set\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharparenleft}nat\ {\isasymRightarrow}\ nat{\isacharparenright}\ set{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
21348
haftmann
parents: 21186
diff changeset
  1375
\ \ {\isachardoublequoteopen}dummy{\isacharunderscore}set\ {\isacharequal}\ {\isacharbraceleft}Suc{\isacharbraceright}{\isachardoublequoteclose}%
haftmann
parents: 21186
diff changeset
  1376
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1377
Then code generation for \isa{dummy{\isacharunderscore}set} will fail.
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1378
  Why? A glimpse at the defining equations will offer:%
21348
haftmann
parents: 21186
diff changeset
  1379
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1380
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1381
\isacommand{print{\isacharunderscore}codethms}\isamarkupfalse%
haftmann
parents: 21186
diff changeset
  1382
\ {\isacharparenleft}insert{\isacharparenright}%
haftmann
parents: 21186
diff changeset
  1383
\begin{isamarkuptext}%
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1384
This reveals the defining equation \isa{insert\ {\isacharquery}a\ {\isacharquery}B\ {\isasymequiv}\ {\isacharbraceleft}x{\isachardot}\ x\ {\isacharequal}\ {\isacharquery}a{\isacharbraceright}\ {\isasymunion}\ {\isacharquery}B}
21348
haftmann
parents: 21186
diff changeset
  1385
  for \isa{insert}, which is operationally meaningless
haftmann
parents: 21186
diff changeset
  1386
  but forces an equality constraint on the set members
haftmann
parents: 21186
diff changeset
  1387
  (which is not satisfiable if the set members are functions).
haftmann
parents: 21186
diff changeset
  1388
  Even when using set of natural numbers (which are an instance
haftmann
parents: 21186
diff changeset
  1389
  of \emph{eq}), we run into a problem:%
haftmann
parents: 21186
diff changeset
  1390
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1391
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1392
\isacommand{definition}\isamarkupfalse%
haftmann
parents: 21186
diff changeset
  1393
\isanewline
21993
4b802a9e0738 updated manual
haftmann
parents: 21452
diff changeset
  1394
\ \ foobar{\isacharunderscore}set\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ set{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
21348
haftmann
parents: 21186
diff changeset
  1395
\ \ {\isachardoublequoteopen}foobar{\isacharunderscore}set\ {\isacharequal}\ {\isacharbraceleft}{\isadigit{0}}{\isacharcomma}\ {\isadigit{1}}{\isacharcomma}\ {\isadigit{2}}{\isacharbraceright}{\isachardoublequoteclose}%
haftmann
parents: 21186
diff changeset
  1396
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1397
In this case the serializer would complain that \isa{insert}
haftmann
parents: 21186
diff changeset
  1398
  expects dictionaries (namely an \emph{eq} dictionary) but
haftmann
parents: 21186
diff changeset
  1399
  has also been given a customary serialization.
haftmann
parents: 21186
diff changeset
  1400
haftmann
parents: 21186
diff changeset
  1401
  The solution to this dilemma:%
haftmann
parents: 21186
diff changeset
  1402
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1403
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1404
\isacommand{lemma}\isamarkupfalse%
haftmann
parents: 21186
diff changeset
  1405
\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
haftmann
parents: 21186
diff changeset
  1406
\ \ {\isachardoublequoteopen}insert\ {\isacharequal}\ insert{\isachardoublequoteclose}%
haftmann
parents: 21186
diff changeset
  1407
\isadelimproof
haftmann
parents: 21186
diff changeset
  1408
\ %
haftmann
parents: 21186
diff changeset
  1409
\endisadelimproof
haftmann
parents: 21186
diff changeset
  1410
%
haftmann
parents: 21186
diff changeset
  1411
\isatagproof
haftmann
parents: 21186
diff changeset
  1412
\isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
haftmann
parents: 21186
diff changeset
  1413
%
haftmann
parents: 21186
diff changeset
  1414
\endisatagproof
haftmann
parents: 21186
diff changeset
  1415
{\isafoldproof}%
haftmann
parents: 21186
diff changeset
  1416
%
haftmann
parents: 21186
diff changeset
  1417
\isadelimproof
haftmann
parents: 21186
diff changeset
  1418
%
haftmann
parents: 21186
diff changeset
  1419
\endisadelimproof
haftmann
parents: 21186
diff changeset
  1420
\isanewline
haftmann
parents: 21186
diff changeset
  1421
\isanewline
haftmann
parents: 21186
diff changeset
  1422
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
haftmann
parents: 21186
diff changeset
  1423
\ dummy{\isacharunderscore}set\ foobar{\isacharunderscore}set\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}dirty{\isacharunderscore}set{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
haftmann
parents: 21186
diff changeset
  1424
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1425
\lstsml{Thy/examples/dirty_set.ML}
haftmann
parents: 21186
diff changeset
  1426
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1427
  Reflexive defining equations by convention are dropped.
21348
haftmann
parents: 21186
diff changeset
  1428
  But their presence prevents primitive definitions to be
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1429
  used as defining equations:%
21348
haftmann
parents: 21186
diff changeset
  1430
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1431
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1432
\isacommand{print{\isacharunderscore}codethms}\isamarkupfalse%
haftmann
parents: 21186
diff changeset
  1433
\ {\isacharparenleft}insert{\isacharparenright}%
haftmann
parents: 21186
diff changeset
  1434
\begin{isamarkuptext}%
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1435
will show \emph{no} defining equations for insert.
21348
haftmann
parents: 21186
diff changeset
  1436
haftmann
parents: 21186
diff changeset
  1437
  Note that the sort constraints of reflexive equations
haftmann
parents: 21186
diff changeset
  1438
  are considered; so%
haftmann
parents: 21186
diff changeset
  1439
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1440
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1441
\isacommand{lemma}\isamarkupfalse%
haftmann
parents: 21186
diff changeset
  1442
\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
haftmann
parents: 21186
diff changeset
  1443
\ \ {\isachardoublequoteopen}{\isacharparenleft}insert\ {\isasymColon}\ {\isacharprime}a{\isasymColon}eq\ {\isasymRightarrow}\ {\isacharprime}a\ set\ {\isasymRightarrow}\ {\isacharprime}a\ set{\isacharparenright}\ {\isacharequal}\ insert{\isachardoublequoteclose}%
haftmann
parents: 21186
diff changeset
  1444
\isadelimproof
haftmann
parents: 21186
diff changeset
  1445
\ %
haftmann
parents: 21186
diff changeset
  1446
\endisadelimproof
haftmann
parents: 21186
diff changeset
  1447
%
haftmann
parents: 21186
diff changeset
  1448
\isatagproof
haftmann
parents: 21186
diff changeset
  1449
\isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
haftmann
parents: 21186
diff changeset
  1450
%
haftmann
parents: 21186
diff changeset
  1451
\endisatagproof
haftmann
parents: 21186
diff changeset
  1452
{\isafoldproof}%
haftmann
parents: 21186
diff changeset
  1453
%
haftmann
parents: 21186
diff changeset
  1454
\isadelimproof
haftmann
parents: 21186
diff changeset
  1455
%
haftmann
parents: 21186
diff changeset
  1456
\endisadelimproof
haftmann
parents: 21186
diff changeset
  1457
%
haftmann
parents: 21186
diff changeset
  1458
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1459
would mean nothing else than to introduce the evil
haftmann
parents: 21186
diff changeset
  1460
  sort constraint by hand.%
haftmann
parents: 21186
diff changeset
  1461
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1462
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1463
%
haftmann
parents: 21186
diff changeset
  1464
\isamarkupsubsection{Cyclic module dependencies%
haftmann
parents: 21186
diff changeset
  1465
}
haftmann
parents: 21186
diff changeset
  1466
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1467
%
haftmann
parents: 21186
diff changeset
  1468
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1469
Sometimes the awkward situation occurs that dependencies
haftmann
parents: 21186
diff changeset
  1470
  between definitions introduce cyclic dependencies
haftmann
parents: 21186
diff changeset
  1471
  between modules, which in the Haskell world leaves
haftmann
parents: 21186
diff changeset
  1472
  you to the mercy of the Haskell implementation you are using,
haftmann
parents: 21186
diff changeset
  1473
  while for SML code generation is not possible.
haftmann
parents: 21186
diff changeset
  1474
haftmann
parents: 21186
diff changeset
  1475
  A solution is to declare module names explicitly.
haftmann
parents: 21186
diff changeset
  1476
  Let use assume the three cyclically dependent
haftmann
parents: 21186
diff changeset
  1477
  modules are named \emph{A}, \emph{B} and \emph{C}.
haftmann
parents: 21186
diff changeset
  1478
  Then, by stating%
haftmann
parents: 21186
diff changeset
  1479
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1480
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1481
\isacommand{code{\isacharunderscore}modulename}\isamarkupfalse%
haftmann
parents: 21186
diff changeset
  1482
\ SML\isanewline
haftmann
parents: 21186
diff changeset
  1483
\ \ A\ ABC\isanewline
haftmann
parents: 21186
diff changeset
  1484
\ \ B\ ABC\isanewline
haftmann
parents: 21186
diff changeset
  1485
\ \ C\ ABC%
haftmann
parents: 21186
diff changeset
  1486
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1487
we explicitly map all those modules on \emph{ABC},
haftmann
parents: 21186
diff changeset
  1488
  resulting in an ad-hoc merge of this three modules
haftmann
parents: 21186
diff changeset
  1489
  at serialization time.%
haftmann
parents: 21186
diff changeset
  1490
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1491
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1492
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1493
\isamarkupsubsection{Axiomatic extensions%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1494
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1495
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1496
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1497
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1498
\begin{warn}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1499
    The extensions introduced in this section, though working
21348
haftmann
parents: 21186
diff changeset
  1500
    in practice, are not the cream of the crop, as you
haftmann
parents: 21186
diff changeset
  1501
    will notice during reading.  They will
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1502
    eventually be replaced by more mature approaches.
21348
haftmann
parents: 21186
diff changeset
  1503
  \end{warn}
haftmann
parents: 21186
diff changeset
  1504
haftmann
parents: 21186
diff changeset
  1505
  Sometimes equalities are taken for granted which are
haftmann
parents: 21186
diff changeset
  1506
  not derivable inside the HOL logic but are silently assumed
haftmann
parents: 21186
diff changeset
  1507
  to hold for executable code.  For example, we may want
haftmann
parents: 21186
diff changeset
  1508
  to identify the famous HOL constant \isa{arbitrary}
haftmann
parents: 21186
diff changeset
  1509
  of type \isa{{\isacharprime}a\ option} with \isa{None}.
haftmann
parents: 21186
diff changeset
  1510
  By brute force:%
haftmann
parents: 21186
diff changeset
  1511
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1512
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1513
\isacommand{axiomatization}\isamarkupfalse%
haftmann
parents: 21186
diff changeset
  1514
\ \isakeyword{where}\isanewline
haftmann
parents: 21186
diff changeset
  1515
\ \ {\isachardoublequoteopen}arbitrary\ {\isacharequal}\ None{\isachardoublequoteclose}%
haftmann
parents: 21186
diff changeset
  1516
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1517
However this has to be considered harmful since this axiom,
haftmann
parents: 21186
diff changeset
  1518
  though probably justifiable for generated code, could
haftmann
parents: 21186
diff changeset
  1519
  introduce serious inconsistencies into the logic.
haftmann
parents: 21186
diff changeset
  1520
haftmann
parents: 21186
diff changeset
  1521
  So, there is a distinguished construct for stating axiomatic
haftmann
parents: 21186
diff changeset
  1522
  equalities of constants which apply only for code generation.
haftmann
parents: 21186
diff changeset
  1523
  Before introducing this, here is a convenient place to describe
haftmann
parents: 21186
diff changeset
  1524
  shortly how to deal with some restrictions the type discipline
haftmann
parents: 21186
diff changeset
  1525
  imposes.
haftmann
parents: 21186
diff changeset
  1526
haftmann
parents: 21186
diff changeset
  1527
  By itself, the constant \isa{arbitrary} is a non-overloaded
haftmann
parents: 21186
diff changeset
  1528
  polymorphic constant.  So, there is no way to distinguish
haftmann
parents: 21186
diff changeset
  1529
  different versions of \isa{arbitrary} for different types
haftmann
parents: 21186
diff changeset
  1530
  inside the code generator framework.  However, inlining
haftmann
parents: 21186
diff changeset
  1531
  theorems together with auxiliary constants provide a solution:%
haftmann
parents: 21186
diff changeset
  1532
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1533
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1534
\isacommand{definition}\isamarkupfalse%
haftmann
parents: 21186
diff changeset
  1535
\isanewline
21993
4b802a9e0738 updated manual
haftmann
parents: 21452
diff changeset
  1536
\ \ arbitrary{\isacharunderscore}option\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ option{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
21348
haftmann
parents: 21186
diff changeset
  1537
\ \ {\isacharbrackleft}symmetric{\isacharcomma}\ code\ inline{\isacharbrackright}{\isacharcolon}\ {\isachardoublequoteopen}arbitrary{\isacharunderscore}option\ {\isacharequal}\ arbitrary{\isachardoublequoteclose}%
haftmann
parents: 21186
diff changeset
  1538
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1539
By that, we replace any \isa{arbitrary} with option type
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1540
  by \isa{arbitrary{\isacharunderscore}option} in defining equations.
21348
haftmann
parents: 21186
diff changeset
  1541
haftmann
parents: 21186
diff changeset
  1542
  For technical reasons, we further have to provide a
haftmann
parents: 21186
diff changeset
  1543
  synonym for \isa{None} which in code generator view
22188
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1544
  is a function rather than a term constructor:%
21348
haftmann
parents: 21186
diff changeset
  1545
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1546
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1547
\isacommand{definition}\isamarkupfalse%
haftmann
parents: 21186
diff changeset
  1548
\isanewline
haftmann
parents: 21186
diff changeset
  1549
\ \ {\isachardoublequoteopen}None{\isacharprime}\ {\isacharequal}\ None{\isachardoublequoteclose}%
haftmann
parents: 21186
diff changeset
  1550
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1551
Then finally we are enabled to use \isa{{\isasymCODEAXIOMS}}:%
haftmann
parents: 21186
diff changeset
  1552
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1553
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1554
\isacommand{code{\isacharunderscore}axioms}\isamarkupfalse%
haftmann
parents: 21186
diff changeset
  1555
\isanewline
haftmann
parents: 21186
diff changeset
  1556
\ \ arbitrary{\isacharunderscore}option\ {\isasymequiv}\ None{\isacharprime}%
haftmann
parents: 21186
diff changeset
  1557
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1558
A dummy example:%
haftmann
parents: 21186
diff changeset
  1559
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1560
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1561
\isacommand{fun}\isamarkupfalse%
haftmann
parents: 21186
diff changeset
  1562
\isanewline
haftmann
parents: 21186
diff changeset
  1563
\ \ dummy{\isacharunderscore}option\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ option{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
haftmann
parents: 21186
diff changeset
  1564
\ \ {\isachardoublequoteopen}dummy{\isacharunderscore}option\ {\isacharparenleft}x{\isacharhash}xs{\isacharparenright}\ {\isacharequal}\ Some\ x{\isachardoublequoteclose}\isanewline
haftmann
parents: 21186
diff changeset
  1565
\ \ {\isachardoublequoteopen}dummy{\isacharunderscore}option\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ arbitrary{\isachardoublequoteclose}\isanewline
haftmann
parents: 21186
diff changeset
  1566
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
haftmann
parents: 21186
diff changeset
  1567
\ dummy{\isacharunderscore}option\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}arbitrary{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
haftmann
parents: 21186
diff changeset
  1568
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1569
\lstsml{Thy/examples/arbitrary.ML}
haftmann
parents: 21186
diff changeset
  1570
haftmann
parents: 21186
diff changeset
  1571
  Another axiomatic extension is code generation
haftmann
parents: 21186
diff changeset
  1572
  for abstracted types.  For this, the  
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1573
  \isa{ExecutableRat} (see \secref{exec_rat})
21348
haftmann
parents: 21186
diff changeset
  1574
  forms a good example.%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1575
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1576
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1577
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1578
\isamarkupsection{ML interfaces \label{sec:ml}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1579
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1580
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1581
%
21348
haftmann
parents: 21186
diff changeset
  1582
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1583
Since the code generator framework not only aims to provide
haftmann
parents: 21186
diff changeset
  1584
  a nice Isar interface but also to form a base for
haftmann
parents: 21186
diff changeset
  1585
  code-generation-based applications, here a short
haftmann
parents: 21186
diff changeset
  1586
  description of the most important ML interfaces.%
haftmann
parents: 21186
diff changeset
  1587
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1588
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1589
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1590
\isamarkupsubsection{Constants with type discipline: codegen\_consts.ML%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1591
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1592
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1593
%
21348
haftmann
parents: 21186
diff changeset
  1594
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1595
This Pure module manages identification of (probably overloaded)
haftmann
parents: 21186
diff changeset
  1596
  constants by unique identifiers.%
haftmann
parents: 21186
diff changeset
  1597
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1598
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1599
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1600
\isadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1601
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1602
\endisadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1603
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1604
\isatagmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1605
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1606
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1607
\begin{mldecls}
21348
haftmann
parents: 21186
diff changeset
  1608
  \indexmltype{CodegenConsts.const}\verb|type CodegenConsts.const = string * typ list| \\
haftmann
parents: 21186
diff changeset
  1609
  \indexml{CodegenConsts.norm-of-typ}\verb|CodegenConsts.norm_of_typ: theory -> string * typ -> CodegenConsts.const| \\
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1610
  \indexml{CodegenConsts.typ-of-inst}\verb|CodegenConsts.typ_of_inst: theory -> CodegenConsts.const -> string * typ| \\
21348
haftmann
parents: 21186
diff changeset
  1611
 \end{mldecls}
haftmann
parents: 21186
diff changeset
  1612
haftmann
parents: 21186
diff changeset
  1613
  \begin{description}
haftmann
parents: 21186
diff changeset
  1614
haftmann
parents: 21186
diff changeset
  1615
  \item \verb|CodegenConsts.const| is the identifier type:
haftmann
parents: 21186
diff changeset
  1616
     the product of a \emph{string} with a list of \emph{typs}.
haftmann
parents: 21186
diff changeset
  1617
     The \emph{string} is the constant name as represented inside Isabelle;
haftmann
parents: 21186
diff changeset
  1618
     the \emph{typs} are a type instantiation in the sense of System F,
haftmann
parents: 21186
diff changeset
  1619
     with canonical names for type variables.
haftmann
parents: 21186
diff changeset
  1620
haftmann
parents: 21186
diff changeset
  1621
  \item \verb|CodegenConsts.norm_of_typ|~\isa{thy}~\isa{{\isacharparenleft}constname{\isacharcomma}\ typ{\isacharparenright}}
haftmann
parents: 21186
diff changeset
  1622
     maps a constant expression \isa{{\isacharparenleft}constname{\isacharcomma}\ typ{\isacharparenright}} to its canonical identifier.
haftmann
parents: 21186
diff changeset
  1623
haftmann
parents: 21186
diff changeset
  1624
  \item \verb|CodegenConsts.typ_of_inst|~\isa{thy}~\isa{const}
haftmann
parents: 21186
diff changeset
  1625
     maps a canonical identifier \isa{const} to a constant
haftmann
parents: 21186
diff changeset
  1626
     expression with appropriate type.
haftmann
parents: 21186
diff changeset
  1627
haftmann
parents: 21186
diff changeset
  1628
  \end{description}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1629
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1630
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1631
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1632
\endisatagmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1633
{\isafoldmlref}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1634
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1635
\isadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1636
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1637
\endisadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1638
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1639
\isamarkupsubsection{Executable theory content: codegen\_data.ML%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1640
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1641
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1642
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1643
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1644
This Pure module implements the core notions of
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1645
  executable content of a theory.%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1646
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1647
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1648
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1649
\isamarkupsubsubsection{Suspended theorems%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1650
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1651
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1652
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1653
\isadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1654
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1655
\endisadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1656
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1657
\isatagmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1658
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1659
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1660
\begin{mldecls}
21348
haftmann
parents: 21186
diff changeset
  1661
  \indexml{CodegenData.lazy}\verb|CodegenData.lazy: (unit -> thm list) -> thm list Susp.T|
haftmann
parents: 21186
diff changeset
  1662
  \end{mldecls}
haftmann
parents: 21186
diff changeset
  1663
haftmann
parents: 21186
diff changeset
  1664
  \begin{description}
haftmann
parents: 21186
diff changeset
  1665
haftmann
parents: 21186
diff changeset
  1666
  \item \verb|CodegenData.lazy|~\isa{f} turns an abstract
haftmann
parents: 21186
diff changeset
  1667
     theorem computation \isa{f} into a suspension of theorems.
haftmann
parents: 21186
diff changeset
  1668
haftmann
parents: 21186
diff changeset
  1669
  \end{description}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1670
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1671
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1672
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1673
\endisatagmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1674
{\isafoldmlref}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1675
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1676
\isadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1677
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1678
\endisadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1679
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1680
\isamarkupsubsubsection{Executable content%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1681
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1682
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1683
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1684
\isadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1685
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1686
\endisadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1687
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1688
\isatagmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1689
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1690
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1691
\begin{mldecls}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1692
  \indexml{CodegenData.add-func}\verb|CodegenData.add_func: thm -> theory -> theory| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1693
  \indexml{CodegenData.del-func}\verb|CodegenData.del_func: thm -> theory -> theory| \\
21348
haftmann
parents: 21186
diff changeset
  1694
  \indexml{CodegenData.add-funcl}\verb|CodegenData.add_funcl: CodegenConsts.const * thm list Susp.T -> theory -> theory| \\
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1695
  \indexml{CodegenData.add-inline}\verb|CodegenData.add_inline: thm -> theory -> theory| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1696
  \indexml{CodegenData.del-inline}\verb|CodegenData.del_inline: thm -> theory -> theory| \\
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1697
  \indexml{CodegenData.add-inline-proc}\verb|CodegenData.add_inline_proc: string * (theory -> cterm list -> thm list)|\isasep\isanewline%
21348
haftmann
parents: 21186
diff changeset
  1698
\verb|    -> theory -> theory| \\
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1699
  \indexml{CodegenData.del-inline-proc}\verb|CodegenData.del_inline_proc: string -> theory -> theory| \\
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1700
  \indexml{CodegenData.add-preproc}\verb|CodegenData.add_preproc: string * (theory -> thm list -> thm list)|\isasep\isanewline%
21348
haftmann
parents: 21186
diff changeset
  1701
\verb|    -> theory -> theory| \\
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1702
  \indexml{CodegenData.del-preproc}\verb|CodegenData.del_preproc: string -> theory -> theory| \\
21348
haftmann
parents: 21186
diff changeset
  1703
  \indexml{CodegenData.add-datatype}\verb|CodegenData.add_datatype: string * (((string * sort) list * (string * typ list) list)|\isasep\isanewline%
haftmann
parents: 21186
diff changeset
  1704
\verb|    * thm list Susp.T) -> theory -> theory| \\
haftmann
parents: 21186
diff changeset
  1705
  \indexml{CodegenData.del-datatype}\verb|CodegenData.del_datatype: string -> theory -> theory| \\
haftmann
parents: 21186
diff changeset
  1706
  \indexml{CodegenData.get-datatype}\verb|CodegenData.get_datatype: theory -> string|\isasep\isanewline%
haftmann
parents: 21186
diff changeset
  1707
\verb|    -> ((string * sort) list * (string * typ list) list) option| \\
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1708
  \indexml{CodegenData.get-datatype-of-constr}\verb|CodegenData.get_datatype_of_constr: theory -> CodegenConsts.const -> string option|
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1709
  \end{mldecls}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1710
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1711
  \begin{description}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1712
21348
haftmann
parents: 21186
diff changeset
  1713
  \item \verb|CodegenData.add_func|~\isa{thm}~\isa{thy} adds function
haftmann
parents: 21186
diff changeset
  1714
     theorem \isa{thm} to executable content.
haftmann
parents: 21186
diff changeset
  1715
haftmann
parents: 21186
diff changeset
  1716
  \item \verb|CodegenData.del_func|~\isa{thm}~\isa{thy} removes function
haftmann
parents: 21186
diff changeset
  1717
     theorem \isa{thm} from executable content, if present.
haftmann
parents: 21186
diff changeset
  1718
haftmann
parents: 21186
diff changeset
  1719
  \item \verb|CodegenData.add_funcl|~\isa{{\isacharparenleft}const{\isacharcomma}\ lthms{\isacharparenright}}~\isa{thy} adds
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1720
     suspended defining equations \isa{lthms} for constant
21348
haftmann
parents: 21186
diff changeset
  1721
     \isa{const} to executable content.
haftmann
parents: 21186
diff changeset
  1722
haftmann
parents: 21186
diff changeset
  1723
  \item \verb|CodegenData.add_inline|~\isa{thm}~\isa{thy} adds
haftmann
parents: 21186
diff changeset
  1724
     inlining theorem \isa{thm} to executable content.
haftmann
parents: 21186
diff changeset
  1725
haftmann
parents: 21186
diff changeset
  1726
  \item \verb|CodegenData.del_inline|~\isa{thm}~\isa{thy} remove
haftmann
parents: 21186
diff changeset
  1727
     inlining theorem \isa{thm} from executable content, if present.
haftmann
parents: 21186
diff changeset
  1728
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1729
  \item \verb|CodegenData.add_inline_proc|~\isa{{\isacharparenleft}name{\isacharcomma}\ f{\isacharparenright}}~\isa{thy} adds
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1730
     inline procedure \isa{f} (named \isa{name}) to executable content;
21348
haftmann
parents: 21186
diff changeset
  1731
     \isa{f} is a computation of rewrite rules dependent on
haftmann
parents: 21186
diff changeset
  1732
     the current theory context and the list of all arguments
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1733
     and right hand sides of the defining equations belonging
21348
haftmann
parents: 21186
diff changeset
  1734
     to a certain function definition.
haftmann
parents: 21186
diff changeset
  1735
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1736
  \item \verb|CodegenData.del_inline_proc|~\isa{name}~\isa{thy} removes
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1737
     inline procedure named \isa{name} from executable content.
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1738
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1739
  \item \verb|CodegenData.add_preproc|~\isa{{\isacharparenleft}name{\isacharcomma}\ f{\isacharparenright}}~\isa{thy} adds
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1740
     generic preprocessor \isa{f} (named \isa{name}) to executable content;
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1741
     \isa{f} is a transformation of the defining equations belonging
21348
haftmann
parents: 21186
diff changeset
  1742
     to a certain function definition, depending on the
haftmann
parents: 21186
diff changeset
  1743
     current theory context.
haftmann
parents: 21186
diff changeset
  1744
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1745
  \item \verb|CodegenData.del_preproc|~\isa{name}~\isa{thy} removes
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1746
     generic preprcoessor named \isa{name} from executable content.
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1747
21348
haftmann
parents: 21186
diff changeset
  1748
  \item \verb|CodegenData.add_datatype|~\isa{{\isacharparenleft}name{\isacharcomma}\ {\isacharparenleft}spec{\isacharcomma}\ cert{\isacharparenright}{\isacharparenright}}~\isa{thy} adds
haftmann
parents: 21186
diff changeset
  1749
     a datatype to executable content, with type constructor
haftmann
parents: 21186
diff changeset
  1750
     \isa{name} and specification \isa{spec}; \isa{spec} is
haftmann
parents: 21186
diff changeset
  1751
     a pair consisting of a list of type variable with sort
haftmann
parents: 21186
diff changeset
  1752
     constraints and a list of constructors with name
haftmann
parents: 21186
diff changeset
  1753
     and types of arguments.  The addition as datatype
haftmann
parents: 21186
diff changeset
  1754
     has to be justified giving a certificate of suspended
haftmann
parents: 21186
diff changeset
  1755
     theorems as witnesses for injectiveness and distinctness.
haftmann
parents: 21186
diff changeset
  1756
haftmann
parents: 21186
diff changeset
  1757
  \item \verb|CodegenData.del_datatype|~\isa{name}~\isa{thy}
haftmann
parents: 21186
diff changeset
  1758
     remove a datatype from executable content, if present.
haftmann
parents: 21186
diff changeset
  1759
haftmann
parents: 21186
diff changeset
  1760
  \item \verb|CodegenData.get_datatype_of_constr|~\isa{thy}~\isa{const}
haftmann
parents: 21186
diff changeset
  1761
     returns type constructor corresponding to
haftmann
parents: 21186
diff changeset
  1762
     constructor \isa{const}; returns \isa{NONE}
haftmann
parents: 21186
diff changeset
  1763
     if \isa{const} is no constructor.
haftmann
parents: 21186
diff changeset
  1764
haftmann
parents: 21186
diff changeset
  1765
  \end{description}%
haftmann
parents: 21186
diff changeset
  1766
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1767
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1768
%
haftmann
parents: 21186
diff changeset
  1769
\endisatagmlref
haftmann
parents: 21186
diff changeset
  1770
{\isafoldmlref}%
haftmann
parents: 21186
diff changeset
  1771
%
haftmann
parents: 21186
diff changeset
  1772
\isadelimmlref
haftmann
parents: 21186
diff changeset
  1773
%
haftmann
parents: 21186
diff changeset
  1774
\endisadelimmlref
haftmann
parents: 21186
diff changeset
  1775
%
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1776
\isamarkupsubsection{defining equation systems: codegen\_funcgr.ML%
21348
haftmann
parents: 21186
diff changeset
  1777
}
haftmann
parents: 21186
diff changeset
  1778
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1779
%
haftmann
parents: 21186
diff changeset
  1780
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1781
Out of the executable content of a theory, a normalized
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1782
  defining equation systems may be constructed containing
21348
haftmann
parents: 21186
diff changeset
  1783
  function definitions for constants.  The system is cached
haftmann
parents: 21186
diff changeset
  1784
  until its underlying executable content changes.%
haftmann
parents: 21186
diff changeset
  1785
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1786
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1787
%
haftmann
parents: 21186
diff changeset
  1788
\isadelimmlref
haftmann
parents: 21186
diff changeset
  1789
%
haftmann
parents: 21186
diff changeset
  1790
\endisadelimmlref
haftmann
parents: 21186
diff changeset
  1791
%
haftmann
parents: 21186
diff changeset
  1792
\isatagmlref
haftmann
parents: 21186
diff changeset
  1793
%
haftmann
parents: 21186
diff changeset
  1794
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1795
\begin{mldecls}
haftmann
parents: 21186
diff changeset
  1796
  \indexmltype{CodegenFuncgr.T}\verb|type CodegenFuncgr.T| \\
haftmann
parents: 21186
diff changeset
  1797
  \indexml{CodegenFuncgr.make}\verb|CodegenFuncgr.make: theory -> CodegenConsts.const list -> CodegenFuncgr.T| \\
haftmann
parents: 21186
diff changeset
  1798
  \indexml{CodegenFuncgr.funcs}\verb|CodegenFuncgr.funcs: CodegenFuncgr.T -> CodegenConsts.const -> thm list| \\
haftmann
parents: 21186
diff changeset
  1799
  \indexml{CodegenFuncgr.typ}\verb|CodegenFuncgr.typ: CodegenFuncgr.T -> CodegenConsts.const -> typ| \\
haftmann
parents: 21186
diff changeset
  1800
  \indexml{CodegenFuncgr.deps}\verb|CodegenFuncgr.deps: CodegenFuncgr.T|\isasep\isanewline%
haftmann
parents: 21186
diff changeset
  1801
\verb|    -> CodegenConsts.const list -> CodegenConsts.const list list| \\
haftmann
parents: 21186
diff changeset
  1802
  \indexml{CodegenFuncgr.all}\verb|CodegenFuncgr.all: CodegenFuncgr.T -> CodegenConsts.const list|
haftmann
parents: 21186
diff changeset
  1803
  \end{mldecls}
haftmann
parents: 21186
diff changeset
  1804
haftmann
parents: 21186
diff changeset
  1805
  \begin{description}
haftmann
parents: 21186
diff changeset
  1806
haftmann
parents: 21186
diff changeset
  1807
  \item \verb|CodegenFuncgr.T| represents
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1808
    a normalized defining equation system.
21348
haftmann
parents: 21186
diff changeset
  1809
haftmann
parents: 21186
diff changeset
  1810
  \item \verb|CodegenFuncgr.make|~\isa{thy}~\isa{cs}
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1811
    returns a normalized defining equation system,
21348
haftmann
parents: 21186
diff changeset
  1812
    with the assertion that it contains any function
haftmann
parents: 21186
diff changeset
  1813
    definition for constants \isa{cs} (if existing).
haftmann
parents: 21186
diff changeset
  1814
haftmann
parents: 21186
diff changeset
  1815
  \item \verb|CodegenFuncgr.funcs|~\isa{funcgr}~\isa{c}
haftmann
parents: 21186
diff changeset
  1816
    retrieves function definition for constant \isa{c}.
haftmann
parents: 21186
diff changeset
  1817
haftmann
parents: 21186
diff changeset
  1818
  \item \verb|CodegenFuncgr.typ|~\isa{funcgr}~\isa{c}
haftmann
parents: 21186
diff changeset
  1819
    retrieves function type for constant \isa{c}.
haftmann
parents: 21186
diff changeset
  1820
haftmann
parents: 21186
diff changeset
  1821
  \item \verb|CodegenFuncgr.deps|~\isa{funcgr}~\isa{cs}
haftmann
parents: 21186
diff changeset
  1822
    returns the transitive closure of dependencies for
haftmann
parents: 21186
diff changeset
  1823
    constants \isa{cs} as a partitioning where each partition
haftmann
parents: 21186
diff changeset
  1824
    corresponds to a strongly connected component of
haftmann
parents: 21186
diff changeset
  1825
    dependencies and any partition does \emph{not}
haftmann
parents: 21186
diff changeset
  1826
    depend on partitions further left.
haftmann
parents: 21186
diff changeset
  1827
haftmann
parents: 21186
diff changeset
  1828
  \item \verb|CodegenFuncgr.all|~\isa{funcgr}
haftmann
parents: 21186
diff changeset
  1829
    returns all currently represented constants.
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1830
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1831
  \end{description}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1832
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1833
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1834
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1835
\endisatagmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1836
{\isafoldmlref}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1837
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1838
\isadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1839
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1840
\endisadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1841
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1842
\isamarkupsubsection{Further auxiliary%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1843
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1844
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1845
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1846
\isadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1847
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1848
\endisadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1849
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1850
\isatagmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1851
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1852
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1853
\begin{mldecls}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1854
  \indexml{CodegenConsts.const-ord}\verb|CodegenConsts.const_ord: CodegenConsts.const * CodegenConsts.const -> order| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1855
  \indexml{CodegenConsts.eq-const}\verb|CodegenConsts.eq_const: CodegenConsts.const * CodegenConsts.const -> bool| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1856
  \indexml{CodegenConsts.consts-of}\verb|CodegenConsts.consts_of: theory -> term -> CodegenConsts.const list| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1857
  \indexml{CodegenConsts.read-const}\verb|CodegenConsts.read_const: theory -> string -> CodegenConsts.const| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1858
  \indexmlstructure{CodegenConsts.Consttab}\verb|structure CodegenConsts.Consttab| \\
21348
haftmann
parents: 21186
diff changeset
  1859
  \indexmlstructure{CodegenFuncgr.Constgraph}\verb|structure CodegenFuncgr.Constgraph| \\
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1860
  \indexml{CodegenFunc.typ-func}\verb|CodegenFunc.typ_func: thm -> typ| \\
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1861
  \indexml{CodegenFunc.rewrite-func}\verb|CodegenFunc.rewrite_func: thm list -> thm -> thm| \\
21348
haftmann
parents: 21186
diff changeset
  1862
  \end{mldecls}
haftmann
parents: 21186
diff changeset
  1863
haftmann
parents: 21186
diff changeset
  1864
  \begin{description}
haftmann
parents: 21186
diff changeset
  1865
haftmann
parents: 21186
diff changeset
  1866
  \item \verb|CodegenConsts.const_ord|,~\verb|CodegenConsts.eq_const|
haftmann
parents: 21186
diff changeset
  1867
     provide order and equality on constant identifiers.
haftmann
parents: 21186
diff changeset
  1868
haftmann
parents: 21186
diff changeset
  1869
  \item \verb|CodegenConsts.Consttab|,~\verb|CodegenFuncgr.Constgraph|
haftmann
parents: 21186
diff changeset
  1870
     provide advanced data structures with constant identifiers as keys.
haftmann
parents: 21186
diff changeset
  1871
haftmann
parents: 21186
diff changeset
  1872
  \item \verb|CodegenConsts.consts_of|~\isa{thy}~\isa{t}
haftmann
parents: 21186
diff changeset
  1873
     returns all constant identifiers mentioned in a term \isa{t}.
haftmann
parents: 21186
diff changeset
  1874
haftmann
parents: 21186
diff changeset
  1875
  \item \verb|CodegenConsts.read_const|~\isa{thy}~\isa{s}
haftmann
parents: 21186
diff changeset
  1876
     reads a constant as a concrete term expression \isa{s}.
haftmann
parents: 21186
diff changeset
  1877
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1878
  \item \verb|CodegenFunc.typ_func|~\isa{thm}
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1879
     extracts the type of a constant in a defining equation \isa{thm}.
21348
haftmann
parents: 21186
diff changeset
  1880
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1881
  \item \verb|CodegenFunc.rewrite_func|~\isa{rews}~\isa{thm}
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1882
     rewrites a defining equation \isa{thm} with a set of rewrite
21348
haftmann
parents: 21186
diff changeset
  1883
     rules \isa{rews}; only arguments and right hand side are rewritten,
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1884
     not the head of the defining equation.
21348
haftmann
parents: 21186
diff changeset
  1885
haftmann
parents: 21186
diff changeset
  1886
  \end{description}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1887
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1888
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1889
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1890
\endisatagmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1891
{\isafoldmlref}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1892
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1893
\isadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1894
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1895
\endisadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1896
%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1897
\isamarkupsubsection{Implementing code generator applications%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1898
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1899
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1900
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1901
\begin{isamarkuptext}%
21348
haftmann
parents: 21186
diff changeset
  1902
Implementing code generator applications on top
haftmann
parents: 21186
diff changeset
  1903
  of the framework set out so far usually not only
haftmann
parents: 21186
diff changeset
  1904
  involves using those primitive interfaces
haftmann
parents: 21186
diff changeset
  1905
  but also storing code-dependent data and various
haftmann
parents: 21186
diff changeset
  1906
  other things.
haftmann
parents: 21186
diff changeset
  1907
haftmann
parents: 21186
diff changeset
  1908
  \begin{warn}
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1909
    Some interfaces discussed here have not reached
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1910
    a final state yet.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1911
    Changes likely to occur in future.
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1912
  \end{warn}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1913
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1914
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1915
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1916
\isamarkupsubsubsection{Data depending on the theory's executable content%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1917
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1918
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1919
%
21348
haftmann
parents: 21186
diff changeset
  1920
\begin{isamarkuptext}%
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1921
Due to incrementality of code generation, changes in the
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1922
  theory's executable content have to be propagated in a
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1923
  certain fashion.  Additionally, such changes may occur
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1924
  not only during theory extension but also during theory
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1925
  merge, which is a little bit nasty from an implementation
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1926
  point of view.  The framework provides a solution
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1927
  to this technical challenge by providing a functorial
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1928
  data slot \verb|CodeDataFun|; on instantiation
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1929
  of this functor, the following types and operations
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1930
  are required:
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1931
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1932
  \medskip
21348
haftmann
parents: 21186
diff changeset
  1933
  \begin{tabular}{l}
haftmann
parents: 21186
diff changeset
  1934
  \isa{val\ name{\isacharcolon}\ string} \\
haftmann
parents: 21186
diff changeset
  1935
  \isa{type\ T} \\
haftmann
parents: 21186
diff changeset
  1936
  \isa{val\ empty{\isacharcolon}\ T} \\
haftmann
parents: 21186
diff changeset
  1937
  \isa{val\ merge{\isacharcolon}\ Pretty{\isachardot}pp\ {\isasymrightarrow}\ T\ {\isacharasterisk}\ T\ {\isasymrightarrow}\ T} \\
haftmann
parents: 21186
diff changeset
  1938
  \isa{val\ purge{\isacharcolon}\ theory\ option\ {\isasymrightarrow}\ CodegenConsts{\isachardot}const\ list\ option\ {\isasymrightarrow}\ T\ {\isasymrightarrow}\ T}
haftmann
parents: 21186
diff changeset
  1939
  \end{tabular}
haftmann
parents: 21186
diff changeset
  1940
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1941
  \begin{description}
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1942
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1943
  \item \isa{name} is a system-wide unique name identifying the data.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1944
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1945
  \item \isa{T} the type of data to store.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1946
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1947
  \item \isa{empty} initial (empty) data.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1948
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1949
  \item \isa{merge} merging two data slots.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1950
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1951
  \item \isa{purge}~\isa{thy}~\isa{cs} propagates changes in executable content;
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1952
    if possible, the current theory context is handed over
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1953
    as argument \isa{thy} (if there is no current theory context (e.g.~during
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1954
    theory merge, \verb|NONE|); \isa{cs} indicates the kind
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1955
    of change: \verb|NONE| stands for a fundamental change
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1956
    which invalidates any existing code, \isa{SOME\ cs}
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1957
    hints that executable content for constants \isa{cs}
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1958
    has changed.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1959
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1960
  \end{description}
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1961
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1962
  An instance of \verb|CodeDataFun| provides the following
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1963
  interface:
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1964
21348
haftmann
parents: 21186
diff changeset
  1965
  \medskip
haftmann
parents: 21186
diff changeset
  1966
  \begin{tabular}{l}
haftmann
parents: 21186
diff changeset
  1967
  \isa{init{\isacharcolon}\ theory\ {\isasymrightarrow}\ theory} \\
haftmann
parents: 21186
diff changeset
  1968
  \isa{get{\isacharcolon}\ theory\ {\isasymrightarrow}\ T} \\
haftmann
parents: 21186
diff changeset
  1969
  \isa{change{\isacharcolon}\ theory\ {\isasymrightarrow}\ {\isacharparenleft}T\ {\isasymrightarrow}\ T{\isacharparenright}\ {\isasymrightarrow}\ T} \\
haftmann
parents: 21186
diff changeset
  1970
  \isa{change{\isacharunderscore}yield{\isacharcolon}\ theory\ {\isasymrightarrow}\ {\isacharparenleft}T\ {\isasymrightarrow}\ {\isacharprime}a\ {\isacharasterisk}\ T{\isacharparenright}\ {\isasymrightarrow}\ {\isacharprime}a\ {\isacharasterisk}\ T}
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1971
  \end{tabular}
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1972
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1973
  \begin{description}
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1974
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1975
  \item \isa{init} initialization during theory setup.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1976
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1977
  \item \isa{get} retrieval of the current data.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1978
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1979
  \item \isa{change} update of current data (cached!)
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1980
    by giving a continuation.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1981
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1982
  \item \isa{change{\isacharunderscore}yield} update with side result.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1983
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1984
  \end{description}%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1985
\end{isamarkuptext}%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1986
\isamarkuptrue%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1987
%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1988
\isamarkupsubsubsection{Datatype hooks%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1989
}
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1990
\isamarkuptrue%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1991
%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1992
\begin{isamarkuptext}%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1993
Isabelle/HOL's datatype package provides a mechanism to
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1994
  extend theories depending on datatype declarations:
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1995
  \emph{datatype hooks}.  For example, when declaring a new
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1996
  datatype, a hook proves defining equations for equality on
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1997
  that datatype (if possible).%
21348
haftmann
parents: 21186
diff changeset
  1998
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1999
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  2000
%
haftmann
parents: 21186
diff changeset
  2001
\isadelimmlref
haftmann
parents: 21186
diff changeset
  2002
%
haftmann
parents: 21186
diff changeset
  2003
\endisadelimmlref
haftmann
parents: 21186
diff changeset
  2004
%
haftmann
parents: 21186
diff changeset
  2005
\isatagmlref
haftmann
parents: 21186
diff changeset
  2006
%
haftmann
parents: 21186
diff changeset
  2007
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  2008
\begin{mldecls}
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2009
  \indexmltype{DatatypeHooks.hook}\verb|type DatatypeHooks.hook = string list -> theory -> theory| \\
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2010
  \indexml{DatatypeHooks.add}\verb|DatatypeHooks.add: DatatypeHooks.hook -> theory -> theory|
21348
haftmann
parents: 21186
diff changeset
  2011
  \end{mldecls}
haftmann
parents: 21186
diff changeset
  2012
haftmann
parents: 21186
diff changeset
  2013
  \begin{description}
haftmann
parents: 21186
diff changeset
  2014
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2015
  \item \verb|DatatypeHooks.hook| specifies the interface
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2016
     of \emph{datatype hooks}: a theory update
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2017
     depending on the list of newly introduced
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2018
     datatype names.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2019
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2020
  \item \verb|DatatypeHooks.add| adds a hook to the
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2021
     chain of all hooks.
21348
haftmann
parents: 21186
diff changeset
  2022
haftmann
parents: 21186
diff changeset
  2023
  \end{description}%
haftmann
parents: 21186
diff changeset
  2024
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  2025
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  2026
%
haftmann
parents: 21186
diff changeset
  2027
\endisatagmlref
haftmann
parents: 21186
diff changeset
  2028
{\isafoldmlref}%
haftmann
parents: 21186
diff changeset
  2029
%
haftmann
parents: 21186
diff changeset
  2030
\isadelimmlref
haftmann
parents: 21186
diff changeset
  2031
%
haftmann
parents: 21186
diff changeset
  2032
\endisadelimmlref
haftmann
parents: 21186
diff changeset
  2033
%
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2034
\isamarkupsubsubsection{Trivial typedefs -- type copies%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  2035
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  2036
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  2037
%
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2038
\begin{isamarkuptext}%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2039
Sometimes packages will introduce new types
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2040
  as \emph{marked type copies} similar to Haskell's
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2041
  \isa{newtype} declaration (e.g. the HOL record package)
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2042
  \emph{without} tinkering with the overhead of datatypes.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2043
  Technically, these type copies are trivial forms of typedefs.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2044
  Since these type copies in code generation view are nothing
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2045
  else than datatypes, they have been given a own package
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2046
  in order to faciliate code generation:%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2047
\end{isamarkuptext}%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2048
\isamarkuptrue%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2049
%
21348
haftmann
parents: 21186
diff changeset
  2050
\isadelimmlref
haftmann
parents: 21186
diff changeset
  2051
%
haftmann
parents: 21186
diff changeset
  2052
\endisadelimmlref
haftmann
parents: 21186
diff changeset
  2053
%
haftmann
parents: 21186
diff changeset
  2054
\isatagmlref
haftmann
parents: 21186
diff changeset
  2055
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  2056
\begin{isamarkuptext}%
21348
haftmann
parents: 21186
diff changeset
  2057
\begin{mldecls}
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2058
  \indexmltype{TypecopyPackage.info}\verb|type TypecopyPackage.info| \\
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2059
  \indexml{TypecopyPackage.add-typecopy}\verb|TypecopyPackage.add_typecopy: |\isasep\isanewline%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2060
\verb|    bstring * string list -> typ -> (bstring * bstring) option|\isasep\isanewline%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2061
\verb|    -> theory -> (string * TypecopyPackage.info) * theory| \\
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2062
  \indexml{TypecopyPackage.get-typecopy-info}\verb|TypecopyPackage.get_typecopy_info: theory|\isasep\isanewline%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2063
\verb|    -> string -> TypecopyPackage.info option| \\
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2064
  \indexml{TypecopyPackage.get-spec}\verb|TypecopyPackage.get_spec: theory -> string|\isasep\isanewline%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2065
\verb|    -> (string * sort) list * (string * typ list) list| \\
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2066
  \indexmltype{TypecopyPackage.hook}\verb|type TypecopyPackage.hook = string * TypecopyPackage.info -> theory -> theory| \\
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2067
  \indexml{TypecopyPackage.add-hook}\verb|TypecopyPackage.add_hook: TypecopyPackage.hook -> theory -> theory| \\
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2068
  \end{mldecls}
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2069
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2070
  \begin{description}
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2071
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2072
  \item \verb|TypecopyPackage.info| a record containing
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2073
     the specification and further data of a type copy.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2074
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2075
  \item \verb|TypecopyPackage.add_typecopy| defines a new
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2076
     type copy.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2077
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2078
  \item \verb|TypecopyPackage.get_typecopy_info| retrieves
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2079
     data of an existing type copy.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2080
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2081
  \item \verb|TypecopyPackage.get_spec| retrieves datatype-like
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2082
     specification of a type copy.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2083
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2084
  \item \verb|TypecopyPackage.hook|,~\verb|TypecopyPackage.add_hook|
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2085
     provide a hook mechanism corresponding to the hook mechanism
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2086
     on datatypes.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2087
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2088
  \end{description}%
21348
haftmann
parents: 21186
diff changeset
  2089
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  2090
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  2091
%
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2092
\endisatagmlref
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2093
{\isafoldmlref}%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2094
%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2095
\isadelimmlref
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2096
%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2097
\endisadelimmlref
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2098
%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2099
\isamarkupsubsubsection{Unifying type copies and datatypes%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2100
}
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2101
\isamarkuptrue%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2102
%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2103
\begin{isamarkuptext}%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2104
Since datatypes and type copies are mapped to the same concept (datatypes)
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2105
  by code generation, the view on both is unified \qt{code types}:%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2106
\end{isamarkuptext}%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2107
\isamarkuptrue%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2108
%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2109
\isadelimmlref
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2110
%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2111
\endisadelimmlref
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2112
%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2113
\isatagmlref
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2114
%
21348
haftmann
parents: 21186
diff changeset
  2115
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  2116
\begin{mldecls}
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2117
  \indexmltype{DatatypeCodegen.hook}\verb|type DatatypeCodegen.hook = (string * (bool * ((string * sort) list|\isasep\isanewline%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2118
\verb|    * (string * typ list) list))) list|\isasep\isanewline%
21348
haftmann
parents: 21186
diff changeset
  2119
\verb|    -> theory -> theory| \\
haftmann
parents: 21186
diff changeset
  2120
  \indexml{DatatypeCodegen.add-codetypes-hook-bootstrap}\verb|DatatypeCodegen.add_codetypes_hook_bootstrap: |\isasep\isanewline%
haftmann
parents: 21186
diff changeset
  2121
\verb|      DatatypeCodegen.hook -> theory -> theory|
haftmann
parents: 21186
diff changeset
  2122
  \end{mldecls}%
haftmann
parents: 21186
diff changeset
  2123
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  2124
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  2125
%
haftmann
parents: 21186
diff changeset
  2126
\endisatagmlref
haftmann
parents: 21186
diff changeset
  2127
{\isafoldmlref}%
haftmann
parents: 21186
diff changeset
  2128
%
haftmann
parents: 21186
diff changeset
  2129
\isadelimmlref
haftmann
parents: 21186
diff changeset
  2130
%
haftmann
parents: 21186
diff changeset
  2131
\endisadelimmlref
haftmann
parents: 21186
diff changeset
  2132
%
haftmann
parents: 21186
diff changeset
  2133
\begin{isamarkuptext}%
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2134
\begin{description}
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2135
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2136
  \item \verb|DatatypeCodegen.hook| specifies the code type hook
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2137
     interface: a theory transformation depending on a list of
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2138
     mutual recursive code types; each entry in the list
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2139
     has the structure \isa{{\isacharparenleft}name{\isacharcomma}\ {\isacharparenleft}is{\isacharunderscore}data{\isacharcomma}\ {\isacharparenleft}vars{\isacharcomma}\ cons{\isacharparenright}{\isacharparenright}{\isacharparenright}}
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2140
     where \isa{name} is the name of the code type, \isa{is{\isacharunderscore}data}
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2141
     is true iff \isa{name} is a datatype rather then a type copy,
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2142
     and \isa{{\isacharparenleft}vars{\isacharcomma}\ cons{\isacharparenright}} is the specification of the code type.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2143
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2144
  \item \verb|DatatypeCodegen.add_codetypes_hook_bootstrap| adds a code
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2145
     type hook;  the hook is immediately processed for all already
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2146
     existing datatypes, in blocks of mutual recursive datatypes,
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2147
     where all datatypes a block depends on are processed before
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2148
     the block.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2149
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2150
  \end{description}
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2151
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  2152
  \emph{Happy proving, happy hacking!}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  2153
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  2154
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  2155
%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  2156
\isadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  2157
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  2158
\endisadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  2159
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  2160
\isatagtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  2161
\isacommand{end}\isamarkupfalse%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  2162
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  2163
\endisatagtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  2164
{\isafoldtheory}%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  2165
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  2166
\isadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  2167
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  2168
\endisadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  2169
\isanewline
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  2170
\end{isabellebody}%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  2171
%%% Local Variables:
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  2172
%%% mode: latex
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  2173
%%% TeX-master: "root"
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  2174
%%% End: