doc-src/Codegen/Thy/document/Introduction.tex
author haftmann
Tue, 07 Apr 2009 08:52:43 +0200
changeset 30880 257cbe43faa8
parent 30836 1344132160bb
child 30882 d15725e84091
permissions -rw-r--r--
tuned manual
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28447
haftmann
parents:
diff changeset
     1
%
haftmann
parents:
diff changeset
     2
\begin{isabellebody}%
haftmann
parents:
diff changeset
     3
\def\isabellecontext{Introduction}%
haftmann
parents:
diff changeset
     4
%
haftmann
parents:
diff changeset
     5
\isadelimtheory
haftmann
parents:
diff changeset
     6
%
haftmann
parents:
diff changeset
     7
\endisadelimtheory
haftmann
parents:
diff changeset
     8
%
haftmann
parents:
diff changeset
     9
\isatagtheory
haftmann
parents:
diff changeset
    10
\isacommand{theory}\isamarkupfalse%
haftmann
parents:
diff changeset
    11
\ Introduction\isanewline
haftmann
parents:
diff changeset
    12
\isakeyword{imports}\ Setup\isanewline
haftmann
parents:
diff changeset
    13
\isakeyword{begin}%
haftmann
parents:
diff changeset
    14
\endisatagtheory
haftmann
parents:
diff changeset
    15
{\isafoldtheory}%
haftmann
parents:
diff changeset
    16
%
haftmann
parents:
diff changeset
    17
\isadelimtheory
haftmann
parents:
diff changeset
    18
%
haftmann
parents:
diff changeset
    19
\endisadelimtheory
haftmann
parents:
diff changeset
    20
%
haftmann
parents:
diff changeset
    21
\isamarkupsection{Introduction and Overview%
haftmann
parents:
diff changeset
    22
}
haftmann
parents:
diff changeset
    23
\isamarkuptrue%
haftmann
parents:
diff changeset
    24
%
haftmann
parents:
diff changeset
    25
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
    26
This tutorial introduces a generic code generator for the
haftmann
parents:
diff changeset
    27
  \isa{Isabelle} system.
haftmann
parents:
diff changeset
    28
  Generic in the sense that the
haftmann
parents:
diff changeset
    29
  \qn{target language} for which code shall ultimately be
haftmann
parents:
diff changeset
    30
  generated is not fixed but may be an arbitrary state-of-the-art
haftmann
parents:
diff changeset
    31
  functional programming language (currently, the implementation
haftmann
parents:
diff changeset
    32
  supports \isa{SML} \cite{SML}, \isa{OCaml} \cite{OCaml} and \isa{Haskell}
haftmann
parents:
diff changeset
    33
  \cite{haskell-revised-report}).
haftmann
parents:
diff changeset
    34
haftmann
parents:
diff changeset
    35
  Conceptually the code generator framework is part
haftmann
parents:
diff changeset
    36
  of Isabelle's \hyperlink{theory.Pure}{\mbox{\isa{Pure}}} meta logic framework; the logic
haftmann
parents:
diff changeset
    37
  \hyperlink{theory.HOL}{\mbox{\isa{HOL}}} which is an extension of \hyperlink{theory.Pure}{\mbox{\isa{Pure}}}
haftmann
parents:
diff changeset
    38
  already comes with a reasonable framework setup and thus provides
haftmann
parents:
diff changeset
    39
  a good working horse for raising code-generation-driven
haftmann
parents:
diff changeset
    40
  applications.  So, we assume some familiarity and experience
haftmann
parents:
diff changeset
    41
  with the ingredients of the \hyperlink{theory.HOL}{\mbox{\isa{HOL}}} distribution theories.
haftmann
parents:
diff changeset
    42
  (see also \cite{isa-tutorial}).
haftmann
parents:
diff changeset
    43
haftmann
parents:
diff changeset
    44
  The code generator aims to be usable with no further ado
haftmann
parents:
diff changeset
    45
  in most cases while allowing for detailed customisation.
haftmann
parents:
diff changeset
    46
  This manifests in the structure of this tutorial: after a short
haftmann
parents:
diff changeset
    47
  conceptual introduction with an example (\secref{sec:intro}),
haftmann
parents:
diff changeset
    48
  we discuss the generic customisation facilities (\secref{sec:program}).
haftmann
parents:
diff changeset
    49
  A further section (\secref{sec:adaption}) is dedicated to the matter of
haftmann
parents:
diff changeset
    50
  \qn{adaption} to specific target language environments.  After some
haftmann
parents:
diff changeset
    51
  further issues (\secref{sec:further}) we conclude with an overview
haftmann
parents:
diff changeset
    52
  of some ML programming interfaces (\secref{sec:ml}).
haftmann
parents:
diff changeset
    53
haftmann
parents:
diff changeset
    54
  \begin{warn}
haftmann
parents:
diff changeset
    55
    Ultimately, the code generator which this tutorial deals with
haftmann
parents:
diff changeset
    56
    is supposed to replace the existing code generator
haftmann
parents:
diff changeset
    57
    by Stefan Berghofer \cite{Berghofer-Nipkow:2002}.
haftmann
parents:
diff changeset
    58
    So, for the moment, there are two distinct code generators
haftmann
parents:
diff changeset
    59
    in Isabelle.  In case of ambiguity, we will refer to the framework
haftmann
parents:
diff changeset
    60
    described here as \isa{generic\ code\ generator}, to the
haftmann
parents:
diff changeset
    61
    other as \isa{SML\ code\ generator}.
haftmann
parents:
diff changeset
    62
    Also note that while the framework itself is
haftmann
parents:
diff changeset
    63
    object-logic independent, only \hyperlink{theory.HOL}{\mbox{\isa{HOL}}} provides a reasonable
haftmann
parents:
diff changeset
    64
    framework setup.    
haftmann
parents:
diff changeset
    65
  \end{warn}%
haftmann
parents:
diff changeset
    66
\end{isamarkuptext}%
haftmann
parents:
diff changeset
    67
\isamarkuptrue%
haftmann
parents:
diff changeset
    68
%
haftmann
parents:
diff changeset
    69
\isamarkupsubsection{Code generation via shallow embedding \label{sec:intro}%
haftmann
parents:
diff changeset
    70
}
haftmann
parents:
diff changeset
    71
\isamarkuptrue%
haftmann
parents:
diff changeset
    72
%
haftmann
parents:
diff changeset
    73
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
    74
The key concept for understanding \isa{Isabelle}'s code generation is
haftmann
parents:
diff changeset
    75
  \emph{shallow embedding}, i.e.~logical entities like constants, types and
haftmann
parents:
diff changeset
    76
  classes are identified with corresponding concepts in the target language.
haftmann
parents:
diff changeset
    77
haftmann
parents:
diff changeset
    78
  Inside \hyperlink{theory.HOL}{\mbox{\isa{HOL}}}, the \hyperlink{command.datatype}{\mbox{\isa{\isacommand{datatype}}}} and
haftmann
parents:
diff changeset
    79
  \hyperlink{command.definition}{\mbox{\isa{\isacommand{definition}}}}/\hyperlink{command.primrec}{\mbox{\isa{\isacommand{primrec}}}}/\hyperlink{command.fun}{\mbox{\isa{\isacommand{fun}}}} declarations form
haftmann
parents:
diff changeset
    80
  the core of a functional programming language.  The default code generator setup
haftmann
parents:
diff changeset
    81
  allows to turn those into functional programs immediately.
haftmann
parents:
diff changeset
    82
  This means that \qt{naive} code generation can proceed without further ado.
haftmann
parents:
diff changeset
    83
  For example, here a simple \qt{implementation} of amortised queues:%
haftmann
parents:
diff changeset
    84
\end{isamarkuptext}%
haftmann
parents:
diff changeset
    85
\isamarkuptrue%
haftmann
parents:
diff changeset
    86
%
28564
haftmann
parents: 28447
diff changeset
    87
\isadelimquote
28447
haftmann
parents:
diff changeset
    88
%
28564
haftmann
parents: 28447
diff changeset
    89
\endisadelimquote
28447
haftmann
parents:
diff changeset
    90
%
28564
haftmann
parents: 28447
diff changeset
    91
\isatagquote
28447
haftmann
parents:
diff changeset
    92
\isacommand{datatype}\isamarkupfalse%
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
    93
\ {\isacharprime}a\ queue\ {\isacharequal}\ AQueue\ {\isachardoublequoteopen}{\isacharprime}a\ list{\isachardoublequoteclose}\ {\isachardoublequoteopen}{\isacharprime}a\ list{\isachardoublequoteclose}\isanewline
28447
haftmann
parents:
diff changeset
    94
\isanewline
haftmann
parents:
diff changeset
    95
\isacommand{definition}\isamarkupfalse%
haftmann
parents:
diff changeset
    96
\ empty\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ queue{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
    97
\ \ {\isachardoublequoteopen}empty\ {\isacharequal}\ AQueue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbrackleft}{\isacharbrackright}{\isachardoublequoteclose}\isanewline
28447
haftmann
parents:
diff changeset
    98
\isanewline
haftmann
parents:
diff changeset
    99
\isacommand{primrec}\isamarkupfalse%
haftmann
parents:
diff changeset
   100
\ enqueue\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a\ queue\ {\isasymRightarrow}\ {\isacharprime}a\ queue{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   101
\ \ {\isachardoublequoteopen}enqueue\ x\ {\isacharparenleft}AQueue\ xs\ ys{\isacharparenright}\ {\isacharequal}\ AQueue\ {\isacharparenleft}x\ {\isacharhash}\ xs{\isacharparenright}\ ys{\isachardoublequoteclose}\isanewline
28447
haftmann
parents:
diff changeset
   102
\isanewline
haftmann
parents:
diff changeset
   103
\isacommand{fun}\isamarkupfalse%
haftmann
parents:
diff changeset
   104
\ dequeue\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ queue\ {\isasymRightarrow}\ {\isacharprime}a\ option\ {\isasymtimes}\ {\isacharprime}a\ queue{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   105
\ \ \ \ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}AQueue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}None{\isacharcomma}\ AQueue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   106
\ \ {\isacharbar}\ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}AQueue\ xs\ {\isacharparenleft}y\ {\isacharhash}\ ys{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}Some\ y{\isacharcomma}\ AQueue\ xs\ ys{\isacharparenright}{\isachardoublequoteclose}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   107
\ \ {\isacharbar}\ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}AQueue\ xs\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\isanewline
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   108
\ \ \ \ \ \ {\isacharparenleft}case\ rev\ xs\ of\ y\ {\isacharhash}\ ys\ {\isasymRightarrow}\ {\isacharparenleft}Some\ y{\isacharcomma}\ AQueue\ {\isacharbrackleft}{\isacharbrackright}\ ys{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}%
28564
haftmann
parents: 28447
diff changeset
   109
\endisatagquote
haftmann
parents: 28447
diff changeset
   110
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   111
%
28564
haftmann
parents: 28447
diff changeset
   112
\isadelimquote
28447
haftmann
parents:
diff changeset
   113
%
28564
haftmann
parents: 28447
diff changeset
   114
\endisadelimquote
28447
haftmann
parents:
diff changeset
   115
%
haftmann
parents:
diff changeset
   116
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   117
\noindent Then we can generate code e.g.~for \isa{SML} as follows:%
haftmann
parents:
diff changeset
   118
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   119
\isamarkuptrue%
haftmann
parents:
diff changeset
   120
%
28564
haftmann
parents: 28447
diff changeset
   121
\isadelimquote
28447
haftmann
parents:
diff changeset
   122
%
28564
haftmann
parents: 28447
diff changeset
   123
\endisadelimquote
28447
haftmann
parents:
diff changeset
   124
%
28564
haftmann
parents: 28447
diff changeset
   125
\isatagquote
28447
haftmann
parents:
diff changeset
   126
\isacommand{export{\isacharunderscore}code}\isamarkupfalse%
haftmann
parents:
diff changeset
   127
\ empty\ dequeue\ enqueue\ \isakeyword{in}\ SML\isanewline
haftmann
parents:
diff changeset
   128
\ \ \isakeyword{module{\isacharunderscore}name}\ Example\ \isakeyword{file}\ {\isachardoublequoteopen}examples{\isacharslash}example{\isachardot}ML{\isachardoublequoteclose}%
28564
haftmann
parents: 28447
diff changeset
   129
\endisatagquote
haftmann
parents: 28447
diff changeset
   130
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   131
%
28564
haftmann
parents: 28447
diff changeset
   132
\isadelimquote
28447
haftmann
parents:
diff changeset
   133
%
28564
haftmann
parents: 28447
diff changeset
   134
\endisadelimquote
28447
haftmann
parents:
diff changeset
   135
%
haftmann
parents:
diff changeset
   136
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   137
\noindent resulting in the following code:%
haftmann
parents:
diff changeset
   138
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   139
\isamarkuptrue%
haftmann
parents:
diff changeset
   140
%
28564
haftmann
parents: 28447
diff changeset
   141
\isadelimquote
28447
haftmann
parents:
diff changeset
   142
%
28564
haftmann
parents: 28447
diff changeset
   143
\endisadelimquote
28447
haftmann
parents:
diff changeset
   144
%
28564
haftmann
parents: 28447
diff changeset
   145
\isatagquote
28447
haftmann
parents:
diff changeset
   146
%
haftmann
parents:
diff changeset
   147
\begin{isamarkuptext}%
28727
185110a4b97a clarified verbatim vs. typewriter
haftmann
parents: 28714
diff changeset
   148
\isatypewriter%
28447
haftmann
parents:
diff changeset
   149
\noindent%
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   150
\hspace*{0pt}structure Example = \\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   151
\hspace*{0pt}struct\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   152
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   153
\hspace*{0pt}fun foldl f a [] = a\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   154
\hspace*{0pt} ~| foldl f a (x ::~xs) = foldl f (f a x) xs;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   155
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   156
\hspace*{0pt}fun rev xs = foldl (fn xsa => fn x => x ::~xsa) [] xs;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   157
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   158
\hspace*{0pt}fun list{\char95}case f1 f2 (a ::~lista) = f2 a lista\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   159
\hspace*{0pt} ~| list{\char95}case f1 f2 [] = f1;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   160
\hspace*{0pt}\\
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   161
\hspace*{0pt}datatype 'a queue = AQueue of 'a list * 'a list;\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   162
\hspace*{0pt}\\
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   163
\hspace*{0pt}val empty :~'a queue = AQueue ([],~[])\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   164
\hspace*{0pt}\\
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   165
\hspace*{0pt}fun dequeue (AQueue ([],~[])) = (NONE,~AQueue ([],~[]))\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   166
\hspace*{0pt} ~| dequeue (AQueue (xs,~y ::~ys)) = (SOME y,~AQueue (xs,~ys))\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   167
\hspace*{0pt} ~| dequeue (AQueue (v ::~va,~[])) =\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   168
\hspace*{0pt} ~~~let\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   169
\hspace*{0pt} ~~~~~val y ::~ys = rev (v ::~va);\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   170
\hspace*{0pt} ~~~in\\
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   171
\hspace*{0pt} ~~~~~(SOME y,~AQueue ([],~ys))\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   172
\hspace*{0pt} ~~~end;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   173
\hspace*{0pt}\\
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   174
\hspace*{0pt}fun enqueue x (AQueue (xs,~ys)) = AQueue (x ::~xs,~ys);\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   175
\hspace*{0pt}\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
   176
\hspace*{0pt}end;~(*struct Example*)%
28447
haftmann
parents:
diff changeset
   177
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   178
\isamarkuptrue%
haftmann
parents:
diff changeset
   179
%
28564
haftmann
parents: 28447
diff changeset
   180
\endisatagquote
haftmann
parents: 28447
diff changeset
   181
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   182
%
28564
haftmann
parents: 28447
diff changeset
   183
\isadelimquote
28447
haftmann
parents:
diff changeset
   184
%
28564
haftmann
parents: 28447
diff changeset
   185
\endisadelimquote
28447
haftmann
parents:
diff changeset
   186
%
haftmann
parents:
diff changeset
   187
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   188
\noindent The \hyperlink{command.export-code}{\mbox{\isa{\isacommand{export{\isacharunderscore}code}}}} command takes a space-separated list of
haftmann
parents:
diff changeset
   189
  constants for which code shall be generated;  anything else needed for those
haftmann
parents:
diff changeset
   190
  is added implicitly.  Then follows a target language identifier
haftmann
parents:
diff changeset
   191
  (\isa{SML}, \isa{OCaml} or \isa{Haskell}) and a freely chosen module name.
haftmann
parents:
diff changeset
   192
  A file name denotes the destination to store the generated code.  Note that
haftmann
parents:
diff changeset
   193
  the semantics of the destination depends on the target language:  for
haftmann
parents:
diff changeset
   194
  \isa{SML} and \isa{OCaml} it denotes a \emph{file}, for \isa{Haskell}
haftmann
parents:
diff changeset
   195
  it denotes a \emph{directory} where a file named as the module name
haftmann
parents:
diff changeset
   196
  (with extension \isa{{\isachardot}hs}) is written:%
haftmann
parents:
diff changeset
   197
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   198
\isamarkuptrue%
haftmann
parents:
diff changeset
   199
%
28564
haftmann
parents: 28447
diff changeset
   200
\isadelimquote
28447
haftmann
parents:
diff changeset
   201
%
28564
haftmann
parents: 28447
diff changeset
   202
\endisadelimquote
28447
haftmann
parents:
diff changeset
   203
%
28564
haftmann
parents: 28447
diff changeset
   204
\isatagquote
28447
haftmann
parents:
diff changeset
   205
\isacommand{export{\isacharunderscore}code}\isamarkupfalse%
haftmann
parents:
diff changeset
   206
\ empty\ dequeue\ enqueue\ \isakeyword{in}\ Haskell\isanewline
haftmann
parents:
diff changeset
   207
\ \ \isakeyword{module{\isacharunderscore}name}\ Example\ \isakeyword{file}\ {\isachardoublequoteopen}examples{\isacharslash}{\isachardoublequoteclose}%
28564
haftmann
parents: 28447
diff changeset
   208
\endisatagquote
haftmann
parents: 28447
diff changeset
   209
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   210
%
28564
haftmann
parents: 28447
diff changeset
   211
\isadelimquote
28447
haftmann
parents:
diff changeset
   212
%
28564
haftmann
parents: 28447
diff changeset
   213
\endisadelimquote
28447
haftmann
parents:
diff changeset
   214
%
haftmann
parents:
diff changeset
   215
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   216
\noindent This is how the corresponding code in \isa{Haskell} looks like:%
haftmann
parents:
diff changeset
   217
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   218
\isamarkuptrue%
haftmann
parents:
diff changeset
   219
%
28564
haftmann
parents: 28447
diff changeset
   220
\isadelimquote
28447
haftmann
parents:
diff changeset
   221
%
28564
haftmann
parents: 28447
diff changeset
   222
\endisadelimquote
28447
haftmann
parents:
diff changeset
   223
%
28564
haftmann
parents: 28447
diff changeset
   224
\isatagquote
28447
haftmann
parents:
diff changeset
   225
%
haftmann
parents:
diff changeset
   226
\begin{isamarkuptext}%
28727
185110a4b97a clarified verbatim vs. typewriter
haftmann
parents: 28714
diff changeset
   227
\isatypewriter%
28447
haftmann
parents:
diff changeset
   228
\noindent%
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   229
\hspace*{0pt}module Example where {\char123}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   230
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   231
\hspace*{0pt}\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
   232
\hspace*{0pt}foldla ::~forall a b.~(a -> b -> a) -> a -> [b] -> a;\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   233
\hspace*{0pt}foldla f a [] = a;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   234
\hspace*{0pt}foldla f a (x :~xs) = foldla f (f a x) xs;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   235
\hspace*{0pt}\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
   236
\hspace*{0pt}rev ::~forall a.~[a] -> [a];\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   237
\hspace*{0pt}rev xs = foldla ({\char92}~xsa x -> x :~xsa) [] xs;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   238
\hspace*{0pt}\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
   239
\hspace*{0pt}list{\char95}case ::~forall t a.~t -> (a -> [a] -> t) -> [a] -> t;\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   240
\hspace*{0pt}list{\char95}case f1 f2 (a :~list) = f2 a list;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   241
\hspace*{0pt}list{\char95}case f1 f2 [] = f1;\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   242
\hspace*{0pt}\\
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   243
\hspace*{0pt}data Queue a = AQueue [a] [a];\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   244
\hspace*{0pt}\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
   245
\hspace*{0pt}empty ::~forall a.~Queue a;\\
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   246
\hspace*{0pt}empty = AQueue [] [];\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   247
\hspace*{0pt}\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
   248
\hspace*{0pt}dequeue ::~forall a.~Queue a -> (Maybe a,~Queue a);\\
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   249
\hspace*{0pt}dequeue (AQueue [] []) = (Nothing,~AQueue [] []);\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   250
\hspace*{0pt}dequeue (AQueue xs (y :~ys)) = (Just y,~AQueue xs ys);\\
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   251
\hspace*{0pt}dequeue (AQueue (v :~va) []) =\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   252
\hspace*{0pt} ~let {\char123}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   253
\hspace*{0pt} ~~~(y :~ys) = rev (v :~va);\\
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   254
\hspace*{0pt} ~{\char125}~in (Just y,~AQueue [] ys);\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   255
\hspace*{0pt}\\
29297
62e0f892e525 updated generated files;
wenzelm
parents: 28727
diff changeset
   256
\hspace*{0pt}enqueue ::~forall a.~a -> Queue a -> Queue a;\\
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
   257
\hspace*{0pt}enqueue x (AQueue xs ys) = AQueue (x :~xs) ys;\\
28714
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   258
\hspace*{0pt}\\
1992553cccfe improved verbatim mechanism
haftmann
parents: 28636
diff changeset
   259
\hspace*{0pt}{\char125}%
28447
haftmann
parents:
diff changeset
   260
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   261
\isamarkuptrue%
haftmann
parents:
diff changeset
   262
%
28564
haftmann
parents: 28447
diff changeset
   263
\endisatagquote
haftmann
parents: 28447
diff changeset
   264
{\isafoldquote}%
28447
haftmann
parents:
diff changeset
   265
%
28564
haftmann
parents: 28447
diff changeset
   266
\isadelimquote
28447
haftmann
parents:
diff changeset
   267
%
28564
haftmann
parents: 28447
diff changeset
   268
\endisadelimquote
28447
haftmann
parents:
diff changeset
   269
%
haftmann
parents:
diff changeset
   270
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   271
\noindent This demonstrates the basic usage of the \hyperlink{command.export-code}{\mbox{\isa{\isacommand{export{\isacharunderscore}code}}}} command;
haftmann
parents:
diff changeset
   272
  for more details see \secref{sec:further}.%
haftmann
parents:
diff changeset
   273
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   274
\isamarkuptrue%
haftmann
parents:
diff changeset
   275
%
haftmann
parents:
diff changeset
   276
\isamarkupsubsection{Code generator architecture \label{sec:concept}%
haftmann
parents:
diff changeset
   277
}
haftmann
parents:
diff changeset
   278
\isamarkuptrue%
haftmann
parents:
diff changeset
   279
%
haftmann
parents:
diff changeset
   280
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   281
What you have seen so far should be already enough in a lot of cases.  If you
haftmann
parents:
diff changeset
   282
  are content with this, you can quit reading here.  Anyway, in order to customise
haftmann
parents:
diff changeset
   283
  and adapt the code generator, it is inevitable to gain some understanding
haftmann
parents:
diff changeset
   284
  how it works.
haftmann
parents:
diff changeset
   285
haftmann
parents:
diff changeset
   286
  \begin{figure}[h]
30836
1344132160bb proper external tikz pictures
haftmann
parents: 30227
diff changeset
   287
    \includegraphics{Thy/pictures/architecture}
28447
haftmann
parents:
diff changeset
   288
    \caption{Code generator architecture}
haftmann
parents:
diff changeset
   289
    \label{fig:arch}
haftmann
parents:
diff changeset
   290
  \end{figure}
haftmann
parents:
diff changeset
   291
haftmann
parents:
diff changeset
   292
  The code generator employs a notion of executability
haftmann
parents:
diff changeset
   293
  for three foundational executable ingredients known
haftmann
parents:
diff changeset
   294
  from functional programming:
29560
fa6c5d62adf5 "code equation" replaces "defining equation"
haftmann
parents: 29297
diff changeset
   295
  \emph{code equations}, \emph{datatypes}, and
fa6c5d62adf5 "code equation" replaces "defining equation"
haftmann
parents: 29297
diff changeset
   296
  \emph{type classes}.  A code equation as a first approximation
28447
haftmann
parents:
diff changeset
   297
  is a theorem of the form \isa{f\ t\isactrlisub {\isadigit{1}}\ t\isactrlisub {\isadigit{2}}\ {\isasymdots}\ t\isactrlisub n\ {\isasymequiv}\ t}
haftmann
parents:
diff changeset
   298
  (an equation headed by a constant \isa{f} with arguments
haftmann
parents:
diff changeset
   299
  \isa{t\isactrlisub {\isadigit{1}}\ t\isactrlisub {\isadigit{2}}\ {\isasymdots}\ t\isactrlisub n} and right hand side \isa{t}).
29560
fa6c5d62adf5 "code equation" replaces "defining equation"
haftmann
parents: 29297
diff changeset
   300
  Code generation aims to turn code equations
28447
haftmann
parents:
diff changeset
   301
  into a functional program.  This is achieved by three major
haftmann
parents:
diff changeset
   302
  components which operate sequentially, i.e. the result of one is
haftmann
parents:
diff changeset
   303
  the input
30880
257cbe43faa8 tuned manual
haftmann
parents: 30836
diff changeset
   304
  of the next in the chain,  see figure \ref{fig:arch}:
28447
haftmann
parents:
diff changeset
   305
haftmann
parents:
diff changeset
   306
  \begin{itemize}
haftmann
parents:
diff changeset
   307
30836
1344132160bb proper external tikz pictures
haftmann
parents: 30227
diff changeset
   308
    \item Starting point is a collection of raw code equations in a
1344132160bb proper external tikz pictures
haftmann
parents: 30227
diff changeset
   309
      theory; due to proof irrelevance it is not relevant where they
1344132160bb proper external tikz pictures
haftmann
parents: 30227
diff changeset
   310
      stem from but typically they are either descendant of specification
1344132160bb proper external tikz pictures
haftmann
parents: 30227
diff changeset
   311
      tools or explicit proofs by the user.
1344132160bb proper external tikz pictures
haftmann
parents: 30227
diff changeset
   312
      
1344132160bb proper external tikz pictures
haftmann
parents: 30227
diff changeset
   313
    \item Before these raw code equations are continued
1344132160bb proper external tikz pictures
haftmann
parents: 30227
diff changeset
   314
      with, they can be subjected to theorem transformations.  This
1344132160bb proper external tikz pictures
haftmann
parents: 30227
diff changeset
   315
      \qn{preprocessor} is an interface which allows to apply the full
1344132160bb proper external tikz pictures
haftmann
parents: 30227
diff changeset
   316
      expressiveness of ML-based theorem transformations to code
1344132160bb proper external tikz pictures
haftmann
parents: 30227
diff changeset
   317
      generation.  The result of the preprocessing step is a
1344132160bb proper external tikz pictures
haftmann
parents: 30227
diff changeset
   318
      structured collection of code equations.
28447
haftmann
parents:
diff changeset
   319
30836
1344132160bb proper external tikz pictures
haftmann
parents: 30227
diff changeset
   320
    \item These code equations are \qn{translated} to a program in an
1344132160bb proper external tikz pictures
haftmann
parents: 30227
diff changeset
   321
      abstract intermediate language.  Think of it as a kind
28447
haftmann
parents:
diff changeset
   322
      of \qt{Mini-Haskell} with four \qn{statements}: \isa{data}
29560
fa6c5d62adf5 "code equation" replaces "defining equation"
haftmann
parents: 29297
diff changeset
   323
      (for datatypes), \isa{fun} (stemming from code equations),
28447
haftmann
parents:
diff changeset
   324
      also \isa{class} and \isa{inst} (for type classes).
haftmann
parents:
diff changeset
   325
haftmann
parents:
diff changeset
   326
    \item Finally, the abstract program is \qn{serialised} into concrete
haftmann
parents:
diff changeset
   327
      source code of a target language.
30836
1344132160bb proper external tikz pictures
haftmann
parents: 30227
diff changeset
   328
      This step only produces concrete syntax but does not change the
1344132160bb proper external tikz pictures
haftmann
parents: 30227
diff changeset
   329
      program in essence; all conceptual transformations occur in the
1344132160bb proper external tikz pictures
haftmann
parents: 30227
diff changeset
   330
      translation step.
28447
haftmann
parents:
diff changeset
   331
haftmann
parents:
diff changeset
   332
  \end{itemize}
haftmann
parents:
diff changeset
   333
haftmann
parents:
diff changeset
   334
  \noindent From these steps, only the two last are carried out outside the logic;  by
haftmann
parents:
diff changeset
   335
  keeping this layer as thin as possible, the amount of code to trust is
haftmann
parents:
diff changeset
   336
  kept to a minimum.%
haftmann
parents:
diff changeset
   337
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   338
\isamarkuptrue%
haftmann
parents:
diff changeset
   339
%
haftmann
parents:
diff changeset
   340
\isadelimtheory
haftmann
parents:
diff changeset
   341
%
haftmann
parents:
diff changeset
   342
\endisadelimtheory
haftmann
parents:
diff changeset
   343
%
haftmann
parents:
diff changeset
   344
\isatagtheory
haftmann
parents:
diff changeset
   345
\isacommand{end}\isamarkupfalse%
haftmann
parents:
diff changeset
   346
%
haftmann
parents:
diff changeset
   347
\endisatagtheory
haftmann
parents:
diff changeset
   348
{\isafoldtheory}%
haftmann
parents:
diff changeset
   349
%
haftmann
parents:
diff changeset
   350
\isadelimtheory
haftmann
parents:
diff changeset
   351
%
haftmann
parents:
diff changeset
   352
\endisadelimtheory
haftmann
parents:
diff changeset
   353
\isanewline
haftmann
parents:
diff changeset
   354
\end{isabellebody}%
haftmann
parents:
diff changeset
   355
%%% Local Variables:
haftmann
parents:
diff changeset
   356
%%% mode: latex
haftmann
parents:
diff changeset
   357
%%% TeX-master: "root"
haftmann
parents:
diff changeset
   358
%%% End: