doc-src/Codegen/Thy/document/Further.tex
author haftmann
Thu, 08 Jul 2010 16:48:33 +0200
changeset 37749 c7e15d59c58d
parent 37432 e732b4f8fddf
child 37836 2bcce92be291
permissions -rw-r--r--
updated documentation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28447
haftmann
parents:
diff changeset
     1
%
haftmann
parents:
diff changeset
     2
\begin{isabellebody}%
haftmann
parents:
diff changeset
     3
\def\isabellecontext{Further}%
haftmann
parents:
diff changeset
     4
%
haftmann
parents:
diff changeset
     5
\isadelimtheory
haftmann
parents:
diff changeset
     6
%
haftmann
parents:
diff changeset
     7
\endisadelimtheory
haftmann
parents:
diff changeset
     8
%
haftmann
parents:
diff changeset
     9
\isatagtheory
haftmann
parents:
diff changeset
    10
\isacommand{theory}\isamarkupfalse%
haftmann
parents:
diff changeset
    11
\ Further\isanewline
haftmann
parents:
diff changeset
    12
\isakeyword{imports}\ Setup\isanewline
haftmann
parents:
diff changeset
    13
\isakeyword{begin}%
haftmann
parents:
diff changeset
    14
\endisatagtheory
haftmann
parents:
diff changeset
    15
{\isafoldtheory}%
haftmann
parents:
diff changeset
    16
%
haftmann
parents:
diff changeset
    17
\isadelimtheory
haftmann
parents:
diff changeset
    18
%
haftmann
parents:
diff changeset
    19
\endisadelimtheory
haftmann
parents:
diff changeset
    20
%
haftmann
parents:
diff changeset
    21
\isamarkupsection{Further issues \label{sec:further}%
haftmann
parents:
diff changeset
    22
}
haftmann
parents:
diff changeset
    23
\isamarkuptrue%
haftmann
parents:
diff changeset
    24
%
haftmann
parents:
diff changeset
    25
\isamarkupsubsection{Further reading%
haftmann
parents:
diff changeset
    26
}
haftmann
parents:
diff changeset
    27
\isamarkuptrue%
haftmann
parents:
diff changeset
    28
%
haftmann
parents:
diff changeset
    29
\begin{isamarkuptext}%
34155
14aaccb399b3 Polishing up the English
paulson
parents: 31050
diff changeset
    30
To dive deeper into the issue of code generation, you should visit
14aaccb399b3 Polishing up the English
paulson
parents: 31050
diff changeset
    31
  the Isabelle/Isar Reference Manual \cite{isabelle-isar-ref}, which
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
    32
  contains exhaustive syntax diagrams.%
28447
haftmann
parents:
diff changeset
    33
\end{isamarkuptext}%
haftmann
parents:
diff changeset
    34
\isamarkuptrue%
haftmann
parents:
diff changeset
    35
%
37426
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    36
\isamarkupsubsection{Locales and interpretation%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    37
}
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    38
\isamarkuptrue%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    39
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    40
\begin{isamarkuptext}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    41
A technical issue comes to surface when generating code from
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    42
  specifications stemming from locale interpretation.
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    43
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    44
  Let us assume a locale specifying a power operation
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    45
  on arbitrary types:%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    46
\end{isamarkuptext}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    47
\isamarkuptrue%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    48
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    49
\isadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    50
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    51
\endisadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    52
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    53
\isatagquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    54
\isacommand{locale}\isamarkupfalse%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    55
\ power\ {\isacharequal}\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    56
\ \ \isakeyword{fixes}\ power\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}b\ {\isasymRightarrow}\ {\isacharprime}b{\isachardoublequoteclose}\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    57
\ \ \isakeyword{assumes}\ power{\isacharunderscore}commute{\isacharcolon}\ {\isachardoublequoteopen}power\ x\ {\isasymcirc}\ power\ y\ {\isacharequal}\ power\ y\ {\isasymcirc}\ power\ x{\isachardoublequoteclose}\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    58
\isakeyword{begin}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    59
\endisatagquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    60
{\isafoldquote}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    61
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    62
\isadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    63
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    64
\endisadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    65
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    66
\begin{isamarkuptext}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    67
\noindent Inside that locale we can lift \isa{power} to exponent lists
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    68
  by means of specification relative to that locale:%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    69
\end{isamarkuptext}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    70
\isamarkuptrue%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    71
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    72
\isadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    73
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    74
\endisadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    75
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    76
\isatagquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    77
\isacommand{primrec}\isamarkupfalse%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    78
\ powers\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}b\ {\isasymRightarrow}\ {\isacharprime}b{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    79
\ \ {\isachardoublequoteopen}powers\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ id{\isachardoublequoteclose}\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    80
{\isacharbar}\ {\isachardoublequoteopen}powers\ {\isacharparenleft}x\ {\isacharhash}\ xs{\isacharparenright}\ {\isacharequal}\ power\ x\ {\isasymcirc}\ powers\ xs{\isachardoublequoteclose}\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    81
\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    82
\isacommand{lemma}\isamarkupfalse%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    83
\ powers{\isacharunderscore}append{\isacharcolon}\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    84
\ \ {\isachardoublequoteopen}powers\ {\isacharparenleft}xs\ {\isacharat}\ ys{\isacharparenright}\ {\isacharequal}\ powers\ xs\ {\isasymcirc}\ powers\ ys{\isachardoublequoteclose}\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    85
\ \ \isacommand{by}\isamarkupfalse%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    86
\ {\isacharparenleft}induct\ xs{\isacharparenright}\ simp{\isacharunderscore}all\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    87
\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    88
\isacommand{lemma}\isamarkupfalse%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    89
\ powers{\isacharunderscore}power{\isacharcolon}\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    90
\ \ {\isachardoublequoteopen}powers\ xs\ {\isasymcirc}\ power\ x\ {\isacharequal}\ power\ x\ {\isasymcirc}\ powers\ xs{\isachardoublequoteclose}\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    91
\ \ \isacommand{by}\isamarkupfalse%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    92
\ {\isacharparenleft}induct\ xs{\isacharparenright}\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    93
\ \ \ \ {\isacharparenleft}simp{\isacharunderscore}all\ del{\isacharcolon}\ o{\isacharunderscore}apply\ id{\isacharunderscore}apply\ add{\isacharcolon}\ o{\isacharunderscore}assoc\ {\isacharbrackleft}symmetric{\isacharbrackright}{\isacharcomma}\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    94
\ \ \ \ \ \ simp\ del{\isacharcolon}\ o{\isacharunderscore}apply\ add{\isacharcolon}\ o{\isacharunderscore}assoc\ power{\isacharunderscore}commute{\isacharparenright}\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    95
\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    96
\isacommand{lemma}\isamarkupfalse%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    97
\ powers{\isacharunderscore}rev{\isacharcolon}\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    98
\ \ {\isachardoublequoteopen}powers\ {\isacharparenleft}rev\ xs{\isacharparenright}\ {\isacharequal}\ powers\ xs{\isachardoublequoteclose}\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
    99
\ \ \ \ \isacommand{by}\isamarkupfalse%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   100
\ {\isacharparenleft}induct\ xs{\isacharparenright}\ {\isacharparenleft}simp{\isacharunderscore}all\ add{\isacharcolon}\ powers{\isacharunderscore}append\ powers{\isacharunderscore}power{\isacharparenright}\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   101
\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   102
\isacommand{end}\isamarkupfalse%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   103
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   104
\endisatagquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   105
{\isafoldquote}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   106
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   107
\isadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   108
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   109
\endisadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   110
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   111
\begin{isamarkuptext}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   112
After an interpretation of this locale (say, \hyperlink{command.interpretation}{\mbox{\isa{\isacommand{interpretation}}}} \isa{fun{\isacharunderscore}power{\isacharcolon}} \isa{{\isachardoublequote}power\ {\isacharparenleft}{\isasymlambda}n\ {\isacharparenleft}f\ {\isacharcolon}{\isacharcolon}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a{\isacharparenright}{\isachardot}\ f\ {\isacharcircum}{\isacharcircum}\ n{\isacharparenright}{\isachardoublequote}}), one would expect to have a constant \isa{fun{\isacharunderscore}power{\isachardot}powers\ {\isacharcolon}{\isacharcolon}\ nat\ list\ {\isasymRightarrow}\ {\isacharparenleft}{\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a{\isacharparenright}\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a} for which code
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   113
  can be generated.  But this not the case: internally, the term
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   114
  \isa{fun{\isacharunderscore}power{\isachardot}powers} is an abbreviation for the foundational
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   115
  term \isa{{\isachardoublequote}power{\isachardot}powers\ {\isacharparenleft}{\isasymlambda}n\ {\isacharparenleft}f\ {\isacharcolon}{\isacharcolon}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a{\isacharparenright}{\isachardot}\ f\ {\isacharcircum}{\isacharcircum}\ n{\isacharparenright}{\isachardoublequote}}
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   116
  (see \cite{isabelle-locale} for the details behind).
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   117
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   118
  Furtunately, with minor effort the desired behaviour can be achieved.
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   119
  First, a dedicated definition of the constant on which the local \isa{powers}
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   120
  after interpretation is supposed to be mapped on:%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   121
\end{isamarkuptext}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   122
\isamarkuptrue%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   123
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   124
\isadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   125
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   126
\endisadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   127
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   128
\isatagquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   129
\isacommand{definition}\isamarkupfalse%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   130
\ funpows\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ list\ {\isasymRightarrow}\ {\isacharparenleft}{\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a{\isacharparenright}\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   131
\ \ {\isacharbrackleft}code\ del{\isacharbrackright}{\isacharcolon}\ {\isachardoublequoteopen}funpows\ {\isacharequal}\ power{\isachardot}powers\ {\isacharparenleft}{\isasymlambda}n\ f{\isachardot}\ f\ {\isacharcircum}{\isacharcircum}\ n{\isacharparenright}{\isachardoublequoteclose}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   132
\endisatagquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   133
{\isafoldquote}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   134
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   135
\isadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   136
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   137
\endisadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   138
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   139
\begin{isamarkuptext}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   140
\noindent In general, the pattern is \isa{c\ {\isacharequal}\ t} where \isa{c} is
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   141
  the name of the future constant and \isa{t} the foundational term
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   142
  corresponding to the local constant after interpretation.
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   143
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   144
  The interpretation itself is enriched with an equation \isa{t\ {\isacharequal}\ c}:%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   145
\end{isamarkuptext}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   146
\isamarkuptrue%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   147
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   148
\isadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   149
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   150
\endisadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   151
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   152
\isatagquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   153
\isacommand{interpretation}\isamarkupfalse%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   154
\ fun{\isacharunderscore}power{\isacharcolon}\ power\ {\isachardoublequoteopen}{\isasymlambda}n\ {\isacharparenleft}f\ {\isacharcolon}{\isacharcolon}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a{\isacharparenright}{\isachardot}\ f\ {\isacharcircum}{\isacharcircum}\ n{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   155
\ \ {\isachardoublequoteopen}power{\isachardot}powers\ {\isacharparenleft}{\isasymlambda}n\ f{\isachardot}\ f\ {\isacharcircum}{\isacharcircum}\ n{\isacharparenright}\ {\isacharequal}\ funpows{\isachardoublequoteclose}\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   156
\ \ \isacommand{by}\isamarkupfalse%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   157
\ unfold{\isacharunderscore}locales\isanewline
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   158
\ \ \ \ {\isacharparenleft}simp{\isacharunderscore}all\ add{\isacharcolon}\ expand{\isacharunderscore}fun{\isacharunderscore}eq\ funpow{\isacharunderscore}mult\ mult{\isacharunderscore}commute\ funpows{\isacharunderscore}def{\isacharparenright}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   159
\endisatagquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   160
{\isafoldquote}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   161
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   162
\isadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   163
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   164
\endisadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   165
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   166
\begin{isamarkuptext}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   167
\noindent This additional equation is trivially proved by the definition
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   168
  itself.
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   169
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   170
  After this setup procedure, code generation can continue as usual:%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   171
\end{isamarkuptext}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   172
\isamarkuptrue%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   173
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   174
\isadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   175
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   176
\endisadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   177
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   178
\isatagquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   179
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   180
\begin{isamarkuptext}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   181
\isatypewriter%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   182
\noindent%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   183
\hspace*{0pt}funpow ::~forall a.~Nat -> (a -> a) -> a -> a;\\
37432
e732b4f8fddf tuned documents
haftmann
parents: 37426
diff changeset
   184
\hspace*{0pt}funpow Zero{\char95}nat f = id;\\
37426
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   185
\hspace*{0pt}funpow (Suc n) f = f .~funpow n f;\\
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   186
\hspace*{0pt}\\
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   187
\hspace*{0pt}funpows ::~forall a.~[Nat] -> (a -> a) -> a -> a;\\
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   188
\hspace*{0pt}funpows [] = id;\\
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   189
\hspace*{0pt}funpows (x :~xs) = funpow x .~funpows xs;%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   190
\end{isamarkuptext}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   191
\isamarkuptrue%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   192
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   193
\endisatagquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   194
{\isafoldquote}%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   195
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   196
\isadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   197
%
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   198
\endisadelimquote
04d58897bf90 subsection on locale interpretation
haftmann
parents: 34155
diff changeset
   199
%
28447
haftmann
parents:
diff changeset
   200
\isamarkupsubsection{Modules%
haftmann
parents:
diff changeset
   201
}
haftmann
parents:
diff changeset
   202
\isamarkuptrue%
haftmann
parents:
diff changeset
   203
%
haftmann
parents:
diff changeset
   204
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   205
When invoking the \hyperlink{command.export-code}{\mbox{\isa{\isacommand{export{\isacharunderscore}code}}}} command it is possible to leave
haftmann
parents:
diff changeset
   206
  out the \hyperlink{keyword.module-name}{\mbox{\isa{\isakeyword{module{\isacharunderscore}name}}}} part;  then code is distributed over
haftmann
parents:
diff changeset
   207
  different modules, where the module name space roughly is induced
28635
cc53d2ab0170 filled remaining gaps
haftmann
parents: 28593
diff changeset
   208
  by the \isa{Isabelle} theory name space.
28447
haftmann
parents:
diff changeset
   209
haftmann
parents:
diff changeset
   210
  Then sometimes the awkward situation occurs that dependencies between
haftmann
parents:
diff changeset
   211
  definitions introduce cyclic dependencies between modules, which in the
haftmann
parents:
diff changeset
   212
  \isa{Haskell} world leaves you to the mercy of the \isa{Haskell} implementation
haftmann
parents:
diff changeset
   213
  you are using,  while for \isa{SML}/\isa{OCaml} code generation is not possible.
haftmann
parents:
diff changeset
   214
haftmann
parents:
diff changeset
   215
  A solution is to declare module names explicitly.
haftmann
parents:
diff changeset
   216
  Let use assume the three cyclically dependent
haftmann
parents:
diff changeset
   217
  modules are named \emph{A}, \emph{B} and \emph{C}.
haftmann
parents:
diff changeset
   218
  Then, by stating%
haftmann
parents:
diff changeset
   219
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   220
\isamarkuptrue%
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   221
%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   222
\isadelimquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   223
%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   224
\endisadelimquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   225
%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   226
\isatagquote
28447
haftmann
parents:
diff changeset
   227
\isacommand{code{\isacharunderscore}modulename}\isamarkupfalse%
haftmann
parents:
diff changeset
   228
\ SML\isanewline
haftmann
parents:
diff changeset
   229
\ \ A\ ABC\isanewline
haftmann
parents:
diff changeset
   230
\ \ B\ ABC\isanewline
haftmann
parents:
diff changeset
   231
\ \ C\ ABC%
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   232
\endisatagquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   233
{\isafoldquote}%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   234
%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   235
\isadelimquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   236
%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   237
\endisadelimquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   238
%
28447
haftmann
parents:
diff changeset
   239
\begin{isamarkuptext}%
34155
14aaccb399b3 Polishing up the English
paulson
parents: 31050
diff changeset
   240
\noindent
14aaccb399b3 Polishing up the English
paulson
parents: 31050
diff changeset
   241
  we explicitly map all those modules on \emph{ABC},
28447
haftmann
parents:
diff changeset
   242
  resulting in an ad-hoc merge of this three modules
haftmann
parents:
diff changeset
   243
  at serialisation time.%
haftmann
parents:
diff changeset
   244
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   245
\isamarkuptrue%
haftmann
parents:
diff changeset
   246
%
haftmann
parents:
diff changeset
   247
\isamarkupsubsection{Evaluation oracle%
haftmann
parents:
diff changeset
   248
}
haftmann
parents:
diff changeset
   249
\isamarkuptrue%
haftmann
parents:
diff changeset
   250
%
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   251
\begin{isamarkuptext}%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   252
Code generation may also be used to \emph{evaluate} expressions
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   253
  (using \isa{SML} as target language of course).
34155
14aaccb399b3 Polishing up the English
paulson
parents: 31050
diff changeset
   254
  For instance, the \hyperlink{command.value}{\mbox{\isa{\isacommand{value}}}} reduces an expression to a
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   255
  normal form with respect to the underlying code equations:%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   256
\end{isamarkuptext}%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   257
\isamarkuptrue%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   258
%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   259
\isadelimquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   260
%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   261
\endisadelimquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   262
%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   263
\isatagquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   264
\isacommand{value}\isamarkupfalse%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   265
\ {\isachardoublequoteopen}{\isadigit{4}}{\isadigit{2}}\ {\isacharslash}\ {\isacharparenleft}{\isadigit{1}}{\isadigit{2}}\ {\isacharcolon}{\isacharcolon}\ rat{\isacharparenright}{\isachardoublequoteclose}%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   266
\endisatagquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   267
{\isafoldquote}%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   268
%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   269
\isadelimquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   270
%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   271
\endisadelimquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   272
%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   273
\begin{isamarkuptext}%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   274
\noindent will display \isa{{\isadigit{7}}\ {\isacharslash}\ {\isadigit{2}}}.
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   275
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   276
  The \hyperlink{method.eval}{\mbox{\isa{eval}}} method tries to reduce a goal by code generation to \isa{True}
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   277
  and solves it in that case, but fails otherwise:%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   278
\end{isamarkuptext}%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   279
\isamarkuptrue%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   280
%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   281
\isadelimquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   282
%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   283
\endisadelimquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   284
%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   285
\isatagquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   286
\isacommand{lemma}\isamarkupfalse%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   287
\ {\isachardoublequoteopen}{\isadigit{4}}{\isadigit{2}}\ {\isacharslash}\ {\isacharparenleft}{\isadigit{1}}{\isadigit{2}}\ {\isacharcolon}{\isacharcolon}\ rat{\isacharparenright}\ {\isacharequal}\ {\isadigit{7}}\ {\isacharslash}\ {\isadigit{2}}{\isachardoublequoteclose}\isanewline
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   288
\ \ \isacommand{by}\isamarkupfalse%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   289
\ eval%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   290
\endisatagquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   291
{\isafoldquote}%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   292
%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   293
\isadelimquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   294
%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   295
\endisadelimquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   296
%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   297
\begin{isamarkuptext}%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   298
\noindent The soundness of the \hyperlink{method.eval}{\mbox{\isa{eval}}} method depends crucially 
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   299
  on the correctness of the code generator;  this is one of the reasons
31050
555b56b66fcf adaptation replaces adaption
haftmann
parents: 30880
diff changeset
   300
  why you should not use adaptation (see \secref{sec:adaptation}) frivolously.%
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   301
\end{isamarkuptext}%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   302
\isamarkuptrue%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   303
%
28447
haftmann
parents:
diff changeset
   304
\isamarkupsubsection{Code antiquotation%
haftmann
parents:
diff changeset
   305
}
haftmann
parents:
diff changeset
   306
\isamarkuptrue%
haftmann
parents:
diff changeset
   307
%
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   308
\begin{isamarkuptext}%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   309
In scenarios involving techniques like reflection it is quite common
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   310
  that code generated from a theory forms the basis for implementing
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   311
  a proof procedure in \isa{SML}.  To facilitate interfacing of generated code
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   312
  with system code, the code generator provides a \isa{code} antiquotation:%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   313
\end{isamarkuptext}%
28447
haftmann
parents:
diff changeset
   314
\isamarkuptrue%
haftmann
parents:
diff changeset
   315
%
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   316
\isadelimquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   317
%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   318
\endisadelimquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   319
%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   320
\isatagquote
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   321
\isacommand{datatype}\isamarkupfalse%
30880
257cbe43faa8 tuned manual
haftmann
parents: 30227
diff changeset
   322
\ form\ {\isacharequal}\ T\ {\isacharbar}\ F\ {\isacharbar}\ And\ form\ form\ {\isacharbar}\ Or\ form\ form\ %
30227
853abb4853cc tuned manuals
haftmann
parents: 30226
diff changeset
   323
\endisatagquote
853abb4853cc tuned manuals
haftmann
parents: 30226
diff changeset
   324
{\isafoldquote}%
853abb4853cc tuned manuals
haftmann
parents: 30226
diff changeset
   325
%
853abb4853cc tuned manuals
haftmann
parents: 30226
diff changeset
   326
\isadelimquote
853abb4853cc tuned manuals
haftmann
parents: 30226
diff changeset
   327
%
853abb4853cc tuned manuals
haftmann
parents: 30226
diff changeset
   328
\endisadelimquote
853abb4853cc tuned manuals
haftmann
parents: 30226
diff changeset
   329
%
853abb4853cc tuned manuals
haftmann
parents: 30226
diff changeset
   330
\isadelimquotett
30880
257cbe43faa8 tuned manual
haftmann
parents: 30227
diff changeset
   331
\ %
30227
853abb4853cc tuned manuals
haftmann
parents: 30226
diff changeset
   332
\endisadelimquotett
853abb4853cc tuned manuals
haftmann
parents: 30226
diff changeset
   333
%
853abb4853cc tuned manuals
haftmann
parents: 30226
diff changeset
   334
\isatagquotett
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   335
\isacommand{ML}\isamarkupfalse%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   336
\ {\isacharverbatimopen}\isanewline
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   337
\ \ fun\ eval{\isacharunderscore}form\ %
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   338
\isaantiq
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   339
code\ T%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   340
\endisaantiq
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   341
\ {\isacharequal}\ true\isanewline
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   342
\ \ \ \ {\isacharbar}\ eval{\isacharunderscore}form\ %
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   343
\isaantiq
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   344
code\ F%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   345
\endisaantiq
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   346
\ {\isacharequal}\ false\isanewline
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   347
\ \ \ \ {\isacharbar}\ eval{\isacharunderscore}form\ {\isacharparenleft}%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   348
\isaantiq
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   349
code\ And%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   350
\endisaantiq
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   351
\ {\isacharparenleft}p{\isacharcomma}\ q{\isacharparenright}{\isacharparenright}\ {\isacharequal}\isanewline
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   352
\ \ \ \ \ \ \ \ eval{\isacharunderscore}form\ p\ andalso\ eval{\isacharunderscore}form\ q\isanewline
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   353
\ \ \ \ {\isacharbar}\ eval{\isacharunderscore}form\ {\isacharparenleft}%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   354
\isaantiq
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   355
code\ Or%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   356
\endisaantiq
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   357
\ {\isacharparenleft}p{\isacharcomma}\ q{\isacharparenright}{\isacharparenright}\ {\isacharequal}\isanewline
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   358
\ \ \ \ \ \ \ \ eval{\isacharunderscore}form\ p\ orelse\ eval{\isacharunderscore}form\ q{\isacharsemicolon}\isanewline
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   359
{\isacharverbatimclose}%
30227
853abb4853cc tuned manuals
haftmann
parents: 30226
diff changeset
   360
\endisatagquotett
853abb4853cc tuned manuals
haftmann
parents: 30226
diff changeset
   361
{\isafoldquotett}%
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   362
%
30227
853abb4853cc tuned manuals
haftmann
parents: 30226
diff changeset
   363
\isadelimquotett
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   364
%
30227
853abb4853cc tuned manuals
haftmann
parents: 30226
diff changeset
   365
\endisadelimquotett
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   366
%
28447
haftmann
parents:
diff changeset
   367
\begin{isamarkuptext}%
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   368
\noindent \isa{code} takes as argument the name of a constant;  after the
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   369
  whole \isa{SML} is read, the necessary code is generated transparently
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   370
  and the corresponding constant names are inserted.  This technique also
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   371
  allows to use pattern matching on constructors stemming from compiled
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   372
  \isa{datatypes}.
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   373
29798
6df726203e39 proper datatype abstraction example
haftmann
parents: 28635
diff changeset
   374
  For a less simplistic example, theory \hyperlink{theory.Ferrack}{\mbox{\isa{Ferrack}}} is
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   375
  a good reference.%
28447
haftmann
parents:
diff changeset
   376
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   377
\isamarkuptrue%
haftmann
parents:
diff changeset
   378
%
haftmann
parents:
diff changeset
   379
\isamarkupsubsection{Imperative data structures%
haftmann
parents:
diff changeset
   380
}
haftmann
parents:
diff changeset
   381
\isamarkuptrue%
haftmann
parents:
diff changeset
   382
%
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   383
\begin{isamarkuptext}%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   384
If you consider imperative data structures as inevitable for a specific
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   385
  application, you should consider
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   386
  \emph{Imperative Functional Programming with Isabelle/HOL}
34155
14aaccb399b3 Polishing up the English
paulson
parents: 31050
diff changeset
   387
  \cite{bulwahn-et-al:2008:imperative};
28593
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   388
  the framework described there is available in theory \hyperlink{theory.Imperative-HOL}{\mbox{\isa{Imperative{\isacharunderscore}HOL}}}.%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   389
\end{isamarkuptext}%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   390
\isamarkuptrue%
f087237af65d continued codegen tutorial
haftmann
parents: 28447
diff changeset
   391
%
28447
haftmann
parents:
diff changeset
   392
\isadelimtheory
haftmann
parents:
diff changeset
   393
%
haftmann
parents:
diff changeset
   394
\endisadelimtheory
haftmann
parents:
diff changeset
   395
%
haftmann
parents:
diff changeset
   396
\isatagtheory
haftmann
parents:
diff changeset
   397
\isacommand{end}\isamarkupfalse%
haftmann
parents:
diff changeset
   398
%
haftmann
parents:
diff changeset
   399
\endisatagtheory
haftmann
parents:
diff changeset
   400
{\isafoldtheory}%
haftmann
parents:
diff changeset
   401
%
haftmann
parents:
diff changeset
   402
\isadelimtheory
haftmann
parents:
diff changeset
   403
%
haftmann
parents:
diff changeset
   404
\endisadelimtheory
haftmann
parents:
diff changeset
   405
\isanewline
haftmann
parents:
diff changeset
   406
\end{isabellebody}%
haftmann
parents:
diff changeset
   407
%%% Local Variables:
haftmann
parents:
diff changeset
   408
%%% mode: latex
haftmann
parents:
diff changeset
   409
%%% TeX-master: "root"
haftmann
parents:
diff changeset
   410
%%% End: