| 31050 |      1 | %
 | 
|  |      2 | \begin{isabellebody}%
 | 
|  |      3 | \def\isabellecontext{Adaptation}%
 | 
|  |      4 | %
 | 
|  |      5 | \isadelimtheory
 | 
|  |      6 | %
 | 
|  |      7 | \endisadelimtheory
 | 
|  |      8 | %
 | 
|  |      9 | \isatagtheory
 | 
|  |     10 | \isacommand{theory}\isamarkupfalse%
 | 
|  |     11 | \ Adaptation\isanewline
 | 
|  |     12 | \isakeyword{imports}\ Setup\isanewline
 | 
|  |     13 | \isakeyword{begin}%
 | 
|  |     14 | \endisatagtheory
 | 
|  |     15 | {\isafoldtheory}%
 | 
|  |     16 | %
 | 
|  |     17 | \isadelimtheory
 | 
|  |     18 | \isanewline
 | 
|  |     19 | %
 | 
|  |     20 | \endisadelimtheory
 | 
|  |     21 | %
 | 
|  |     22 | \isadeliminvisible
 | 
|  |     23 | \isanewline
 | 
|  |     24 | %
 | 
|  |     25 | \endisadeliminvisible
 | 
|  |     26 | %
 | 
|  |     27 | \isataginvisible
 | 
|  |     28 | \isacommand{setup}\isamarkupfalse%
 | 
|  |     29 | \ {\isacharverbatimopen}\ Code{\isacharunderscore}Target{\isachardot}extend{\isacharunderscore}target\ {\isacharparenleft}{\isachardoublequote}{\isasymSML}{\isachardoublequote}{\isacharcomma}\ {\isacharparenleft}{\isachardoublequote}SML{\isachardoublequote}{\isacharcomma}\ K\ I{\isacharparenright}{\isacharparenright}\ {\isacharverbatimclose}%
 | 
|  |     30 | \endisataginvisible
 | 
|  |     31 | {\isafoldinvisible}%
 | 
|  |     32 | %
 | 
|  |     33 | \isadeliminvisible
 | 
|  |     34 | %
 | 
|  |     35 | \endisadeliminvisible
 | 
|  |     36 | %
 | 
|  |     37 | \isamarkupsection{Adaptation to target languages \label{sec:adaptation}%
 | 
|  |     38 | }
 | 
|  |     39 | \isamarkuptrue%
 | 
|  |     40 | %
 | 
|  |     41 | \isamarkupsubsection{Adapting code generation%
 | 
|  |     42 | }
 | 
|  |     43 | \isamarkuptrue%
 | 
|  |     44 | %
 | 
|  |     45 | \begin{isamarkuptext}%
 | 
|  |     46 | The aspects of code generation introduced so far have two aspects
 | 
|  |     47 |   in common:
 | 
|  |     48 | 
 | 
|  |     49 |   \begin{itemize}
 | 
|  |     50 |     \item They act uniformly, without reference to a specific
 | 
|  |     51 |        target language.
 | 
|  |     52 |     \item They are \emph{safe} in the sense that as long as you trust
 | 
|  |     53 |        the code generator meta theory and implementation, you cannot
 | 
|  |     54 |        produce programs that yield results which are not derivable
 | 
|  |     55 |        in the logic.
 | 
|  |     56 |   \end{itemize}
 | 
|  |     57 | 
 | 
|  |     58 |   \noindent In this section we will introduce means to \emph{adapt} the serialiser
 | 
|  |     59 |   to a specific target language, i.e.~to print program fragments
 | 
|  |     60 |   in a way which accommodates \qt{already existing} ingredients of
 | 
|  |     61 |   a target language environment, for three reasons:
 | 
|  |     62 | 
 | 
|  |     63 |   \begin{itemize}
 | 
|  |     64 |     \item improving readability and aesthetics of generated code
 | 
|  |     65 |     \item gaining efficiency
 | 
|  |     66 |     \item interface with language parts which have no direct counterpart
 | 
|  |     67 |       in \isa{HOL} (say, imperative data structures)
 | 
|  |     68 |   \end{itemize}
 | 
|  |     69 | 
 | 
|  |     70 |   \noindent Generally, you should avoid using those features yourself
 | 
|  |     71 |   \emph{at any cost}:
 | 
|  |     72 | 
 | 
|  |     73 |   \begin{itemize}
 | 
|  |     74 |     \item The safe configuration methods act uniformly on every target language,
 | 
|  |     75 |       whereas for adaptation you have to treat each target language separate.
 | 
|  |     76 |     \item Application is extremely tedious since there is no abstraction
 | 
|  |     77 |       which would allow for a static check, making it easy to produce garbage.
 | 
|  |     78 |     \item More or less subtle errors can be introduced unconsciously.
 | 
|  |     79 |   \end{itemize}
 | 
|  |     80 | 
 | 
|  |     81 |   \noindent However, even if you ought refrain from setting up adaptation
 | 
|  |     82 |   yourself, already the \isa{HOL} comes with some reasonable default
 | 
|  |     83 |   adaptations (say, using target language list syntax).  There also some
 | 
|  |     84 |   common adaptation cases which you can setup by importing particular
 | 
|  |     85 |   library theories.  In order to understand these, we provide some clues here;
 | 
|  |     86 |   these however are not supposed to replace a careful study of the sources.%
 | 
|  |     87 | \end{isamarkuptext}%
 | 
|  |     88 | \isamarkuptrue%
 | 
|  |     89 | %
 | 
|  |     90 | \isamarkupsubsection{The adaptation principle%
 | 
|  |     91 | }
 | 
|  |     92 | \isamarkuptrue%
 | 
|  |     93 | %
 | 
|  |     94 | \begin{isamarkuptext}%
 | 
|  |     95 | Figure \ref{fig:adaptation} illustrates what \qt{adaptation} is conceptually
 | 
|  |     96 |   supposed to be:
 | 
|  |     97 | 
 | 
|  |     98 |   \begin{figure}[here]
 | 
|  |     99 |     \includegraphics{adaptation}
 | 
|  |    100 |     \caption{The adaptation principle}
 | 
|  |    101 |     \label{fig:adaptation}
 | 
|  |    102 |   \end{figure}
 | 
|  |    103 | 
 | 
|  |    104 |   \noindent In the tame view, code generation acts as broker between
 | 
|  |    105 |   \isa{logic}, \isa{intermediate\ language} and
 | 
|  |    106 |   \isa{target\ language} by means of \isa{translation} and
 | 
|  |    107 |   \isa{serialisation};  for the latter, the serialiser has to observe
 | 
|  |    108 |   the structure of the \isa{language} itself plus some \isa{reserved}
 | 
|  |    109 |   keywords which have to be avoided for generated code.
 | 
|  |    110 |   However, if you consider \isa{adaptation} mechanisms, the code generated
 | 
|  |    111 |   by the serializer is just the tip of the iceberg:
 | 
|  |    112 | 
 | 
|  |    113 |   \begin{itemize}
 | 
|  |    114 |     \item \isa{serialisation} can be \emph{parametrised} such that
 | 
|  |    115 |       logical entities are mapped to target-specific ones
 | 
|  |    116 |       (e.g. target-specific list syntax,
 | 
|  |    117 |         see also \secref{sec:adaptation_mechanisms})
 | 
|  |    118 |     \item Such parametrisations can involve references to a
 | 
|  |    119 |       target-specific standard \isa{library} (e.g. using
 | 
|  |    120 |       the \isa{Haskell} \verb|Maybe| type instead
 | 
|  |    121 |       of the \isa{HOL} \isa{option} type);
 | 
|  |    122 |       if such are used, the corresponding identifiers
 | 
|  |    123 |       (in our example, \verb|Maybe|, \verb|Nothing|
 | 
|  |    124 |       and \verb|Just|) also have to be considered \isa{reserved}.
 | 
|  |    125 |     \item Even more, the user can enrich the library of the
 | 
|  |    126 |       target-language by providing code snippets
 | 
|  |    127 |       (\qt{\isa{includes}}) which are prepended to
 | 
|  |    128 |       any generated code (see \secref{sec:include});  this typically
 | 
|  |    129 |       also involves further \isa{reserved} identifiers.
 | 
|  |    130 |   \end{itemize}
 | 
|  |    131 | 
 | 
|  |    132 |   \noindent As figure \ref{fig:adaptation} illustrates, all these adaptation mechanisms
 | 
|  |    133 |   have to act consistently;  it is at the discretion of the user
 | 
|  |    134 |   to take care for this.%
 | 
|  |    135 | \end{isamarkuptext}%
 | 
|  |    136 | \isamarkuptrue%
 | 
|  |    137 | %
 | 
|  |    138 | \isamarkupsubsection{Common adaptation patterns%
 | 
|  |    139 | }
 | 
|  |    140 | \isamarkuptrue%
 | 
|  |    141 | %
 | 
|  |    142 | \begin{isamarkuptext}%
 | 
|  |    143 | The \hyperlink{theory.HOL}{\mbox{\isa{HOL}}} \hyperlink{theory.Main}{\mbox{\isa{Main}}} theory already provides a code
 | 
|  |    144 |   generator setup
 | 
|  |    145 |   which should be suitable for most applications.  Common extensions
 | 
|  |    146 |   and modifications are available by certain theories of the \isa{HOL}
 | 
|  |    147 |   library; beside being useful in applications, they may serve
 | 
|  |    148 |   as a tutorial for customising the code generator setup (see below
 | 
|  |    149 |   \secref{sec:adaptation_mechanisms}).
 | 
|  |    150 | 
 | 
|  |    151 |   \begin{description}
 | 
|  |    152 | 
 | 
|  |    153 |     \item[\hyperlink{theory.Code-Integer}{\mbox{\isa{Code{\isacharunderscore}Integer}}}] represents \isa{HOL} integers by big
 | 
|  |    154 |        integer literals in target languages.
 | 
|  |    155 |     \item[\hyperlink{theory.Code-Char}{\mbox{\isa{Code{\isacharunderscore}Char}}}] represents \isa{HOL} characters by 
 | 
|  |    156 |        character literals in target languages.
 | 
|  |    157 |     \item[\hyperlink{theory.Code-Char-chr}{\mbox{\isa{Code{\isacharunderscore}Char{\isacharunderscore}chr}}}] like \isa{Code{\isacharunderscore}Char},
 | 
|  |    158 |        but also offers treatment of character codes; includes
 | 
|  |    159 |        \hyperlink{theory.Code-Char}{\mbox{\isa{Code{\isacharunderscore}Char}}}.
 | 
|  |    160 |     \item[\hyperlink{theory.Efficient-Nat}{\mbox{\isa{Efficient{\isacharunderscore}Nat}}}] \label{eff_nat} implements natural numbers by integers,
 | 
|  |    161 |        which in general will result in higher efficiency; pattern
 | 
|  |    162 |        matching with \isa{{\isadigit{0}}} / \isa{Suc}
 | 
|  |    163 |        is eliminated;  includes \hyperlink{theory.Code-Integer}{\mbox{\isa{Code{\isacharunderscore}Integer}}}
 | 
| 31206 |    164 |        and \hyperlink{theory.Code-Numeral}{\mbox{\isa{Code{\isacharunderscore}Numeral}}}.
 | 
|  |    165 |     \item[\hyperlink{theory.Code-Numeral}{\mbox{\isa{Code{\isacharunderscore}Numeral}}}] provides an additional datatype
 | 
| 31050 |    166 |        \isa{index} which is mapped to target-language built-in integers.
 | 
|  |    167 |        Useful for code setups which involve e.g. indexing of
 | 
|  |    168 |        target-language arrays.
 | 
| 31150 |    169 |     \item[\hyperlink{theory.String}{\mbox{\isa{String}}}] provides an additional datatype
 | 
| 31206 |    170 |        \isa{String{\isachardot}literal} which is isomorphic to strings;
 | 
|  |    171 |        \isa{String{\isachardot}literal}s are mapped to target-language strings.
 | 
| 31050 |    172 |        Useful for code setups which involve e.g. printing (error) messages.
 | 
|  |    173 | 
 | 
|  |    174 |   \end{description}
 | 
|  |    175 | 
 | 
|  |    176 |   \begin{warn}
 | 
|  |    177 |     When importing any of these theories, they should form the last
 | 
|  |    178 |     items in an import list.  Since these theories adapt the
 | 
|  |    179 |     code generator setup in a non-conservative fashion,
 | 
|  |    180 |     strange effects may occur otherwise.
 | 
|  |    181 |   \end{warn}%
 | 
|  |    182 | \end{isamarkuptext}%
 | 
|  |    183 | \isamarkuptrue%
 | 
|  |    184 | %
 | 
|  |    185 | \isamarkupsubsection{Parametrising serialisation \label{sec:adaptation_mechanisms}%
 | 
|  |    186 | }
 | 
|  |    187 | \isamarkuptrue%
 | 
|  |    188 | %
 | 
|  |    189 | \begin{isamarkuptext}%
 | 
|  |    190 | Consider the following function and its corresponding
 | 
|  |    191 |   SML code:%
 | 
|  |    192 | \end{isamarkuptext}%
 | 
|  |    193 | \isamarkuptrue%
 | 
|  |    194 | %
 | 
|  |    195 | \isadelimquote
 | 
|  |    196 | %
 | 
|  |    197 | \endisadelimquote
 | 
|  |    198 | %
 | 
|  |    199 | \isatagquote
 | 
|  |    200 | \isacommand{primrec}\isamarkupfalse%
 | 
|  |    201 | \ in{\isacharunderscore}interval\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymtimes}\ nat\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ bool{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
 | 
|  |    202 | \ \ {\isachardoublequoteopen}in{\isacharunderscore}interval\ {\isacharparenleft}k{\isacharcomma}\ l{\isacharparenright}\ n\ {\isasymlongleftrightarrow}\ k\ {\isasymle}\ n\ {\isasymand}\ n\ {\isasymle}\ l{\isachardoublequoteclose}%
 | 
|  |    203 | \endisatagquote
 | 
|  |    204 | {\isafoldquote}%
 | 
|  |    205 | %
 | 
|  |    206 | \isadelimquote
 | 
|  |    207 | %
 | 
|  |    208 | \endisadelimquote
 | 
|  |    209 | %
 | 
|  |    210 | \isadeliminvisible
 | 
|  |    211 | %
 | 
|  |    212 | \endisadeliminvisible
 | 
|  |    213 | %
 | 
|  |    214 | \isataginvisible
 | 
|  |    215 | %
 | 
|  |    216 | \endisataginvisible
 | 
|  |    217 | {\isafoldinvisible}%
 | 
|  |    218 | %
 | 
|  |    219 | \isadeliminvisible
 | 
|  |    220 | %
 | 
|  |    221 | \endisadeliminvisible
 | 
|  |    222 | %
 | 
|  |    223 | \isadelimquote
 | 
|  |    224 | %
 | 
|  |    225 | \endisadelimquote
 | 
|  |    226 | %
 | 
|  |    227 | \isatagquote
 | 
|  |    228 | %
 | 
|  |    229 | \begin{isamarkuptext}%
 | 
|  |    230 | \isatypewriter%
 | 
|  |    231 | \noindent%
 | 
|  |    232 | \hspace*{0pt}structure Example = \\
 | 
|  |    233 | \hspace*{0pt}struct\\
 | 
|  |    234 | \hspace*{0pt}\\
 | 
|  |    235 | \hspace*{0pt}datatype nat = Zero{\char95}nat | Suc of nat;\\
 | 
|  |    236 | \hspace*{0pt}\\
 | 
|  |    237 | \hspace*{0pt}datatype boola = True | False;\\
 | 
|  |    238 | \hspace*{0pt}\\
 | 
|  |    239 | \hspace*{0pt}fun anda x True = x\\
 | 
|  |    240 | \hspace*{0pt} ~| anda x False = False\\
 | 
|  |    241 | \hspace*{0pt} ~| anda True x = x\\
 | 
|  |    242 | \hspace*{0pt} ~| anda False x = False;\\
 | 
|  |    243 | \hspace*{0pt}\\
 | 
|  |    244 | \hspace*{0pt}fun less{\char95}nat m (Suc n) = less{\char95}eq{\char95}nat m n\\
 | 
|  |    245 | \hspace*{0pt} ~| less{\char95}nat n Zero{\char95}nat = False\\
 | 
|  |    246 | \hspace*{0pt}and less{\char95}eq{\char95}nat (Suc m) n = less{\char95}nat m n\\
 | 
|  |    247 | \hspace*{0pt} ~| less{\char95}eq{\char95}nat Zero{\char95}nat n = True;\\
 | 
|  |    248 | \hspace*{0pt}\\
 | 
|  |    249 | \hspace*{0pt}fun in{\char95}interval (k,~l) n = anda (less{\char95}eq{\char95}nat k n) (less{\char95}eq{\char95}nat n l);\\
 | 
|  |    250 | \hspace*{0pt}\\
 | 
|  |    251 | \hspace*{0pt}end;~(*struct Example*)%
 | 
|  |    252 | \end{isamarkuptext}%
 | 
|  |    253 | \isamarkuptrue%
 | 
|  |    254 | %
 | 
|  |    255 | \endisatagquote
 | 
|  |    256 | {\isafoldquote}%
 | 
|  |    257 | %
 | 
|  |    258 | \isadelimquote
 | 
|  |    259 | %
 | 
|  |    260 | \endisadelimquote
 | 
|  |    261 | %
 | 
|  |    262 | \begin{isamarkuptext}%
 | 
|  |    263 | \noindent Though this is correct code, it is a little bit unsatisfactory:
 | 
|  |    264 |   boolean values and operators are materialised as distinguished
 | 
|  |    265 |   entities with have nothing to do with the SML-built-in notion
 | 
|  |    266 |   of \qt{bool}.  This results in less readable code;
 | 
|  |    267 |   additionally, eager evaluation may cause programs to
 | 
|  |    268 |   loop or break which would perfectly terminate when
 | 
|  |    269 |   the existing SML \verb|bool| would be used.  To map
 | 
|  |    270 |   the HOL \isa{bool} on SML \verb|bool|, we may use
 | 
|  |    271 |   \qn{custom serialisations}:%
 | 
|  |    272 | \end{isamarkuptext}%
 | 
|  |    273 | \isamarkuptrue%
 | 
|  |    274 | %
 | 
|  |    275 | \isadelimquotett
 | 
|  |    276 | %
 | 
|  |    277 | \endisadelimquotett
 | 
|  |    278 | %
 | 
|  |    279 | \isatagquotett
 | 
|  |    280 | \isacommand{code{\isacharunderscore}type}\isamarkupfalse%
 | 
|  |    281 | \ bool\isanewline
 | 
|  |    282 | \ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}bool{\isachardoublequoteclose}{\isacharparenright}\isanewline
 | 
|  |    283 | \isacommand{code{\isacharunderscore}const}\isamarkupfalse%
 | 
|  |    284 | \ True\ \isakeyword{and}\ False\ \isakeyword{and}\ {\isachardoublequoteopen}op\ {\isasymand}{\isachardoublequoteclose}\isanewline
 | 
|  |    285 | \ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}true{\isachardoublequoteclose}\ \isakeyword{and}\ {\isachardoublequoteopen}false{\isachardoublequoteclose}\ \isakeyword{and}\ {\isachardoublequoteopen}{\isacharunderscore}\ andalso\ {\isacharunderscore}{\isachardoublequoteclose}{\isacharparenright}%
 | 
|  |    286 | \endisatagquotett
 | 
|  |    287 | {\isafoldquotett}%
 | 
|  |    288 | %
 | 
|  |    289 | \isadelimquotett
 | 
|  |    290 | %
 | 
|  |    291 | \endisadelimquotett
 | 
|  |    292 | %
 | 
|  |    293 | \begin{isamarkuptext}%
 | 
|  |    294 | \noindent The \hyperlink{command.code-type}{\mbox{\isa{\isacommand{code{\isacharunderscore}type}}}} command takes a type constructor
 | 
|  |    295 |   as arguments together with a list of custom serialisations.
 | 
|  |    296 |   Each custom serialisation starts with a target language
 | 
|  |    297 |   identifier followed by an expression, which during
 | 
|  |    298 |   code serialisation is inserted whenever the type constructor
 | 
|  |    299 |   would occur.  For constants, \hyperlink{command.code-const}{\mbox{\isa{\isacommand{code{\isacharunderscore}const}}}} implements
 | 
|  |    300 |   the corresponding mechanism.  Each ``\verb|_|'' in
 | 
|  |    301 |   a serialisation expression is treated as a placeholder
 | 
|  |    302 |   for the type constructor's (the constant's) arguments.%
 | 
|  |    303 | \end{isamarkuptext}%
 | 
|  |    304 | \isamarkuptrue%
 | 
|  |    305 | %
 | 
|  |    306 | \isadelimquote
 | 
|  |    307 | %
 | 
|  |    308 | \endisadelimquote
 | 
|  |    309 | %
 | 
|  |    310 | \isatagquote
 | 
|  |    311 | %
 | 
|  |    312 | \begin{isamarkuptext}%
 | 
|  |    313 | \isatypewriter%
 | 
|  |    314 | \noindent%
 | 
|  |    315 | \hspace*{0pt}structure Example = \\
 | 
|  |    316 | \hspace*{0pt}struct\\
 | 
|  |    317 | \hspace*{0pt}\\
 | 
|  |    318 | \hspace*{0pt}datatype nat = Zero{\char95}nat | Suc of nat;\\
 | 
|  |    319 | \hspace*{0pt}\\
 | 
|  |    320 | \hspace*{0pt}fun less{\char95}nat m (Suc n) = less{\char95}eq{\char95}nat m n\\
 | 
|  |    321 | \hspace*{0pt} ~| less{\char95}nat n Zero{\char95}nat = false\\
 | 
|  |    322 | \hspace*{0pt}and less{\char95}eq{\char95}nat (Suc m) n = less{\char95}nat m n\\
 | 
|  |    323 | \hspace*{0pt} ~| less{\char95}eq{\char95}nat Zero{\char95}nat n = true;\\
 | 
|  |    324 | \hspace*{0pt}\\
 | 
|  |    325 | \hspace*{0pt}fun in{\char95}interval (k,~l) n = (less{\char95}eq{\char95}nat k n) andalso (less{\char95}eq{\char95}nat n l);\\
 | 
|  |    326 | \hspace*{0pt}\\
 | 
|  |    327 | \hspace*{0pt}end;~(*struct Example*)%
 | 
|  |    328 | \end{isamarkuptext}%
 | 
|  |    329 | \isamarkuptrue%
 | 
|  |    330 | %
 | 
|  |    331 | \endisatagquote
 | 
|  |    332 | {\isafoldquote}%
 | 
|  |    333 | %
 | 
|  |    334 | \isadelimquote
 | 
|  |    335 | %
 | 
|  |    336 | \endisadelimquote
 | 
|  |    337 | %
 | 
|  |    338 | \begin{isamarkuptext}%
 | 
|  |    339 | \noindent This still is not perfect: the parentheses
 | 
|  |    340 |   around the \qt{andalso} expression are superfluous.
 | 
|  |    341 |   Though the serialiser
 | 
|  |    342 |   by no means attempts to imitate the rich Isabelle syntax
 | 
|  |    343 |   framework, it provides some common idioms, notably
 | 
|  |    344 |   associative infixes with precedences which may be used here:%
 | 
|  |    345 | \end{isamarkuptext}%
 | 
|  |    346 | \isamarkuptrue%
 | 
|  |    347 | %
 | 
|  |    348 | \isadelimquotett
 | 
|  |    349 | %
 | 
|  |    350 | \endisadelimquotett
 | 
|  |    351 | %
 | 
|  |    352 | \isatagquotett
 | 
|  |    353 | \isacommand{code{\isacharunderscore}const}\isamarkupfalse%
 | 
|  |    354 | \ {\isachardoublequoteopen}op\ {\isasymand}{\isachardoublequoteclose}\isanewline
 | 
|  |    355 | \ \ {\isacharparenleft}SML\ \isakeyword{infixl}\ {\isadigit{1}}\ {\isachardoublequoteopen}andalso{\isachardoublequoteclose}{\isacharparenright}%
 | 
|  |    356 | \endisatagquotett
 | 
|  |    357 | {\isafoldquotett}%
 | 
|  |    358 | %
 | 
|  |    359 | \isadelimquotett
 | 
|  |    360 | %
 | 
|  |    361 | \endisadelimquotett
 | 
|  |    362 | %
 | 
|  |    363 | \isadelimquote
 | 
|  |    364 | %
 | 
|  |    365 | \endisadelimquote
 | 
|  |    366 | %
 | 
|  |    367 | \isatagquote
 | 
|  |    368 | %
 | 
|  |    369 | \begin{isamarkuptext}%
 | 
|  |    370 | \isatypewriter%
 | 
|  |    371 | \noindent%
 | 
|  |    372 | \hspace*{0pt}structure Example = \\
 | 
|  |    373 | \hspace*{0pt}struct\\
 | 
|  |    374 | \hspace*{0pt}\\
 | 
|  |    375 | \hspace*{0pt}datatype nat = Zero{\char95}nat | Suc of nat;\\
 | 
|  |    376 | \hspace*{0pt}\\
 | 
|  |    377 | \hspace*{0pt}fun less{\char95}nat m (Suc n) = less{\char95}eq{\char95}nat m n\\
 | 
|  |    378 | \hspace*{0pt} ~| less{\char95}nat n Zero{\char95}nat = false\\
 | 
|  |    379 | \hspace*{0pt}and less{\char95}eq{\char95}nat (Suc m) n = less{\char95}nat m n\\
 | 
|  |    380 | \hspace*{0pt} ~| less{\char95}eq{\char95}nat Zero{\char95}nat n = true;\\
 | 
|  |    381 | \hspace*{0pt}\\
 | 
|  |    382 | \hspace*{0pt}fun in{\char95}interval (k,~l) n = less{\char95}eq{\char95}nat k n andalso less{\char95}eq{\char95}nat n l;\\
 | 
|  |    383 | \hspace*{0pt}\\
 | 
|  |    384 | \hspace*{0pt}end;~(*struct Example*)%
 | 
|  |    385 | \end{isamarkuptext}%
 | 
|  |    386 | \isamarkuptrue%
 | 
|  |    387 | %
 | 
|  |    388 | \endisatagquote
 | 
|  |    389 | {\isafoldquote}%
 | 
|  |    390 | %
 | 
|  |    391 | \isadelimquote
 | 
|  |    392 | %
 | 
|  |    393 | \endisadelimquote
 | 
|  |    394 | %
 | 
|  |    395 | \begin{isamarkuptext}%
 | 
|  |    396 | \noindent The attentive reader may ask how we assert that no generated
 | 
|  |    397 |   code will accidentally overwrite.  For this reason the serialiser has
 | 
|  |    398 |   an internal table of identifiers which have to be avoided to be used
 | 
|  |    399 |   for new declarations.  Initially, this table typically contains the
 | 
|  |    400 |   keywords of the target language.  It can be extended manually, thus avoiding
 | 
|  |    401 |   accidental overwrites, using the \hyperlink{command.code-reserved}{\mbox{\isa{\isacommand{code{\isacharunderscore}reserved}}}} command:%
 | 
|  |    402 | \end{isamarkuptext}%
 | 
|  |    403 | \isamarkuptrue%
 | 
|  |    404 | %
 | 
|  |    405 | \isadelimquote
 | 
|  |    406 | %
 | 
|  |    407 | \endisadelimquote
 | 
|  |    408 | %
 | 
|  |    409 | \isatagquote
 | 
|  |    410 | \isacommand{code{\isacharunderscore}reserved}\isamarkupfalse%
 | 
|  |    411 | \ {\isachardoublequoteopen}{\isasymSML}{\isachardoublequoteclose}\ bool\ true\ false\ andalso%
 | 
|  |    412 | \endisatagquote
 | 
|  |    413 | {\isafoldquote}%
 | 
|  |    414 | %
 | 
|  |    415 | \isadelimquote
 | 
|  |    416 | %
 | 
|  |    417 | \endisadelimquote
 | 
|  |    418 | %
 | 
|  |    419 | \begin{isamarkuptext}%
 | 
|  |    420 | \noindent Next, we try to map HOL pairs to SML pairs, using the
 | 
|  |    421 |   infix ``\verb|*|'' type constructor and parentheses:%
 | 
|  |    422 | \end{isamarkuptext}%
 | 
|  |    423 | \isamarkuptrue%
 | 
|  |    424 | %
 | 
|  |    425 | \isadeliminvisible
 | 
|  |    426 | %
 | 
|  |    427 | \endisadeliminvisible
 | 
|  |    428 | %
 | 
|  |    429 | \isataginvisible
 | 
|  |    430 | %
 | 
|  |    431 | \endisataginvisible
 | 
|  |    432 | {\isafoldinvisible}%
 | 
|  |    433 | %
 | 
|  |    434 | \isadeliminvisible
 | 
|  |    435 | %
 | 
|  |    436 | \endisadeliminvisible
 | 
|  |    437 | %
 | 
|  |    438 | \isadelimquotett
 | 
|  |    439 | %
 | 
|  |    440 | \endisadelimquotett
 | 
|  |    441 | %
 | 
|  |    442 | \isatagquotett
 | 
|  |    443 | \isacommand{code{\isacharunderscore}type}\isamarkupfalse%
 | 
|  |    444 | \ {\isacharasterisk}\isanewline
 | 
|  |    445 | \ \ {\isacharparenleft}SML\ \isakeyword{infix}\ {\isadigit{2}}\ {\isachardoublequoteopen}{\isacharasterisk}{\isachardoublequoteclose}{\isacharparenright}\isanewline
 | 
|  |    446 | \isacommand{code{\isacharunderscore}const}\isamarkupfalse%
 | 
|  |    447 | \ Pair\isanewline
 | 
|  |    448 | \ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}{\isacharbang}{\isacharparenleft}{\isacharparenleft}{\isacharunderscore}{\isacharparenright}{\isacharcomma}{\isacharslash}\ {\isacharparenleft}{\isacharunderscore}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}%
 | 
|  |    449 | \endisatagquotett
 | 
|  |    450 | {\isafoldquotett}%
 | 
|  |    451 | %
 | 
|  |    452 | \isadelimquotett
 | 
|  |    453 | %
 | 
|  |    454 | \endisadelimquotett
 | 
|  |    455 | %
 | 
|  |    456 | \begin{isamarkuptext}%
 | 
|  |    457 | \noindent The initial bang ``\verb|!|'' tells the serialiser
 | 
|  |    458 |   never to put
 | 
|  |    459 |   parentheses around the whole expression (they are already present),
 | 
|  |    460 |   while the parentheses around argument place holders
 | 
|  |    461 |   tell not to put parentheses around the arguments.
 | 
|  |    462 |   The slash ``\verb|/|'' (followed by arbitrary white space)
 | 
|  |    463 |   inserts a space which may be used as a break if necessary
 | 
|  |    464 |   during pretty printing.
 | 
|  |    465 | 
 | 
|  |    466 |   These examples give a glimpse what mechanisms
 | 
|  |    467 |   custom serialisations provide; however their usage
 | 
|  |    468 |   requires careful thinking in order not to introduce
 | 
|  |    469 |   inconsistencies -- or, in other words:
 | 
|  |    470 |   custom serialisations are completely axiomatic.
 | 
|  |    471 | 
 | 
|  |    472 |   A further noteworthy details is that any special
 | 
|  |    473 |   character in a custom serialisation may be quoted
 | 
|  |    474 |   using ``\verb|'|''; thus, in
 | 
|  |    475 |   ``\verb|fn '_ => _|'' the first
 | 
|  |    476 |   ``\verb|_|'' is a proper underscore while the
 | 
|  |    477 |   second ``\verb|_|'' is a placeholder.%
 | 
|  |    478 | \end{isamarkuptext}%
 | 
|  |    479 | \isamarkuptrue%
 | 
|  |    480 | %
 | 
|  |    481 | \isamarkupsubsection{\isa{Haskell} serialisation%
 | 
|  |    482 | }
 | 
|  |    483 | \isamarkuptrue%
 | 
|  |    484 | %
 | 
|  |    485 | \begin{isamarkuptext}%
 | 
|  |    486 | For convenience, the default
 | 
|  |    487 |   \isa{HOL} setup for \isa{Haskell} maps the \isa{eq} class to
 | 
|  |    488 |   its counterpart in \isa{Haskell}, giving custom serialisations
 | 
|  |    489 |   for the class \isa{eq} (by command \hyperlink{command.code-class}{\mbox{\isa{\isacommand{code{\isacharunderscore}class}}}}) and its operation
 | 
|  |    490 |   \isa{eq{\isacharunderscore}class{\isachardot}eq}%
 | 
|  |    491 | \end{isamarkuptext}%
 | 
|  |    492 | \isamarkuptrue%
 | 
|  |    493 | %
 | 
|  |    494 | \isadelimquotett
 | 
|  |    495 | %
 | 
|  |    496 | \endisadelimquotett
 | 
|  |    497 | %
 | 
|  |    498 | \isatagquotett
 | 
|  |    499 | \isacommand{code{\isacharunderscore}class}\isamarkupfalse%
 | 
|  |    500 | \ eq\isanewline
 | 
|  |    501 | \ \ {\isacharparenleft}Haskell\ {\isachardoublequoteopen}Eq{\isachardoublequoteclose}{\isacharparenright}\isanewline
 | 
|  |    502 | \isanewline
 | 
|  |    503 | \isacommand{code{\isacharunderscore}const}\isamarkupfalse%
 | 
|  |    504 | \ {\isachardoublequoteopen}op\ {\isacharequal}{\isachardoublequoteclose}\isanewline
 | 
|  |    505 | \ \ {\isacharparenleft}Haskell\ \isakeyword{infixl}\ {\isadigit{4}}\ {\isachardoublequoteopen}{\isacharequal}{\isacharequal}{\isachardoublequoteclose}{\isacharparenright}%
 | 
|  |    506 | \endisatagquotett
 | 
|  |    507 | {\isafoldquotett}%
 | 
|  |    508 | %
 | 
|  |    509 | \isadelimquotett
 | 
|  |    510 | %
 | 
|  |    511 | \endisadelimquotett
 | 
|  |    512 | %
 | 
|  |    513 | \begin{isamarkuptext}%
 | 
|  |    514 | \noindent A problem now occurs whenever a type which
 | 
|  |    515 |   is an instance of \isa{eq} in \isa{HOL} is mapped
 | 
|  |    516 |   on a \isa{Haskell}-built-in type which is also an instance
 | 
|  |    517 |   of \isa{Haskell} \isa{Eq}:%
 | 
|  |    518 | \end{isamarkuptext}%
 | 
|  |    519 | \isamarkuptrue%
 | 
|  |    520 | %
 | 
|  |    521 | \isadelimquote
 | 
|  |    522 | %
 | 
|  |    523 | \endisadelimquote
 | 
|  |    524 | %
 | 
|  |    525 | \isatagquote
 | 
|  |    526 | \isacommand{typedecl}\isamarkupfalse%
 | 
|  |    527 | \ bar\isanewline
 | 
|  |    528 | \isanewline
 | 
|  |    529 | \isacommand{instantiation}\isamarkupfalse%
 | 
|  |    530 | \ bar\ {\isacharcolon}{\isacharcolon}\ eq\isanewline
 | 
|  |    531 | \isakeyword{begin}\isanewline
 | 
|  |    532 | \isanewline
 | 
|  |    533 | \isacommand{definition}\isamarkupfalse%
 | 
|  |    534 | \ {\isachardoublequoteopen}eq{\isacharunderscore}class{\isachardot}eq\ {\isacharparenleft}x{\isasymColon}bar{\isacharparenright}\ y\ {\isasymlongleftrightarrow}\ x\ {\isacharequal}\ y{\isachardoublequoteclose}\isanewline
 | 
|  |    535 | \isanewline
 | 
|  |    536 | \isacommand{instance}\isamarkupfalse%
 | 
|  |    537 | \ \isacommand{by}\isamarkupfalse%
 | 
|  |    538 | \ default\ {\isacharparenleft}simp\ add{\isacharcolon}\ eq{\isacharunderscore}bar{\isacharunderscore}def{\isacharparenright}\isanewline
 | 
|  |    539 | \isanewline
 | 
|  |    540 | \isacommand{end}\isamarkupfalse%
 | 
|  |    541 | %
 | 
|  |    542 | \endisatagquote
 | 
|  |    543 | {\isafoldquote}%
 | 
|  |    544 | %
 | 
|  |    545 | \isadelimquote
 | 
|  |    546 | %
 | 
|  |    547 | \endisadelimquote
 | 
|  |    548 | %
 | 
|  |    549 | \isadelimquotett
 | 
|  |    550 | \ %
 | 
|  |    551 | \endisadelimquotett
 | 
|  |    552 | %
 | 
|  |    553 | \isatagquotett
 | 
|  |    554 | \isacommand{code{\isacharunderscore}type}\isamarkupfalse%
 | 
|  |    555 | \ bar\isanewline
 | 
|  |    556 | \ \ {\isacharparenleft}Haskell\ {\isachardoublequoteopen}Integer{\isachardoublequoteclose}{\isacharparenright}%
 | 
|  |    557 | \endisatagquotett
 | 
|  |    558 | {\isafoldquotett}%
 | 
|  |    559 | %
 | 
|  |    560 | \isadelimquotett
 | 
|  |    561 | %
 | 
|  |    562 | \endisadelimquotett
 | 
|  |    563 | %
 | 
|  |    564 | \begin{isamarkuptext}%
 | 
|  |    565 | \noindent The code generator would produce
 | 
|  |    566 |   an additional instance, which of course is rejected by the \isa{Haskell}
 | 
|  |    567 |   compiler.
 | 
|  |    568 |   To suppress this additional instance, use
 | 
|  |    569 |   \isa{code{\isacharunderscore}instance}:%
 | 
|  |    570 | \end{isamarkuptext}%
 | 
|  |    571 | \isamarkuptrue%
 | 
|  |    572 | %
 | 
|  |    573 | \isadelimquotett
 | 
|  |    574 | %
 | 
|  |    575 | \endisadelimquotett
 | 
|  |    576 | %
 | 
|  |    577 | \isatagquotett
 | 
|  |    578 | \isacommand{code{\isacharunderscore}instance}\isamarkupfalse%
 | 
|  |    579 | \ bar\ {\isacharcolon}{\isacharcolon}\ eq\isanewline
 | 
|  |    580 | \ \ {\isacharparenleft}Haskell\ {\isacharminus}{\isacharparenright}%
 | 
|  |    581 | \endisatagquotett
 | 
|  |    582 | {\isafoldquotett}%
 | 
|  |    583 | %
 | 
|  |    584 | \isadelimquotett
 | 
|  |    585 | %
 | 
|  |    586 | \endisadelimquotett
 | 
|  |    587 | %
 | 
|  |    588 | \isamarkupsubsection{Enhancing the target language context \label{sec:include}%
 | 
|  |    589 | }
 | 
|  |    590 | \isamarkuptrue%
 | 
|  |    591 | %
 | 
|  |    592 | \begin{isamarkuptext}%
 | 
|  |    593 | In rare cases it is necessary to \emph{enrich} the context of a
 | 
|  |    594 |   target language;  this is accomplished using the \hyperlink{command.code-include}{\mbox{\isa{\isacommand{code{\isacharunderscore}include}}}}
 | 
|  |    595 |   command:%
 | 
|  |    596 | \end{isamarkuptext}%
 | 
|  |    597 | \isamarkuptrue%
 | 
|  |    598 | %
 | 
|  |    599 | \isadelimquotett
 | 
|  |    600 | %
 | 
|  |    601 | \endisadelimquotett
 | 
|  |    602 | %
 | 
|  |    603 | \isatagquotett
 | 
|  |    604 | \isacommand{code{\isacharunderscore}include}\isamarkupfalse%
 | 
|  |    605 | \ Haskell\ {\isachardoublequoteopen}Errno{\isachardoublequoteclose}\isanewline
 | 
|  |    606 | {\isacharverbatimopen}errno\ i\ {\isacharequal}\ error\ {\isacharparenleft}{\isachardoublequote}Error\ number{\isacharcolon}\ {\isachardoublequote}\ {\isacharplus}{\isacharplus}\ show\ i{\isacharparenright}{\isacharverbatimclose}\isanewline
 | 
|  |    607 | \isanewline
 | 
|  |    608 | \isacommand{code{\isacharunderscore}reserved}\isamarkupfalse%
 | 
|  |    609 | \ Haskell\ Errno%
 | 
|  |    610 | \endisatagquotett
 | 
|  |    611 | {\isafoldquotett}%
 | 
|  |    612 | %
 | 
|  |    613 | \isadelimquotett
 | 
|  |    614 | %
 | 
|  |    615 | \endisadelimquotett
 | 
|  |    616 | %
 | 
|  |    617 | \begin{isamarkuptext}%
 | 
|  |    618 | \noindent Such named \isa{include}s are then prepended to every generated code.
 | 
|  |    619 |   Inspect such code in order to find out how \hyperlink{command.code-include}{\mbox{\isa{\isacommand{code{\isacharunderscore}include}}}} behaves
 | 
|  |    620 |   with respect to a particular target language.%
 | 
|  |    621 | \end{isamarkuptext}%
 | 
|  |    622 | \isamarkuptrue%
 | 
|  |    623 | %
 | 
|  |    624 | \isadelimtheory
 | 
|  |    625 | %
 | 
|  |    626 | \endisadelimtheory
 | 
|  |    627 | %
 | 
|  |    628 | \isatagtheory
 | 
|  |    629 | \isacommand{end}\isamarkupfalse%
 | 
|  |    630 | %
 | 
|  |    631 | \endisatagtheory
 | 
|  |    632 | {\isafoldtheory}%
 | 
|  |    633 | %
 | 
|  |    634 | \isadelimtheory
 | 
|  |    635 | %
 | 
|  |    636 | \endisadelimtheory
 | 
|  |    637 | \isanewline
 | 
|  |    638 | \end{isabellebody}%
 | 
|  |    639 | %%% Local Variables:
 | 
|  |    640 | %%% mode: latex
 | 
|  |    641 | %%% TeX-master: "root"
 | 
|  |    642 | %%% End:
 |