doc-src/IsarAdvanced/Codegen/Thy/document/Program.tex
author haftmann
Wed, 01 Oct 2008 13:33:54 +0200
changeset 28447 df77ed974a78
child 28456 7a558c872104
permissions -rw-r--r--
fixed
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28447
haftmann
parents:
diff changeset
     1
%
haftmann
parents:
diff changeset
     2
\begin{isabellebody}%
haftmann
parents:
diff changeset
     3
\def\isabellecontext{Program}%
haftmann
parents:
diff changeset
     4
%
haftmann
parents:
diff changeset
     5
\isadelimtheory
haftmann
parents:
diff changeset
     6
%
haftmann
parents:
diff changeset
     7
\endisadelimtheory
haftmann
parents:
diff changeset
     8
%
haftmann
parents:
diff changeset
     9
\isatagtheory
haftmann
parents:
diff changeset
    10
\isacommand{theory}\isamarkupfalse%
haftmann
parents:
diff changeset
    11
\ Program\isanewline
haftmann
parents:
diff changeset
    12
\isakeyword{imports}\ Introduction\isanewline
haftmann
parents:
diff changeset
    13
\isakeyword{begin}%
haftmann
parents:
diff changeset
    14
\endisatagtheory
haftmann
parents:
diff changeset
    15
{\isafoldtheory}%
haftmann
parents:
diff changeset
    16
%
haftmann
parents:
diff changeset
    17
\isadelimtheory
haftmann
parents:
diff changeset
    18
%
haftmann
parents:
diff changeset
    19
\endisadelimtheory
haftmann
parents:
diff changeset
    20
%
haftmann
parents:
diff changeset
    21
\isamarkupsection{Turning Theories into Programs \label{sec:program}%
haftmann
parents:
diff changeset
    22
}
haftmann
parents:
diff changeset
    23
\isamarkuptrue%
haftmann
parents:
diff changeset
    24
%
haftmann
parents:
diff changeset
    25
\isamarkupsubsection{The \isa{Isabelle{\isacharslash}HOL} default setup%
haftmann
parents:
diff changeset
    26
}
haftmann
parents:
diff changeset
    27
\isamarkuptrue%
haftmann
parents:
diff changeset
    28
%
haftmann
parents:
diff changeset
    29
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
    30
We have already seen how by default equations stemming from
haftmann
parents:
diff changeset
    31
  \hyperlink{command.definition}{\mbox{\isa{\isacommand{definition}}}}/\hyperlink{command.primrec}{\mbox{\isa{\isacommand{primrec}}}}/\hyperlink{command.fun}{\mbox{\isa{\isacommand{fun}}}}
haftmann
parents:
diff changeset
    32
  statements are used for code generation.  This default behaviour
haftmann
parents:
diff changeset
    33
  can be changed, e.g. by providing different defining equations.
haftmann
parents:
diff changeset
    34
  All kinds of customization shown in this section is \emph{safe}
haftmann
parents:
diff changeset
    35
  in the sense that the user does not have to worry about
haftmann
parents:
diff changeset
    36
  correctness -- all programs generatable that way are partially
haftmann
parents:
diff changeset
    37
  correct.%
haftmann
parents:
diff changeset
    38
\end{isamarkuptext}%
haftmann
parents:
diff changeset
    39
\isamarkuptrue%
haftmann
parents:
diff changeset
    40
%
haftmann
parents:
diff changeset
    41
\isamarkupsubsection{Selecting code equations%
haftmann
parents:
diff changeset
    42
}
haftmann
parents:
diff changeset
    43
\isamarkuptrue%
haftmann
parents:
diff changeset
    44
%
haftmann
parents:
diff changeset
    45
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
    46
Coming back to our introductory example, we
haftmann
parents:
diff changeset
    47
  could provide an alternative defining equations for \isa{dequeue}
haftmann
parents:
diff changeset
    48
  explicitly:%
haftmann
parents:
diff changeset
    49
\end{isamarkuptext}%
haftmann
parents:
diff changeset
    50
\isamarkuptrue%
haftmann
parents:
diff changeset
    51
%
haftmann
parents:
diff changeset
    52
\isadelimquoteme
haftmann
parents:
diff changeset
    53
%
haftmann
parents:
diff changeset
    54
\endisadelimquoteme
haftmann
parents:
diff changeset
    55
%
haftmann
parents:
diff changeset
    56
\isatagquoteme
haftmann
parents:
diff changeset
    57
\isacommand{lemma}\isamarkupfalse%
haftmann
parents:
diff changeset
    58
\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
haftmann
parents:
diff changeset
    59
\ \ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}Queue\ xs\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\isanewline
haftmann
parents:
diff changeset
    60
\ \ \ \ \ {\isacharparenleft}if\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ then\ {\isacharparenleft}None{\isacharcomma}\ Queue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ else\ dequeue\ {\isacharparenleft}Queue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharparenleft}rev\ xs{\isacharparenright}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
    61
\ \ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}Queue\ xs\ {\isacharparenleft}y\ {\isacharhash}\ ys{\isacharparenright}{\isacharparenright}\ {\isacharequal}\isanewline
haftmann
parents:
diff changeset
    62
\ \ \ \ \ {\isacharparenleft}Some\ y{\isacharcomma}\ Queue\ xs\ ys{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
    63
\ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
    64
\ {\isacharparenleft}cases\ xs{\isacharcomma}\ simp{\isacharunderscore}all{\isacharparenright}\ {\isacharparenleft}cases\ {\isachardoublequoteopen}rev\ xs{\isachardoublequoteclose}{\isacharcomma}\ simp{\isacharunderscore}all{\isacharparenright}%
haftmann
parents:
diff changeset
    65
\endisatagquoteme
haftmann
parents:
diff changeset
    66
{\isafoldquoteme}%
haftmann
parents:
diff changeset
    67
%
haftmann
parents:
diff changeset
    68
\isadelimquoteme
haftmann
parents:
diff changeset
    69
%
haftmann
parents:
diff changeset
    70
\endisadelimquoteme
haftmann
parents:
diff changeset
    71
%
haftmann
parents:
diff changeset
    72
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
    73
\noindent The annotation \isa{{\isacharbrackleft}code\ func{\isacharbrackright}} is an \isa{Isar}
haftmann
parents:
diff changeset
    74
  \isa{attribute} which states that the given theorems should be
haftmann
parents:
diff changeset
    75
  considered as defining equations for a \isa{fun} statement --
haftmann
parents:
diff changeset
    76
  the corresponding constant is determined syntactically.  The resulting code:%
haftmann
parents:
diff changeset
    77
\end{isamarkuptext}%
haftmann
parents:
diff changeset
    78
\isamarkuptrue%
haftmann
parents:
diff changeset
    79
%
haftmann
parents:
diff changeset
    80
\isadelimquoteme
haftmann
parents:
diff changeset
    81
%
haftmann
parents:
diff changeset
    82
\endisadelimquoteme
haftmann
parents:
diff changeset
    83
%
haftmann
parents:
diff changeset
    84
\isatagquoteme
haftmann
parents:
diff changeset
    85
%
haftmann
parents:
diff changeset
    86
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
    87
\isaverbatim%
haftmann
parents:
diff changeset
    88
\noindent%
haftmann
parents:
diff changeset
    89
\verb|module Example where {|\newline%
haftmann
parents:
diff changeset
    90
\newline%
haftmann
parents:
diff changeset
    91
\newline%
haftmann
parents:
diff changeset
    92
\verb|foldla :: forall a b. (a -> b -> a) -> a -> [b] -> a;|\newline%
haftmann
parents:
diff changeset
    93
\verb|foldla f a [] = a;|\newline%
haftmann
parents:
diff changeset
    94
\verb|foldla f a (x : xs) = foldla f (f a x) xs;|\newline%
haftmann
parents:
diff changeset
    95
\newline%
haftmann
parents:
diff changeset
    96
\verb|rev :: forall a. [a] -> [a];|\newline%
haftmann
parents:
diff changeset
    97
\verb|rev xs = foldla (\ xsa x -> x : xsa) [] xs;|\newline%
haftmann
parents:
diff changeset
    98
\newline%
haftmann
parents:
diff changeset
    99
\verb|nulla :: forall a. [a] -> Bool;|\newline%
haftmann
parents:
diff changeset
   100
\verb|nulla (x : xs) = False;|\newline%
haftmann
parents:
diff changeset
   101
\verb|nulla [] = True;|\newline%
haftmann
parents:
diff changeset
   102
\newline%
haftmann
parents:
diff changeset
   103
\verb|data Queue a = Queue [a] [a];|\newline%
haftmann
parents:
diff changeset
   104
\newline%
haftmann
parents:
diff changeset
   105
\verb|empty :: forall a. Queue a;|\newline%
haftmann
parents:
diff changeset
   106
\verb|empty = Queue [] [];|\newline%
haftmann
parents:
diff changeset
   107
\newline%
haftmann
parents:
diff changeset
   108
\verb|dequeue :: forall a. Queue a -> (Maybe a, Queue a);|\newline%
haftmann
parents:
diff changeset
   109
\verb|dequeue (Queue xs (y : ys)) = (Just y, Queue xs ys);|\newline%
haftmann
parents:
diff changeset
   110
\verb|dequeue (Queue xs []) =|\newline%
haftmann
parents:
diff changeset
   111
\verb|  (if nulla xs then (Nothing, Queue [] [])|\newline%
haftmann
parents:
diff changeset
   112
\verb|    else dequeue (Queue [] (rev xs)));|\newline%
haftmann
parents:
diff changeset
   113
\newline%
haftmann
parents:
diff changeset
   114
\verb|enqueue :: forall a. a -> Queue a -> Queue a;|\newline%
haftmann
parents:
diff changeset
   115
\verb|enqueue x (Queue xs ys) = Queue (x : xs) ys;|\newline%
haftmann
parents:
diff changeset
   116
\newline%
haftmann
parents:
diff changeset
   117
\verb|}|%
haftmann
parents:
diff changeset
   118
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   119
\isamarkuptrue%
haftmann
parents:
diff changeset
   120
%
haftmann
parents:
diff changeset
   121
\endisatagquoteme
haftmann
parents:
diff changeset
   122
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   123
%
haftmann
parents:
diff changeset
   124
\isadelimquoteme
haftmann
parents:
diff changeset
   125
%
haftmann
parents:
diff changeset
   126
\endisadelimquoteme
haftmann
parents:
diff changeset
   127
%
haftmann
parents:
diff changeset
   128
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   129
\noindent You may note that the equality test \isa{xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}} has been
haftmann
parents:
diff changeset
   130
  replaced by the predicate \isa{null\ xs}.  This is due to the default
haftmann
parents:
diff changeset
   131
  setup in the \qn{preprocessor} to be discussed further below (\secref{sec:preproc}).
haftmann
parents:
diff changeset
   132
haftmann
parents:
diff changeset
   133
  Changing the default constructor set of datatypes is also
haftmann
parents:
diff changeset
   134
  possible but rarely desired in practice.  See \secref{sec:datatypes} for an example.
haftmann
parents:
diff changeset
   135
haftmann
parents:
diff changeset
   136
  As told in \secref{sec:concept}, code generation is based
haftmann
parents:
diff changeset
   137
  on a structured collection of code theorems.
haftmann
parents:
diff changeset
   138
  For explorative purpose, this collection
haftmann
parents:
diff changeset
   139
  may be inspected using the \hyperlink{command.code-thms}{\mbox{\isa{\isacommand{code{\isacharunderscore}thms}}}} command:%
haftmann
parents:
diff changeset
   140
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   141
\isamarkuptrue%
haftmann
parents:
diff changeset
   142
%
haftmann
parents:
diff changeset
   143
\isadelimquoteme
haftmann
parents:
diff changeset
   144
%
haftmann
parents:
diff changeset
   145
\endisadelimquoteme
haftmann
parents:
diff changeset
   146
%
haftmann
parents:
diff changeset
   147
\isatagquoteme
haftmann
parents:
diff changeset
   148
\isacommand{code{\isacharunderscore}thms}\isamarkupfalse%
haftmann
parents:
diff changeset
   149
\ dequeue%
haftmann
parents:
diff changeset
   150
\endisatagquoteme
haftmann
parents:
diff changeset
   151
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   152
%
haftmann
parents:
diff changeset
   153
\isadelimquoteme
haftmann
parents:
diff changeset
   154
%
haftmann
parents:
diff changeset
   155
\endisadelimquoteme
haftmann
parents:
diff changeset
   156
%
haftmann
parents:
diff changeset
   157
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   158
\noindent prints a table with \emph{all} defining equations
haftmann
parents:
diff changeset
   159
  for \isa{dequeue}, including
haftmann
parents:
diff changeset
   160
  \emph{all} defining equations those equations depend
haftmann
parents:
diff changeset
   161
  on recursively.
haftmann
parents:
diff changeset
   162
  
haftmann
parents:
diff changeset
   163
  Similarly, the \hyperlink{command.code-deps}{\mbox{\isa{\isacommand{code{\isacharunderscore}deps}}}} command shows a graph
haftmann
parents:
diff changeset
   164
  visualising dependencies between defining equations.%
haftmann
parents:
diff changeset
   165
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   166
\isamarkuptrue%
haftmann
parents:
diff changeset
   167
%
haftmann
parents:
diff changeset
   168
\isamarkupsubsection{\isa{class} and \isa{instantiation}%
haftmann
parents:
diff changeset
   169
}
haftmann
parents:
diff changeset
   170
\isamarkuptrue%
haftmann
parents:
diff changeset
   171
%
haftmann
parents:
diff changeset
   172
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   173
Concerning type classes and code generation, let us examine an example
haftmann
parents:
diff changeset
   174
  from abstract algebra:%
haftmann
parents:
diff changeset
   175
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   176
\isamarkuptrue%
haftmann
parents:
diff changeset
   177
%
haftmann
parents:
diff changeset
   178
\isadelimquoteme
haftmann
parents:
diff changeset
   179
%
haftmann
parents:
diff changeset
   180
\endisadelimquoteme
haftmann
parents:
diff changeset
   181
%
haftmann
parents:
diff changeset
   182
\isatagquoteme
haftmann
parents:
diff changeset
   183
\isacommand{class}\isamarkupfalse%
haftmann
parents:
diff changeset
   184
\ semigroup\ {\isacharequal}\ type\ {\isacharplus}\isanewline
haftmann
parents:
diff changeset
   185
\ \ \isakeyword{fixes}\ mult\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\ {\isacharparenleft}\isakeyword{infixl}\ {\isachardoublequoteopen}{\isasymotimes}{\isachardoublequoteclose}\ {\isadigit{7}}{\isadigit{0}}{\isacharparenright}\isanewline
haftmann
parents:
diff changeset
   186
\ \ \isakeyword{assumes}\ assoc{\isacharcolon}\ {\isachardoublequoteopen}{\isacharparenleft}x\ {\isasymotimes}\ y{\isacharparenright}\ {\isasymotimes}\ z\ {\isacharequal}\ x\ {\isasymotimes}\ {\isacharparenleft}y\ {\isasymotimes}\ z{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   187
\isanewline
haftmann
parents:
diff changeset
   188
\isacommand{class}\isamarkupfalse%
haftmann
parents:
diff changeset
   189
\ monoid\ {\isacharequal}\ semigroup\ {\isacharplus}\isanewline
haftmann
parents:
diff changeset
   190
\ \ \isakeyword{fixes}\ neutral\ {\isacharcolon}{\isacharcolon}\ {\isacharprime}a\ {\isacharparenleft}{\isachardoublequoteopen}{\isasymone}{\isachardoublequoteclose}{\isacharparenright}\isanewline
haftmann
parents:
diff changeset
   191
\ \ \isakeyword{assumes}\ neutl{\isacharcolon}\ {\isachardoublequoteopen}{\isasymone}\ {\isasymotimes}\ x\ {\isacharequal}\ x{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   192
\ \ \ \ \isakeyword{and}\ neutr{\isacharcolon}\ {\isachardoublequoteopen}x\ {\isasymotimes}\ {\isasymone}\ {\isacharequal}\ x{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   193
\isanewline
haftmann
parents:
diff changeset
   194
\isacommand{instantiation}\isamarkupfalse%
haftmann
parents:
diff changeset
   195
\ nat\ {\isacharcolon}{\isacharcolon}\ monoid\isanewline
haftmann
parents:
diff changeset
   196
\isakeyword{begin}\isanewline
haftmann
parents:
diff changeset
   197
\isanewline
haftmann
parents:
diff changeset
   198
\isacommand{primrec}\isamarkupfalse%
haftmann
parents:
diff changeset
   199
\ mult{\isacharunderscore}nat\ \isakeyword{where}\isanewline
haftmann
parents:
diff changeset
   200
\ \ \ \ {\isachardoublequoteopen}{\isadigit{0}}\ {\isasymotimes}\ n\ {\isacharequal}\ {\isacharparenleft}{\isadigit{0}}{\isasymColon}nat{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   201
\ \ {\isacharbar}\ {\isachardoublequoteopen}Suc\ m\ {\isasymotimes}\ n\ {\isacharequal}\ n\ {\isacharplus}\ m\ {\isasymotimes}\ n{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   202
\isanewline
haftmann
parents:
diff changeset
   203
\isacommand{definition}\isamarkupfalse%
haftmann
parents:
diff changeset
   204
\ neutral{\isacharunderscore}nat\ \isakeyword{where}\isanewline
haftmann
parents:
diff changeset
   205
\ \ {\isachardoublequoteopen}{\isasymone}\ {\isacharequal}\ Suc\ {\isadigit{0}}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   206
\isanewline
haftmann
parents:
diff changeset
   207
\isacommand{lemma}\isamarkupfalse%
haftmann
parents:
diff changeset
   208
\ add{\isacharunderscore}mult{\isacharunderscore}distrib{\isacharcolon}\isanewline
haftmann
parents:
diff changeset
   209
\ \ \isakeyword{fixes}\ n\ m\ q\ {\isacharcolon}{\isacharcolon}\ nat\isanewline
haftmann
parents:
diff changeset
   210
\ \ \isakeyword{shows}\ {\isachardoublequoteopen}{\isacharparenleft}n\ {\isacharplus}\ m{\isacharparenright}\ {\isasymotimes}\ q\ {\isacharequal}\ n\ {\isasymotimes}\ q\ {\isacharplus}\ m\ {\isasymotimes}\ q{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   211
\ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   212
\ {\isacharparenleft}induct\ n{\isacharparenright}\ simp{\isacharunderscore}all\isanewline
haftmann
parents:
diff changeset
   213
\isanewline
haftmann
parents:
diff changeset
   214
\isacommand{instance}\isamarkupfalse%
haftmann
parents:
diff changeset
   215
\ \isacommand{proof}\isamarkupfalse%
haftmann
parents:
diff changeset
   216
\isanewline
haftmann
parents:
diff changeset
   217
\ \ \isacommand{fix}\isamarkupfalse%
haftmann
parents:
diff changeset
   218
\ m\ n\ q\ {\isacharcolon}{\isacharcolon}\ nat\isanewline
haftmann
parents:
diff changeset
   219
\ \ \isacommand{show}\isamarkupfalse%
haftmann
parents:
diff changeset
   220
\ {\isachardoublequoteopen}m\ {\isasymotimes}\ n\ {\isasymotimes}\ q\ {\isacharequal}\ m\ {\isasymotimes}\ {\isacharparenleft}n\ {\isasymotimes}\ q{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   221
\ \ \ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   222
\ {\isacharparenleft}induct\ m{\isacharparenright}\ {\isacharparenleft}simp{\isacharunderscore}all\ add{\isacharcolon}\ add{\isacharunderscore}mult{\isacharunderscore}distrib{\isacharparenright}\isanewline
haftmann
parents:
diff changeset
   223
\ \ \isacommand{show}\isamarkupfalse%
haftmann
parents:
diff changeset
   224
\ {\isachardoublequoteopen}{\isasymone}\ {\isasymotimes}\ n\ {\isacharequal}\ n{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   225
\ \ \ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   226
\ {\isacharparenleft}simp\ add{\isacharcolon}\ neutral{\isacharunderscore}nat{\isacharunderscore}def{\isacharparenright}\isanewline
haftmann
parents:
diff changeset
   227
\ \ \isacommand{show}\isamarkupfalse%
haftmann
parents:
diff changeset
   228
\ {\isachardoublequoteopen}m\ {\isasymotimes}\ {\isasymone}\ {\isacharequal}\ m{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   229
\ \ \ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   230
\ {\isacharparenleft}induct\ m{\isacharparenright}\ {\isacharparenleft}simp{\isacharunderscore}all\ add{\isacharcolon}\ neutral{\isacharunderscore}nat{\isacharunderscore}def{\isacharparenright}\isanewline
haftmann
parents:
diff changeset
   231
\isacommand{qed}\isamarkupfalse%
haftmann
parents:
diff changeset
   232
\isanewline
haftmann
parents:
diff changeset
   233
\isanewline
haftmann
parents:
diff changeset
   234
\isacommand{end}\isamarkupfalse%
haftmann
parents:
diff changeset
   235
%
haftmann
parents:
diff changeset
   236
\endisatagquoteme
haftmann
parents:
diff changeset
   237
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   238
%
haftmann
parents:
diff changeset
   239
\isadelimquoteme
haftmann
parents:
diff changeset
   240
%
haftmann
parents:
diff changeset
   241
\endisadelimquoteme
haftmann
parents:
diff changeset
   242
%
haftmann
parents:
diff changeset
   243
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   244
\noindent We define the natural operation of the natural numbers
haftmann
parents:
diff changeset
   245
  on monoids:%
haftmann
parents:
diff changeset
   246
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   247
\isamarkuptrue%
haftmann
parents:
diff changeset
   248
%
haftmann
parents:
diff changeset
   249
\isadelimquoteme
haftmann
parents:
diff changeset
   250
%
haftmann
parents:
diff changeset
   251
\endisadelimquoteme
haftmann
parents:
diff changeset
   252
%
haftmann
parents:
diff changeset
   253
\isatagquoteme
haftmann
parents:
diff changeset
   254
\isacommand{primrec}\isamarkupfalse%
haftmann
parents:
diff changeset
   255
\ {\isacharparenleft}\isakeyword{in}\ monoid{\isacharparenright}\ pow\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
haftmann
parents:
diff changeset
   256
\ \ \ \ {\isachardoublequoteopen}pow\ {\isadigit{0}}\ a\ {\isacharequal}\ {\isasymone}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   257
\ \ {\isacharbar}\ {\isachardoublequoteopen}pow\ {\isacharparenleft}Suc\ n{\isacharparenright}\ a\ {\isacharequal}\ a\ {\isasymotimes}\ pow\ n\ a{\isachardoublequoteclose}%
haftmann
parents:
diff changeset
   258
\endisatagquoteme
haftmann
parents:
diff changeset
   259
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   260
%
haftmann
parents:
diff changeset
   261
\isadelimquoteme
haftmann
parents:
diff changeset
   262
%
haftmann
parents:
diff changeset
   263
\endisadelimquoteme
haftmann
parents:
diff changeset
   264
%
haftmann
parents:
diff changeset
   265
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   266
\noindent This we use to define the discrete exponentiation function:%
haftmann
parents:
diff changeset
   267
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   268
\isamarkuptrue%
haftmann
parents:
diff changeset
   269
%
haftmann
parents:
diff changeset
   270
\isadelimquoteme
haftmann
parents:
diff changeset
   271
%
haftmann
parents:
diff changeset
   272
\endisadelimquoteme
haftmann
parents:
diff changeset
   273
%
haftmann
parents:
diff changeset
   274
\isatagquoteme
haftmann
parents:
diff changeset
   275
\isacommand{definition}\isamarkupfalse%
haftmann
parents:
diff changeset
   276
\ bexp\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
haftmann
parents:
diff changeset
   277
\ \ {\isachardoublequoteopen}bexp\ n\ {\isacharequal}\ pow\ n\ {\isacharparenleft}Suc\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}%
haftmann
parents:
diff changeset
   278
\endisatagquoteme
haftmann
parents:
diff changeset
   279
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   280
%
haftmann
parents:
diff changeset
   281
\isadelimquoteme
haftmann
parents:
diff changeset
   282
%
haftmann
parents:
diff changeset
   283
\endisadelimquoteme
haftmann
parents:
diff changeset
   284
%
haftmann
parents:
diff changeset
   285
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   286
\noindent The corresponding code:%
haftmann
parents:
diff changeset
   287
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   288
\isamarkuptrue%
haftmann
parents:
diff changeset
   289
%
haftmann
parents:
diff changeset
   290
\isadelimquoteme
haftmann
parents:
diff changeset
   291
%
haftmann
parents:
diff changeset
   292
\endisadelimquoteme
haftmann
parents:
diff changeset
   293
%
haftmann
parents:
diff changeset
   294
\isatagquoteme
haftmann
parents:
diff changeset
   295
%
haftmann
parents:
diff changeset
   296
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   297
\isaverbatim%
haftmann
parents:
diff changeset
   298
\noindent%
haftmann
parents:
diff changeset
   299
\verb|module Example where {|\newline%
haftmann
parents:
diff changeset
   300
\newline%
haftmann
parents:
diff changeset
   301
\newline%
haftmann
parents:
diff changeset
   302
\verb|data Nat = Suc Nat |\verb,|,\verb| Zero_nat;|\newline%
haftmann
parents:
diff changeset
   303
\newline%
haftmann
parents:
diff changeset
   304
\verb|class Semigroup a where {|\newline%
haftmann
parents:
diff changeset
   305
\verb|  mult :: a -> a -> a;|\newline%
haftmann
parents:
diff changeset
   306
\verb|};|\newline%
haftmann
parents:
diff changeset
   307
\newline%
haftmann
parents:
diff changeset
   308
\verb|class (Semigroup a) => Monoid a where {|\newline%
haftmann
parents:
diff changeset
   309
\verb|  neutral :: a;|\newline%
haftmann
parents:
diff changeset
   310
\verb|};|\newline%
haftmann
parents:
diff changeset
   311
\newline%
haftmann
parents:
diff changeset
   312
\verb|pow :: forall a. (Monoid a) => Nat -> a -> a;|\newline%
haftmann
parents:
diff changeset
   313
\verb|pow (Suc n) a = mult a (pow n a);|\newline%
haftmann
parents:
diff changeset
   314
\verb|pow Zero_nat a = neutral;|\newline%
haftmann
parents:
diff changeset
   315
\newline%
haftmann
parents:
diff changeset
   316
\verb|plus_nat :: Nat -> Nat -> Nat;|\newline%
haftmann
parents:
diff changeset
   317
\verb|plus_nat (Suc m) n = plus_nat m (Suc n);|\newline%
haftmann
parents:
diff changeset
   318
\verb|plus_nat Zero_nat n = n;|\newline%
haftmann
parents:
diff changeset
   319
\newline%
haftmann
parents:
diff changeset
   320
\verb|neutral_nat :: Nat;|\newline%
haftmann
parents:
diff changeset
   321
\verb|neutral_nat = Suc Zero_nat;|\newline%
haftmann
parents:
diff changeset
   322
\newline%
haftmann
parents:
diff changeset
   323
\verb|mult_nat :: Nat -> Nat -> Nat;|\newline%
haftmann
parents:
diff changeset
   324
\verb|mult_nat (Suc m) n = plus_nat n (mult_nat m n);|\newline%
haftmann
parents:
diff changeset
   325
\verb|mult_nat Zero_nat n = Zero_nat;|\newline%
haftmann
parents:
diff changeset
   326
\newline%
haftmann
parents:
diff changeset
   327
\verb|instance Semigroup Nat where {|\newline%
haftmann
parents:
diff changeset
   328
\verb|  mult = mult_nat;|\newline%
haftmann
parents:
diff changeset
   329
\verb|};|\newline%
haftmann
parents:
diff changeset
   330
\newline%
haftmann
parents:
diff changeset
   331
\verb|instance Monoid Nat where {|\newline%
haftmann
parents:
diff changeset
   332
\verb|  neutral = neutral_nat;|\newline%
haftmann
parents:
diff changeset
   333
\verb|};|\newline%
haftmann
parents:
diff changeset
   334
\newline%
haftmann
parents:
diff changeset
   335
\verb|bexp :: Nat -> Nat;|\newline%
haftmann
parents:
diff changeset
   336
\verb|bexp n = pow n (Suc (Suc Zero_nat));|\newline%
haftmann
parents:
diff changeset
   337
\newline%
haftmann
parents:
diff changeset
   338
\verb|}|%
haftmann
parents:
diff changeset
   339
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   340
\isamarkuptrue%
haftmann
parents:
diff changeset
   341
%
haftmann
parents:
diff changeset
   342
\endisatagquoteme
haftmann
parents:
diff changeset
   343
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   344
%
haftmann
parents:
diff changeset
   345
\isadelimquoteme
haftmann
parents:
diff changeset
   346
%
haftmann
parents:
diff changeset
   347
\endisadelimquoteme
haftmann
parents:
diff changeset
   348
%
haftmann
parents:
diff changeset
   349
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   350
\noindent This is a convenient place to show how explicit dictionary construction
haftmann
parents:
diff changeset
   351
  manifests in generated code (here, the same example in \isa{SML}):%
haftmann
parents:
diff changeset
   352
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   353
\isamarkuptrue%
haftmann
parents:
diff changeset
   354
%
haftmann
parents:
diff changeset
   355
\isadelimquoteme
haftmann
parents:
diff changeset
   356
%
haftmann
parents:
diff changeset
   357
\endisadelimquoteme
haftmann
parents:
diff changeset
   358
%
haftmann
parents:
diff changeset
   359
\isatagquoteme
haftmann
parents:
diff changeset
   360
%
haftmann
parents:
diff changeset
   361
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   362
\isaverbatim%
haftmann
parents:
diff changeset
   363
\noindent%
haftmann
parents:
diff changeset
   364
\verb|structure Example = |\newline%
haftmann
parents:
diff changeset
   365
\verb|struct|\newline%
haftmann
parents:
diff changeset
   366
\newline%
haftmann
parents:
diff changeset
   367
\verb|datatype nat = Suc of nat |\verb,|,\verb| Zero_nat;|\newline%
haftmann
parents:
diff changeset
   368
\newline%
haftmann
parents:
diff changeset
   369
\verb|type 'a semigroup = {mult : 'a -> 'a -> 'a};|\newline%
haftmann
parents:
diff changeset
   370
\verb|fun mult (A_:'a semigroup) = #mult A_;|\newline%
haftmann
parents:
diff changeset
   371
\newline%
haftmann
parents:
diff changeset
   372
\verb|type 'a monoid = {Program__semigroup_monoid : 'a semigroup, neutral : 'a};|\newline%
haftmann
parents:
diff changeset
   373
\verb|fun semigroup_monoid (A_:'a monoid) = #Program__semigroup_monoid A_;|\newline%
haftmann
parents:
diff changeset
   374
\verb|fun neutral (A_:'a monoid) = #neutral A_;|\newline%
haftmann
parents:
diff changeset
   375
\newline%
haftmann
parents:
diff changeset
   376
\verb|fun pow A_ (Suc n) a = mult (semigroup_monoid A_) a (pow A_ n a)|\newline%
haftmann
parents:
diff changeset
   377
\verb|  |\verb,|,\verb| pow A_ Zero_nat a = neutral A_;|\newline%
haftmann
parents:
diff changeset
   378
\newline%
haftmann
parents:
diff changeset
   379
\verb|fun plus_nat (Suc m) n = plus_nat m (Suc n)|\newline%
haftmann
parents:
diff changeset
   380
\verb|  |\verb,|,\verb| plus_nat Zero_nat n = n;|\newline%
haftmann
parents:
diff changeset
   381
\newline%
haftmann
parents:
diff changeset
   382
\verb|val neutral_nat : nat = Suc Zero_nat;|\newline%
haftmann
parents:
diff changeset
   383
\newline%
haftmann
parents:
diff changeset
   384
\verb|fun mult_nat (Suc m) n = plus_nat n (mult_nat m n)|\newline%
haftmann
parents:
diff changeset
   385
\verb|  |\verb,|,\verb| mult_nat Zero_nat n = Zero_nat;|\newline%
haftmann
parents:
diff changeset
   386
\newline%
haftmann
parents:
diff changeset
   387
\verb|val semigroup_nat = {mult = mult_nat} : nat semigroup;|\newline%
haftmann
parents:
diff changeset
   388
\newline%
haftmann
parents:
diff changeset
   389
\verb|val monoid_nat =|\newline%
haftmann
parents:
diff changeset
   390
\verb|  {Program__semigroup_monoid = semigroup_nat, neutral = neutral_nat} :|\newline%
haftmann
parents:
diff changeset
   391
\verb|  nat monoid;|\newline%
haftmann
parents:
diff changeset
   392
\newline%
haftmann
parents:
diff changeset
   393
\verb|fun bexp n = pow monoid_nat n (Suc (Suc Zero_nat));|\newline%
haftmann
parents:
diff changeset
   394
\newline%
haftmann
parents:
diff changeset
   395
\verb|end; (*struct Example*)|%
haftmann
parents:
diff changeset
   396
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   397
\isamarkuptrue%
haftmann
parents:
diff changeset
   398
%
haftmann
parents:
diff changeset
   399
\endisatagquoteme
haftmann
parents:
diff changeset
   400
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   401
%
haftmann
parents:
diff changeset
   402
\isadelimquoteme
haftmann
parents:
diff changeset
   403
%
haftmann
parents:
diff changeset
   404
\endisadelimquoteme
haftmann
parents:
diff changeset
   405
%
haftmann
parents:
diff changeset
   406
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   407
\noindent Note the parameters with trailing underscore (\verb|A_|)
haftmann
parents:
diff changeset
   408
    which are the dictionary parameters.%
haftmann
parents:
diff changeset
   409
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   410
\isamarkuptrue%
haftmann
parents:
diff changeset
   411
%
haftmann
parents:
diff changeset
   412
\isamarkupsubsection{The preprocessor \label{sec:preproc}%
haftmann
parents:
diff changeset
   413
}
haftmann
parents:
diff changeset
   414
\isamarkuptrue%
haftmann
parents:
diff changeset
   415
%
haftmann
parents:
diff changeset
   416
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   417
Before selected function theorems are turned into abstract
haftmann
parents:
diff changeset
   418
  code, a chain of definitional transformation steps is carried
haftmann
parents:
diff changeset
   419
  out: \emph{preprocessing}.  In essence, the preprocessor
haftmann
parents:
diff changeset
   420
  consists of two components: a \emph{simpset} and \emph{function transformers}.
haftmann
parents:
diff changeset
   421
haftmann
parents:
diff changeset
   422
  The \emph{simpset} allows to employ the full generality of the Isabelle
haftmann
parents:
diff changeset
   423
  simplifier.  Due to the interpretation of theorems
haftmann
parents:
diff changeset
   424
  as defining equations, rewrites are applied to the right
haftmann
parents:
diff changeset
   425
  hand side and the arguments of the left hand side of an
haftmann
parents:
diff changeset
   426
  equation, but never to the constant heading the left hand side.
haftmann
parents:
diff changeset
   427
  An important special case are \emph{inline theorems} which may be
haftmann
parents:
diff changeset
   428
  declared and undeclared using the
haftmann
parents:
diff changeset
   429
  \emph{code inline} or \emph{code inline del} attribute respectively.
haftmann
parents:
diff changeset
   430
haftmann
parents:
diff changeset
   431
  Some common applications:%
haftmann
parents:
diff changeset
   432
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   433
\isamarkuptrue%
haftmann
parents:
diff changeset
   434
%
haftmann
parents:
diff changeset
   435
\begin{itemize}
haftmann
parents:
diff changeset
   436
%
haftmann
parents:
diff changeset
   437
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   438
\item replacing non-executable constructs by executable ones:%
haftmann
parents:
diff changeset
   439
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   440
\isamarkuptrue%
haftmann
parents:
diff changeset
   441
%
haftmann
parents:
diff changeset
   442
\isadelimquoteme
haftmann
parents:
diff changeset
   443
%
haftmann
parents:
diff changeset
   444
\endisadelimquoteme
haftmann
parents:
diff changeset
   445
%
haftmann
parents:
diff changeset
   446
\isatagquoteme
haftmann
parents:
diff changeset
   447
\isacommand{lemma}\isamarkupfalse%
haftmann
parents:
diff changeset
   448
\ {\isacharbrackleft}code\ inline{\isacharbrackright}{\isacharcolon}\isanewline
haftmann
parents:
diff changeset
   449
\ \ {\isachardoublequoteopen}x\ {\isasymin}\ set\ xs\ {\isasymlongleftrightarrow}\ x\ mem\ xs{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   450
\ {\isacharparenleft}induct\ xs{\isacharparenright}\ simp{\isacharunderscore}all%
haftmann
parents:
diff changeset
   451
\endisatagquoteme
haftmann
parents:
diff changeset
   452
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   453
%
haftmann
parents:
diff changeset
   454
\isadelimquoteme
haftmann
parents:
diff changeset
   455
%
haftmann
parents:
diff changeset
   456
\endisadelimquoteme
haftmann
parents:
diff changeset
   457
%
haftmann
parents:
diff changeset
   458
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   459
\item eliminating superfluous constants:%
haftmann
parents:
diff changeset
   460
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   461
\isamarkuptrue%
haftmann
parents:
diff changeset
   462
%
haftmann
parents:
diff changeset
   463
\isadelimquoteme
haftmann
parents:
diff changeset
   464
%
haftmann
parents:
diff changeset
   465
\endisadelimquoteme
haftmann
parents:
diff changeset
   466
%
haftmann
parents:
diff changeset
   467
\isatagquoteme
haftmann
parents:
diff changeset
   468
\isacommand{lemma}\isamarkupfalse%
haftmann
parents:
diff changeset
   469
\ {\isacharbrackleft}code\ inline{\isacharbrackright}{\isacharcolon}\isanewline
haftmann
parents:
diff changeset
   470
\ \ {\isachardoublequoteopen}{\isadigit{1}}\ {\isacharequal}\ Suc\ {\isadigit{0}}{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   471
\ simp%
haftmann
parents:
diff changeset
   472
\endisatagquoteme
haftmann
parents:
diff changeset
   473
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   474
%
haftmann
parents:
diff changeset
   475
\isadelimquoteme
haftmann
parents:
diff changeset
   476
%
haftmann
parents:
diff changeset
   477
\endisadelimquoteme
haftmann
parents:
diff changeset
   478
%
haftmann
parents:
diff changeset
   479
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   480
\item replacing executable but inconvenient constructs:%
haftmann
parents:
diff changeset
   481
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   482
\isamarkuptrue%
haftmann
parents:
diff changeset
   483
%
haftmann
parents:
diff changeset
   484
\isadelimquoteme
haftmann
parents:
diff changeset
   485
%
haftmann
parents:
diff changeset
   486
\endisadelimquoteme
haftmann
parents:
diff changeset
   487
%
haftmann
parents:
diff changeset
   488
\isatagquoteme
haftmann
parents:
diff changeset
   489
\isacommand{lemma}\isamarkupfalse%
haftmann
parents:
diff changeset
   490
\ {\isacharbrackleft}code\ inline{\isacharbrackright}{\isacharcolon}\isanewline
haftmann
parents:
diff changeset
   491
\ \ {\isachardoublequoteopen}xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymlongleftrightarrow}\ List{\isachardot}null\ xs{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   492
\ {\isacharparenleft}induct\ xs{\isacharparenright}\ simp{\isacharunderscore}all%
haftmann
parents:
diff changeset
   493
\endisatagquoteme
haftmann
parents:
diff changeset
   494
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   495
%
haftmann
parents:
diff changeset
   496
\isadelimquoteme
haftmann
parents:
diff changeset
   497
%
haftmann
parents:
diff changeset
   498
\endisadelimquoteme
haftmann
parents:
diff changeset
   499
%
haftmann
parents:
diff changeset
   500
\end{itemize}
haftmann
parents:
diff changeset
   501
%
haftmann
parents:
diff changeset
   502
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   503
\noindent \emph{Function transformers} provide a very general interface,
haftmann
parents:
diff changeset
   504
  transforming a list of function theorems to another
haftmann
parents:
diff changeset
   505
  list of function theorems, provided that neither the heading
haftmann
parents:
diff changeset
   506
  constant nor its type change.  The \isa{{\isadigit{0}}} / \isa{Suc}
haftmann
parents:
diff changeset
   507
  pattern elimination implemented in
haftmann
parents:
diff changeset
   508
  theory \isa{Efficient{\isacharunderscore}Nat} (see \secref{eff_nat}) uses this
haftmann
parents:
diff changeset
   509
  interface.
haftmann
parents:
diff changeset
   510
haftmann
parents:
diff changeset
   511
  \noindent The current setup of the preprocessor may be inspected using
haftmann
parents:
diff changeset
   512
  the \hyperlink{command.print-codesetup}{\mbox{\isa{\isacommand{print{\isacharunderscore}codesetup}}}} command.
haftmann
parents:
diff changeset
   513
  \hyperlink{command.code-thms}{\mbox{\isa{\isacommand{code{\isacharunderscore}thms}}}} provides a convenient
haftmann
parents:
diff changeset
   514
  mechanism to inspect the impact of a preprocessor setup
haftmann
parents:
diff changeset
   515
  on defining equations.
haftmann
parents:
diff changeset
   516
haftmann
parents:
diff changeset
   517
  \begin{warn}
haftmann
parents:
diff changeset
   518
    The attribute \emph{code unfold}
haftmann
parents:
diff changeset
   519
    associated with the \isa{SML\ code\ generator} also applies to
haftmann
parents:
diff changeset
   520
    the \isa{generic\ code\ generator}:
haftmann
parents:
diff changeset
   521
    \emph{code unfold} implies \emph{code inline}.
haftmann
parents:
diff changeset
   522
  \end{warn}%
haftmann
parents:
diff changeset
   523
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   524
\isamarkuptrue%
haftmann
parents:
diff changeset
   525
%
haftmann
parents:
diff changeset
   526
\isamarkupsubsection{Datatypes \label{sec:datatypes}%
haftmann
parents:
diff changeset
   527
}
haftmann
parents:
diff changeset
   528
\isamarkuptrue%
haftmann
parents:
diff changeset
   529
%
haftmann
parents:
diff changeset
   530
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   531
Conceptually, any datatype is spanned by a set of
haftmann
parents:
diff changeset
   532
  \emph{constructors} of type \isa{{\isasymtau}\ {\isacharequal}\ {\isasymdots}\ {\isasymRightarrow}\ {\isasymkappa}\ {\isasymalpha}\isactrlisub {\isadigit{1}}\ {\isasymdots}\ {\isasymalpha}\isactrlisub n}
haftmann
parents:
diff changeset
   533
  where \isa{{\isacharbraceleft}{\isasymalpha}\isactrlisub {\isadigit{1}}{\isacharcomma}\ {\isasymdots}{\isacharcomma}\ {\isasymalpha}\isactrlisub n{\isacharbraceright}} is excactly the set of \emph{all}
haftmann
parents:
diff changeset
   534
  type variables in \isa{{\isasymtau}}.  The HOL datatype package
haftmann
parents:
diff changeset
   535
  by default registers any new datatype in the table
haftmann
parents:
diff changeset
   536
  of datatypes, which may be inspected using
haftmann
parents:
diff changeset
   537
  the \hyperlink{command.print-codesetup}{\mbox{\isa{\isacommand{print{\isacharunderscore}codesetup}}}} command.
haftmann
parents:
diff changeset
   538
haftmann
parents:
diff changeset
   539
  In some cases, it may be convenient to alter or
haftmann
parents:
diff changeset
   540
  extend this table;  as an example, we will develop an alternative
haftmann
parents:
diff changeset
   541
  representation of natural numbers as binary digits, whose
haftmann
parents:
diff changeset
   542
  size does increase logarithmically with its value, not linear
haftmann
parents:
diff changeset
   543
  \footnote{Indeed, the \hyperlink{theory.Efficient-Nat}{\mbox{\isa{Efficient{\isacharunderscore}Nat}}} theory (see \ref{eff_nat})
haftmann
parents:
diff changeset
   544
    does something similar}.  First, the digit representation:%
haftmann
parents:
diff changeset
   545
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   546
\isamarkuptrue%
haftmann
parents:
diff changeset
   547
%
haftmann
parents:
diff changeset
   548
\isadelimquoteme
haftmann
parents:
diff changeset
   549
%
haftmann
parents:
diff changeset
   550
\endisadelimquoteme
haftmann
parents:
diff changeset
   551
%
haftmann
parents:
diff changeset
   552
\isatagquoteme
haftmann
parents:
diff changeset
   553
\isacommand{definition}\isamarkupfalse%
haftmann
parents:
diff changeset
   554
\ Dig{\isadigit{0}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
haftmann
parents:
diff changeset
   555
\ \ {\isachardoublequoteopen}Dig{\isadigit{0}}\ n\ {\isacharequal}\ {\isadigit{2}}\ {\isacharasterisk}\ n{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   556
\isanewline
haftmann
parents:
diff changeset
   557
\isacommand{definition}\isamarkupfalse%
haftmann
parents:
diff changeset
   558
\ \ Dig{\isadigit{1}}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
haftmann
parents:
diff changeset
   559
\ \ {\isachardoublequoteopen}Dig{\isadigit{1}}\ n\ {\isacharequal}\ Suc\ {\isacharparenleft}{\isadigit{2}}\ {\isacharasterisk}\ n{\isacharparenright}{\isachardoublequoteclose}%
haftmann
parents:
diff changeset
   560
\endisatagquoteme
haftmann
parents:
diff changeset
   561
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   562
%
haftmann
parents:
diff changeset
   563
\isadelimquoteme
haftmann
parents:
diff changeset
   564
%
haftmann
parents:
diff changeset
   565
\endisadelimquoteme
haftmann
parents:
diff changeset
   566
%
haftmann
parents:
diff changeset
   567
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   568
\noindent We will use these two \qt{digits} to represent natural numbers
haftmann
parents:
diff changeset
   569
  in binary digits, e.g.:%
haftmann
parents:
diff changeset
   570
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   571
\isamarkuptrue%
haftmann
parents:
diff changeset
   572
%
haftmann
parents:
diff changeset
   573
\isadelimquoteme
haftmann
parents:
diff changeset
   574
%
haftmann
parents:
diff changeset
   575
\endisadelimquoteme
haftmann
parents:
diff changeset
   576
%
haftmann
parents:
diff changeset
   577
\isatagquoteme
haftmann
parents:
diff changeset
   578
\isacommand{lemma}\isamarkupfalse%
haftmann
parents:
diff changeset
   579
\ {\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
haftmann
parents:
diff changeset
   580
\ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   581
\ {\isacharparenleft}simp\ add{\isacharcolon}\ Dig{\isadigit{0}}{\isacharunderscore}def\ Dig{\isadigit{1}}{\isacharunderscore}def{\isacharparenright}%
haftmann
parents:
diff changeset
   582
\endisatagquoteme
haftmann
parents:
diff changeset
   583
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   584
%
haftmann
parents:
diff changeset
   585
\isadelimquoteme
haftmann
parents:
diff changeset
   586
%
haftmann
parents:
diff changeset
   587
\endisadelimquoteme
haftmann
parents:
diff changeset
   588
%
haftmann
parents:
diff changeset
   589
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   590
\noindent Of course we also have to provide proper code equations for
haftmann
parents:
diff changeset
   591
  the operations, e.g. \isa{op\ {\isacharplus}}:%
haftmann
parents:
diff changeset
   592
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   593
\isamarkuptrue%
haftmann
parents:
diff changeset
   594
%
haftmann
parents:
diff changeset
   595
\isadelimquoteme
haftmann
parents:
diff changeset
   596
%
haftmann
parents:
diff changeset
   597
\endisadelimquoteme
haftmann
parents:
diff changeset
   598
%
haftmann
parents:
diff changeset
   599
\isatagquoteme
haftmann
parents:
diff changeset
   600
\isacommand{lemma}\isamarkupfalse%
haftmann
parents:
diff changeset
   601
\ plus{\isacharunderscore}Dig\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
haftmann
parents:
diff changeset
   602
\ \ {\isachardoublequoteopen}{\isadigit{0}}\ {\isacharplus}\ n\ {\isacharequal}\ n{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   603
\ \ {\isachardoublequoteopen}m\ {\isacharplus}\ {\isadigit{0}}\ {\isacharequal}\ m{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   604
\ \ {\isachardoublequoteopen}{\isadigit{1}}\ {\isacharplus}\ Dig{\isadigit{0}}\ n\ {\isacharequal}\ Dig{\isadigit{1}}\ n{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   605
\ \ {\isachardoublequoteopen}Dig{\isadigit{0}}\ m\ {\isacharplus}\ {\isadigit{1}}\ {\isacharequal}\ Dig{\isadigit{1}}\ m{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   606
\ \ {\isachardoublequoteopen}{\isadigit{1}}\ {\isacharplus}\ Dig{\isadigit{1}}\ n\ {\isacharequal}\ Dig{\isadigit{0}}\ {\isacharparenleft}n\ {\isacharplus}\ {\isadigit{1}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   607
\ \ {\isachardoublequoteopen}Dig{\isadigit{1}}\ m\ {\isacharplus}\ {\isadigit{1}}\ {\isacharequal}\ Dig{\isadigit{0}}\ {\isacharparenleft}m\ {\isacharplus}\ {\isadigit{1}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   608
\ \ {\isachardoublequoteopen}Dig{\isadigit{0}}\ m\ {\isacharplus}\ Dig{\isadigit{0}}\ n\ {\isacharequal}\ Dig{\isadigit{0}}\ {\isacharparenleft}m\ {\isacharplus}\ n{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   609
\ \ {\isachardoublequoteopen}Dig{\isadigit{0}}\ m\ {\isacharplus}\ Dig{\isadigit{1}}\ n\ {\isacharequal}\ Dig{\isadigit{1}}\ {\isacharparenleft}m\ {\isacharplus}\ n{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   610
\ \ {\isachardoublequoteopen}Dig{\isadigit{1}}\ m\ {\isacharplus}\ Dig{\isadigit{0}}\ n\ {\isacharequal}\ Dig{\isadigit{1}}\ {\isacharparenleft}m\ {\isacharplus}\ n{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   611
\ \ {\isachardoublequoteopen}Dig{\isadigit{1}}\ m\ {\isacharplus}\ Dig{\isadigit{1}}\ n\ {\isacharequal}\ Dig{\isadigit{0}}\ {\isacharparenleft}m\ {\isacharplus}\ n\ {\isacharplus}\ {\isadigit{1}}{\isacharparenright}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   612
\ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   613
\ {\isacharparenleft}simp{\isacharunderscore}all\ add{\isacharcolon}\ Dig{\isadigit{0}}{\isacharunderscore}def\ Dig{\isadigit{1}}{\isacharunderscore}def{\isacharparenright}%
haftmann
parents:
diff changeset
   614
\endisatagquoteme
haftmann
parents:
diff changeset
   615
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   616
%
haftmann
parents:
diff changeset
   617
\isadelimquoteme
haftmann
parents:
diff changeset
   618
%
haftmann
parents:
diff changeset
   619
\endisadelimquoteme
haftmann
parents:
diff changeset
   620
%
haftmann
parents:
diff changeset
   621
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   622
\noindent We then instruct the code generator to view \isa{{\isadigit{0}}},
haftmann
parents:
diff changeset
   623
  \isa{{\isadigit{1}}}, \isa{Dig{\isadigit{0}}} and \isa{Dig{\isadigit{1}}} as
haftmann
parents:
diff changeset
   624
  datatype constructors:%
haftmann
parents:
diff changeset
   625
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   626
\isamarkuptrue%
haftmann
parents:
diff changeset
   627
%
haftmann
parents:
diff changeset
   628
\isadelimquoteme
haftmann
parents:
diff changeset
   629
%
haftmann
parents:
diff changeset
   630
\endisadelimquoteme
haftmann
parents:
diff changeset
   631
%
haftmann
parents:
diff changeset
   632
\isatagquoteme
haftmann
parents:
diff changeset
   633
\isacommand{code{\isacharunderscore}datatype}\isamarkupfalse%
haftmann
parents:
diff changeset
   634
\ {\isachardoublequoteopen}{\isadigit{0}}{\isasymColon}nat{\isachardoublequoteclose}\ {\isachardoublequoteopen}{\isadigit{1}}{\isasymColon}nat{\isachardoublequoteclose}\ Dig{\isadigit{0}}\ Dig{\isadigit{1}}%
haftmann
parents:
diff changeset
   635
\endisatagquoteme
haftmann
parents:
diff changeset
   636
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   637
%
haftmann
parents:
diff changeset
   638
\isadelimquoteme
haftmann
parents:
diff changeset
   639
%
haftmann
parents:
diff changeset
   640
\endisadelimquoteme
haftmann
parents:
diff changeset
   641
%
haftmann
parents:
diff changeset
   642
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   643
\noindent For the former constructor \isa{Suc}, we provide a code
haftmann
parents:
diff changeset
   644
  equation and remove some parts of the default code generator setup
haftmann
parents:
diff changeset
   645
  which are an obstacle here:%
haftmann
parents:
diff changeset
   646
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   647
\isamarkuptrue%
haftmann
parents:
diff changeset
   648
%
haftmann
parents:
diff changeset
   649
\isadelimquoteme
haftmann
parents:
diff changeset
   650
%
haftmann
parents:
diff changeset
   651
\endisadelimquoteme
haftmann
parents:
diff changeset
   652
%
haftmann
parents:
diff changeset
   653
\isatagquoteme
haftmann
parents:
diff changeset
   654
\isacommand{lemma}\isamarkupfalse%
haftmann
parents:
diff changeset
   655
\ Suc{\isacharunderscore}Dig\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
haftmann
parents:
diff changeset
   656
\ \ {\isachardoublequoteopen}Suc\ n\ {\isacharequal}\ n\ {\isacharplus}\ {\isadigit{1}}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   657
\ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   658
\ simp\isanewline
haftmann
parents:
diff changeset
   659
\isanewline
haftmann
parents:
diff changeset
   660
\isacommand{declare}\isamarkupfalse%
haftmann
parents:
diff changeset
   661
\ One{\isacharunderscore}nat{\isacharunderscore}def\ {\isacharbrackleft}code\ inline\ del{\isacharbrackright}\isanewline
haftmann
parents:
diff changeset
   662
\isacommand{declare}\isamarkupfalse%
haftmann
parents:
diff changeset
   663
\ add{\isacharunderscore}Suc{\isacharunderscore}shift\ {\isacharbrackleft}code\ func\ del{\isacharbrackright}%
haftmann
parents:
diff changeset
   664
\endisatagquoteme
haftmann
parents:
diff changeset
   665
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   666
%
haftmann
parents:
diff changeset
   667
\isadelimquoteme
haftmann
parents:
diff changeset
   668
%
haftmann
parents:
diff changeset
   669
\endisadelimquoteme
haftmann
parents:
diff changeset
   670
%
haftmann
parents:
diff changeset
   671
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   672
\noindent This yields the following code:%
haftmann
parents:
diff changeset
   673
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   674
\isamarkuptrue%
haftmann
parents:
diff changeset
   675
%
haftmann
parents:
diff changeset
   676
\isadelimquoteme
haftmann
parents:
diff changeset
   677
%
haftmann
parents:
diff changeset
   678
\endisadelimquoteme
haftmann
parents:
diff changeset
   679
%
haftmann
parents:
diff changeset
   680
\isatagquoteme
haftmann
parents:
diff changeset
   681
%
haftmann
parents:
diff changeset
   682
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   683
\isaverbatim%
haftmann
parents:
diff changeset
   684
\noindent%
haftmann
parents:
diff changeset
   685
\verb|structure Example = |\newline%
haftmann
parents:
diff changeset
   686
\verb|struct|\newline%
haftmann
parents:
diff changeset
   687
\newline%
haftmann
parents:
diff changeset
   688
\verb|datatype nat = Dig1 of nat |\verb,|,\verb| Dig0 of nat |\verb,|,\verb| One_nat |\verb,|,\verb| Zero_nat;|\newline%
haftmann
parents:
diff changeset
   689
\newline%
haftmann
parents:
diff changeset
   690
\verb|fun plus_nat (Dig1 m) (Dig1 n) = Dig0 (plus_nat (plus_nat m n) One_nat)|\newline%
haftmann
parents:
diff changeset
   691
\verb|  |\verb,|,\verb| plus_nat (Dig1 m) (Dig0 n) = Dig1 (plus_nat m n)|\newline%
haftmann
parents:
diff changeset
   692
\verb|  |\verb,|,\verb| plus_nat (Dig0 m) (Dig1 n) = Dig1 (plus_nat m n)|\newline%
haftmann
parents:
diff changeset
   693
\verb|  |\verb,|,\verb| plus_nat (Dig0 m) (Dig0 n) = Dig0 (plus_nat m n)|\newline%
haftmann
parents:
diff changeset
   694
\verb|  |\verb,|,\verb| plus_nat (Dig1 m) One_nat = Dig0 (plus_nat m One_nat)|\newline%
haftmann
parents:
diff changeset
   695
\verb|  |\verb,|,\verb| plus_nat One_nat (Dig1 n) = Dig0 (plus_nat n One_nat)|\newline%
haftmann
parents:
diff changeset
   696
\verb|  |\verb,|,\verb| plus_nat (Dig0 m) One_nat = Dig1 m|\newline%
haftmann
parents:
diff changeset
   697
\verb|  |\verb,|,\verb| plus_nat One_nat (Dig0 n) = Dig1 n|\newline%
haftmann
parents:
diff changeset
   698
\verb|  |\verb,|,\verb| plus_nat m Zero_nat = m|\newline%
haftmann
parents:
diff changeset
   699
\verb|  |\verb,|,\verb| plus_nat Zero_nat n = n;|\newline%
haftmann
parents:
diff changeset
   700
\newline%
haftmann
parents:
diff changeset
   701
\verb|end; (*struct Example*)|%
haftmann
parents:
diff changeset
   702
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   703
\isamarkuptrue%
haftmann
parents:
diff changeset
   704
%
haftmann
parents:
diff changeset
   705
\endisatagquoteme
haftmann
parents:
diff changeset
   706
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   707
%
haftmann
parents:
diff changeset
   708
\isadelimquoteme
haftmann
parents:
diff changeset
   709
%
haftmann
parents:
diff changeset
   710
\endisadelimquoteme
haftmann
parents:
diff changeset
   711
%
haftmann
parents:
diff changeset
   712
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   713
\noindent From this example, it can be easily glimpsed that using own constructor sets
haftmann
parents:
diff changeset
   714
  is a little delicate since it changes the set of valid patterns for values
haftmann
parents:
diff changeset
   715
  of that type.  Without going into much detail, here some practical hints:
haftmann
parents:
diff changeset
   716
haftmann
parents:
diff changeset
   717
  \begin{itemize}
haftmann
parents:
diff changeset
   718
    \item When changing the constructor set for datatypes, take care to
haftmann
parents:
diff changeset
   719
      provide an alternative for the \isa{case} combinator (e.g.~by replacing
haftmann
parents:
diff changeset
   720
      it using the preprocessor).
haftmann
parents:
diff changeset
   721
    \item Values in the target language need not to be normalised -- different
haftmann
parents:
diff changeset
   722
      values in the target language may represent the same value in the
haftmann
parents:
diff changeset
   723
      logic (e.g. \isa{Dig{\isadigit{1}}\ {\isadigit{0}}\ {\isacharequal}\ {\isadigit{1}}}).
haftmann
parents:
diff changeset
   724
    \item Usually, a good methodology to deal with the subtleties of pattern
haftmann
parents:
diff changeset
   725
      matching is to see the type as an abstract type: provide a set
haftmann
parents:
diff changeset
   726
      of operations which operate on the concrete representation of the type,
haftmann
parents:
diff changeset
   727
      and derive further operations by combinations of these primitive ones,
haftmann
parents:
diff changeset
   728
      without relying on a particular representation.
haftmann
parents:
diff changeset
   729
  \end{itemize}%
haftmann
parents:
diff changeset
   730
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   731
\isamarkuptrue%
haftmann
parents:
diff changeset
   732
%
haftmann
parents:
diff changeset
   733
\isadeliminvisible
haftmann
parents:
diff changeset
   734
%
haftmann
parents:
diff changeset
   735
\endisadeliminvisible
haftmann
parents:
diff changeset
   736
%
haftmann
parents:
diff changeset
   737
\isataginvisible
haftmann
parents:
diff changeset
   738
\isacommand{code{\isacharunderscore}datatype}\isamarkupfalse%
haftmann
parents:
diff changeset
   739
\ {\isachardoublequoteopen}{\isadigit{0}}{\isacharcolon}{\isacharcolon}nat{\isachardoublequoteclose}\ Suc\isanewline
haftmann
parents:
diff changeset
   740
\isacommand{declare}\isamarkupfalse%
haftmann
parents:
diff changeset
   741
\ plus{\isacharunderscore}Dig\ {\isacharbrackleft}code\ func\ del{\isacharbrackright}\isanewline
haftmann
parents:
diff changeset
   742
\isacommand{declare}\isamarkupfalse%
haftmann
parents:
diff changeset
   743
\ One{\isacharunderscore}nat{\isacharunderscore}def\ {\isacharbrackleft}code\ inline{\isacharbrackright}\isanewline
haftmann
parents:
diff changeset
   744
\isacommand{declare}\isamarkupfalse%
haftmann
parents:
diff changeset
   745
\ add{\isacharunderscore}Suc{\isacharunderscore}shift\ {\isacharbrackleft}code\ func{\isacharbrackright}\ \isanewline
haftmann
parents:
diff changeset
   746
\isacommand{lemma}\isamarkupfalse%
haftmann
parents:
diff changeset
   747
\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\ {\isachardoublequoteopen}{\isadigit{0}}\ {\isacharplus}\ n\ {\isacharequal}\ {\isacharparenleft}n\ {\isasymColon}\ nat{\isacharparenright}{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   748
\ simp%
haftmann
parents:
diff changeset
   749
\endisataginvisible
haftmann
parents:
diff changeset
   750
{\isafoldinvisible}%
haftmann
parents:
diff changeset
   751
%
haftmann
parents:
diff changeset
   752
\isadeliminvisible
haftmann
parents:
diff changeset
   753
%
haftmann
parents:
diff changeset
   754
\endisadeliminvisible
haftmann
parents:
diff changeset
   755
%
haftmann
parents:
diff changeset
   756
\isamarkupsubsection{Equality and wellsortedness%
haftmann
parents:
diff changeset
   757
}
haftmann
parents:
diff changeset
   758
\isamarkuptrue%
haftmann
parents:
diff changeset
   759
%
haftmann
parents:
diff changeset
   760
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   761
Surely you have already noticed how equality is treated
haftmann
parents:
diff changeset
   762
  by the code generator:%
haftmann
parents:
diff changeset
   763
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   764
\isamarkuptrue%
haftmann
parents:
diff changeset
   765
%
haftmann
parents:
diff changeset
   766
\isadelimquoteme
haftmann
parents:
diff changeset
   767
%
haftmann
parents:
diff changeset
   768
\endisadelimquoteme
haftmann
parents:
diff changeset
   769
%
haftmann
parents:
diff changeset
   770
\isatagquoteme
haftmann
parents:
diff changeset
   771
\isacommand{primrec}\isamarkupfalse%
haftmann
parents:
diff changeset
   772
\ 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
haftmann
parents:
diff changeset
   773
\ \ {\isachardoublequoteopen}collect{\isacharunderscore}duplicates\ xs\ ys\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ xs{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   774
\ \ {\isacharbar}\ {\isachardoublequoteopen}collect{\isacharunderscore}duplicates\ xs\ ys\ {\isacharparenleft}z{\isacharhash}zs{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}if\ z\ {\isasymin}\ set\ xs\isanewline
haftmann
parents:
diff changeset
   775
\ \ \ \ \ \ then\ if\ z\ {\isasymin}\ set\ ys\isanewline
haftmann
parents:
diff changeset
   776
\ \ \ \ \ \ \ \ then\ collect{\isacharunderscore}duplicates\ xs\ ys\ zs\isanewline
haftmann
parents:
diff changeset
   777
\ \ \ \ \ \ \ \ else\ collect{\isacharunderscore}duplicates\ xs\ {\isacharparenleft}z{\isacharhash}ys{\isacharparenright}\ zs\isanewline
haftmann
parents:
diff changeset
   778
\ \ \ \ \ \ else\ collect{\isacharunderscore}duplicates\ {\isacharparenleft}z{\isacharhash}xs{\isacharparenright}\ {\isacharparenleft}z{\isacharhash}ys{\isacharparenright}\ zs{\isacharparenright}{\isachardoublequoteclose}%
haftmann
parents:
diff changeset
   779
\endisatagquoteme
haftmann
parents:
diff changeset
   780
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   781
%
haftmann
parents:
diff changeset
   782
\isadelimquoteme
haftmann
parents:
diff changeset
   783
%
haftmann
parents:
diff changeset
   784
\endisadelimquoteme
haftmann
parents:
diff changeset
   785
%
haftmann
parents:
diff changeset
   786
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   787
\noindent The membership test during preprocessing is rewritten,
haftmann
parents:
diff changeset
   788
  resulting in \isa{op\ mem}, which itself
haftmann
parents:
diff changeset
   789
  performs an explicit equality check.%
haftmann
parents:
diff changeset
   790
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   791
\isamarkuptrue%
haftmann
parents:
diff changeset
   792
%
haftmann
parents:
diff changeset
   793
\isadelimquoteme
haftmann
parents:
diff changeset
   794
%
haftmann
parents:
diff changeset
   795
\endisadelimquoteme
haftmann
parents:
diff changeset
   796
%
haftmann
parents:
diff changeset
   797
\isatagquoteme
haftmann
parents:
diff changeset
   798
%
haftmann
parents:
diff changeset
   799
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   800
\isaverbatim%
haftmann
parents:
diff changeset
   801
\noindent%
haftmann
parents:
diff changeset
   802
\verb|structure Example = |\newline%
haftmann
parents:
diff changeset
   803
\verb|struct|\newline%
haftmann
parents:
diff changeset
   804
\newline%
haftmann
parents:
diff changeset
   805
\verb|type 'a eq = {eq : 'a -> 'a -> bool};|\newline%
haftmann
parents:
diff changeset
   806
\verb|fun eq (A_:'a eq) = #eq A_;|\newline%
haftmann
parents:
diff changeset
   807
\newline%
haftmann
parents:
diff changeset
   808
\verb|fun eqop A_ a b = eq A_ a b;|\newline%
haftmann
parents:
diff changeset
   809
\newline%
haftmann
parents:
diff changeset
   810
\verb|fun member A_ x (y :: ys) = (if eqop A_ y x then true else member A_ x ys)|\newline%
haftmann
parents:
diff changeset
   811
\verb|  |\verb,|,\verb| member A_ x [] = false;|\newline%
haftmann
parents:
diff changeset
   812
\newline%
haftmann
parents:
diff changeset
   813
\verb|fun collect_duplicates A_ xs ys (z :: zs) =|\newline%
haftmann
parents:
diff changeset
   814
\verb|  (if member A_ z xs|\newline%
haftmann
parents:
diff changeset
   815
\verb|    then (if member A_ z ys then collect_duplicates A_ xs ys zs|\newline%
haftmann
parents:
diff changeset
   816
\verb|           else collect_duplicates A_ xs (z :: ys) zs)|\newline%
haftmann
parents:
diff changeset
   817
\verb|    else collect_duplicates A_ (z :: xs) (z :: ys) zs)|\newline%
haftmann
parents:
diff changeset
   818
\verb|  |\verb,|,\verb| collect_duplicates A_ xs ys [] = xs;|\newline%
haftmann
parents:
diff changeset
   819
\newline%
haftmann
parents:
diff changeset
   820
\verb|end; (*struct Example*)|%
haftmann
parents:
diff changeset
   821
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   822
\isamarkuptrue%
haftmann
parents:
diff changeset
   823
%
haftmann
parents:
diff changeset
   824
\endisatagquoteme
haftmann
parents:
diff changeset
   825
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   826
%
haftmann
parents:
diff changeset
   827
\isadelimquoteme
haftmann
parents:
diff changeset
   828
%
haftmann
parents:
diff changeset
   829
\endisadelimquoteme
haftmann
parents:
diff changeset
   830
%
haftmann
parents:
diff changeset
   831
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   832
\noindent Obviously, polymorphic equality is implemented the Haskell
haftmann
parents:
diff changeset
   833
  way using a type class.  How is this achieved?  HOL introduces
haftmann
parents:
diff changeset
   834
  an explicit class \isa{eq} with a corresponding operation
haftmann
parents:
diff changeset
   835
  \isa{eq{\isacharunderscore}class{\isachardot}eq} such that \isa{eq{\isacharunderscore}class{\isachardot}eq\ {\isacharequal}\ op\ {\isacharequal}}.
haftmann
parents:
diff changeset
   836
  The preprocessing framework does the rest by propagating the
haftmann
parents:
diff changeset
   837
  \isa{eq} constraints through all dependent defining equations.
haftmann
parents:
diff changeset
   838
  For datatypes, instances of \isa{eq} are implicitly derived
haftmann
parents:
diff changeset
   839
  when possible.  For other types, you may instantiate \isa{eq}
haftmann
parents:
diff changeset
   840
  manually like any other type class.
haftmann
parents:
diff changeset
   841
haftmann
parents:
diff changeset
   842
  Though this \isa{eq} class is designed to get rarely in
haftmann
parents:
diff changeset
   843
  the way, a subtlety
haftmann
parents:
diff changeset
   844
  enters the stage when definitions of overloaded constants
haftmann
parents:
diff changeset
   845
  are dependent on operational equality.  For example, let
haftmann
parents:
diff changeset
   846
  us define a lexicographic ordering on tuples
haftmann
parents:
diff changeset
   847
  (also see theory \hyperlink{theory.Product-ord}{\mbox{\isa{Product{\isacharunderscore}ord}}}):%
haftmann
parents:
diff changeset
   848
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   849
\isamarkuptrue%
haftmann
parents:
diff changeset
   850
%
haftmann
parents:
diff changeset
   851
\isadelimquoteme
haftmann
parents:
diff changeset
   852
%
haftmann
parents:
diff changeset
   853
\endisadelimquoteme
haftmann
parents:
diff changeset
   854
%
haftmann
parents:
diff changeset
   855
\isatagquoteme
haftmann
parents:
diff changeset
   856
\isacommand{instantiation}\isamarkupfalse%
haftmann
parents:
diff changeset
   857
\ {\isachardoublequoteopen}{\isacharasterisk}{\isachardoublequoteclose}\ {\isacharcolon}{\isacharcolon}\ {\isacharparenleft}order{\isacharcomma}\ order{\isacharparenright}\ order\isanewline
haftmann
parents:
diff changeset
   858
\isakeyword{begin}\isanewline
haftmann
parents:
diff changeset
   859
\isanewline
haftmann
parents:
diff changeset
   860
\isacommand{definition}\isamarkupfalse%
haftmann
parents:
diff changeset
   861
\ {\isacharbrackleft}code\ func\ del{\isacharbrackright}{\isacharcolon}\isanewline
haftmann
parents:
diff changeset
   862
\ \ {\isachardoublequoteopen}x\ {\isasymle}\ y\ {\isasymlongleftrightarrow}\ fst\ x\ {\isacharless}\ fst\ y\ {\isasymor}\ fst\ x\ {\isacharequal}\ fst\ y\ {\isasymand}\ snd\ x\ {\isasymle}\ snd\ y{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   863
\isanewline
haftmann
parents:
diff changeset
   864
\isacommand{definition}\isamarkupfalse%
haftmann
parents:
diff changeset
   865
\ {\isacharbrackleft}code\ func\ del{\isacharbrackright}{\isacharcolon}\isanewline
haftmann
parents:
diff changeset
   866
\ \ {\isachardoublequoteopen}x\ {\isacharless}\ y\ {\isasymlongleftrightarrow}\ fst\ x\ {\isacharless}\ fst\ y\ {\isasymor}\ fst\ x\ {\isacharequal}\ fst\ y\ {\isasymand}\ snd\ x\ {\isacharless}\ snd\ y{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   867
\isanewline
haftmann
parents:
diff changeset
   868
\isacommand{instance}\isamarkupfalse%
haftmann
parents:
diff changeset
   869
\ \isacommand{proof}\isamarkupfalse%
haftmann
parents:
diff changeset
   870
\isanewline
haftmann
parents:
diff changeset
   871
\isacommand{qed}\isamarkupfalse%
haftmann
parents:
diff changeset
   872
\ {\isacharparenleft}auto\ simp{\isacharcolon}\ less{\isacharunderscore}eq{\isacharunderscore}prod{\isacharunderscore}def\ less{\isacharunderscore}prod{\isacharunderscore}def\ intro{\isacharcolon}\ order{\isacharunderscore}less{\isacharunderscore}trans{\isacharparenright}\isanewline
haftmann
parents:
diff changeset
   873
\isanewline
haftmann
parents:
diff changeset
   874
\isacommand{end}\isamarkupfalse%
haftmann
parents:
diff changeset
   875
\isanewline
haftmann
parents:
diff changeset
   876
\isanewline
haftmann
parents:
diff changeset
   877
\isacommand{lemma}\isamarkupfalse%
haftmann
parents:
diff changeset
   878
\ order{\isacharunderscore}prod\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
haftmann
parents:
diff changeset
   879
\ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}order{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}order{\isacharparenright}\ {\isacharless}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
haftmann
parents:
diff changeset
   880
\ \ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isacharless}\ y{\isadigit{2}}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   881
\ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}order{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}order{\isacharparenright}\ {\isasymle}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
haftmann
parents:
diff changeset
   882
\ \ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isasymle}\ y{\isadigit{2}}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   883
\ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   884
\ {\isacharparenleft}simp{\isacharunderscore}all\ add{\isacharcolon}\ less{\isacharunderscore}prod{\isacharunderscore}def\ less{\isacharunderscore}eq{\isacharunderscore}prod{\isacharunderscore}def{\isacharparenright}%
haftmann
parents:
diff changeset
   885
\endisatagquoteme
haftmann
parents:
diff changeset
   886
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   887
%
haftmann
parents:
diff changeset
   888
\isadelimquoteme
haftmann
parents:
diff changeset
   889
%
haftmann
parents:
diff changeset
   890
\endisadelimquoteme
haftmann
parents:
diff changeset
   891
%
haftmann
parents:
diff changeset
   892
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   893
\noindent Then code generation will fail.  Why?  The definition
haftmann
parents:
diff changeset
   894
  of \isa{op\ {\isasymle}} depends on equality on both arguments,
haftmann
parents:
diff changeset
   895
  which are polymorphic and impose an additional \isa{eq}
haftmann
parents:
diff changeset
   896
  class constraint, which the preprocessor does not propagate
haftmann
parents:
diff changeset
   897
  (for technical reasons).
haftmann
parents:
diff changeset
   898
haftmann
parents:
diff changeset
   899
  The solution is to add \isa{eq} explicitly to the first sort arguments in the
haftmann
parents:
diff changeset
   900
  code theorems:%
haftmann
parents:
diff changeset
   901
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   902
\isamarkuptrue%
haftmann
parents:
diff changeset
   903
%
haftmann
parents:
diff changeset
   904
\isadelimquoteme
haftmann
parents:
diff changeset
   905
%
haftmann
parents:
diff changeset
   906
\endisadelimquoteme
haftmann
parents:
diff changeset
   907
%
haftmann
parents:
diff changeset
   908
\isatagquoteme
haftmann
parents:
diff changeset
   909
\isacommand{lemma}\isamarkupfalse%
haftmann
parents:
diff changeset
   910
\ order{\isacharunderscore}prod{\isacharunderscore}code\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
haftmann
parents:
diff changeset
   911
\ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}{\isacharbraceleft}order{\isacharcomma}\ eq{\isacharbraceright}{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}order{\isacharparenright}\ {\isacharless}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
haftmann
parents:
diff changeset
   912
\ \ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isacharless}\ y{\isadigit{2}}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   913
\ \ {\isachardoublequoteopen}{\isacharparenleft}x{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}a{\isasymColon}{\isacharbraceleft}order{\isacharcomma}\ eq{\isacharbraceright}{\isacharcomma}\ y{\isadigit{1}}\ {\isasymColon}\ {\isacharprime}b{\isasymColon}order{\isacharparenright}\ {\isasymle}\ {\isacharparenleft}x{\isadigit{2}}{\isacharcomma}\ y{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
haftmann
parents:
diff changeset
   914
\ \ \ \ \ x{\isadigit{1}}\ {\isacharless}\ x{\isadigit{2}}\ {\isasymor}\ x{\isadigit{1}}\ {\isacharequal}\ x{\isadigit{2}}\ {\isasymand}\ y{\isadigit{1}}\ {\isasymle}\ y{\isadigit{2}}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
   915
\ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
   916
\ {\isacharparenleft}simp{\isacharunderscore}all\ add{\isacharcolon}\ less{\isacharunderscore}prod{\isacharunderscore}def\ less{\isacharunderscore}eq{\isacharunderscore}prod{\isacharunderscore}def{\isacharparenright}%
haftmann
parents:
diff changeset
   917
\endisatagquoteme
haftmann
parents:
diff changeset
   918
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   919
%
haftmann
parents:
diff changeset
   920
\isadelimquoteme
haftmann
parents:
diff changeset
   921
%
haftmann
parents:
diff changeset
   922
\endisadelimquoteme
haftmann
parents:
diff changeset
   923
%
haftmann
parents:
diff changeset
   924
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   925
\noindent Then code generation succeeds:%
haftmann
parents:
diff changeset
   926
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   927
\isamarkuptrue%
haftmann
parents:
diff changeset
   928
%
haftmann
parents:
diff changeset
   929
\isadelimquoteme
haftmann
parents:
diff changeset
   930
%
haftmann
parents:
diff changeset
   931
\endisadelimquoteme
haftmann
parents:
diff changeset
   932
%
haftmann
parents:
diff changeset
   933
\isatagquoteme
haftmann
parents:
diff changeset
   934
%
haftmann
parents:
diff changeset
   935
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   936
\isaverbatim%
haftmann
parents:
diff changeset
   937
\noindent%
haftmann
parents:
diff changeset
   938
\verb|structure Example = |\newline%
haftmann
parents:
diff changeset
   939
\verb|struct|\newline%
haftmann
parents:
diff changeset
   940
\newline%
haftmann
parents:
diff changeset
   941
\verb|type 'a eq = {eq : 'a -> 'a -> bool};|\newline%
haftmann
parents:
diff changeset
   942
\verb|fun eq (A_:'a eq) = #eq A_;|\newline%
haftmann
parents:
diff changeset
   943
\newline%
haftmann
parents:
diff changeset
   944
\verb|type 'a ord = {less_eq : 'a -> 'a -> bool, less : 'a -> 'a -> bool};|\newline%
haftmann
parents:
diff changeset
   945
\verb|fun less_eq (A_:'a ord) = #less_eq A_;|\newline%
haftmann
parents:
diff changeset
   946
\verb|fun less (A_:'a ord) = #less A_;|\newline%
haftmann
parents:
diff changeset
   947
\newline%
haftmann
parents:
diff changeset
   948
\verb|fun eqop A_ a b = eq A_ a b;|\newline%
haftmann
parents:
diff changeset
   949
\newline%
haftmann
parents:
diff changeset
   950
\verb|type 'a preorder = {Orderings__ord_preorder : 'a ord};|\newline%
haftmann
parents:
diff changeset
   951
\verb|fun ord_preorder (A_:'a preorder) = #Orderings__ord_preorder A_;|\newline%
haftmann
parents:
diff changeset
   952
\newline%
haftmann
parents:
diff changeset
   953
\verb|type 'a order = {Orderings__preorder_order : 'a preorder};|\newline%
haftmann
parents:
diff changeset
   954
\verb|fun preorder_order (A_:'a order) = #Orderings__preorder_order A_;|\newline%
haftmann
parents:
diff changeset
   955
\newline%
haftmann
parents:
diff changeset
   956
\verb|fun less_eqa (A1_, A2_) B_ (x1, y1) (x2, y2) =|\newline%
haftmann
parents:
diff changeset
   957
\verb|  less ((ord_preorder o preorder_order) A2_) x1 x2 orelse|\newline%
haftmann
parents:
diff changeset
   958
\verb|    eqop A1_ x1 x2 andalso|\newline%
haftmann
parents:
diff changeset
   959
\verb|      less_eq ((ord_preorder o preorder_order) B_) y1 y2|\newline%
haftmann
parents:
diff changeset
   960
\verb|  |\verb,|,\verb| less_eqa (A1_, A2_) B_ (x1, y1) (x2, y2) =|\newline%
haftmann
parents:
diff changeset
   961
\verb|    less ((ord_preorder o preorder_order) A2_) x1 x2 orelse|\newline%
haftmann
parents:
diff changeset
   962
\verb|      eqop A1_ x1 x2 andalso|\newline%
haftmann
parents:
diff changeset
   963
\verb|        less_eq ((ord_preorder o preorder_order) B_) y1 y2;|\newline%
haftmann
parents:
diff changeset
   964
\newline%
haftmann
parents:
diff changeset
   965
\verb|end; (*struct Example*)|%
haftmann
parents:
diff changeset
   966
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   967
\isamarkuptrue%
haftmann
parents:
diff changeset
   968
%
haftmann
parents:
diff changeset
   969
\endisatagquoteme
haftmann
parents:
diff changeset
   970
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   971
%
haftmann
parents:
diff changeset
   972
\isadelimquoteme
haftmann
parents:
diff changeset
   973
%
haftmann
parents:
diff changeset
   974
\endisadelimquoteme
haftmann
parents:
diff changeset
   975
%
haftmann
parents:
diff changeset
   976
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
   977
In some cases, the automatically derived defining equations
haftmann
parents:
diff changeset
   978
  for equality on a particular type may not be appropriate.
haftmann
parents:
diff changeset
   979
  As example, watch the following datatype representing
haftmann
parents:
diff changeset
   980
  monomorphic parametric types (where type constructors
haftmann
parents:
diff changeset
   981
  are referred to by natural numbers):%
haftmann
parents:
diff changeset
   982
\end{isamarkuptext}%
haftmann
parents:
diff changeset
   983
\isamarkuptrue%
haftmann
parents:
diff changeset
   984
%
haftmann
parents:
diff changeset
   985
\isadelimquoteme
haftmann
parents:
diff changeset
   986
%
haftmann
parents:
diff changeset
   987
\endisadelimquoteme
haftmann
parents:
diff changeset
   988
%
haftmann
parents:
diff changeset
   989
\isatagquoteme
haftmann
parents:
diff changeset
   990
\isacommand{datatype}\isamarkupfalse%
haftmann
parents:
diff changeset
   991
\ monotype\ {\isacharequal}\ Mono\ nat\ {\isachardoublequoteopen}monotype\ list{\isachardoublequoteclose}%
haftmann
parents:
diff changeset
   992
\endisatagquoteme
haftmann
parents:
diff changeset
   993
{\isafoldquoteme}%
haftmann
parents:
diff changeset
   994
%
haftmann
parents:
diff changeset
   995
\isadelimquoteme
haftmann
parents:
diff changeset
   996
%
haftmann
parents:
diff changeset
   997
\endisadelimquoteme
haftmann
parents:
diff changeset
   998
%
haftmann
parents:
diff changeset
   999
\isadelimproof
haftmann
parents:
diff changeset
  1000
%
haftmann
parents:
diff changeset
  1001
\endisadelimproof
haftmann
parents:
diff changeset
  1002
%
haftmann
parents:
diff changeset
  1003
\isatagproof
haftmann
parents:
diff changeset
  1004
%
haftmann
parents:
diff changeset
  1005
\endisatagproof
haftmann
parents:
diff changeset
  1006
{\isafoldproof}%
haftmann
parents:
diff changeset
  1007
%
haftmann
parents:
diff changeset
  1008
\isadelimproof
haftmann
parents:
diff changeset
  1009
%
haftmann
parents:
diff changeset
  1010
\endisadelimproof
haftmann
parents:
diff changeset
  1011
%
haftmann
parents:
diff changeset
  1012
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
  1013
Then code generation for SML would fail with a message
haftmann
parents:
diff changeset
  1014
  that the generated code contains illegal mutual dependencies:
haftmann
parents:
diff changeset
  1015
  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
haftmann
parents:
diff changeset
  1016
  instance \isa{monotype\ {\isasymColon}\ eq}, which itself requires
haftmann
parents:
diff changeset
  1017
  \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
haftmann
parents:
diff changeset
  1018
  recursive \isa{inst} and \isa{fun} definitions,
haftmann
parents:
diff changeset
  1019
  but the SML serializer does not support this.
haftmann
parents:
diff changeset
  1020
haftmann
parents:
diff changeset
  1021
  In such cases, you have to provide your own equality equations
haftmann
parents:
diff changeset
  1022
  involving auxiliary constants.  In our case,
haftmann
parents:
diff changeset
  1023
  \isa{list{\isacharunderscore}all{\isadigit{2}}} can do the job:%
haftmann
parents:
diff changeset
  1024
\end{isamarkuptext}%
haftmann
parents:
diff changeset
  1025
\isamarkuptrue%
haftmann
parents:
diff changeset
  1026
%
haftmann
parents:
diff changeset
  1027
\isadelimquoteme
haftmann
parents:
diff changeset
  1028
%
haftmann
parents:
diff changeset
  1029
\endisadelimquoteme
haftmann
parents:
diff changeset
  1030
%
haftmann
parents:
diff changeset
  1031
\isatagquoteme
haftmann
parents:
diff changeset
  1032
\isacommand{lemma}\isamarkupfalse%
haftmann
parents:
diff changeset
  1033
\ monotype{\isacharunderscore}eq{\isacharunderscore}list{\isacharunderscore}all{\isadigit{2}}\ {\isacharbrackleft}code\ func{\isacharbrackright}{\isacharcolon}\isanewline
haftmann
parents:
diff changeset
  1034
\ \ {\isachardoublequoteopen}eq{\isacharunderscore}class{\isachardot}eq\ {\isacharparenleft}Mono\ tyco{\isadigit{1}}\ typargs{\isadigit{1}}{\isacharparenright}\ {\isacharparenleft}Mono\ tyco{\isadigit{2}}\ typargs{\isadigit{2}}{\isacharparenright}\ {\isasymlongleftrightarrow}\isanewline
haftmann
parents:
diff changeset
  1035
\ \ \ \ \ tyco{\isadigit{1}}\ {\isacharequal}\ tyco{\isadigit{2}}\ {\isasymand}\ list{\isacharunderscore}all{\isadigit{2}}\ eq{\isacharunderscore}class{\isachardot}eq\ typargs{\isadigit{1}}\ typargs{\isadigit{2}}{\isachardoublequoteclose}\isanewline
haftmann
parents:
diff changeset
  1036
\ \ \isacommand{by}\isamarkupfalse%
haftmann
parents:
diff changeset
  1037
\ {\isacharparenleft}simp\ add{\isacharcolon}\ eq\ list{\isacharunderscore}all{\isadigit{2}}{\isacharunderscore}eq\ {\isacharbrackleft}symmetric{\isacharbrackright}{\isacharparenright}%
haftmann
parents:
diff changeset
  1038
\endisatagquoteme
haftmann
parents:
diff changeset
  1039
{\isafoldquoteme}%
haftmann
parents:
diff changeset
  1040
%
haftmann
parents:
diff changeset
  1041
\isadelimquoteme
haftmann
parents:
diff changeset
  1042
%
haftmann
parents:
diff changeset
  1043
\endisadelimquoteme
haftmann
parents:
diff changeset
  1044
%
haftmann
parents:
diff changeset
  1045
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
  1046
\noindent does not depend on instance \isa{monotype\ {\isasymColon}\ eq}:%
haftmann
parents:
diff changeset
  1047
\end{isamarkuptext}%
haftmann
parents:
diff changeset
  1048
\isamarkuptrue%
haftmann
parents:
diff changeset
  1049
%
haftmann
parents:
diff changeset
  1050
\isadelimquoteme
haftmann
parents:
diff changeset
  1051
%
haftmann
parents:
diff changeset
  1052
\endisadelimquoteme
haftmann
parents:
diff changeset
  1053
%
haftmann
parents:
diff changeset
  1054
\isatagquoteme
haftmann
parents:
diff changeset
  1055
%
haftmann
parents:
diff changeset
  1056
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
  1057
\isaverbatim%
haftmann
parents:
diff changeset
  1058
\noindent%
haftmann
parents:
diff changeset
  1059
\verb|structure Example = |\newline%
haftmann
parents:
diff changeset
  1060
\verb|struct|\newline%
haftmann
parents:
diff changeset
  1061
\newline%
haftmann
parents:
diff changeset
  1062
\verb|type 'a eq = {eq : 'a -> 'a -> bool};|\newline%
haftmann
parents:
diff changeset
  1063
\verb|fun eq (A_:'a eq) = #eq A_;|\newline%
haftmann
parents:
diff changeset
  1064
\newline%
haftmann
parents:
diff changeset
  1065
\verb|datatype nat = Suc of nat |\verb,|,\verb| Zero_nat;|\newline%
haftmann
parents:
diff changeset
  1066
\newline%
haftmann
parents:
diff changeset
  1067
\verb|fun eqop A_ a b = eq A_ a b;|\newline%
haftmann
parents:
diff changeset
  1068
\newline%
haftmann
parents:
diff changeset
  1069
\verb|fun null (x :: xs) = false|\newline%
haftmann
parents:
diff changeset
  1070
\verb|  |\verb,|,\verb| null [] = true;|\newline%
haftmann
parents:
diff changeset
  1071
\newline%
haftmann
parents:
diff changeset
  1072
\verb|fun eq_nat (Suc a) Zero_nat = false|\newline%
haftmann
parents:
diff changeset
  1073
\verb|  |\verb,|,\verb| eq_nat Zero_nat (Suc a) = false|\newline%
haftmann
parents:
diff changeset
  1074
\verb|  |\verb,|,\verb| eq_nat (Suc nat) (Suc nat') = eq_nat nat nat'|\newline%
haftmann
parents:
diff changeset
  1075
\verb|  |\verb,|,\verb| eq_nat Zero_nat Zero_nat = true;|\newline%
haftmann
parents:
diff changeset
  1076
\newline%
haftmann
parents:
diff changeset
  1077
\verb|val eq_nata = {eq = eq_nat} : nat eq;|\newline%
haftmann
parents:
diff changeset
  1078
\newline%
haftmann
parents:
diff changeset
  1079
\verb|datatype monotype = Mono of nat * monotype list;|\newline%
haftmann
parents:
diff changeset
  1080
\newline%
haftmann
parents:
diff changeset
  1081
\verb|fun list_all2 p (x :: xs) (y :: ys) = p x y andalso list_all2 p xs ys|\newline%
haftmann
parents:
diff changeset
  1082
\verb|  |\verb,|,\verb| list_all2 p xs [] = null xs|\newline%
haftmann
parents:
diff changeset
  1083
\verb|  |\verb,|,\verb| list_all2 p [] ys = null ys;|\newline%
haftmann
parents:
diff changeset
  1084
\newline%
haftmann
parents:
diff changeset
  1085
\verb|fun eq_monotype (Mono (tyco1, typargs1)) (Mono (tyco2, typargs2)) =|\newline%
haftmann
parents:
diff changeset
  1086
\verb|  eqop eq_nata tyco1 tyco2 andalso|\newline%
haftmann
parents:
diff changeset
  1087
\verb|    list_all2 eq_monotype typargs1 typargs2;|\newline%
haftmann
parents:
diff changeset
  1088
\newline%
haftmann
parents:
diff changeset
  1089
\verb|end; (*struct Example*)|%
haftmann
parents:
diff changeset
  1090
\end{isamarkuptext}%
haftmann
parents:
diff changeset
  1091
\isamarkuptrue%
haftmann
parents:
diff changeset
  1092
%
haftmann
parents:
diff changeset
  1093
\endisatagquoteme
haftmann
parents:
diff changeset
  1094
{\isafoldquoteme}%
haftmann
parents:
diff changeset
  1095
%
haftmann
parents:
diff changeset
  1096
\isadelimquoteme
haftmann
parents:
diff changeset
  1097
%
haftmann
parents:
diff changeset
  1098
\endisadelimquoteme
haftmann
parents:
diff changeset
  1099
%
haftmann
parents:
diff changeset
  1100
\isamarkupsubsection{Partiality%
haftmann
parents:
diff changeset
  1101
}
haftmann
parents:
diff changeset
  1102
\isamarkuptrue%
haftmann
parents:
diff changeset
  1103
%
haftmann
parents:
diff changeset
  1104
\begin{isamarkuptext}%
haftmann
parents:
diff changeset
  1105
\hyperlink{command.code-abort}{\mbox{\isa{\isacommand{code{\isacharunderscore}abort}}}}, examples: maps%
haftmann
parents:
diff changeset
  1106
\end{isamarkuptext}%
haftmann
parents:
diff changeset
  1107
\isamarkuptrue%
haftmann
parents:
diff changeset
  1108
%
haftmann
parents:
diff changeset
  1109
\isadelimtheory
haftmann
parents:
diff changeset
  1110
%
haftmann
parents:
diff changeset
  1111
\endisadelimtheory
haftmann
parents:
diff changeset
  1112
%
haftmann
parents:
diff changeset
  1113
\isatagtheory
haftmann
parents:
diff changeset
  1114
\isacommand{end}\isamarkupfalse%
haftmann
parents:
diff changeset
  1115
%
haftmann
parents:
diff changeset
  1116
\endisatagtheory
haftmann
parents:
diff changeset
  1117
{\isafoldtheory}%
haftmann
parents:
diff changeset
  1118
%
haftmann
parents:
diff changeset
  1119
\isadelimtheory
haftmann
parents:
diff changeset
  1120
%
haftmann
parents:
diff changeset
  1121
\endisadelimtheory
haftmann
parents:
diff changeset
  1122
\isanewline
haftmann
parents:
diff changeset
  1123
\end{isabellebody}%
haftmann
parents:
diff changeset
  1124
%%% Local Variables:
haftmann
parents:
diff changeset
  1125
%%% mode: latex
haftmann
parents:
diff changeset
  1126
%%% TeX-master: "root"
haftmann
parents:
diff changeset
  1127
%%% End: