doc-src/IsarAdvanced/Codegen/Thy/document/Codegen.tex
author haftmann
Tue, 15 Jul 2008 16:02:07 +0200
changeset 27609 b23c9ad0fe7d
parent 27557 151731493264
child 28143 e5c6c4aac52c
permissions -rw-r--r--
tuned code theorem bookkeeping
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
     1
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
     2
\begin{isabellebody}%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
     3
\def\isabellecontext{Codegen}%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
     4
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
     5
\isadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
     6
\isanewline
26513
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 25870
diff changeset
     7
\isanewline
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
     8
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
     9
\endisadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    10
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    11
\isatagtheory
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    12
%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    13
\endisatagtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    14
{\isafoldtheory}%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    15
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    16
\isadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    17
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    18
\endisadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    19
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    20
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    21
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    22
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    23
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    24
\isatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    25
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    26
\endisatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    27
{\isafoldML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    28
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    29
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    30
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    31
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    32
%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    33
\isamarkupchapter{Code generation from Isabelle theories%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    34
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    35
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    36
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    37
\isamarkupsection{Introduction%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    38
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    39
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    40
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    41
\isamarkupsubsection{Motivation%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    42
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    43
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    44
%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    45
\begin{isamarkuptext}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    46
Executing formal specifications as programs is a well-established
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    47
  topic in the theorem proving community.  With increasing
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    48
  application of theorem proving systems in the area of
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    49
  software development and verification, its relevance manifests
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    50
  for running test cases and rapid prototyping.  In logical
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    51
  calculi like constructive type theory,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    52
  a notion of executability is implicit due to the nature
22550
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
    53
  of the calculus.  In contrast, specifications in Isabelle
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    54
  can be highly non-executable.  In order to bridge
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    55
  the gap between logic and executable specifications,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    56
  an explicit non-trivial transformation has to be applied:
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    57
  code generation.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    58
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    59
  This tutorial introduces a generic code generator for the
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    60
  Isabelle system \cite{isa-tutorial}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    61
  Generic in the sense that the
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    62
  \qn{target language} for which code shall ultimately be
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    63
  generated is not fixed but may be an arbitrary state-of-the-art
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    64
  functional programming language (currently, the implementation
22550
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
    65
  supports SML \cite{SML}, OCaml \cite{OCaml} and Haskell
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
    66
  \cite{haskell-revised-report}).
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    67
  We aim to provide a
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    68
  versatile environment
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    69
  suitable for software development and verification,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    70
  structuring the process
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    71
  of code generation into a small set of orthogonal principles
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    72
  while achieving a big coverage of application areas
21348
haftmann
parents: 21186
diff changeset
    73
  with maximum flexibility.
haftmann
parents: 21186
diff changeset
    74
22550
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
    75
  Conceptually the code generator framework is part
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
    76
  of Isabelle's \isa{Pure} meta logic; the object logic
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
    77
  \isa{HOL} which is an extension of \isa{Pure}
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
    78
  already comes with a reasonable framework setup and thus provides
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
    79
  a good working horse for raising code-generation-driven
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
    80
  applications.  So, we assume some familiarity and experience
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
    81
  with the ingredients of the \isa{HOL} \emph{Main} theory
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
    82
  (see also \cite{isa-tutorial}).%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    83
\end{isamarkuptext}%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    84
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
    85
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    86
\isamarkupsubsection{Overview%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    87
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    88
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    89
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    90
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    91
The code generator aims to be usable with no further ado
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    92
  in most cases while allowing for detailed customization.
22550
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
    93
  This manifests in the structure of this tutorial:
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
    94
  we start with a generic example \secref{sec:example}
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
    95
  and introduce code generation concepts \secref{sec:concept}.
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
    96
  Section
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
    97
  \secref{sec:basics} explains how to use the framework naively,
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    98
  presuming a reasonable default setup.  Then, section
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
    99
  \secref{sec:advanced} deals with advanced topics,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   100
  introducing further aspects of the code generator framework
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   101
  in a motivation-driven manner.  Last, section \secref{sec:ml}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   102
  introduces the framework's internal programming interfaces.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   103
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   104
  \begin{warn}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   105
    Ultimately, the code generator which this tutorial deals with
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   106
    is supposed to replace the already established code generator
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   107
    by Stefan Berghofer \cite{Berghofer-Nipkow:2002}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   108
    So, for the moment, there are two distinct code generators
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   109
    in Isabelle.
22916
haftmann
parents: 22885
diff changeset
   110
    Also note that while the framework itself is
22550
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   111
    object-logic independent, only \isa{HOL} provides a reasonable
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   112
    framework setup.    
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   113
  \end{warn}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   114
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   115
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   116
%
22550
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   117
\isamarkupsection{An example: a simple theory of search trees \label{sec:example}%
22479
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   118
}
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   119
\isamarkuptrue%
22550
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   120
%
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   121
\begin{isamarkuptext}%
22916
haftmann
parents: 22885
diff changeset
   122
When writing executable specifications using \isa{HOL},
haftmann
parents: 22885
diff changeset
   123
  it is convenient to use
22550
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   124
  three existing packages: the datatype package for defining
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   125
  datatypes, the function package for (recursive) functions,
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   126
  and the class package for overloaded definitions.
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   127
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   128
  We develope a small theory of search trees; trees are represented
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   129
  as a datatype with key type \isa{{\isacharprime}a} and value type \isa{{\isacharprime}b}:%
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   130
\end{isamarkuptext}%
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   131
\isamarkuptrue%
22479
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   132
\isacommand{datatype}\isamarkupfalse%
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   133
\ {\isacharparenleft}{\isacharprime}a{\isacharcomma}\ {\isacharprime}b{\isacharparenright}\ searchtree\ {\isacharequal}\ Leaf\ {\isachardoublequoteopen}{\isacharprime}a{\isasymColon}linorder{\isachardoublequoteclose}\ {\isacharprime}b\isanewline
22550
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   134
\ \ {\isacharbar}\ Branch\ {\isachardoublequoteopen}{\isacharparenleft}{\isacharprime}a{\isacharcomma}\ {\isacharprime}b{\isacharparenright}\ searchtree{\isachardoublequoteclose}\ {\isachardoublequoteopen}{\isacharprime}a{\isachardoublequoteclose}\ {\isachardoublequoteopen}{\isacharparenleft}{\isacharprime}a{\isacharcomma}\ {\isacharprime}b{\isacharparenright}\ searchtree{\isachardoublequoteclose}%
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   135
\begin{isamarkuptext}%
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   136
\noindent Note that we have constrained the type of keys
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   137
  to the class of total orders, \isa{linorder}.
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   138
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   139
  We define \isa{find} and \isa{update} functions:%
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   140
\end{isamarkuptext}%
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   141
\isamarkuptrue%
25870
haftmann
parents: 25731
diff changeset
   142
\isacommand{primrec}\isamarkupfalse%
22479
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   143
\isanewline
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   144
\ \ find\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharparenleft}{\isacharprime}a{\isasymColon}linorder{\isacharcomma}\ {\isacharprime}b{\isacharparenright}\ searchtree\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}b\ option{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   145
\ \ {\isachardoublequoteopen}find\ {\isacharparenleft}Leaf\ key\ val{\isacharparenright}\ it\ {\isacharequal}\ {\isacharparenleft}if\ it\ {\isacharequal}\ key\ then\ Some\ val\ else\ None{\isacharparenright}{\isachardoublequoteclose}\isanewline
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   146
\ \ {\isacharbar}\ {\isachardoublequoteopen}find\ {\isacharparenleft}Branch\ t{\isadigit{1}}\ key\ t{\isadigit{2}}{\isacharparenright}\ it\ {\isacharequal}\ {\isacharparenleft}if\ it\ {\isasymle}\ key\ then\ find\ t{\isadigit{1}}\ it\ else\ find\ t{\isadigit{2}}\ it{\isacharparenright}{\isachardoublequoteclose}\isanewline
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   147
\isanewline
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   148
\isacommand{fun}\isamarkupfalse%
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   149
\isanewline
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   150
\ \ update\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a{\isasymColon}linorder\ {\isasymtimes}\ {\isacharprime}b\ {\isasymRightarrow}\ {\isacharparenleft}{\isacharprime}a{\isacharcomma}\ {\isacharprime}b{\isacharparenright}\ searchtree\ {\isasymRightarrow}\ {\isacharparenleft}{\isacharprime}a{\isacharcomma}\ {\isacharprime}b{\isacharparenright}\ searchtree{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   151
\ \ {\isachardoublequoteopen}update\ {\isacharparenleft}it{\isacharcomma}\ entry{\isacharparenright}\ {\isacharparenleft}Leaf\ key\ val{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}\isanewline
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   152
\ \ \ \ if\ it\ {\isacharequal}\ key\ then\ Leaf\ key\ entry\isanewline
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   153
\ \ \ \ \ \ else\ if\ it\ {\isasymle}\ key\isanewline
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   154
\ \ \ \ \ \ then\ Branch\ {\isacharparenleft}Leaf\ it\ entry{\isacharparenright}\ it\ {\isacharparenleft}Leaf\ key\ val{\isacharparenright}\isanewline
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   155
\ \ \ \ \ \ else\ Branch\ {\isacharparenleft}Leaf\ key\ val{\isacharparenright}\ it\ {\isacharparenleft}Leaf\ it\ entry{\isacharparenright}\isanewline
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   156
\ \ \ {\isacharparenright}{\isachardoublequoteclose}\isanewline
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   157
\ \ {\isacharbar}\ {\isachardoublequoteopen}update\ {\isacharparenleft}it{\isacharcomma}\ entry{\isacharparenright}\ {\isacharparenleft}Branch\ t{\isadigit{1}}\ key\ t{\isadigit{2}}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}\isanewline
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   158
\ \ \ \ if\ it\ {\isasymle}\ key\isanewline
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   159
\ \ \ \ \ \ then\ {\isacharparenleft}Branch\ {\isacharparenleft}update\ {\isacharparenleft}it{\isacharcomma}\ entry{\isacharparenright}\ t{\isadigit{1}}{\isacharparenright}\ key\ t{\isadigit{2}}{\isacharparenright}\isanewline
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   160
\ \ \ \ \ \ else\ {\isacharparenleft}Branch\ t{\isadigit{1}}\ key\ {\isacharparenleft}update\ {\isacharparenleft}it{\isacharcomma}\ entry{\isacharparenright}\ t{\isadigit{2}}{\isacharparenright}{\isacharparenright}\isanewline
22550
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   161
\ \ \ {\isacharparenright}{\isachardoublequoteclose}%
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   162
\begin{isamarkuptext}%
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   163
\noindent For testing purpose, we define a small example
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   164
  using natural numbers \isa{nat} (which are a \isa{linorder})
23132
ae52b82dc5d8 updated
haftmann
parents: 23016
diff changeset
   165
  as keys and list of nats as values:%
22550
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   166
\end{isamarkuptext}%
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   167
\isamarkuptrue%
23132
ae52b82dc5d8 updated
haftmann
parents: 23016
diff changeset
   168
\isacommand{definition}\isamarkupfalse%
22479
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   169
\isanewline
23132
ae52b82dc5d8 updated
haftmann
parents: 23016
diff changeset
   170
\ \ example\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharparenleft}nat{\isacharcomma}\ nat\ list{\isacharparenright}\ searchtree{\isachardoublequoteclose}\isanewline
ae52b82dc5d8 updated
haftmann
parents: 23016
diff changeset
   171
\isakeyword{where}\isanewline
ae52b82dc5d8 updated
haftmann
parents: 23016
diff changeset
   172
\ \ {\isachardoublequoteopen}example\ {\isacharequal}\ update\ {\isacharparenleft}Suc\ {\isacharparenleft}Suc\ {\isacharparenleft}Suc\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}{\isacharparenright}{\isacharparenright}{\isacharcomma}\ {\isacharbrackleft}Suc\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}{\isacharcomma}\ Suc\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}{\isacharbrackright}{\isacharparenright}\ {\isacharparenleft}update\ {\isacharparenleft}Suc\ {\isacharparenleft}Suc\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}{\isacharparenright}{\isacharcomma}\ {\isacharbrackleft}Suc\ {\isacharparenleft}Suc\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}{\isacharparenright}{\isacharbrackright}{\isacharparenright}\isanewline
ae52b82dc5d8 updated
haftmann
parents: 23016
diff changeset
   173
\ \ \ \ {\isacharparenleft}update\ {\isacharparenleft}Suc\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}{\isacharcomma}\ {\isacharbrackleft}Suc\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}{\isacharbrackright}{\isacharparenright}\ {\isacharparenleft}Leaf\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}%
22550
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   174
\begin{isamarkuptext}%
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   175
\noindent Then we generate code%
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   176
\end{isamarkuptext}%
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   177
\isamarkuptrue%
24379
823ffe1fdf67 updated
haftmann
parents: 24279
diff changeset
   178
\isacommand{export{\isacharunderscore}code}\isamarkupfalse%
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   179
\ example\ \isakeyword{in}\ SML\ \isakeyword{file}\ {\isachardoublequoteopen}examples{\isacharslash}tree{\isachardot}ML{\isachardoublequoteclose}%
22479
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   180
\begin{isamarkuptext}%
22550
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   181
\noindent which looks like:
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   182
  \lstsml{Thy/examples/tree.ML}%
22479
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   183
\end{isamarkuptext}%
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   184
\isamarkuptrue%
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   185
%
22550
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   186
\isamarkupsection{Code generation concepts and process \label{sec:concept}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   187
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   188
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   189
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   190
\begin{isamarkuptext}%
21348
haftmann
parents: 21186
diff changeset
   191
\begin{figure}[h]
haftmann
parents: 21186
diff changeset
   192
  \centering
haftmann
parents: 21186
diff changeset
   193
  \includegraphics[width=0.7\textwidth]{codegen_process}
haftmann
parents: 21186
diff changeset
   194
  \caption{code generator -- processing overview}
haftmann
parents: 21186
diff changeset
   195
  \label{fig:process}
haftmann
parents: 21186
diff changeset
   196
  \end{figure}
haftmann
parents: 21186
diff changeset
   197
haftmann
parents: 21186
diff changeset
   198
  The code generator employs a notion of executability
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   199
  for three foundational executable ingredients known
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   200
  from functional programming:
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   201
  \emph{defining equations}, \emph{datatypes}, and
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   202
  \emph{type classes}. A defining equation as a first approximation
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   203
  is a theorem of the form \isa{f\ t\isactrlisub {\isadigit{1}}\ t\isactrlisub {\isadigit{2}}\ {\isasymdots}\ t\isactrlisub n\ {\isasymequiv}\ t}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   204
  (an equation headed by a constant \isa{f} with arguments
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   205
  \isa{t\isactrlisub {\isadigit{1}}\ t\isactrlisub {\isadigit{2}}\ {\isasymdots}\ t\isactrlisub n} and right hand side \isa{t}).
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   206
  Code generation aims to turn defining equations
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   207
  into a functional program by running through
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   208
  a process (see figure \ref{fig:process}):
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   209
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   210
  \begin{itemize}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   211
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   212
    \item Out of the vast collection of theorems proven in a
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   213
      \qn{theory}, a reasonable subset modeling
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   214
      defining equations is \qn{selected}.
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   215
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   216
    \item On those selected theorems, certain
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   217
      transformations are carried out
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   218
      (\qn{preprocessing}).  Their purpose is to turn theorems
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   219
      representing non- or badly executable
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   220
      specifications into equivalent but executable counterparts.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   221
      The result is a structured collection of \qn{code theorems}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   222
22479
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   223
    \item These \qn{code theorems} then are \qn{translated}
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   224
      into an Haskell-like intermediate
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   225
      language.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   226
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   227
    \item Finally, out of the intermediate language the final
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   228
      code in the desired \qn{target language} is \qn{serialized}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   229
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   230
  \end{itemize}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   231
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   232
  From these steps, only the two last are carried out
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   233
  outside the logic; by keeping this layer as
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   234
  thin as possible, the amount of code to trust is
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   235
  kept to a minimum.%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   236
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   237
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   238
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   239
\isamarkupsection{Basics \label{sec:basics}%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   240
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   241
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   242
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   243
\isamarkupsubsection{Invoking the code generator%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   244
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   245
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   246
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   247
\begin{isamarkuptext}%
22916
haftmann
parents: 22885
diff changeset
   248
Thanks to a reasonable setup of the \isa{HOL} theories, in
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   249
  most cases code generation proceeds without further ado:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   250
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   251
\isamarkuptrue%
25870
haftmann
parents: 25731
diff changeset
   252
\isacommand{primrec}\isamarkupfalse%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   253
\isanewline
22479
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   254
\ \ fac\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   255
\ \ \ \ {\isachardoublequoteopen}fac\ {\isadigit{0}}\ {\isacharequal}\ {\isadigit{1}}{\isachardoublequoteclose}\isanewline
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   256
\ \ {\isacharbar}\ {\isachardoublequoteopen}fac\ {\isacharparenleft}Suc\ n{\isacharparenright}\ {\isacharequal}\ Suc\ n\ {\isacharasterisk}\ fac\ n{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   257
\begin{isamarkuptext}%
22550
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   258
\noindent This executable specification is now turned to SML code:%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   259
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   260
\isamarkuptrue%
24379
823ffe1fdf67 updated
haftmann
parents: 24279
diff changeset
   261
\isacommand{export{\isacharunderscore}code}\isamarkupfalse%
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   262
\ fac\ \isakeyword{in}\ SML\ \isakeyword{file}\ {\isachardoublequoteopen}examples{\isacharslash}fac{\isachardot}ML{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   263
\begin{isamarkuptext}%
24379
823ffe1fdf67 updated
haftmann
parents: 24279
diff changeset
   264
\noindent  The \isa{{\isasymEXPORTCODE}} command takes a space-separated list of
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   265
  constants together with \qn{serialization directives}
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   266
  These start with a \qn{target language}
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   267
  identifier, followed by a file specification
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   268
  where to write the generated code to.
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   269
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   270
  Internally, the defining equations for all selected
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   271
  constants are taken, including any transitively required
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   272
  constants, datatypes and classes, resulting in the following
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   273
  code:
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   274
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   275
  \lstsml{Thy/examples/fac.ML}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   276
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   277
  The code generator will complain when a required
22550
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   278
  ingredient does not provide a executable counterpart,
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   279
  e.g.~generating code
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   280
  for constants not yielding
22550
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   281
  a defining equation (e.g.~the Hilbert choice
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   282
  operation \isa{SOME}):%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   283
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   284
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   285
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   286
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   287
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   288
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   289
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   290
\isatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   291
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   292
\endisatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   293
{\isafoldML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   294
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   295
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   296
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   297
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   298
\isacommand{definition}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   299
\isanewline
21993
4b802a9e0738 updated manual
haftmann
parents: 21452
diff changeset
   300
\ \ pick{\isacharunderscore}some\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   301
\ \ {\isachardoublequoteopen}pick{\isacharunderscore}some\ xs\ {\isacharequal}\ {\isacharparenleft}SOME\ x{\isachardot}\ x\ {\isasymin}\ set\ xs{\isacharparenright}{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   302
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   303
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   304
\endisadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   305
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   306
\isatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   307
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   308
\endisatagML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   309
{\isafoldML}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   310
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   311
\isadelimML
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   312
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   313
\endisadelimML
25870
haftmann
parents: 25731
diff changeset
   314
\isanewline
24379
823ffe1fdf67 updated
haftmann
parents: 24279
diff changeset
   315
\isacommand{export{\isacharunderscore}code}\isamarkupfalse%
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   316
\ pick{\isacharunderscore}some\ \isakeyword{in}\ SML\ \isakeyword{file}\ {\isachardoublequoteopen}examples{\isacharslash}fail{\isacharunderscore}const{\isachardot}ML{\isachardoublequoteclose}%
22550
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   317
\begin{isamarkuptext}%
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   318
\noindent will fail.%
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   319
\end{isamarkuptext}%
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   320
\isamarkuptrue%
c5039bee2602 updated
haftmann
parents: 22479
diff changeset
   321
%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   322
\isamarkupsubsection{Theorem selection%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   323
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   324
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   325
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   326
\begin{isamarkuptext}%
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   327
The list of all defining equations in a theory may be inspected
22292
3b118010ec08 adjusted to new code generator Isar commands and changes in implementation
haftmann
parents: 22188
diff changeset
   328
  using the \isa{{\isasymPRINTCODESETUP}} command:%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   329
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   330
\isamarkuptrue%
22292
3b118010ec08 adjusted to new code generator Isar commands and changes in implementation
haftmann
parents: 22188
diff changeset
   331
\isacommand{print{\isacharunderscore}codesetup}\isamarkupfalse%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   332
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   333
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   334
\noindent which displays a table of constant with corresponding
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   335
  defining equations (the additional stuff displayed
22751
1bfd75c1f232 updated
haftmann
parents: 22550
diff changeset
   336
  shall not bother us for the moment).
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   337
22916
haftmann
parents: 22885
diff changeset
   338
  The typical \isa{HOL} tools are already set up in a way that
22751
1bfd75c1f232 updated
haftmann
parents: 22550
diff changeset
   339
  function definitions introduced by \isa{{\isasymDEFINITION}},
25870
haftmann
parents: 25731
diff changeset
   340
  \isa{{\isasymPRIMREC}}, \isa{{\isasymFUN}},
haftmann
parents: 25731
diff changeset
   341
  \isa{{\isasymFUNCTION}}, \isa{{\isasymCONSTDEFS}},
21348
haftmann
parents: 21186
diff changeset
   342
  \isa{{\isasymRECDEF}} are implicitly propagated
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   343
  to this defining equation table. Specific theorems may be
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   344
  selected using an attribute: \emph{code func}. As example,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   345
  a weight selector function:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   346
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   347
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   348
\isacommand{primrec}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   349
\isanewline
25870
haftmann
parents: 25731
diff changeset
   350
\ \ pick\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharparenleft}nat\ {\isasymtimes}\ {\isacharprime}a{\isacharparenright}\ list\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   351
\ \ {\isachardoublequoteopen}pick\ {\isacharparenleft}x{\isacharhash}xs{\isacharparenright}\ n\ {\isacharequal}\ {\isacharparenleft}let\ {\isacharparenleft}k{\isacharcomma}\ v{\isacharparenright}\ {\isacharequal}\ x\ in\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   352
\ \ \ \ if\ n\ {\isacharless}\ k\ then\ v\ else\ pick\ xs\ {\isacharparenleft}n\ {\isacharminus}\ k{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   353
\begin{isamarkuptext}%
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   354
\noindent We want to eliminate the explicit destruction
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   355
  of \isa{x} to \isa{{\isacharparenleft}k{\isacharcomma}\ v{\isacharparenright}}:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   356
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   357
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   358
\isacommand{lemma}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   359
\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   360
\ \ {\isachardoublequoteopen}pick\ {\isacharparenleft}{\isacharparenleft}k{\isacharcomma}\ v{\isacharparenright}{\isacharhash}xs{\isacharparenright}\ n\ {\isacharequal}\ {\isacharparenleft}if\ n\ {\isacharless}\ k\ then\ v\ else\ pick\ xs\ {\isacharparenleft}n\ {\isacharminus}\ k{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   361
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   362
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   363
\ \ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   364
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   365
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   366
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   367
\isacommand{by}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   368
\ simp%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   369
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   370
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   371
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   372
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   373
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   374
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   375
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   376
\isanewline
24379
823ffe1fdf67 updated
haftmann
parents: 24279
diff changeset
   377
\isacommand{export{\isacharunderscore}code}\isamarkupfalse%
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   378
\ pick\ \ \isakeyword{in}\ SML\ \isakeyword{file}\ {\isachardoublequoteopen}examples{\isacharslash}pick{\isadigit{1}}{\isachardot}ML{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   379
\begin{isamarkuptext}%
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   380
\noindent This theorem now is used for generating code:
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   381
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   382
  \lstsml{Thy/examples/pick1.ML}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   383
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   384
  \noindent It might be convenient to remove the pointless original
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   385
  equation, using the \emph{func del} attribute:%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   386
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   387
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   388
\isacommand{lemmas}\isamarkupfalse%
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   389
\ {\isacharbrackleft}code\ func\ del{\isacharbrackright}\ {\isacharequal}\ pick{\isachardot}simps\ \isanewline
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   390
\isanewline
24379
823ffe1fdf67 updated
haftmann
parents: 24279
diff changeset
   391
\isacommand{export{\isacharunderscore}code}\isamarkupfalse%
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   392
\ pick\ \ \isakeyword{in}\ SML\ \isakeyword{file}\ {\isachardoublequoteopen}examples{\isacharslash}pick{\isadigit{2}}{\isachardot}ML{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   393
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   394
\lstsml{Thy/examples/pick2.ML}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   395
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   396
  \noindent Syntactic redundancies are implicitly dropped. For example,
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   397
  using a modified version of the \isa{fac} function
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   398
  as defining equation, the then redundant (since
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   399
  syntactically subsumed) original defining equations
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   400
  are dropped, resulting in a warning:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   401
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   402
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   403
\isacommand{lemma}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   404
\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   405
\ \ {\isachardoublequoteopen}fac\ n\ {\isacharequal}\ {\isacharparenleft}case\ n\ of\ {\isadigit{0}}\ {\isasymRightarrow}\ {\isadigit{1}}\ {\isacharbar}\ Suc\ m\ {\isasymRightarrow}\ n\ {\isacharasterisk}\ fac\ m{\isacharparenright}{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   406
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   407
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   408
\ \ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   409
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   410
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   411
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   412
\isacommand{by}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   413
\ {\isacharparenleft}cases\ n{\isacharparenright}\ simp{\isacharunderscore}all%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   414
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   415
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   416
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   417
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   418
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   419
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   420
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   421
\isanewline
24379
823ffe1fdf67 updated
haftmann
parents: 24279
diff changeset
   422
\isacommand{export{\isacharunderscore}code}\isamarkupfalse%
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   423
\ fac\ \isakeyword{in}\ SML\ \isakeyword{file}\ {\isachardoublequoteopen}examples{\isacharslash}fac{\isacharunderscore}case{\isachardot}ML{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   424
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   425
\lstsml{Thy/examples/fac_case.ML}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   426
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   427
  \begin{warn}
22292
3b118010ec08 adjusted to new code generator Isar commands and changes in implementation
haftmann
parents: 22188
diff changeset
   428
    The attributes \emph{code} and \emph{code del}
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   429
    associated with the existing code generator also apply to
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   430
    the new one: \emph{code} implies \emph{code func},
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   431
    and \emph{code del} implies \emph{code func del}.
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   432
  \end{warn}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   433
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   434
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   435
%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   436
\isamarkupsubsection{Type classes%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   437
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   438
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   439
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   440
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   441
Type classes enter the game via the Isar class package.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   442
  For a short introduction how to use it, see \cite{isabelle-classes};
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   443
  here we just illustrate its impact on code generation.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   444
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   445
  In a target language, type classes may be represented
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   446
  natively (as in the case of Haskell).  For languages
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   447
  like SML, they are implemented using \emph{dictionaries}.
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   448
  Our following example specifies a class \qt{null},
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   449
  assigning to each of its inhabitants a \qt{null} value:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   450
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   451
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   452
\isacommand{class}\isamarkupfalse%
22479
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
   453
\ null\ {\isacharequal}\ type\ {\isacharplus}\isanewline
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   454
\ \ \isakeyword{fixes}\ null\ {\isacharcolon}{\isacharcolon}\ {\isacharprime}a\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   455
\isanewline
25870
haftmann
parents: 25731
diff changeset
   456
\isacommand{primrec}\isamarkupfalse%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   457
\isanewline
25870
haftmann
parents: 25731
diff changeset
   458
\ \ head\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a{\isasymColon}null\ list\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   459
\ \ {\isachardoublequoteopen}head\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ null{\isachardoublequoteclose}\isanewline
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   460
\ \ {\isacharbar}\ {\isachardoublequoteopen}head\ {\isacharparenleft}x{\isacharhash}xs{\isacharparenright}\ {\isacharequal}\ x{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   461
\begin{isamarkuptext}%
25731
b3e415b0cf5c updated;
wenzelm
parents: 25533
diff changeset
   462
\noindent  We provide some instances for our \isa{null}:%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   463
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   464
\isamarkuptrue%
25533
0140cc7b26ad added something about instantiation target
haftmann
parents: 25411
diff changeset
   465
\isacommand{instantiation}\isamarkupfalse%
0140cc7b26ad added something about instantiation target
haftmann
parents: 25411
diff changeset
   466
\ option\ \isakeyword{and}\ list\ {\isacharcolon}{\isacharcolon}\ {\isacharparenleft}type{\isacharparenright}\ null\isanewline
0140cc7b26ad added something about instantiation target
haftmann
parents: 25411
diff changeset
   467
\isakeyword{begin}\isanewline
0140cc7b26ad added something about instantiation target
haftmann
parents: 25411
diff changeset
   468
\isanewline
0140cc7b26ad added something about instantiation target
haftmann
parents: 25411
diff changeset
   469
\isacommand{definition}\isamarkupfalse%
0140cc7b26ad added something about instantiation target
haftmann
parents: 25411
diff changeset
   470
\isanewline
0140cc7b26ad added something about instantiation target
haftmann
parents: 25411
diff changeset
   471
\ \ {\isachardoublequoteopen}null\ {\isacharequal}\ None{\isachardoublequoteclose}\isanewline
0140cc7b26ad added something about instantiation target
haftmann
parents: 25411
diff changeset
   472
\isanewline
0140cc7b26ad added something about instantiation target
haftmann
parents: 25411
diff changeset
   473
\isacommand{definition}\isamarkupfalse%
0140cc7b26ad added something about instantiation target
haftmann
parents: 25411
diff changeset
   474
\isanewline
25731
b3e415b0cf5c updated;
wenzelm
parents: 25533
diff changeset
   475
\ \ {\isachardoublequoteopen}null\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}{\isachardoublequoteclose}\isanewline
25533
0140cc7b26ad added something about instantiation target
haftmann
parents: 25411
diff changeset
   476
\isanewline
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   477
\isacommand{instance}\isamarkupfalse%
25533
0140cc7b26ad added something about instantiation target
haftmann
parents: 25411
diff changeset
   478
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   479
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   480
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   481
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   482
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   483
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   484
\isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   485
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   486
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   487
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   488
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   489
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   490
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   491
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   492
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   493
\isanewline
25533
0140cc7b26ad added something about instantiation target
haftmann
parents: 25411
diff changeset
   494
\isacommand{end}\isamarkupfalse%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   495
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   496
\begin{isamarkuptext}%
25731
b3e415b0cf5c updated;
wenzelm
parents: 25533
diff changeset
   497
\noindent Constructing a dummy example:%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   498
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   499
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   500
\isacommand{definition}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   501
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   502
\ \ {\isachardoublequoteopen}dummy\ {\isacharequal}\ head\ {\isacharbrackleft}Some\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}{\isacharcomma}\ None{\isacharbrackright}{\isachardoublequoteclose}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   503
\begin{isamarkuptext}%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   504
Type classes offer a suitable occasion to introduce
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   505
  the Haskell serializer.  Its usage is almost the same
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   506
  as SML, but, in accordance with conventions
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   507
  some Haskell systems enforce, each module ends
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   508
  up in a single file. The module hierarchy is reflected in
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   509
  the file system, with root directory given as file specification.%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   510
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   511
\isamarkuptrue%
24379
823ffe1fdf67 updated
haftmann
parents: 24279
diff changeset
   512
\isacommand{export{\isacharunderscore}code}\isamarkupfalse%
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   513
\ dummy\ \isakeyword{in}\ Haskell\ \isakeyword{file}\ {\isachardoublequoteopen}examples{\isacharslash}{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   514
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   515
\lsthaskell{Thy/examples/Codegen.hs}
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   516
  \noindent (we have left out all other modules).
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   517
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   518
  \medskip
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   519
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   520
  The whole code in SML with explicit dictionary passing:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   521
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   522
\isamarkuptrue%
24379
823ffe1fdf67 updated
haftmann
parents: 24279
diff changeset
   523
\isacommand{export{\isacharunderscore}code}\isamarkupfalse%
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   524
\ dummy\ \isakeyword{in}\ SML\ \isakeyword{file}\ {\isachardoublequoteopen}examples{\isacharslash}class{\isachardot}ML{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   525
\begin{isamarkuptext}%
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   526
\lstsml{Thy/examples/class.ML}
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   527
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   528
  \medskip
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   529
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   530
  \noindent or in OCaml:%
22292
3b118010ec08 adjusted to new code generator Isar commands and changes in implementation
haftmann
parents: 22188
diff changeset
   531
\end{isamarkuptext}%
3b118010ec08 adjusted to new code generator Isar commands and changes in implementation
haftmann
parents: 22188
diff changeset
   532
\isamarkuptrue%
24379
823ffe1fdf67 updated
haftmann
parents: 24279
diff changeset
   533
\isacommand{export{\isacharunderscore}code}\isamarkupfalse%
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   534
\ dummy\ \isakeyword{in}\ OCaml\ \isakeyword{file}\ {\isachardoublequoteopen}examples{\isacharslash}class{\isachardot}ocaml{\isachardoublequoteclose}%
22292
3b118010ec08 adjusted to new code generator Isar commands and changes in implementation
haftmann
parents: 22188
diff changeset
   535
\begin{isamarkuptext}%
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   536
\lstsml{Thy/examples/class.ocaml}
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   537
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   538
  \medskip The explicit association of constants
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   539
  to classes can be inspected using the \isa{{\isasymPRINTCLASSES}}
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   540
  command.%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   541
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   542
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   543
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   544
\isamarkupsection{Recipes and advanced topics \label{sec:advanced}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   545
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   546
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   547
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   548
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   549
In this tutorial, we do not attempt to give an exhaustive
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   550
  description of the code generator framework; instead,
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   551
  we cast a light on advanced topics by introducing
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   552
  them together with practically motivated examples.  Concerning
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   553
  further reading, see
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   554
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   555
  \begin{itemize}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   556
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   557
  \item the Isabelle/Isar Reference Manual \cite{isabelle-isar-ref}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   558
    for exhaustive syntax diagrams.
24193
926dde4d96de updated
haftmann
parents: 23850
diff changeset
   559
  \item or \cite{Haftmann-Nipkow:2007:codegen} which deals with foundational issues
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   560
    of the code generator framework.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   561
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   562
  \end{itemize}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   563
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   564
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   565
%
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   566
\isamarkupsubsection{Library theories \label{sec:library}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   567
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   568
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   569
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   570
\begin{isamarkuptext}%
22916
haftmann
parents: 22885
diff changeset
   571
The \isa{HOL} \isa{Main} theory already provides a code
haftmann
parents: 22885
diff changeset
   572
  generator setup
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   573
  which should be suitable for most applications. Common extensions
22916
haftmann
parents: 22885
diff changeset
   574
  and modifications are available by certain theories of the \isa{HOL}
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   575
  library; beside being useful in applications, they may serve
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   576
  as a tutorial for customizing the code generator setup.
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   577
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   578
  \begin{description}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   579
25370
8b1aa4357320 updated;
wenzelm
parents: 24628
diff changeset
   580
    \item[\isa{Code{\isacharunderscore}Integer}] represents \isa{HOL} integers by big
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   581
       integer literals in target languages.
25370
8b1aa4357320 updated;
wenzelm
parents: 24628
diff changeset
   582
    \item[\isa{Code{\isacharunderscore}Char}] represents \isa{HOL} characters by 
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   583
       character literals in target languages.
25370
8b1aa4357320 updated;
wenzelm
parents: 24628
diff changeset
   584
    \item[\isa{Code{\isacharunderscore}Char{\isacharunderscore}chr}] like \isa{Code{\isacharunderscore}Char},
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   585
       but also offers treatment of character codes; includes
25370
8b1aa4357320 updated;
wenzelm
parents: 24628
diff changeset
   586
       \isa{Code{\isacharunderscore}Integer}.
23850
f1434532a562 updated
haftmann
parents: 23132
diff changeset
   587
    \item[\isa{Efficient{\isacharunderscore}Nat}] \label{eff_nat} implements natural numbers by integers,
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
   588
       which in general will result in higher efficency; pattern
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   589
       matching with \isa{{\isadigit{0}}} / \isa{Suc}
25370
8b1aa4357320 updated;
wenzelm
parents: 24628
diff changeset
   590
       is eliminated;  includes \isa{Code{\isacharunderscore}Integer}.
8b1aa4357320 updated;
wenzelm
parents: 24628
diff changeset
   591
    \item[\isa{Code{\isacharunderscore}Index}] provides an additional datatype
8b1aa4357320 updated;
wenzelm
parents: 24628
diff changeset
   592
       \isa{index} which is mapped to target-language built-in integers.
8b1aa4357320 updated;
wenzelm
parents: 24628
diff changeset
   593
       Useful for code setups which involve e.g. indexing of
8b1aa4357320 updated;
wenzelm
parents: 24628
diff changeset
   594
       target-language arrays.
8b1aa4357320 updated;
wenzelm
parents: 24628
diff changeset
   595
    \item[\isa{Code{\isacharunderscore}Message}] provides an additional datatype
8b1aa4357320 updated;
wenzelm
parents: 24628
diff changeset
   596
       \isa{message{\isacharunderscore}string} which is isomorphic to strings;
8b1aa4357320 updated;
wenzelm
parents: 24628
diff changeset
   597
       \isa{message{\isacharunderscore}string}s are mapped to target-language strings.
8b1aa4357320 updated;
wenzelm
parents: 24628
diff changeset
   598
       Useful for code setups which involve e.g. printing (error) messages.
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   599
22916
haftmann
parents: 22885
diff changeset
   600
  \end{description}
haftmann
parents: 22885
diff changeset
   601
haftmann
parents: 22885
diff changeset
   602
  \begin{warn}
haftmann
parents: 22885
diff changeset
   603
    When importing any of these theories, they should form the last
haftmann
parents: 22885
diff changeset
   604
    items in an import list.  Since these theories adapt the
haftmann
parents: 22885
diff changeset
   605
    code generator setup in a non-conservative fashion,
haftmann
parents: 22885
diff changeset
   606
    strange effects may occur otherwise.
haftmann
parents: 22885
diff changeset
   607
  \end{warn}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   608
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   609
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   610
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   611
\isamarkupsubsection{Preprocessing%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   612
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   613
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
   614
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   615
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   616
Before selected function theorems are turned into abstract
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   617
  code, a chain of definitional transformation steps is carried
27609
b23c9ad0fe7d tuned code theorem bookkeeping
haftmann
parents: 27557
diff changeset
   618
  out: \emph{preprocessing}.  In essence, the preprocessor
b23c9ad0fe7d tuned code theorem bookkeeping
haftmann
parents: 27557
diff changeset
   619
  consists of two components: a \emph{simpset} and \emph{function transformers}.
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   620
27557
151731493264 simpsets as pre/postprocessors; generic preprocessor now named function transformators
haftmann
parents: 26999
diff changeset
   621
  The \emph{simpset} allows to employ the full generality of the Isabelle
151731493264 simpsets as pre/postprocessors; generic preprocessor now named function transformators
haftmann
parents: 26999
diff changeset
   622
  simplifier.  Due to the interpretation of theorems
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
   623
  of defining equations, rewrites are applied to the right
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   624
  hand side and the arguments of the left hand side of an
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   625
  equation, but never to the constant heading the left hand side.
27557
151731493264 simpsets as pre/postprocessors; generic preprocessor now named function transformators
haftmann
parents: 26999
diff changeset
   626
  An important special case are \emph{inline theorems} which may be
151731493264 simpsets as pre/postprocessors; generic preprocessor now named function transformators
haftmann
parents: 26999
diff changeset
   627
  declared an undeclared using the
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   628
  \emph{code inline} or \emph{code inline del} attribute respectively.
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   629
  Some common applications:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   630
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   631
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   632
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   633
\begin{itemize}
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   634
%
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   635
\begin{isamarkuptext}%
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   636
\item replacing non-executable constructs by executable ones:%
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   637
\end{isamarkuptext}%
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   638
\isamarkuptrue%
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   639
\ \ \isacommand{lemma}\isamarkupfalse%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   640
\ {\isacharbrackleft}code\ inline{\isacharbrackright}{\isacharcolon}\isanewline
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   641
\ \ \ \ {\isachardoublequoteopen}x\ {\isasymin}\ set\ xs\ {\isasymlongleftrightarrow}\ x\ mem\ xs{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   642
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   643
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   644
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   645
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   646
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   647
\isacommand{by}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   648
\ {\isacharparenleft}induct\ xs{\isacharparenright}\ simp{\isacharunderscore}all%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   649
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   650
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   651
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   652
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   653
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   654
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   655
%
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   656
\begin{isamarkuptext}%
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   657
\item eliminating superfluous constants:%
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   658
\end{isamarkuptext}%
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   659
\isamarkuptrue%
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   660
\ \ \isacommand{lemma}\isamarkupfalse%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   661
\ {\isacharbrackleft}code\ inline{\isacharbrackright}{\isacharcolon}\isanewline
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   662
\ \ \ \ {\isachardoublequoteopen}{\isadigit{1}}\ {\isacharequal}\ Suc\ {\isadigit{0}}{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   663
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   664
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   665
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   666
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   667
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   668
\isacommand{by}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   669
\ simp%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   670
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   671
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   672
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   673
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   674
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   675
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   676
%
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   677
\begin{isamarkuptext}%
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   678
\item replacing executable but inconvenient constructs:%
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   679
\end{isamarkuptext}%
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   680
\isamarkuptrue%
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   681
\ \ \isacommand{lemma}\isamarkupfalse%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   682
\ {\isacharbrackleft}code\ inline{\isacharbrackright}{\isacharcolon}\isanewline
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   683
\ \ \ \ {\isachardoublequoteopen}xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymlongleftrightarrow}\ List{\isachardot}null\ xs{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   684
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   685
\ %
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   686
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   687
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   688
\isatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   689
\isacommand{by}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   690
\ {\isacharparenleft}induct\ xs{\isacharparenright}\ simp{\isacharunderscore}all%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   691
\endisatagproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   692
{\isafoldproof}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   693
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   694
\isadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   695
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   696
\endisadelimproof
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   697
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   698
\end{itemize}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   699
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   700
\begin{isamarkuptext}%
27609
b23c9ad0fe7d tuned code theorem bookkeeping
haftmann
parents: 27557
diff changeset
   701
\emph{Function transformers} provide a very general interface,
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   702
  transforming a list of function theorems to another
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   703
  list of function theorems, provided that neither the heading
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   704
  constant nor its type change.  The \isa{{\isadigit{0}}} / \isa{Suc}
21348
haftmann
parents: 21186
diff changeset
   705
  pattern elimination implemented in
27609
b23c9ad0fe7d tuned code theorem bookkeeping
haftmann
parents: 27557
diff changeset
   706
  theory \isa{Efficient{\isacharunderscore}Nat} (\secref{eff_nat}) uses this
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   707
  interface.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   708
27557
151731493264 simpsets as pre/postprocessors; generic preprocessor now named function transformators
haftmann
parents: 26999
diff changeset
   709
  \noindent The current setup of the preprocessor may be inspected using
151731493264 simpsets as pre/postprocessors; generic preprocessor now named function transformators
haftmann
parents: 26999
diff changeset
   710
  the \isa{{\isasymPRINTCODESETUP}} command.
151731493264 simpsets as pre/postprocessors; generic preprocessor now named function transformators
haftmann
parents: 26999
diff changeset
   711
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   712
  \begin{warn}
27609
b23c9ad0fe7d tuned code theorem bookkeeping
haftmann
parents: 27557
diff changeset
   713
    The attribute \emph{code unfold}
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   714
    associated with the existing code generator also applies to
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   715
    the new one: \emph{code unfold} implies \emph{code inline}.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   716
  \end{warn}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   717
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   718
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
   719
%
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   720
\isamarkupsubsection{Concerning operational equality%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   721
}
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   722
\isamarkuptrue%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   723
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   724
\begin{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   725
Surely you have already noticed how equality is treated
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   726
  by the code generator:%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   727
\end{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   728
\isamarkuptrue%
25870
haftmann
parents: 25731
diff changeset
   729
\isacommand{primrec}\isamarkupfalse%
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   730
\isanewline
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   731
\ \ collect{\isacharunderscore}duplicates\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   732
\ \ \ \ {\isachardoublequoteopen}collect{\isacharunderscore}duplicates\ xs\ ys\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ xs{\isachardoublequoteclose}\isanewline
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   733
\ \ {\isacharbar}\ {\isachardoublequoteopen}collect{\isacharunderscore}duplicates\ xs\ ys\ {\isacharparenleft}z{\isacharhash}zs{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}if\ z\ {\isasymin}\ set\ xs\isanewline
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   734
\ \ \ \ \ \ then\ if\ z\ {\isasymin}\ set\ ys\isanewline
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   735
\ \ \ \ \ \ \ \ then\ collect{\isacharunderscore}duplicates\ xs\ ys\ zs\isanewline
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   736
\ \ \ \ \ \ \ \ else\ collect{\isacharunderscore}duplicates\ xs\ {\isacharparenleft}z{\isacharhash}ys{\isacharparenright}\ zs\isanewline
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   737
\ \ \ \ \ \ else\ collect{\isacharunderscore}duplicates\ {\isacharparenleft}z{\isacharhash}xs{\isacharparenright}\ {\isacharparenleft}z{\isacharhash}ys{\isacharparenright}\ zs{\isacharparenright}{\isachardoublequoteclose}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   738
\begin{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   739
The membership test during preprocessing is rewritten,
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   740
  resulting in \isa{op\ mem}, which itself
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   741
  performs an explicit equality check.%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   742
\end{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   743
\isamarkuptrue%
24379
823ffe1fdf67 updated
haftmann
parents: 24279
diff changeset
   744
\isacommand{export{\isacharunderscore}code}\isamarkupfalse%
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   745
\ collect{\isacharunderscore}duplicates\ \isakeyword{in}\ SML\ \isakeyword{file}\ {\isachardoublequoteopen}examples{\isacharslash}collect{\isacharunderscore}duplicates{\isachardot}ML{\isachardoublequoteclose}%
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   746
\begin{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   747
\lstsml{Thy/examples/collect_duplicates.ML}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   748
\end{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   749
\isamarkuptrue%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   750
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   751
\begin{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   752
Obviously, polymorphic equality is implemented the Haskell
26513
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 25870
diff changeset
   753
  way using a type class.  How is this achieved?  HOL introduces
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 25870
diff changeset
   754
  an explicit class \isa{eq} with a corresponding operation
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 25870
diff changeset
   755
  \isa{eq{\isacharunderscore}class{\isachardot}eq} such that \isa{eq{\isacharunderscore}class{\isachardot}eq\ x\ y\ {\isacharequal}\ {\isacharparenleft}x\ {\isacharequal}\ y{\isacharparenright}}.
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 25870
diff changeset
   756
  The preprocessing framework does the rest.
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   757
  For datatypes, instances of \isa{eq} are implicitly derived
26513
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 25870
diff changeset
   758
  when possible.  For other types, you may instantiate \isa{eq}
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 25870
diff changeset
   759
  manually like any other type class.
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   760
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   761
  Though this \isa{eq} class is designed to get rarely in
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   762
  the way, a subtlety
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   763
  enters the stage when definitions of overloaded constants
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   764
  are dependent on operational equality.  For example, let
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   765
  us define a lexicographic ordering on tuples:%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   766
\end{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   767
\isamarkuptrue%
25870
haftmann
parents: 25731
diff changeset
   768
\isacommand{instantiation}\isamarkupfalse%
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   769
\ {\isacharasterisk}\ {\isacharcolon}{\isacharcolon}\ {\isacharparenleft}ord{\isacharcomma}\ ord{\isacharparenright}\ ord\isanewline
25870
haftmann
parents: 25731
diff changeset
   770
\isakeyword{begin}\isanewline
haftmann
parents: 25731
diff changeset
   771
\isanewline
haftmann
parents: 25731
diff changeset
   772
\isacommand{definition}\isamarkupfalse%
haftmann
parents: 25731
diff changeset
   773
\isanewline
haftmann
parents: 25731
diff changeset
   774
\ \ {\isacharbrackleft}code\ func\ del{\isacharbrackright}{\isacharcolon}\ {\isachardoublequoteopen}p{\isadigit{1}}\ {\isacharless}\ p{\isadigit{2}}\ {\isasymlongleftrightarrow}\ {\isacharparenleft}let\ {\isacharparenleft}x{\isadigit{1}}{\isacharcomma}\ y{\isadigit{1}}{\isacharparenright}\ {\isacharequal}\ p{\isadigit{1}}{\isacharsemicolon}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isacharequal}\ p{\isadigit{2}}\ in\isanewline
haftmann
parents: 25731
diff changeset
   775
\ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ {\isacharparenleft}x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isacharless}\ y{\isadigit{2}}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents: 25731
diff changeset
   776
\isanewline
haftmann
parents: 25731
diff changeset
   777
\isacommand{definition}\isamarkupfalse%
haftmann
parents: 25731
diff changeset
   778
\isanewline
haftmann
parents: 25731
diff changeset
   779
\ \ {\isacharbrackleft}code\ func\ del{\isacharbrackright}{\isacharcolon}\ {\isachardoublequoteopen}p{\isadigit{1}}\ {\isasymle}\ p{\isadigit{2}}\ {\isasymlongleftrightarrow}\ {\isacharparenleft}let\ {\isacharparenleft}x{\isadigit{1}}{\isacharcomma}\ y{\isadigit{1}}{\isacharparenright}\ {\isacharequal}\ p{\isadigit{1}}{\isacharsemicolon}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isacharequal}\ p{\isadigit{2}}\ in\isanewline
haftmann
parents: 25731
diff changeset
   780
\ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ {\isacharparenleft}x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isasymle}\ y{\isadigit{2}}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents: 25731
diff changeset
   781
\isanewline
haftmann
parents: 25731
diff changeset
   782
\isacommand{instance}\isamarkupfalse%
haftmann
parents: 25731
diff changeset
   783
%
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   784
\isadelimproof
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   785
\ %
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   786
\endisadelimproof
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   787
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   788
\isatagproof
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   789
\isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   790
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   791
\endisatagproof
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   792
{\isafoldproof}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   793
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   794
\isadelimproof
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   795
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   796
\endisadelimproof
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   797
\isanewline
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   798
\isanewline
25870
haftmann
parents: 25731
diff changeset
   799
\isacommand{end}\isamarkupfalse%
haftmann
parents: 25731
diff changeset
   800
\isanewline
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   801
\isanewline
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   802
\isacommand{lemma}\isamarkupfalse%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   803
\ ord{\isacharunderscore}prod\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   804
\ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}ord{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}ord{\isacharparenright}\ {\isacharless}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ {\isacharparenleft}x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isacharless}\ y{\isadigit{2}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   805
\ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}ord{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}ord{\isacharparenright}\ {\isasymle}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ {\isacharparenleft}x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isasymle}\ y{\isadigit{2}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   806
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   807
\isadelimproof
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   808
\ \ %
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   809
\endisadelimproof
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   810
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   811
\isatagproof
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   812
\isacommand{unfolding}\isamarkupfalse%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   813
\ less{\isacharunderscore}prod{\isacharunderscore}def\ less{\isacharunderscore}eq{\isacharunderscore}prod{\isacharunderscore}def\ \isacommand{by}\isamarkupfalse%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   814
\ simp{\isacharunderscore}all%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   815
\endisatagproof
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   816
{\isafoldproof}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   817
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   818
\isadelimproof
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   819
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   820
\endisadelimproof
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   821
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   822
\begin{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   823
Then code generation will fail.  Why?  The definition
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   824
  of \isa{op\ {\isasymle}} depends on equality on both arguments,
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   825
  which are polymorphic and impose an additional \isa{eq}
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   826
  class constraint, thus violating the type discipline
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   827
  for class operations.
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   828
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   829
  The solution is to add \isa{eq} explicitly to the first sort arguments in the
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   830
  code theorems:%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   831
\end{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   832
\isamarkuptrue%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   833
\isacommand{lemma}\isamarkupfalse%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   834
\ ord{\isacharunderscore}prod{\isacharunderscore}code\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   835
\ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}{\isacharbraceleft}ord{\isacharcomma}\ eq{\isacharbraceright}{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}ord{\isacharparenright}\ {\isacharless}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   836
\ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ {\isacharparenleft}x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isacharless}\ y{\isadigit{2}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   837
\ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}{\isacharbraceleft}ord{\isacharcomma}\ eq{\isacharbraceright}{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}ord{\isacharparenright}\ {\isasymle}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   838
\ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ {\isacharparenleft}x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isasymle}\ y{\isadigit{2}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   839
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   840
\isadelimproof
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   841
\ \ %
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   842
\endisadelimproof
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   843
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   844
\isatagproof
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   845
\isacommand{unfolding}\isamarkupfalse%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   846
\ ord{\isacharunderscore}prod\ \isacommand{by}\isamarkupfalse%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   847
\ rule{\isacharplus}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   848
\endisatagproof
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   849
{\isafoldproof}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   850
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   851
\isadelimproof
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   852
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   853
\endisadelimproof
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   854
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   855
\begin{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   856
\noindent Then code generation succeeds:%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   857
\end{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   858
\isamarkuptrue%
24379
823ffe1fdf67 updated
haftmann
parents: 24279
diff changeset
   859
\isacommand{export{\isacharunderscore}code}\isamarkupfalse%
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   860
\ {\isachardoublequoteopen}op\ {\isasymle}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}{\isacharbraceleft}eq{\isacharcomma}\ ord{\isacharbraceright}\ {\isasymtimes}\ {\isacharprime}b{\isasymColon}ord\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymtimes}\ {\isacharprime}b\ {\isasymRightarrow}\ bool{\isachardoublequoteclose}\isanewline
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
   861
\ \ \isakeyword{in}\ SML\ \isakeyword{file}\ {\isachardoublequoteopen}examples{\isacharslash}lexicographic{\isachardot}ML{\isachardoublequoteclose}%
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   862
\begin{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   863
\lstsml{Thy/examples/lexicographic.ML}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   864
\end{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   865
\isamarkuptrue%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   866
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   867
\begin{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   868
In general, code theorems for overloaded constants may have more
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   869
  restrictive sort constraints than the underlying instance relation
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   870
  between class and type constructor as long as the whole system of
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   871
  constraints is coregular; code theorems violating coregularity
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   872
  are rejected immediately.  Consequently, it might be necessary
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   873
  to delete disturbing theorems in the code theorem table,
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   874
  as we have done here with the original definitions \isa{less{\isacharunderscore}prod{\isacharunderscore}def}
22885
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   875
  and \isa{less{\isacharunderscore}eq{\isacharunderscore}prod{\isacharunderscore}def}.
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   876
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   877
  In some cases, the automatically derived defining equations
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   878
  for equality on a particular type may not be appropriate.
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   879
  As example, watch the following datatype representing
23132
ae52b82dc5d8 updated
haftmann
parents: 23016
diff changeset
   880
  monomorphic parametric types (where type constructors
ae52b82dc5d8 updated
haftmann
parents: 23016
diff changeset
   881
  are referred to by natural numbers):%
22885
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   882
\end{isamarkuptext}%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   883
\isamarkuptrue%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   884
\isacommand{datatype}\isamarkupfalse%
23132
ae52b82dc5d8 updated
haftmann
parents: 23016
diff changeset
   885
\ monotype\ {\isacharequal}\ Mono\ nat\ {\isachardoublequoteopen}monotype\ list{\isachardoublequoteclose}%
22885
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   886
\isadelimproof
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   887
%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   888
\endisadelimproof
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   889
%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   890
\isatagproof
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   891
%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   892
\endisatagproof
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   893
{\isafoldproof}%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   894
%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   895
\isadelimproof
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   896
%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   897
\endisadelimproof
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   898
%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   899
\begin{isamarkuptext}%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   900
Then code generation for SML would fail with a message
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   901
  that the generated code conains illegal mutual dependencies:
23132
ae52b82dc5d8 updated
haftmann
parents: 23016
diff changeset
   902
  the theorem \isa{Mono\ tyco{\isadigit{1}}\ typargs{\isadigit{1}}\ {\isacharequal}\ Mono\ tyco{\isadigit{2}}\ typargs{\isadigit{2}}\ {\isasymequiv}\ tyco{\isadigit{1}}\ {\isacharequal}\ tyco{\isadigit{2}}\ {\isasymand}\ typargs{\isadigit{1}}\ {\isacharequal}\ typargs{\isadigit{2}}} already requires the
22885
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   903
  instance \isa{monotype\ {\isasymColon}\ eq}, which itself requires
23132
ae52b82dc5d8 updated
haftmann
parents: 23016
diff changeset
   904
  \isa{Mono\ tyco{\isadigit{1}}\ typargs{\isadigit{1}}\ {\isacharequal}\ Mono\ tyco{\isadigit{2}}\ typargs{\isadigit{2}}\ {\isasymequiv}\ tyco{\isadigit{1}}\ {\isacharequal}\ tyco{\isadigit{2}}\ {\isasymand}\ typargs{\isadigit{1}}\ {\isacharequal}\ typargs{\isadigit{2}}};  Haskell has no problem with mutually
22885
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   905
  recursive \isa{instance} and \isa{function} definitions,
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   906
  but the SML serializer does not support this.
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   907
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   908
  In such cases, you have to provide you own equality equations
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   909
  involving auxiliary constants.  In our case,
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   910
  \isa{list{\isacharunderscore}all{\isadigit{2}}} can do the job:%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   911
\end{isamarkuptext}%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   912
\isamarkuptrue%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   913
\isacommand{lemma}\isamarkupfalse%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   914
\ monotype{\isacharunderscore}eq{\isacharunderscore}list{\isacharunderscore}all{\isadigit{2}}\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   915
\ \ {\isachardoublequoteopen}Mono\ tyco{\isadigit{1}}\ typargs{\isadigit{1}}\ {\isacharequal}\ Mono\ tyco{\isadigit{2}}\ typargs{\isadigit{2}}\ {\isasymlongleftrightarrow}\isanewline
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   916
\ \ \ \ \ tyco{\isadigit{1}}\ {\isacharequal}\ tyco{\isadigit{2}}\ {\isasymand}\ list{\isacharunderscore}all{\isadigit{2}}\ {\isacharparenleft}op\ {\isacharequal}{\isacharparenright}\ typargs{\isadigit{1}}\ typargs{\isadigit{2}}{\isachardoublequoteclose}\isanewline
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   917
%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   918
\isadelimproof
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   919
\ \ %
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   920
\endisadelimproof
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   921
%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   922
\isatagproof
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   923
\isacommand{by}\isamarkupfalse%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   924
\ {\isacharparenleft}simp\ add{\isacharcolon}\ list{\isacharunderscore}all{\isadigit{2}}{\isacharunderscore}eq\ {\isacharbrackleft}symmetric{\isacharbrackright}{\isacharparenright}%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   925
\endisatagproof
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   926
{\isafoldproof}%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   927
%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   928
\isadelimproof
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   929
%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   930
\endisadelimproof
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   931
%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   932
\begin{isamarkuptext}%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   933
does not depend on instance \isa{monotype\ {\isasymColon}\ eq}:%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   934
\end{isamarkuptext}%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   935
\isamarkuptrue%
24379
823ffe1fdf67 updated
haftmann
parents: 24279
diff changeset
   936
\isacommand{export{\isacharunderscore}code}\isamarkupfalse%
22885
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   937
\ {\isachardoublequoteopen}op\ {\isacharequal}\ {\isacharcolon}{\isacharcolon}\ monotype\ {\isasymRightarrow}\ monotype\ {\isasymRightarrow}\ bool{\isachardoublequoteclose}\isanewline
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   938
\ \ \isakeyword{in}\ SML\ \isakeyword{file}\ {\isachardoublequoteopen}examples{\isacharslash}monotype{\isachardot}ML{\isachardoublequoteclose}%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   939
\begin{isamarkuptext}%
ebde66a71ab0 continued
haftmann
parents: 22845
diff changeset
   940
\lstsml{Thy/examples/monotype.ML}%
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   941
\end{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   942
\isamarkuptrue%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   943
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   944
\isamarkupsubsection{Programs as sets of theorems%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   945
}
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   946
\isamarkuptrue%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   947
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   948
\begin{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   949
As told in \secref{sec:concept}, code generation is based
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   950
  on a structured collection of code theorems.
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   951
  For explorative purpose, this collection
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   952
  may be inspected using the \isa{{\isasymCODETHMS}} command:%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   953
\end{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   954
\isamarkuptrue%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   955
\isacommand{code{\isacharunderscore}thms}\isamarkupfalse%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   956
\ {\isachardoublequoteopen}op\ mod\ {\isacharcolon}{\isacharcolon}\ nat\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   957
\begin{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   958
\noindent prints a table with \emph{all} defining equations
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   959
  for \isa{op\ mod}, including
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   960
  \emph{all} defining equations those equations depend
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   961
  on recursivly.  \isa{{\isasymCODETHMS}} provides a convenient
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   962
  mechanism to inspect the impact of a preprocessor setup
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   963
  on defining equations.
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   964
  
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   965
  Similarly, the \isa{{\isasymCODEDEPS}} command shows a graph
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   966
  visualizing dependencies between defining equations.%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   967
\end{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   968
\isamarkuptrue%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
   969
%
25411
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
   970
\isamarkupsubsection{Constructor sets for datatypes%
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
   971
}
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
   972
\isamarkuptrue%
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
   973
%
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
   974
\begin{isamarkuptext}%
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
   975
Conceptually, any datatype is spanned by a set of
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
   976
  \emph{constructors} of type \isa{{\isasymtau}\ {\isacharequal}\ {\isasymdots}\ {\isasymRightarrow}\ {\isasymkappa}\ {\isasymalpha}\isactrlisub {\isadigit{1}}\ {\isasymdots}\ {\isasymalpha}\isactrlisub n}
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
   977
  where \isa{{\isacharbraceleft}{\isasymalpha}\isactrlisub {\isadigit{1}}{\isacharcomma}\ {\isasymdots}{\isacharcomma}\ {\isasymalpha}\isactrlisub n{\isacharbraceright}} is excactly the set of \emph{all}
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
   978
  type variables in \isa{{\isasymtau}}.  The HOL datatype package
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
   979
  by default registers any new datatype in the table
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
   980
  of datatypes, which may be inspected using
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
   981
  the \isa{{\isasymPRINTCODESETUP}} command.
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
   982
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
   983
  In some cases, it may be convenient to alter or
26999
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
   984
  extend this table;  as an example, we will develope an alternative
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
   985
  representation of natural numbers as binary digits, whose
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
   986
  size does increase logarithmically with its value, not linear
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
   987
  \footnote{Indeed, the \isa{Efficient{\isacharunderscore}Nat} theory \ref{eff_nat}
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
   988
    does something similar}.  First, the digit representation:%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
   989
\end{isamarkuptext}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
   990
\isamarkuptrue%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
   991
\isacommand{definition}\isamarkupfalse%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
   992
\ Dig{\isadigit{0}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
   993
\ \ {\isachardoublequoteopen}Dig{\isadigit{0}}\ n\ {\isacharequal}\ {\isadigit{2}}\ {\isacharasterisk}\ n{\isachardoublequoteclose}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
   994
\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
   995
\isacommand{definition}\isamarkupfalse%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
   996
\ Dig{\isadigit{1}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
   997
\ \ {\isachardoublequoteopen}Dig{\isadigit{1}}\ n\ {\isacharequal}\ Suc\ {\isacharparenleft}{\isadigit{2}}\ {\isacharasterisk}\ n{\isacharparenright}{\isachardoublequoteclose}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
   998
\begin{isamarkuptext}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
   999
\noindent We will use these two ">digits"< to represent natural numbers
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1000
  in binary digits, e.g.:%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1001
\end{isamarkuptext}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1002
\isamarkuptrue%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1003
\isacommand{lemma}\isamarkupfalse%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1004
\ {\isadigit{4}}{\isadigit{2}}{\isacharcolon}\ {\isachardoublequoteopen}{\isadigit{4}}{\isadigit{2}}\ {\isacharequal}\ Dig{\isadigit{0}}\ {\isacharparenleft}Dig{\isadigit{1}}\ {\isacharparenleft}Dig{\isadigit{0}}\ {\isacharparenleft}Dig{\isadigit{1}}\ {\isacharparenleft}Dig{\isadigit{0}}\ {\isadigit{1}}{\isacharparenright}{\isacharparenright}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1005
%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1006
\isadelimproof
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1007
\ \ %
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1008
\endisadelimproof
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1009
%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1010
\isatagproof
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1011
\isacommand{by}\isamarkupfalse%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1012
\ {\isacharparenleft}simp\ add{\isacharcolon}\ Dig{\isadigit{0}}{\isacharunderscore}def\ Dig{\isadigit{1}}{\isacharunderscore}def{\isacharparenright}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1013
\endisatagproof
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1014
{\isafoldproof}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1015
%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1016
\isadelimproof
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1017
%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1018
\endisadelimproof
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1019
%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1020
\begin{isamarkuptext}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1021
\noindent Of course we also have to provide proper code equations for
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1022
  the operations, e.g. \isa{op\ {\isacharplus}}:%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1023
\end{isamarkuptext}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1024
\isamarkuptrue%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1025
\isacommand{lemma}\isamarkupfalse%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1026
\ plus{\isacharunderscore}Dig\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1027
\ \ {\isachardoublequoteopen}{\isadigit{0}}\ {\isacharplus}\ n\ {\isacharequal}\ n{\isachardoublequoteclose}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1028
\ \ {\isachardoublequoteopen}m\ {\isacharplus}\ {\isadigit{0}}\ {\isacharequal}\ m{\isachardoublequoteclose}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1029
\ \ {\isachardoublequoteopen}{\isadigit{1}}\ {\isacharplus}\ Dig{\isadigit{0}}\ n\ {\isacharequal}\ Dig{\isadigit{1}}\ n{\isachardoublequoteclose}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1030
\ \ {\isachardoublequoteopen}Dig{\isadigit{0}}\ m\ {\isacharplus}\ {\isadigit{1}}\ {\isacharequal}\ Dig{\isadigit{1}}\ m{\isachardoublequoteclose}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1031
\ \ {\isachardoublequoteopen}{\isadigit{1}}\ {\isacharplus}\ Dig{\isadigit{1}}\ n\ {\isacharequal}\ Dig{\isadigit{0}}\ {\isacharparenleft}n\ {\isacharplus}\ {\isadigit{1}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1032
\ \ {\isachardoublequoteopen}Dig{\isadigit{1}}\ m\ {\isacharplus}\ {\isadigit{1}}\ {\isacharequal}\ Dig{\isadigit{0}}\ {\isacharparenleft}m\ {\isacharplus}\ {\isadigit{1}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1033
\ \ {\isachardoublequoteopen}Dig{\isadigit{0}}\ m\ {\isacharplus}\ Dig{\isadigit{0}}\ n\ {\isacharequal}\ Dig{\isadigit{0}}\ {\isacharparenleft}m\ {\isacharplus}\ n{\isacharparenright}{\isachardoublequoteclose}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1034
\ \ {\isachardoublequoteopen}Dig{\isadigit{0}}\ m\ {\isacharplus}\ Dig{\isadigit{1}}\ n\ {\isacharequal}\ Dig{\isadigit{1}}\ {\isacharparenleft}m\ {\isacharplus}\ n{\isacharparenright}{\isachardoublequoteclose}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1035
\ \ {\isachardoublequoteopen}Dig{\isadigit{1}}\ m\ {\isacharplus}\ Dig{\isadigit{0}}\ n\ {\isacharequal}\ Dig{\isadigit{1}}\ {\isacharparenleft}m\ {\isacharplus}\ n{\isacharparenright}{\isachardoublequoteclose}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1036
\ \ {\isachardoublequoteopen}Dig{\isadigit{1}}\ m\ {\isacharplus}\ Dig{\isadigit{1}}\ n\ {\isacharequal}\ Dig{\isadigit{0}}\ {\isacharparenleft}m\ {\isacharplus}\ n\ {\isacharplus}\ {\isadigit{1}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1037
%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1038
\isadelimproof
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1039
\ \ %
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1040
\endisadelimproof
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1041
%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1042
\isatagproof
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1043
\isacommand{by}\isamarkupfalse%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1044
\ {\isacharparenleft}simp{\isacharunderscore}all\ add{\isacharcolon}\ Dig{\isadigit{0}}{\isacharunderscore}def\ Dig{\isadigit{1}}{\isacharunderscore}def{\isacharparenright}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1045
\endisatagproof
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1046
{\isafoldproof}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1047
%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1048
\isadelimproof
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1049
%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1050
\endisadelimproof
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1051
%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1052
\begin{isamarkuptext}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1053
\noindent We then instruct the code generator to view \isa{{\isadigit{0}}},
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1054
  \isa{{\isadigit{1}}}, \isa{Dig{\isadigit{0}}} and \isa{Dig{\isadigit{1}}} as
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1055
  datatype constructors:%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1056
\end{isamarkuptext}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1057
\isamarkuptrue%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1058
\isacommand{code{\isacharunderscore}datatype}\isamarkupfalse%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1059
\ {\isachardoublequoteopen}{\isadigit{0}}{\isasymColon}nat{\isachardoublequoteclose}\ {\isachardoublequoteopen}{\isadigit{1}}{\isasymColon}nat{\isachardoublequoteclose}\ Dig{\isadigit{0}}\ Dig{\isadigit{1}}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1060
\begin{isamarkuptext}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1061
\noindent For the former constructor \isa{Suc}, we provide a code
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1062
  equation and remove some parts of the default code generator setup
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1063
  which are an obstacle here:%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1064
\end{isamarkuptext}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1065
\isamarkuptrue%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1066
\isacommand{lemma}\isamarkupfalse%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1067
\ Suc{\isacharunderscore}Dig\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1068
\ \ {\isachardoublequoteopen}Suc\ n\ {\isacharequal}\ n\ {\isacharplus}\ {\isadigit{1}}{\isachardoublequoteclose}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1069
%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1070
\isadelimproof
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1071
\ \ %
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1072
\endisadelimproof
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1073
%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1074
\isatagproof
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1075
\isacommand{by}\isamarkupfalse%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1076
\ simp%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1077
\endisatagproof
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1078
{\isafoldproof}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1079
%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1080
\isadelimproof
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1081
\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1082
%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1083
\endisadelimproof
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1084
\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1085
\isacommand{declare}\isamarkupfalse%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1086
\ One{\isacharunderscore}nat{\isacharunderscore}def\ {\isacharbrackleft}code\ inline\ del{\isacharbrackright}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1087
\isacommand{declare}\isamarkupfalse%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1088
\ add{\isacharunderscore}Suc{\isacharunderscore}shift\ {\isacharbrackleft}code\ func\ del{\isacharbrackright}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1089
\begin{isamarkuptext}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1090
\noindent This yields the following code:%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1091
\end{isamarkuptext}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1092
\isamarkuptrue%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1093
\isacommand{export{\isacharunderscore}code}\isamarkupfalse%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1094
\ {\isachardoublequoteopen}op\ {\isacharplus}\ {\isasymColon}\ nat\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\ \ \isakeyword{in}\ SML\ \isakeyword{file}\ {\isachardoublequoteopen}examples{\isacharslash}nat{\isacharunderscore}binary{\isachardot}ML{\isachardoublequoteclose}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1095
\begin{isamarkuptext}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1096
\lstsml{Thy/examples/nat_binary.ML}%
25411
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
  1097
\end{isamarkuptext}%
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
  1098
\isamarkuptrue%
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
  1099
%
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
  1100
\begin{isamarkuptext}%
26973
6d52187fc2a6 temporary adjustment
haftmann
parents: 26856
diff changeset
  1101
\medskip
25411
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
  1102
26999
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1103
  From this example, it can be easily glimpsed that using own constructor sets
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1104
  is a little delicate since it changes the set of valid patterns for values
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1105
  of that type.  Without going into much detail, here some practical hints:
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1106
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1107
  \begin{itemize}
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1108
    \item When changing the constuctor set for datatypes, take care to
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1109
      provide an alternative for the \isa{case} combinator (e.g. by replacing
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1110
      it using the preprocessor).
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1111
    \item Values in the target language need not to be normalized -- different
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1112
      values in the target language may represent the same value in the
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1113
      logic (e.g. \isa{Dig{\isadigit{1}}\ {\isadigit{0}}\ {\isacharequal}\ {\isadigit{1}}}).
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1114
    \item Usually, a good methodology to deal with the subleties of pattern
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1115
      matching is to see the type as an abstract type: provide a set
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1116
      of operations which operate on the concrete representation of the type,
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1117
      and derive further operations by combinations of these primitive ones,
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1118
      without relying on a particular representation.
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1119
  \end{itemize}%
25411
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
  1120
\end{isamarkuptext}%
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
  1121
\isamarkuptrue%
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
  1122
%
26999
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1123
\isadeliminvisible
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1124
%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1125
\endisadeliminvisible
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1126
%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1127
\isataginvisible
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1128
\isacommand{code{\isacharunderscore}datatype}\isamarkupfalse%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1129
\ {\isachardoublequoteopen}{\isadigit{0}}{\isacharcolon}{\isacharcolon}nat{\isachardoublequoteclose}\ Suc\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1130
\isacommand{declare}\isamarkupfalse%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1131
\ plus{\isacharunderscore}Dig\ {\isacharbrackleft}code\ func\ del{\isacharbrackright}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1132
\isacommand{declare}\isamarkupfalse%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1133
\ One{\isacharunderscore}nat{\isacharunderscore}def\ {\isacharbrackleft}code\ inline{\isacharbrackright}\isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1134
\isacommand{declare}\isamarkupfalse%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1135
\ add{\isacharunderscore}Suc{\isacharunderscore}shift\ {\isacharbrackleft}code\ func{\isacharbrackright}\ \isanewline
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1136
\isacommand{lemma}\isamarkupfalse%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1137
\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\ {\isachardoublequoteopen}{\isadigit{0}}\ {\isacharplus}\ n\ {\isacharequal}\ {\isacharparenleft}n\ {\isasymColon}\ nat{\isacharparenright}{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1138
\ simp%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1139
\endisataginvisible
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1140
{\isafoldinvisible}%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1141
%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1142
\isadeliminvisible
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1143
%
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1144
\endisadeliminvisible
284c871d3acb added new code_datatype example
haftmann
parents: 26973
diff changeset
  1145
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1146
\isamarkupsubsection{Customizing serialization%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1147
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1148
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1149
%
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1150
\isamarkupsubsubsection{Basics%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1151
}
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1152
\isamarkuptrue%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1153
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1154
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1155
Consider the following function and its corresponding
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1156
  SML code:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1157
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1158
\isamarkuptrue%
25870
haftmann
parents: 25731
diff changeset
  1159
\isacommand{primrec}\isamarkupfalse%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1160
\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1161
\ \ in{\isacharunderscore}interval\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymtimes}\ nat\ {\isasymRightarrow}\ nat\ {\isasymRightarrow}\ bool{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1162
\ \ {\isachardoublequoteopen}in{\isacharunderscore}interval\ {\isacharparenleft}k{\isacharcomma}\ l{\isacharparenright}\ n\ {\isasymlongleftrightarrow}\ k\ {\isasymle}\ n\ {\isasymand}\ n\ {\isasymle}\ l{\isachardoublequoteclose}%
21348
haftmann
parents: 21186
diff changeset
  1163
\isadelimtt
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1164
%
21348
haftmann
parents: 21186
diff changeset
  1165
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1166
%
haftmann
parents: 21186
diff changeset
  1167
\isatagtt
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1168
%
21348
haftmann
parents: 21186
diff changeset
  1169
\endisatagtt
haftmann
parents: 21186
diff changeset
  1170
{\isafoldtt}%
haftmann
parents: 21186
diff changeset
  1171
%
haftmann
parents: 21186
diff changeset
  1172
\isadelimtt
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1173
%
21348
haftmann
parents: 21186
diff changeset
  1174
\endisadelimtt
24379
823ffe1fdf67 updated
haftmann
parents: 24279
diff changeset
  1175
\isacommand{export{\isacharunderscore}code}\isamarkupfalse%
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
  1176
\ in{\isacharunderscore}interval\ \isakeyword{in}\ SML\ \isakeyword{file}\ {\isachardoublequoteopen}examples{\isacharslash}bool{\isacharunderscore}literal{\isachardot}ML{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1177
\begin{isamarkuptext}%
21348
haftmann
parents: 21186
diff changeset
  1178
\lstsml{Thy/examples/bool_literal.ML}
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1179
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1180
  \noindent Though this is correct code, it is a little bit unsatisfactory:
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1181
  boolean values and operators are materialized as distinguished
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1182
  entities with have nothing to do with the SML-builtin notion
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1183
  of \qt{bool}.  This results in less readable code;
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1184
  additionally, eager evaluation may cause programs to
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1185
  loop or break which would perfectly terminate when
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1186
  the existing SML \qt{bool} would be used.  To map
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1187
  the HOL \qt{bool} on SML \qt{bool}, we may use
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1188
  \qn{custom serializations}:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1189
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1190
\isamarkuptrue%
21348
haftmann
parents: 21186
diff changeset
  1191
%
haftmann
parents: 21186
diff changeset
  1192
\isadelimtt
haftmann
parents: 21186
diff changeset
  1193
%
haftmann
parents: 21186
diff changeset
  1194
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1195
%
haftmann
parents: 21186
diff changeset
  1196
\isatagtt
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1197
\isacommand{code{\isacharunderscore}type}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1198
\ bool\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1199
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}bool{\isachardoublequoteclose}{\isacharparenright}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1200
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1201
\ True\ \isakeyword{and}\ False\ \isakeyword{and}\ {\isachardoublequoteopen}op\ {\isasymand}{\isachardoublequoteclose}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1202
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}true{\isachardoublequoteclose}\ \isakeyword{and}\ {\isachardoublequoteopen}false{\isachardoublequoteclose}\ \isakeyword{and}\ {\isachardoublequoteopen}{\isacharunderscore}\ andalso\ {\isacharunderscore}{\isachardoublequoteclose}{\isacharparenright}%
21348
haftmann
parents: 21186
diff changeset
  1203
\endisatagtt
haftmann
parents: 21186
diff changeset
  1204
{\isafoldtt}%
haftmann
parents: 21186
diff changeset
  1205
%
haftmann
parents: 21186
diff changeset
  1206
\isadelimtt
haftmann
parents: 21186
diff changeset
  1207
%
haftmann
parents: 21186
diff changeset
  1208
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1209
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1210
\begin{isamarkuptext}%
21348
haftmann
parents: 21186
diff changeset
  1211
The \isa{{\isasymCODETYPE}} commad takes a type constructor
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1212
  as arguments together with a list of custom serializations.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1213
  Each custom serialization starts with a target language
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1214
  identifier followed by an expression, which during
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1215
  code serialization is inserted whenever the type constructor
21348
haftmann
parents: 21186
diff changeset
  1216
  would occur.  For constants, \isa{{\isasymCODECONST}} implements
haftmann
parents: 21186
diff changeset
  1217
  the corresponding mechanism.  Each ``\verb|_|'' in
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1218
  a serialization expression is treated as a placeholder
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1219
  for the type constructor's (the constant's) arguments.%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1220
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1221
\isamarkuptrue%
24379
823ffe1fdf67 updated
haftmann
parents: 24279
diff changeset
  1222
\isacommand{export{\isacharunderscore}code}\isamarkupfalse%
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
  1223
\ in{\isacharunderscore}interval\ \ \isakeyword{in}\ SML\ \isakeyword{file}\ {\isachardoublequoteopen}examples{\isacharslash}bool{\isacharunderscore}mlbool{\isachardot}ML{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1224
\begin{isamarkuptext}%
21348
haftmann
parents: 21186
diff changeset
  1225
\lstsml{Thy/examples/bool_mlbool.ML}
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1226
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1227
  \noindent This still is not perfect: the parentheses
21348
haftmann
parents: 21186
diff changeset
  1228
  around the \qt{andalso} expression are superfluous.
haftmann
parents: 21186
diff changeset
  1229
  Though the serializer
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1230
  by no means attempts to imitate the rich Isabelle syntax
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1231
  framework, it provides some common idioms, notably
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1232
  associative infixes with precedences which may be used here:%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1233
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1234
\isamarkuptrue%
21348
haftmann
parents: 21186
diff changeset
  1235
%
haftmann
parents: 21186
diff changeset
  1236
\isadelimtt
haftmann
parents: 21186
diff changeset
  1237
%
haftmann
parents: 21186
diff changeset
  1238
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1239
%
haftmann
parents: 21186
diff changeset
  1240
\isatagtt
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1241
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1242
\ {\isachardoublequoteopen}op\ {\isasymand}{\isachardoublequoteclose}\isanewline
21348
haftmann
parents: 21186
diff changeset
  1243
\ \ {\isacharparenleft}SML\ \isakeyword{infixl}\ {\isadigit{1}}\ {\isachardoublequoteopen}andalso{\isachardoublequoteclose}{\isacharparenright}%
haftmann
parents: 21186
diff changeset
  1244
\endisatagtt
haftmann
parents: 21186
diff changeset
  1245
{\isafoldtt}%
haftmann
parents: 21186
diff changeset
  1246
%
haftmann
parents: 21186
diff changeset
  1247
\isadelimtt
haftmann
parents: 21186
diff changeset
  1248
%
haftmann
parents: 21186
diff changeset
  1249
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1250
\isanewline
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1251
\isanewline
24379
823ffe1fdf67 updated
haftmann
parents: 24279
diff changeset
  1252
\isacommand{export{\isacharunderscore}code}\isamarkupfalse%
22845
5f9138bcb3d7 changed code generator invocation syntax
haftmann
parents: 22798
diff changeset
  1253
\ in{\isacharunderscore}interval\ \ \isakeyword{in}\ SML\ \isakeyword{file}\ {\isachardoublequoteopen}examples{\isacharslash}bool{\isacharunderscore}infix{\isachardot}ML{\isachardoublequoteclose}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1254
\begin{isamarkuptext}%
21348
haftmann
parents: 21186
diff changeset
  1255
\lstsml{Thy/examples/bool_infix.ML}
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1256
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1257
  \medskip
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1258
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1259
  Next, we try to map HOL pairs to SML pairs, using the
21348
haftmann
parents: 21186
diff changeset
  1260
  infix ``\verb|*|'' type constructor and parentheses:%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1261
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1262
\isamarkuptrue%
21348
haftmann
parents: 21186
diff changeset
  1263
%
haftmann
parents: 21186
diff changeset
  1264
\isadelimtt
haftmann
parents: 21186
diff changeset
  1265
%
haftmann
parents: 21186
diff changeset
  1266
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1267
%
haftmann
parents: 21186
diff changeset
  1268
\isatagtt
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1269
\isacommand{code{\isacharunderscore}type}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1270
\ {\isacharasterisk}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1271
\ \ {\isacharparenleft}SML\ \isakeyword{infix}\ {\isadigit{2}}\ {\isachardoublequoteopen}{\isacharasterisk}{\isachardoublequoteclose}{\isacharparenright}\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1272
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1273
\ Pair\isanewline
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1274
\ \ {\isacharparenleft}SML\ {\isachardoublequoteopen}{\isacharbang}{\isacharparenleft}{\isacharparenleft}{\isacharunderscore}{\isacharparenright}{\isacharcomma}{\isacharslash}\ {\isacharparenleft}{\isacharunderscore}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}%
21348
haftmann
parents: 21186
diff changeset
  1275
\endisatagtt
haftmann
parents: 21186
diff changeset
  1276
{\isafoldtt}%
haftmann
parents: 21186
diff changeset
  1277
%
haftmann
parents: 21186
diff changeset
  1278
\isadelimtt
haftmann
parents: 21186
diff changeset
  1279
%
haftmann
parents: 21186
diff changeset
  1280
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1281
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1282
\begin{isamarkuptext}%
21348
haftmann
parents: 21186
diff changeset
  1283
The initial bang ``\verb|!|'' tells the serializer to never put
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1284
  parentheses around the whole expression (they are already present),
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1285
  while the parentheses around argument place holders
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1286
  tell not to put parentheses around the arguments.
21348
haftmann
parents: 21186
diff changeset
  1287
  The slash ``\verb|/|'' (followed by arbitrary white space)
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1288
  inserts a space which may be used as a break if necessary
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1289
  during pretty printing.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1290
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1291
  These examples give a glimpse what mechanisms
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1292
  custom serializations provide; however their usage
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1293
  requires careful thinking in order not to introduce
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1294
  inconsistencies -- or, in other words:
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1295
  custom serializations are completely axiomatic.
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1296
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1297
  A further noteworthy details is that any special
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1298
  character in a custom serialization may be quoted
21348
haftmann
parents: 21186
diff changeset
  1299
  using ``\verb|'|''; thus, in
haftmann
parents: 21186
diff changeset
  1300
  ``\verb|fn '_ => _|'' the first
haftmann
parents: 21186
diff changeset
  1301
  ``\verb|_|'' is a proper underscore while the
haftmann
parents: 21186
diff changeset
  1302
  second ``\verb|_|'' is a placeholder.
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1303
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1304
  The HOL theories provide further
25411
ac31c92e4bf5 updated
haftmann
parents: 25370
diff changeset
  1305
  examples for custom serializations.%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1306
\end{isamarkuptext}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1307
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1308
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1309
\isamarkupsubsubsection{Haskell serialization%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1310
}
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1311
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1312
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1313
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1314
For convenience, the default
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1315
  HOL setup for Haskell maps the \isa{eq} class to
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1316
  its counterpart in Haskell, giving custom serializations
21348
haftmann
parents: 21186
diff changeset
  1317
  for the class (\isa{{\isasymCODECLASS}}) and its operation:%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1318
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1319
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1320
%
21348
haftmann
parents: 21186
diff changeset
  1321
\isadelimtt
haftmann
parents: 21186
diff changeset
  1322
%
haftmann
parents: 21186
diff changeset
  1323
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1324
%
haftmann
parents: 21186
diff changeset
  1325
\isatagtt
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1326
\isacommand{code{\isacharunderscore}class}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1327
\ eq\isanewline
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1328
\ \ {\isacharparenleft}Haskell\ {\isachardoublequoteopen}Eq{\isachardoublequoteclose}\ \isakeyword{where}\ {\isachardoublequoteopen}op\ {\isacharequal}{\isachardoublequoteclose}\ {\isasymequiv}\ {\isachardoublequoteopen}{\isacharparenleft}{\isacharequal}{\isacharequal}{\isacharparenright}{\isachardoublequoteclose}{\isacharparenright}\isanewline
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1329
\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1330
\isacommand{code{\isacharunderscore}const}\isamarkupfalse%
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1331
\ {\isachardoublequoteopen}op\ {\isacharequal}{\isachardoublequoteclose}\isanewline
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1332
\ \ {\isacharparenleft}Haskell\ \isakeyword{infixl}\ {\isadigit{4}}\ {\isachardoublequoteopen}{\isacharequal}{\isacharequal}{\isachardoublequoteclose}{\isacharparenright}%
21348
haftmann
parents: 21186
diff changeset
  1333
\endisatagtt
haftmann
parents: 21186
diff changeset
  1334
{\isafoldtt}%
haftmann
parents: 21186
diff changeset
  1335
%
haftmann
parents: 21186
diff changeset
  1336
\isadelimtt
haftmann
parents: 21186
diff changeset
  1337
%
haftmann
parents: 21186
diff changeset
  1338
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1339
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1340
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1341
A problem now occurs whenever a type which
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1342
  is an instance of \isa{eq} in HOL is mapped
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1343
  on a Haskell-builtin type which is also an instance
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1344
  of Haskell \isa{Eq}:%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1345
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1346
\isamarkuptrue%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1347
\isacommand{typedecl}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1348
\ bar\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1349
\isanewline
26513
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 25870
diff changeset
  1350
\isacommand{instantiation}\isamarkupfalse%
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 25870
diff changeset
  1351
\ bar\ {\isacharcolon}{\isacharcolon}\ eq\isanewline
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 25870
diff changeset
  1352
\isakeyword{begin}\isanewline
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 25870
diff changeset
  1353
\isanewline
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 25870
diff changeset
  1354
\isacommand{definition}\isamarkupfalse%
26732
6ea9de67e576 constant HOL.eq now qualified
haftmann
parents: 26513
diff changeset
  1355
\ {\isachardoublequoteopen}eq{\isacharunderscore}class{\isachardot}eq\ {\isacharparenleft}x{\isasymColon}bar{\isacharparenright}\ y\ {\isasymlongleftrightarrow}\ x\ {\isacharequal}\ y{\isachardoublequoteclose}\isanewline
26513
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 25870
diff changeset
  1356
\isanewline
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1357
\isacommand{instance}\isamarkupfalse%
26513
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 25870
diff changeset
  1358
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1359
\isadelimproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1360
\ %
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1361
\endisadelimproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1362
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1363
\isatagproof
26513
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 25870
diff changeset
  1364
\isacommand{by}\isamarkupfalse%
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 25870
diff changeset
  1365
\ default\ {\isacharparenleft}simp\ add{\isacharcolon}\ eq{\isacharunderscore}bar{\isacharunderscore}def{\isacharparenright}%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1366
\endisatagproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1367
{\isafoldproof}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1368
%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1369
\isadelimproof
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1370
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1371
\endisadelimproof
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1372
\isanewline
26513
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 25870
diff changeset
  1373
\isanewline
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 25870
diff changeset
  1374
\isacommand{end}\isamarkupfalse%
6f306c8c2c54 explicit class "eq" for operational equality
haftmann
parents: 25870
diff changeset
  1375
\isanewline
21348
haftmann
parents: 21186
diff changeset
  1376
%
haftmann
parents: 21186
diff changeset
  1377
\isadelimtt
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1378
\isanewline
21348
haftmann
parents: 21186
diff changeset
  1379
%
haftmann
parents: 21186
diff changeset
  1380
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1381
%
haftmann
parents: 21186
diff changeset
  1382
\isatagtt
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1383
\isacommand{code{\isacharunderscore}type}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1384
\ bar\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1385
\ \ {\isacharparenleft}Haskell\ {\isachardoublequoteopen}Integer{\isachardoublequoteclose}{\isacharparenright}%
21348
haftmann
parents: 21186
diff changeset
  1386
\endisatagtt
haftmann
parents: 21186
diff changeset
  1387
{\isafoldtt}%
haftmann
parents: 21186
diff changeset
  1388
%
haftmann
parents: 21186
diff changeset
  1389
\isadelimtt
haftmann
parents: 21186
diff changeset
  1390
%
haftmann
parents: 21186
diff changeset
  1391
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1392
%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1393
\begin{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1394
The code generator would produce
22188
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1395
  an additional instance, which of course is rejected.
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1396
  To suppress this additional instance, use
a63889770d57 adjusted manual to improved treatment of overloaded constants
haftmann
parents: 22060
diff changeset
  1397
  \isa{{\isasymCODEINSTANCE}}:%
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1398
\end{isamarkuptext}%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1399
\isamarkuptrue%
21348
haftmann
parents: 21186
diff changeset
  1400
%
haftmann
parents: 21186
diff changeset
  1401
\isadelimtt
haftmann
parents: 21186
diff changeset
  1402
%
haftmann
parents: 21186
diff changeset
  1403
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1404
%
haftmann
parents: 21186
diff changeset
  1405
\isatagtt
21186
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1406
\isacommand{code{\isacharunderscore}instance}\isamarkupfalse%
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1407
\ bar\ {\isacharcolon}{\isacharcolon}\ eq\isanewline
0c51cd55a79c updated;
wenzelm
parents: 21172
diff changeset
  1408
\ \ {\isacharparenleft}Haskell\ {\isacharminus}{\isacharparenright}%
21348
haftmann
parents: 21186
diff changeset
  1409
\endisatagtt
haftmann
parents: 21186
diff changeset
  1410
{\isafoldtt}%
haftmann
parents: 21186
diff changeset
  1411
%
haftmann
parents: 21186
diff changeset
  1412
\isadelimtt
haftmann
parents: 21186
diff changeset
  1413
%
haftmann
parents: 21186
diff changeset
  1414
\endisadelimtt
haftmann
parents: 21186
diff changeset
  1415
%
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1416
\isamarkupsubsubsection{Pretty printing%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1417
}
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1418
\isamarkuptrue%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1419
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1420
\begin{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1421
The serializer provides ML interfaces to set up
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1422
  pretty serializations for expressions like lists, numerals
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1423
  and characters;  these are
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1424
  monolithic stubs and should only be used with the
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1425
  theories introduces in \secref{sec:library}.%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1426
\end{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1427
\isamarkuptrue%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1428
%
21348
haftmann
parents: 21186
diff changeset
  1429
\isamarkupsubsection{Cyclic module dependencies%
haftmann
parents: 21186
diff changeset
  1430
}
haftmann
parents: 21186
diff changeset
  1431
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1432
%
haftmann
parents: 21186
diff changeset
  1433
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1434
Sometimes the awkward situation occurs that dependencies
haftmann
parents: 21186
diff changeset
  1435
  between definitions introduce cyclic dependencies
haftmann
parents: 21186
diff changeset
  1436
  between modules, which in the Haskell world leaves
haftmann
parents: 21186
diff changeset
  1437
  you to the mercy of the Haskell implementation you are using,
haftmann
parents: 21186
diff changeset
  1438
  while for SML code generation is not possible.
haftmann
parents: 21186
diff changeset
  1439
haftmann
parents: 21186
diff changeset
  1440
  A solution is to declare module names explicitly.
haftmann
parents: 21186
diff changeset
  1441
  Let use assume the three cyclically dependent
haftmann
parents: 21186
diff changeset
  1442
  modules are named \emph{A}, \emph{B} and \emph{C}.
haftmann
parents: 21186
diff changeset
  1443
  Then, by stating%
haftmann
parents: 21186
diff changeset
  1444
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1445
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1446
\isacommand{code{\isacharunderscore}modulename}\isamarkupfalse%
haftmann
parents: 21186
diff changeset
  1447
\ SML\isanewline
haftmann
parents: 21186
diff changeset
  1448
\ \ A\ ABC\isanewline
haftmann
parents: 21186
diff changeset
  1449
\ \ B\ ABC\isanewline
haftmann
parents: 21186
diff changeset
  1450
\ \ C\ ABC%
haftmann
parents: 21186
diff changeset
  1451
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1452
we explicitly map all those modules on \emph{ABC},
haftmann
parents: 21186
diff changeset
  1453
  resulting in an ad-hoc merge of this three modules
haftmann
parents: 21186
diff changeset
  1454
  at serialization time.%
haftmann
parents: 21186
diff changeset
  1455
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1456
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1457
%
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1458
\isamarkupsubsection{Incremental code generation%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1459
}
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1460
\isamarkuptrue%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1461
%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1462
\begin{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1463
Code generation is \emph{incremental}: theorems
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1464
  and abstract intermediate code are cached and extended on demand.
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1465
  The cache may be partially or fully dropped if the underlying
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1466
  executable content of the theory changes.
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1467
  Implementation of caching is supposed to transparently
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1468
  hid away the details from the user.  Anyway, caching
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1469
  reaches the surface by using a slightly more general form
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1470
  of the \isa{{\isasymCODETHMS}}, \isa{{\isasymCODEDEPS}}
24379
823ffe1fdf67 updated
haftmann
parents: 24279
diff changeset
  1471
  and \isa{{\isasymEXPORTCODE}} commands: the list of constants
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1472
  may be omitted.  Then, all constants with code theorems
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1473
  in the current cache are referred to.%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1474
\end{isamarkuptext}%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1475
\isamarkuptrue%
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1476
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1477
\isamarkupsection{ML interfaces \label{sec:ml}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1478
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1479
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1480
%
21348
haftmann
parents: 21186
diff changeset
  1481
\begin{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1482
Since the code generator framework not only aims to provide
haftmann
parents: 21186
diff changeset
  1483
  a nice Isar interface but also to form a base for
haftmann
parents: 21186
diff changeset
  1484
  code-generation-based applications, here a short
haftmann
parents: 21186
diff changeset
  1485
  description of the most important ML interfaces.%
haftmann
parents: 21186
diff changeset
  1486
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1487
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1488
%
24217
5c4913b478f5 updated
haftmann
parents: 24193
diff changeset
  1489
\isamarkupsubsection{Executable theory content: \isa{Code}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1490
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1491
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1492
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1493
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1494
This Pure module implements the core notions of
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1495
  executable content of a theory.%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1496
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1497
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1498
%
22292
3b118010ec08 adjusted to new code generator Isar commands and changes in implementation
haftmann
parents: 22188
diff changeset
  1499
\isamarkupsubsubsection{Managing executable content%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1500
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1501
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1502
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1503
\isadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1504
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1505
\endisadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1506
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1507
\isatagmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1508
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1509
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1510
\begin{mldecls}
26856
610ca045b1b2 updated generated file;
wenzelm
parents: 26732
diff changeset
  1511
  \indexml{Code.add\_func}\verb|Code.add_func: thm -> theory -> theory| \\
610ca045b1b2 updated generated file;
wenzelm
parents: 26732
diff changeset
  1512
  \indexml{Code.del\_func}\verb|Code.del_func: thm -> theory -> theory| \\
610ca045b1b2 updated generated file;
wenzelm
parents: 26732
diff changeset
  1513
  \indexml{Code.add\_funcl}\verb|Code.add_funcl: string * thm list Susp.T -> theory -> theory| \\
27557
151731493264 simpsets as pre/postprocessors; generic preprocessor now named function transformators
haftmann
parents: 26999
diff changeset
  1514
  \indexml{Code.map\_pre}\verb|Code.map_pre: (MetaSimplifier.simpset -> MetaSimplifier.simpset) -> theory -> theory| \\
151731493264 simpsets as pre/postprocessors; generic preprocessor now named function transformators
haftmann
parents: 26999
diff changeset
  1515
  \indexml{Code.map\_post}\verb|Code.map_post: (MetaSimplifier.simpset -> MetaSimplifier.simpset) -> theory -> theory| \\
27609
b23c9ad0fe7d tuned code theorem bookkeeping
haftmann
parents: 27557
diff changeset
  1516
  \indexml{Code.add\_functrans}\verb|Code.add_functrans: string * (theory -> thm list -> thm list option)|\isasep\isanewline%
21348
haftmann
parents: 21186
diff changeset
  1517
\verb|    -> theory -> theory| \\
27557
151731493264 simpsets as pre/postprocessors; generic preprocessor now named function transformators
haftmann
parents: 26999
diff changeset
  1518
  \indexml{Code.del\_functrans}\verb|Code.del_functrans: string -> theory -> theory| \\
26856
610ca045b1b2 updated generated file;
wenzelm
parents: 26732
diff changeset
  1519
  \indexml{Code.add\_datatype}\verb|Code.add_datatype: (string * typ) list -> theory -> theory| \\
610ca045b1b2 updated generated file;
wenzelm
parents: 26732
diff changeset
  1520
  \indexml{Code.get\_datatype}\verb|Code.get_datatype: theory -> string|\isasep\isanewline%
22479
de15ea8fb348 updated code generation sections
haftmann
parents: 22385
diff changeset
  1521
\verb|    -> (string * sort) list * (string * typ list) list| \\
26856
610ca045b1b2 updated generated file;
wenzelm
parents: 26732
diff changeset
  1522
  \indexml{Code.get\_datatype\_of\_constr}\verb|Code.get_datatype_of_constr: theory -> string -> string option|
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1523
  \end{mldecls}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1524
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1525
  \begin{description}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1526
24217
5c4913b478f5 updated
haftmann
parents: 24193
diff changeset
  1527
  \item \verb|Code.add_func|~\isa{thm}~\isa{thy} adds function
21348
haftmann
parents: 21186
diff changeset
  1528
     theorem \isa{thm} to executable content.
haftmann
parents: 21186
diff changeset
  1529
24217
5c4913b478f5 updated
haftmann
parents: 24193
diff changeset
  1530
  \item \verb|Code.del_func|~\isa{thm}~\isa{thy} removes function
21348
haftmann
parents: 21186
diff changeset
  1531
     theorem \isa{thm} from executable content, if present.
haftmann
parents: 21186
diff changeset
  1532
24217
5c4913b478f5 updated
haftmann
parents: 24193
diff changeset
  1533
  \item \verb|Code.add_funcl|~\isa{{\isacharparenleft}const{\isacharcomma}\ lthms{\isacharparenright}}~\isa{thy} adds
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1534
     suspended defining equations \isa{lthms} for constant
21348
haftmann
parents: 21186
diff changeset
  1535
     \isa{const} to executable content.
haftmann
parents: 21186
diff changeset
  1536
27557
151731493264 simpsets as pre/postprocessors; generic preprocessor now named function transformators
haftmann
parents: 26999
diff changeset
  1537
  \item \verb|Code.map_pre|~\isa{f}~\isa{thy} changes
151731493264 simpsets as pre/postprocessors; generic preprocessor now named function transformators
haftmann
parents: 26999
diff changeset
  1538
     the preprocessor simpset.
21348
haftmann
parents: 21186
diff changeset
  1539
27557
151731493264 simpsets as pre/postprocessors; generic preprocessor now named function transformators
haftmann
parents: 26999
diff changeset
  1540
    \item \verb|Code.add_functrans|~\isa{{\isacharparenleft}name{\isacharcomma}\ f{\isacharparenright}}~\isa{thy} adds
27609
b23c9ad0fe7d tuned code theorem bookkeeping
haftmann
parents: 27557
diff changeset
  1541
     function transformer \isa{f} (named \isa{name}) to executable content;
b23c9ad0fe7d tuned code theorem bookkeeping
haftmann
parents: 27557
diff changeset
  1542
     \isa{f} is a transformer of the defining equations belonging
21348
haftmann
parents: 21186
diff changeset
  1543
     to a certain function definition, depending on the
27609
b23c9ad0fe7d tuned code theorem bookkeeping
haftmann
parents: 27557
diff changeset
  1544
     current theory context.  Returning \isa{NONE} indicates that no
b23c9ad0fe7d tuned code theorem bookkeeping
haftmann
parents: 27557
diff changeset
  1545
     transformation took place;  otherwise, the whole process will be iterated
b23c9ad0fe7d tuned code theorem bookkeeping
haftmann
parents: 27557
diff changeset
  1546
     with the new defining equations.
21348
haftmann
parents: 21186
diff changeset
  1547
27557
151731493264 simpsets as pre/postprocessors; generic preprocessor now named function transformators
haftmann
parents: 26999
diff changeset
  1548
  \item \verb|Code.del_functrans|~\isa{name}~\isa{thy} removes
27609
b23c9ad0fe7d tuned code theorem bookkeeping
haftmann
parents: 27557
diff changeset
  1549
     function transformer named \isa{name} from executable content.
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1550
24421
acfb2413faa3 updated
haftmann
parents: 24379
diff changeset
  1551
  \item \verb|Code.add_datatype|~\isa{cs}~\isa{thy} adds
acfb2413faa3 updated
haftmann
parents: 24379
diff changeset
  1552
     a datatype to executable content, with generation
acfb2413faa3 updated
haftmann
parents: 24379
diff changeset
  1553
     set \isa{cs}.
21348
haftmann
parents: 21186
diff changeset
  1554
24217
5c4913b478f5 updated
haftmann
parents: 24193
diff changeset
  1555
  \item \verb|Code.get_datatype_of_constr|~\isa{thy}~\isa{const}
21348
haftmann
parents: 21186
diff changeset
  1556
     returns type constructor corresponding to
haftmann
parents: 21186
diff changeset
  1557
     constructor \isa{const}; returns \isa{NONE}
haftmann
parents: 21186
diff changeset
  1558
     if \isa{const} is no constructor.
haftmann
parents: 21186
diff changeset
  1559
haftmann
parents: 21186
diff changeset
  1560
  \end{description}%
haftmann
parents: 21186
diff changeset
  1561
\end{isamarkuptext}%
haftmann
parents: 21186
diff changeset
  1562
\isamarkuptrue%
haftmann
parents: 21186
diff changeset
  1563
%
haftmann
parents: 21186
diff changeset
  1564
\endisatagmlref
haftmann
parents: 21186
diff changeset
  1565
{\isafoldmlref}%
haftmann
parents: 21186
diff changeset
  1566
%
haftmann
parents: 21186
diff changeset
  1567
\isadelimmlref
haftmann
parents: 21186
diff changeset
  1568
%
haftmann
parents: 21186
diff changeset
  1569
\endisadelimmlref
haftmann
parents: 21186
diff changeset
  1570
%
22292
3b118010ec08 adjusted to new code generator Isar commands and changes in implementation
haftmann
parents: 22188
diff changeset
  1571
\isamarkupsubsection{Auxiliary%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1572
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1573
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1574
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1575
\isadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1576
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1577
\endisadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1578
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1579
\isatagmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1580
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1581
\begin{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1582
\begin{mldecls}
26856
610ca045b1b2 updated generated file;
wenzelm
parents: 26732
diff changeset
  1583
  \indexml{CodeUnit.read\_const}\verb|CodeUnit.read_const: theory -> string -> string| \\
26973
6d52187fc2a6 temporary adjustment
haftmann
parents: 26856
diff changeset
  1584
  \indexml{CodeUnit.head\_func}\verb|CodeUnit.head_func: thm -> string * ((string * sort) list * typ)| \\
27557
151731493264 simpsets as pre/postprocessors; generic preprocessor now named function transformators
haftmann
parents: 26999
diff changeset
  1585
  \indexml{CodeUnit.rewrite\_func}\verb|CodeUnit.rewrite_func: MetaSimplifier.simpset -> thm -> thm| \\
21348
haftmann
parents: 21186
diff changeset
  1586
  \end{mldecls}
haftmann
parents: 21186
diff changeset
  1587
haftmann
parents: 21186
diff changeset
  1588
  \begin{description}
haftmann
parents: 21186
diff changeset
  1589
24217
5c4913b478f5 updated
haftmann
parents: 24193
diff changeset
  1590
  \item \verb|CodeUnit.read_const|~\isa{thy}~\isa{s}
21348
haftmann
parents: 21186
diff changeset
  1591
     reads a constant as a concrete term expression \isa{s}.
haftmann
parents: 21186
diff changeset
  1592
24217
5c4913b478f5 updated
haftmann
parents: 24193
diff changeset
  1593
  \item \verb|CodeUnit.head_func|~\isa{thm}
22751
1bfd75c1f232 updated
haftmann
parents: 22550
diff changeset
  1594
     extracts the constant and its type from a defining equation \isa{thm}.
21348
haftmann
parents: 21186
diff changeset
  1595
27557
151731493264 simpsets as pre/postprocessors; generic preprocessor now named function transformators
haftmann
parents: 26999
diff changeset
  1596
  \item \verb|CodeUnit.rewrite_func|~\isa{ss}~\isa{thm}
151731493264 simpsets as pre/postprocessors; generic preprocessor now named function transformators
haftmann
parents: 26999
diff changeset
  1597
     rewrites a defining equation \isa{thm} with a simpset \isa{ss};
151731493264 simpsets as pre/postprocessors; generic preprocessor now named function transformators
haftmann
parents: 26999
diff changeset
  1598
     only arguments and right hand side are rewritten,
22060
8a37090726e8 adjusted manual
haftmann
parents: 21994
diff changeset
  1599
     not the head of the defining equation.
21348
haftmann
parents: 21186
diff changeset
  1600
haftmann
parents: 21186
diff changeset
  1601
  \end{description}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1602
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1603
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1604
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1605
\endisatagmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1606
{\isafoldmlref}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1607
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1608
\isadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1609
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1610
\endisadelimmlref
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1611
%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1612
\isamarkupsubsection{Implementing code generator applications%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1613
}
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1614
\isamarkuptrue%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1615
%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1616
\begin{isamarkuptext}%
21348
haftmann
parents: 21186
diff changeset
  1617
Implementing code generator applications on top
haftmann
parents: 21186
diff changeset
  1618
  of the framework set out so far usually not only
haftmann
parents: 21186
diff changeset
  1619
  involves using those primitive interfaces
haftmann
parents: 21186
diff changeset
  1620
  but also storing code-dependent data and various
haftmann
parents: 21186
diff changeset
  1621
  other things.
haftmann
parents: 21186
diff changeset
  1622
haftmann
parents: 21186
diff changeset
  1623
  \begin{warn}
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1624
    Some interfaces discussed here have not reached
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1625
    a final state yet.
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1626
    Changes likely to occur in future.
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1627
  \end{warn}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1628
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1629
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1630
%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1631
\isamarkupsubsubsection{Data depending on the theory's executable content%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1632
}
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1633
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1634
%
21348
haftmann
parents: 21186
diff changeset
  1635
\begin{isamarkuptext}%
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1636
Due to incrementality of code generation, changes in the
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1637
  theory's executable content have to be propagated in a
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1638
  certain fashion.  Additionally, such changes may occur
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1639
  not only during theory extension but also during theory
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1640
  merge, which is a little bit nasty from an implementation
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1641
  point of view.  The framework provides a solution
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1642
  to this technical challenge by providing a functorial
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1643
  data slot \verb|CodeDataFun|; on instantiation
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1644
  of this functor, the following types and operations
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1645
  are required:
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1646
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1647
  \medskip
21348
haftmann
parents: 21186
diff changeset
  1648
  \begin{tabular}{l}
haftmann
parents: 21186
diff changeset
  1649
  \isa{type\ T} \\
haftmann
parents: 21186
diff changeset
  1650
  \isa{val\ empty{\isacharcolon}\ T} \\
haftmann
parents: 21186
diff changeset
  1651
  \isa{val\ merge{\isacharcolon}\ Pretty{\isachardot}pp\ {\isasymrightarrow}\ T\ {\isacharasterisk}\ T\ {\isasymrightarrow}\ T} \\
24217
5c4913b478f5 updated
haftmann
parents: 24193
diff changeset
  1652
  \isa{val\ purge{\isacharcolon}\ theory\ option\ {\isasymrightarrow}\ CodeUnit{\isachardot}const\ list\ option\ {\isasymrightarrow}\ T\ {\isasymrightarrow}\ T}
21348
haftmann
parents: 21186
diff changeset
  1653
  \end{tabular}
haftmann
parents: 21186
diff changeset
  1654
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1655
  \begin{description}
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1656
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1657
  \item \isa{T} the type of data to store.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1658
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1659
  \item \isa{empty} initial (empty) data.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1660
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1661
  \item \isa{merge} merging two data slots.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1662
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1663
  \item \isa{purge}~\isa{thy}~\isa{consts} propagates changes in executable content;
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1664
    if possible, the current theory context is handed over
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1665
    as argument \isa{thy} (if there is no current theory context (e.g.~during
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1666
    theory merge, \verb|NONE|); \isa{consts} indicates the kind
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1667
    of change: \verb|NONE| stands for a fundamental change
22798
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1668
    which invalidates any existing code, \isa{SOME\ consts}
e3962371f568 updated doc
haftmann
parents: 22751
diff changeset
  1669
    hints that executable content for constants \isa{consts}
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1670
    has changed.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1671
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1672
  \end{description}
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1673
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1674
  An instance of \verb|CodeDataFun| provides the following
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1675
  interface:
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1676
21348
haftmann
parents: 21186
diff changeset
  1677
  \medskip
haftmann
parents: 21186
diff changeset
  1678
  \begin{tabular}{l}
haftmann
parents: 21186
diff changeset
  1679
  \isa{get{\isacharcolon}\ theory\ {\isasymrightarrow}\ T} \\
haftmann
parents: 21186
diff changeset
  1680
  \isa{change{\isacharcolon}\ theory\ {\isasymrightarrow}\ {\isacharparenleft}T\ {\isasymrightarrow}\ T{\isacharparenright}\ {\isasymrightarrow}\ T} \\
haftmann
parents: 21186
diff changeset
  1681
  \isa{change{\isacharunderscore}yield{\isacharcolon}\ theory\ {\isasymrightarrow}\ {\isacharparenleft}T\ {\isasymrightarrow}\ {\isacharprime}a\ {\isacharasterisk}\ T{\isacharparenright}\ {\isasymrightarrow}\ {\isacharprime}a\ {\isacharasterisk}\ T}
21452
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1682
  \end{tabular}
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1683
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1684
  \begin{description}
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1685
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1686
  \item \isa{get} retrieval of the current data.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1687
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1688
  \item \isa{change} update of current data (cached!)
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1689
    by giving a continuation.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1690
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1691
  \item \isa{change{\isacharunderscore}yield} update with side result.
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1692
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1693
  \end{description}%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1694
\end{isamarkuptext}%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1695
\isamarkuptrue%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1696
%
f825e0b4d566 final draft
haftmann
parents: 21348
diff changeset
  1697
\begin{isamarkuptext}%
24628
33137422d7fd updated
haftmann
parents: 24421
diff changeset
  1698
\emph{Happy proving, happy hacking!}%
21172
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1699
\end{isamarkuptext}%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1700
\isamarkuptrue%
eea3c9048c7a updated;
wenzelm
parents: 20967
diff changeset
  1701
%
20967
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1702
\isadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1703
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1704
\endisadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1705
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1706
\isatagtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1707
\isacommand{end}\isamarkupfalse%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1708
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1709
\endisatagtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1710
{\isafoldtheory}%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1711
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1712
\isadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1713
%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1714
\endisadelimtheory
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1715
\isanewline
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1716
\end{isabellebody}%
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1717
%%% Local Variables:
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1718
%%% mode: latex
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1719
%%% TeX-master: "root"
1df105407f87 added tex files to CVS
haftmann
parents:
diff changeset
  1720
%%% End: