src/Doc/Codegen/Introduction.thy
author wenzelm
Sun, 22 Sep 2019 19:04:11 +0200
changeset 70743 342b0a1fc86d
parent 70011 9dde788b0128
child 72375 e48d93811ed7
permissions -rw-r--r--
proper file name instead of font name (amending dc9a39c3f75d);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
     1
theory Introduction
69422
472af2d7835d clarified session dependencies: faster build_doc/build_release;
wenzelm
parents: 68484
diff changeset
     2
imports Setup
59378
065f349852e6 separate image for prerequisites of codegen tutorial
haftmann
parents: 59377
diff changeset
     3
begin (*<*)
065f349852e6 separate image for prerequisites of codegen tutorial
haftmann
parents: 59377
diff changeset
     4
065f349852e6 separate image for prerequisites of codegen tutorial
haftmann
parents: 59377
diff changeset
     5
ML \<open>
065f349852e6 separate image for prerequisites of codegen tutorial
haftmann
parents: 59377
diff changeset
     6
  Isabelle_System.mkdirs (File.tmp_path (Path.basic "examples"))
065f349852e6 separate image for prerequisites of codegen tutorial
haftmann
parents: 59377
diff changeset
     7
\<close> (*>*)
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
     8
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
     9
section \<open>Introduction\<close>
38405
7935b334893e sketch of new outline
haftmann
parents: 38402
diff changeset
    10
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
    11
text \<open>
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    12
  This tutorial introduces the code generator facilities of \<open>Isabelle/HOL\<close>.  It allows to turn (a certain class of) HOL
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    13
  specifications into corresponding executable code in the programming
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    14
  languages \<open>SML\<close> @{cite SML}, \<open>OCaml\<close> @{cite OCaml},
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    15
  \<open>Haskell\<close> @{cite "haskell-revised-report"} and \<open>Scala\<close>
58620
7435b6a3f72e more antiquotations;
wenzelm
parents: 58310
diff changeset
    16
  @{cite "scala-overview-tech-report"}.
38405
7935b334893e sketch of new outline
haftmann
parents: 38402
diff changeset
    17
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    18
  To profit from this tutorial, some familiarity and experience with
68484
59793df7f853 clarified document antiquotation @{theory};
wenzelm
parents: 66453
diff changeset
    19
  Isabelle/HOL @{cite "isa-tutorial"} and its basic theories is assumed.
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
    20
\<close>
38405
7935b334893e sketch of new outline
haftmann
parents: 38402
diff changeset
    21
7935b334893e sketch of new outline
haftmann
parents: 38402
diff changeset
    22
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
    23
subsection \<open>Code generation principle: shallow embedding \label{sec:principle}\<close>
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
    24
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
    25
text \<open>
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    26
  The key concept for understanding Isabelle's code generation is
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    27
  \emph{shallow embedding}: logical entities like constants, types and
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    28
  classes are identified with corresponding entities in the target
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    29
  language.  In particular, the carrier of a generated program's
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    30
  semantics are \emph{equational theorems} from the logic.  If we view
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    31
  a generated program as an implementation of a higher-order rewrite
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    32
  system, then every rewrite step performed by the program can be
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    33
  simulated in the logic, which guarantees partial correctness
58620
7435b6a3f72e more antiquotations;
wenzelm
parents: 58310
diff changeset
    34
  @{cite "Haftmann-Nipkow:2010:code"}.
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
    35
\<close>
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
    36
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    37
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
    38
subsection \<open>A quick start with the Isabelle/HOL toolbox \label{sec:queue_example}\<close>
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    39
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
    40
text \<open>
58310
91ea607a34d8 updated news
blanchet
parents: 58305
diff changeset
    41
  In a HOL theory, the @{command_def datatype} and @{command_def
38505
2f8699695cf6 use command_def vs. command more consciously
haftmann
parents: 38437
diff changeset
    42
  definition}/@{command_def primrec}/@{command_def fun} declarations
2f8699695cf6 use command_def vs. command more consciously
haftmann
parents: 38437
diff changeset
    43
  form the core of a functional programming language.  By default
2f8699695cf6 use command_def vs. command more consciously
haftmann
parents: 38437
diff changeset
    44
  equational theorems stemming from those are used for generated code,
2f8699695cf6 use command_def vs. command more consciously
haftmann
parents: 38437
diff changeset
    45
  therefore \qt{naive} code generation can proceed without further
2f8699695cf6 use command_def vs. command more consciously
haftmann
parents: 38437
diff changeset
    46
  ado.
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    47
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    48
  For example, here a simple \qt{implementation} of amortised queues:
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
    49
\<close>
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    50
58310
91ea607a34d8 updated news
blanchet
parents: 58305
diff changeset
    51
datatype %quote 'a queue = AQueue "'a list" "'a list"
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    52
28564
haftmann
parents: 28447
diff changeset
    53
definition %quote empty :: "'a queue" where
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
    54
  "empty = AQueue [] []"
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    55
28564
haftmann
parents: 28447
diff changeset
    56
primrec %quote enqueue :: "'a \<Rightarrow> 'a queue \<Rightarrow> 'a queue" where
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
    57
  "enqueue x (AQueue xs ys) = AQueue (x # xs) ys"
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    58
28564
haftmann
parents: 28447
diff changeset
    59
fun %quote dequeue :: "'a queue \<Rightarrow> 'a option \<times> 'a queue" where
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
    60
    "dequeue (AQueue [] []) = (None, AQueue [] [])"
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
    61
  | "dequeue (AQueue xs (y # ys)) = (Some y, AQueue xs ys)"
6df726203e39 proper datatype abstraction example
haftmann
parents: 29560
diff changeset
    62
  | "dequeue (AQueue xs []) =
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    63
      (case rev xs of y # ys \<Rightarrow> (Some y, AQueue [] ys))" (*<*)
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    64
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    65
lemma %invisible dequeue_nonempty_Nil [simp]:
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    66
  "xs \<noteq> [] \<Longrightarrow> dequeue (AQueue xs []) = (case rev xs of y # ys \<Rightarrow> (Some y, AQueue [] ys))"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    67
  by (cases xs) (simp_all split: list.splits) (*>*)
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    68
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
    69
text \<open>\noindent Then we can generate code e.g.~for \<open>SML\<close> as follows:\<close>
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
    70
70011
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
    71
export_code %quote empty dequeue enqueue in SML module_name Example
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    72
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
    73
text \<open>\noindent resulting in the following code:\<close>
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    74
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69605
diff changeset
    75
text %quote \<open>
39683
f75a01ee6c41 prefer typewrite tag over raw latex environment
haftmann
parents: 39664
diff changeset
    76
  @{code_stmts empty enqueue dequeue (SML)}
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
    77
\<close>
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    78
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
    79
text \<open>
70011
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
    80
  \noindent The @{command_def export_code} command takes multiple constants
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
    81
  for which code shall be generated; anything else needed for those is
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
    82
  added implicitly. Then follows a target language identifier and a freely
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
    83
  chosen \<^theory_text>\<open>module_name\<close>.
70009
435fb018e8ee "export_code ... file_prefix ..." is the preferred way to produce output within the logical file-system within the theory context, as well as session exports;
wenzelm
parents: 69660
diff changeset
    84
70011
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
    85
  Output is written to a logical file-system within the theory context,
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
    86
  with the theory name and ``\<^verbatim>\<open>code\<close>'' as overall prefix. There is also a
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
    87
  formal session export using the same name: the result may be explored in
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
    88
  the Isabelle/jEdit Prover IDE using the file-browser on the URL
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
    89
  ``\<^verbatim>\<open>isabelle-export:\<close>''.
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
    90
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
    91
  The file name is determined by the target language together with an
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
    92
  optional \<^theory_text>\<open>file_prefix\<close> (the default is ``\<^verbatim>\<open>export\<close>'' with a consecutive
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
    93
  number within the current theory). For \<open>SML\<close>, \<open>OCaml\<close> and \<open>Scala\<close>, the
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
    94
  file prefix becomes a plain file with extension (e.g.\ ``\<^verbatim>\<open>.ML\<close>'' for
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
    95
  SML). For \<open>Haskell\<close> the file prefix becomes a directory that is populated
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
    96
  with a separate file for each module (with extension ``\<^verbatim>\<open>.hs\<close>'').
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
    97
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
    98
  Consider the following example:
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
    99
\<close>
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   100
28564
haftmann
parents: 28447
diff changeset
   101
export_code %quote empty dequeue enqueue in Haskell
70011
9dde788b0128 clarified 'file_prefix';
wenzelm
parents: 70009
diff changeset
   102
  module_name Example file_prefix example
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   103
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   104
text \<open>
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   105
  \noindent This is the corresponding code:
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   106
\<close>
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   107
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69605
diff changeset
   108
text %quote \<open>
39683
f75a01ee6c41 prefer typewrite tag over raw latex environment
haftmann
parents: 39664
diff changeset
   109
  @{code_stmts empty enqueue dequeue (Haskell)}
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   110
\<close>
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   111
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   112
text \<open>
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   113
  \noindent For more details about @{command export_code} see
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   114
  \secref{sec:further}.
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   115
\<close>
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
   116
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   117
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   118
subsection \<open>Type classes\<close>
38402
58fc3a3af71f added stub "If something utterly fails"
haftmann
parents: 34155
diff changeset
   119
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   120
text \<open>
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   121
  Code can also be generated from type classes in a Haskell-like
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   122
  manner.  For illustration here an example from abstract algebra:
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   123
\<close>
38402
58fc3a3af71f added stub "If something utterly fails"
haftmann
parents: 34155
diff changeset
   124
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   125
class %quote semigroup =
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   126
  fixes mult :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" (infixl "\<otimes>" 70)
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   127
  assumes assoc: "(x \<otimes> y) \<otimes> z = x \<otimes> (y \<otimes> z)"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   128
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   129
class %quote monoid = semigroup +
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   130
  fixes neutral :: 'a ("\<one>")
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   131
  assumes neutl: "\<one> \<otimes> x = x"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   132
    and neutr: "x \<otimes> \<one> = x"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   133
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   134
instantiation %quote nat :: monoid
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   135
begin
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   136
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   137
primrec %quote mult_nat where
61076
bdc1e2f0a86a eliminated \<Colon>;
wenzelm
parents: 59378
diff changeset
   138
    "0 \<otimes> n = (0::nat)"
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   139
  | "Suc m \<otimes> n = n + m \<otimes> n"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   140
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   141
definition %quote neutral_nat where
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   142
  "\<one> = Suc 0"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   143
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   144
lemma %quote add_mult_distrib:
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   145
  fixes n m q :: nat
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   146
  shows "(n + m) \<otimes> q = n \<otimes> q + m \<otimes> q"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   147
  by (induct n) simp_all
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   148
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   149
instance %quote proof
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   150
  fix m n q :: nat
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   151
  show "m \<otimes> n \<otimes> q = m \<otimes> (n \<otimes> q)"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   152
    by (induct m) (simp_all add: add_mult_distrib)
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   153
  show "\<one> \<otimes> n = n"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   154
    by (simp add: neutral_nat_def)
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   155
  show "m \<otimes> \<one> = m"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   156
    by (induct m) (simp_all add: neutral_nat_def)
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   157
qed
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   158
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   159
end %quote
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
   160
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   161
text \<open>
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   162
  \noindent We define the natural operation of the natural numbers
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   163
  on monoids:
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   164
\<close>
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   165
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   166
primrec %quote (in monoid) pow :: "nat \<Rightarrow> 'a \<Rightarrow> 'a" where
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   167
    "pow 0 a = \<one>"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   168
  | "pow (Suc n) a = a \<otimes> pow n a"
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   169
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   170
text \<open>
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   171
  \noindent This we use to define the discrete exponentiation
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   172
  function:
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   173
\<close>
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   174
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   175
definition %quote bexp :: "nat \<Rightarrow> nat" where
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   176
  "bexp n = pow n (Suc (Suc 0))"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   177
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   178
text \<open>
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   179
  \noindent The corresponding code in Haskell uses that language's
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   180
  native classes:
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   181
\<close>
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   182
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69605
diff changeset
   183
text %quote \<open>
39683
f75a01ee6c41 prefer typewrite tag over raw latex environment
haftmann
parents: 39664
diff changeset
   184
  @{code_stmts bexp (Haskell)}
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   185
\<close>
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   186
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   187
text \<open>
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   188
  \noindent This is a convenient place to show how explicit dictionary
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   189
  construction manifests in generated code -- the same example in
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 69422
diff changeset
   190
  \<open>SML\<close>:
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   191
\<close>
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   192
69660
2bc2a8599369 canonical operation to typeset generated code makes dedicated environment obsolete
haftmann
parents: 69605
diff changeset
   193
text %quote \<open>
39683
f75a01ee6c41 prefer typewrite tag over raw latex environment
haftmann
parents: 39664
diff changeset
   194
  @{code_stmts bexp (SML)}
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   195
\<close>
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   196
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   197
text \<open>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   198
  \noindent Note the parameters with trailing underscore (\<^verbatim>\<open>A_\<close>), which are the dictionary parameters.
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   199
\<close>
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   200
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   201
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   202
subsection \<open>How to continue from here\<close>
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   203
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   204
text \<open>
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   205
  What you have seen so far should be already enough in a lot of
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   206
  cases.  If you are content with this, you can quit reading here.
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   207
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   208
  Anyway, to understand situations where problems occur or to increase
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   209
  the scope of code generation beyond default, it is necessary to gain
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   210
  some understanding how the code generator actually works:
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   211
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   212
  \begin{itemize}
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   213
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   214
    \item The foundations of the code generator are described in
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   215
      \secref{sec:foundations}.
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   216
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   217
    \item In particular \secref{sec:utterly_wrong} gives hints how to
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   218
      debug situations where code generation does not succeed as
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   219
      expected.
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   220
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   221
    \item The scope and quality of generated code can be increased
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   222
      dramatically by applying refinement techniques, which are
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   223
      introduced in \secref{sec:refinement}.
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   224
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   225
    \item Inductive predicates can be turned executable using an
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   226
      extension of the code generator \secref{sec:inductive}.
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   227
40753
5288144b4358 added evaluation section
haftmann
parents: 39745
diff changeset
   228
    \item If you want to utilize code generation to obtain fast
5288144b4358 added evaluation section
haftmann
parents: 39745
diff changeset
   229
      evaluators e.g.~for decision procedures, have a look at
5288144b4358 added evaluation section
haftmann
parents: 39745
diff changeset
   230
      \secref{sec:evaluation}.
5288144b4358 added evaluation section
haftmann
parents: 39745
diff changeset
   231
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   232
    \item You may want to skim over the more technical sections
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   233
      \secref{sec:adaptation} and \secref{sec:further}.
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   234
58620
7435b6a3f72e more antiquotations;
wenzelm
parents: 58310
diff changeset
   235
    \item The target language Scala @{cite "scala-overview-tech-report"}
42096
9f6652122963 added subsection on Scala specialities
haftmann
parents: 40753
diff changeset
   236
      comes with some specialities discussed in \secref{sec:scala}.
9f6652122963 added subsection on Scala specialities
haftmann
parents: 40753
diff changeset
   237
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   238
    \item For exhaustive syntax diagrams etc. you should visit the
58620
7435b6a3f72e more antiquotations;
wenzelm
parents: 58310
diff changeset
   239
      Isabelle/Isar Reference Manual @{cite "isabelle-isar-ref"}.
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   240
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   241
  \end{itemize}
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   242
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   243
  \bigskip
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   244
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   245
  \begin{center}\fbox{\fbox{\begin{minipage}{8cm}
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   246
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   247
    \begin{center}\textit{Happy proving, happy hacking!}\end{center}
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   248
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   249
  \end{minipage}}}\end{center}
59377
056945909f60 modernized cartouches
haftmann
parents: 59334
diff changeset
   250
\<close>
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
   251
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
   252
end
46522
2b1e87b3967f tuned whitespace
haftmann
parents: 45211
diff changeset
   253