doc-src/Codegen/Thy/Further.thy
author haftmann
Thu, 15 Jul 2010 10:12:49 +0200
changeset 37836 2bcce92be291
parent 37432 e732b4f8fddf
child 38405 7935b334893e
permissions -rw-r--r--
adjusted; fixed typo
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
     1
theory Further
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
     2
imports Setup
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
     3
begin
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
     4
28447
haftmann
parents: 28419
diff changeset
     5
section {* Further issues \label{sec:further} *}
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
     6
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
     7
subsection {* Further reading *}
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
     8
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
     9
text {*
34155
14aaccb399b3 Polishing up the English
paulson
parents: 31050
diff changeset
    10
  To dive deeper into the issue of code generation, you should visit
14aaccb399b3 Polishing up the English
paulson
parents: 31050
diff changeset
    11
  the Isabelle/Isar Reference Manual \cite{isabelle-isar-ref}, which
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    12
  contains exhaustive syntax diagrams.
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    13
*}
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    14
37426
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    15
subsection {* Locales and interpretation *}
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    16
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    17
text {*
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    18
  A technical issue comes to surface when generating code from
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    19
  specifications stemming from locale interpretation.
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    20
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    21
  Let us assume a locale specifying a power operation
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    22
  on arbitrary types:
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    23
*}
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    24
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    25
locale %quote power =
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    26
  fixes power :: "'a \<Rightarrow> 'b \<Rightarrow> 'b"
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    27
  assumes power_commute: "power x \<circ> power y = power y \<circ> power x"
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    28
begin
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    29
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    30
text {*
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    31
  \noindent Inside that locale we can lift @{text power} to exponent lists
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    32
  by means of specification relative to that locale:
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    33
*}
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    34
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    35
primrec %quote powers :: "'a list \<Rightarrow> 'b \<Rightarrow> 'b" where
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    36
  "powers [] = id"
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    37
| "powers (x # xs) = power x \<circ> powers xs"
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    38
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    39
lemma %quote powers_append:
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    40
  "powers (xs @ ys) = powers xs \<circ> powers ys"
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    41
  by (induct xs) simp_all
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    42
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    43
lemma %quote powers_power:
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    44
  "powers xs \<circ> power x = power x \<circ> powers xs"
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    45
  by (induct xs)
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    46
    (simp_all del: o_apply id_apply add: o_assoc [symmetric],
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    47
      simp del: o_apply add: o_assoc power_commute)
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    48
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    49
lemma %quote powers_rev:
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    50
  "powers (rev xs) = powers xs"
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    51
    by (induct xs) (simp_all add: powers_append powers_power)
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    52
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    53
end %quote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    54
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    55
text {*
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    56
  After an interpretation of this locale (say, @{command
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    57
  interpretation} @{text "fun_power:"} @{term [source] "power (\<lambda>n (f ::
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    58
  'a \<Rightarrow> 'a). f ^^ n)"}), one would expect to have a constant @{text
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    59
  "fun_power.powers :: nat list \<Rightarrow> ('a \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'a"} for which code
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    60
  can be generated.  But this not the case: internally, the term
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    61
  @{text "fun_power.powers"} is an abbreviation for the foundational
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    62
  term @{term [source] "power.powers (\<lambda>n (f :: 'a \<Rightarrow> 'a). f ^^ n)"}
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    63
  (see \cite{isabelle-locale} for the details behind).
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    64
37836
2bcce92be291 adjusted; fixed typo
haftmann
parents: 37432
diff changeset
    65
  Fortunately, with minor effort the desired behaviour can be achieved.
37426
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    66
  First, a dedicated definition of the constant on which the local @{text "powers"}
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    67
  after interpretation is supposed to be mapped on:
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    68
*}
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    69
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    70
definition %quote funpows :: "nat list \<Rightarrow> ('a \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'a" where
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    71
  [code del]: "funpows = power.powers (\<lambda>n f. f ^^ n)"
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    72
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    73
text {*
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    74
  \noindent In general, the pattern is @{text "c = t"} where @{text c} is
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    75
  the name of the future constant and @{text t} the foundational term
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    76
  corresponding to the local constant after interpretation.
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    77
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    78
  The interpretation itself is enriched with an equation @{text "t = c"}:
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    79
*}
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    80
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    81
interpretation %quote fun_power: power "\<lambda>n (f :: 'a \<Rightarrow> 'a). f ^^ n" where
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    82
  "power.powers (\<lambda>n f. f ^^ n) = funpows"
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    83
  by unfold_locales
37432
e732b4f8fddf tuned documents
haftmann
parents: 37430
diff changeset
    84
    (simp_all add: expand_fun_eq funpow_mult mult_commute funpows_def)
37426
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    85
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    86
text {*
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    87
  \noindent This additional equation is trivially proved by the definition
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    88
  itself.
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    89
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    90
  After this setup procedure, code generation can continue as usual:
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    91
*}
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    92
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    93
text %quote {*@{code_stmts funpows (consts) Nat.funpow funpows (Haskell)}*}
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    94
04d58897bf90 subsection on locale interpretation
haftmann
parents: 37210
diff changeset
    95
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    96
subsection {* Modules *}
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    97
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    98
text {*
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    99
  When invoking the @{command export_code} command it is possible to leave
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   100
  out the @{keyword "module_name"} part;  then code is distributed over
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   101
  different modules, where the module name space roughly is induced
28635
cc53d2ab0170 filled remaining gaps
haftmann
parents: 28593
diff changeset
   102
  by the @{text Isabelle} theory name space.
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
   103
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   104
  Then sometimes the awkward situation occurs that dependencies between
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   105
  definitions introduce cyclic dependencies between modules, which in the
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   106
  @{text Haskell} world leaves you to the mercy of the @{text Haskell} implementation
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   107
  you are using,  while for @{text SML}/@{text OCaml} code generation is not possible.
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   108
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   109
  A solution is to declare module names explicitly.
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   110
  Let use assume the three cyclically dependent
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   111
  modules are named \emph{A}, \emph{B} and \emph{C}.
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   112
  Then, by stating
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   113
*}
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   114
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   115
code_modulename %quote SML
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   116
  A ABC
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   117
  B ABC
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   118
  C ABC
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   119
34155
14aaccb399b3 Polishing up the English
paulson
parents: 31050
diff changeset
   120
text {*\noindent
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   121
  we explicitly map all those modules on \emph{ABC},
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   122
  resulting in an ad-hoc merge of this three modules
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   123
  at serialisation time.
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   124
*}
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
   125
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
   126
subsection {* Evaluation oracle *}
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
   127
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   128
text {*
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   129
  Code generation may also be used to \emph{evaluate} expressions
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   130
  (using @{text SML} as target language of course).
34155
14aaccb399b3 Polishing up the English
paulson
parents: 31050
diff changeset
   131
  For instance, the @{command value} reduces an expression to a
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   132
  normal form with respect to the underlying code equations:
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   133
*}
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   134
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   135
value %quote "42 / (12 :: rat)"
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   136
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   137
text {*
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   138
  \noindent will display @{term "7 / (2 :: rat)"}.
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   139
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   140
  The @{method eval} method tries to reduce a goal by code generation to @{term True}
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   141
  and solves it in that case, but fails otherwise:
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   142
*}
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   143
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   144
lemma %quote "42 / (12 :: rat) = 7 / 2"
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   145
  by %quote eval
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   146
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   147
text {*
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   148
  \noindent The soundness of the @{method eval} method depends crucially 
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   149
  on the correctness of the code generator;  this is one of the reasons
31050
555b56b66fcf adaptation replaces adaption
haftmann
parents: 30880
diff changeset
   150
  why you should not use adaptation (see \secref{sec:adaptation}) frivolously.
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   151
*}
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   152
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
   153
subsection {* Code antiquotation *}
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
   154
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   155
text {*
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   156
  In scenarios involving techniques like reflection it is quite common
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   157
  that code generated from a theory forms the basis for implementing
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   158
  a proof procedure in @{text SML}.  To facilitate interfacing of generated code
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   159
  with system code, the code generator provides a @{text code} antiquotation:
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   160
*}
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   161
30880
257cbe43faa8 tuned manual
haftmann
parents: 30227
diff changeset
   162
datatype %quote form = T | F | And form form | Or form form (*<*)
257cbe43faa8 tuned manual
haftmann
parents: 30227
diff changeset
   163
257cbe43faa8 tuned manual
haftmann
parents: 30227
diff changeset
   164
(*>*) ML %quotett {*
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   165
  fun eval_form @{code T} = true
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   166
    | eval_form @{code F} = false
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   167
    | eval_form (@{code And} (p, q)) =
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   168
        eval_form p andalso eval_form q
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   169
    | eval_form (@{code Or} (p, q)) =
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   170
        eval_form p orelse eval_form q;
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   171
*}
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   172
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   173
text {*
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   174
  \noindent @{text code} takes as argument the name of a constant;  after the
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   175
  whole @{text SML} is read, the necessary code is generated transparently
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   176
  and the corresponding constant names are inserted.  This technique also
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   177
  allows to use pattern matching on constructors stemming from compiled
37210
1f1f9cbd23ae adjusted
haftmann
parents: 34155
diff changeset
   178
  @{text "datatypes"}.
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   179
29796
a342da8ddf39 adjusted theory name
haftmann
parents: 28635
diff changeset
   180
  For a less simplistic example, theory @{theory Ferrack} is
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   181
  a good reference.
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   182
*}
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
   183
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   184
subsection {* Imperative data structures *}
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   185
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   186
text {*
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   187
  If you consider imperative data structures as inevitable for a specific
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   188
  application, you should consider
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   189
  \emph{Imperative Functional Programming with Isabelle/HOL}
34155
14aaccb399b3 Polishing up the English
paulson
parents: 31050
diff changeset
   190
  \cite{bulwahn-et-al:2008:imperative};
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   191
  the framework described there is available in theory @{theory Imperative_HOL}.
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   192
*}
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   193
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
   194
end