doc-src/Codegen/Thy/document/Foundations.tex
author haftmann
Fri, 13 Aug 2010 14:41:12 +0200
changeset 38406 bbb02b67caac
child 38437 ffb1c5bf0425
permissions -rw-r--r--
sketch of new outline
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38406
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
     1
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
     2
\begin{isabellebody}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
     3
\def\isabellecontext{Foundations}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
     4
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
     5
\isadelimtheory
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
     6
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
     7
\endisadelimtheory
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
     8
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
     9
\isatagtheory
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    10
\isacommand{theory}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    11
\ Foundations\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    12
\isakeyword{imports}\ Introduction\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    13
\isakeyword{begin}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    14
\endisatagtheory
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    15
{\isafoldtheory}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    16
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    17
\isadelimtheory
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    18
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    19
\endisadelimtheory
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    20
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    21
\isamarkupsection{Code generation foundations \label{sec:program}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    22
}
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    23
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    24
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    25
\isamarkupsubsection{The \isa{Isabelle{\isacharslash}HOL} default setup%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    26
}
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    27
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    28
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    29
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    30
We have already seen how by default equations stemming from
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    31
  \hyperlink{command.definition}{\mbox{\isa{\isacommand{definition}}}}, \hyperlink{command.primrec}{\mbox{\isa{\isacommand{primrec}}}} and \hyperlink{command.fun}{\mbox{\isa{\isacommand{fun}}}}
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    32
  statements are used for code generation.  This default behaviour
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    33
  can be changed, e.g.\ by providing different code equations.
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    34
  The customisations shown in this section are \emph{safe}
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    35
  as regards correctness: all programs that can be generated are partially
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    36
  correct.%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    37
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    38
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    39
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    40
\isamarkupsubsection{Selecting code equations%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    41
}
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    42
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    43
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    44
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    45
Coming back to our introductory example, we
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    46
  could provide an alternative code equations for \isa{dequeue}
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    47
  explicitly:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    48
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    49
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    50
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    51
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    52
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    53
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    54
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    55
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    56
\isacommand{lemma}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    57
\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    58
\ \ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}AQueue\ xs\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    59
\ \ \ \ \ {\isacharparenleft}if\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ then\ {\isacharparenleft}None{\isacharcomma}\ AQueue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    60
\ \ \ \ \ \ \ else\ dequeue\ {\isacharparenleft}AQueue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharparenleft}rev\ xs{\isacharparenright}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    61
\ \ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}AQueue\ xs\ {\isacharparenleft}y\ {\isacharhash}\ ys{\isacharparenright}{\isacharparenright}\ {\isacharequal}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    62
\ \ \ \ \ {\isacharparenleft}Some\ y{\isacharcomma}\ AQueue\ xs\ ys{\isacharparenright}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    63
\ \ \isacommand{by}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    64
\ {\isacharparenleft}cases\ xs{\isacharcomma}\ simp{\isacharunderscore}all{\isacharparenright}\ {\isacharparenleft}cases\ {\isachardoublequoteopen}rev\ xs{\isachardoublequoteclose}{\isacharcomma}\ simp{\isacharunderscore}all{\isacharparenright}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    65
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    66
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    67
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    68
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    69
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    70
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    71
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    72
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    73
\noindent The annotation \isa{{\isacharbrackleft}code{\isacharbrackright}} is an \isa{Isar}
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    74
  \isa{attribute} which states that the given theorems should be
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    75
  considered as code equations for a \isa{fun} statement --
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    76
  the corresponding constant is determined syntactically.  The resulting code:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    77
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    78
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    79
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    80
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    81
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    82
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    83
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    84
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    85
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    86
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    87
\isatypewriter%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    88
\noindent%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    89
\hspace*{0pt}dequeue ::~forall a.~Queue a -> (Maybe a,~Queue a);\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    90
\hspace*{0pt}dequeue (AQueue xs (y :~ys)) = (Just y,~AQueue xs ys);\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    91
\hspace*{0pt}dequeue (AQueue xs []) =\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    92
\hspace*{0pt} ~(if null xs then (Nothing,~AQueue [] [])\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    93
\hspace*{0pt} ~~~else dequeue (AQueue [] (reverse xs)));%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    94
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    95
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    96
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    97
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    98
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
    99
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   100
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   101
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   102
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   103
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   104
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   105
\noindent You may note that the equality test \isa{xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}} has been
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   106
  replaced by the predicate \isa{null\ xs}.  This is due to the default
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   107
  setup in the \qn{preprocessor} to be discussed further below (\secref{sec:preproc}).
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   108
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   109
  Changing the default constructor set of datatypes is also
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   110
  possible.  See \secref{sec:datatypes} for an example.
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   111
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   112
  As told in \secref{sec:concept}, code generation is based
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   113
  on a structured collection of code theorems.
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   114
  This collection
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   115
  may be inspected using the \hyperlink{command.code-thms}{\mbox{\isa{\isacommand{code{\isacharunderscore}thms}}}} command:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   116
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   117
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   118
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   119
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   120
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   121
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   122
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   123
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   124
\isacommand{code{\isacharunderscore}thms}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   125
\ dequeue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   126
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   127
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   128
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   129
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   130
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   131
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   132
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   133
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   134
\noindent prints a table with \emph{all} code equations
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   135
  for \isa{dequeue}, including
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   136
  \emph{all} code equations those equations depend
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   137
  on recursively.
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   138
  
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   139
  Similarly, the \hyperlink{command.code-deps}{\mbox{\isa{\isacommand{code{\isacharunderscore}deps}}}} command shows a graph
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   140
  visualising dependencies between code equations.%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   141
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   142
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   143
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   144
\isamarkupsubsection{\isa{class} and \isa{instantiation}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   145
}
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   146
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   147
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   148
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   149
Concerning type classes and code generation, let us examine an example
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   150
  from abstract algebra:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   151
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   152
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   153
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   154
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   155
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   156
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   157
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   158
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   159
\isacommand{class}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   160
\ semigroup\ {\isacharequal}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   161
\ \ \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
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   162
\ \ \isakeyword{assumes}\ assoc{\isacharcolon}\ {\isachardoublequoteopen}{\isacharparenleft}x\ {\isasymotimes}\ y{\isacharparenright}\ {\isasymotimes}\ z\ {\isacharequal}\ x\ {\isasymotimes}\ {\isacharparenleft}y\ {\isasymotimes}\ z{\isacharparenright}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   163
\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   164
\isacommand{class}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   165
\ monoid\ {\isacharequal}\ semigroup\ {\isacharplus}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   166
\ \ \isakeyword{fixes}\ neutral\ {\isacharcolon}{\isacharcolon}\ {\isacharprime}a\ {\isacharparenleft}{\isachardoublequoteopen}{\isasymone}{\isachardoublequoteclose}{\isacharparenright}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   167
\ \ \isakeyword{assumes}\ neutl{\isacharcolon}\ {\isachardoublequoteopen}{\isasymone}\ {\isasymotimes}\ x\ {\isacharequal}\ x{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   168
\ \ \ \ \isakeyword{and}\ neutr{\isacharcolon}\ {\isachardoublequoteopen}x\ {\isasymotimes}\ {\isasymone}\ {\isacharequal}\ x{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   169
\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   170
\isacommand{instantiation}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   171
\ nat\ {\isacharcolon}{\isacharcolon}\ monoid\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   172
\isakeyword{begin}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   173
\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   174
\isacommand{primrec}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   175
\ mult{\isacharunderscore}nat\ \isakeyword{where}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   176
\ \ \ \ {\isachardoublequoteopen}{\isadigit{0}}\ {\isasymotimes}\ n\ {\isacharequal}\ {\isacharparenleft}{\isadigit{0}}{\isasymColon}nat{\isacharparenright}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   177
\ \ {\isacharbar}\ {\isachardoublequoteopen}Suc\ m\ {\isasymotimes}\ n\ {\isacharequal}\ n\ {\isacharplus}\ m\ {\isasymotimes}\ n{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   178
\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   179
\isacommand{definition}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   180
\ neutral{\isacharunderscore}nat\ \isakeyword{where}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   181
\ \ {\isachardoublequoteopen}{\isasymone}\ {\isacharequal}\ Suc\ {\isadigit{0}}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   182
\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   183
\isacommand{lemma}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   184
\ add{\isacharunderscore}mult{\isacharunderscore}distrib{\isacharcolon}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   185
\ \ \isakeyword{fixes}\ n\ m\ q\ {\isacharcolon}{\isacharcolon}\ nat\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   186
\ \ \isakeyword{shows}\ {\isachardoublequoteopen}{\isacharparenleft}n\ {\isacharplus}\ m{\isacharparenright}\ {\isasymotimes}\ q\ {\isacharequal}\ n\ {\isasymotimes}\ q\ {\isacharplus}\ m\ {\isasymotimes}\ q{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   187
\ \ \isacommand{by}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   188
\ {\isacharparenleft}induct\ n{\isacharparenright}\ simp{\isacharunderscore}all\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   189
\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   190
\isacommand{instance}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   191
\ \isacommand{proof}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   192
\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   193
\ \ \isacommand{fix}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   194
\ m\ n\ q\ {\isacharcolon}{\isacharcolon}\ nat\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   195
\ \ \isacommand{show}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   196
\ {\isachardoublequoteopen}m\ {\isasymotimes}\ n\ {\isasymotimes}\ q\ {\isacharequal}\ m\ {\isasymotimes}\ {\isacharparenleft}n\ {\isasymotimes}\ q{\isacharparenright}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   197
\ \ \ \ \isacommand{by}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   198
\ {\isacharparenleft}induct\ m{\isacharparenright}\ {\isacharparenleft}simp{\isacharunderscore}all\ add{\isacharcolon}\ add{\isacharunderscore}mult{\isacharunderscore}distrib{\isacharparenright}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   199
\ \ \isacommand{show}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   200
\ {\isachardoublequoteopen}{\isasymone}\ {\isasymotimes}\ n\ {\isacharequal}\ n{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   201
\ \ \ \ \isacommand{by}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   202
\ {\isacharparenleft}simp\ add{\isacharcolon}\ neutral{\isacharunderscore}nat{\isacharunderscore}def{\isacharparenright}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   203
\ \ \isacommand{show}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   204
\ {\isachardoublequoteopen}m\ {\isasymotimes}\ {\isasymone}\ {\isacharequal}\ m{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   205
\ \ \ \ \isacommand{by}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   206
\ {\isacharparenleft}induct\ m{\isacharparenright}\ {\isacharparenleft}simp{\isacharunderscore}all\ add{\isacharcolon}\ neutral{\isacharunderscore}nat{\isacharunderscore}def{\isacharparenright}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   207
\isacommand{qed}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   208
\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   209
\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   210
\isacommand{end}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   211
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   212
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   213
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   214
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   215
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   216
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   217
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   218
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   219
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   220
\noindent We define the natural operation of the natural numbers
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   221
  on monoids:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   222
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   223
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   224
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   225
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   226
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   227
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   228
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   229
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   230
\isacommand{primrec}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   231
\ {\isacharparenleft}\isakeyword{in}\ monoid{\isacharparenright}\ pow\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   232
\ \ \ \ {\isachardoublequoteopen}pow\ {\isadigit{0}}\ a\ {\isacharequal}\ {\isasymone}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   233
\ \ {\isacharbar}\ {\isachardoublequoteopen}pow\ {\isacharparenleft}Suc\ n{\isacharparenright}\ a\ {\isacharequal}\ a\ {\isasymotimes}\ pow\ n\ a{\isachardoublequoteclose}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   234
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   235
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   236
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   237
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   238
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   239
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   240
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   241
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   242
\noindent This we use to define the discrete exponentiation function:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   243
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   244
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   245
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   246
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   247
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   248
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   249
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   250
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   251
\isacommand{definition}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   252
\ bexp\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}nat\ {\isasymRightarrow}\ nat{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   253
\ \ {\isachardoublequoteopen}bexp\ n\ {\isacharequal}\ pow\ n\ {\isacharparenleft}Suc\ {\isacharparenleft}Suc\ {\isadigit{0}}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   254
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   255
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   256
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   257
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   258
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   259
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   260
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   261
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   262
\noindent The corresponding code in Haskell uses that language's native classes:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   263
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   264
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   265
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   266
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   267
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   268
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   269
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   270
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   271
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   272
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   273
\isatypewriter%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   274
\noindent%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   275
\hspace*{0pt}module Example where {\char123}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   276
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   277
\hspace*{0pt}data Nat = Zero{\char95}nat | Suc Nat;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   278
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   279
\hspace*{0pt}plus{\char95}nat ::~Nat -> Nat -> Nat;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   280
\hspace*{0pt}plus{\char95}nat (Suc m) n = plus{\char95}nat m (Suc n);\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   281
\hspace*{0pt}plus{\char95}nat Zero{\char95}nat n = n;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   282
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   283
\hspace*{0pt}class Semigroup a where {\char123}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   284
\hspace*{0pt} ~mult ::~a -> a -> a;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   285
\hspace*{0pt}{\char125};\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   286
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   287
\hspace*{0pt}class (Semigroup a) => Monoid a where {\char123}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   288
\hspace*{0pt} ~neutral ::~a;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   289
\hspace*{0pt}{\char125};\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   290
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   291
\hspace*{0pt}pow ::~forall a.~(Monoid a) => Nat -> a -> a;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   292
\hspace*{0pt}pow Zero{\char95}nat a = neutral;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   293
\hspace*{0pt}pow (Suc n) a = mult a (pow n a);\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   294
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   295
\hspace*{0pt}mult{\char95}nat ::~Nat -> Nat -> Nat;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   296
\hspace*{0pt}mult{\char95}nat Zero{\char95}nat n = Zero{\char95}nat;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   297
\hspace*{0pt}mult{\char95}nat (Suc m) n = plus{\char95}nat n (mult{\char95}nat m n);\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   298
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   299
\hspace*{0pt}neutral{\char95}nat ::~Nat;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   300
\hspace*{0pt}neutral{\char95}nat = Suc Zero{\char95}nat;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   301
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   302
\hspace*{0pt}instance Semigroup Nat where {\char123}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   303
\hspace*{0pt} ~mult = mult{\char95}nat;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   304
\hspace*{0pt}{\char125};\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   305
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   306
\hspace*{0pt}instance Monoid Nat where {\char123}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   307
\hspace*{0pt} ~neutral = neutral{\char95}nat;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   308
\hspace*{0pt}{\char125};\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   309
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   310
\hspace*{0pt}bexp ::~Nat -> Nat;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   311
\hspace*{0pt}bexp n = pow n (Suc (Suc Zero{\char95}nat));\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   312
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   313
\hspace*{0pt}{\char125}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   314
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   315
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   316
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   317
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   318
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   319
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   320
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   321
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   322
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   323
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   324
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   325
\noindent This is a convenient place to show how explicit dictionary construction
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   326
  manifests in generated code (here, the same example in \isa{SML})
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   327
  \cite{Haftmann-Nipkow:2010:code}:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   328
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   329
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   330
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   331
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   332
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   333
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   334
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   335
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   336
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   337
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   338
\isatypewriter%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   339
\noindent%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   340
\hspace*{0pt}structure Example :~sig\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   341
\hspace*{0pt} ~datatype nat = Zero{\char95}nat | Suc of nat\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   342
\hspace*{0pt} ~val plus{\char95}nat :~nat -> nat -> nat\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   343
\hspace*{0pt} ~type 'a semigroup\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   344
\hspace*{0pt} ~val mult :~'a semigroup -> 'a -> 'a -> 'a\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   345
\hspace*{0pt} ~type 'a monoid\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   346
\hspace*{0pt} ~val semigroup{\char95}monoid :~'a monoid -> 'a semigroup\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   347
\hspace*{0pt} ~val neutral :~'a monoid -> 'a\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   348
\hspace*{0pt} ~val pow :~'a monoid -> nat -> 'a -> 'a\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   349
\hspace*{0pt} ~val mult{\char95}nat :~nat -> nat -> nat\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   350
\hspace*{0pt} ~val neutral{\char95}nat :~nat\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   351
\hspace*{0pt} ~val semigroup{\char95}nat :~nat semigroup\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   352
\hspace*{0pt} ~val monoid{\char95}nat :~nat monoid\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   353
\hspace*{0pt} ~val bexp :~nat -> nat\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   354
\hspace*{0pt}end = struct\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   355
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   356
\hspace*{0pt}datatype nat = Zero{\char95}nat | Suc of nat;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   357
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   358
\hspace*{0pt}fun plus{\char95}nat (Suc m) n = plus{\char95}nat m (Suc n)\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   359
\hspace*{0pt} ~| plus{\char95}nat Zero{\char95}nat n = n;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   360
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   361
\hspace*{0pt}type 'a semigroup = {\char123}mult :~'a -> 'a -> 'a{\char125};\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   362
\hspace*{0pt}val mult = {\char35}mult :~'a semigroup -> 'a -> 'a -> 'a;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   363
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   364
\hspace*{0pt}type 'a monoid = {\char123}semigroup{\char95}monoid :~'a semigroup,~neutral :~'a{\char125};\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   365
\hspace*{0pt}val semigroup{\char95}monoid = {\char35}semigroup{\char95}monoid :~'a monoid -> 'a semigroup;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   366
\hspace*{0pt}val neutral = {\char35}neutral :~'a monoid -> 'a;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   367
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   368
\hspace*{0pt}fun pow A{\char95}~Zero{\char95}nat a = neutral A{\char95}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   369
\hspace*{0pt} ~| pow A{\char95}~(Suc n) a = mult (semigroup{\char95}monoid A{\char95}) a (pow A{\char95}~n a);\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   370
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   371
\hspace*{0pt}fun mult{\char95}nat Zero{\char95}nat n = Zero{\char95}nat\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   372
\hspace*{0pt} ~| mult{\char95}nat (Suc m) n = plus{\char95}nat n (mult{\char95}nat m n);\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   373
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   374
\hspace*{0pt}val neutral{\char95}nat :~nat = Suc Zero{\char95}nat;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   375
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   376
\hspace*{0pt}val semigroup{\char95}nat = {\char123}mult = mult{\char95}nat{\char125}~:~nat semigroup;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   377
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   378
\hspace*{0pt}val monoid{\char95}nat = {\char123}semigroup{\char95}monoid = semigroup{\char95}nat,~neutral = neutral{\char95}nat{\char125}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   379
\hspace*{0pt} ~:~nat monoid;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   380
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   381
\hspace*{0pt}fun bexp n = pow monoid{\char95}nat n (Suc (Suc Zero{\char95}nat));\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   382
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   383
\hspace*{0pt}end;~(*struct Example*)%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   384
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   385
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   386
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   387
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   388
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   389
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   390
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   391
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   392
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   393
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   394
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   395
\noindent Note the parameters with trailing underscore (\verb|A_|),
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   396
    which are the dictionary parameters.%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   397
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   398
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   399
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   400
\isamarkupsubsection{The preprocessor \label{sec:preproc}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   401
}
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   402
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   403
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   404
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   405
Before selected function theorems are turned into abstract
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   406
  code, a chain of definitional transformation steps is carried
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   407
  out: \emph{preprocessing}.  In essence, the preprocessor
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   408
  consists of two components: a \emph{simpset} and \emph{function transformers}.
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   409
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   410
  The \emph{simpset} can apply the full generality of the
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   411
  Isabelle simplifier.  Due to the interpretation of theorems as code
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   412
  equations, rewrites are applied to the right hand side and the
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   413
  arguments of the left hand side of an equation, but never to the
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   414
  constant heading the left hand side.  An important special case are
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   415
  \emph{unfold theorems},  which may be declared and removed using
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   416
  the \hyperlink{attribute.code-unfold}{\mbox{\isa{code{\isacharunderscore}unfold}}} or \emph{\hyperlink{attribute.code-unfold}{\mbox{\isa{code{\isacharunderscore}unfold}}} del}
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   417
  attribute, respectively.
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   418
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   419
  Some common applications:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   420
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   421
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   422
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   423
\begin{itemize}
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   424
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   425
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   426
\item replacing non-executable constructs by executable ones:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   427
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   428
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   429
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   430
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   431
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   432
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   433
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   434
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   435
\isacommand{lemma}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   436
\ {\isacharbrackleft}code{\isacharunderscore}unfold{\isacharbrackright}{\isacharcolon}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   437
\ \ {\isachardoublequoteopen}x\ {\isasymin}\ set\ xs\ {\isasymlongleftrightarrow}\ List{\isachardot}member\ xs\ x{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   438
\ {\isacharparenleft}fact\ in{\isacharunderscore}set{\isacharunderscore}member{\isacharparenright}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   439
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   440
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   441
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   442
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   443
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   444
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   445
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   446
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   447
\item eliminating superfluous constants:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   448
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   449
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   450
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   451
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   452
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   453
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   454
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   455
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   456
\isacommand{lemma}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   457
\ {\isacharbrackleft}code{\isacharunderscore}unfold{\isacharbrackright}{\isacharcolon}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   458
\ \ {\isachardoublequoteopen}{\isadigit{1}}\ {\isacharequal}\ Suc\ {\isadigit{0}}{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   459
\ {\isacharparenleft}fact\ One{\isacharunderscore}nat{\isacharunderscore}def{\isacharparenright}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   460
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   461
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   462
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   463
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   464
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   465
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   466
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   467
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   468
\item replacing executable but inconvenient constructs:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   469
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   470
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   471
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   472
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   473
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   474
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   475
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   476
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   477
\isacommand{lemma}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   478
\ {\isacharbrackleft}code{\isacharunderscore}unfold{\isacharbrackright}{\isacharcolon}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   479
\ \ {\isachardoublequoteopen}xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymlongleftrightarrow}\ List{\isachardot}null\ xs{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   480
\ {\isacharparenleft}fact\ eq{\isacharunderscore}Nil{\isacharunderscore}null{\isacharparenright}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   481
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   482
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   483
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   484
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   485
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   486
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   487
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   488
\end{itemize}
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   489
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   490
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   491
\noindent \emph{Function transformers} provide a very general interface,
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   492
  transforming a list of function theorems to another
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   493
  list of function theorems, provided that neither the heading
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   494
  constant nor its type change.  The \isa{{\isadigit{0}}} / \isa{Suc}
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   495
  pattern elimination implemented in
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   496
  theory \isa{Efficient{\isacharunderscore}Nat} (see \secref{eff_nat}) uses this
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   497
  interface.
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   498
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   499
  \noindent The current setup of the preprocessor may be inspected using
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   500
  the \hyperlink{command.print-codeproc}{\mbox{\isa{\isacommand{print{\isacharunderscore}codeproc}}}} command.
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   501
  \hyperlink{command.code-thms}{\mbox{\isa{\isacommand{code{\isacharunderscore}thms}}}} provides a convenient
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   502
  mechanism to inspect the impact of a preprocessor setup
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   503
  on code equations.
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   504
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   505
  \begin{warn}
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   506
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   507
    Attribute \hyperlink{attribute.code-unfold}{\mbox{\isa{code{\isacharunderscore}unfold}}} also applies to the
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   508
    preprocessor of the ancient \isa{SML\ code\ generator}; in case
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   509
    this is not what you intend, use \hyperlink{attribute.code-inline}{\mbox{\isa{code{\isacharunderscore}inline}}} instead.
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   510
  \end{warn}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   511
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   512
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   513
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   514
\isamarkupsubsection{Datatypes \label{sec:datatypes}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   515
}
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   516
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   517
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   518
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   519
Conceptually, any datatype is spanned by a set of
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   520
  \emph{constructors} of type \isa{{\isasymtau}\ {\isacharequal}\ {\isasymdots}\ {\isasymRightarrow}\ {\isasymkappa}\ {\isasymalpha}\isactrlisub {\isadigit{1}}\ {\isasymdots}\ {\isasymalpha}\isactrlisub n} where \isa{{\isacharbraceleft}{\isasymalpha}\isactrlisub {\isadigit{1}}{\isacharcomma}\ {\isasymdots}{\isacharcomma}\ {\isasymalpha}\isactrlisub n{\isacharbraceright}} is exactly the set of \emph{all} type variables in
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   521
  \isa{{\isasymtau}}.  The HOL datatype package by default registers any new
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   522
  datatype in the table of datatypes, which may be inspected using the
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   523
  \hyperlink{command.print-codesetup}{\mbox{\isa{\isacommand{print{\isacharunderscore}codesetup}}}} command.
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   524
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   525
  In some cases, it is appropriate to alter or extend this table.  As
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   526
  an example, we will develop an alternative representation of the
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   527
  queue example given in \secref{sec:intro}.  The amortised
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   528
  representation is convenient for generating code but exposes its
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   529
  \qt{implementation} details, which may be cumbersome when proving
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   530
  theorems about it.  Therefore, here is a simple, straightforward
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   531
  representation of queues:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   532
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   533
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   534
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   535
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   536
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   537
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   538
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   539
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   540
\isacommand{datatype}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   541
\ {\isacharprime}a\ queue\ {\isacharequal}\ Queue\ {\isachardoublequoteopen}{\isacharprime}a\ list{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   542
\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   543
\isacommand{definition}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   544
\ empty\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ queue{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   545
\ \ {\isachardoublequoteopen}empty\ {\isacharequal}\ Queue\ {\isacharbrackleft}{\isacharbrackright}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   546
\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   547
\isacommand{primrec}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   548
\ enqueue\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a\ queue\ {\isasymRightarrow}\ {\isacharprime}a\ queue{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   549
\ \ {\isachardoublequoteopen}enqueue\ x\ {\isacharparenleft}Queue\ xs{\isacharparenright}\ {\isacharequal}\ Queue\ {\isacharparenleft}xs\ {\isacharat}\ {\isacharbrackleft}x{\isacharbrackright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   550
\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   551
\isacommand{fun}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   552
\ dequeue\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ queue\ {\isasymRightarrow}\ {\isacharprime}a\ option\ {\isasymtimes}\ {\isacharprime}a\ queue{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   553
\ \ \ \ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}Queue\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}None{\isacharcomma}\ Queue\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   554
\ \ {\isacharbar}\ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}Queue\ {\isacharparenleft}x\ {\isacharhash}\ xs{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}Some\ x{\isacharcomma}\ Queue\ xs{\isacharparenright}{\isachardoublequoteclose}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   555
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   556
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   557
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   558
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   559
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   560
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   561
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   562
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   563
\noindent This we can use directly for proving;  for executing,
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   564
  we provide an alternative characterisation:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   565
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   566
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   567
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   568
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   569
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   570
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   571
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   572
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   573
\isacommand{definition}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   574
\ AQueue\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ list\ {\isasymRightarrow}\ {\isacharprime}a\ queue{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   575
\ \ {\isachardoublequoteopen}AQueue\ xs\ ys\ {\isacharequal}\ Queue\ {\isacharparenleft}ys\ {\isacharat}\ rev\ xs{\isacharparenright}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   576
\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   577
\isacommand{code{\isacharunderscore}datatype}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   578
\ AQueue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   579
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   580
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   581
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   582
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   583
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   584
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   585
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   586
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   587
\noindent Here we define a \qt{constructor} \isa{AQueue} which
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   588
  is defined in terms of \isa{Queue} and interprets its arguments
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   589
  according to what the \emph{content} of an amortised queue is supposed
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   590
  to be.  Equipped with this, we are able to prove the following equations
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   591
  for our primitive queue operations which \qt{implement} the simple
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   592
  queues in an amortised fashion:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   593
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   594
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   595
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   596
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   597
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   598
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   599
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   600
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   601
\isacommand{lemma}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   602
\ empty{\isacharunderscore}AQueue\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   603
\ \ {\isachardoublequoteopen}empty\ {\isacharequal}\ AQueue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbrackleft}{\isacharbrackright}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   604
\ \ \isacommand{unfolding}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   605
\ AQueue{\isacharunderscore}def\ empty{\isacharunderscore}def\ \isacommand{by}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   606
\ simp\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   607
\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   608
\isacommand{lemma}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   609
\ enqueue{\isacharunderscore}AQueue\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   610
\ \ {\isachardoublequoteopen}enqueue\ x\ {\isacharparenleft}AQueue\ xs\ ys{\isacharparenright}\ {\isacharequal}\ AQueue\ {\isacharparenleft}x\ {\isacharhash}\ xs{\isacharparenright}\ ys{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   611
\ \ \isacommand{unfolding}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   612
\ AQueue{\isacharunderscore}def\ \isacommand{by}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   613
\ simp\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   614
\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   615
\isacommand{lemma}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   616
\ dequeue{\isacharunderscore}AQueue\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   617
\ \ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}AQueue\ xs\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   618
\ \ \ \ {\isacharparenleft}if\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ then\ {\isacharparenleft}None{\isacharcomma}\ AQueue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   619
\ \ \ \ else\ dequeue\ {\isacharparenleft}AQueue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharparenleft}rev\ xs{\isacharparenright}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   620
\ \ {\isachardoublequoteopen}dequeue\ {\isacharparenleft}AQueue\ xs\ {\isacharparenleft}y\ {\isacharhash}\ ys{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}Some\ y{\isacharcomma}\ AQueue\ xs\ ys{\isacharparenright}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   621
\ \ \isacommand{unfolding}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   622
\ AQueue{\isacharunderscore}def\ \isacommand{by}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   623
\ simp{\isacharunderscore}all%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   624
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   625
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   626
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   627
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   628
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   629
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   630
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   631
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   632
\noindent For completeness, we provide a substitute for the
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   633
  \isa{case} combinator on queues:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   634
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   635
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   636
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   637
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   638
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   639
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   640
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   641
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   642
\isacommand{lemma}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   643
\ queue{\isacharunderscore}case{\isacharunderscore}AQueue\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   644
\ \ {\isachardoublequoteopen}queue{\isacharunderscore}case\ f\ {\isacharparenleft}AQueue\ xs\ ys{\isacharparenright}\ {\isacharequal}\ f\ {\isacharparenleft}ys\ {\isacharat}\ rev\ xs{\isacharparenright}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   645
\ \ \isacommand{unfolding}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   646
\ AQueue{\isacharunderscore}def\ \isacommand{by}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   647
\ simp%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   648
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   649
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   650
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   651
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   652
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   653
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   654
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   655
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   656
\noindent The resulting code looks as expected:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   657
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   658
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   659
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   660
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   661
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   662
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   663
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   664
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   665
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   666
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   667
\isatypewriter%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   668
\noindent%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   669
\hspace*{0pt}structure Example :~sig\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   670
\hspace*{0pt} ~val foldl :~('a -> 'b -> 'a) -> 'a -> 'b list -> 'a\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   671
\hspace*{0pt} ~val rev :~'a list -> 'a list\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   672
\hspace*{0pt} ~val null :~'a list -> bool\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   673
\hspace*{0pt} ~datatype 'a queue = AQueue of 'a list * 'a list\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   674
\hspace*{0pt} ~val empty :~'a queue\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   675
\hspace*{0pt} ~val dequeue :~'a queue -> 'a option * 'a queue\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   676
\hspace*{0pt} ~val enqueue :~'a -> 'a queue -> 'a queue\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   677
\hspace*{0pt}end = struct\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   678
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   679
\hspace*{0pt}fun foldl f a [] = a\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   680
\hspace*{0pt} ~| foldl f a (x ::~xs) = foldl f (f a x) xs;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   681
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   682
\hspace*{0pt}fun rev xs = foldl (fn xsa => fn x => x ::~xsa) [] xs;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   683
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   684
\hspace*{0pt}fun null [] = true\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   685
\hspace*{0pt} ~| null (x ::~xs) = false;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   686
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   687
\hspace*{0pt}datatype 'a queue = AQueue of 'a list * 'a list;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   688
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   689
\hspace*{0pt}val empty :~'a queue = AQueue ([],~[]);\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   690
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   691
\hspace*{0pt}fun dequeue (AQueue (xs,~y ::~ys)) = (SOME y,~AQueue (xs,~ys))\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   692
\hspace*{0pt} ~| dequeue (AQueue (xs,~[])) =\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   693
\hspace*{0pt} ~~~(if null xs then (NONE,~AQueue ([],~[]))\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   694
\hspace*{0pt} ~~~~~else dequeue (AQueue ([],~rev xs)));\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   695
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   696
\hspace*{0pt}fun enqueue x (AQueue (xs,~ys)) = AQueue (x ::~xs,~ys);\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   697
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   698
\hspace*{0pt}end;~(*struct Example*)%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   699
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   700
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   701
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   702
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   703
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   704
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   705
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   706
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   707
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   708
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   709
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   710
\noindent From this example, it can be glimpsed that using own
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   711
  constructor sets is a little delicate since it changes the set of
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   712
  valid patterns for values of that type.  Without going into much
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   713
  detail, here some practical hints:
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   714
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   715
  \begin{itemize}
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   716
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   717
    \item When changing the constructor set for datatypes, take care
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   718
      to provide alternative equations for the \isa{case} combinator.
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   719
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   720
    \item Values in the target language need not to be normalised --
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   721
      different values in the target language may represent the same
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   722
      value in the logic.
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   723
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   724
    \item Usually, a good methodology to deal with the subtleties of
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   725
      pattern matching is to see the type as an abstract type: provide
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   726
      a set of operations which operate on the concrete representation
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   727
      of the type, and derive further operations by combinations of
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   728
      these primitive ones, without relying on a particular
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   729
      representation.
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   730
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   731
  \end{itemize}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   732
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   733
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   734
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   735
\isamarkupsubsection{Equality%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   736
}
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   737
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   738
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   739
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   740
Surely you have already noticed how equality is treated
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   741
  by the code generator:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   742
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   743
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   744
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   745
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   746
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   747
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   748
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   749
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   750
\isacommand{primrec}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   751
\ 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
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   752
\ \ {\isachardoublequoteopen}collect{\isacharunderscore}duplicates\ xs\ ys\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ xs{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   753
\ \ {\isacharbar}\ {\isachardoublequoteopen}collect{\isacharunderscore}duplicates\ xs\ ys\ {\isacharparenleft}z{\isacharhash}zs{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}if\ z\ {\isasymin}\ set\ xs\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   754
\ \ \ \ \ \ then\ if\ z\ {\isasymin}\ set\ ys\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   755
\ \ \ \ \ \ \ \ then\ collect{\isacharunderscore}duplicates\ xs\ ys\ zs\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   756
\ \ \ \ \ \ \ \ else\ collect{\isacharunderscore}duplicates\ xs\ {\isacharparenleft}z{\isacharhash}ys{\isacharparenright}\ zs\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   757
\ \ \ \ \ \ else\ collect{\isacharunderscore}duplicates\ {\isacharparenleft}z{\isacharhash}xs{\isacharparenright}\ {\isacharparenleft}z{\isacharhash}ys{\isacharparenright}\ zs{\isacharparenright}{\isachardoublequoteclose}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   758
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   759
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   760
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   761
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   762
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   763
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   764
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   765
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   766
\noindent During preprocessing, the membership test is rewritten,
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   767
  resulting in \isa{List{\isachardot}member}, which itself
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   768
  performs an explicit equality check.%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   769
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   770
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   771
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   772
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   773
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   774
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   775
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   776
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   777
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   778
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   779
\isatypewriter%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   780
\noindent%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   781
\hspace*{0pt}structure Example :~sig\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   782
\hspace*{0pt} ~type 'a eq\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   783
\hspace*{0pt} ~val eq :~'a eq -> 'a -> 'a -> bool\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   784
\hspace*{0pt} ~val eqa :~'a eq -> 'a -> 'a -> bool\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   785
\hspace*{0pt} ~val member :~'a eq -> 'a list -> 'a -> bool\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   786
\hspace*{0pt} ~val collect{\char95}duplicates :\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   787
\hspace*{0pt} ~~~'a eq -> 'a list -> 'a list -> 'a list -> 'a list\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   788
\hspace*{0pt}end = struct\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   789
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   790
\hspace*{0pt}type 'a eq = {\char123}eq :~'a -> 'a -> bool{\char125};\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   791
\hspace*{0pt}val eq = {\char35}eq :~'a eq -> 'a -> 'a -> bool;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   792
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   793
\hspace*{0pt}fun eqa A{\char95}~a b = eq A{\char95}~a b;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   794
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   795
\hspace*{0pt}fun member A{\char95}~[] y = false\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   796
\hspace*{0pt} ~| member A{\char95}~(x ::~xs) y = eqa A{\char95}~x y orelse member A{\char95}~xs y;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   797
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   798
\hspace*{0pt}fun collect{\char95}duplicates A{\char95}~xs ys [] = xs\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   799
\hspace*{0pt} ~| collect{\char95}duplicates A{\char95}~xs ys (z ::~zs) =\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   800
\hspace*{0pt} ~~~(if member A{\char95}~xs z\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   801
\hspace*{0pt} ~~~~~then (if member A{\char95}~ys z then collect{\char95}duplicates A{\char95}~xs ys zs\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   802
\hspace*{0pt} ~~~~~~~~~~~~else collect{\char95}duplicates A{\char95}~xs (z ::~ys) zs)\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   803
\hspace*{0pt} ~~~~~else collect{\char95}duplicates A{\char95}~(z ::~xs) (z ::~ys) zs);\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   804
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   805
\hspace*{0pt}end;~(*struct Example*)%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   806
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   807
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   808
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   809
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   810
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   811
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   812
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   813
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   814
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   815
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   816
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   817
\noindent Obviously, polymorphic equality is implemented the Haskell
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   818
  way using a type class.  How is this achieved?  HOL introduces
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   819
  an explicit class \isa{eq} with a corresponding operation
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   820
  \isa{eq{\isacharunderscore}class{\isachardot}eq} such that \isa{eq{\isacharunderscore}class{\isachardot}eq\ {\isacharequal}\ op\ {\isacharequal}}.
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   821
  The preprocessing framework does the rest by propagating the
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   822
  \isa{eq} constraints through all dependent code equations.
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   823
  For datatypes, instances of \isa{eq} are implicitly derived
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   824
  when possible.  For other types, you may instantiate \isa{eq}
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   825
  manually like any other type class.%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   826
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   827
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   828
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   829
\isamarkupsubsection{Explicit partiality%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   830
}
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   831
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   832
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   833
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   834
Partiality usually enters the game by partial patterns, as
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   835
  in the following example, again for amortised queues:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   836
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   837
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   838
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   839
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   840
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   841
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   842
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   843
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   844
\isacommand{definition}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   845
\ strict{\isacharunderscore}dequeue\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ queue\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymtimes}\ {\isacharprime}a\ queue{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   846
\ \ {\isachardoublequoteopen}strict{\isacharunderscore}dequeue\ q\ {\isacharequal}\ {\isacharparenleft}case\ dequeue\ q\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   847
\ \ \ \ of\ {\isacharparenleft}Some\ x{\isacharcomma}\ q{\isacharprime}{\isacharparenright}\ {\isasymRightarrow}\ {\isacharparenleft}x{\isacharcomma}\ q{\isacharprime}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   848
\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   849
\isacommand{lemma}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   850
\ strict{\isacharunderscore}dequeue{\isacharunderscore}AQueue\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   851
\ \ {\isachardoublequoteopen}strict{\isacharunderscore}dequeue\ {\isacharparenleft}AQueue\ xs\ {\isacharparenleft}y\ {\isacharhash}\ ys{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}y{\isacharcomma}\ AQueue\ xs\ ys{\isacharparenright}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   852
\ \ {\isachardoublequoteopen}strict{\isacharunderscore}dequeue\ {\isacharparenleft}AQueue\ xs\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   853
\ \ \ \ {\isacharparenleft}case\ rev\ xs\ of\ y\ {\isacharhash}\ ys\ {\isasymRightarrow}\ {\isacharparenleft}y{\isacharcomma}\ AQueue\ {\isacharbrackleft}{\isacharbrackright}\ ys{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   854
\ \ \isacommand{by}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   855
\ {\isacharparenleft}simp{\isacharunderscore}all\ add{\isacharcolon}\ strict{\isacharunderscore}dequeue{\isacharunderscore}def\ dequeue{\isacharunderscore}AQueue\ split{\isacharcolon}\ list{\isachardot}splits{\isacharparenright}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   856
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   857
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   858
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   859
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   860
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   861
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   862
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   863
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   864
\noindent In the corresponding code, there is no equation
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   865
  for the pattern \isa{AQueue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbrackleft}{\isacharbrackright}}:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   866
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   867
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   868
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   869
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   870
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   871
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   872
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   873
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   874
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   875
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   876
\isatypewriter%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   877
\noindent%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   878
\hspace*{0pt}strict{\char95}dequeue ::~forall a.~Queue a -> (a,~Queue a);\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   879
\hspace*{0pt}strict{\char95}dequeue (AQueue xs []) =\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   880
\hspace*{0pt} ~let {\char123}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   881
\hspace*{0pt} ~~~(y :~ys) = reverse xs;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   882
\hspace*{0pt} ~{\char125}~in (y,~AQueue [] ys);\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   883
\hspace*{0pt}strict{\char95}dequeue (AQueue xs (y :~ys)) = (y,~AQueue xs ys);%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   884
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   885
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   886
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   887
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   888
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   889
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   890
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   891
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   892
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   893
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   894
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   895
\noindent In some cases it is desirable to have this
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   896
  pseudo-\qt{partiality} more explicitly, e.g.~as follows:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   897
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   898
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   899
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   900
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   901
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   902
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   903
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   904
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   905
\isacommand{axiomatization}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   906
\ empty{\isacharunderscore}queue\ {\isacharcolon}{\isacharcolon}\ {\isacharprime}a\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   907
\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   908
\isacommand{definition}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   909
\ strict{\isacharunderscore}dequeue{\isacharprime}\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ queue\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymtimes}\ {\isacharprime}a\ queue{\isachardoublequoteclose}\ \isakeyword{where}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   910
\ \ {\isachardoublequoteopen}strict{\isacharunderscore}dequeue{\isacharprime}\ q\ {\isacharequal}\ {\isacharparenleft}case\ dequeue\ q\ of\ {\isacharparenleft}Some\ x{\isacharcomma}\ q{\isacharprime}{\isacharparenright}\ {\isasymRightarrow}\ {\isacharparenleft}x{\isacharcomma}\ q{\isacharprime}{\isacharparenright}\ {\isacharbar}\ {\isacharunderscore}\ {\isasymRightarrow}\ empty{\isacharunderscore}queue{\isacharparenright}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   911
\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   912
\isacommand{lemma}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   913
\ strict{\isacharunderscore}dequeue{\isacharprime}{\isacharunderscore}AQueue\ {\isacharbrackleft}code{\isacharbrackright}{\isacharcolon}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   914
\ \ {\isachardoublequoteopen}strict{\isacharunderscore}dequeue{\isacharprime}\ {\isacharparenleft}AQueue\ xs\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}if\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ then\ empty{\isacharunderscore}queue\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   915
\ \ \ \ \ else\ strict{\isacharunderscore}dequeue{\isacharprime}\ {\isacharparenleft}AQueue\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharparenleft}rev\ xs{\isacharparenright}{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   916
\ \ {\isachardoublequoteopen}strict{\isacharunderscore}dequeue{\isacharprime}\ {\isacharparenleft}AQueue\ xs\ {\isacharparenleft}y\ {\isacharhash}\ ys{\isacharparenright}{\isacharparenright}\ {\isacharequal}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   917
\ \ \ \ \ {\isacharparenleft}y{\isacharcomma}\ AQueue\ xs\ ys{\isacharparenright}{\isachardoublequoteclose}\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   918
\ \ \isacommand{by}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   919
\ {\isacharparenleft}simp{\isacharunderscore}all\ add{\isacharcolon}\ strict{\isacharunderscore}dequeue{\isacharprime}{\isacharunderscore}def\ dequeue{\isacharunderscore}AQueue\ split{\isacharcolon}\ list{\isachardot}splits{\isacharparenright}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   920
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   921
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   922
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   923
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   924
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   925
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   926
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   927
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   928
Observe that on the right hand side of the definition of \isa{strict{\isacharunderscore}dequeue{\isacharprime}}, the unspecified constant \isa{empty{\isacharunderscore}queue} occurs.
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   929
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   930
  Normally, if constants without any code equations occur in a
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   931
  program, the code generator complains (since in most cases this is
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   932
  indeed an error).  But such constants can also be thought
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   933
  of as function definitions which always fail,
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   934
  since there is never a successful pattern match on the left hand
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   935
  side.  In order to categorise a constant into that category
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   936
  explicitly, use \hyperlink{command.code-abort}{\mbox{\isa{\isacommand{code{\isacharunderscore}abort}}}}:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   937
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   938
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   939
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   940
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   941
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   942
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   943
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   944
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   945
\isacommand{code{\isacharunderscore}abort}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   946
\ empty{\isacharunderscore}queue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   947
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   948
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   949
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   950
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   951
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   952
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   953
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   954
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   955
\noindent Then the code generator will just insert an error or
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   956
  exception at the appropriate position:%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   957
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   958
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   959
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   960
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   961
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   962
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   963
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   964
\isatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   965
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   966
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   967
\isatypewriter%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   968
\noindent%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   969
\hspace*{0pt}empty{\char95}queue ::~forall a.~a;\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   970
\hspace*{0pt}empty{\char95}queue = error {\char34}empty{\char95}queue{\char34};\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   971
\hspace*{0pt}\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   972
\hspace*{0pt}strict{\char95}dequeue ::~forall a.~Queue a -> (a,~Queue a);\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   973
\hspace*{0pt}strict{\char95}dequeue (AQueue xs (y :~ys)) = (y,~AQueue xs ys);\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   974
\hspace*{0pt}strict{\char95}dequeue (AQueue xs []) =\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   975
\hspace*{0pt} ~(if null xs then empty{\char95}queue\\
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   976
\hspace*{0pt} ~~~else strict{\char95}dequeue (AQueue [] (reverse xs)));%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   977
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   978
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   979
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   980
\endisatagquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   981
{\isafoldquote}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   982
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   983
\isadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   984
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   985
\endisadelimquote
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   986
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   987
\begin{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   988
\noindent This feature however is rarely needed in practice.
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   989
  Note also that the \isa{HOL} default setup already declares
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   990
  \isa{undefined} as \hyperlink{command.code-abort}{\mbox{\isa{\isacommand{code{\isacharunderscore}abort}}}}, which is most
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   991
  likely to be used in such situations.%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   992
\end{isamarkuptext}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   993
\isamarkuptrue%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   994
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   995
\isadelimtheory
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   996
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   997
\endisadelimtheory
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   998
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
   999
\isatagtheory
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
  1000
\isacommand{end}\isamarkupfalse%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
  1001
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
  1002
\endisatagtheory
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
  1003
{\isafoldtheory}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
  1004
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
  1005
\isadelimtheory
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
  1006
%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
  1007
\endisadelimtheory
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
  1008
\isanewline
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
  1009
\end{isabellebody}%
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
  1010
%%% Local Variables:
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
  1011
%%% mode: latex
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
  1012
%%% TeX-master: "root"
bbb02b67caac sketch of new outline
haftmann
parents:
diff changeset
  1013
%%% End: