doc-src/Codegen/Thy/document/ML.tex
author haftmann
Thu, 08 Jul 2010 16:48:33 +0200
changeset 37749 c7e15d59c58d
parent 37610 1b09880d9734
permissions -rw-r--r--
updated documentation
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{ML}%
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
\ {\isachardoublequoteopen}ML{\isachardoublequoteclose}\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{ML system interfaces \label{sec:ml}%
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
Since the code generator framework not only aims to provide
haftmann
parents:
diff changeset
    27
  a nice Isar interface but also to form a base for
haftmann
parents:
diff changeset
    28
  code-generation-based applications, here a short
haftmann
parents:
diff changeset
    29
  description of the most important ML interfaces.%
haftmann
parents:
diff changeset
    30
\end{isamarkuptext}%
haftmann
parents:
diff changeset
    31
\isamarkuptrue%
haftmann
parents:
diff changeset
    32
%
haftmann
parents:
diff changeset
    33
\isamarkupsubsection{Executable theory content: \isa{Code}%
haftmann
parents:
diff changeset
    34
}
haftmann
parents:
diff changeset
    35
\isamarkuptrue%
haftmann
parents:
diff changeset
    36
%
haftmann
parents:
diff changeset
    37
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
    38
This Pure module implements the core notions of
haftmann
parents:
diff changeset
    39
  executable content of a theory.%
haftmann
parents:
diff changeset
    40
\end{isamarkuptext}%
haftmann
parents:
diff changeset
    41
\isamarkuptrue%
haftmann
parents:
diff changeset
    42
%
haftmann
parents:
diff changeset
    43
\isamarkupsubsubsection{Managing executable content%
haftmann
parents:
diff changeset
    44
}
haftmann
parents:
diff changeset
    45
\isamarkuptrue%
haftmann
parents:
diff changeset
    46
%
haftmann
parents:
diff changeset
    47
\isadelimmlref
haftmann
parents:
diff changeset
    48
%
haftmann
parents:
diff changeset
    49
\endisadelimmlref
haftmann
parents:
diff changeset
    50
%
haftmann
parents:
diff changeset
    51
\isatagmlref
haftmann
parents:
diff changeset
    52
%
haftmann
parents:
diff changeset
    53
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
    54
\begin{mldecls}
30121
5c7bcb296600 updated generated files;
wenzelm
parents: 29560
diff changeset
    55
  \indexdef{}{ML}{Code.add\_eqn}\verb|Code.add_eqn: thm -> theory -> theory| \\
5c7bcb296600 updated generated files;
wenzelm
parents: 29560
diff changeset
    56
  \indexdef{}{ML}{Code.del\_eqn}\verb|Code.del_eqn: thm -> theory -> theory| \\
31150
03a87478b89e updated generated document
haftmann
parents: 30226
diff changeset
    57
  \indexdef{}{ML}{Code\_Preproc.map\_pre}\verb|Code_Preproc.map_pre: (simpset -> simpset) -> theory -> theory| \\
03a87478b89e updated generated document
haftmann
parents: 30226
diff changeset
    58
  \indexdef{}{ML}{Code\_Preproc.map\_post}\verb|Code_Preproc.map_post: (simpset -> simpset) -> theory -> theory| \\
03a87478b89e updated generated document
haftmann
parents: 30226
diff changeset
    59
  \indexdef{}{ML}{Code\_Preproc.add\_functrans}\verb|Code_Preproc.add_functrans: string * (theory -> (thm * bool) list -> (thm * bool) list option)|\isasep\isanewline%
28447
haftmann
parents:
diff changeset
    60
\verb|    -> theory -> theory| \\
31150
03a87478b89e updated generated document
haftmann
parents: 30226
diff changeset
    61
  \indexdef{}{ML}{Code\_Preproc.del\_functrans}\verb|Code_Preproc.del_functrans: string -> theory -> theory| \\
30121
5c7bcb296600 updated generated files;
wenzelm
parents: 29560
diff changeset
    62
  \indexdef{}{ML}{Code.add\_datatype}\verb|Code.add_datatype: (string * typ) list -> theory -> theory| \\
37212
b8e02ce2559f updated generated files
haftmann
parents: 33707
diff changeset
    63
  \indexdef{}{ML}{Code.get\_type}\verb|Code.get_type: theory -> string|\isasep\isanewline%
37610
1b09880d9734 updated generated document
haftmann
parents: 37212
diff changeset
    64
\verb|    -> (string * sort) list * ((string * string list) * typ list) list| \\
37212
b8e02ce2559f updated generated files
haftmann
parents: 33707
diff changeset
    65
  \indexdef{}{ML}{Code.get\_type\_of\_constr\_or\_abstr}\verb|Code.get_type_of_constr_or_abstr: theory -> string -> (string * bool) option|
28447
haftmann
parents:
diff changeset
    66
  \end{mldecls}
haftmann
parents:
diff changeset
    67
haftmann
parents:
diff changeset
    68
  \begin{description}
haftmann
parents:
diff changeset
    69
haftmann
parents:
diff changeset
    70
  \item \verb|Code.add_eqn|~\isa{thm}~\isa{thy} adds function
haftmann
parents:
diff changeset
    71
     theorem \isa{thm} to executable content.
haftmann
parents:
diff changeset
    72
haftmann
parents:
diff changeset
    73
  \item \verb|Code.del_eqn|~\isa{thm}~\isa{thy} removes function
haftmann
parents:
diff changeset
    74
     theorem \isa{thm} from executable content, if present.
haftmann
parents:
diff changeset
    75
31150
03a87478b89e updated generated document
haftmann
parents: 30226
diff changeset
    76
  \item \verb|Code_Preproc.map_pre|~\isa{f}~\isa{thy} changes
28447
haftmann
parents:
diff changeset
    77
     the preprocessor simpset.
haftmann
parents:
diff changeset
    78
31150
03a87478b89e updated generated document
haftmann
parents: 30226
diff changeset
    79
  \item \verb|Code_Preproc.add_functrans|~\isa{{\isacharparenleft}name{\isacharcomma}\ f{\isacharparenright}}~\isa{thy} adds
28447
haftmann
parents:
diff changeset
    80
     function transformer \isa{f} (named \isa{name}) to executable content;
29560
fa6c5d62adf5 "code equation" replaces "defining equation"
haftmann
parents: 29297
diff changeset
    81
     \isa{f} is a transformer of the code equations belonging
28447
haftmann
parents:
diff changeset
    82
     to a certain function definition, depending on the
haftmann
parents:
diff changeset
    83
     current theory context.  Returning \isa{NONE} indicates that no
haftmann
parents:
diff changeset
    84
     transformation took place;  otherwise, the whole process will be iterated
29560
fa6c5d62adf5 "code equation" replaces "defining equation"
haftmann
parents: 29297
diff changeset
    85
     with the new code equations.
28447
haftmann
parents:
diff changeset
    86
31150
03a87478b89e updated generated document
haftmann
parents: 30226
diff changeset
    87
  \item \verb|Code_Preproc.del_functrans|~\isa{name}~\isa{thy} removes
28447
haftmann
parents:
diff changeset
    88
     function transformer named \isa{name} from executable content.
haftmann
parents:
diff changeset
    89
haftmann
parents:
diff changeset
    90
  \item \verb|Code.add_datatype|~\isa{cs}~\isa{thy} adds
haftmann
parents:
diff changeset
    91
     a datatype to executable content, with generation
haftmann
parents:
diff changeset
    92
     set \isa{cs}.
haftmann
parents:
diff changeset
    93
37212
b8e02ce2559f updated generated files
haftmann
parents: 33707
diff changeset
    94
  \item \verb|Code.get_type_of_constr_or_abstr|~\isa{thy}~\isa{const}
28447
haftmann
parents:
diff changeset
    95
     returns type constructor corresponding to
haftmann
parents:
diff changeset
    96
     constructor \isa{const}; returns \isa{NONE}
haftmann
parents:
diff changeset
    97
     if \isa{const} is no constructor.
haftmann
parents:
diff changeset
    98
haftmann
parents:
diff changeset
    99
  \end{description}%
haftmann
parents:
diff changeset
   100
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   101
\isamarkuptrue%
haftmann
parents:
diff changeset
   102
%
haftmann
parents:
diff changeset
   103
\endisatagmlref
haftmann
parents:
diff changeset
   104
{\isafoldmlref}%
haftmann
parents:
diff changeset
   105
%
haftmann
parents:
diff changeset
   106
\isadelimmlref
haftmann
parents:
diff changeset
   107
%
haftmann
parents:
diff changeset
   108
\endisadelimmlref
haftmann
parents:
diff changeset
   109
%
haftmann
parents:
diff changeset
   110
\isamarkupsubsection{Auxiliary%
haftmann
parents:
diff changeset
   111
}
haftmann
parents:
diff changeset
   112
\isamarkuptrue%
haftmann
parents:
diff changeset
   113
%
haftmann
parents:
diff changeset
   114
\isadelimmlref
haftmann
parents:
diff changeset
   115
%
haftmann
parents:
diff changeset
   116
\endisadelimmlref
haftmann
parents:
diff changeset
   117
%
haftmann
parents:
diff changeset
   118
\isatagmlref
haftmann
parents:
diff changeset
   119
%
haftmann
parents:
diff changeset
   120
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   121
\begin{mldecls}
32000
6f07563dc8a9 updated to changes in sources; tuned
haftmann
parents: 31206
diff changeset
   122
  \indexdef{}{ML}{Code.read\_const}\verb|Code.read_const: theory -> string -> string|
28447
haftmann
parents:
diff changeset
   123
  \end{mldecls}
haftmann
parents:
diff changeset
   124
haftmann
parents:
diff changeset
   125
  \begin{description}
haftmann
parents:
diff changeset
   126
31156
90fed3d4430f merged module code_unit.ML into code.ML
haftmann
parents: 31150
diff changeset
   127
  \item \verb|Code.read_const|~\isa{thy}~\isa{s}
28447
haftmann
parents:
diff changeset
   128
     reads a constant as a concrete term expression \isa{s}.
haftmann
parents:
diff changeset
   129
haftmann
parents:
diff changeset
   130
  \end{description}%
haftmann
parents:
diff changeset
   131
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   132
\isamarkuptrue%
haftmann
parents:
diff changeset
   133
%
haftmann
parents:
diff changeset
   134
\endisatagmlref
haftmann
parents:
diff changeset
   135
{\isafoldmlref}%
haftmann
parents:
diff changeset
   136
%
haftmann
parents:
diff changeset
   137
\isadelimmlref
haftmann
parents:
diff changeset
   138
%
haftmann
parents:
diff changeset
   139
\endisadelimmlref
haftmann
parents:
diff changeset
   140
%
haftmann
parents:
diff changeset
   141
\isamarkupsubsection{Implementing code generator applications%
haftmann
parents:
diff changeset
   142
}
haftmann
parents:
diff changeset
   143
\isamarkuptrue%
haftmann
parents:
diff changeset
   144
%
haftmann
parents:
diff changeset
   145
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   146
Implementing code generator applications on top
haftmann
parents:
diff changeset
   147
  of the framework set out so far usually not only
haftmann
parents:
diff changeset
   148
  involves using those primitive interfaces
haftmann
parents:
diff changeset
   149
  but also storing code-dependent data and various
haftmann
parents:
diff changeset
   150
  other things.%
haftmann
parents:
diff changeset
   151
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   152
\isamarkuptrue%
haftmann
parents:
diff changeset
   153
%
haftmann
parents:
diff changeset
   154
\isamarkupsubsubsection{Data depending on the theory's executable content%
haftmann
parents:
diff changeset
   155
}
haftmann
parents:
diff changeset
   156
\isamarkuptrue%
haftmann
parents:
diff changeset
   157
%
haftmann
parents:
diff changeset
   158
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   159
Due to incrementality of code generation, changes in the
haftmann
parents:
diff changeset
   160
  theory's executable content have to be propagated in a
haftmann
parents:
diff changeset
   161
  certain fashion.  Additionally, such changes may occur
haftmann
parents:
diff changeset
   162
  not only during theory extension but also during theory
haftmann
parents:
diff changeset
   163
  merge, which is a little bit nasty from an implementation
haftmann
parents:
diff changeset
   164
  point of view.  The framework provides a solution
haftmann
parents:
diff changeset
   165
  to this technical challenge by providing a functorial
37212
b8e02ce2559f updated generated files
haftmann
parents: 33707
diff changeset
   166
  data slot \verb|Code_Data|; on instantiation
28447
haftmann
parents:
diff changeset
   167
  of this functor, the following types and operations
haftmann
parents:
diff changeset
   168
  are required:
haftmann
parents:
diff changeset
   169
haftmann
parents:
diff changeset
   170
  \medskip
haftmann
parents:
diff changeset
   171
  \begin{tabular}{l}
haftmann
parents:
diff changeset
   172
  \isa{type\ T} \\
haftmann
parents:
diff changeset
   173
  \isa{val\ empty{\isacharcolon}\ T} \\
28635
cc53d2ab0170 filled remaining gaps
haftmann
parents: 28447
diff changeset
   174
  \isa{val\ purge{\isacharcolon}\ theory\ {\isasymrightarrow}\ string\ list\ option\ {\isasymrightarrow}\ T\ {\isasymrightarrow}\ T}
28447
haftmann
parents:
diff changeset
   175
  \end{tabular}
haftmann
parents:
diff changeset
   176
haftmann
parents:
diff changeset
   177
  \begin{description}
haftmann
parents:
diff changeset
   178
haftmann
parents:
diff changeset
   179
  \item \isa{T} the type of data to store.
haftmann
parents:
diff changeset
   180
haftmann
parents:
diff changeset
   181
  \item \isa{empty} initial (empty) data.
haftmann
parents:
diff changeset
   182
haftmann
parents:
diff changeset
   183
  \item \isa{purge}~\isa{thy}~\isa{consts} propagates changes in executable content;
haftmann
parents:
diff changeset
   184
    \isa{consts} indicates the kind
haftmann
parents:
diff changeset
   185
    of change: \verb|NONE| stands for a fundamental change
haftmann
parents:
diff changeset
   186
    which invalidates any existing code, \isa{SOME\ consts}
haftmann
parents:
diff changeset
   187
    hints that executable content for constants \isa{consts}
haftmann
parents:
diff changeset
   188
    has changed.
haftmann
parents:
diff changeset
   189
haftmann
parents:
diff changeset
   190
  \end{description}
haftmann
parents:
diff changeset
   191
37212
b8e02ce2559f updated generated files
haftmann
parents: 33707
diff changeset
   192
  \noindent An instance of \verb|Code_Data| provides the following
28447
haftmann
parents:
diff changeset
   193
  interface:
haftmann
parents:
diff changeset
   194
haftmann
parents:
diff changeset
   195
  \medskip
haftmann
parents:
diff changeset
   196
  \begin{tabular}{l}
haftmann
parents:
diff changeset
   197
  \isa{get{\isacharcolon}\ theory\ {\isasymrightarrow}\ T} \\
haftmann
parents:
diff changeset
   198
  \isa{change{\isacharcolon}\ theory\ {\isasymrightarrow}\ {\isacharparenleft}T\ {\isasymrightarrow}\ T{\isacharparenright}\ {\isasymrightarrow}\ T} \\
haftmann
parents:
diff changeset
   199
  \isa{change{\isacharunderscore}yield{\isacharcolon}\ theory\ {\isasymrightarrow}\ {\isacharparenleft}T\ {\isasymrightarrow}\ {\isacharprime}a\ {\isacharasterisk}\ T{\isacharparenright}\ {\isasymrightarrow}\ {\isacharprime}a\ {\isacharasterisk}\ T}
haftmann
parents:
diff changeset
   200
  \end{tabular}
haftmann
parents:
diff changeset
   201
haftmann
parents:
diff changeset
   202
  \begin{description}
haftmann
parents:
diff changeset
   203
haftmann
parents:
diff changeset
   204
  \item \isa{get} retrieval of the current data.
haftmann
parents:
diff changeset
   205
haftmann
parents:
diff changeset
   206
  \item \isa{change} update of current data (cached!)
haftmann
parents:
diff changeset
   207
    by giving a continuation.
haftmann
parents:
diff changeset
   208
haftmann
parents:
diff changeset
   209
  \item \isa{change{\isacharunderscore}yield} update with side result.
haftmann
parents:
diff changeset
   210
haftmann
parents:
diff changeset
   211
  \end{description}%
haftmann
parents:
diff changeset
   212
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   213
\isamarkuptrue%
haftmann
parents:
diff changeset
   214
%
haftmann
parents:
diff changeset
   215
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   216
\bigskip
haftmann
parents:
diff changeset
   217
haftmann
parents:
diff changeset
   218
  \emph{Happy proving, happy hacking!}%
haftmann
parents:
diff changeset
   219
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   220
\isamarkuptrue%
haftmann
parents:
diff changeset
   221
%
haftmann
parents:
diff changeset
   222
\isadelimtheory
haftmann
parents:
diff changeset
   223
%
haftmann
parents:
diff changeset
   224
\endisadelimtheory
haftmann
parents:
diff changeset
   225
%
haftmann
parents:
diff changeset
   226
\isatagtheory
haftmann
parents:
diff changeset
   227
\isacommand{end}\isamarkupfalse%
haftmann
parents:
diff changeset
   228
%
haftmann
parents:
diff changeset
   229
\endisatagtheory
haftmann
parents:
diff changeset
   230
{\isafoldtheory}%
haftmann
parents:
diff changeset
   231
%
haftmann
parents:
diff changeset
   232
\isadelimtheory
haftmann
parents:
diff changeset
   233
%
haftmann
parents:
diff changeset
   234
\endisadelimtheory
haftmann
parents:
diff changeset
   235
\isanewline
haftmann
parents:
diff changeset
   236
\end{isabellebody}%
haftmann
parents:
diff changeset
   237
%%% Local Variables:
haftmann
parents:
diff changeset
   238
%%% mode: latex
haftmann
parents:
diff changeset
   239
%%% TeX-master: "root"
haftmann
parents:
diff changeset
   240
%%% End: