doc-src/IsarAdvanced/Codegen/Thy/Codegen.thy
author haftmann
Fri, 20 Oct 2006 10:44:35 +0200
changeset 21058 a32d357dfd70
parent 20948 9b9910b82645
child 21075 d6742ff3b522
permissions -rw-r--r--
started tutorial
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20948
9b9910b82645 initial draft
haftmann
parents:
diff changeset
     1
9b9910b82645 initial draft
haftmann
parents:
diff changeset
     2
(* $Id$ *)
9b9910b82645 initial draft
haftmann
parents:
diff changeset
     3
9b9910b82645 initial draft
haftmann
parents:
diff changeset
     4
theory Codegen
9b9910b82645 initial draft
haftmann
parents:
diff changeset
     5
imports Main
9b9910b82645 initial draft
haftmann
parents:
diff changeset
     6
begin
9b9910b82645 initial draft
haftmann
parents:
diff changeset
     7
9b9910b82645 initial draft
haftmann
parents:
diff changeset
     8
chapter {* Code generation from Isabelle theories *}
9b9910b82645 initial draft
haftmann
parents:
diff changeset
     9
9b9910b82645 initial draft
haftmann
parents:
diff changeset
    10
section {* Introduction *}
9b9910b82645 initial draft
haftmann
parents:
diff changeset
    11
21058
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    12
subsection {* Motivation *}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    13
20948
9b9910b82645 initial draft
haftmann
parents:
diff changeset
    14
text {*
21058
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    15
  Executing formal specifications as programs is a well-established
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    16
  topic in the theorem proving community.  With increasing
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    17
  application of theorem proving systems in the area of
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    18
  software development and verification, its relevance manifests
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    19
  for running test cases and rapid prototyping.  In logical
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    20
  calculi like constructive type theory,
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    21
  a notion of executability is implicit due to the nature
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    22
  of the calculus.  In contrast, specifications in Isabelle/HOL
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    23
  can be highly non-executable.  In order to bridge
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    24
  the gap between logic and executable specifications,
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    25
  an explicit non-trivial transformation has to be applied:
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    26
  code generation.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    27
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    28
  This tutorial introduces a generic code generator for the
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    29
  Isabelle system \cite{isa-tutorial}.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    30
  Generic in the sense that the
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    31
  \qn{target language} for which code shall ultimately be
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    32
  generated is not fixed but may be an arbitrary state-of-the-art
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    33
  functional programming language (currently, the implementation
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    34
  supports SML \cite{web:sml} and Haskell \cite{web:haskell}).
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    35
  We aim to provide a
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    36
  versatile environment
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    37
  suitable for software development and verification,
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    38
  structuring the process
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    39
  of code generation into a small set of orthogonal principles
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    40
  while achieving a big coverage of application areas
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    41
  with maximum flexibility.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    42
*}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    43
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    44
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    45
subsection {* Overview *}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    46
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    47
text {*
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    48
  The code generator aims to be usable with no further ado
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    49
  in most cases while allowing for detailed customization.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    50
  This manifests in the structure of this tutorial: this introduction
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    51
  continous with a short introduction of concepts.  Section
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    52
  \secref{sec:basics} explains how to use the framework naivly,
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    53
  presuming a reasonable default setup.  Then, section
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    54
  \secref{sec:advanced} deals with advanced topics,
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    55
  introducing further aspects of the code generator framework
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    56
  in a motivation-driven manner.  Last, section \secref{sec:ml}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    57
  introduces the framework's internal programming interfaces.
20948
9b9910b82645 initial draft
haftmann
parents:
diff changeset
    58
21058
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    59
  \begin{warn}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    60
    Ultimately, the code generator which this tutorial deals with
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    61
    is supposed to replace the already established code generator
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    62
    by Stefan Berghofer \cite{Berghofer-Nipkow:2002}.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    63
    So, for the momennt, there are two distinct code generators
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    64
    in Isabelle.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    65
    Also note that while the framework itself is largely
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    66
    object-logic independent, only HOL provides a reasonable
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    67
    framework setup.    
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    68
  \end{warn}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    69
*}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    70
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    71
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    72
subsection {* Code generation process *}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    73
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    74
text {*
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    75
  The code generator employs a notion of executability
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    76
  for three foundational executable ingredients known
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    77
  from functional programming:
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    78
  \emph{function equations}, \emph{datatypes}, and
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    79
  \emph{type classes}. A function equation as a first approximation
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    80
  is a theorem of the form @{text "f t\<^isub>1 t\<^isub>2 \<dots> t\<^isub>n \<equiv> t"}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    81
  (an equation headed by a constant @{text f} with arguments
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    82
  @{text "t\<^isub>1 t\<^isub>2 \<dots> t\<^isub>n"} and right hand side @{text t}.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    83
  Code generation aims to turn function equations
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    84
  into a functional program by running through
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    85
  a process (see figure \ref{fig:process}):
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    86
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    87
  \begin{itemize}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    88
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    89
    \item Out of the vast collection of theorems proven in a
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    90
      \qn{theory}, a reasonable subset modeling
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    91
      function equations is \qn{selected}.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    92
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    93
    \item On those selected theorems, certain
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    94
      transformations are carried out
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    95
      (\qn{preprocessing}).  Their purpose is to turn theorems
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    96
      representing non- or badly executable
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    97
      specifications into equivalent but executable counterparts.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    98
      The result is a structured collection of \qn{code theorems}.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
    99
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   100
    \item These \qn{code theorems} then are extracted
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   101
      into an Haskell-like intermediate
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   102
      language.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   103
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   104
    \item Finally, out of the intermediate language the final
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   105
      code in the desired \qn{target language} is \qn{serialized}.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   106
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   107
  \end{itemize}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   108
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   109
  \begin{figure}[h]
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   110
  \centering
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   111
  \includegraphics[width=0.3\textwidth]{codegen_process}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   112
  \caption{code generator -- processing overview}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   113
  \label{fig:process}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   114
  \end{figure}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   115
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   116
  From these steps, only the two last are carried out
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   117
  outside the logic; by keeping this layer as
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   118
  thin as possible, the amount of code to trust is
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   119
  kept to a minimum.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   120
*}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   121
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   122
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   123
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   124
section {* Basics \label{sec:basics} *}
20948
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   125
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   126
subsection {* Invoking the code generator *}
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   127
21058
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   128
text {*
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   129
  Thanks to a reasonable setup of the HOL theories, in
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   130
  most cases code generation proceeds without further ado:
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   131
*}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   132
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   133
consts
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   134
  fac :: "nat \<Rightarrow> nat"
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   135
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   136
primrec
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   137
  "fac 0 = 1"
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   138
  "fac (Suc n) = Suc n * fac n"
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   139
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   140
text {*
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   141
  This executable specification is now turned to SML code:
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   142
*}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   143
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   144
code_gen fac (SML "examples/fac.ML")
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   145
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   146
text {*
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   147
  The \isasymCODEGEN command takes a space-seperated list of
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   148
  constants together with \qn{serialization directives}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   149
  in parentheses. These start with a \qn{target language}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   150
  identifer, followed by arguments, their semantics
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   151
  depending on the target. In the SML case, a filename
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   152
  is given where to write the generated code to.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   153
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   154
  Internally, the function equations for all selected
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   155
  constants are taken, including any tranitivly required
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   156
  constants, datatypes and classes, resulting in the following
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   157
  code:
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   158
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   159
  \lstsml{Thy/examples/fac.ML}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   160
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   161
  The code generator will complain when a required
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   162
  ingredient does not provide a executable counterpart.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   163
  This is the case if an involved type is not a datatype:
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   164
*}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   165
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   166
(*<*)
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   167
setup {* Sign.add_path "foo" *}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   168
(*>*)
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   169
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   170
typedecl 'a foo
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   171
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   172
definition
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   173
  bar :: "'a foo \<Rightarrow> 'a \<Rightarrow> 'a"
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   174
  "bar x y = y"
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   175
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   176
(*<*)
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   177
hide type foo
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   178
hide const bar
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   179
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   180
setup {* Sign.parent_path *}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   181
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   182
datatype 'a foo = Foo
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   183
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   184
definition
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   185
  bar :: "'a foo \<Rightarrow> 'a \<Rightarrow> 'a"
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   186
  "bar x y = y"
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   187
(*>*)
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   188
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   189
code_gen bar (SML "examples/fail_type.ML")
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   190
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   191
text {*
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   192
  \noindent will result in an error. Likewise, generating code
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   193
  for constants not yielding
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   194
  a function equation will fail, e.g.~the Hilbert choice
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   195
  operation @{text "SOME"}:
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   196
*}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   197
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   198
(*<*)
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   199
setup {* Sign.add_path "foo" *}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   200
(*>*)
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   201
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   202
definition
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   203
  pick_some :: "'a list \<Rightarrow> 'a"
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   204
  "pick_some xs = (SOME x. x \<in> set xs)"
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   205
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   206
(*<*)
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   207
hide const pick_some
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   208
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   209
setup {* Sign.parent_path *}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   210
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   211
definition
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   212
  pick_some :: "'a list \<Rightarrow> 'a"
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   213
  "pick_some = hd"
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   214
(*>*)
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   215
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   216
code_gen pick_some (SML "examples/fail_const.ML")
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   217
20948
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   218
subsection {* Theorem selection *}
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   219
21058
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   220
text {*
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   221
  The list of all function equations in a theory may be inspected
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   222
  using the \isasymPRINTCODETHMS command:
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   223
*}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   224
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   225
print_codethms
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   226
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   227
text {*
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   228
  \noindent which displays a table of constant with corresponding
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   229
  function equations (the additional stuff displayed
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   230
  shall not bother us for the moment). If this table does
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   231
  not provide at least one function
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   232
  equation, the table of primititve definitions is searched
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   233
  whether it provides one.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   234
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   235
  The typical HOL tools are already set up in a way that
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   236
  function definitions introduced by \isasymFUN, \isasymFUNCTION,
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   237
  \isasymPRIMREC, \isasymRECDEF are implicitly propagated
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   238
  to this function equation table. Specific theorems may be
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   239
  selected using an attribute: \emph{code func}. As example,
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   240
  a weight selector function:
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   241
*}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   242
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   243
consts
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   244
  pick :: "(nat \<times> 'a) list \<Rightarrow> nat \<Rightarrow> 'a"
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   245
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   246
primrec
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   247
  "pick (x#xs) n = (let (k, v) = x in
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   248
    if n < k then v else pick xs (n - k))"
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   249
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   250
text {*
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   251
  We want to eliminate the explicit destruction
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   252
  of @{term x} to @{term "(k, v)"}:
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   253
*}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   254
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   255
lemma [code func]:
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   256
  "pick ((k, v)#xs) n = (if n < k then v else pick xs (n - k))"
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   257
  by simp
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   258
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   259
code_gen pick (SML "examples/pick1.ML")
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   260
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   261
text {*
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   262
  This theorem is now added to the function equation table:
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   263
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   264
  \lstsml{Thy/examples/pick1.ML}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   265
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   266
  It might be convenient to remove the pointless original
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   267
  equation, using the \emph{nofunc} attribute:
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   268
*}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   269
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   270
lemmas [code nofunc] = pick.simps 
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   271
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   272
code_gen pick (SML "examples/pick2.ML")
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   273
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   274
text {*
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   275
  \lstsml{Thy/examples/pick2.ML}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   276
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   277
  Syntactic redundancies are implicitly dropped. For example,
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   278
  using a modified version of the @{const fac} function
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   279
  as function equation, the then redundant (since
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   280
  syntactically more subsumed) original function equations
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   281
  are dropped, resulting in a warning:
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   282
*}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   283
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   284
lemma [code func]:
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   285
  "fac n = (case n of 0 \<Rightarrow> 1 | Suc m \<Rightarrow> n * fac m)"
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   286
  by (cases n) simp_all
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   287
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   288
code_gen fac (SML "examples/fac_case.ML")
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   289
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   290
text {*
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   291
  \lstsml{Thy/examples/fac_case.ML}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   292
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   293
  \begin{warn}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   294
    Some statements in this section have to be treated with some
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   295
    caution. First, since the HOL function package is still
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   296
    under development, its setup with respect to code generation
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   297
    may differ from what is presumed here.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   298
    Further, the attributes \emph{code} and \emph{code del}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   299
    associated with the existing code generator also apply to
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   300
    the new one: \emph{code} implies \emph{code func},
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   301
    and \emph{code del} implies \emph{code nofunc}.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   302
  \end{warn}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   303
*}
20948
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   304
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   305
subsection {* Type classes *}
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   306
21058
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   307
text {*
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   308
  Type classes enter the game via the Isar class package.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   309
  For a short introduction how to use it, see \fixme[ref];
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   310
  here we just illustrate its relation on code generation.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   311
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   312
  In a target language, type classes may be represented
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   313
  nativly (as in the case of Haskell). For languages
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   314
  like SML, they are implemented using \emph{dictionaries}.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   315
  Our following example specified a class \qt{null},
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   316
  assigning to each of its inhabitants a \qt{null} value:
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   317
*}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   318
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   319
class null =
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   320
  fixes null :: 'a
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   321
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   322
consts
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   323
  head :: "'a\<Colon>null list \<Rightarrow> 'a"
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   324
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   325
primrec
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   326
  "head [] = null"
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   327
  "head (x#xs) = x"
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   328
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   329
text {*
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   330
  We provide some instances for our @{text null}:
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   331
*}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   332
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   333
instance option :: (type) null
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   334
  "null \<equiv> None" ..
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   335
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   336
instance list :: (type) null
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   337
  "null \<equiv> []" ..
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   338
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   339
text {*
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   340
  Constructing a dummy example:
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   341
*}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   342
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   343
definition
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   344
  "dummy = head [Some (Suc 0), None]"
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   345
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   346
text {*
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   347
  Type classes offer a suitable occassion to introduce
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   348
  the Haskell serializer.  Its usage is almost the same
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   349
  as SML, but, in accordance with conventions some
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   350
  common Haskell compilers enforce, each module ends
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   351
  up in a single file which the file given by the user
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   352
  then imports. The module hierarchy is reflected in
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   353
  the file system.
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   354
*}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   355
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   356
code_gen dummy (Haskell "examples/codegen.hs")
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   357
  (* NOTE: you may use Haskell only once in this document *)
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   358
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   359
text {*
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   360
  \lsthaskell{Thy/examples/Codegen.hs}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   361
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   362
  (we have left out all other modules).
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   363
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   364
  The whole code in SML with explicit dictionary passing:
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   365
*}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   366
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   367
code_gen dummy (SML "examples/class.ML")
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   368
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   369
text {*
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   370
  \lstsml{Thy/examples/class.ML}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   371
*}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   372
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   373
subsection {* Incremental code generation *}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   374
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   375
(* print_codethms (\<dots>) and code_gen, 2 *)
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   376
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   377
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   378
section {* Recipes and advanced topics \label{sec:advanced} *}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   379
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   380
(* no reference, IsarRef, but see paper *)
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   381
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   382
subsection {* Library theories *}
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   383
20948
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   384
subsection {* Preprocessing *}
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   385
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   386
(* preprocessing, print_codethms () *)
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   387
21058
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   388
subsection {* Customizing serialization  *}
20948
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   389
21058
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   390
(* existing libraries, understanding the type game, reflexive equations, code inline code_constsubst, code_abstype*)
20948
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   391
21058
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   392
section {* ML interfaces \label{sec:ml} *}
20948
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   393
21058
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   394
(* under developement *)
20948
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   395
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   396
subsection {* codegen\_data.ML *}
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   397
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   398
subsection {* Implementing code generator applications *}
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   399
21058
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   400
(* hooks *)
a32d357dfd70 started tutorial
haftmann
parents: 20948
diff changeset
   401
20948
9b9910b82645 initial draft
haftmann
parents:
diff changeset
   402
end