doc-src/Codegen/Thy/Further.thy
author haftmann
Mon, 31 May 2010 17:29:26 +0200
changeset 37210 1f1f9cbd23ae
parent 34155 14aaccb399b3
child 37426 04d58897bf90
permissions -rw-r--r--
adjusted
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
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    15
subsection {* Modules *}
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    16
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    17
text {*
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    18
  When invoking the @{command export_code} command it is possible to leave
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    19
  out the @{keyword "module_name"} part;  then code is distributed over
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    20
  different modules, where the module name space roughly is induced
28635
cc53d2ab0170 filled remaining gaps
haftmann
parents: 28593
diff changeset
    21
  by the @{text Isabelle} theory name space.
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
    22
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    23
  Then sometimes the awkward situation occurs that dependencies between
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    24
  definitions introduce cyclic dependencies between modules, which in the
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    25
  @{text Haskell} world leaves you to the mercy of the @{text Haskell} implementation
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    26
  you are using,  while for @{text SML}/@{text OCaml} code generation is not possible.
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    27
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    28
  A solution is to declare module names explicitly.
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    29
  Let use assume the three cyclically dependent
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    30
  modules are named \emph{A}, \emph{B} and \emph{C}.
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    31
  Then, by stating
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    32
*}
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    33
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    34
code_modulename %quote SML
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    35
  A ABC
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    36
  B ABC
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    37
  C ABC
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    38
34155
14aaccb399b3 Polishing up the English
paulson
parents: 31050
diff changeset
    39
text {*\noindent
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    40
  we explicitly map all those modules on \emph{ABC},
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    41
  resulting in an ad-hoc merge of this three modules
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    42
  at serialisation time.
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    43
*}
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
    44
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
    45
subsection {* Evaluation oracle *}
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
    46
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    47
text {*
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    48
  Code generation may also be used to \emph{evaluate} expressions
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    49
  (using @{text SML} as target language of course).
34155
14aaccb399b3 Polishing up the English
paulson
parents: 31050
diff changeset
    50
  For instance, the @{command value} reduces an expression to a
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    51
  normal form with respect to the underlying code equations:
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    52
*}
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    53
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    54
value %quote "42 / (12 :: rat)"
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    55
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    56
text {*
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    57
  \noindent will display @{term "7 / (2 :: rat)"}.
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    58
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    59
  The @{method eval} method tries to reduce a goal by code generation to @{term True}
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    60
  and solves it in that case, but fails otherwise:
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    61
*}
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    62
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    63
lemma %quote "42 / (12 :: rat) = 7 / 2"
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    64
  by %quote eval
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    65
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    66
text {*
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    67
  \noindent The soundness of the @{method eval} method depends crucially 
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    68
  on the correctness of the code generator;  this is one of the reasons
31050
555b56b66fcf adaptation replaces adaption
haftmann
parents: 30880
diff changeset
    69
  why you should not use adaptation (see \secref{sec:adaptation}) frivolously.
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    70
*}
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    71
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
    72
subsection {* Code antiquotation *}
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
    73
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    74
text {*
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    75
  In scenarios involving techniques like reflection it is quite common
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    76
  that code generated from a theory forms the basis for implementing
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    77
  a proof procedure in @{text SML}.  To facilitate interfacing of generated code
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    78
  with system code, the code generator provides a @{text code} antiquotation:
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    79
*}
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    80
30880
257cbe43faa8 tuned manual
haftmann
parents: 30227
diff changeset
    81
datatype %quote form = T | F | And form form | Or form form (*<*)
257cbe43faa8 tuned manual
haftmann
parents: 30227
diff changeset
    82
257cbe43faa8 tuned manual
haftmann
parents: 30227
diff changeset
    83
(*>*) ML %quotett {*
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    84
  fun eval_form @{code T} = true
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    85
    | eval_form @{code F} = false
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    86
    | eval_form (@{code And} (p, q)) =
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    87
        eval_form p andalso eval_form q
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    88
    | eval_form (@{code Or} (p, q)) =
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    89
        eval_form p orelse eval_form q;
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    90
*}
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    91
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    92
text {*
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    93
  \noindent @{text code} takes as argument the name of a constant;  after the
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    94
  whole @{text SML} is read, the necessary code is generated transparently
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    95
  and the corresponding constant names are inserted.  This technique also
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    96
  allows to use pattern matching on constructors stemming from compiled
37210
1f1f9cbd23ae adjusted
haftmann
parents: 34155
diff changeset
    97
  @{text "datatypes"}.
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    98
29796
a342da8ddf39 adjusted theory name
haftmann
parents: 28635
diff changeset
    99
  For a less simplistic example, theory @{theory Ferrack} is
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   100
  a good reference.
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   101
*}
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
   102
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   103
subsection {* Imperative data structures *}
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   104
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   105
text {*
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   106
  If you consider imperative data structures as inevitable for a specific
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   107
  application, you should consider
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   108
  \emph{Imperative Functional Programming with Isabelle/HOL}
34155
14aaccb399b3 Polishing up the English
paulson
parents: 31050
diff changeset
   109
  \cite{bulwahn-et-al:2008:imperative};
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   110
  the framework described there is available in theory @{theory Imperative_HOL}.
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   111
*}
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   112
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
   113
end