doc-src/Codegen/Thy/Further.thy
author wenzelm
Mon, 16 Mar 2009 17:46:11 +0100
changeset 30543 2ca69af4422a
parent 30227 853abb4853cc
child 30880 257cbe43faa8
permissions -rw-r--r--
tuned signature;
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 {*
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    10
  Do dive deeper into the issue of code generation, you should visit
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
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
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
    39
text {*
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).
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    50
  For instance, the @{command value} allows to reduce an expression to a
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
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    69
  why you should not use adaption (see \secref{sec:adaption}) frivolously.
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
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    81
datatype %quote form = T | F | And form form | Or form form
30227
853abb4853cc tuned manuals
haftmann
parents: 30226
diff changeset
    82
ML %quotett {*
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    83
  fun eval_form @{code T} = true
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    84
    | eval_form @{code F} = false
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    85
    | eval_form (@{code And} (p, q)) =
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    86
        eval_form p andalso eval_form q
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    87
    | eval_form (@{code Or} (p, q)) =
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    88
        eval_form p orelse eval_form q;
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    89
*}
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    90
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    91
text {*
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    92
  \noindent @{text code} takes as argument the name of a constant;  after the
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    93
  whole @{text SML} is read, the necessary code is generated transparently
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    94
  and the corresponding constant names are inserted.  This technique also
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    95
  allows to use pattern matching on constructors stemming from compiled
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    96
  @{text datatypes}.
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    97
29796
a342da8ddf39 adjusted theory name
haftmann
parents: 28635
diff changeset
    98
  For a less simplistic example, theory @{theory Ferrack} is
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    99
  a good reference.
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   100
*}
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
   101
28419
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   102
subsection {* Imperative data structures *}
f65e8b318581 re-canibalised manual
haftmann
parents: 28213
diff changeset
   103
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   104
text {*
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   105
  If you consider imperative data structures as inevitable for a specific
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   106
  application, you should consider
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   107
  \emph{Imperative Functional Programming with Isabelle/HOL}
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   108
  (\cite{bulwahn-et-al:2008:imperative});
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   109
  the framework described there is available in theory @{theory Imperative_HOL}.
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   110
*}
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   111
28213
b52f9205a02d New outline for codegen tutorial -- draft
haftmann
parents:
diff changeset
   112
end