doc-src/IsarAdvanced/Codegen/Thy/document/ML.tex
author haftmann
Fri, 17 Oct 2008 10:14:38 +0200
changeset 28635 cc53d2ab0170
parent 28447 df77ed974a78
child 28680 f1c76cf10915
permissions -rw-r--r--
filled remaining gaps
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}
haftmann
parents:
diff changeset
    55
  \indexml{Code.add\_eqn}\verb|Code.add_eqn: thm -> theory -> theory| \\
haftmann
parents:
diff changeset
    56
  \indexml{Code.del\_eqn}\verb|Code.del_eqn: thm -> theory -> theory| \\
haftmann
parents:
diff changeset
    57
  \indexml{Code.add\_eqnl}\verb|Code.add_eqnl: string * (thm * bool) list Susp.T -> theory -> theory| \\
haftmann
parents:
diff changeset
    58
  \indexml{Code.map\_pre}\verb|Code.map_pre: (MetaSimplifier.simpset -> MetaSimplifier.simpset) -> theory -> theory| \\
haftmann
parents:
diff changeset
    59
  \indexml{Code.map\_post}\verb|Code.map_post: (MetaSimplifier.simpset -> MetaSimplifier.simpset) -> theory -> theory| \\
haftmann
parents:
diff changeset
    60
  \indexml{Code.add\_functrans}\verb|Code.add_functrans: string * (theory -> (thm * bool) list -> (thm * bool) list option)|\isasep\isanewline%
haftmann
parents:
diff changeset
    61
\verb|    -> theory -> theory| \\
haftmann
parents:
diff changeset
    62
  \indexml{Code.del\_functrans}\verb|Code.del_functrans: string -> theory -> theory| \\
haftmann
parents:
diff changeset
    63
  \indexml{Code.add\_datatype}\verb|Code.add_datatype: (string * typ) list -> theory -> theory| \\
haftmann
parents:
diff changeset
    64
  \indexml{Code.get\_datatype}\verb|Code.get_datatype: theory -> string|\isasep\isanewline%
haftmann
parents:
diff changeset
    65
\verb|    -> (string * sort) list * (string * typ list) list| \\
haftmann
parents:
diff changeset
    66
  \indexml{Code.get\_datatype\_of\_constr}\verb|Code.get_datatype_of_constr: theory -> string -> string option|
haftmann
parents:
diff changeset
    67
  \end{mldecls}
haftmann
parents:
diff changeset
    68
haftmann
parents:
diff changeset
    69
  \begin{description}
haftmann
parents:
diff changeset
    70
haftmann
parents:
diff changeset
    71
  \item \verb|Code.add_eqn|~\isa{thm}~\isa{thy} adds function
haftmann
parents:
diff changeset
    72
     theorem \isa{thm} to executable content.
haftmann
parents:
diff changeset
    73
haftmann
parents:
diff changeset
    74
  \item \verb|Code.del_eqn|~\isa{thm}~\isa{thy} removes function
haftmann
parents:
diff changeset
    75
     theorem \isa{thm} from executable content, if present.
haftmann
parents:
diff changeset
    76
haftmann
parents:
diff changeset
    77
  \item \verb|Code.add_eqnl|~\isa{{\isacharparenleft}const{\isacharcomma}\ lthms{\isacharparenright}}~\isa{thy} adds
haftmann
parents:
diff changeset
    78
     suspended defining equations \isa{lthms} for constant
haftmann
parents:
diff changeset
    79
     \isa{const} to executable content.
haftmann
parents:
diff changeset
    80
haftmann
parents:
diff changeset
    81
  \item \verb|Code.map_pre|~\isa{f}~\isa{thy} changes
haftmann
parents:
diff changeset
    82
     the preprocessor simpset.
haftmann
parents:
diff changeset
    83
haftmann
parents:
diff changeset
    84
  \item \verb|Code.add_functrans|~\isa{{\isacharparenleft}name{\isacharcomma}\ f{\isacharparenright}}~\isa{thy} adds
haftmann
parents:
diff changeset
    85
     function transformer \isa{f} (named \isa{name}) to executable content;
haftmann
parents:
diff changeset
    86
     \isa{f} is a transformer of the defining equations belonging
haftmann
parents:
diff changeset
    87
     to a certain function definition, depending on the
haftmann
parents:
diff changeset
    88
     current theory context.  Returning \isa{NONE} indicates that no
haftmann
parents:
diff changeset
    89
     transformation took place;  otherwise, the whole process will be iterated
haftmann
parents:
diff changeset
    90
     with the new defining equations.
haftmann
parents:
diff changeset
    91
haftmann
parents:
diff changeset
    92
  \item \verb|Code.del_functrans|~\isa{name}~\isa{thy} removes
haftmann
parents:
diff changeset
    93
     function transformer named \isa{name} from executable content.
haftmann
parents:
diff changeset
    94
haftmann
parents:
diff changeset
    95
  \item \verb|Code.add_datatype|~\isa{cs}~\isa{thy} adds
haftmann
parents:
diff changeset
    96
     a datatype to executable content, with generation
haftmann
parents:
diff changeset
    97
     set \isa{cs}.
haftmann
parents:
diff changeset
    98
haftmann
parents:
diff changeset
    99
  \item \verb|Code.get_datatype_of_constr|~\isa{thy}~\isa{const}
haftmann
parents:
diff changeset
   100
     returns type constructor corresponding to
haftmann
parents:
diff changeset
   101
     constructor \isa{const}; returns \isa{NONE}
haftmann
parents:
diff changeset
   102
     if \isa{const} is no constructor.
haftmann
parents:
diff changeset
   103
haftmann
parents:
diff changeset
   104
  \end{description}%
haftmann
parents:
diff changeset
   105
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   106
\isamarkuptrue%
haftmann
parents:
diff changeset
   107
%
haftmann
parents:
diff changeset
   108
\endisatagmlref
haftmann
parents:
diff changeset
   109
{\isafoldmlref}%
haftmann
parents:
diff changeset
   110
%
haftmann
parents:
diff changeset
   111
\isadelimmlref
haftmann
parents:
diff changeset
   112
%
haftmann
parents:
diff changeset
   113
\endisadelimmlref
haftmann
parents:
diff changeset
   114
%
haftmann
parents:
diff changeset
   115
\isamarkupsubsection{Auxiliary%
haftmann
parents:
diff changeset
   116
}
haftmann
parents:
diff changeset
   117
\isamarkuptrue%
haftmann
parents:
diff changeset
   118
%
haftmann
parents:
diff changeset
   119
\isadelimmlref
haftmann
parents:
diff changeset
   120
%
haftmann
parents:
diff changeset
   121
\endisadelimmlref
haftmann
parents:
diff changeset
   122
%
haftmann
parents:
diff changeset
   123
\isatagmlref
haftmann
parents:
diff changeset
   124
%
haftmann
parents:
diff changeset
   125
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   126
\begin{mldecls}
haftmann
parents:
diff changeset
   127
  \indexml{Code\_Unit.read\_const}\verb|Code_Unit.read_const: theory -> string -> string| \\
haftmann
parents:
diff changeset
   128
  \indexml{Code\_Unit.head\_eqn}\verb|Code_Unit.head_eqn: theory -> thm -> string * ((string * sort) list * typ)| \\
haftmann
parents:
diff changeset
   129
  \indexml{Code\_Unit.rewrite\_eqn}\verb|Code_Unit.rewrite_eqn: MetaSimplifier.simpset -> thm -> thm| \\
haftmann
parents:
diff changeset
   130
  \end{mldecls}
haftmann
parents:
diff changeset
   131
haftmann
parents:
diff changeset
   132
  \begin{description}
haftmann
parents:
diff changeset
   133
haftmann
parents:
diff changeset
   134
  \item \verb|Code_Unit.read_const|~\isa{thy}~\isa{s}
haftmann
parents:
diff changeset
   135
     reads a constant as a concrete term expression \isa{s}.
haftmann
parents:
diff changeset
   136
haftmann
parents:
diff changeset
   137
  \item \verb|Code_Unit.head_eqn|~\isa{thy}~\isa{thm}
haftmann
parents:
diff changeset
   138
     extracts the constant and its type from a defining equation \isa{thm}.
haftmann
parents:
diff changeset
   139
haftmann
parents:
diff changeset
   140
  \item \verb|Code_Unit.rewrite_eqn|~\isa{ss}~\isa{thm}
haftmann
parents:
diff changeset
   141
     rewrites a defining equation \isa{thm} with a simpset \isa{ss};
haftmann
parents:
diff changeset
   142
     only arguments and right hand side are rewritten,
haftmann
parents:
diff changeset
   143
     not the head of the defining equation.
haftmann
parents:
diff changeset
   144
haftmann
parents:
diff changeset
   145
  \end{description}%
haftmann
parents:
diff changeset
   146
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   147
\isamarkuptrue%
haftmann
parents:
diff changeset
   148
%
haftmann
parents:
diff changeset
   149
\endisatagmlref
haftmann
parents:
diff changeset
   150
{\isafoldmlref}%
haftmann
parents:
diff changeset
   151
%
haftmann
parents:
diff changeset
   152
\isadelimmlref
haftmann
parents:
diff changeset
   153
%
haftmann
parents:
diff changeset
   154
\endisadelimmlref
haftmann
parents:
diff changeset
   155
%
haftmann
parents:
diff changeset
   156
\isamarkupsubsection{Implementing code generator applications%
haftmann
parents:
diff changeset
   157
}
haftmann
parents:
diff changeset
   158
\isamarkuptrue%
haftmann
parents:
diff changeset
   159
%
haftmann
parents:
diff changeset
   160
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   161
Implementing code generator applications on top
haftmann
parents:
diff changeset
   162
  of the framework set out so far usually not only
haftmann
parents:
diff changeset
   163
  involves using those primitive interfaces
haftmann
parents:
diff changeset
   164
  but also storing code-dependent data and various
haftmann
parents:
diff changeset
   165
  other things.%
haftmann
parents:
diff changeset
   166
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   167
\isamarkuptrue%
haftmann
parents:
diff changeset
   168
%
haftmann
parents:
diff changeset
   169
\isamarkupsubsubsection{Data depending on the theory's executable content%
haftmann
parents:
diff changeset
   170
}
haftmann
parents:
diff changeset
   171
\isamarkuptrue%
haftmann
parents:
diff changeset
   172
%
haftmann
parents:
diff changeset
   173
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   174
Due to incrementality of code generation, changes in the
haftmann
parents:
diff changeset
   175
  theory's executable content have to be propagated in a
haftmann
parents:
diff changeset
   176
  certain fashion.  Additionally, such changes may occur
haftmann
parents:
diff changeset
   177
  not only during theory extension but also during theory
haftmann
parents:
diff changeset
   178
  merge, which is a little bit nasty from an implementation
haftmann
parents:
diff changeset
   179
  point of view.  The framework provides a solution
haftmann
parents:
diff changeset
   180
  to this technical challenge by providing a functorial
haftmann
parents:
diff changeset
   181
  data slot \verb|CodeDataFun|; on instantiation
haftmann
parents:
diff changeset
   182
  of this functor, the following types and operations
haftmann
parents:
diff changeset
   183
  are required:
haftmann
parents:
diff changeset
   184
haftmann
parents:
diff changeset
   185
  \medskip
haftmann
parents:
diff changeset
   186
  \begin{tabular}{l}
haftmann
parents:
diff changeset
   187
  \isa{type\ T} \\
haftmann
parents:
diff changeset
   188
  \isa{val\ empty{\isacharcolon}\ T} \\
28635
cc53d2ab0170 filled remaining gaps
haftmann
parents: 28447
diff changeset
   189
  \isa{val\ purge{\isacharcolon}\ theory\ {\isasymrightarrow}\ string\ list\ option\ {\isasymrightarrow}\ T\ {\isasymrightarrow}\ T}
28447
haftmann
parents:
diff changeset
   190
  \end{tabular}
haftmann
parents:
diff changeset
   191
haftmann
parents:
diff changeset
   192
  \begin{description}
haftmann
parents:
diff changeset
   193
haftmann
parents:
diff changeset
   194
  \item \isa{T} the type of data to store.
haftmann
parents:
diff changeset
   195
haftmann
parents:
diff changeset
   196
  \item \isa{empty} initial (empty) data.
haftmann
parents:
diff changeset
   197
haftmann
parents:
diff changeset
   198
  \item \isa{purge}~\isa{thy}~\isa{consts} propagates changes in executable content;
haftmann
parents:
diff changeset
   199
    \isa{consts} indicates the kind
haftmann
parents:
diff changeset
   200
    of change: \verb|NONE| stands for a fundamental change
haftmann
parents:
diff changeset
   201
    which invalidates any existing code, \isa{SOME\ consts}
haftmann
parents:
diff changeset
   202
    hints that executable content for constants \isa{consts}
haftmann
parents:
diff changeset
   203
    has changed.
haftmann
parents:
diff changeset
   204
haftmann
parents:
diff changeset
   205
  \end{description}
haftmann
parents:
diff changeset
   206
haftmann
parents:
diff changeset
   207
  \noindent An instance of \verb|CodeDataFun| provides the following
haftmann
parents:
diff changeset
   208
  interface:
haftmann
parents:
diff changeset
   209
haftmann
parents:
diff changeset
   210
  \medskip
haftmann
parents:
diff changeset
   211
  \begin{tabular}{l}
haftmann
parents:
diff changeset
   212
  \isa{get{\isacharcolon}\ theory\ {\isasymrightarrow}\ T} \\
haftmann
parents:
diff changeset
   213
  \isa{change{\isacharcolon}\ theory\ {\isasymrightarrow}\ {\isacharparenleft}T\ {\isasymrightarrow}\ T{\isacharparenright}\ {\isasymrightarrow}\ T} \\
haftmann
parents:
diff changeset
   214
  \isa{change{\isacharunderscore}yield{\isacharcolon}\ theory\ {\isasymrightarrow}\ {\isacharparenleft}T\ {\isasymrightarrow}\ {\isacharprime}a\ {\isacharasterisk}\ T{\isacharparenright}\ {\isasymrightarrow}\ {\isacharprime}a\ {\isacharasterisk}\ T}
haftmann
parents:
diff changeset
   215
  \end{tabular}
haftmann
parents:
diff changeset
   216
haftmann
parents:
diff changeset
   217
  \begin{description}
haftmann
parents:
diff changeset
   218
haftmann
parents:
diff changeset
   219
  \item \isa{get} retrieval of the current data.
haftmann
parents:
diff changeset
   220
haftmann
parents:
diff changeset
   221
  \item \isa{change} update of current data (cached!)
haftmann
parents:
diff changeset
   222
    by giving a continuation.
haftmann
parents:
diff changeset
   223
haftmann
parents:
diff changeset
   224
  \item \isa{change{\isacharunderscore}yield} update with side result.
haftmann
parents:
diff changeset
   225
haftmann
parents:
diff changeset
   226
  \end{description}%
haftmann
parents:
diff changeset
   227
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   228
\isamarkuptrue%
haftmann
parents:
diff changeset
   229
%
haftmann
parents:
diff changeset
   230
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   231
\bigskip
haftmann
parents:
diff changeset
   232
haftmann
parents:
diff changeset
   233
  \emph{Happy proving, happy hacking!}%
haftmann
parents:
diff changeset
   234
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   235
\isamarkuptrue%
haftmann
parents:
diff changeset
   236
%
haftmann
parents:
diff changeset
   237
\isadelimtheory
haftmann
parents:
diff changeset
   238
%
haftmann
parents:
diff changeset
   239
\endisadelimtheory
haftmann
parents:
diff changeset
   240
%
haftmann
parents:
diff changeset
   241
\isatagtheory
haftmann
parents:
diff changeset
   242
\isacommand{end}\isamarkupfalse%
haftmann
parents:
diff changeset
   243
%
haftmann
parents:
diff changeset
   244
\endisatagtheory
haftmann
parents:
diff changeset
   245
{\isafoldtheory}%
haftmann
parents:
diff changeset
   246
%
haftmann
parents:
diff changeset
   247
\isadelimtheory
haftmann
parents:
diff changeset
   248
%
haftmann
parents:
diff changeset
   249
\endisadelimtheory
haftmann
parents:
diff changeset
   250
\isanewline
haftmann
parents:
diff changeset
   251
\end{isabellebody}%
haftmann
parents:
diff changeset
   252
%%% Local Variables:
haftmann
parents:
diff changeset
   253
%%% mode: latex
haftmann
parents:
diff changeset
   254
%%% TeX-master: "root"
haftmann
parents:
diff changeset
   255
%%% End: