doc-src/IsarAdvanced/Codegen/Thy/document/Codegen.tex
author wenzelm
Sun, 05 Nov 2006 21:44:41 +0100
changeset 21186 0c51cd55a79c
parent 21172 eea3c9048c7a
child 21348 74c1da5d44be
permissions -rw-r--r--
updated;
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
\isanewline
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
     8
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
     9
\endisadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    10
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    11
\isatagtheory
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    12
%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    13
\endisatagtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    14
{\isafoldtheory}%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    15
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    16
\isadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    17
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    18
\endisadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    19
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    20
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    21
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    22
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    23
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    24
\isatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    25
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    26
\endisatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    27
{\isafoldML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    28
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    29
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    30
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    31
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    32
%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    33
\isamarkupchapter{Code generation from Isabelle theories%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    34
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    35
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    36
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    37
\isamarkupsection{Introduction%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    38
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    39
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    40
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    41
\isamarkupsubsection{Motivation%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    42
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    43
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    44
%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    45
\begin{isamarkuptext}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    46
Executing formal specifications as programs is a well-established
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    47
  topic in the theorem proving community.  With increasing
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    48
  application of theorem proving systems in the area of
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    49
  software development and verification, its relevance manifests
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    50
  for running test cases and rapid prototyping.  In logical
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    51
  calculi like constructive type theory,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    52
  a notion of executability is implicit due to the nature
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    53
  of the calculus.  In contrast, specifications in Isabelle/HOL
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    54
  can be highly non-executable.  In order to bridge
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    55
  the gap between logic and executable specifications,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    56
  an explicit non-trivial transformation has to be applied:
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    57
  code generation.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    58
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    59
  This tutorial introduces a generic code generator for the
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    60
  Isabelle system \cite{isa-tutorial}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    61
  Generic in the sense that the
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    62
  \qn{target language} for which code shall ultimately be
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    63
  generated is not fixed but may be an arbitrary state-of-the-art
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    64
  functional programming language (currently, the implementation
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    65
  supports SML \cite{web:sml} and Haskell \cite{web:haskell}).
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    66
  We aim to provide a
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    67
  versatile environment
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    68
  suitable for software development and verification,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    69
  structuring the process
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    70
  of code generation into a small set of orthogonal principles
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    71
  while achieving a big coverage of application areas
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    72
  with maximum flexibility.%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    73
\end{isamarkuptext}%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    74
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    75
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    76
\isamarkupsubsection{Overview%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    77
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    78
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    79
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    80
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    81
The code generator aims to be usable with no further ado
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    82
  in most cases while allowing for detailed customization.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    83
  This manifests in the structure of this tutorial: this introduction
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    84
  continues with a short introduction of concepts.  Section
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
    85
  \secref{sec:basics} explains how to use the framework naively,
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    86
  presuming a reasonable default setup.  Then, section
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    87
  \secref{sec:advanced} deals with advanced topics,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    88
  introducing further aspects of the code generator framework
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    89
  in a motivation-driven manner.  Last, section \secref{sec:ml}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    90
  introduces the framework's internal programming interfaces.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    91
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    92
  \begin{warn}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    93
    Ultimately, the code generator which this tutorial deals with
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    94
    is supposed to replace the already established code generator
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    95
    by Stefan Berghofer \cite{Berghofer-Nipkow:2002}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    96
    So, for the moment, there are two distinct code generators
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    97
    in Isabelle.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    98
    Also note that while the framework itself is largely
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    99
    object-logic independent, only HOL provides a reasonable
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   100
    framework setup.    
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   101
  \end{warn}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   102
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   103
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   104
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   105
\isamarkupsubsection{Code generation process%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   106
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   107
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   108
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   109
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   110
The code generator employs a notion of executability
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   111
  for three foundational executable ingredients known
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   112
  from functional programming:
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   113
  \emph{function equations}, \emph{datatypes}, and
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   114
  \emph{type classes}. A function equation as a first approximation
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   115
  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
   116
  (an equation headed by a constant \isa{f} with arguments
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   117
  \isa{t\isactrlisub {\isadigit{1}}\ t\isactrlisub {\isadigit{2}}\ {\isasymdots}\ t\isactrlisub n} and right hand side \isa{t}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   118
  Code generation aims to turn function equations
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   119
  into a functional program by running through
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   120
  a process (see figure \ref{fig:process}):
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   121
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   122
  \begin{itemize}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   123
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   124
    \item Out of the vast collection of theorems proven in a
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   125
      \qn{theory}, a reasonable subset modeling
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   126
      function equations is \qn{selected}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   127
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   128
    \item On those selected theorems, certain
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   129
      transformations are carried out
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   130
      (\qn{preprocessing}).  Their purpose is to turn theorems
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   131
      representing non- or badly executable
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   132
      specifications into equivalent but executable counterparts.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   133
      The result is a structured collection of \qn{code theorems}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   134
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   135
    \item These \qn{code theorems} then are extracted
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   136
      into an Haskell-like intermediate
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   137
      language.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   138
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   139
    \item Finally, out of the intermediate language the final
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   140
      code in the desired \qn{target language} is \qn{serialized}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   141
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   142
  \end{itemize}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   143
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   144
  \begin{figure}[h]
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   145
  \centering
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   146
  \includegraphics[width=0.3\textwidth]{codegen_process}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   147
  \caption{code generator -- processing overview}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   148
  \label{fig:process}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   149
  \end{figure}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   150
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   151
  From these steps, only the two last are carried out
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   152
  outside the logic; by keeping this layer as
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   153
  thin as possible, the amount of code to trust is
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   154
  kept to a minimum.%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   155
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   156
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   157
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   158
\isamarkupsection{Basics \label{sec:basics}%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   159
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   160
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   161
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   162
\isamarkupsubsection{Invoking the code generator%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   163
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   164
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   165
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   166
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   167
Thanks to a reasonable setup of the HOL theories, in
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   168
  most cases code generation proceeds without further ado:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   169
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   170
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   171
\isacommand{consts}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   172
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   173
\ \ fac\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   174
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   175
\isacommand{primrec}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   176
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   177
\ \ {\isachardoublequoteopen}fac\ {\isadigit{0}}\ {\isacharequal}\ {\isadigit{1}}{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   178
\ \ {\isachardoublequoteopen}fac\ {\isacharparenleft}Suc\ n{\isacharparenright}\ {\isacharequal}\ Suc\ n\ {\isacharasterisk}\ fac\ n{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   179
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   180
This executable specification is now turned to SML code:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   181
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   182
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   183
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   184
\ fac\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}fac{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   185
\begin{isamarkuptext}%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   186
The \isasymCODEGEN command takes a space-separated list of
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   187
  constants together with \qn{serialization directives}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   188
  in parentheses. These start with a \qn{target language}
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   189
  identifier, followed by arguments, their semantics
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   190
  depending on the target. In the SML case, a filename
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   191
  is given where to write the generated code to.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   192
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   193
  Internally, the function equations for all selected
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   194
  constants are taken, including any transitively required
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   195
  constants, datatypes and classes, resulting in the following
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   196
  code:
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   197
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   198
  \lstsml{Thy/examples/fac.ML}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   199
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   200
  The code generator will complain when a required
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   201
  ingredient does not provide a executable counterpart.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   202
  This is the case if an involved type is not a datatype:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   203
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   204
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   205
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   206
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   207
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   208
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   209
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   210
\isatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   211
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   212
\endisatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   213
{\isafoldML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   214
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   215
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   216
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   217
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   218
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   219
\isacommand{typedecl}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   220
\ {\isacharprime}a\ foo\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   221
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   222
\isacommand{definition}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   223
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   224
\ \ bar\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ foo\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   225
\ \ {\isachardoublequoteopen}bar\ x\ y\ {\isacharequal}\ y{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   226
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   227
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   228
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   229
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   230
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   231
\isatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   232
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   233
\endisatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   234
{\isafoldML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   235
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   236
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   237
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   238
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   239
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   240
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   241
\ bar\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}fail{\isacharunderscore}type{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   242
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   243
\noindent will result in an error. Likewise, generating code
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   244
  for constants not yielding
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   245
  a function equation will fail, e.g.~the Hilbert choice
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   246
  operation \isa{SOME}:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   247
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   248
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   249
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   250
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   251
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   252
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   253
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   254
\isatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   255
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   256
\endisatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   257
{\isafoldML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   258
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   259
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   260
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   261
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   262
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   263
\isacommand{definition}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   264
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   265
\ \ pick{\isacharunderscore}some\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   266
\ \ {\isachardoublequoteopen}pick{\isacharunderscore}some\ xs\ {\isacharequal}\ {\isacharparenleft}SOME\ x{\isachardot}\ x\ {\isasymin}\ set\ xs{\isacharparenright}{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   267
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   268
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   269
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   270
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   271
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   272
\isatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   273
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   274
\endisatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   275
{\isafoldML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   276
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   277
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   278
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   279
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   280
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   281
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   282
\ 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
   283
\isamarkupsubsection{Theorem selection%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   284
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   285
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   286
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   287
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   288
The list of all function equations in a theory may be inspected
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   289
  using the \isasymPRINTCODETHMS command:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   290
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   291
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   292
\isacommand{print{\isacharunderscore}codethms}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   293
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   294
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   295
\noindent which displays a table of constant with corresponding
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   296
  function equations (the additional stuff displayed
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   297
  shall not bother us for the moment). If this table does
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   298
  not provide at least one function
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   299
  equation, the table of primitive definitions is searched
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   300
  whether it provides one.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   301
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   302
  The typical HOL tools are already set up in a way that
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   303
  function definitions introduced by \isasymFUN, \isasymFUNCTION,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   304
  \isasymPRIMREC, \isasymRECDEF are implicitly propagated
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   305
  to this function equation table. Specific theorems may be
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   306
  selected using an attribute: \emph{code func}. As example,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   307
  a weight selector function:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   308
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   309
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   310
\isacommand{consts}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   311
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   312
\ \ 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
   313
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   314
\isacommand{primrec}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   315
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   316
\ \ {\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
   317
\ \ \ \ if\ n\ {\isacharless}\ k\ then\ v\ else\ pick\ xs\ {\isacharparenleft}n\ {\isacharminus}\ k{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   318
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   319
We want to eliminate the explicit destruction
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   320
  of \isa{x} to \isa{{\isacharparenleft}k{\isacharcomma}\ v{\isacharparenright}}:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   321
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   322
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   323
\isacommand{lemma}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   324
\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   325
\ \ {\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
   326
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   327
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   328
\ \ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   329
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   330
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   331
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   332
\isacommand{by}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   333
\ simp%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   334
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   335
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   336
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   337
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   338
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   339
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   340
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   341
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   342
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   343
\ pick\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}pick{\isadigit{1}}{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   344
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   345
This theorem is now added to the function equation table:
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   346
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   347
  \lstsml{Thy/examples/pick1.ML}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   348
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   349
  It might be convenient to remove the pointless original
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   350
  equation, using the \emph{nofunc} attribute:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   351
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   352
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   353
\isacommand{lemmas}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   354
\ {\isacharbrackleft}code\ nofunc{\isacharbrackright}\ {\isacharequal}\ pick{\isachardot}simps\ \isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   355
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   356
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   357
\ pick\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}pick{\isadigit{2}}{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   358
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   359
\lstsml{Thy/examples/pick2.ML}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   360
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   361
  Syntactic redundancies are implicitly dropped. For example,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   362
  using a modified version of the \isa{fac} function
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   363
  as function equation, the then redundant (since
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   364
  syntactically subsumed) original function equations
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   365
  are dropped, resulting in a warning:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   366
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   367
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   368
\isacommand{lemma}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   369
\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   370
\ \ {\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
   371
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   372
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   373
\ \ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   374
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   375
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   376
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   377
\isacommand{by}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   378
\ {\isacharparenleft}cases\ n{\isacharparenright}\ simp{\isacharunderscore}all%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   379
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   380
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   381
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   382
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   383
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   384
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   385
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   386
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   387
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   388
\ fac\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}fac{\isacharunderscore}case{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   389
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   390
\lstsml{Thy/examples/fac_case.ML}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   391
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   392
  \begin{warn}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   393
    Some statements in this section have to be treated with some
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   394
    caution. First, since the HOL function package is still
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   395
    under development, its setup with respect to code generation
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   396
    may differ from what is presumed here.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   397
    Further, the attributes \emph{code} and \emph{code del}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   398
    associated with the existing code generator also apply to
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   399
    the new one: \emph{code} implies \emph{code func},
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   400
    and \emph{code del} implies \emph{code nofunc}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   401
  \end{warn}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   402
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   403
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   404
%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   405
\isamarkupsubsection{Type classes%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   406
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   407
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   408
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   409
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   410
Type classes enter the game via the Isar class package.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   411
  For a short introduction how to use it, see \cite{isabelle-classes};
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   412
  here we just illustrate its impact on code generation.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   413
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   414
  In a target language, type classes may be represented
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   415
  natively (as in the case of Haskell). For languages
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   416
  like SML, they are implemented using \emph{dictionaries}.
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   417
  Our following example specifies a class \qt{null},
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   418
  assigning to each of its inhabitants a \qt{null} value:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   419
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   420
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   421
\isacommand{class}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   422
\ null\ {\isacharequal}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   423
\ \ \isakeyword{fixes}\ null\ {\isacharcolon}{\isacharcolon}\ {\isacharprime}a\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   424
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   425
\isacommand{consts}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   426
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   427
\ \ head\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a{\isasymColon}null\ list\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   428
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   429
\isacommand{primrec}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   430
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   431
\ \ {\isachardoublequoteopen}head\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ null{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   432
\ \ {\isachardoublequoteopen}head\ {\isacharparenleft}x{\isacharhash}xs{\isacharparenright}\ {\isacharequal}\ x{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   433
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   434
We provide some instances for our \isa{null}:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   435
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   436
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   437
\isacommand{instance}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   438
\ option\ {\isacharcolon}{\isacharcolon}\ {\isacharparenleft}type{\isacharparenright}\ null\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   439
\ \ {\isachardoublequoteopen}null\ {\isasymequiv}\ None{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   440
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   441
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   442
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   443
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   444
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   445
\isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   446
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   447
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   448
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   449
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   450
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   451
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   452
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   453
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   454
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   455
\isacommand{instance}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   456
\ list\ {\isacharcolon}{\isacharcolon}\ {\isacharparenleft}type{\isacharparenright}\ null\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   457
\ \ {\isachardoublequoteopen}null\ {\isasymequiv}\ {\isacharbrackleft}{\isacharbrackright}{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   458
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   459
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   460
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   461
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   462
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   463
\isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   464
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   465
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   466
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   467
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   468
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   469
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   470
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   471
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   472
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   473
Constructing a dummy example:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   474
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   475
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   476
\isacommand{definition}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   477
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   478
\ \ {\isachardoublequoteopen}dummy\ {\isacharequal}\ head\ {\isacharbrackleft}Some\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}{\isacharcomma}\ None{\isacharbrackright}{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   479
\begin{isamarkuptext}%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   480
Type classes offer a suitable occasion to introduce
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   481
  the Haskell serializer.  Its usage is almost the same
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   482
  as SML, but, in accordance with conventions
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   483
  some Haskell systems enforce, each module ends
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   484
  up in a single file. The module hierarchy is reflected in
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   485
  the file system, with root given by the user.%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   486
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   487
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   488
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   489
\ dummy\ {\isacharparenleft}Haskell\ {\isachardoublequoteopen}examples{\isacharslash}{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   490
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   491
\lsthaskell{Thy/examples/Codegen.hs}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   492
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   493
  (we have left out all other modules).
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   494
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   495
  The whole code in SML with explicit dictionary passing:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   496
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   497
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   498
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   499
\ dummy\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}class{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   500
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   501
\lstsml{Thy/examples/class.ML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   502
\end{isamarkuptext}%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   503
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   504
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   505
\isamarkupsubsection{Incremental code generation%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   506
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   507
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   508
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   509
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   510
Code generation is \emph{incremental}: theorems
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   511
  and abstract intermediate code are cached and extended on demand.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   512
  The cache may be partially or fully dropped if the underlying
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   513
  executable content of the theory changes.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   514
  Implementation of caching is supposed to transparently
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   515
  hid away the details from the user.  Anyway, caching
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   516
  reaches the surface by using a slightly more general form
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   517
  of the \isasymCODEGEN: either the list of constants or the
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   518
  list of serialization expressions may be dropped.  If no
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   519
  serialization expressions are given, only abstract code
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   520
  is generated and cached; if no constants are given, the
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   521
  current cache is serialized.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   522
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   523
  For explorative reasons, an extended version of the
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   524
  \isasymCODEGEN command may prove useful:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   525
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   526
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   527
\isacommand{print{\isacharunderscore}codethms}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   528
\ {\isacharparenleft}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   529
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   530
\noindent print all cached function equations (i.e.~\emph{after}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   531
  any applied transformation. Inside the brackets a
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   532
  list of constants may be given; their function
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   533
  equations are added to the cache if not already present.%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   534
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   535
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   536
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   537
\isamarkupsection{Recipes and advanced topics \label{sec:advanced}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   538
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   539
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   540
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   541
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   542
In this tutorial, we do not attempt to give an exhaustive
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   543
  description of the code generator framework; instead,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   544
  we cast a light on advanced topics by introducing
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   545
  them together with practically motivated examples.  Concerning
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   546
  further reading, see
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   547
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   548
  \begin{itemize}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   549
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   550
  \item the Isabelle/Isar Reference Manual \cite{isabelle-isar-ref}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   551
    for exhaustive syntax diagrams.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   552
  \item or \fixme{ref} which deals with foundational issues
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   553
    of the code generator framework.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   554
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   555
  \end{itemize}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   556
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   557
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   558
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   559
\isamarkupsubsection{Library theories%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   560
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   561
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   562
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   563
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   564
The HOL \emph{Main} theory already provides a code generator setup
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   565
  which should be suitable for most applications. Common extensions
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   566
  and modifications are available by certain theories of the HOL
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   567
  library; beside being useful in applications, they may serve
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   568
  as a tutorial for customizing the code generator setup.
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   569
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   570
  \begin{description}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   571
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   572
    \item[ExecutableSet] allows to generate code
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   573
       for finite sets using lists.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   574
    \item[ExecutableRat] implements rational
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   575
       numbers as triples \isa{{\isacharparenleft}sign{\isacharcomma}\ enumerator{\isacharcomma}\ denominator{\isacharparenright}}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   576
    \item[EfficientNat] implements natural numbers by integers,
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   577
       which in general will result in higher efficency; pattern
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   578
       matching with \isa{{\isadigit{0}}} / \isa{Suc}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   579
       is eliminated. \label{eff_nat}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   580
    \item[MLString] provides an additional datatype \isa{mlstring};
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   581
       in the HOL default setup, strings in HOL are mapped to list
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   582
       of chars in SML; values of type \isa{mlstring} are
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   583
       mapped to strings in SML.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   584
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   585
  \end{description}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   586
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   587
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   588
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   589
\isamarkupsubsection{Preprocessing%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   590
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   591
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   592
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   593
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   594
Before selected function theorems are turned into abstract
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   595
  code, a chain of definitional transformation steps is carried
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   596
  out: \emph{preprocessing}. There are three possibilities
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   597
  to customize preprocessing: \emph{inline theorems},
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   598
  \emph{inline procedures} and \emph{generic preprocessors}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   599
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   600
  \emph{Inline theorems} are rewriting rules applied to each
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   601
  function equation.  Due to the interpretation of theorems
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   602
  of function equations, rewrites are applied to the right
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   603
  hand side and the arguments of the left hand side of an
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   604
  equation, but never to the constant heading the left hand side.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   605
  Inline theorems may be declared an undeclared using the
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   606
  \emph{code inline} or \emph{code noinline} attribute respectively.
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   607
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   608
  Some common applications:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   609
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   610
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   611
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   612
\begin{itemize}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   613
     \item replacing non-executable constructs by executable ones: \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   614
\isacommand{lemma}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   615
\ {\isacharbrackleft}code\ inline{\isacharbrackright}{\isacharcolon}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   616
\ \ {\isachardoublequoteopen}x\ {\isasymin}\ set\ xs\ {\isasymlongleftrightarrow}\ x\ mem\ xs{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   617
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   618
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   619
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   620
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   621
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   622
\isacommand{by}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   623
\ {\isacharparenleft}induct\ xs{\isacharparenright}\ simp{\isacharunderscore}all%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   624
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   625
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   626
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   627
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   628
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   629
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   630
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   631
\item eliminating superfluous constants: \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   632
\isacommand{lemma}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   633
\ {\isacharbrackleft}code\ inline{\isacharbrackright}{\isacharcolon}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   634
\ \ {\isachardoublequoteopen}{\isadigit{1}}\ {\isacharequal}\ Suc\ {\isadigit{0}}{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   635
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   636
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   637
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   638
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   639
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   640
\isacommand{by}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   641
\ simp%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   642
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   643
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   644
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   645
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   646
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   647
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   648
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   649
\item replacing executable but inconvenient constructs: \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   650
\isacommand{lemma}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   651
\ {\isacharbrackleft}code\ inline{\isacharbrackright}{\isacharcolon}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   652
\ \ {\isachardoublequoteopen}xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymlongleftrightarrow}\ List{\isachardot}null\ xs{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   653
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   654
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   655
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   656
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   657
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   658
\isacommand{by}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   659
\ {\isacharparenleft}induct\ xs{\isacharparenright}\ simp{\isacharunderscore}all%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   660
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   661
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   662
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   663
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   664
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   665
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   666
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   667
\end{itemize}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   668
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   669
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   670
The current set of inline theorems may be inspected using
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   671
  the \isasymPRINTCODETHMS command.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   672
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   673
  \emph{Inline procedures} are a generalized version of inline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   674
  theorems written in ML -- rewrite rules are generated dependent
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   675
  on the function theorems for a certain function.  One
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   676
  application is the implicit expanding of \isa{nat} numerals
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   677
  to \isa{{\isadigit{0}}} / \isa{Suc} representation.  See further
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   678
  \secref{sec:ml}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   679
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   680
  \emph{Generic preprocessors} provide a most general interface,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   681
  transforming a list of function theorems to another
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   682
  list of function theorems, provided that neither the heading
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   683
  constant nor its type change.  The \isa{{\isadigit{0}}} / \isa{Suc}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   684
  pattern elimination implemented in \secref{eff_nat} uses this
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   685
  interface.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   686
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   687
  \begin{warn}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   688
    The order in which single preprocessing steps are carried
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   689
    out currently is not specified; in particular, preprocessing
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   690
    is \emph{no} fix point process.  Keep this in mind when
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   691
    setting up the preprocessor.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   692
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   693
    Further, the attribute \emph{code unfold}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   694
    associated with the existing code generator also applies to
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   695
    the new one: \emph{code unfold} implies \emph{code inline}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   696
  \end{warn}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   697
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   698
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   699
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   700
\isamarkupsubsection{Customizing serialization%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   701
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   702
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   703
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   704
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   705
Consider the following function and its corresponding
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   706
  SML code:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   707
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   708
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   709
\isacommand{fun}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   710
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   711
\ \ in{\isacharunderscore}interval\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymtimes}\ nat\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ bool{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   712
\ \ {\isachardoublequoteopen}in{\isacharunderscore}interval\ {\isacharparenleft}k{\isacharcomma}\ l{\isacharparenright}\ n\ {\isasymlongleftrightarrow}\ k\ {\isasymle}\ n\ {\isasymand}\ n\ {\isasymle}\ l{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   713
\isacommand{termination}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   714
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   715
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   716
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   717
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   718
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   719
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   720
\isacommand{by}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   721
\ {\isacharparenleft}auto{\isacharunderscore}term\ {\isachardoublequoteopen}{\isacharbraceleft}{\isacharbraceright}{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   722
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   723
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   724
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   725
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   726
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   727
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   728
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   729
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   730
\ in{\isacharunderscore}interval\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}bool{\isadigit{1}}{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   731
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   732
\lstsml{Thy/examples/bool1.ML}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   733
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   734
  Though this is correct code, it is a little bit unsatisfactory:
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   735
  boolean values and operators are materialized as distinguished
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   736
  entities with have nothing to do with the SML-builtin notion
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   737
  of \qt{bool}.  This results in less readable code;
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   738
  additionally, eager evaluation may cause programs to
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   739
  loop or break which would perfectly terminate when
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   740
  the existing SML \qt{bool} would be used.  To map
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   741
  the HOL \qt{bool} on SML \qt{bool}, we may use
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   742
  \qn{custom serializations}:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   743
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   744
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   745
\isacommand{code{\isacharunderscore}type}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   746
\ bool\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   747
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}bool{\isachardoublequoteclose}{\isacharparenright}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   748
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   749
\ True\ \isakeyword{and}\ False\ \isakeyword{and}\ {\isachardoublequoteopen}op\ {\isasymand}{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   750
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}true{\isachardoublequoteclose}\ \isakeyword{and}\ {\isachardoublequoteopen}false{\isachardoublequoteclose}\ \isakeyword{and}\ {\isachardoublequoteopen}{\isacharunderscore}\ andalso\ {\isacharunderscore}{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   751
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   752
The \isasymCODETYPE commad takes a type constructor
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   753
  as arguments together with a list of custom serializations.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   754
  Each custom serialization starts with a target language
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   755
  identifier followed by an expression, which during
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   756
  code serialization is inserted whenever the type constructor
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   757
  would occur.  For constants, \isasymCODECONST implements
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   758
  the corresponding mechanism.  Each \qt{\_} in
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   759
  a serialization expression is treated as a placeholder
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   760
  for the type constructor's (the constant's) arguments.%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   761
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   762
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   763
\isacommand{code{\isacharunderscore}reserved}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   764
\ SML\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   765
\ \ bool\ true\ false%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   766
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   767
To assert that the existing \qt{bool}, \qt{true} and \qt{false}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   768
  is not used for generated code, we use \isasymCODERESERVED.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   769
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   770
  After this setup, code looks quite more readable:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   771
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   772
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   773
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   774
\ in{\isacharunderscore}interval\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}bool{\isadigit{2}}{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   775
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   776
\lstsml{Thy/examples/bool2.ML}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   777
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   778
  This still is not perfect: the parentheses
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   779
  around \qt{andalso} are superfluous.  Though the serializer
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   780
  by no means attempts to imitate the rich Isabelle syntax
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   781
  framework, it provides some common idioms, notably
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   782
  associative infixes with precedences which may be used here:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   783
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   784
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   785
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   786
\ {\isachardoublequoteopen}op\ {\isasymand}{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   787
\ \ {\isacharparenleft}SML\ \isakeyword{infixl}\ {\isadigit{1}}\ {\isachardoublequoteopen}andalso{\isachardoublequoteclose}{\isacharparenright}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   788
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   789
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   790
\ in{\isacharunderscore}interval\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}bool{\isadigit{3}}{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   791
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   792
\lstsml{Thy/examples/bool3.ML}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   793
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   794
  Next, we try to map HOL pairs to SML pairs, using the
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   795
  infix \qt{ * } type constructor and parentheses:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   796
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   797
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   798
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   799
\isacommand{code{\isacharunderscore}type}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   800
\ {\isacharasterisk}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   801
\ \ {\isacharparenleft}SML\ \isakeyword{infix}\ {\isadigit{2}}\ {\isachardoublequoteopen}{\isacharasterisk}{\isachardoublequoteclose}{\isacharparenright}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   802
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   803
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   804
\ Pair\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   805
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}{\isacharbang}{\isacharparenleft}{\isacharparenleft}{\isacharunderscore}{\isacharparenright}{\isacharcomma}{\isacharslash}\ {\isacharparenleft}{\isacharunderscore}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   806
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   807
The initial bang \qt{!} tells the serializer to never put
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   808
  parentheses around the whole expression (they are already present),
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   809
  while the parentheses around argument place holders
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   810
  tell not to put parentheses around the arguments.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   811
  The slash \qt{/} (followed by arbitrary white space)
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   812
  inserts a space which may be used as a break if necessary
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   813
  during pretty printing.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   814
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   815
  So far, we did only provide more idiomatic serializations for
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   816
  constructs which would be executable on their own.  Target-specific
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   817
  serializations may also be used to \emph{implement} constructs
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   818
  which have no implicit notion of executability.  For example,
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   819
  take the HOL integers:%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   820
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   821
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   822
\isacommand{definition}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   823
\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   824
\ \ double{\isacharunderscore}inc\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}int\ {\isasymRightarrow}\ int{\isachardoublequoteclose}\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   825
\ \ {\isachardoublequoteopen}double{\isacharunderscore}inc\ k\ {\isacharequal}\ {\isadigit{2}}\ {\isacharasterisk}\ k\ {\isacharplus}\ {\isadigit{1}}{\isachardoublequoteclose}\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   826
\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   827
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   828
\ double{\isacharunderscore}inc\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}integers{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   829
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   830
will fail: \isa{int} in HOL is implemented using a quotient
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   831
  type, which does not provide any notion of executability.
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   832
  \footnote{Eventually, we also want to provide executability
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   833
  for quotients.}.  However, we could use the SML builtin
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   834
  integers:%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   835
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   836
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   837
\isacommand{code{\isacharunderscore}type}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   838
\ int\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   839
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}IntInf{\isachardot}int{\isachardoublequoteclose}{\isacharparenright}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   840
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   841
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   842
\ {\isachardoublequoteopen}op\ {\isacharplus}\ {\isasymColon}\ int\ {\isasymRightarrow}\ int\ {\isasymRightarrow}\ int{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   843
\ \ \ \ \isakeyword{and}\ {\isachardoublequoteopen}op\ {\isacharasterisk}\ {\isasymColon}\ int\ {\isasymRightarrow}\ int\ {\isasymRightarrow}\ int{\isachardoublequoteclose}\isanewline
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   844
\ \ {\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}\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   845
\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   846
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   847
\ double{\isacharunderscore}inc\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}integers{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   848
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   849
resulting in:
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   850
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   851
  \lstsml{Thy/examples/integers.ML}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   852
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   853
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   854
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   855
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   856
These examples give a glimpse what powerful mechanisms
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   857
  custom serializations provide; however their usage
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   858
  requires careful thinking in order not to introduce
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   859
  inconsistencies -- or, in other words:
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   860
  custom serializations are completely axiomatic.
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   861
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   862
  A further noteworthy details is that any special
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   863
  character in a custom serialization may be quoted
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   864
  using \qt{'}; thus, in \qt{fn '\_ => \_} the first
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   865
  \qt{'\_} is a proper underscore while the
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   866
  second \qt{\_} is a placeholder.
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   867
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   868
  The HOL theories provide further
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   869
  examples for custom serializations and form
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   870
  a recommended tutorial on how to use them properly.%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   871
\end{isamarkuptext}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   872
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   873
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   874
\isamarkupsubsection{Concerning operational equality%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   875
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   876
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   877
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   878
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   879
Surely you have already noticed how equality is treated
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   880
  by the code generator:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   881
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   882
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   883
\isacommand{fun}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   884
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   885
\ \ 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
   886
\ \ {\isachardoublequoteopen}collect{\isacharunderscore}duplicates\ xs\ ys\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ xs{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   887
\ \ {\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
   888
\ \ \ \ then\ if\ z\ {\isasymin}\ set\ ys\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   889
\ \ \ \ \ \ then\ collect{\isacharunderscore}duplicates\ xs\ ys\ zs\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   890
\ \ \ \ \ \ else\ collect{\isacharunderscore}duplicates\ xs\ {\isacharparenleft}z{\isacharhash}ys{\isacharparenright}\ zs\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   891
\ \ \ \ else\ collect{\isacharunderscore}duplicates\ {\isacharparenleft}z{\isacharhash}xs{\isacharparenright}\ {\isacharparenleft}z{\isacharhash}ys{\isacharparenright}\ zs{\isacharparenright}{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   892
\isacommand{termination}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   893
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   894
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   895
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   896
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   897
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   898
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   899
\isacommand{by}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   900
\ {\isacharparenleft}auto{\isacharunderscore}term\ {\isachardoublequoteopen}measure\ {\isacharparenleft}length\ o\ snd\ o\ snd{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   901
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   902
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   903
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   904
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   905
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   906
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   907
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   908
\begin{isamarkuptext}%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   909
The membership test during preprocessing is rewriting,
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   910
  resulting in \isa{op\ mem}, which itself
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   911
  performs an explicit equality check.%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   912
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   913
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   914
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   915
\ collect{\isacharunderscore}duplicates\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}collect{\isacharunderscore}duplicates{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   916
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   917
\lstsml{Thy/examples/collect_duplicates.ML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   918
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   919
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   920
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   921
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   922
Obviously, polymorphic equality is implemented the Haskell
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   923
  way using a type class.  How is this achieved?  By an
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   924
  almost trivial definition in the HOL setup:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   925
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   926
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   927
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   928
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   929
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   930
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   931
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   932
\isatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   933
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   934
\endisatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   935
{\isafoldML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   936
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   937
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   938
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   939
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   940
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   941
\isacommand{class}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   942
\ eq\ {\isacharequal}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   943
\ \ \isakeyword{fixes}\ eq\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymRightarrow}\ bool{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   944
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   945
\isacommand{defs}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   946
\isanewline
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   947
\ \ eq\ {\isacharcolon}\ {\isachardoublequoteopen}eq\ {\isasymequiv}\ {\isacharparenleft}op\ {\isacharequal}{\isacharparenright}{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   948
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   949
This merely introduces a class \isa{eq} with corresponding
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   950
  operation \isa{eq}, which by definition is isomorphic
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   951
  to \isa{op\ {\isacharequal}}; the preprocessing framework does the rest.%
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
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   955
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   956
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   957
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   958
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   959
\isatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   960
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   961
\endisatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   962
{\isafoldML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   963
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   964
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   965
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   966
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   967
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   968
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   969
For datatypes, instances of \isa{eq} are implicitly derived
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   970
  when possible.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   971
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   972
  Though this class is designed to get rarely in the way, there
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   973
  are some cases when it suddenly comes to surface:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   974
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   975
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   976
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   977
\isamarkupsubsubsection{code lemmas and customary serializations for equality%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   978
}
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   979
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   980
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   981
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   982
Examine the following:%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   983
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   984
\isamarkuptrue%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   985
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   986
\ {\isachardoublequoteopen}op\ {\isacharequal}\ {\isasymColon}\ int\ {\isasymRightarrow}\ int\ {\isasymRightarrow}\ bool{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   987
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}{\isacharbang}{\isacharparenleft}{\isacharunderscore}\ {\isacharcolon}\ IntInf{\isachardot}int\ {\isacharequal}\ {\isacharunderscore}{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   988
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   989
What is wrong here? Since \isa{op\ {\isacharequal}} is nothing else then
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   990
  a plain constant, this customary serialization will refer
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   991
  to polymorphic equality \isa{op\ {\isacharequal}}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   992
  Instead, we want the specific equality on \isa{int},
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   993
  by using the overloaded constant \isa{Code{\isacharunderscore}Generator{\isachardot}eq}:%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   994
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   995
\isamarkuptrue%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   996
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   997
\ {\isachardoublequoteopen}Code{\isacharunderscore}Generator{\isachardot}eq\ {\isasymColon}\ int\ {\isasymRightarrow}\ int\ {\isasymRightarrow}\ bool{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   998
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}{\isacharbang}{\isacharparenleft}{\isacharunderscore}\ {\isacharcolon}\ IntInf{\isachardot}int\ {\isacharequal}\ {\isacharunderscore}{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   999
\isamarkupsubsubsection{typedecls interpretated by customary serializations%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1000
}
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1001
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1002
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1003
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1004
A common idiom is to use unspecified types for formalizations
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1005
  and interpret them for a specific target language:%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1006
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1007
\isamarkuptrue%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1008
\isacommand{typedecl}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1009
\ key\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1010
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1011
\isacommand{fun}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1012
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1013
\ \ 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
  1014
\ \ {\isachardoublequoteopen}lookup\ {\isacharbrackleft}{\isacharbrackright}\ l\ {\isacharequal}\ None{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1015
\ \ {\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
  1016
\isacommand{termination}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1017
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1018
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1019
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1020
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1021
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1022
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1023
\isacommand{by}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1024
\ {\isacharparenleft}auto{\isacharunderscore}term\ {\isachardoublequoteopen}measure\ {\isacharparenleft}length\ o\ fst{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1025
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1026
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1027
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1028
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1029
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1030
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1031
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1032
\isacommand{code{\isacharunderscore}type}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1033
\ key\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1034
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}string{\isachardoublequoteclose}{\isacharparenright}%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1035
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1036
This, though, is not sufficient: \isa{key} is no instance
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1037
  of \isa{eq} since \isa{key} is no datatype; the instance
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1038
  has to be declared manually, including a serialization
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1039
  for the particular instance of \isa{Code{\isacharunderscore}Generator{\isachardot}eq}:%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1040
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1041
\isamarkuptrue%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1042
\isacommand{instance}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1043
\ key\ {\isacharcolon}{\isacharcolon}\ eq%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1044
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1045
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1046
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1047
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1048
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1049
\isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1050
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1051
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1052
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1053
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1054
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1055
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1056
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1057
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1058
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1059
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1060
\ {\isachardoublequoteopen}Code{\isacharunderscore}Generator{\isachardot}eq\ {\isasymColon}\ key\ {\isasymRightarrow}\ key\ {\isasymRightarrow}\ bool{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1061
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}{\isacharbang}{\isacharparenleft}{\isacharunderscore}\ {\isacharcolon}\ string\ {\isacharequal}\ {\isacharunderscore}{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1062
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1063
Then everything goes fine:%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1064
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1065
\isamarkuptrue%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1066
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1067
\ lookup\ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}lookup{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1068
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1069
\lstsml{Thy/examples/lookup.ML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1070
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1071
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1072
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1073
\isamarkupsubsubsection{lexicographic orderings and coregularity%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1074
}
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1075
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1076
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1077
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1078
Another subtlety
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1079
  enters the stage when definitions of overloaded constants
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1080
  are dependent on operational equality.  For example, let
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1081
  us define a lexicographic ordering on tuples: \\%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1082
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1083
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1084
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1085
\isadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1086
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1087
\endisadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1088
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1089
\isatagML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1090
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1091
\endisatagML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1092
{\isafoldML}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1093
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1094
\isadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1095
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1096
\endisadelimML
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1097
\isanewline
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1098
\isacommand{instance}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1099
\ {\isacharasterisk}\ {\isacharcolon}{\isacharcolon}\ {\isacharparenleft}ord{\isacharcomma}\ ord{\isacharparenright}\ ord\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1100
\ \ {\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
  1101
\ \ \ \ 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
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1102
\ \ {\isachardoublequoteopen}p{\isadigit{1}}\ {\isasymle}\ p{\isadigit{2}}\ {\isasymequiv}\ p{\isadigit{1}}\ {\isacharless}\ p{\isadigit{2}}\ {\isasymor}\ {\isacharparenleft}p{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}ord\ {\isasymtimes}\ {\isacharprime}b{\isasymColon}ord{\isacharparenright}\ \ {\isacharequal}\ p{\isadigit{2}}{\isachardoublequoteclose}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1103
\isadelimproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1104
\ %
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1105
\endisadelimproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1106
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1107
\isatagproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1108
\isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1109
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1110
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1111
\endisatagproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1112
{\isafoldproof}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1113
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1114
\isadelimproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1115
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1116
\endisadelimproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1117
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1118
\isadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1119
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1120
\endisadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1121
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1122
\isatagML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1123
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1124
\endisatagML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1125
{\isafoldML}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1126
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1127
\isadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1128
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1129
\endisadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1130
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1131
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1132
Then code generation will fail.  Why?  The definition
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1133
  of \isa{op\ {\isasymle}} depends on equality on both arguments,
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1134
  which are polymorphic and impose an additional \isa{eq}
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1135
  class constraint, thus violating the type discipline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1136
  for class operations.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1137
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1138
  The solution is to add \isa{eq} to both sort arguments:%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1139
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1140
\isamarkuptrue%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1141
\isacommand{instance}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1142
\ {\isacharasterisk}\ {\isacharcolon}{\isacharcolon}\ {\isacharparenleft}{\isachardoublequoteopen}{\isacharbraceleft}eq{\isacharcomma}\ ord{\isacharbraceright}{\isachardoublequoteclose}{\isacharcomma}\ {\isachardoublequoteopen}{\isacharbraceleft}eq{\isacharcomma}\ ord{\isacharbraceright}{\isachardoublequoteclose}{\isacharparenright}\ ord\isanewline
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1143
\ \ {\isachardoublequoteopen}p{\isadigit{1}}\ {\isacharless}\ p{\isadigit{2}}\ {\isasymequiv}\ let\ {\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}{\isacharbraceleft}eq{\isacharcomma}\ ord{\isacharbraceright}{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}{\isacharbraceleft}eq{\isacharcomma}\ ord{\isacharbraceright}{\isacharparenright}\ {\isacharequal}\ p{\isadigit{1}}{\isacharsemicolon}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isacharequal}\ p{\isadigit{2}}\ in\isanewline
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1144
\ \ \ \ 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
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1145
\ \ {\isachardoublequoteopen}p{\isadigit{1}}\ {\isasymle}\ p{\isadigit{2}}\ {\isasymequiv}\ p{\isadigit{1}}\ {\isacharless}\ p{\isadigit{2}}\ {\isasymor}\ {\isacharparenleft}p{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}{\isacharbraceleft}eq{\isacharcomma}\ ord{\isacharbraceright}\ {\isasymtimes}\ {\isacharprime}b{\isasymColon}{\isacharbraceleft}eq{\isacharcomma}\ ord{\isacharbraceright}{\isacharparenright}\ \ {\isacharequal}\ p{\isadigit{2}}{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1146
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1147
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1148
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1149
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1150
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1151
\isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1152
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1153
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1154
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1155
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1156
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1157
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1158
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1159
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1160
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1161
Then code generation succeeds:%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1162
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1163
\isamarkuptrue%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1164
\isacommand{code{\isacharunderscore}gen}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1165
\ {\isachardoublequoteopen}op\ {\isasymle}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}{\isacharbraceleft}eq{\isacharcomma}\ ord{\isacharbraceright}\ {\isasymtimes}\ {\isacharprime}b{\isasymColon}{\isacharbraceleft}eq{\isacharcomma}\ ord{\isacharbraceright}\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymtimes}\ {\isacharprime}b\ {\isasymRightarrow}\ bool{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1166
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}examples{\isacharslash}lexicographic{\isachardot}ML{\isachardoublequoteclose}{\isacharparenright}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1167
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1168
\lstsml{Thy/examples/lexicographic.ML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1169
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1170
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1171
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1172
\isamarkupsubsubsection{Haskell serialization%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1173
}
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1174
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1175
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1176
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1177
For convenience, the default
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1178
  HOL setup for Haskell maps the \isa{eq} class to
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1179
  its counterpart in Haskell, giving custom serializations
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1180
  for the class (\isasymCODECLASS) and its operation:%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1181
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1182
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1183
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1184
\isadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1185
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1186
\endisadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1187
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1188
\isatagML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1189
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1190
\endisatagML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1191
{\isafoldML}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1192
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1193
\isadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1194
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1195
\endisadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1196
\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1197
\isacommand{code{\isacharunderscore}class}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1198
\ eq\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1199
\ \ {\isacharparenleft}Haskell\ {\isachardoublequoteopen}Eq{\isachardoublequoteclose}\ \isakeyword{where}\ eq\ {\isasymequiv}\ {\isachardoublequoteopen}{\isacharparenleft}{\isacharequal}{\isacharequal}{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1200
\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1201
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1202
\ eq\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1203
\ \ {\isacharparenleft}Haskell\ \isakeyword{infixl}\ {\isadigit{4}}\ {\isachardoublequoteopen}{\isacharequal}{\isacharequal}{\isachardoublequoteclose}{\isacharparenright}\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1204
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1205
\isadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1206
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1207
\endisadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1208
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1209
\isatagML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1210
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1211
\endisatagML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1212
{\isafoldML}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1213
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1214
\isadelimML
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1215
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1216
\endisadelimML
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1217
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1218
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1219
A problem now occurs whenever a type which
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1220
  is an instance of \isa{eq} in HOL is mapped
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1221
  on a Haskell-builtin type which is also an instance
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1222
  of Haskell \isa{Eq}:%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1223
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1224
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1225
\isacommand{typedecl}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1226
\ bar\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1227
\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1228
\isacommand{instance}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1229
\ bar\ {\isacharcolon}{\isacharcolon}\ eq%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1230
\isadelimproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1231
\ %
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1232
\endisadelimproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1233
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1234
\isatagproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1235
\isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1236
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1237
\endisatagproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1238
{\isafoldproof}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1239
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1240
\isadelimproof
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1241
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1242
\endisadelimproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1243
\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1244
\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1245
\isacommand{code{\isacharunderscore}type}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1246
\ bar\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1247
\ \ {\isacharparenleft}Haskell\ {\isachardoublequoteopen}Integer{\isachardoublequoteclose}{\isacharparenright}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1248
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1249
The code generator would produce
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1250
    an additional instance, which of course is rejected.
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1251
    To suppress this additional instance, use
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1252
    \isasymCODEINSTANCE:%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1253
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1254
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1255
\isacommand{code{\isacharunderscore}instance}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1256
\ bar\ {\isacharcolon}{\isacharcolon}\ eq\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1257
\ \ {\isacharparenleft}Haskell\ {\isacharminus}{\isacharparenright}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1258
\isamarkupsubsection{Types matter%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1259
}
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1260
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1261
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1262
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1263
Imagine the following quick-and-dirty setup for implementing
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1264
  some sets as lists:%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1265
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1266
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1267
\isacommand{code{\isacharunderscore}type}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1268
\ set\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1269
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}{\isacharunderscore}\ list{\isachardoublequoteclose}{\isacharparenright}\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1270
\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1271
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1272
\ {\isachardoublequoteopen}{\isacharbraceleft}{\isacharbraceright}{\isachardoublequoteclose}\ \isakeyword{and}\ insert\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1273
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}{\isacharbang}{\isacharbrackleft}{\isacharbrackright}{\isachardoublequoteclose}\ \isakeyword{and}\ \isakeyword{infixl}\ {\isadigit{7}}\ {\isachardoublequoteopen}{\isacharcolon}{\isacharcolon}{\isachardoublequoteclose}{\isacharparenright}\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1274
\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1275
\isacommand{definition}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1276
\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1277
\ \ dummy{\isacharunderscore}set\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ set{\isachardoublequoteclose}\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1278
\ \ {\isachardoublequoteopen}dummy{\isacharunderscore}set\ {\isacharequal}\ {\isacharbraceleft}{\isadigit{1}}{\isacharcomma}\ {\isadigit{2}}{\isacharcomma}\ {\isadigit{3}}{\isacharbraceright}{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1279
\isamarkupsubsection{Axiomatic extensions%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1280
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1281
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1282
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1283
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1284
\begin{warn}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1285
    The extensions introduced in this section, though working
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1286
    in practice, are not the cream of the crop.  They will
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1287
    eventually be replaced by more mature approaches.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1288
  \end{warn}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1289
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1290
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1291
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1292
\isamarkupsection{ML interfaces \label{sec:ml}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1293
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1294
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1295
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1296
\isamarkupsubsection{Constants with type discipline: codegen\_consts.ML%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1297
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1298
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1299
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1300
\isadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1301
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1302
\endisadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1303
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1304
\isatagmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1305
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1306
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1307
\begin{mldecls}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1308
  \indexmltype{CodegenConsts.const}\verb|type CodegenConsts.const| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1309
  \indexml{CodegenConsts.inst-of-typ}\verb|CodegenConsts.inst_of_typ: theory -> string * typ -> CodegenConsts.const| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1310
  \indexml{CodegenConsts.typ-of-inst}\verb|CodegenConsts.typ_of_inst: theory -> CodegenConsts.const -> string * typ| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1311
  \indexml{CodegenConsts.norm}\verb|CodegenConsts.norm: theory -> CodegenConsts.const -> CodegenConsts.const| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1312
  \indexml{CodegenConsts.norm-of-typ}\verb|CodegenConsts.norm_of_typ: theory -> string * typ -> CodegenConsts.const|
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1313
  \end{mldecls}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1314
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1315
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1316
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1317
\endisatagmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1318
{\isafoldmlref}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1319
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1320
\isadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1321
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1322
\endisadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1323
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1324
\isamarkupsubsection{Executable theory content: codegen\_data.ML%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1325
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1326
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1327
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1328
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1329
This Pure module implements the core notions of
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1330
  executable content of a theory.%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1331
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1332
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1333
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1334
\isamarkupsubsubsection{Suspended theorems%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1335
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1336
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1337
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1338
\isadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1339
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1340
\endisadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1341
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1342
\isatagmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1343
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1344
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1345
\begin{mldecls}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1346
  \indexmltype{CodegenData.lthms}\verb|type CodegenData.lthms| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1347
  \indexml{CodegenData.lazy}\verb|CodegenData.lazy: (unit -> thm list) -> CodegenData.lthms|
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1348
  \end{mldecls}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1349
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1350
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1351
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1352
\endisatagmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1353
{\isafoldmlref}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1354
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1355
\isadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1356
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1357
\endisadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1358
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1359
\isamarkupsubsubsection{Executable content%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1360
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1361
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1362
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1363
\isadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1364
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1365
\endisadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1366
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1367
\isatagmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1368
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1369
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1370
\begin{mldecls}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1371
  \indexml{CodegenData.add-func}\verb|CodegenData.add_func: thm -> theory -> theory| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1372
  \indexml{CodegenData.del-func}\verb|CodegenData.del_func: thm -> theory -> theory| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1373
  \indexml{CodegenData.add-funcl}\verb|CodegenData.add_funcl: CodegenConsts.const * CodegenData.lthms -> theory -> theory| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1374
  \indexml{CodegenData.add-datatype}\verb|CodegenData.add_datatype: string * (((string * sort) list * (string * typ list) list) * CodegenData.lthms) -> theory -> theory| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1375
  \indexml{CodegenData.del-datatype}\verb|CodegenData.del_datatype: string -> theory -> theory| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1376
  \indexml{CodegenData.add-inline}\verb|CodegenData.add_inline: thm -> theory -> theory| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1377
  \indexml{CodegenData.del-inline}\verb|CodegenData.del_inline: thm -> theory -> theory| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1378
  \indexml{CodegenData.add-inline-proc}\verb|CodegenData.add_inline_proc: (theory -> cterm list -> thm list) -> theory -> theory| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1379
  \indexml{CodegenData.add-preproc}\verb|CodegenData.add_preproc: (theory -> thm list -> thm list) -> theory -> theory| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1380
  \indexml{CodegenData.these-funcs}\verb|CodegenData.these_funcs: theory -> CodegenConsts.const -> thm list| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1381
  \indexml{CodegenData.get-datatype}\verb|CodegenData.get_datatype: theory -> string -> ((string * sort) list * (string * typ list) list) option| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1382
  \indexml{CodegenData.get-datatype-of-constr}\verb|CodegenData.get_datatype_of_constr: theory -> CodegenConsts.const -> string option|
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1383
  \end{mldecls}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1384
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1385
  \begin{description}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1386
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1387
  \item \verb|CodegenData.add_func|~\isa{thm}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1388
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1389
  \end{description}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1390
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1391
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1392
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1393
\endisatagmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1394
{\isafoldmlref}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1395
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1396
\isadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1397
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1398
\endisadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1399
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1400
\isamarkupsubsection{Further auxiliary%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1401
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1402
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1403
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1404
\isadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1405
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1406
\endisadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1407
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1408
\isatagmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1409
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1410
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1411
\begin{mldecls}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1412
  \indexml{CodegenConsts.const-ord}\verb|CodegenConsts.const_ord: CodegenConsts.const * CodegenConsts.const -> order| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1413
  \indexml{CodegenConsts.eq-const}\verb|CodegenConsts.eq_const: CodegenConsts.const * CodegenConsts.const -> bool| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1414
  \indexml{CodegenConsts.consts-of}\verb|CodegenConsts.consts_of: theory -> term -> CodegenConsts.const list| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1415
  \indexml{CodegenConsts.read-const}\verb|CodegenConsts.read_const: theory -> string -> CodegenConsts.const| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1416
  \indexmlstructure{CodegenConsts.Consttab}\verb|structure CodegenConsts.Consttab| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1417
  \indexml{CodegenData.typ-func}\verb|CodegenData.typ_func: theory -> thm -> typ| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1418
  \indexml{CodegenData.rewrite-func}\verb|CodegenData.rewrite_func: thm list -> thm -> thm| \\
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1419
  \end{mldecls}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1420
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1421
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1422
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1423
\endisatagmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1424
{\isafoldmlref}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1425
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1426
\isadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1427
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1428
\endisadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1429
%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1430
\isamarkupsubsection{Implementing code generator applications%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1431
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1432
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1433
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1434
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1435
\begin{warn}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1436
    Some interfaces discussed here have not reached
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1437
    a final state yet.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1438
    Changes likely to occur in future.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1439
  \end{warn}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1440
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1441
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1442
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1443
\isamarkupsubsubsection{Data depending on the theory's executable content%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1444
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1445
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1446
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1447
\isamarkupsubsubsection{Datatype hooks%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1448
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1449
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1450
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1451
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1452
\emph{Happy proving, happy hacking!}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1453
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1454
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1455
%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1456
\isadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1457
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1458
\endisadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1459
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1460
\isatagtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1461
\isacommand{end}\isamarkupfalse%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1462
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1463
\endisatagtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1464
{\isafoldtheory}%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1465
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1466
\isadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1467
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1468
\endisadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1469
\isanewline
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1470
\end{isabellebody}%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1471
%%% Local Variables:
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1472
%%% mode: latex
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1473
%%% TeX-master: "root"
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1474
%%% End: