doc-src/IsarRef/Thy/document/HOL_Specific.tex
author wenzelm
Tue, 03 May 2011 15:29:49 +0200
changeset 43523 c963499143e5
parent 43522 e3fdb7c96be5
child 43535 2080fe35abea
permissions -rw-r--r--
reactivated codegen example based on Lambda.thy;
     1 %
     2 \begin{isabellebody}%
     3 \def\isabellecontext{HOL{\isaliteral{5F}{\isacharunderscore}}Specific}%
     4 %
     5 \isadelimtheory
     6 %
     7 \endisadelimtheory
     8 %
     9 \isatagtheory
    10 \isacommand{theory}\isamarkupfalse%
    11 \ HOL{\isaliteral{5F}{\isacharunderscore}}Specific\isanewline
    12 \isakeyword{imports}\ Base\ Main\isanewline
    13 \isakeyword{begin}%
    14 \endisatagtheory
    15 {\isafoldtheory}%
    16 %
    17 \isadelimtheory
    18 %
    19 \endisadelimtheory
    20 %
    21 \isamarkupchapter{Isabelle/HOL \label{ch:hol}%
    22 }
    23 \isamarkuptrue%
    24 %
    25 \isamarkupsection{Typedef axiomatization \label{sec:hol-typedef}%
    26 }
    27 \isamarkuptrue%
    28 %
    29 \begin{isamarkuptext}%
    30 \begin{matharray}{rcl}
    31     \indexdef{HOL}{command}{typedef}\hypertarget{command.HOL.typedef}{\hyperlink{command.HOL.typedef}{\mbox{\isa{\isacommand{typedef}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}local{\isaliteral{5F}{\isacharunderscore}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ proof{\isaliteral{28}{\isacharparenleft}}prove{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}} \\
    32   \end{matharray}
    33 
    34   \begin{railoutput}
    35 \rail@begin{2}{\isa{}}
    36 \rail@term{\hyperlink{command.HOL.typedef}{\mbox{\isa{\isacommand{typedef}}}}}[]
    37 \rail@bar
    38 \rail@nextbar{1}
    39 \rail@nont{\isa{altname}}[]
    40 \rail@endbar
    41 \rail@nont{\isa{abstype}}[]
    42 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
    43 \rail@nont{\isa{repset}}[]
    44 \rail@end
    45 \rail@begin{3}{\isa{altname}}
    46 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
    47 \rail@bar
    48 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
    49 \rail@nextbar{1}
    50 \rail@term{\isa{\isakeyword{open}}}[]
    51 \rail@nextbar{2}
    52 \rail@term{\isa{\isakeyword{open}}}[]
    53 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
    54 \rail@endbar
    55 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
    56 \rail@end
    57 \rail@begin{2}{\isa{abstype}}
    58 \rail@nont{\hyperlink{syntax.typespecsorts}{\mbox{\isa{typespecsorts}}}}[]
    59 \rail@bar
    60 \rail@nextbar{1}
    61 \rail@nont{\hyperlink{syntax.mixfix}{\mbox{\isa{mixfix}}}}[]
    62 \rail@endbar
    63 \rail@end
    64 \rail@begin{2}{\isa{repset}}
    65 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
    66 \rail@bar
    67 \rail@nextbar{1}
    68 \rail@term{\isa{\isakeyword{morphisms}}}[]
    69 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
    70 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
    71 \rail@endbar
    72 \rail@end
    73 \end{railoutput}
    74 
    75 
    76   \begin{description}
    77 
    78   \item \hyperlink{command.HOL.typedef}{\mbox{\isa{\isacommand{typedef}}}}~\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E7375623E}{}\isactrlsub n{\isaliteral{29}{\isacharparenright}}\ t\ {\isaliteral{3D}{\isacharequal}}\ A{\isaliteral{22}{\isachardoublequote}}}
    79   axiomatizes a Gordon/HOL-style type definition in the background
    80   theory of the current context, depending on a non-emptiness result
    81   of the set \isa{A} (which needs to be proven interactively).
    82 
    83   The raw type may not depend on parameters or assumptions of the
    84   context --- this is logically impossible in Isabelle/HOL --- but the
    85   non-emptiness property can be local, potentially resulting in
    86   multiple interpretations in target contexts.  Thus the established
    87   bijection between the representing set \isa{A} and the new type
    88   \isa{t} may semantically depend on local assumptions.
    89 
    90   By default, \hyperlink{command.HOL.typedef}{\mbox{\isa{\isacommand{typedef}}}} defines both a type \isa{t}
    91   and a set (term constant) of the same name, unless an alternative
    92   base name is given in parentheses, or the ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}open{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}}''
    93   declaration is used to suppress a separate constant definition
    94   altogether.  The injection from type to set is called \isa{Rep{\isaliteral{5F}{\isacharunderscore}}t},
    95   its inverse \isa{Abs{\isaliteral{5F}{\isacharunderscore}}t} --- this may be changed via an explicit
    96   \hyperlink{keyword.HOL.morphisms}{\mbox{\isa{\isakeyword{morphisms}}}} declaration.
    97 
    98   Theorems \isa{Rep{\isaliteral{5F}{\isacharunderscore}}t}, \isa{Rep{\isaliteral{5F}{\isacharunderscore}}t{\isaliteral{5F}{\isacharunderscore}}inverse}, and \isa{Abs{\isaliteral{5F}{\isacharunderscore}}t{\isaliteral{5F}{\isacharunderscore}}inverse} provide the most basic characterization as a
    99   corresponding injection/surjection pair (in both directions).  Rules
   100   \isa{Rep{\isaliteral{5F}{\isacharunderscore}}t{\isaliteral{5F}{\isacharunderscore}}inject} and \isa{Abs{\isaliteral{5F}{\isacharunderscore}}t{\isaliteral{5F}{\isacharunderscore}}inject} provide a slightly
   101   more convenient view on the injectivity part, suitable for automated
   102   proof tools (e.g.\ in \hyperlink{attribute.simp}{\mbox{\isa{simp}}} or \hyperlink{attribute.iff}{\mbox{\isa{iff}}}
   103   declarations).  Rules \isa{Rep{\isaliteral{5F}{\isacharunderscore}}t{\isaliteral{5F}{\isacharunderscore}}cases}/\isa{Rep{\isaliteral{5F}{\isacharunderscore}}t{\isaliteral{5F}{\isacharunderscore}}induct}, and
   104   \isa{Abs{\isaliteral{5F}{\isacharunderscore}}t{\isaliteral{5F}{\isacharunderscore}}cases}/\isa{Abs{\isaliteral{5F}{\isacharunderscore}}t{\isaliteral{5F}{\isacharunderscore}}induct} provide alternative views
   105   on surjectivity; these are already declared as set or type rules for
   106   the generic \hyperlink{method.cases}{\mbox{\isa{cases}}} and \hyperlink{method.induct}{\mbox{\isa{induct}}} methods.
   107 
   108   An alternative name for the set definition (and other derived
   109   entities) may be specified in parentheses; the default is to use
   110   \isa{t} as indicated before.
   111 
   112   \end{description}%
   113 \end{isamarkuptext}%
   114 \isamarkuptrue%
   115 %
   116 \isamarkupsection{Adhoc tuples%
   117 }
   118 \isamarkuptrue%
   119 %
   120 \begin{isamarkuptext}%
   121 \begin{matharray}{rcl}
   122     \indexdef{HOL}{attribute}{split\_format}\hypertarget{attribute.HOL.split-format}{\hyperlink{attribute.HOL.split-format}{\mbox{\isa{split{\isaliteral{5F}{\isacharunderscore}}format}}}}\isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7375703E}{}\isactrlsup {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}} & : & \isa{attribute} \\
   123   \end{matharray}
   124 
   125   \begin{railoutput}
   126 \rail@begin{2}{\isa{}}
   127 \rail@term{\hyperlink{attribute.HOL.split-format}{\mbox{\isa{split{\isaliteral{5F}{\isacharunderscore}}format}}}}[]
   128 \rail@bar
   129 \rail@nextbar{1}
   130 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
   131 \rail@term{\isa{complete}}[]
   132 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
   133 \rail@endbar
   134 \rail@end
   135 \end{railoutput}
   136 
   137 
   138   \begin{description}
   139 
   140   \item \hyperlink{attribute.HOL.split-format}{\mbox{\isa{split{\isaliteral{5F}{\isacharunderscore}}format}}}\ \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}complete{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}} causes
   141   arguments in function applications to be represented canonically
   142   according to their tuple type structure.
   143 
   144   Note that this operation tends to invent funny names for new local
   145   parameters introduced.
   146 
   147   \end{description}%
   148 \end{isamarkuptext}%
   149 \isamarkuptrue%
   150 %
   151 \isamarkupsection{Records \label{sec:hol-record}%
   152 }
   153 \isamarkuptrue%
   154 %
   155 \begin{isamarkuptext}%
   156 In principle, records merely generalize the concept of tuples, where
   157   components may be addressed by labels instead of just position.  The
   158   logical infrastructure of records in Isabelle/HOL is slightly more
   159   advanced, though, supporting truly extensible record schemes.  This
   160   admits operations that are polymorphic with respect to record
   161   extension, yielding ``object-oriented'' effects like (single)
   162   inheritance.  See also \cite{NaraschewskiW-TPHOLs98} for more
   163   details on object-oriented verification and record subtyping in HOL.%
   164 \end{isamarkuptext}%
   165 \isamarkuptrue%
   166 %
   167 \isamarkupsubsection{Basic concepts%
   168 }
   169 \isamarkuptrue%
   170 %
   171 \begin{isamarkuptext}%
   172 Isabelle/HOL supports both \emph{fixed} and \emph{schematic} records
   173   at the level of terms and types.  The notation is as follows:
   174 
   175   \begin{center}
   176   \begin{tabular}{l|l|l}
   177     & record terms & record types \\ \hline
   178     fixed & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}x\ {\isaliteral{3D}{\isacharequal}}\ a{\isaliteral{2C}{\isacharcomma}}\ y\ {\isaliteral{3D}{\isacharequal}}\ b{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}x\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ A{\isaliteral{2C}{\isacharcomma}}\ y\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ B{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}} \\
   179     schematic & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}x\ {\isaliteral{3D}{\isacharequal}}\ a{\isaliteral{2C}{\isacharcomma}}\ y\ {\isaliteral{3D}{\isacharequal}}\ b{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{3D}{\isacharequal}}\ m{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}} &
   180       \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}x\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ A{\isaliteral{2C}{\isacharcomma}}\ y\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ B{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ M{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}} \\
   181   \end{tabular}
   182   \end{center}
   183 
   184   \noindent The ASCII representation of \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}x\ {\isaliteral{3D}{\isacharequal}}\ a{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}} is \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{7C}{\isacharbar}}\ x\ {\isaliteral{3D}{\isacharequal}}\ a\ {\isaliteral{7C}{\isacharbar}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}}.
   185 
   186   A fixed record \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}x\ {\isaliteral{3D}{\isacharequal}}\ a{\isaliteral{2C}{\isacharcomma}}\ y\ {\isaliteral{3D}{\isacharequal}}\ b{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}} has field \isa{x} of value
   187   \isa{a} and field \isa{y} of value \isa{b}.  The corresponding
   188   type is \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}x\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ A{\isaliteral{2C}{\isacharcomma}}\ y\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ B{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}}, assuming that \isa{{\isaliteral{22}{\isachardoublequote}}a\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ A{\isaliteral{22}{\isachardoublequote}}}
   189   and \isa{{\isaliteral{22}{\isachardoublequote}}b\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ B{\isaliteral{22}{\isachardoublequote}}}.
   190 
   191   A record scheme like \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}x\ {\isaliteral{3D}{\isacharequal}}\ a{\isaliteral{2C}{\isacharcomma}}\ y\ {\isaliteral{3D}{\isacharequal}}\ b{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{3D}{\isacharequal}}\ m{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}} contains fields
   192   \isa{x} and \isa{y} as before, but also possibly further fields
   193   as indicated by the ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{22}{\isachardoublequote}}}'' notation (which is actually part
   194   of the syntax).  The improper field ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{22}{\isachardoublequote}}}'' of a record
   195   scheme is called the \emph{more part}.  Logically it is just a free
   196   variable, which is occasionally referred to as ``row variable'' in
   197   the literature.  The more part of a record scheme may be
   198   instantiated by zero or more further components.  For example, the
   199   previous scheme may get instantiated to \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}x\ {\isaliteral{3D}{\isacharequal}}\ a{\isaliteral{2C}{\isacharcomma}}\ y\ {\isaliteral{3D}{\isacharequal}}\ b{\isaliteral{2C}{\isacharcomma}}\ z\ {\isaliteral{3D}{\isacharequal}}\ c{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{3D}{\isacharequal}}\ m{\isaliteral{27}{\isacharprime}}{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}}, where \isa{m{\isaliteral{27}{\isacharprime}}} refers to a different more part.
   200   Fixed records are special instances of record schemes, where
   201   ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{22}{\isachardoublequote}}}'' is properly terminated by the \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ unit{\isaliteral{22}{\isachardoublequote}}}
   202   element.  In fact, \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}x\ {\isaliteral{3D}{\isacharequal}}\ a{\isaliteral{2C}{\isacharcomma}}\ y\ {\isaliteral{3D}{\isacharequal}}\ b{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}} is just an abbreviation
   203   for \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}x\ {\isaliteral{3D}{\isacharequal}}\ a{\isaliteral{2C}{\isacharcomma}}\ y\ {\isaliteral{3D}{\isacharequal}}\ b{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}}.
   204 
   205   \medskip Two key observations make extensible records in a simply
   206   typed language like HOL work out:
   207 
   208   \begin{enumerate}
   209 
   210   \item the more part is internalized, as a free term or type
   211   variable,
   212 
   213   \item field names are externalized, they cannot be accessed within
   214   the logic as first-class values.
   215 
   216   \end{enumerate}
   217 
   218   \medskip In Isabelle/HOL record types have to be defined explicitly,
   219   fixing their field names and types, and their (optional) parent
   220   record.  Afterwards, records may be formed using above syntax, while
   221   obeying the canonical order of fields as given by their declaration.
   222   The record package provides several standard operations like
   223   selectors and updates.  The common setup for various generic proof
   224   tools enable succinct reasoning patterns.  See also the Isabelle/HOL
   225   tutorial \cite{isabelle-hol-book} for further instructions on using
   226   records in practice.%
   227 \end{isamarkuptext}%
   228 \isamarkuptrue%
   229 %
   230 \isamarkupsubsection{Record specifications%
   231 }
   232 \isamarkuptrue%
   233 %
   234 \begin{isamarkuptext}%
   235 \begin{matharray}{rcl}
   236     \indexdef{HOL}{command}{record}\hypertarget{command.HOL.record}{\hyperlink{command.HOL.record}{\mbox{\isa{\isacommand{record}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}} \\
   237   \end{matharray}
   238 
   239   \begin{railoutput}
   240 \rail@begin{2}{\isa{}}
   241 \rail@term{\hyperlink{command.HOL.record}{\mbox{\isa{\isacommand{record}}}}}[]
   242 \rail@nont{\hyperlink{syntax.typespecsorts}{\mbox{\isa{typespecsorts}}}}[]
   243 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
   244 \rail@bar
   245 \rail@nextbar{1}
   246 \rail@nont{\hyperlink{syntax.type}{\mbox{\isa{type}}}}[]
   247 \rail@term{\isa{{\isaliteral{2B}{\isacharplus}}}}[]
   248 \rail@endbar
   249 \rail@plus
   250 \rail@nont{\hyperlink{syntax.constdecl}{\mbox{\isa{constdecl}}}}[]
   251 \rail@nextplus{1}
   252 \rail@endplus
   253 \rail@end
   254 \end{railoutput}
   255 
   256 
   257   \begin{description}
   258 
   259   \item \hyperlink{command.HOL.record}{\mbox{\isa{\isacommand{record}}}}~\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E7375623E}{}\isactrlsub m{\isaliteral{29}{\isacharparenright}}\ t\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{5C3C7461753E}{\isasymtau}}\ {\isaliteral{2B}{\isacharplus}}\ c\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ c\isaliteral{5C3C5E7375623E}{}\isactrlsub n\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub n{\isaliteral{22}{\isachardoublequote}}} defines extensible record type \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E7375623E}{}\isactrlsub m{\isaliteral{29}{\isacharparenright}}\ t{\isaliteral{22}{\isachardoublequote}}},
   260   derived from the optional parent record \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C7461753E}{\isasymtau}}{\isaliteral{22}{\isachardoublequote}}} by adding new
   261   field components \isa{{\isaliteral{22}{\isachardoublequote}}c\isaliteral{5C3C5E7375623E}{}\isactrlsub i\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub i{\isaliteral{22}{\isachardoublequote}}} etc.
   262 
   263   The type variables of \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C7461753E}{\isasymtau}}{\isaliteral{22}{\isachardoublequote}}} and \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub i{\isaliteral{22}{\isachardoublequote}}} need to be
   264   covered by the (distinct) parameters \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E7375623E}{}\isactrlsub m{\isaliteral{22}{\isachardoublequote}}}.  Type constructor \isa{t} has to be new, while \isa{{\isaliteral{5C3C7461753E}{\isasymtau}}} needs to specify an instance of an existing record type.  At
   265   least one new field \isa{{\isaliteral{22}{\isachardoublequote}}c\isaliteral{5C3C5E7375623E}{}\isactrlsub i{\isaliteral{22}{\isachardoublequote}}} has to be specified.
   266   Basically, field names need to belong to a unique record.  This is
   267   not a real restriction in practice, since fields are qualified by
   268   the record name internally.
   269 
   270   The parent record specification \isa{{\isaliteral{5C3C7461753E}{\isasymtau}}} is optional; if omitted
   271   \isa{t} becomes a root record.  The hierarchy of all records
   272   declared within a theory context forms a forest structure, i.e.\ a
   273   set of trees starting with a root record each.  There is no way to
   274   merge multiple parent records!
   275 
   276   For convenience, \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E7375623E}{}\isactrlsub m{\isaliteral{29}{\isacharparenright}}\ t{\isaliteral{22}{\isachardoublequote}}} is made a
   277   type abbreviation for the fixed record type \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}c\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{2C}{\isacharcomma}}\ c\isaliteral{5C3C5E7375623E}{}\isactrlsub n\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub n{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}}, likewise is \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E7375623E}{}\isactrlsub m{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C7A6574613E}{\isasymzeta}}{\isaliteral{29}{\isacharparenright}}\ t{\isaliteral{5F}{\isacharunderscore}}scheme{\isaliteral{22}{\isachardoublequote}}} made an abbreviation for
   278   \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}c\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{2C}{\isacharcomma}}\ c\isaliteral{5C3C5E7375623E}{}\isactrlsub n\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub n{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C7A6574613E}{\isasymzeta}}{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}}.
   279 
   280   \end{description}%
   281 \end{isamarkuptext}%
   282 \isamarkuptrue%
   283 %
   284 \isamarkupsubsection{Record operations%
   285 }
   286 \isamarkuptrue%
   287 %
   288 \begin{isamarkuptext}%
   289 Any record definition of the form presented above produces certain
   290   standard operations.  Selectors and updates are provided for any
   291   field, including the improper one ``\isa{more}''.  There are also
   292   cumulative record constructor functions.  To simplify the
   293   presentation below, we assume for now that \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E7375623E}{}\isactrlsub m{\isaliteral{29}{\isacharparenright}}\ t{\isaliteral{22}{\isachardoublequote}}} is a root record with fields \isa{{\isaliteral{22}{\isachardoublequote}}c\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{2C}{\isacharcomma}}\ c\isaliteral{5C3C5E7375623E}{}\isactrlsub n\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub n{\isaliteral{22}{\isachardoublequote}}}.
   294 
   295   \medskip \textbf{Selectors} and \textbf{updates} are available for
   296   any field (including ``\isa{more}''):
   297 
   298   \begin{matharray}{lll}
   299     \isa{{\isaliteral{22}{\isachardoublequote}}c\isaliteral{5C3C5E7375623E}{}\isactrlsub i{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}\isaliteral{5C3C5E7665633E}{}\isactrlvec c\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C7369676D613E}{\isasymsigma}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C7A6574613E}{\isasymzeta}}{\isaliteral{5C3C72706172723E}{\isasymrparr}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub i{\isaliteral{22}{\isachardoublequote}}} \\
   300     \isa{{\isaliteral{22}{\isachardoublequote}}c\isaliteral{5C3C5E7375623E}{}\isactrlsub i{\isaliteral{5F}{\isacharunderscore}}update{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub i\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C6C706172723E}{\isasymlparr}}\isaliteral{5C3C5E7665633E}{}\isactrlvec c\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C7369676D613E}{\isasymsigma}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C7A6574613E}{\isasymzeta}}{\isaliteral{5C3C72706172723E}{\isasymrparr}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C6C706172723E}{\isasymlparr}}\isaliteral{5C3C5E7665633E}{}\isactrlvec c\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C7369676D613E}{\isasymsigma}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C7A6574613E}{\isasymzeta}}{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}} \\
   301   \end{matharray}
   302 
   303   There is special syntax for application of updates: \isa{{\isaliteral{22}{\isachardoublequote}}r{\isaliteral{5C3C6C706172723E}{\isasymlparr}}x\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3D}{\isacharequal}}\ a{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}} abbreviates term \isa{{\isaliteral{22}{\isachardoublequote}}x{\isaliteral{5F}{\isacharunderscore}}update\ a\ r{\isaliteral{22}{\isachardoublequote}}}.  Further notation for
   304   repeated updates is also available: \isa{{\isaliteral{22}{\isachardoublequote}}r{\isaliteral{5C3C6C706172723E}{\isasymlparr}}x\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3D}{\isacharequal}}\ a{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}y\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3D}{\isacharequal}}\ b{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}z\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3D}{\isacharequal}}\ c{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}} may be written \isa{{\isaliteral{22}{\isachardoublequote}}r{\isaliteral{5C3C6C706172723E}{\isasymlparr}}x\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3D}{\isacharequal}}\ a{\isaliteral{2C}{\isacharcomma}}\ y\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3D}{\isacharequal}}\ b{\isaliteral{2C}{\isacharcomma}}\ z\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3D}{\isacharequal}}\ c{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}}.  Note that
   305   because of postfix notation the order of fields shown here is
   306   reverse than in the actual term.  Since repeated updates are just
   307   function applications, fields may be freely permuted in \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}x\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3D}{\isacharequal}}\ a{\isaliteral{2C}{\isacharcomma}}\ y\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3D}{\isacharequal}}\ b{\isaliteral{2C}{\isacharcomma}}\ z\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3D}{\isacharequal}}\ c{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}}, as far as logical equality is concerned.
   308   Thus commutativity of independent updates can be proven within the
   309   logic for any two fields, but not as a general theorem.
   310 
   311   \medskip The \textbf{make} operation provides a cumulative record
   312   constructor function:
   313 
   314   \begin{matharray}{lll}
   315     \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}make{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub n\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C6C706172723E}{\isasymlparr}}\isaliteral{5C3C5E7665633E}{}\isactrlvec c\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C7369676D613E}{\isasymsigma}}{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}} \\
   316   \end{matharray}
   317 
   318   \medskip We now reconsider the case of non-root records, which are
   319   derived of some parent.  In general, the latter may depend on
   320   another parent as well, resulting in a list of \emph{ancestor
   321   records}.  Appending the lists of fields of all ancestors results in
   322   a certain field prefix.  The record package automatically takes care
   323   of this by lifting operations over this context of ancestor fields.
   324   Assuming that \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E7375623E}{}\isactrlsub m{\isaliteral{29}{\isacharparenright}}\ t{\isaliteral{22}{\isachardoublequote}}} has ancestor
   325   fields \isa{{\isaliteral{22}{\isachardoublequote}}b\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C72686F3E}{\isasymrho}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{2C}{\isacharcomma}}\ b\isaliteral{5C3C5E7375623E}{}\isactrlsub k\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C72686F3E}{\isasymrho}}\isaliteral{5C3C5E7375623E}{}\isactrlsub k{\isaliteral{22}{\isachardoublequote}}},
   326   the above record operations will get the following types:
   327 
   328   \medskip
   329   \begin{tabular}{lll}
   330     \isa{{\isaliteral{22}{\isachardoublequote}}c\isaliteral{5C3C5E7375623E}{}\isactrlsub i{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}\isaliteral{5C3C5E7665633E}{}\isactrlvec b\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C72686F3E}{\isasymrho}}{\isaliteral{2C}{\isacharcomma}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec c\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C7369676D613E}{\isasymsigma}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C7A6574613E}{\isasymzeta}}{\isaliteral{5C3C72706172723E}{\isasymrparr}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub i{\isaliteral{22}{\isachardoublequote}}} \\
   331     \isa{{\isaliteral{22}{\isachardoublequote}}c\isaliteral{5C3C5E7375623E}{}\isactrlsub i{\isaliteral{5F}{\isacharunderscore}}update{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub i\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C6C706172723E}{\isasymlparr}}\isaliteral{5C3C5E7665633E}{}\isactrlvec b\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C72686F3E}{\isasymrho}}{\isaliteral{2C}{\isacharcomma}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec c\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C7369676D613E}{\isasymsigma}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C7A6574613E}{\isasymzeta}}{\isaliteral{5C3C72706172723E}{\isasymrparr}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C6C706172723E}{\isasymlparr}}\isaliteral{5C3C5E7665633E}{}\isactrlvec b\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C72686F3E}{\isasymrho}}{\isaliteral{2C}{\isacharcomma}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec c\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C7369676D613E}{\isasymsigma}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C7A6574613E}{\isasymzeta}}{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}} \\
   332     \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}make{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C72686F3E}{\isasymrho}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{5C3C72686F3E}{\isasymrho}}\isaliteral{5C3C5E7375623E}{}\isactrlsub k\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub n\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C6C706172723E}{\isasymlparr}}\isaliteral{5C3C5E7665633E}{}\isactrlvec b\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C72686F3E}{\isasymrho}}{\isaliteral{2C}{\isacharcomma}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec c\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C7369676D613E}{\isasymsigma}}{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}} \\
   333   \end{tabular}
   334   \medskip
   335 
   336   \noindent Some further operations address the extension aspect of a
   337   derived record scheme specifically: \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}fields{\isaliteral{22}{\isachardoublequote}}} produces a
   338   record fragment consisting of exactly the new fields introduced here
   339   (the result may serve as a more part elsewhere); \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}extend{\isaliteral{22}{\isachardoublequote}}}
   340   takes a fixed record and adds a given more part; \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}truncate{\isaliteral{22}{\isachardoublequote}}} restricts a record scheme to a fixed record.
   341 
   342   \medskip
   343   \begin{tabular}{lll}
   344     \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}fields{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E7375623E}{}\isactrlsub n\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C6C706172723E}{\isasymlparr}}\isaliteral{5C3C5E7665633E}{}\isactrlvec c\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C7369676D613E}{\isasymsigma}}{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}} \\
   345     \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}extend{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}\isaliteral{5C3C5E7665633E}{}\isactrlvec b\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C72686F3E}{\isasymrho}}{\isaliteral{2C}{\isacharcomma}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec c\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C7369676D613E}{\isasymsigma}}{\isaliteral{5C3C72706172723E}{\isasymrparr}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C7A6574613E}{\isasymzeta}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C6C706172723E}{\isasymlparr}}\isaliteral{5C3C5E7665633E}{}\isactrlvec b\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C72686F3E}{\isasymrho}}{\isaliteral{2C}{\isacharcomma}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec c\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C7369676D613E}{\isasymsigma}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C7A6574613E}{\isasymzeta}}{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}} \\
   346     \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}truncate{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C706172723E}{\isasymlparr}}\isaliteral{5C3C5E7665633E}{}\isactrlvec b\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C72686F3E}{\isasymrho}}{\isaliteral{2C}{\isacharcomma}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec c\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C7369676D613E}{\isasymsigma}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C7A6574613E}{\isasymzeta}}{\isaliteral{5C3C72706172723E}{\isasymrparr}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C6C706172723E}{\isasymlparr}}\isaliteral{5C3C5E7665633E}{}\isactrlvec b\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C72686F3E}{\isasymrho}}{\isaliteral{2C}{\isacharcomma}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec c\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ \isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C7369676D613E}{\isasymsigma}}{\isaliteral{5C3C72706172723E}{\isasymrparr}}{\isaliteral{22}{\isachardoublequote}}} \\
   347   \end{tabular}
   348   \medskip
   349 
   350   \noindent Note that \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}make{\isaliteral{22}{\isachardoublequote}}} and \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}fields{\isaliteral{22}{\isachardoublequote}}} coincide
   351   for root records.%
   352 \end{isamarkuptext}%
   353 \isamarkuptrue%
   354 %
   355 \isamarkupsubsection{Derived rules and proof tools%
   356 }
   357 \isamarkuptrue%
   358 %
   359 \begin{isamarkuptext}%
   360 The record package proves several results internally, declaring
   361   these facts to appropriate proof tools.  This enables users to
   362   reason about record structures quite conveniently.  Assume that
   363   \isa{t} is a record type as specified above.
   364 
   365   \begin{enumerate}
   366 
   367   \item Standard conversions for selectors or updates applied to
   368   record constructor terms are made part of the default Simplifier
   369   context; thus proofs by reduction of basic operations merely require
   370   the \hyperlink{method.simp}{\mbox{\isa{simp}}} method without further arguments.  These rules
   371   are available as \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}simps{\isaliteral{22}{\isachardoublequote}}}, too.
   372 
   373   \item Selectors applied to updated records are automatically reduced
   374   by an internal simplification procedure, which is also part of the
   375   standard Simplifier setup.
   376 
   377   \item Inject equations of a form analogous to \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}\ y{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}x{\isaliteral{27}{\isacharprime}}{\isaliteral{2C}{\isacharcomma}}\ y{\isaliteral{27}{\isacharprime}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C65717569763E}{\isasymequiv}}\ x\ {\isaliteral{3D}{\isacharequal}}\ x{\isaliteral{27}{\isacharprime}}\ {\isaliteral{5C3C616E643E}{\isasymand}}\ y\ {\isaliteral{3D}{\isacharequal}}\ y{\isaliteral{27}{\isacharprime}}{\isaliteral{22}{\isachardoublequote}}} are declared to the Simplifier and Classical
   378   Reasoner as \hyperlink{attribute.iff}{\mbox{\isa{iff}}} rules.  These rules are available as
   379   \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}iffs{\isaliteral{22}{\isachardoublequote}}}.
   380 
   381   \item The introduction rule for record equality analogous to \isa{{\isaliteral{22}{\isachardoublequote}}x\ r\ {\isaliteral{3D}{\isacharequal}}\ x\ r{\isaliteral{27}{\isacharprime}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ y\ r\ {\isaliteral{3D}{\isacharequal}}\ y\ r{\isaliteral{27}{\isacharprime}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ r\ {\isaliteral{3D}{\isacharequal}}\ r{\isaliteral{27}{\isacharprime}}{\isaliteral{22}{\isachardoublequote}}} is declared to the Simplifier,
   382   and as the basic rule context as ``\hyperlink{attribute.intro}{\mbox{\isa{intro}}}\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{3F}{\isacharquery}}{\isaliteral{22}{\isachardoublequote}}}''.
   383   The rule is called \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}equality{\isaliteral{22}{\isachardoublequote}}}.
   384 
   385   \item Representations of arbitrary record expressions as canonical
   386   constructor terms are provided both in \hyperlink{method.cases}{\mbox{\isa{cases}}} and \hyperlink{method.induct}{\mbox{\isa{induct}}} format (cf.\ the generic proof methods of the same name,
   387   \secref{sec:cases-induct}).  Several variations are available, for
   388   fixed records, record schemes, more parts etc.
   389 
   390   The generic proof methods are sufficiently smart to pick the most
   391   sensible rule according to the type of the indicated record
   392   expression: users just need to apply something like ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}cases\ r{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}}'' to a certain proof problem.
   393 
   394   \item The derived record operations \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}make{\isaliteral{22}{\isachardoublequote}}}, \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}fields{\isaliteral{22}{\isachardoublequote}}}, \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}extend{\isaliteral{22}{\isachardoublequote}}}, \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}truncate{\isaliteral{22}{\isachardoublequote}}} are \emph{not}
   395   treated automatically, but usually need to be expanded by hand,
   396   using the collective fact \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}defs{\isaliteral{22}{\isachardoublequote}}}.
   397 
   398   \end{enumerate}%
   399 \end{isamarkuptext}%
   400 \isamarkuptrue%
   401 %
   402 \isamarkupsection{Datatypes \label{sec:hol-datatype}%
   403 }
   404 \isamarkuptrue%
   405 %
   406 \begin{isamarkuptext}%
   407 \begin{matharray}{rcl}
   408     \indexdef{HOL}{command}{datatype}\hypertarget{command.HOL.datatype}{\hyperlink{command.HOL.datatype}{\mbox{\isa{\isacommand{datatype}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}} \\
   409     \indexdef{HOL}{command}{rep\_datatype}\hypertarget{command.HOL.rep-datatype}{\hyperlink{command.HOL.rep-datatype}{\mbox{\isa{\isacommand{rep{\isaliteral{5F}{\isacharunderscore}}datatype}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ proof{\isaliteral{28}{\isacharparenleft}}prove{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}} \\
   410   \end{matharray}
   411 
   412   \begin{railoutput}
   413 \rail@begin{2}{\isa{}}
   414 \rail@term{\hyperlink{command.HOL.datatype}{\mbox{\isa{\isacommand{datatype}}}}}[]
   415 \rail@plus
   416 \rail@nont{\isa{dtspec}}[]
   417 \rail@nextplus{1}
   418 \rail@cterm{\isa{\isakeyword{and}}}[]
   419 \rail@endplus
   420 \rail@end
   421 \rail@begin{3}{\isa{}}
   422 \rail@term{\hyperlink{command.HOL.rep-datatype}{\mbox{\isa{\isacommand{rep{\isaliteral{5F}{\isacharunderscore}}datatype}}}}}[]
   423 \rail@bar
   424 \rail@nextbar{1}
   425 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
   426 \rail@plus
   427 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
   428 \rail@nextplus{2}
   429 \rail@endplus
   430 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
   431 \rail@endbar
   432 \rail@plus
   433 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
   434 \rail@nextplus{1}
   435 \rail@endplus
   436 \rail@end
   437 \rail@begin{2}{\isa{dtspec}}
   438 \rail@bar
   439 \rail@nextbar{1}
   440 \rail@nont{\hyperlink{syntax.parname}{\mbox{\isa{parname}}}}[]
   441 \rail@endbar
   442 \rail@nont{\hyperlink{syntax.typespec}{\mbox{\isa{typespec}}}}[]
   443 \rail@bar
   444 \rail@nextbar{1}
   445 \rail@nont{\hyperlink{syntax.mixfix}{\mbox{\isa{mixfix}}}}[]
   446 \rail@endbar
   447 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
   448 \rail@plus
   449 \rail@nont{\isa{cons}}[]
   450 \rail@nextplus{1}
   451 \rail@cterm{\isa{{\isaliteral{7C}{\isacharbar}}}}[]
   452 \rail@endplus
   453 \rail@end
   454 \rail@begin{2}{\isa{cons}}
   455 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
   456 \rail@plus
   457 \rail@nextplus{1}
   458 \rail@cnont{\hyperlink{syntax.type}{\mbox{\isa{type}}}}[]
   459 \rail@endplus
   460 \rail@bar
   461 \rail@nextbar{1}
   462 \rail@nont{\hyperlink{syntax.mixfix}{\mbox{\isa{mixfix}}}}[]
   463 \rail@endbar
   464 \rail@end
   465 \end{railoutput}
   466 
   467 
   468   \begin{description}
   469 
   470   \item \hyperlink{command.HOL.datatype}{\mbox{\isa{\isacommand{datatype}}}} defines inductive datatypes in
   471   HOL.
   472 
   473   \item \hyperlink{command.HOL.rep-datatype}{\mbox{\isa{\isacommand{rep{\isaliteral{5F}{\isacharunderscore}}datatype}}}} represents existing types as
   474   inductive ones, generating the standard infrastructure of derived
   475   concepts (primitive recursion etc.).
   476 
   477   \end{description}
   478 
   479   The induction and exhaustion theorems generated provide case names
   480   according to the constructors involved, while parameters are named
   481   after the types (see also \secref{sec:cases-induct}).
   482 
   483   See \cite{isabelle-HOL} for more details on datatypes, but beware of
   484   the old-style theory syntax being used there!  Apart from proper
   485   proof methods for case-analysis and induction, there are also
   486   emulations of ML tactics \hyperlink{method.HOL.case-tac}{\mbox{\isa{case{\isaliteral{5F}{\isacharunderscore}}tac}}} and \hyperlink{method.HOL.induct-tac}{\mbox{\isa{induct{\isaliteral{5F}{\isacharunderscore}}tac}}} available, see \secref{sec:hol-induct-tac}; these admit
   487   to refer directly to the internal structure of subgoals (including
   488   internally bound parameters).%
   489 \end{isamarkuptext}%
   490 \isamarkuptrue%
   491 %
   492 \isamarkupsection{Functorial structure of types%
   493 }
   494 \isamarkuptrue%
   495 %
   496 \begin{isamarkuptext}%
   497 \begin{matharray}{rcl}
   498     \indexdef{HOL}{command}{enriched\_type}\hypertarget{command.HOL.enriched-type}{\hyperlink{command.HOL.enriched-type}{\mbox{\isa{\isacommand{enriched{\isaliteral{5F}{\isacharunderscore}}type}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}local{\isaliteral{5F}{\isacharunderscore}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ proof{\isaliteral{28}{\isacharparenleft}}prove{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}}
   499   \end{matharray}
   500 
   501   \begin{railoutput}
   502 \rail@begin{2}{\isa{}}
   503 \rail@term{\hyperlink{command.HOL.enriched-type}{\mbox{\isa{\isacommand{enriched{\isaliteral{5F}{\isacharunderscore}}type}}}}}[]
   504 \rail@bar
   505 \rail@nextbar{1}
   506 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
   507 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}}}[]
   508 \rail@endbar
   509 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
   510 \rail@end
   511 \end{railoutput}
   512 
   513 
   514   \begin{description}
   515 
   516   \item \hyperlink{command.HOL.enriched-type}{\mbox{\isa{\isacommand{enriched{\isaliteral{5F}{\isacharunderscore}}type}}}}~\isa{{\isaliteral{22}{\isachardoublequote}}prefix{\isaliteral{3A}{\isacharcolon}}\ m{\isaliteral{22}{\isachardoublequote}}} allows to
   517   prove and register properties about the functorial structure of type
   518   constructors.  These properties then can be used by other packages
   519   to deal with those type constructors in certain type constructions.
   520   Characteristic theorems are noted in the current local theory.  By
   521   default, they are prefixed with the base name of the type
   522   constructor, an explicit prefix can be given alternatively.
   523 
   524   The given term \isa{{\isaliteral{22}{\isachardoublequote}}m{\isaliteral{22}{\isachardoublequote}}} is considered as \emph{mapper} for the
   525   corresponding type constructor and must conform to the following
   526   type pattern:
   527 
   528   \begin{matharray}{lll}
   529     \isa{{\isaliteral{22}{\isachardoublequote}}m{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{22}{\isachardoublequote}}} &
   530       \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{1}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E697375623E}{}\isactrlisub k\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{28}{\isacharparenleft}}\isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E697375623E}{}\isactrlisub n{\isaliteral{29}{\isacharparenright}}\ t\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{28}{\isacharparenleft}}\isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C626574613E}{\isasymbeta}}\isaliteral{5C3C5E697375623E}{}\isactrlisub n{\isaliteral{29}{\isacharparenright}}\ t{\isaliteral{22}{\isachardoublequote}}} \\
   531   \end{matharray}
   532 
   533   \noindent where \isa{t} is the type constructor, \isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E697375623E}{}\isactrlisub n{\isaliteral{22}{\isachardoublequote}}} and \isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7665633E}{}\isactrlvec {\isaliteral{5C3C626574613E}{\isasymbeta}}\isaliteral{5C3C5E697375623E}{}\isactrlisub n{\isaliteral{22}{\isachardoublequote}}} are distinct
   534   type variables free in the local theory and \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{1}}{\isaliteral{22}{\isachardoublequote}}},
   535   \ldots, \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E697375623E}{}\isactrlisub k{\isaliteral{22}{\isachardoublequote}}} is a subsequence of \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{1}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C626574613E}{\isasymbeta}}\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{1}}{\isaliteral{22}{\isachardoublequote}}}, \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C626574613E}{\isasymbeta}}\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{1}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{1}}{\isaliteral{22}{\isachardoublequote}}}, \ldots,
   536   \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E697375623E}{}\isactrlisub n\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C626574613E}{\isasymbeta}}\isaliteral{5C3C5E697375623E}{}\isactrlisub n{\isaliteral{22}{\isachardoublequote}}}, \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C626574613E}{\isasymbeta}}\isaliteral{5C3C5E697375623E}{}\isactrlisub n\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C616C7068613E}{\isasymalpha}}\isaliteral{5C3C5E697375623E}{}\isactrlisub n{\isaliteral{22}{\isachardoublequote}}}.
   537 
   538   \end{description}%
   539 \end{isamarkuptext}%
   540 \isamarkuptrue%
   541 %
   542 \isamarkupsection{Recursive functions \label{sec:recursion}%
   543 }
   544 \isamarkuptrue%
   545 %
   546 \begin{isamarkuptext}%
   547 \begin{matharray}{rcl}
   548     \indexdef{HOL}{command}{primrec}\hypertarget{command.HOL.primrec}{\hyperlink{command.HOL.primrec}{\mbox{\isa{\isacommand{primrec}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}local{\isaliteral{5F}{\isacharunderscore}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ local{\isaliteral{5F}{\isacharunderscore}}theory{\isaliteral{22}{\isachardoublequote}}} \\
   549     \indexdef{HOL}{command}{fun}\hypertarget{command.HOL.fun}{\hyperlink{command.HOL.fun}{\mbox{\isa{\isacommand{fun}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}local{\isaliteral{5F}{\isacharunderscore}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ local{\isaliteral{5F}{\isacharunderscore}}theory{\isaliteral{22}{\isachardoublequote}}} \\
   550     \indexdef{HOL}{command}{function}\hypertarget{command.HOL.function}{\hyperlink{command.HOL.function}{\mbox{\isa{\isacommand{function}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}local{\isaliteral{5F}{\isacharunderscore}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ proof{\isaliteral{28}{\isacharparenleft}}prove{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}} \\
   551     \indexdef{HOL}{command}{termination}\hypertarget{command.HOL.termination}{\hyperlink{command.HOL.termination}{\mbox{\isa{\isacommand{termination}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}local{\isaliteral{5F}{\isacharunderscore}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ proof{\isaliteral{28}{\isacharparenleft}}prove{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}} \\
   552   \end{matharray}
   553 
   554   \begin{railoutput}
   555 \rail@begin{2}{\isa{}}
   556 \rail@term{\hyperlink{command.HOL.primrec}{\mbox{\isa{\isacommand{primrec}}}}}[]
   557 \rail@bar
   558 \rail@nextbar{1}
   559 \rail@nont{\hyperlink{syntax.target}{\mbox{\isa{target}}}}[]
   560 \rail@endbar
   561 \rail@nont{\hyperlink{syntax.fixes}{\mbox{\isa{fixes}}}}[]
   562 \rail@term{\isa{\isakeyword{where}}}[]
   563 \rail@nont{\isa{equations}}[]
   564 \rail@end
   565 \rail@begin{4}{\isa{}}
   566 \rail@bar
   567 \rail@term{\hyperlink{command.HOL.fun}{\mbox{\isa{\isacommand{fun}}}}}[]
   568 \rail@nextbar{1}
   569 \rail@term{\hyperlink{command.HOL.function}{\mbox{\isa{\isacommand{function}}}}}[]
   570 \rail@endbar
   571 \rail@bar
   572 \rail@nextbar{1}
   573 \rail@nont{\hyperlink{syntax.target}{\mbox{\isa{target}}}}[]
   574 \rail@endbar
   575 \rail@bar
   576 \rail@nextbar{1}
   577 \rail@nont{\isa{functionopts}}[]
   578 \rail@endbar
   579 \rail@nont{\hyperlink{syntax.fixes}{\mbox{\isa{fixes}}}}[]
   580 \rail@cr{3}
   581 \rail@term{\isa{\isakeyword{where}}}[]
   582 \rail@nont{\isa{equations}}[]
   583 \rail@end
   584 \rail@begin{3}{\isa{equations}}
   585 \rail@plus
   586 \rail@bar
   587 \rail@nextbar{1}
   588 \rail@nont{\hyperlink{syntax.thmdecl}{\mbox{\isa{thmdecl}}}}[]
   589 \rail@endbar
   590 \rail@nont{\hyperlink{syntax.prop}{\mbox{\isa{prop}}}}[]
   591 \rail@nextplus{2}
   592 \rail@cterm{\isa{{\isaliteral{7C}{\isacharbar}}}}[]
   593 \rail@endplus
   594 \rail@end
   595 \rail@begin{3}{\isa{functionopts}}
   596 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
   597 \rail@plus
   598 \rail@bar
   599 \rail@term{\isa{sequential}}[]
   600 \rail@nextbar{1}
   601 \rail@term{\isa{domintros}}[]
   602 \rail@endbar
   603 \rail@nextplus{2}
   604 \rail@cterm{\isa{{\isaliteral{2C}{\isacharcomma}}}}[]
   605 \rail@endplus
   606 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
   607 \rail@end
   608 \rail@begin{2}{\isa{}}
   609 \rail@term{\hyperlink{command.HOL.termination}{\mbox{\isa{\isacommand{termination}}}}}[]
   610 \rail@bar
   611 \rail@nextbar{1}
   612 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
   613 \rail@endbar
   614 \rail@end
   615 \end{railoutput}
   616 
   617 
   618   \begin{description}
   619 
   620   \item \hyperlink{command.HOL.primrec}{\mbox{\isa{\isacommand{primrec}}}} defines primitive recursive
   621   functions over datatypes, see also \cite{isabelle-HOL}.
   622 
   623   \item \hyperlink{command.HOL.function}{\mbox{\isa{\isacommand{function}}}} defines functions by general
   624   wellfounded recursion. A detailed description with examples can be
   625   found in \cite{isabelle-function}. The function is specified by a
   626   set of (possibly conditional) recursive equations with arbitrary
   627   pattern matching. The command generates proof obligations for the
   628   completeness and the compatibility of patterns.
   629 
   630   The defined function is considered partial, and the resulting
   631   simplification rules (named \isa{{\isaliteral{22}{\isachardoublequote}}f{\isaliteral{2E}{\isachardot}}psimps{\isaliteral{22}{\isachardoublequote}}}) and induction rule
   632   (named \isa{{\isaliteral{22}{\isachardoublequote}}f{\isaliteral{2E}{\isachardot}}pinduct{\isaliteral{22}{\isachardoublequote}}}) are guarded by a generated domain
   633   predicate \isa{{\isaliteral{22}{\isachardoublequote}}f{\isaliteral{5F}{\isacharunderscore}}dom{\isaliteral{22}{\isachardoublequote}}}. The \hyperlink{command.HOL.termination}{\mbox{\isa{\isacommand{termination}}}}
   634   command can then be used to establish that the function is total.
   635 
   636   \item \hyperlink{command.HOL.fun}{\mbox{\isa{\isacommand{fun}}}} is a shorthand notation for ``\hyperlink{command.HOL.function}{\mbox{\isa{\isacommand{function}}}}~\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}sequential{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}}, followed by automated
   637   proof attempts regarding pattern matching and termination.  See
   638   \cite{isabelle-function} for further details.
   639 
   640   \item \hyperlink{command.HOL.termination}{\mbox{\isa{\isacommand{termination}}}}~\isa{f} commences a
   641   termination proof for the previously defined function \isa{f}.  If
   642   this is omitted, the command refers to the most recent function
   643   definition.  After the proof is closed, the recursive equations and
   644   the induction principle is established.
   645 
   646   \end{description}
   647 
   648   Recursive definitions introduced by the \hyperlink{command.HOL.function}{\mbox{\isa{\isacommand{function}}}}
   649   command accommodate
   650   reasoning by induction (cf.\ \secref{sec:cases-induct}): rule \isa{{\isaliteral{22}{\isachardoublequote}}c{\isaliteral{2E}{\isachardot}}induct{\isaliteral{22}{\isachardoublequote}}} (where \isa{c} is the name of the function definition)
   651   refers to a specific induction rule, with parameters named according
   652   to the user-specified equations. Cases are numbered (starting from 1).
   653 
   654   For \hyperlink{command.HOL.primrec}{\mbox{\isa{\isacommand{primrec}}}}, the induction principle coincides
   655   with structural recursion on the datatype the recursion is carried
   656   out.
   657 
   658   The equations provided by these packages may be referred later as
   659   theorem list \isa{{\isaliteral{22}{\isachardoublequote}}f{\isaliteral{2E}{\isachardot}}simps{\isaliteral{22}{\isachardoublequote}}}, where \isa{f} is the (collective)
   660   name of the functions defined.  Individual equations may be named
   661   explicitly as well.
   662 
   663   The \hyperlink{command.HOL.function}{\mbox{\isa{\isacommand{function}}}} command accepts the following
   664   options.
   665 
   666   \begin{description}
   667 
   668   \item \isa{sequential} enables a preprocessor which disambiguates
   669   overlapping patterns by making them mutually disjoint.  Earlier
   670   equations take precedence over later ones.  This allows to give the
   671   specification in a format very similar to functional programming.
   672   Note that the resulting simplification and induction rules
   673   correspond to the transformed specification, not the one given
   674   originally. This usually means that each equation given by the user
   675   may result in several theorems.  Also note that this automatic
   676   transformation only works for ML-style datatype patterns.
   677 
   678   \item \isa{domintros} enables the automated generation of
   679   introduction rules for the domain predicate. While mostly not
   680   needed, they can be helpful in some proofs about partial functions.
   681 
   682   \end{description}%
   683 \end{isamarkuptext}%
   684 \isamarkuptrue%
   685 %
   686 \isamarkupsubsection{Proof methods related to recursive definitions%
   687 }
   688 \isamarkuptrue%
   689 %
   690 \begin{isamarkuptext}%
   691 \begin{matharray}{rcl}
   692     \indexdef{HOL}{method}{pat\_completeness}\hypertarget{method.HOL.pat-completeness}{\hyperlink{method.HOL.pat-completeness}{\mbox{\isa{pat{\isaliteral{5F}{\isacharunderscore}}completeness}}}} & : & \isa{method} \\
   693     \indexdef{HOL}{method}{relation}\hypertarget{method.HOL.relation}{\hyperlink{method.HOL.relation}{\mbox{\isa{relation}}}} & : & \isa{method} \\
   694     \indexdef{HOL}{method}{lexicographic\_order}\hypertarget{method.HOL.lexicographic-order}{\hyperlink{method.HOL.lexicographic-order}{\mbox{\isa{lexicographic{\isaliteral{5F}{\isacharunderscore}}order}}}} & : & \isa{method} \\
   695     \indexdef{HOL}{method}{size\_change}\hypertarget{method.HOL.size-change}{\hyperlink{method.HOL.size-change}{\mbox{\isa{size{\isaliteral{5F}{\isacharunderscore}}change}}}} & : & \isa{method} \\
   696   \end{matharray}
   697 
   698   \begin{railoutput}
   699 \rail@begin{1}{\isa{}}
   700 \rail@term{\hyperlink{method.HOL.relation}{\mbox{\isa{relation}}}}[]
   701 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
   702 \rail@end
   703 \rail@begin{2}{\isa{}}
   704 \rail@term{\hyperlink{method.HOL.lexicographic-order}{\mbox{\isa{lexicographic{\isaliteral{5F}{\isacharunderscore}}order}}}}[]
   705 \rail@plus
   706 \rail@nextplus{1}
   707 \rail@cnont{\hyperlink{syntax.clasimpmod}{\mbox{\isa{clasimpmod}}}}[]
   708 \rail@endplus
   709 \rail@end
   710 \rail@begin{2}{\isa{}}
   711 \rail@term{\hyperlink{method.HOL.size-change}{\mbox{\isa{size{\isaliteral{5F}{\isacharunderscore}}change}}}}[]
   712 \rail@nont{\isa{orders}}[]
   713 \rail@plus
   714 \rail@nextplus{1}
   715 \rail@cnont{\hyperlink{syntax.clasimpmod}{\mbox{\isa{clasimpmod}}}}[]
   716 \rail@endplus
   717 \rail@end
   718 \rail@begin{4}{\isa{orders}}
   719 \rail@plus
   720 \rail@nextplus{1}
   721 \rail@bar
   722 \rail@term{\isa{max}}[]
   723 \rail@nextbar{2}
   724 \rail@term{\isa{min}}[]
   725 \rail@nextbar{3}
   726 \rail@term{\isa{ms}}[]
   727 \rail@endbar
   728 \rail@endplus
   729 \rail@end
   730 \end{railoutput}
   731 
   732 
   733   \begin{description}
   734 
   735   \item \hyperlink{method.HOL.pat-completeness}{\mbox{\isa{pat{\isaliteral{5F}{\isacharunderscore}}completeness}}} is a specialized method to
   736   solve goals regarding the completeness of pattern matching, as
   737   required by the \hyperlink{command.HOL.function}{\mbox{\isa{\isacommand{function}}}} package (cf.\
   738   \cite{isabelle-function}).
   739 
   740   \item \hyperlink{method.HOL.relation}{\mbox{\isa{relation}}}~\isa{R} introduces a termination
   741   proof using the relation \isa{R}.  The resulting proof state will
   742   contain goals expressing that \isa{R} is wellfounded, and that the
   743   arguments of recursive calls decrease with respect to \isa{R}.
   744   Usually, this method is used as the initial proof step of manual
   745   termination proofs.
   746 
   747   \item \hyperlink{method.HOL.lexicographic-order}{\mbox{\isa{lexicographic{\isaliteral{5F}{\isacharunderscore}}order}}} attempts a fully
   748   automated termination proof by searching for a lexicographic
   749   combination of size measures on the arguments of the function. The
   750   method accepts the same arguments as the \hyperlink{method.auto}{\mbox{\isa{auto}}} method,
   751   which it uses internally to prove local descents.  The same context
   752   modifiers as for \hyperlink{method.auto}{\mbox{\isa{auto}}} are accepted, see
   753   \secref{sec:clasimp}.
   754 
   755   In case of failure, extensive information is printed, which can help
   756   to analyse the situation (cf.\ \cite{isabelle-function}).
   757 
   758   \item \hyperlink{method.HOL.size-change}{\mbox{\isa{size{\isaliteral{5F}{\isacharunderscore}}change}}} also works on termination goals,
   759   using a variation of the size-change principle, together with a
   760   graph decomposition technique (see \cite{krauss_phd} for details).
   761   Three kinds of orders are used internally: \isa{max}, \isa{min},
   762   and \isa{ms} (multiset), which is only available when the theory
   763   \isa{Multiset} is loaded. When no order kinds are given, they are
   764   tried in order. The search for a termination proof uses SAT solving
   765   internally.
   766 
   767  For local descent proofs, the same context modifiers as for \hyperlink{method.auto}{\mbox{\isa{auto}}} are accepted, see \secref{sec:clasimp}.
   768 
   769   \end{description}%
   770 \end{isamarkuptext}%
   771 \isamarkuptrue%
   772 %
   773 \isamarkupsubsection{Functions with explicit partiality%
   774 }
   775 \isamarkuptrue%
   776 %
   777 \begin{isamarkuptext}%
   778 \begin{matharray}{rcl}
   779     \indexdef{HOL}{command}{partial\_function}\hypertarget{command.HOL.partial-function}{\hyperlink{command.HOL.partial-function}{\mbox{\isa{\isacommand{partial{\isaliteral{5F}{\isacharunderscore}}function}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}local{\isaliteral{5F}{\isacharunderscore}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ local{\isaliteral{5F}{\isacharunderscore}}theory{\isaliteral{22}{\isachardoublequote}}} \\
   780     \indexdef{HOL}{attribute}{partial\_function\_mono}\hypertarget{attribute.HOL.partial-function-mono}{\hyperlink{attribute.HOL.partial-function-mono}{\mbox{\isa{partial{\isaliteral{5F}{\isacharunderscore}}function{\isaliteral{5F}{\isacharunderscore}}mono}}}} & : & \isa{attribute} \\
   781   \end{matharray}
   782 
   783   \begin{railoutput}
   784 \rail@begin{5}{\isa{}}
   785 \rail@term{\hyperlink{command.HOL.partial-function}{\mbox{\isa{\isacommand{partial{\isaliteral{5F}{\isacharunderscore}}function}}}}}[]
   786 \rail@bar
   787 \rail@nextbar{1}
   788 \rail@nont{\hyperlink{syntax.target}{\mbox{\isa{target}}}}[]
   789 \rail@endbar
   790 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
   791 \rail@nont{\hyperlink{syntax.nameref}{\mbox{\isa{nameref}}}}[]
   792 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
   793 \rail@nont{\hyperlink{syntax.fixes}{\mbox{\isa{fixes}}}}[]
   794 \rail@cr{3}
   795 \rail@term{\isa{\isakeyword{where}}}[]
   796 \rail@bar
   797 \rail@nextbar{4}
   798 \rail@nont{\hyperlink{syntax.thmdecl}{\mbox{\isa{thmdecl}}}}[]
   799 \rail@endbar
   800 \rail@nont{\hyperlink{syntax.prop}{\mbox{\isa{prop}}}}[]
   801 \rail@end
   802 \end{railoutput}
   803 
   804 
   805   \begin{description}
   806 
   807   \item \hyperlink{command.HOL.partial-function}{\mbox{\isa{\isacommand{partial{\isaliteral{5F}{\isacharunderscore}}function}}}}~\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}mode{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}} defines
   808   recursive functions based on fixpoints in complete partial
   809   orders. No termination proof is required from the user or
   810   constructed internally. Instead, the possibility of non-termination
   811   is modelled explicitly in the result type, which contains an
   812   explicit bottom element.
   813 
   814   Pattern matching and mutual recursion are currently not supported.
   815   Thus, the specification consists of a single function described by a
   816   single recursive equation.
   817 
   818   There are no fixed syntactic restrictions on the body of the
   819   function, but the induced functional must be provably monotonic
   820   wrt.\ the underlying order.  The monotonicitity proof is performed
   821   internally, and the definition is rejected when it fails. The proof
   822   can be influenced by declaring hints using the
   823   \hyperlink{attribute.HOL.partial-function-mono}{\mbox{\isa{partial{\isaliteral{5F}{\isacharunderscore}}function{\isaliteral{5F}{\isacharunderscore}}mono}}} attribute.
   824 
   825   The mandatory \isa{mode} argument specifies the mode of operation
   826   of the command, which directly corresponds to a complete partial
   827   order on the result type. By default, the following modes are
   828   defined:
   829 
   830   \begin{description}
   831   \item \isa{option} defines functions that map into the \isa{option} type. Here, the value \isa{None} is used to model a
   832   non-terminating computation. Monotonicity requires that if \isa{None} is returned by a recursive call, then the overall result
   833   must also be \isa{None}. This is best achieved through the use of
   834   the monadic operator \isa{{\isaliteral{22}{\isachardoublequote}}Option{\isaliteral{2E}{\isachardot}}bind{\isaliteral{22}{\isachardoublequote}}}.
   835 
   836   \item \isa{tailrec} defines functions with an arbitrary result
   837   type and uses the slightly degenerated partial order where \isa{{\isaliteral{22}{\isachardoublequote}}undefined{\isaliteral{22}{\isachardoublequote}}} is the bottom element.  Now, monotonicity requires that
   838   if \isa{undefined} is returned by a recursive call, then the
   839   overall result must also be \isa{undefined}. In practice, this is
   840   only satisfied when each recursive call is a tail call, whose result
   841   is directly returned. Thus, this mode of operation allows the
   842   definition of arbitrary tail-recursive functions.
   843   \end{description}
   844 
   845   Experienced users may define new modes by instantiating the locale
   846   \isa{{\isaliteral{22}{\isachardoublequote}}partial{\isaliteral{5F}{\isacharunderscore}}function{\isaliteral{5F}{\isacharunderscore}}definitions{\isaliteral{22}{\isachardoublequote}}} appropriately.
   847 
   848   \item \hyperlink{attribute.HOL.partial-function-mono}{\mbox{\isa{partial{\isaliteral{5F}{\isacharunderscore}}function{\isaliteral{5F}{\isacharunderscore}}mono}}} declares rules for
   849   use in the internal monononicity proofs of partial function
   850   definitions.
   851 
   852   \end{description}%
   853 \end{isamarkuptext}%
   854 \isamarkuptrue%
   855 %
   856 \isamarkupsubsection{Old-style recursive function definitions (TFL)%
   857 }
   858 \isamarkuptrue%
   859 %
   860 \begin{isamarkuptext}%
   861 The old TFL commands \hyperlink{command.HOL.recdef}{\mbox{\isa{\isacommand{recdef}}}} and \hyperlink{command.HOL.recdef-tc}{\mbox{\isa{\isacommand{recdef{\isaliteral{5F}{\isacharunderscore}}tc}}}} for defining recursive are mostly obsolete; \hyperlink{command.HOL.function}{\mbox{\isa{\isacommand{function}}}} or \hyperlink{command.HOL.fun}{\mbox{\isa{\isacommand{fun}}}} should be used instead.
   862 
   863   \begin{matharray}{rcl}
   864     \indexdef{HOL}{command}{recdef}\hypertarget{command.HOL.recdef}{\hyperlink{command.HOL.recdef}{\mbox{\isa{\isacommand{recdef}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}} \\
   865     \indexdef{HOL}{command}{recdef\_tc}\hypertarget{command.HOL.recdef-tc}{\hyperlink{command.HOL.recdef-tc}{\mbox{\isa{\isacommand{recdef{\isaliteral{5F}{\isacharunderscore}}tc}}}}}\isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7375703E}{}\isactrlsup {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ proof{\isaliteral{28}{\isacharparenleft}}prove{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}} \\
   866   \end{matharray}
   867 
   868   \begin{railoutput}
   869 \rail@begin{5}{\isa{}}
   870 \rail@term{\hyperlink{command.HOL.recdef}{\mbox{\isa{\isacommand{recdef}}}}}[]
   871 \rail@bar
   872 \rail@nextbar{1}
   873 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
   874 \rail@term{\isa{\isakeyword{permissive}}}[]
   875 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
   876 \rail@endbar
   877 \rail@cr{3}
   878 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
   879 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
   880 \rail@plus
   881 \rail@nont{\hyperlink{syntax.prop}{\mbox{\isa{prop}}}}[]
   882 \rail@nextplus{4}
   883 \rail@endplus
   884 \rail@bar
   885 \rail@nextbar{4}
   886 \rail@nont{\isa{hints}}[]
   887 \rail@endbar
   888 \rail@end
   889 \rail@begin{2}{\isa{}}
   890 \rail@nont{\isa{recdeftc}}[]
   891 \rail@bar
   892 \rail@nextbar{1}
   893 \rail@nont{\hyperlink{syntax.thmdecl}{\mbox{\isa{thmdecl}}}}[]
   894 \rail@endbar
   895 \rail@nont{\isa{tc}}[]
   896 \rail@end
   897 \rail@begin{2}{\isa{hints}}
   898 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
   899 \rail@term{\isa{\isakeyword{hints}}}[]
   900 \rail@plus
   901 \rail@nextplus{1}
   902 \rail@cnont{\isa{recdefmod}}[]
   903 \rail@endplus
   904 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
   905 \rail@end
   906 \rail@begin{4}{\isa{recdefmod}}
   907 \rail@bar
   908 \rail@bar
   909 \rail@term{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}simp}}[]
   910 \rail@nextbar{1}
   911 \rail@term{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}cong}}[]
   912 \rail@nextbar{2}
   913 \rail@term{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}wf}}[]
   914 \rail@endbar
   915 \rail@bar
   916 \rail@nextbar{1}
   917 \rail@term{\isa{add}}[]
   918 \rail@nextbar{2}
   919 \rail@term{\isa{del}}[]
   920 \rail@endbar
   921 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}}}[]
   922 \rail@nont{\hyperlink{syntax.thmrefs}{\mbox{\isa{thmrefs}}}}[]
   923 \rail@nextbar{3}
   924 \rail@nont{\hyperlink{syntax.clasimpmod}{\mbox{\isa{clasimpmod}}}}[]
   925 \rail@endbar
   926 \rail@end
   927 \rail@begin{2}{\isa{tc}}
   928 \rail@nont{\hyperlink{syntax.nameref}{\mbox{\isa{nameref}}}}[]
   929 \rail@bar
   930 \rail@nextbar{1}
   931 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
   932 \rail@nont{\hyperlink{syntax.nat}{\mbox{\isa{nat}}}}[]
   933 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
   934 \rail@endbar
   935 \rail@end
   936 \end{railoutput}
   937 
   938 
   939   \begin{description}
   940 
   941   \item \hyperlink{command.HOL.recdef}{\mbox{\isa{\isacommand{recdef}}}} defines general well-founded
   942   recursive functions (using the TFL package), see also
   943   \cite{isabelle-HOL}.  The ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}permissive{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}}'' option tells
   944   TFL to recover from failed proof attempts, returning unfinished
   945   results.  The \isa{recdef{\isaliteral{5F}{\isacharunderscore}}simp}, \isa{recdef{\isaliteral{5F}{\isacharunderscore}}cong}, and \isa{recdef{\isaliteral{5F}{\isacharunderscore}}wf} hints refer to auxiliary rules to be used in the internal
   946   automated proof process of TFL.  Additional \hyperlink{syntax.clasimpmod}{\mbox{\isa{clasimpmod}}}
   947   declarations (cf.\ \secref{sec:clasimp}) may be given to tune the
   948   context of the Simplifier (cf.\ \secref{sec:simplifier}) and
   949   Classical reasoner (cf.\ \secref{sec:classical}).
   950 
   951   \item \hyperlink{command.HOL.recdef-tc}{\mbox{\isa{\isacommand{recdef{\isaliteral{5F}{\isacharunderscore}}tc}}}}~\isa{{\isaliteral{22}{\isachardoublequote}}c\ {\isaliteral{28}{\isacharparenleft}}i{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}} recommences the
   952   proof for leftover termination condition number \isa{i} (default
   953   1) as generated by a \hyperlink{command.HOL.recdef}{\mbox{\isa{\isacommand{recdef}}}} definition of
   954   constant \isa{c}.
   955 
   956   Note that in most cases, \hyperlink{command.HOL.recdef}{\mbox{\isa{\isacommand{recdef}}}} is able to finish
   957   its internal proofs without manual intervention.
   958 
   959   \end{description}
   960 
   961   \medskip Hints for \hyperlink{command.HOL.recdef}{\mbox{\isa{\isacommand{recdef}}}} may be also declared
   962   globally, using the following attributes.
   963 
   964   \begin{matharray}{rcl}
   965     \indexdef{HOL}{attribute}{recdef\_simp}\hypertarget{attribute.HOL.recdef-simp}{\hyperlink{attribute.HOL.recdef-simp}{\mbox{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}simp}}}} & : & \isa{attribute} \\
   966     \indexdef{HOL}{attribute}{recdef\_cong}\hypertarget{attribute.HOL.recdef-cong}{\hyperlink{attribute.HOL.recdef-cong}{\mbox{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}cong}}}} & : & \isa{attribute} \\
   967     \indexdef{HOL}{attribute}{recdef\_wf}\hypertarget{attribute.HOL.recdef-wf}{\hyperlink{attribute.HOL.recdef-wf}{\mbox{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}wf}}}} & : & \isa{attribute} \\
   968   \end{matharray}
   969 
   970   \begin{railoutput}
   971 \rail@begin{3}{\isa{}}
   972 \rail@bar
   973 \rail@term{\hyperlink{attribute.HOL.recdef-simp}{\mbox{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}simp}}}}[]
   974 \rail@nextbar{1}
   975 \rail@term{\hyperlink{attribute.HOL.recdef-cong}{\mbox{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}cong}}}}[]
   976 \rail@nextbar{2}
   977 \rail@term{\hyperlink{attribute.HOL.recdef-wf}{\mbox{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}wf}}}}[]
   978 \rail@endbar
   979 \rail@bar
   980 \rail@nextbar{1}
   981 \rail@term{\isa{add}}[]
   982 \rail@nextbar{2}
   983 \rail@term{\isa{del}}[]
   984 \rail@endbar
   985 \rail@end
   986 \end{railoutput}%
   987 \end{isamarkuptext}%
   988 \isamarkuptrue%
   989 %
   990 \isamarkupsection{Inductive and coinductive definitions \label{sec:hol-inductive}%
   991 }
   992 \isamarkuptrue%
   993 %
   994 \begin{isamarkuptext}%
   995 An \textbf{inductive definition} specifies the least predicate (or
   996   set) \isa{R} closed under given rules: applying a rule to elements
   997   of \isa{R} yields a result within \isa{R}.  For example, a
   998   structural operational semantics is an inductive definition of an
   999   evaluation relation.
  1000 
  1001   Dually, a \textbf{coinductive definition} specifies the greatest
  1002   predicate~/ set \isa{R} that is consistent with given rules: every
  1003   element of \isa{R} can be seen as arising by applying a rule to
  1004   elements of \isa{R}.  An important example is using bisimulation
  1005   relations to formalise equivalence of processes and infinite data
  1006   structures.
  1007 
  1008   \medskip The HOL package is related to the ZF one, which is
  1009   described in a separate paper,\footnote{It appeared in CADE
  1010   \cite{paulson-CADE}; a longer version is distributed with Isabelle.}
  1011   which you should refer to in case of difficulties.  The package is
  1012   simpler than that of ZF thanks to implicit type-checking in HOL.
  1013   The types of the (co)inductive predicates (or sets) determine the
  1014   domain of the fixedpoint definition, and the package does not have
  1015   to use inference rules for type-checking.
  1016 
  1017   \begin{matharray}{rcl}
  1018     \indexdef{HOL}{command}{inductive}\hypertarget{command.HOL.inductive}{\hyperlink{command.HOL.inductive}{\mbox{\isa{\isacommand{inductive}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}local{\isaliteral{5F}{\isacharunderscore}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ local{\isaliteral{5F}{\isacharunderscore}}theory{\isaliteral{22}{\isachardoublequote}}} \\
  1019     \indexdef{HOL}{command}{inductive\_set}\hypertarget{command.HOL.inductive-set}{\hyperlink{command.HOL.inductive-set}{\mbox{\isa{\isacommand{inductive{\isaliteral{5F}{\isacharunderscore}}set}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}local{\isaliteral{5F}{\isacharunderscore}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ local{\isaliteral{5F}{\isacharunderscore}}theory{\isaliteral{22}{\isachardoublequote}}} \\
  1020     \indexdef{HOL}{command}{coinductive}\hypertarget{command.HOL.coinductive}{\hyperlink{command.HOL.coinductive}{\mbox{\isa{\isacommand{coinductive}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}local{\isaliteral{5F}{\isacharunderscore}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ local{\isaliteral{5F}{\isacharunderscore}}theory{\isaliteral{22}{\isachardoublequote}}} \\
  1021     \indexdef{HOL}{command}{coinductive\_set}\hypertarget{command.HOL.coinductive-set}{\hyperlink{command.HOL.coinductive-set}{\mbox{\isa{\isacommand{coinductive{\isaliteral{5F}{\isacharunderscore}}set}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}local{\isaliteral{5F}{\isacharunderscore}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ local{\isaliteral{5F}{\isacharunderscore}}theory{\isaliteral{22}{\isachardoublequote}}} \\
  1022     \indexdef{HOL}{attribute}{mono}\hypertarget{attribute.HOL.mono}{\hyperlink{attribute.HOL.mono}{\mbox{\isa{mono}}}} & : & \isa{attribute} \\
  1023   \end{matharray}
  1024 
  1025   \begin{railoutput}
  1026 \rail@begin{7}{\isa{}}
  1027 \rail@bar
  1028 \rail@term{\hyperlink{command.HOL.inductive}{\mbox{\isa{\isacommand{inductive}}}}}[]
  1029 \rail@nextbar{1}
  1030 \rail@term{\hyperlink{command.HOL.inductive-set}{\mbox{\isa{\isacommand{inductive{\isaliteral{5F}{\isacharunderscore}}set}}}}}[]
  1031 \rail@nextbar{2}
  1032 \rail@term{\hyperlink{command.HOL.coinductive}{\mbox{\isa{\isacommand{coinductive}}}}}[]
  1033 \rail@nextbar{3}
  1034 \rail@term{\hyperlink{command.HOL.coinductive-set}{\mbox{\isa{\isacommand{coinductive{\isaliteral{5F}{\isacharunderscore}}set}}}}}[]
  1035 \rail@endbar
  1036 \rail@bar
  1037 \rail@nextbar{1}
  1038 \rail@nont{\hyperlink{syntax.target}{\mbox{\isa{target}}}}[]
  1039 \rail@endbar
  1040 \rail@nont{\hyperlink{syntax.fixes}{\mbox{\isa{fixes}}}}[]
  1041 \rail@bar
  1042 \rail@nextbar{1}
  1043 \rail@term{\isa{\isakeyword{for}}}[]
  1044 \rail@nont{\hyperlink{syntax.fixes}{\mbox{\isa{fixes}}}}[]
  1045 \rail@endbar
  1046 \rail@cr{5}
  1047 \rail@bar
  1048 \rail@nextbar{6}
  1049 \rail@term{\isa{\isakeyword{where}}}[]
  1050 \rail@nont{\isa{clauses}}[]
  1051 \rail@endbar
  1052 \rail@bar
  1053 \rail@nextbar{6}
  1054 \rail@term{\isa{\isakeyword{monos}}}[]
  1055 \rail@nont{\hyperlink{syntax.thmrefs}{\mbox{\isa{thmrefs}}}}[]
  1056 \rail@endbar
  1057 \rail@end
  1058 \rail@begin{3}{\isa{clauses}}
  1059 \rail@plus
  1060 \rail@bar
  1061 \rail@nextbar{1}
  1062 \rail@nont{\hyperlink{syntax.thmdecl}{\mbox{\isa{thmdecl}}}}[]
  1063 \rail@endbar
  1064 \rail@nont{\hyperlink{syntax.prop}{\mbox{\isa{prop}}}}[]
  1065 \rail@nextplus{2}
  1066 \rail@cterm{\isa{{\isaliteral{7C}{\isacharbar}}}}[]
  1067 \rail@endplus
  1068 \rail@end
  1069 \rail@begin{3}{\isa{}}
  1070 \rail@term{\hyperlink{attribute.HOL.mono}{\mbox{\isa{mono}}}}[]
  1071 \rail@bar
  1072 \rail@nextbar{1}
  1073 \rail@term{\isa{add}}[]
  1074 \rail@nextbar{2}
  1075 \rail@term{\isa{del}}[]
  1076 \rail@endbar
  1077 \rail@end
  1078 \end{railoutput}
  1079 
  1080 
  1081   \begin{description}
  1082 
  1083   \item \hyperlink{command.HOL.inductive}{\mbox{\isa{\isacommand{inductive}}}} and \hyperlink{command.HOL.coinductive}{\mbox{\isa{\isacommand{coinductive}}}} define (co)inductive predicates from the
  1084   introduction rules given in the \hyperlink{keyword.where}{\mbox{\isa{\isakeyword{where}}}} part.  The
  1085   optional \hyperlink{keyword.for}{\mbox{\isa{\isakeyword{for}}}} part contains a list of parameters of the
  1086   (co)inductive predicates that remain fixed throughout the
  1087   definition.  The optional \hyperlink{keyword.monos}{\mbox{\isa{\isakeyword{monos}}}} section contains
  1088   \emph{monotonicity theorems}, which are required for each operator
  1089   applied to a recursive set in the introduction rules.  There
  1090   \emph{must} be a theorem of the form \isa{{\isaliteral{22}{\isachardoublequote}}A\ {\isaliteral{5C3C6C653E}{\isasymle}}\ B\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ M\ A\ {\isaliteral{5C3C6C653E}{\isasymle}}\ M\ B{\isaliteral{22}{\isachardoublequote}}},
  1091   for each premise \isa{{\isaliteral{22}{\isachardoublequote}}M\ R\isaliteral{5C3C5E7375623E}{}\isactrlsub i\ t{\isaliteral{22}{\isachardoublequote}}} in an introduction rule!
  1092 
  1093   \item \hyperlink{command.HOL.inductive-set}{\mbox{\isa{\isacommand{inductive{\isaliteral{5F}{\isacharunderscore}}set}}}} and \hyperlink{command.HOL.coinductive-set}{\mbox{\isa{\isacommand{coinductive{\isaliteral{5F}{\isacharunderscore}}set}}}} are wrappers for to the previous commands,
  1094   allowing the definition of (co)inductive sets.
  1095 
  1096   \item \hyperlink{attribute.HOL.mono}{\mbox{\isa{mono}}} declares monotonicity rules.  These
  1097   rule are involved in the automated monotonicity proof of \hyperlink{command.HOL.inductive}{\mbox{\isa{\isacommand{inductive}}}}.
  1098 
  1099   \end{description}%
  1100 \end{isamarkuptext}%
  1101 \isamarkuptrue%
  1102 %
  1103 \isamarkupsubsection{Derived rules%
  1104 }
  1105 \isamarkuptrue%
  1106 %
  1107 \begin{isamarkuptext}%
  1108 Each (co)inductive definition \isa{R} adds definitions to the
  1109   theory and also proves some theorems:
  1110 
  1111   \begin{description}
  1112 
  1113   \item \isa{R{\isaliteral{2E}{\isachardot}}intros} is the list of introduction rules as proven
  1114   theorems, for the recursive predicates (or sets).  The rules are
  1115   also available individually, using the names given them in the
  1116   theory file;
  1117 
  1118   \item \isa{R{\isaliteral{2E}{\isachardot}}cases} is the case analysis (or elimination) rule;
  1119 
  1120   \item \isa{R{\isaliteral{2E}{\isachardot}}induct} or \isa{R{\isaliteral{2E}{\isachardot}}coinduct} is the (co)induction
  1121   rule.
  1122 
  1123   \end{description}
  1124 
  1125   When several predicates \isa{{\isaliteral{22}{\isachardoublequote}}R\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{2C}{\isacharcomma}}\ R\isaliteral{5C3C5E7375623E}{}\isactrlsub n{\isaliteral{22}{\isachardoublequote}}} are
  1126   defined simultaneously, the list of introduction rules is called
  1127   \isa{{\isaliteral{22}{\isachardoublequote}}R\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}{\isaliteral{5F}{\isacharunderscore}}{\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{5F}{\isacharunderscore}}R\isaliteral{5C3C5E7375623E}{}\isactrlsub n{\isaliteral{2E}{\isachardot}}intros{\isaliteral{22}{\isachardoublequote}}}, the case analysis rules are
  1128   called \isa{{\isaliteral{22}{\isachardoublequote}}R\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}{\isaliteral{2E}{\isachardot}}cases{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{2C}{\isacharcomma}}\ R\isaliteral{5C3C5E7375623E}{}\isactrlsub n{\isaliteral{2E}{\isachardot}}cases{\isaliteral{22}{\isachardoublequote}}}, and the list
  1129   of mutual induction rules is called \isa{{\isaliteral{22}{\isachardoublequote}}R\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}{\isaliteral{5F}{\isacharunderscore}}{\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{5F}{\isacharunderscore}}R\isaliteral{5C3C5E7375623E}{}\isactrlsub n{\isaliteral{2E}{\isachardot}}inducts{\isaliteral{22}{\isachardoublequote}}}.%
  1130 \end{isamarkuptext}%
  1131 \isamarkuptrue%
  1132 %
  1133 \isamarkupsubsection{Monotonicity theorems%
  1134 }
  1135 \isamarkuptrue%
  1136 %
  1137 \begin{isamarkuptext}%
  1138 Each theory contains a default set of theorems that are used in
  1139   monotonicity proofs.  New rules can be added to this set via the
  1140   \hyperlink{attribute.HOL.mono}{\mbox{\isa{mono}}} attribute.  The HOL theory \isa{Inductive}
  1141   shows how this is done.  In general, the following monotonicity
  1142   theorems may be added:
  1143 
  1144   \begin{itemize}
  1145 
  1146   \item Theorems of the form \isa{{\isaliteral{22}{\isachardoublequote}}A\ {\isaliteral{5C3C6C653E}{\isasymle}}\ B\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ M\ A\ {\isaliteral{5C3C6C653E}{\isasymle}}\ M\ B{\isaliteral{22}{\isachardoublequote}}}, for proving
  1147   monotonicity of inductive definitions whose introduction rules have
  1148   premises involving terms such as \isa{{\isaliteral{22}{\isachardoublequote}}M\ R\isaliteral{5C3C5E7375623E}{}\isactrlsub i\ t{\isaliteral{22}{\isachardoublequote}}}.
  1149 
  1150   \item Monotonicity theorems for logical operators, which are of the
  1151   general form \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{22}{\isachardoublequote}}}.  For example, in
  1152   the case of the operator \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6F723E}{\isasymor}}{\isaliteral{22}{\isachardoublequote}}}, the corresponding theorem is
  1153   \[
  1154   \infer{\isa{{\isaliteral{22}{\isachardoublequote}}P\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}\ {\isaliteral{5C3C6F723E}{\isasymor}}\ P\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{2}}\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ Q\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}\ {\isaliteral{5C3C6F723E}{\isasymor}}\ Q\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{2}}{\isaliteral{22}{\isachardoublequote}}}}{\isa{{\isaliteral{22}{\isachardoublequote}}P\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ Q\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}P\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{2}}\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ Q\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{2}}{\isaliteral{22}{\isachardoublequote}}}}
  1155   \]
  1156 
  1157   \item De Morgan style equations for reasoning about the ``polarity''
  1158   of expressions, e.g.
  1159   \[
  1160   \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6E6F743E}{\isasymnot}}\ {\isaliteral{5C3C6E6F743E}{\isasymnot}}\ P\ {\isaliteral{5C3C6C6F6E676C65667472696768746172726F773E}{\isasymlongleftrightarrow}}\ P{\isaliteral{22}{\isachardoublequote}}} \qquad\qquad
  1161   \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6E6F743E}{\isasymnot}}\ {\isaliteral{28}{\isacharparenleft}}P\ {\isaliteral{5C3C616E643E}{\isasymand}}\ Q{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C6C6F6E676C65667472696768746172726F773E}{\isasymlongleftrightarrow}}\ {\isaliteral{5C3C6E6F743E}{\isasymnot}}\ P\ {\isaliteral{5C3C6F723E}{\isasymor}}\ {\isaliteral{5C3C6E6F743E}{\isasymnot}}\ Q{\isaliteral{22}{\isachardoublequote}}}
  1162   \]
  1163 
  1164   \item Equations for reducing complex operators to more primitive
  1165   ones whose monotonicity can easily be proved, e.g.
  1166   \[
  1167   \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}P\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ Q{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C6C6F6E676C65667472696768746172726F773E}{\isasymlongleftrightarrow}}\ {\isaliteral{5C3C6E6F743E}{\isasymnot}}\ P\ {\isaliteral{5C3C6F723E}{\isasymor}}\ Q{\isaliteral{22}{\isachardoublequote}}} \qquad\qquad
  1168   \isa{{\isaliteral{22}{\isachardoublequote}}Ball\ A\ P\ {\isaliteral{5C3C65717569763E}{\isasymequiv}}\ {\isaliteral{5C3C666F72616C6C3E}{\isasymforall}}x{\isaliteral{2E}{\isachardot}}\ x\ {\isaliteral{5C3C696E3E}{\isasymin}}\ A\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ P\ x{\isaliteral{22}{\isachardoublequote}}}
  1169   \]
  1170 
  1171   \end{itemize}
  1172 
  1173   %FIXME: Example of an inductive definition%
  1174 \end{isamarkuptext}%
  1175 \isamarkuptrue%
  1176 %
  1177 \isamarkupsection{Arithmetic proof support%
  1178 }
  1179 \isamarkuptrue%
  1180 %
  1181 \begin{isamarkuptext}%
  1182 \begin{matharray}{rcl}
  1183     \indexdef{HOL}{method}{arith}\hypertarget{method.HOL.arith}{\hyperlink{method.HOL.arith}{\mbox{\isa{arith}}}} & : & \isa{method} \\
  1184     \indexdef{HOL}{attribute}{arith}\hypertarget{attribute.HOL.arith}{\hyperlink{attribute.HOL.arith}{\mbox{\isa{arith}}}} & : & \isa{attribute} \\
  1185     \indexdef{HOL}{attribute}{arith\_split}\hypertarget{attribute.HOL.arith-split}{\hyperlink{attribute.HOL.arith-split}{\mbox{\isa{arith{\isaliteral{5F}{\isacharunderscore}}split}}}} & : & \isa{attribute} \\
  1186   \end{matharray}
  1187 
  1188   The \hyperlink{method.HOL.arith}{\mbox{\isa{arith}}} method decides linear arithmetic problems
  1189   (on types \isa{nat}, \isa{int}, \isa{real}).  Any current
  1190   facts are inserted into the goal before running the procedure.
  1191 
  1192   The \hyperlink{attribute.HOL.arith}{\mbox{\isa{arith}}} attribute declares facts that are
  1193   always supplied to the arithmetic provers implicitly.
  1194 
  1195   The \hyperlink{attribute.HOL.arith-split}{\mbox{\isa{arith{\isaliteral{5F}{\isacharunderscore}}split}}} attribute declares case split
  1196   rules to be expanded before \hyperlink{method.HOL.arith}{\mbox{\isa{arith}}} is invoked.
  1197 
  1198   Note that a simpler (but faster) arithmetic prover is
  1199   already invoked by the Simplifier.%
  1200 \end{isamarkuptext}%
  1201 \isamarkuptrue%
  1202 %
  1203 \isamarkupsection{Intuitionistic proof search%
  1204 }
  1205 \isamarkuptrue%
  1206 %
  1207 \begin{isamarkuptext}%
  1208 \begin{matharray}{rcl}
  1209     \indexdef{HOL}{method}{iprover}\hypertarget{method.HOL.iprover}{\hyperlink{method.HOL.iprover}{\mbox{\isa{iprover}}}} & : & \isa{method} \\
  1210   \end{matharray}
  1211 
  1212   \begin{railoutput}
  1213 \rail@begin{2}{\isa{}}
  1214 \rail@term{\hyperlink{method.HOL.iprover}{\mbox{\isa{iprover}}}}[]
  1215 \rail@plus
  1216 \rail@nextplus{1}
  1217 \rail@cnont{\hyperlink{syntax.rulemod}{\mbox{\isa{rulemod}}}}[]
  1218 \rail@endplus
  1219 \rail@end
  1220 \end{railoutput}
  1221 
  1222 
  1223   The \hyperlink{method.HOL.iprover}{\mbox{\isa{iprover}}} method performs intuitionistic proof
  1224   search, depending on specifically declared rules from the context,
  1225   or given as explicit arguments.  Chained facts are inserted into the
  1226   goal before commencing proof search.
  1227 
  1228   Rules need to be classified as \hyperlink{attribute.Pure.intro}{\mbox{\isa{intro}}},
  1229   \hyperlink{attribute.Pure.elim}{\mbox{\isa{elim}}}, or \hyperlink{attribute.Pure.dest}{\mbox{\isa{dest}}}; here the
  1230   ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{21}{\isacharbang}}{\isaliteral{22}{\isachardoublequote}}}'' indicator refers to ``safe'' rules, which may be
  1231   applied aggressively (without considering back-tracking later).
  1232   Rules declared with ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{3F}{\isacharquery}}{\isaliteral{22}{\isachardoublequote}}}'' are ignored in proof search (the
  1233   single-step \hyperlink{method.Pure.rule}{\mbox{\isa{rule}}} method still observes these).  An
  1234   explicit weight annotation may be given as well; otherwise the
  1235   number of rule premises will be taken into account here.%
  1236 \end{isamarkuptext}%
  1237 \isamarkuptrue%
  1238 %
  1239 \isamarkupsection{Coherent Logic%
  1240 }
  1241 \isamarkuptrue%
  1242 %
  1243 \begin{isamarkuptext}%
  1244 \begin{matharray}{rcl}
  1245     \indexdef{HOL}{method}{coherent}\hypertarget{method.HOL.coherent}{\hyperlink{method.HOL.coherent}{\mbox{\isa{coherent}}}} & : & \isa{method} \\
  1246   \end{matharray}
  1247 
  1248   \begin{railoutput}
  1249 \rail@begin{2}{\isa{}}
  1250 \rail@term{\hyperlink{method.HOL.coherent}{\mbox{\isa{coherent}}}}[]
  1251 \rail@bar
  1252 \rail@nextbar{1}
  1253 \rail@nont{\hyperlink{syntax.thmrefs}{\mbox{\isa{thmrefs}}}}[]
  1254 \rail@endbar
  1255 \rail@end
  1256 \end{railoutput}
  1257 
  1258 
  1259   The \hyperlink{method.HOL.coherent}{\mbox{\isa{coherent}}} method solves problems of
  1260   \emph{Coherent Logic} \cite{Bezem-Coquand:2005}, which covers
  1261   applications in confluence theory, lattice theory and projective
  1262   geometry.  See \verb|~~/src/HOL/ex/Coherent.thy| for some
  1263   examples.%
  1264 \end{isamarkuptext}%
  1265 \isamarkuptrue%
  1266 %
  1267 \isamarkupsection{Proving propositions%
  1268 }
  1269 \isamarkuptrue%
  1270 %
  1271 \begin{isamarkuptext}%
  1272 In addition to the standard proof methods, a number of diagnosis
  1273   tools search for proofs and provide an Isar proof snippet on success.
  1274   These tools are available via the following commands.
  1275 
  1276   \begin{matharray}{rcl}
  1277     \indexdef{HOL}{command}{solve\_direct}\hypertarget{command.HOL.solve-direct}{\hyperlink{command.HOL.solve-direct}{\mbox{\isa{\isacommand{solve{\isaliteral{5F}{\isacharunderscore}}direct}}}}}\isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7375703E}{}\isactrlsup {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}proof\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}{\isaliteral{22}{\isachardoublequote}}} \\
  1278     \indexdef{HOL}{command}{try}\hypertarget{command.HOL.try}{\hyperlink{command.HOL.try}{\mbox{\isa{\isacommand{try}}}}}\isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7375703E}{}\isactrlsup {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}proof\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}{\isaliteral{22}{\isachardoublequote}}} \\
  1279     \indexdef{HOL}{command}{sledgehammer}\hypertarget{command.HOL.sledgehammer}{\hyperlink{command.HOL.sledgehammer}{\mbox{\isa{\isacommand{sledgehammer}}}}}\isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7375703E}{}\isactrlsup {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}proof\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}{\isaliteral{22}{\isachardoublequote}}} \\
  1280     \indexdef{HOL}{command}{sledgehammer\_params}\hypertarget{command.HOL.sledgehammer-params}{\hyperlink{command.HOL.sledgehammer-params}{\mbox{\isa{\isacommand{sledgehammer{\isaliteral{5F}{\isacharunderscore}}params}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}}
  1281   \end{matharray}
  1282 
  1283   \begin{railoutput}
  1284 \rail@begin{6}{\isa{}}
  1285 \rail@term{\hyperlink{command.HOL.try}{\mbox{\isa{\isacommand{try}}}}}[]
  1286 \rail@bar
  1287 \rail@nextbar{1}
  1288 \rail@plus
  1289 \rail@bar
  1290 \rail@term{\isa{simp}}[]
  1291 \rail@nextbar{2}
  1292 \rail@term{\isa{intro}}[]
  1293 \rail@nextbar{3}
  1294 \rail@term{\isa{elim}}[]
  1295 \rail@nextbar{4}
  1296 \rail@term{\isa{dest}}[]
  1297 \rail@endbar
  1298 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}}}[]
  1299 \rail@nont{\hyperlink{syntax.thmrefs}{\mbox{\isa{thmrefs}}}}[]
  1300 \rail@nextplus{5}
  1301 \rail@endplus
  1302 \rail@endbar
  1303 \rail@bar
  1304 \rail@nextbar{1}
  1305 \rail@nont{\hyperlink{syntax.nat}{\mbox{\isa{nat}}}}[]
  1306 \rail@endbar
  1307 \rail@end
  1308 \rail@begin{2}{\isa{}}
  1309 \rail@term{\hyperlink{command.HOL.sledgehammer}{\mbox{\isa{\isacommand{sledgehammer}}}}}[]
  1310 \rail@bar
  1311 \rail@nextbar{1}
  1312 \rail@term{\isa{{\isaliteral{5B}{\isacharbrackleft}}}}[]
  1313 \rail@nont{\isa{args}}[]
  1314 \rail@term{\isa{{\isaliteral{5D}{\isacharbrackright}}}}[]
  1315 \rail@endbar
  1316 \rail@bar
  1317 \rail@nextbar{1}
  1318 \rail@nont{\isa{facts}}[]
  1319 \rail@endbar
  1320 \rail@bar
  1321 \rail@nextbar{1}
  1322 \rail@nont{\hyperlink{syntax.nat}{\mbox{\isa{nat}}}}[]
  1323 \rail@endbar
  1324 \rail@end
  1325 \rail@begin{2}{\isa{}}
  1326 \rail@term{\hyperlink{command.HOL.sledgehammer-params}{\mbox{\isa{\isacommand{sledgehammer{\isaliteral{5F}{\isacharunderscore}}params}}}}}[]
  1327 \rail@bar
  1328 \rail@nextbar{1}
  1329 \rail@term{\isa{{\isaliteral{5B}{\isacharbrackleft}}}}[]
  1330 \rail@nont{\isa{args}}[]
  1331 \rail@term{\isa{{\isaliteral{5D}{\isacharbrackright}}}}[]
  1332 \rail@endbar
  1333 \rail@end
  1334 \rail@begin{2}{\isa{args}}
  1335 \rail@plus
  1336 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1337 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
  1338 \rail@nont{\isa{value}}[]
  1339 \rail@nextplus{1}
  1340 \rail@cterm{\isa{{\isaliteral{2C}{\isacharcomma}}}}[]
  1341 \rail@endplus
  1342 \rail@end
  1343 \rail@begin{5}{\isa{facts}}
  1344 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  1345 \rail@bar
  1346 \rail@nextbar{1}
  1347 \rail@plus
  1348 \rail@bar
  1349 \rail@nextbar{2}
  1350 \rail@bar
  1351 \rail@term{\isa{add}}[]
  1352 \rail@nextbar{3}
  1353 \rail@term{\isa{del}}[]
  1354 \rail@endbar
  1355 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}}}[]
  1356 \rail@endbar
  1357 \rail@nont{\hyperlink{syntax.thmrefs}{\mbox{\isa{thmrefs}}}}[]
  1358 \rail@nextplus{4}
  1359 \rail@endplus
  1360 \rail@endbar
  1361 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  1362 \rail@end
  1363 \end{railoutput}
  1364  % FIXME try: proper clasimpmod!?
  1365   % FIXME check args "value"
  1366 
  1367   \begin{description}
  1368 
  1369   \item \hyperlink{command.HOL.solve-direct}{\mbox{\isa{\isacommand{solve{\isaliteral{5F}{\isacharunderscore}}direct}}}} checks whether the current subgoals can
  1370     be solved directly by an existing theorem. Duplicate lemmas can be detected
  1371     in this way.
  1372 
  1373   \item \hyperlink{command.HOL.try}{\mbox{\isa{\isacommand{try}}}} attempts to prove a subgoal using a combination
  1374     of standard proof methods (\isa{auto}, \isa{simp}, \isa{blast}, etc.).
  1375     Additional facts supplied via \isa{{\isaliteral{22}{\isachardoublequote}}simp{\isaliteral{3A}{\isacharcolon}}{\isaliteral{22}{\isachardoublequote}}}, \isa{{\isaliteral{22}{\isachardoublequote}}intro{\isaliteral{3A}{\isacharcolon}}{\isaliteral{22}{\isachardoublequote}}},
  1376     \isa{{\isaliteral{22}{\isachardoublequote}}elim{\isaliteral{3A}{\isacharcolon}}{\isaliteral{22}{\isachardoublequote}}}, and \isa{{\isaliteral{22}{\isachardoublequote}}dest{\isaliteral{3A}{\isacharcolon}}{\isaliteral{22}{\isachardoublequote}}} are passed to the appropriate proof
  1377     methods.
  1378 
  1379   \item \hyperlink{command.HOL.sledgehammer}{\mbox{\isa{\isacommand{sledgehammer}}}} attempts to prove a subgoal using external
  1380     automatic provers (resolution provers and SMT solvers). See the Sledgehammer
  1381     manual \cite{isabelle-sledgehammer} for details.
  1382 
  1383   \item \hyperlink{command.HOL.sledgehammer-params}{\mbox{\isa{\isacommand{sledgehammer{\isaliteral{5F}{\isacharunderscore}}params}}}} changes
  1384     \hyperlink{command.HOL.sledgehammer}{\mbox{\isa{\isacommand{sledgehammer}}}} configuration options persistently.
  1385 
  1386   \end{description}%
  1387 \end{isamarkuptext}%
  1388 \isamarkuptrue%
  1389 %
  1390 \isamarkupsection{Checking and refuting propositions%
  1391 }
  1392 \isamarkuptrue%
  1393 %
  1394 \begin{isamarkuptext}%
  1395 Identifying incorrect propositions usually involves evaluation of
  1396   particular assignments and systematic counterexample search.  This
  1397   is supported by the following commands.
  1398 
  1399   \begin{matharray}{rcl}
  1400     \indexdef{HOL}{command}{value}\hypertarget{command.HOL.value}{\hyperlink{command.HOL.value}{\mbox{\isa{\isacommand{value}}}}}\isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7375703E}{}\isactrlsup {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}context\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}{\isaliteral{22}{\isachardoublequote}}} \\
  1401     \indexdef{HOL}{command}{quickcheck}\hypertarget{command.HOL.quickcheck}{\hyperlink{command.HOL.quickcheck}{\mbox{\isa{\isacommand{quickcheck}}}}}\isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7375703E}{}\isactrlsup {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}proof\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}{\isaliteral{22}{\isachardoublequote}}} \\
  1402     \indexdef{HOL}{command}{refute}\hypertarget{command.HOL.refute}{\hyperlink{command.HOL.refute}{\mbox{\isa{\isacommand{refute}}}}}\isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7375703E}{}\isactrlsup {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}proof\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}{\isaliteral{22}{\isachardoublequote}}} \\
  1403     \indexdef{HOL}{command}{nitpick}\hypertarget{command.HOL.nitpick}{\hyperlink{command.HOL.nitpick}{\mbox{\isa{\isacommand{nitpick}}}}}\isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7375703E}{}\isactrlsup {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}proof\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}{\isaliteral{22}{\isachardoublequote}}} \\
  1404     \indexdef{HOL}{command}{quickcheck\_params}\hypertarget{command.HOL.quickcheck-params}{\hyperlink{command.HOL.quickcheck-params}{\mbox{\isa{\isacommand{quickcheck{\isaliteral{5F}{\isacharunderscore}}params}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}} \\
  1405     \indexdef{HOL}{command}{refute\_params}\hypertarget{command.HOL.refute-params}{\hyperlink{command.HOL.refute-params}{\mbox{\isa{\isacommand{refute{\isaliteral{5F}{\isacharunderscore}}params}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}} \\
  1406     \indexdef{HOL}{command}{nitpick\_params}\hypertarget{command.HOL.nitpick-params}{\hyperlink{command.HOL.nitpick-params}{\mbox{\isa{\isacommand{nitpick{\isaliteral{5F}{\isacharunderscore}}params}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}}
  1407   \end{matharray}
  1408 
  1409   \begin{railoutput}
  1410 \rail@begin{2}{\isa{}}
  1411 \rail@term{\hyperlink{command.HOL.value}{\mbox{\isa{\isacommand{value}}}}}[]
  1412 \rail@bar
  1413 \rail@nextbar{1}
  1414 \rail@term{\isa{{\isaliteral{5B}{\isacharbrackleft}}}}[]
  1415 \rail@nont{\isa{name}}[]
  1416 \rail@term{\isa{{\isaliteral{5D}{\isacharbrackright}}}}[]
  1417 \rail@endbar
  1418 \rail@bar
  1419 \rail@nextbar{1}
  1420 \rail@nont{\isa{modes}}[]
  1421 \rail@endbar
  1422 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  1423 \rail@end
  1424 \rail@begin{3}{\isa{}}
  1425 \rail@bar
  1426 \rail@term{\hyperlink{command.HOL.quickcheck}{\mbox{\isa{\isacommand{quickcheck}}}}}[]
  1427 \rail@nextbar{1}
  1428 \rail@term{\hyperlink{command.HOL.refute}{\mbox{\isa{\isacommand{refute}}}}}[]
  1429 \rail@nextbar{2}
  1430 \rail@term{\hyperlink{command.HOL.nitpick}{\mbox{\isa{\isacommand{nitpick}}}}}[]
  1431 \rail@endbar
  1432 \rail@bar
  1433 \rail@nextbar{1}
  1434 \rail@term{\isa{{\isaliteral{5B}{\isacharbrackleft}}}}[]
  1435 \rail@nont{\isa{args}}[]
  1436 \rail@term{\isa{{\isaliteral{5D}{\isacharbrackright}}}}[]
  1437 \rail@endbar
  1438 \rail@bar
  1439 \rail@nextbar{1}
  1440 \rail@nont{\hyperlink{syntax.nat}{\mbox{\isa{nat}}}}[]
  1441 \rail@endbar
  1442 \rail@end
  1443 \rail@begin{3}{\isa{}}
  1444 \rail@bar
  1445 \rail@term{\hyperlink{command.HOL.quickcheck-params}{\mbox{\isa{\isacommand{quickcheck{\isaliteral{5F}{\isacharunderscore}}params}}}}}[]
  1446 \rail@nextbar{1}
  1447 \rail@term{\hyperlink{command.HOL.refute-params}{\mbox{\isa{\isacommand{refute{\isaliteral{5F}{\isacharunderscore}}params}}}}}[]
  1448 \rail@nextbar{2}
  1449 \rail@term{\hyperlink{command.HOL.nitpick-params}{\mbox{\isa{\isacommand{nitpick{\isaliteral{5F}{\isacharunderscore}}params}}}}}[]
  1450 \rail@endbar
  1451 \rail@bar
  1452 \rail@nextbar{1}
  1453 \rail@term{\isa{{\isaliteral{5B}{\isacharbrackleft}}}}[]
  1454 \rail@nont{\isa{args}}[]
  1455 \rail@term{\isa{{\isaliteral{5D}{\isacharbrackright}}}}[]
  1456 \rail@endbar
  1457 \rail@end
  1458 \rail@begin{2}{\isa{modes}}
  1459 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  1460 \rail@plus
  1461 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1462 \rail@nextplus{1}
  1463 \rail@endplus
  1464 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  1465 \rail@end
  1466 \rail@begin{2}{\isa{args}}
  1467 \rail@plus
  1468 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1469 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
  1470 \rail@nont{\isa{value}}[]
  1471 \rail@nextplus{1}
  1472 \rail@cterm{\isa{{\isaliteral{2C}{\isacharcomma}}}}[]
  1473 \rail@endplus
  1474 \rail@end
  1475 \end{railoutput}
  1476  % FIXME check "value"
  1477 
  1478   \begin{description}
  1479 
  1480   \item \hyperlink{command.HOL.value}{\mbox{\isa{\isacommand{value}}}}~\isa{t} evaluates and prints a
  1481     term; optionally \isa{modes} can be specified, which are
  1482     appended to the current print mode (see also \cite{isabelle-ref}).
  1483     Internally, the evaluation is performed by registered evaluators,
  1484     which are invoked sequentially until a result is returned.
  1485     Alternatively a specific evaluator can be selected using square
  1486     brackets; typical evaluators use the current set of code equations
  1487     to normalize and include \isa{simp} for fully symbolic evaluation
  1488     using the simplifier, \isa{nbe} for \emph{normalization by evaluation}
  1489     and \emph{code} for code generation in SML.
  1490 
  1491   \item \hyperlink{command.HOL.quickcheck}{\mbox{\isa{\isacommand{quickcheck}}}} tests the current goal for
  1492     counterexamples using a series of assignments for its
  1493     free variables; by default the first subgoal is tested, an other
  1494     can be selected explicitly using an optional goal index.
  1495     Assignments can be chosen exhausting the search space upto a given
  1496     size or using a fixed number of random assignments in the search space.
  1497     By default, quickcheck uses exhaustive testing.
  1498     A number of configuration options are supported for
  1499     \hyperlink{command.HOL.quickcheck}{\mbox{\isa{\isacommand{quickcheck}}}}, notably:
  1500 
  1501     \begin{description}
  1502 
  1503     \item[\isa{tester}] specifies how to explore the search space
  1504       (e.g. exhaustive or random).
  1505       An unknown configuration option is treated as an argument to tester,
  1506       making \isa{{\isaliteral{22}{\isachardoublequote}}tester\ {\isaliteral{3D}{\isacharequal}}{\isaliteral{22}{\isachardoublequote}}} optional.
  1507     \item[\isa{size}] specifies the maximum size of the search space
  1508     for assignment values.
  1509 
  1510     \item[\isa{eval}] takes a term or a list of terms and evaluates
  1511       these terms under the variable assignment found by quickcheck.
  1512 
  1513     \item[\isa{iterations}] sets how many sets of assignments are
  1514     generated for each particular size.
  1515 
  1516     \item[\isa{no{\isaliteral{5F}{\isacharunderscore}}assms}] specifies whether assumptions in
  1517     structured proofs should be ignored.
  1518 
  1519     \item[\isa{timeout}] sets the time limit in seconds.
  1520 
  1521     \item[\isa{default{\isaliteral{5F}{\isacharunderscore}}type}] sets the type(s) generally used to
  1522     instantiate type variables.
  1523 
  1524     \item[\isa{report}] if set quickcheck reports how many tests
  1525     fulfilled the preconditions.
  1526 
  1527     \item[\isa{quiet}] if not set quickcheck informs about the
  1528     current size for assignment values.
  1529 
  1530     \item[\isa{expect}] can be used to check if the user's
  1531     expectation was met (\isa{no{\isaliteral{5F}{\isacharunderscore}}expectation}, \isa{no{\isaliteral{5F}{\isacharunderscore}}counterexample}, or \isa{counterexample}).
  1532 
  1533     \end{description}
  1534 
  1535     These option can be given within square brackets.
  1536 
  1537   \item \hyperlink{command.HOL.quickcheck-params}{\mbox{\isa{\isacommand{quickcheck{\isaliteral{5F}{\isacharunderscore}}params}}}} changes
  1538     \hyperlink{command.HOL.quickcheck}{\mbox{\isa{\isacommand{quickcheck}}}} configuration options persistently.
  1539 
  1540   \item \hyperlink{command.HOL.refute}{\mbox{\isa{\isacommand{refute}}}} tests the current goal for
  1541     counterexamples using a reduction to SAT. The following configuration
  1542     options are supported:
  1543 
  1544     \begin{description}
  1545 
  1546     \item[\isa{minsize}] specifies the minimum size (cardinality) of the
  1547       models to search for.
  1548 
  1549     \item[\isa{maxsize}] specifies the maximum size (cardinality) of the
  1550       models to search for. Nonpositive values mean $\infty$.
  1551 
  1552     \item[\isa{maxvars}] specifies the maximum number of Boolean variables
  1553     to use when transforming the term into a propositional formula.
  1554     Nonpositive values mean $\infty$.
  1555 
  1556     \item[\isa{satsolver}] specifies the SAT solver to use.
  1557 
  1558     \item[\isa{no{\isaliteral{5F}{\isacharunderscore}}assms}] specifies whether assumptions in
  1559     structured proofs should be ignored.
  1560 
  1561     \item[\isa{maxtime}] sets the time limit in seconds.
  1562 
  1563     \item[\isa{expect}] can be used to check if the user's
  1564     expectation was met (\isa{genuine}, \isa{potential},
  1565     \isa{none}, or \isa{unknown}).
  1566 
  1567     \end{description}
  1568 
  1569     These option can be given within square brackets.
  1570 
  1571   \item \hyperlink{command.HOL.refute-params}{\mbox{\isa{\isacommand{refute{\isaliteral{5F}{\isacharunderscore}}params}}}} changes
  1572     \hyperlink{command.HOL.refute}{\mbox{\isa{\isacommand{refute}}}} configuration options persistently.
  1573 
  1574   \item \hyperlink{command.HOL.nitpick}{\mbox{\isa{\isacommand{nitpick}}}} tests the current goal for counterexamples
  1575     using a reduction to first-order relational logic. See the Nitpick manual
  1576     \cite{isabelle-nitpick} for details.
  1577 
  1578   \item \hyperlink{command.HOL.nitpick-params}{\mbox{\isa{\isacommand{nitpick{\isaliteral{5F}{\isacharunderscore}}params}}}} changes
  1579     \hyperlink{command.HOL.nitpick}{\mbox{\isa{\isacommand{nitpick}}}} configuration options persistently.
  1580 
  1581   \end{description}%
  1582 \end{isamarkuptext}%
  1583 \isamarkuptrue%
  1584 %
  1585 \isamarkupsection{Unstructured case analysis and induction \label{sec:hol-induct-tac}%
  1586 }
  1587 \isamarkuptrue%
  1588 %
  1589 \begin{isamarkuptext}%
  1590 The following tools of Isabelle/HOL support cases analysis and
  1591   induction in unstructured tactic scripts; see also
  1592   \secref{sec:cases-induct} for proper Isar versions of similar ideas.
  1593 
  1594   \begin{matharray}{rcl}
  1595     \indexdef{HOL}{method}{case\_tac}\hypertarget{method.HOL.case-tac}{\hyperlink{method.HOL.case-tac}{\mbox{\isa{case{\isaliteral{5F}{\isacharunderscore}}tac}}}}\isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7375703E}{}\isactrlsup {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}} & : & \isa{method} \\
  1596     \indexdef{HOL}{method}{induct\_tac}\hypertarget{method.HOL.induct-tac}{\hyperlink{method.HOL.induct-tac}{\mbox{\isa{induct{\isaliteral{5F}{\isacharunderscore}}tac}}}}\isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7375703E}{}\isactrlsup {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}} & : & \isa{method} \\
  1597     \indexdef{HOL}{method}{ind\_cases}\hypertarget{method.HOL.ind-cases}{\hyperlink{method.HOL.ind-cases}{\mbox{\isa{ind{\isaliteral{5F}{\isacharunderscore}}cases}}}}\isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7375703E}{}\isactrlsup {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}} & : & \isa{method} \\
  1598     \indexdef{HOL}{command}{inductive\_cases}\hypertarget{command.HOL.inductive-cases}{\hyperlink{command.HOL.inductive-cases}{\mbox{\isa{\isacommand{inductive{\isaliteral{5F}{\isacharunderscore}}cases}}}}}\isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7375703E}{}\isactrlsup {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}local{\isaliteral{5F}{\isacharunderscore}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ local{\isaliteral{5F}{\isacharunderscore}}theory{\isaliteral{22}{\isachardoublequote}}} \\
  1599   \end{matharray}
  1600 
  1601   \begin{railoutput}
  1602 \rail@begin{2}{\isa{}}
  1603 \rail@term{\hyperlink{method.HOL.case-tac}{\mbox{\isa{case{\isaliteral{5F}{\isacharunderscore}}tac}}}}[]
  1604 \rail@bar
  1605 \rail@nextbar{1}
  1606 \rail@nont{\hyperlink{syntax.goalspec}{\mbox{\isa{goalspec}}}}[]
  1607 \rail@endbar
  1608 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  1609 \rail@bar
  1610 \rail@nextbar{1}
  1611 \rail@nont{\isa{rule}}[]
  1612 \rail@endbar
  1613 \rail@end
  1614 \rail@begin{3}{\isa{}}
  1615 \rail@term{\hyperlink{method.HOL.induct-tac}{\mbox{\isa{induct{\isaliteral{5F}{\isacharunderscore}}tac}}}}[]
  1616 \rail@bar
  1617 \rail@nextbar{1}
  1618 \rail@nont{\hyperlink{syntax.goalspec}{\mbox{\isa{goalspec}}}}[]
  1619 \rail@endbar
  1620 \rail@bar
  1621 \rail@nextbar{1}
  1622 \rail@plus
  1623 \rail@nont{\hyperlink{syntax.insts}{\mbox{\isa{insts}}}}[]
  1624 \rail@nextplus{2}
  1625 \rail@cterm{\isa{\isakeyword{and}}}[]
  1626 \rail@endplus
  1627 \rail@endbar
  1628 \rail@bar
  1629 \rail@nextbar{1}
  1630 \rail@nont{\isa{rule}}[]
  1631 \rail@endbar
  1632 \rail@end
  1633 \rail@begin{3}{\isa{}}
  1634 \rail@term{\hyperlink{method.HOL.ind-cases}{\mbox{\isa{ind{\isaliteral{5F}{\isacharunderscore}}cases}}}}[]
  1635 \rail@plus
  1636 \rail@nont{\hyperlink{syntax.prop}{\mbox{\isa{prop}}}}[]
  1637 \rail@nextplus{1}
  1638 \rail@endplus
  1639 \rail@bar
  1640 \rail@nextbar{1}
  1641 \rail@term{\isa{\isakeyword{for}}}[]
  1642 \rail@plus
  1643 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1644 \rail@nextplus{2}
  1645 \rail@endplus
  1646 \rail@endbar
  1647 \rail@end
  1648 \rail@begin{3}{\isa{}}
  1649 \rail@term{\hyperlink{command.HOL.inductive-cases}{\mbox{\isa{\isacommand{inductive{\isaliteral{5F}{\isacharunderscore}}cases}}}}}[]
  1650 \rail@plus
  1651 \rail@bar
  1652 \rail@nextbar{1}
  1653 \rail@nont{\hyperlink{syntax.thmdecl}{\mbox{\isa{thmdecl}}}}[]
  1654 \rail@endbar
  1655 \rail@plus
  1656 \rail@nont{\hyperlink{syntax.prop}{\mbox{\isa{prop}}}}[]
  1657 \rail@nextplus{1}
  1658 \rail@endplus
  1659 \rail@nextplus{2}
  1660 \rail@cterm{\isa{\isakeyword{and}}}[]
  1661 \rail@endplus
  1662 \rail@end
  1663 \rail@begin{1}{\isa{rule}}
  1664 \rail@term{\isa{rule}}[]
  1665 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}}}[]
  1666 \rail@nont{\hyperlink{syntax.thmref}{\mbox{\isa{thmref}}}}[]
  1667 \rail@end
  1668 \end{railoutput}
  1669 
  1670 
  1671   \begin{description}
  1672 
  1673   \item \hyperlink{method.HOL.case-tac}{\mbox{\isa{case{\isaliteral{5F}{\isacharunderscore}}tac}}} and \hyperlink{method.HOL.induct-tac}{\mbox{\isa{induct{\isaliteral{5F}{\isacharunderscore}}tac}}} admit
  1674   to reason about inductive types.  Rules are selected according to
  1675   the declarations by the \hyperlink{attribute.cases}{\mbox{\isa{cases}}} and \hyperlink{attribute.induct}{\mbox{\isa{induct}}}
  1676   attributes, cf.\ \secref{sec:cases-induct}.  The \hyperlink{command.HOL.datatype}{\mbox{\isa{\isacommand{datatype}}}} package already takes care of this.
  1677 
  1678   These unstructured tactics feature both goal addressing and dynamic
  1679   instantiation.  Note that named rule cases are \emph{not} provided
  1680   as would be by the proper \hyperlink{method.cases}{\mbox{\isa{cases}}} and \hyperlink{method.induct}{\mbox{\isa{induct}}} proof
  1681   methods (see \secref{sec:cases-induct}).  Unlike the \hyperlink{method.induct}{\mbox{\isa{induct}}} method, \hyperlink{method.induct-tac}{\mbox{\isa{induct{\isaliteral{5F}{\isacharunderscore}}tac}}} does not handle structured rule
  1682   statements, only the compact object-logic conclusion of the subgoal
  1683   being addressed.
  1684 
  1685   \item \hyperlink{method.HOL.ind-cases}{\mbox{\isa{ind{\isaliteral{5F}{\isacharunderscore}}cases}}} and \hyperlink{command.HOL.inductive-cases}{\mbox{\isa{\isacommand{inductive{\isaliteral{5F}{\isacharunderscore}}cases}}}} provide an interface to the internal \verb|mk_cases| operation.  Rules are simplified in an unrestricted
  1686   forward manner.
  1687 
  1688   While \hyperlink{method.HOL.ind-cases}{\mbox{\isa{ind{\isaliteral{5F}{\isacharunderscore}}cases}}} is a proof method to apply the
  1689   result immediately as elimination rules, \hyperlink{command.HOL.inductive-cases}{\mbox{\isa{\isacommand{inductive{\isaliteral{5F}{\isacharunderscore}}cases}}}} provides case split theorems at the theory level
  1690   for later use.  The \hyperlink{keyword.for}{\mbox{\isa{\isakeyword{for}}}} argument of the \hyperlink{method.HOL.ind-cases}{\mbox{\isa{ind{\isaliteral{5F}{\isacharunderscore}}cases}}} method allows to specify a list of variables that should
  1691   be generalized before applying the resulting rule.
  1692 
  1693   \end{description}%
  1694 \end{isamarkuptext}%
  1695 \isamarkuptrue%
  1696 %
  1697 \isamarkupsection{Executable code%
  1698 }
  1699 \isamarkuptrue%
  1700 %
  1701 \begin{isamarkuptext}%
  1702 For validation purposes, it is often useful to \emph{execute}
  1703   specifications.  In principle, execution could be simulated by
  1704   Isabelle's inference kernel, i.e. by a combination of resolution and
  1705   simplification.  Unfortunately, this approach is rather inefficient.
  1706   A more efficient way of executing specifications is to translate
  1707   them into a functional programming language such as ML.
  1708 
  1709   Isabelle provides two generic frameworks to support code generation
  1710   from executable specifications.  Isabelle/HOL instantiates these
  1711   mechanisms in a way that is amenable to end-user applications.%
  1712 \end{isamarkuptext}%
  1713 \isamarkuptrue%
  1714 %
  1715 \isamarkupsubsection{The new code generator (F. Haftmann)%
  1716 }
  1717 \isamarkuptrue%
  1718 %
  1719 \begin{isamarkuptext}%
  1720 This framework generates code from functional programs
  1721   (including overloading using type classes) to SML \cite{SML}, OCaml
  1722   \cite{OCaml}, Haskell \cite{haskell-revised-report} and Scala
  1723   \cite{scala-overview-tech-report}.  Conceptually, code generation is
  1724   split up in three steps: \emph{selection} of code theorems,
  1725   \emph{translation} into an abstract executable view and
  1726   \emph{serialization} to a specific \emph{target language}.
  1727   Inductive specifications can be executed using the predicate
  1728   compiler which operates within HOL.  See \cite{isabelle-codegen} for
  1729   an introduction.
  1730 
  1731   \begin{matharray}{rcl}
  1732     \indexdef{HOL}{command}{export\_code}\hypertarget{command.HOL.export-code}{\hyperlink{command.HOL.export-code}{\mbox{\isa{\isacommand{export{\isaliteral{5F}{\isacharunderscore}}code}}}}}\isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7375703E}{}\isactrlsup {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}context\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}{\isaliteral{22}{\isachardoublequote}}} \\
  1733     \indexdef{HOL}{attribute}{code}\hypertarget{attribute.HOL.code}{\hyperlink{attribute.HOL.code}{\mbox{\isa{code}}}} & : & \isa{attribute} \\
  1734     \indexdef{HOL}{command}{code\_abort}\hypertarget{command.HOL.code-abort}{\hyperlink{command.HOL.code-abort}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}abort}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}} \\
  1735     \indexdef{HOL}{command}{code\_datatype}\hypertarget{command.HOL.code-datatype}{\hyperlink{command.HOL.code-datatype}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}datatype}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}} \\
  1736     \indexdef{HOL}{command}{print\_codesetup}\hypertarget{command.HOL.print-codesetup}{\hyperlink{command.HOL.print-codesetup}{\mbox{\isa{\isacommand{print{\isaliteral{5F}{\isacharunderscore}}codesetup}}}}}\isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7375703E}{}\isactrlsup {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}context\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}{\isaliteral{22}{\isachardoublequote}}} \\
  1737     \indexdef{HOL}{attribute}{code\_inline}\hypertarget{attribute.HOL.code-inline}{\hyperlink{attribute.HOL.code-inline}{\mbox{\isa{code{\isaliteral{5F}{\isacharunderscore}}inline}}}} & : & \isa{attribute} \\
  1738     \indexdef{HOL}{attribute}{code\_post}\hypertarget{attribute.HOL.code-post}{\hyperlink{attribute.HOL.code-post}{\mbox{\isa{code{\isaliteral{5F}{\isacharunderscore}}post}}}} & : & \isa{attribute} \\
  1739     \indexdef{HOL}{command}{print\_codeproc}\hypertarget{command.HOL.print-codeproc}{\hyperlink{command.HOL.print-codeproc}{\mbox{\isa{\isacommand{print{\isaliteral{5F}{\isacharunderscore}}codeproc}}}}}\isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7375703E}{}\isactrlsup {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}context\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}{\isaliteral{22}{\isachardoublequote}}} \\
  1740     \indexdef{HOL}{command}{code\_thms}\hypertarget{command.HOL.code-thms}{\hyperlink{command.HOL.code-thms}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}thms}}}}}\isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7375703E}{}\isactrlsup {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}context\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}{\isaliteral{22}{\isachardoublequote}}} \\
  1741     \indexdef{HOL}{command}{code\_deps}\hypertarget{command.HOL.code-deps}{\hyperlink{command.HOL.code-deps}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}deps}}}}}\isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7375703E}{}\isactrlsup {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}context\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}{\isaliteral{22}{\isachardoublequote}}} \\
  1742     \indexdef{HOL}{command}{code\_const}\hypertarget{command.HOL.code-const}{\hyperlink{command.HOL.code-const}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}const}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}} \\
  1743     \indexdef{HOL}{command}{code\_type}\hypertarget{command.HOL.code-type}{\hyperlink{command.HOL.code-type}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}type}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}} \\
  1744     \indexdef{HOL}{command}{code\_class}\hypertarget{command.HOL.code-class}{\hyperlink{command.HOL.code-class}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}class}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}} \\
  1745     \indexdef{HOL}{command}{code\_instance}\hypertarget{command.HOL.code-instance}{\hyperlink{command.HOL.code-instance}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}instance}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}} \\
  1746     \indexdef{HOL}{command}{code\_reserved}\hypertarget{command.HOL.code-reserved}{\hyperlink{command.HOL.code-reserved}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}reserved}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}} \\
  1747     \indexdef{HOL}{command}{code\_monad}\hypertarget{command.HOL.code-monad}{\hyperlink{command.HOL.code-monad}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}monad}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}} \\
  1748     \indexdef{HOL}{command}{code\_include}\hypertarget{command.HOL.code-include}{\hyperlink{command.HOL.code-include}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}include}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}} \\
  1749     \indexdef{HOL}{command}{code\_modulename}\hypertarget{command.HOL.code-modulename}{\hyperlink{command.HOL.code-modulename}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}modulename}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}} \\
  1750     \indexdef{HOL}{command}{code\_reflect}\hypertarget{command.HOL.code-reflect}{\hyperlink{command.HOL.code-reflect}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}reflect}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}}
  1751   \end{matharray}
  1752 
  1753   \begin{railoutput}
  1754 \rail@begin{11}{\isa{}}
  1755 \rail@term{\hyperlink{command.HOL.export-code}{\mbox{\isa{\isacommand{export{\isaliteral{5F}{\isacharunderscore}}code}}}}}[]
  1756 \rail@plus
  1757 \rail@nont{\isa{constexpr}}[]
  1758 \rail@nextplus{1}
  1759 \rail@endplus
  1760 \rail@cr{3}
  1761 \rail@bar
  1762 \rail@nextbar{4}
  1763 \rail@plus
  1764 \rail@term{\isa{\isakeyword{in}}}[]
  1765 \rail@nont{\isa{target}}[]
  1766 \rail@bar
  1767 \rail@nextbar{5}
  1768 \rail@term{\isa{\isakeyword{module{\isaliteral{5F}{\isacharunderscore}}name}}}[]
  1769 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  1770 \rail@endbar
  1771 \rail@cr{7}
  1772 \rail@bar
  1773 \rail@nextbar{8}
  1774 \rail@term{\isa{\isakeyword{file}}}[]
  1775 \rail@bar
  1776 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  1777 \rail@nextbar{9}
  1778 \rail@term{\isa{{\isaliteral{2D}{\isacharminus}}}}[]
  1779 \rail@endbar
  1780 \rail@endbar
  1781 \rail@bar
  1782 \rail@nextbar{8}
  1783 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  1784 \rail@nont{\isa{args}}[]
  1785 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  1786 \rail@endbar
  1787 \rail@nextplus{10}
  1788 \rail@endplus
  1789 \rail@endbar
  1790 \rail@end
  1791 \rail@begin{1}{\isa{const}}
  1792 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  1793 \rail@end
  1794 \rail@begin{3}{\isa{constexpr}}
  1795 \rail@bar
  1796 \rail@nont{\isa{const}}[]
  1797 \rail@nextbar{1}
  1798 \rail@term{\isa{name{\isaliteral{2E}{\isachardot}}{\isaliteral{5F}{\isacharunderscore}}}}[]
  1799 \rail@nextbar{2}
  1800 \rail@term{\isa{{\isaliteral{5F}{\isacharunderscore}}}}[]
  1801 \rail@endbar
  1802 \rail@end
  1803 \rail@begin{1}{\isa{typeconstructor}}
  1804 \rail@nont{\hyperlink{syntax.nameref}{\mbox{\isa{nameref}}}}[]
  1805 \rail@end
  1806 \rail@begin{1}{\isa{class}}
  1807 \rail@nont{\hyperlink{syntax.nameref}{\mbox{\isa{nameref}}}}[]
  1808 \rail@end
  1809 \rail@begin{4}{\isa{target}}
  1810 \rail@bar
  1811 \rail@term{\isa{SML}}[]
  1812 \rail@nextbar{1}
  1813 \rail@term{\isa{OCaml}}[]
  1814 \rail@nextbar{2}
  1815 \rail@term{\isa{Haskell}}[]
  1816 \rail@nextbar{3}
  1817 \rail@term{\isa{Scala}}[]
  1818 \rail@endbar
  1819 \rail@end
  1820 \rail@begin{4}{\isa{}}
  1821 \rail@term{\hyperlink{attribute.HOL.code}{\mbox{\isa{code}}}}[]
  1822 \rail@bar
  1823 \rail@nextbar{1}
  1824 \rail@bar
  1825 \rail@term{\isa{del}}[]
  1826 \rail@nextbar{2}
  1827 \rail@term{\isa{abstype}}[]
  1828 \rail@nextbar{3}
  1829 \rail@term{\isa{abstract}}[]
  1830 \rail@endbar
  1831 \rail@endbar
  1832 \rail@end
  1833 \rail@begin{2}{\isa{}}
  1834 \rail@term{\hyperlink{command.HOL.code-abort}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}abort}}}}}[]
  1835 \rail@plus
  1836 \rail@nont{\isa{const}}[]
  1837 \rail@nextplus{1}
  1838 \rail@endplus
  1839 \rail@end
  1840 \rail@begin{2}{\isa{}}
  1841 \rail@term{\hyperlink{command.HOL.code-datatype}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}datatype}}}}}[]
  1842 \rail@plus
  1843 \rail@nont{\isa{const}}[]
  1844 \rail@nextplus{1}
  1845 \rail@endplus
  1846 \rail@end
  1847 \rail@begin{2}{\isa{}}
  1848 \rail@term{\hyperlink{attribute.HOL.code-inline}{\mbox{\isa{code{\isaliteral{5F}{\isacharunderscore}}inline}}}}[]
  1849 \rail@bar
  1850 \rail@nextbar{1}
  1851 \rail@term{\isa{del}}[]
  1852 \rail@endbar
  1853 \rail@end
  1854 \rail@begin{2}{\isa{}}
  1855 \rail@term{\hyperlink{attribute.HOL.code-post}{\mbox{\isa{code{\isaliteral{5F}{\isacharunderscore}}post}}}}[]
  1856 \rail@bar
  1857 \rail@nextbar{1}
  1858 \rail@term{\isa{del}}[]
  1859 \rail@endbar
  1860 \rail@end
  1861 \rail@begin{3}{\isa{}}
  1862 \rail@term{\hyperlink{command.HOL.code-thms}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}thms}}}}}[]
  1863 \rail@bar
  1864 \rail@nextbar{1}
  1865 \rail@plus
  1866 \rail@nont{\isa{constexpr}}[]
  1867 \rail@nextplus{2}
  1868 \rail@endplus
  1869 \rail@endbar
  1870 \rail@end
  1871 \rail@begin{3}{\isa{}}
  1872 \rail@term{\hyperlink{command.HOL.code-deps}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}deps}}}}}[]
  1873 \rail@bar
  1874 \rail@nextbar{1}
  1875 \rail@plus
  1876 \rail@nont{\isa{constexpr}}[]
  1877 \rail@nextplus{2}
  1878 \rail@endplus
  1879 \rail@endbar
  1880 \rail@end
  1881 \rail@begin{7}{\isa{}}
  1882 \rail@term{\hyperlink{command.HOL.code-const}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}const}}}}}[]
  1883 \rail@plus
  1884 \rail@nont{\isa{const}}[]
  1885 \rail@nextplus{1}
  1886 \rail@cterm{\isa{\isakeyword{and}}}[]
  1887 \rail@endplus
  1888 \rail@cr{3}
  1889 \rail@plus
  1890 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  1891 \rail@nont{\isa{target}}[]
  1892 \rail@plus
  1893 \rail@bar
  1894 \rail@nextbar{4}
  1895 \rail@nont{\isa{syntax}}[]
  1896 \rail@endbar
  1897 \rail@nextplus{5}
  1898 \rail@cterm{\isa{\isakeyword{and}}}[]
  1899 \rail@endplus
  1900 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  1901 \rail@nextplus{6}
  1902 \rail@endplus
  1903 \rail@end
  1904 \rail@begin{7}{\isa{}}
  1905 \rail@term{\hyperlink{command.HOL.code-type}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}type}}}}}[]
  1906 \rail@plus
  1907 \rail@nont{\isa{typeconstructor}}[]
  1908 \rail@nextplus{1}
  1909 \rail@cterm{\isa{\isakeyword{and}}}[]
  1910 \rail@endplus
  1911 \rail@cr{3}
  1912 \rail@plus
  1913 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  1914 \rail@nont{\isa{target}}[]
  1915 \rail@plus
  1916 \rail@bar
  1917 \rail@nextbar{4}
  1918 \rail@nont{\isa{syntax}}[]
  1919 \rail@endbar
  1920 \rail@nextplus{5}
  1921 \rail@cterm{\isa{\isakeyword{and}}}[]
  1922 \rail@endplus
  1923 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  1924 \rail@nextplus{6}
  1925 \rail@endplus
  1926 \rail@end
  1927 \rail@begin{9}{\isa{}}
  1928 \rail@term{\hyperlink{command.HOL.code-class}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}class}}}}}[]
  1929 \rail@plus
  1930 \rail@nont{\isa{class}}[]
  1931 \rail@nextplus{1}
  1932 \rail@cterm{\isa{\isakeyword{and}}}[]
  1933 \rail@endplus
  1934 \rail@cr{3}
  1935 \rail@plus
  1936 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  1937 \rail@nont{\isa{target}}[]
  1938 \rail@cr{5}
  1939 \rail@plus
  1940 \rail@bar
  1941 \rail@nextbar{6}
  1942 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  1943 \rail@endbar
  1944 \rail@nextplus{7}
  1945 \rail@cterm{\isa{\isakeyword{and}}}[]
  1946 \rail@endplus
  1947 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  1948 \rail@nextplus{8}
  1949 \rail@endplus
  1950 \rail@end
  1951 \rail@begin{7}{\isa{}}
  1952 \rail@term{\hyperlink{command.HOL.code-instance}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}instance}}}}}[]
  1953 \rail@plus
  1954 \rail@nont{\isa{typeconstructor}}[]
  1955 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}}}[]
  1956 \rail@nont{\isa{class}}[]
  1957 \rail@nextplus{1}
  1958 \rail@cterm{\isa{\isakeyword{and}}}[]
  1959 \rail@endplus
  1960 \rail@cr{3}
  1961 \rail@plus
  1962 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  1963 \rail@nont{\isa{target}}[]
  1964 \rail@plus
  1965 \rail@bar
  1966 \rail@nextbar{4}
  1967 \rail@term{\isa{{\isaliteral{2D}{\isacharminus}}}}[]
  1968 \rail@endbar
  1969 \rail@nextplus{5}
  1970 \rail@cterm{\isa{\isakeyword{and}}}[]
  1971 \rail@endplus
  1972 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  1973 \rail@nextplus{6}
  1974 \rail@endplus
  1975 \rail@end
  1976 \rail@begin{2}{\isa{}}
  1977 \rail@term{\hyperlink{command.HOL.code-reserved}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}reserved}}}}}[]
  1978 \rail@nont{\isa{target}}[]
  1979 \rail@plus
  1980 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  1981 \rail@nextplus{1}
  1982 \rail@endplus
  1983 \rail@end
  1984 \rail@begin{1}{\isa{}}
  1985 \rail@term{\hyperlink{command.HOL.code-monad}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}monad}}}}}[]
  1986 \rail@nont{\isa{const}}[]
  1987 \rail@nont{\isa{const}}[]
  1988 \rail@nont{\isa{target}}[]
  1989 \rail@end
  1990 \rail@begin{2}{\isa{}}
  1991 \rail@term{\hyperlink{command.HOL.code-include}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}include}}}}}[]
  1992 \rail@nont{\isa{target}}[]
  1993 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  1994 \rail@bar
  1995 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  1996 \rail@nextbar{1}
  1997 \rail@term{\isa{{\isaliteral{2D}{\isacharminus}}}}[]
  1998 \rail@endbar
  1999 \rail@end
  2000 \rail@begin{2}{\isa{}}
  2001 \rail@term{\hyperlink{command.HOL.code-modulename}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}modulename}}}}}[]
  2002 \rail@nont{\isa{target}}[]
  2003 \rail@plus
  2004 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2005 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2006 \rail@nextplus{1}
  2007 \rail@endplus
  2008 \rail@end
  2009 \rail@begin{11}{\isa{}}
  2010 \rail@term{\hyperlink{command.HOL.code-reflect}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}reflect}}}}}[]
  2011 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2012 \rail@cr{2}
  2013 \rail@bar
  2014 \rail@nextbar{3}
  2015 \rail@term{\isa{\isakeyword{datatypes}}}[]
  2016 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2017 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
  2018 \rail@bar
  2019 \rail@term{\isa{{\isaliteral{5F}{\isacharunderscore}}}}[]
  2020 \rail@nextbar{4}
  2021 \rail@plus
  2022 \rail@plus
  2023 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2024 \rail@nextplus{5}
  2025 \rail@cterm{\isa{{\isaliteral{7C}{\isacharbar}}}}[]
  2026 \rail@endplus
  2027 \rail@nextplus{6}
  2028 \rail@cterm{\isa{\isakeyword{and}}}[]
  2029 \rail@endplus
  2030 \rail@endbar
  2031 \rail@endbar
  2032 \rail@cr{8}
  2033 \rail@bar
  2034 \rail@nextbar{9}
  2035 \rail@term{\isa{\isakeyword{functions}}}[]
  2036 \rail@plus
  2037 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2038 \rail@nextplus{10}
  2039 \rail@endplus
  2040 \rail@endbar
  2041 \rail@bar
  2042 \rail@nextbar{9}
  2043 \rail@term{\isa{\isakeyword{file}}}[]
  2044 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2045 \rail@endbar
  2046 \rail@end
  2047 \rail@begin{4}{\isa{syntax}}
  2048 \rail@bar
  2049 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2050 \rail@nextbar{1}
  2051 \rail@bar
  2052 \rail@term{\isa{\isakeyword{infix}}}[]
  2053 \rail@nextbar{2}
  2054 \rail@term{\isa{\isakeyword{infixl}}}[]
  2055 \rail@nextbar{3}
  2056 \rail@term{\isa{\isakeyword{infixr}}}[]
  2057 \rail@endbar
  2058 \rail@nont{\hyperlink{syntax.nat}{\mbox{\isa{nat}}}}[]
  2059 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2060 \rail@endbar
  2061 \rail@end
  2062 \end{railoutput}
  2063 
  2064 
  2065   \begin{description}
  2066 
  2067   \item \hyperlink{command.HOL.export-code}{\mbox{\isa{\isacommand{export{\isaliteral{5F}{\isacharunderscore}}code}}}} generates code for a given list
  2068   of constants in the specified target language(s).  If no
  2069   serialization instruction is given, only abstract code is generated
  2070   internally.
  2071 
  2072   Constants may be specified by giving them literally, referring to
  2073   all executable contants within a certain theory by giving \isa{{\isaliteral{22}{\isachardoublequote}}name{\isaliteral{2E}{\isachardot}}{\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}}, or referring to \emph{all} executable constants currently
  2074   available by giving \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}}.
  2075 
  2076   By default, for each involved theory one corresponding name space
  2077   module is generated.  Alternativly, a module name may be specified
  2078   after the \hyperlink{keyword.module-name}{\mbox{\isa{\isakeyword{module{\isaliteral{5F}{\isacharunderscore}}name}}}} keyword; then \emph{all} code is
  2079   placed in this module.
  2080 
  2081   For \emph{SML}, \emph{OCaml} and \emph{Scala} the file specification
  2082   refers to a single file; for \emph{Haskell}, it refers to a whole
  2083   directory, where code is generated in multiple files reflecting the
  2084   module hierarchy.  Omitting the file specification denotes standard
  2085   output.
  2086 
  2087   Serializers take an optional list of arguments in parentheses.  For
  2088   \emph{SML} and \emph{OCaml}, ``\isa{no{\isaliteral{5F}{\isacharunderscore}}signatures}`` omits
  2089   explicit module signatures.
  2090 
  2091   For \emph{Haskell} a module name prefix may be given using the
  2092   ``\isa{{\isaliteral{22}{\isachardoublequote}}root{\isaliteral{3A}{\isacharcolon}}{\isaliteral{22}{\isachardoublequote}}}'' argument; ``\isa{string{\isaliteral{5F}{\isacharunderscore}}classes}'' adds a
  2093   ``\verb|deriving (Read, Show)|'' clause to each appropriate
  2094   datatype declaration.
  2095 
  2096   \item \hyperlink{attribute.HOL.code}{\mbox{\isa{code}}} explicitly selects (or with option
  2097   ``\isa{{\isaliteral{22}{\isachardoublequote}}del{\isaliteral{22}{\isachardoublequote}}}'' deselects) a code equation for code generation.
  2098   Usually packages introducing code equations provide a reasonable
  2099   default setup for selection.  Variants \isa{{\isaliteral{22}{\isachardoublequote}}code\ abstype{\isaliteral{22}{\isachardoublequote}}} and
  2100   \isa{{\isaliteral{22}{\isachardoublequote}}code\ abstract{\isaliteral{22}{\isachardoublequote}}} declare abstract datatype certificates or
  2101   code equations on abstract datatype representations respectively.
  2102 
  2103   \item \hyperlink{command.HOL.code-abort}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}abort}}}} declares constants which are not
  2104   required to have a definition by means of code equations; if needed
  2105   these are implemented by program abort instead.
  2106 
  2107   \item \hyperlink{command.HOL.code-datatype}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}datatype}}}} specifies a constructor set
  2108   for a logical type.
  2109 
  2110   \item \hyperlink{command.HOL.print-codesetup}{\mbox{\isa{\isacommand{print{\isaliteral{5F}{\isacharunderscore}}codesetup}}}} gives an overview on
  2111   selected code equations and code generator datatypes.
  2112 
  2113   \item \hyperlink{attribute.HOL.code-inline}{\mbox{\isa{code{\isaliteral{5F}{\isacharunderscore}}inline}}} declares (or with option
  2114   ``\isa{{\isaliteral{22}{\isachardoublequote}}del{\isaliteral{22}{\isachardoublequote}}}'' removes) inlining theorems which are applied as
  2115   rewrite rules to any code equation during preprocessing.
  2116 
  2117   \item \hyperlink{attribute.HOL.code-post}{\mbox{\isa{code{\isaliteral{5F}{\isacharunderscore}}post}}} declares (or with option ``\isa{{\isaliteral{22}{\isachardoublequote}}del{\isaliteral{22}{\isachardoublequote}}}'' removes) theorems which are applied as rewrite rules to any
  2118   result of an evaluation.
  2119 
  2120   \item \hyperlink{command.HOL.print-codeproc}{\mbox{\isa{\isacommand{print{\isaliteral{5F}{\isacharunderscore}}codeproc}}}} prints the setup of the code
  2121   generator preprocessor.
  2122 
  2123   \item \hyperlink{command.HOL.code-thms}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}thms}}}} prints a list of theorems
  2124   representing the corresponding program containing all given
  2125   constants after preprocessing.
  2126 
  2127   \item \hyperlink{command.HOL.code-deps}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}deps}}}} visualizes dependencies of
  2128   theorems representing the corresponding program containing all given
  2129   constants after preprocessing.
  2130 
  2131   \item \hyperlink{command.HOL.code-const}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}const}}}} associates a list of constants
  2132   with target-specific serializations; omitting a serialization
  2133   deletes an existing serialization.
  2134 
  2135   \item \hyperlink{command.HOL.code-type}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}type}}}} associates a list of type
  2136   constructors with target-specific serializations; omitting a
  2137   serialization deletes an existing serialization.
  2138 
  2139   \item \hyperlink{command.HOL.code-class}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}class}}}} associates a list of classes
  2140   with target-specific class names; omitting a serialization deletes
  2141   an existing serialization.  This applies only to \emph{Haskell}.
  2142 
  2143   \item \hyperlink{command.HOL.code-instance}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}instance}}}} declares a list of type
  2144   constructor / class instance relations as ``already present'' for a
  2145   given target.  Omitting a ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{2D}{\isacharminus}}{\isaliteral{22}{\isachardoublequote}}}'' deletes an existing
  2146   ``already present'' declaration.  This applies only to
  2147   \emph{Haskell}.
  2148 
  2149   \item \hyperlink{command.HOL.code-reserved}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}reserved}}}} declares a list of names as
  2150   reserved for a given target, preventing it to be shadowed by any
  2151   generated code.
  2152 
  2153   \item \hyperlink{command.HOL.code-monad}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}monad}}}} provides an auxiliary mechanism
  2154   to generate monadic code for Haskell.
  2155 
  2156   \item \hyperlink{command.HOL.code-include}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}include}}}} adds arbitrary named content
  2157   (``include'') to generated code.  A ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{2D}{\isacharminus}}{\isaliteral{22}{\isachardoublequote}}}'' as last argument
  2158   will remove an already added ``include''.
  2159 
  2160   \item \hyperlink{command.HOL.code-modulename}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}modulename}}}} declares aliasings from one
  2161   module name onto another.
  2162 
  2163   \item \hyperlink{command.HOL.code-reflect}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}reflect}}}} without a ``\isa{{\isaliteral{22}{\isachardoublequote}}file{\isaliteral{22}{\isachardoublequote}}}''
  2164   argument compiles code into the system runtime environment and
  2165   modifies the code generator setup that future invocations of system
  2166   runtime code generation referring to one of the ``\isa{{\isaliteral{22}{\isachardoublequote}}datatypes{\isaliteral{22}{\isachardoublequote}}}'' or ``\isa{{\isaliteral{22}{\isachardoublequote}}functions{\isaliteral{22}{\isachardoublequote}}}'' entities use these precompiled
  2167   entities.  With a ``\isa{{\isaliteral{22}{\isachardoublequote}}file{\isaliteral{22}{\isachardoublequote}}}'' argument, the corresponding code
  2168   is generated into that specified file without modifying the code
  2169   generator setup.
  2170 
  2171   \end{description}%
  2172 \end{isamarkuptext}%
  2173 \isamarkuptrue%
  2174 %
  2175 \isamarkupsubsection{The old code generator (S. Berghofer)%
  2176 }
  2177 \isamarkuptrue%
  2178 %
  2179 \begin{isamarkuptext}%
  2180 This framework generates code from both functional and
  2181   relational programs to SML, as explained below.
  2182 
  2183   \begin{matharray}{rcl}
  2184     \indexdef{}{command}{code\_module}\hypertarget{command.code-module}{\hyperlink{command.code-module}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}module}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}} \\
  2185     \indexdef{}{command}{code\_library}\hypertarget{command.code-library}{\hyperlink{command.code-library}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}library}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}} \\
  2186     \indexdef{}{command}{consts\_code}\hypertarget{command.consts-code}{\hyperlink{command.consts-code}{\mbox{\isa{\isacommand{consts{\isaliteral{5F}{\isacharunderscore}}code}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}} \\
  2187     \indexdef{}{command}{types\_code}\hypertarget{command.types-code}{\hyperlink{command.types-code}{\mbox{\isa{\isacommand{types{\isaliteral{5F}{\isacharunderscore}}code}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ theory{\isaliteral{22}{\isachardoublequote}}} \\
  2188     \indexdef{}{attribute}{code}\hypertarget{attribute.code}{\hyperlink{attribute.code}{\mbox{\isa{code}}}} & : & \isa{attribute} \\
  2189   \end{matharray}
  2190 
  2191   \begin{railoutput}
  2192 \rail@begin{11}{\isa{}}
  2193 \rail@bar
  2194 \rail@term{\hyperlink{command.code-module}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}module}}}}}[]
  2195 \rail@nextbar{1}
  2196 \rail@term{\hyperlink{command.code-library}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}library}}}}}[]
  2197 \rail@endbar
  2198 \rail@bar
  2199 \rail@nextbar{1}
  2200 \rail@nont{\isa{modespec}}[]
  2201 \rail@endbar
  2202 \rail@bar
  2203 \rail@nextbar{1}
  2204 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2205 \rail@endbar
  2206 \rail@cr{3}
  2207 \rail@bar
  2208 \rail@nextbar{4}
  2209 \rail@term{\isa{\isakeyword{file}}}[]
  2210 \rail@nont{\isa{name}}[]
  2211 \rail@endbar
  2212 \rail@bar
  2213 \rail@nextbar{4}
  2214 \rail@term{\isa{\isakeyword{imports}}}[]
  2215 \rail@plus
  2216 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2217 \rail@nextplus{5}
  2218 \rail@endplus
  2219 \rail@endbar
  2220 \rail@cr{7}
  2221 \rail@term{\isa{\isakeyword{contains}}}[]
  2222 \rail@bar
  2223 \rail@plus
  2224 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2225 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
  2226 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  2227 \rail@nextplus{8}
  2228 \rail@endplus
  2229 \rail@nextbar{9}
  2230 \rail@plus
  2231 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  2232 \rail@nextplus{10}
  2233 \rail@endplus
  2234 \rail@endbar
  2235 \rail@end
  2236 \rail@begin{2}{\isa{modespec}}
  2237 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2238 \rail@plus
  2239 \rail@nextplus{1}
  2240 \rail@cnont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2241 \rail@endplus
  2242 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2243 \rail@end
  2244 \rail@begin{2}{\isa{}}
  2245 \rail@term{\hyperlink{command.HOL.consts-code}{\mbox{\isa{\isacommand{consts{\isaliteral{5F}{\isacharunderscore}}code}}}}}[]
  2246 \rail@plus
  2247 \rail@nont{\isa{codespec}}[]
  2248 \rail@nextplus{1}
  2249 \rail@endplus
  2250 \rail@end
  2251 \rail@begin{2}{\isa{codespec}}
  2252 \rail@nont{\isa{const}}[]
  2253 \rail@nont{\isa{template}}[]
  2254 \rail@bar
  2255 \rail@nextbar{1}
  2256 \rail@nont{\isa{attachment}}[]
  2257 \rail@endbar
  2258 \rail@end
  2259 \rail@begin{2}{\isa{}}
  2260 \rail@term{\hyperlink{command.HOL.types-code}{\mbox{\isa{\isacommand{types{\isaliteral{5F}{\isacharunderscore}}code}}}}}[]
  2261 \rail@plus
  2262 \rail@nont{\isa{tycodespec}}[]
  2263 \rail@nextplus{1}
  2264 \rail@endplus
  2265 \rail@end
  2266 \rail@begin{2}{\isa{tycodespec}}
  2267 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2268 \rail@nont{\isa{template}}[]
  2269 \rail@bar
  2270 \rail@nextbar{1}
  2271 \rail@nont{\isa{attachment}}[]
  2272 \rail@endbar
  2273 \rail@end
  2274 \rail@begin{1}{\isa{const}}
  2275 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  2276 \rail@end
  2277 \rail@begin{1}{\isa{template}}
  2278 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2279 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2280 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2281 \rail@end
  2282 \rail@begin{2}{\isa{attachment}}
  2283 \rail@term{\isa{attach}}[]
  2284 \rail@bar
  2285 \rail@nextbar{1}
  2286 \rail@nont{\isa{modespec}}[]
  2287 \rail@endbar
  2288 \rail@term{\isa{{\isaliteral{7B}{\isacharbraceleft}}}}[]
  2289 \rail@nont{\hyperlink{syntax.text}{\mbox{\isa{text}}}}[]
  2290 \rail@term{\isa{{\isaliteral{7D}{\isacharbraceright}}}}[]
  2291 \rail@end
  2292 \rail@begin{2}{\isa{}}
  2293 \rail@term{\hyperlink{attribute.code}{\mbox{\isa{code}}}}[]
  2294 \rail@bar
  2295 \rail@nextbar{1}
  2296 \rail@nont{\isa{name}}[]
  2297 \rail@endbar
  2298 \rail@end
  2299 \end{railoutput}%
  2300 \end{isamarkuptext}%
  2301 \isamarkuptrue%
  2302 %
  2303 \isamarkupsubsubsection{Invoking the code generator%
  2304 }
  2305 \isamarkuptrue%
  2306 %
  2307 \begin{isamarkuptext}%
  2308 The code generator is invoked via the \hyperlink{command.code-module}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}module}}}}
  2309   and \hyperlink{command.code-library}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}library}}}} commands, which correspond to
  2310   \emph{incremental} and \emph{modular} code generation, respectively.
  2311 
  2312   \begin{description}
  2313 
  2314   \item [Modular] For each theory, an ML structure is generated,
  2315   containing the code generated from the constants defined in this
  2316   theory.
  2317 
  2318   \item [Incremental] All the generated code is emitted into the same
  2319   structure.  This structure may import code from previously generated
  2320   structures, which can be specified via \hyperlink{keyword.imports}{\mbox{\isa{\isakeyword{imports}}}}.
  2321   Moreover, the generated structure may also be referred to in later
  2322   invocations of the code generator.
  2323 
  2324   \end{description}
  2325 
  2326   After the \hyperlink{command.code-module}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}module}}}} and \hyperlink{command.code-library}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}library}}}}
  2327   keywords, the user may specify an optional list of ``modes'' in
  2328   parentheses. These can be used to instruct the code generator to
  2329   emit additional code for special purposes, e.g.\ functions for
  2330   converting elements of generated datatypes to Isabelle terms, or
  2331   test data generators. The list of modes is followed by a module
  2332   name.  The module name is optional for modular code generation, but
  2333   must be specified for incremental code generation.
  2334 
  2335   The code can either be written to a file, in which case a file name
  2336   has to be specified after the \hyperlink{keyword.file}{\mbox{\isa{\isakeyword{file}}}} keyword, or be loaded
  2337   directly into Isabelle's ML environment. In the latter case, the
  2338   \hyperlink{command.ML}{\mbox{\isa{\isacommand{ML}}}} theory command can be used to inspect the results
  2339   interactively, for example.
  2340 
  2341   The terms from which to generate code can be specified after the
  2342   \hyperlink{keyword.contains}{\mbox{\isa{\isakeyword{contains}}}} keyword, either as a list of bindings, or just
  2343   as a list of terms. In the latter case, the code generator just
  2344   produces code for all constants and types occuring in the term, but
  2345   does not bind the compiled terms to ML identifiers.
  2346 
  2347   Here is an example:%
  2348 \end{isamarkuptext}%
  2349 \isamarkuptrue%
  2350 \isacommand{code{\isaliteral{5F}{\isacharunderscore}}module}\isamarkupfalse%
  2351 \ Test\isanewline
  2352 \isakeyword{contains}\ test\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{22}{\isachardoublequoteopen}}foldl\ op\ {\isaliteral{2B}{\isacharplus}}\ {\isaliteral{28}{\isacharparenleft}}{\isadigit{0}}\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ int{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5B}{\isacharbrackleft}}{\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isadigit{2}}{\isaliteral{2C}{\isacharcomma}}\ {\isadigit{3}}{\isaliteral{2C}{\isacharcomma}}\ {\isadigit{4}}{\isaliteral{2C}{\isacharcomma}}\ {\isadigit{5}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{22}{\isachardoublequoteclose}}%
  2353 \begin{isamarkuptext}%
  2354 \noindent This binds the result of compiling the given term to
  2355   the ML identifier \verb|Test.test|.%
  2356 \end{isamarkuptext}%
  2357 \isamarkuptrue%
  2358 %
  2359 \isadelimML
  2360 %
  2361 \endisadelimML
  2362 %
  2363 \isatagML
  2364 \isacommand{ML}\isamarkupfalse%
  2365 \ {\isaliteral{7B2A}{\isacharverbatimopen}}\ %
  2366 \isaantiq
  2367 assert{}%
  2368 \endisaantiq
  2369 \ {\isaliteral{28}{\isacharparenleft}}Test{\isaliteral{2E}{\isachardot}}test\ {\isaliteral{3D}{\isacharequal}}\ {\isadigit{1}}{\isadigit{5}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{2A7D}{\isacharverbatimclose}}%
  2370 \endisatagML
  2371 {\isafoldML}%
  2372 %
  2373 \isadelimML
  2374 %
  2375 \endisadelimML
  2376 %
  2377 \isamarkupsubsubsection{Configuring the code generator%
  2378 }
  2379 \isamarkuptrue%
  2380 %
  2381 \begin{isamarkuptext}%
  2382 When generating code for a complex term, the code generator
  2383   recursively calls itself for all subterms.  When it arrives at a
  2384   constant, the default strategy of the code generator is to look up
  2385   its definition and try to generate code for it.  Constants which
  2386   have no definitions that are immediately executable, may be
  2387   associated with a piece of ML code manually using the \indexref{}{command}{consts\_code}\hyperlink{command.consts-code}{\mbox{\isa{\isacommand{consts{\isaliteral{5F}{\isacharunderscore}}code}}}} command.  It takes a list whose elements consist of a
  2388   constant (given in usual term syntax -- an explicit type constraint
  2389   accounts for overloading), and a mixfix template describing the ML
  2390   code. The latter is very much the same as the mixfix templates used
  2391   when declaring new constants.  The most notable difference is that
  2392   terms may be included in the ML template using antiquotation
  2393   brackets \verb|{|\verb|*|~\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{2E}{\isachardot}}{\isaliteral{2E}{\isachardot}}{\isaliteral{2E}{\isachardot}}{\isaliteral{22}{\isachardoublequote}}}~\verb|*|\verb|}|.
  2394 
  2395   A similar mechanism is available for types: \indexref{}{command}{types\_code}\hyperlink{command.types-code}{\mbox{\isa{\isacommand{types{\isaliteral{5F}{\isacharunderscore}}code}}}} associates type constructors with specific ML code.
  2396 
  2397   For example, the following declarations copied from \verb|~~/src/HOL/Product_Type.thy| describe how the product type of
  2398   Isabelle/HOL should be compiled to ML.%
  2399 \end{isamarkuptext}%
  2400 \isamarkuptrue%
  2401 \isacommand{typedecl}\isamarkupfalse%
  2402 \ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{29}{\isacharparenright}}\ prod\isanewline
  2403 \isacommand{consts}\isamarkupfalse%
  2404 \ Pair\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}b\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{29}{\isacharparenright}}\ prod{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  2405 \isanewline
  2406 \isacommand{types{\isaliteral{5F}{\isacharunderscore}}code}\isamarkupfalse%
  2407 \ prod\ \ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5F}{\isacharunderscore}}\ {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{2F}{\isacharslash}}\ {\isaliteral{5F}{\isacharunderscore}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}{\isaliteral{29}{\isacharparenright}}\isanewline
  2408 \isacommand{consts{\isaliteral{5F}{\isacharunderscore}}code}\isamarkupfalse%
  2409 \ Pair\ \ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5F}{\isacharunderscore}}{\isaliteral{2C}{\isacharcomma}}{\isaliteral{2F}{\isacharslash}}\ {\isaliteral{5F}{\isacharunderscore}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}{\isaliteral{29}{\isacharparenright}}%
  2410 \begin{isamarkuptext}%
  2411 Sometimes, the code associated with a constant or type may
  2412   need to refer to auxiliary functions, which have to be emitted when
  2413   the constant is used. Code for such auxiliary functions can be
  2414   declared using \hyperlink{keyword.attach}{\mbox{\isa{\isakeyword{attach}}}}. For example, the \isa{wfrec}
  2415   function can be implemented as follows:%
  2416 \end{isamarkuptext}%
  2417 \isamarkuptrue%
  2418 \isacommand{consts{\isaliteral{5F}{\isacharunderscore}}code}\isamarkupfalse%
  2419 \ wfrec\ \ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C6D6F64756C653E}{\isasymmodule}}wfrec{\isaliteral{3F}{\isacharquery}}{\isaliteral{22}{\isachardoublequoteclose}}{\isaliteral{29}{\isacharparenright}}\ \ \isanewline
  2420 \isakeyword{attach}\ {\isaliteral{7B2A}{\isacharverbatimopen}}\ fun\ wfrec\ f\ x\ {\isaliteral{3D}{\isacharequal}}\ f\ {\isaliteral{28}{\isacharparenleft}}wfrec\ f{\isaliteral{29}{\isacharparenright}}\ x\ {\isaliteral{2A7D}{\isacharverbatimclose}}%
  2421 \begin{isamarkuptext}%
  2422 If the code containing a call to \isa{wfrec} resides in an
  2423   ML structure different from the one containing the function
  2424   definition attached to \isa{wfrec}, the name of the ML structure
  2425   (followed by a ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{2E}{\isachardot}}{\isaliteral{22}{\isachardoublequote}}}'')  is inserted in place of ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6D6F64756C653E}{\isasymmodule}}{\isaliteral{22}{\isachardoublequote}}}'' in the above template.  The ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{3F}{\isacharquery}}{\isaliteral{22}{\isachardoublequote}}}''  means that
  2426   the code generator should ignore the first argument of \isa{wfrec}, i.e.\ the termination relation, which is usually not
  2427   executable.
  2428 
  2429   \medskip Another possibility of configuring the code generator is to
  2430   register theorems to be used for code generation. Theorems can be
  2431   registered via the \hyperlink{attribute.code}{\mbox{\isa{code}}} attribute. It takes an optional
  2432   name as an argument, which indicates the format of the
  2433   theorem. Currently supported formats are equations (this is the
  2434   default when no name is specified) and horn clauses (this is
  2435   indicated by the name \texttt{ind}). The left-hand sides of
  2436   equations may only contain constructors and distinct variables,
  2437   whereas horn clauses must have the same format as introduction rules
  2438   of inductive definitions.
  2439 
  2440   The following example specifies three equations from which to
  2441   generate code for \isa{{\isaliteral{22}{\isachardoublequote}}op\ {\isaliteral{3C}{\isacharless}}{\isaliteral{22}{\isachardoublequote}}} on natural numbers (see also
  2442   \verb|~~/src/HOL/Nat.thy|).%
  2443 \end{isamarkuptext}%
  2444 \isamarkuptrue%
  2445 \isacommand{lemma}\isamarkupfalse%
  2446 \ {\isaliteral{5B}{\isacharbrackleft}}code{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}Suc\ m\ {\isaliteral{3C}{\isacharless}}\ Suc\ n{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}m\ {\isaliteral{3C}{\isacharless}}\ n{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  2447 \ \ \isakeyword{and}\ {\isaliteral{5B}{\isacharbrackleft}}code{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{28}{\isacharparenleft}}n{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}nat{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3C}{\isacharless}}\ {\isadigit{0}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ False{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  2448 \ \ \isakeyword{and}\ {\isaliteral{5B}{\isacharbrackleft}}code{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}{\isadigit{0}}\ {\isaliteral{3C}{\isacharless}}\ Suc\ n{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ True{\isaliteral{22}{\isachardoublequoteclose}}%
  2449 \isadelimproof
  2450 \ %
  2451 \endisadelimproof
  2452 %
  2453 \isatagproof
  2454 \isacommand{by}\isamarkupfalse%
  2455 \ simp{\isaliteral{5F}{\isacharunderscore}}all%
  2456 \endisatagproof
  2457 {\isafoldproof}%
  2458 %
  2459 \isadelimproof
  2460 %
  2461 \endisadelimproof
  2462 %
  2463 \isamarkupsubsubsection{Specific HOL code generators%
  2464 }
  2465 \isamarkuptrue%
  2466 %
  2467 \begin{isamarkuptext}%
  2468 The basic code generator framework offered by Isabelle/Pure
  2469   has already been extended with additional code generators for
  2470   specific HOL constructs. These include datatypes, recursive
  2471   functions and inductive relations. The code generator for inductive
  2472   relations can handle expressions of the form \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}t\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{2C}{\isacharcomma}}\ t\isaliteral{5C3C5E7375623E}{}\isactrlsub n{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C696E3E}{\isasymin}}\ r{\isaliteral{22}{\isachardoublequote}}}, where \isa{{\isaliteral{22}{\isachardoublequote}}r{\isaliteral{22}{\isachardoublequote}}} is an inductively defined relation. If at
  2473   least one of the \isa{{\isaliteral{22}{\isachardoublequote}}t\isaliteral{5C3C5E7375623E}{}\isactrlsub i{\isaliteral{22}{\isachardoublequote}}} is a dummy pattern ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5F}{\isacharunderscore}}{\isaliteral{22}{\isachardoublequote}}}'',
  2474   the above expression evaluates to a sequence of possible answers. If
  2475   all of the \isa{{\isaliteral{22}{\isachardoublequote}}t\isaliteral{5C3C5E7375623E}{}\isactrlsub i{\isaliteral{22}{\isachardoublequote}}} are proper terms, the expression evaluates
  2476   to a boolean value.
  2477 
  2478   The following example demonstrates this for beta-reduction on lambda
  2479   terms (see also \verb|~~/src/HOL/Proofs/Lambda/Lambda.thy|).%
  2480 \end{isamarkuptext}%
  2481 \isamarkuptrue%
  2482 \isacommand{datatype}\isamarkupfalse%
  2483 \ dB\ {\isaliteral{3D}{\isacharequal}}\isanewline
  2484 \ \ \ \ Var\ nat\isanewline
  2485 \ \ {\isaliteral{7C}{\isacharbar}}\ App\ dB\ dB\ \ {\isaliteral{28}{\isacharparenleft}}\isakeyword{infixl}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C6465677265653E}{\isasymdegree}}{\isaliteral{22}{\isachardoublequoteclose}}\ {\isadigit{2}}{\isadigit{0}}{\isadigit{0}}{\isaliteral{29}{\isacharparenright}}\isanewline
  2486 \ \ {\isaliteral{7C}{\isacharbar}}\ Abs\ dB\isanewline
  2487 \isanewline
  2488 \isacommand{primrec}\isamarkupfalse%
  2489 \ lift\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}dB\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ dB{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  2490 \isakeyword{where}\isanewline
  2491 \ \ \ \ {\isaliteral{22}{\isachardoublequoteopen}}lift\ {\isaliteral{28}{\isacharparenleft}}Var\ i{\isaliteral{29}{\isacharparenright}}\ k\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}if\ i\ {\isaliteral{3C}{\isacharless}}\ k\ then\ Var\ i\ else\ Var\ {\isaliteral{28}{\isacharparenleft}}i\ {\isaliteral{2B}{\isacharplus}}\ {\isadigit{1}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  2492 \ \ {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}lift\ {\isaliteral{28}{\isacharparenleft}}s\ {\isaliteral{5C3C6465677265653E}{\isasymdegree}}\ t{\isaliteral{29}{\isacharparenright}}\ k\ {\isaliteral{3D}{\isacharequal}}\ lift\ s\ k\ {\isaliteral{5C3C6465677265653E}{\isasymdegree}}\ lift\ t\ k{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  2493 \ \ {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}lift\ {\isaliteral{28}{\isacharparenleft}}Abs\ s{\isaliteral{29}{\isacharparenright}}\ k\ {\isaliteral{3D}{\isacharequal}}\ Abs\ {\isaliteral{28}{\isacharparenleft}}lift\ s\ {\isaliteral{28}{\isacharparenleft}}k\ {\isaliteral{2B}{\isacharplus}}\ {\isadigit{1}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  2494 \isanewline
  2495 \isacommand{primrec}\isamarkupfalse%
  2496 \ subst\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}dB\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ dB\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ dB{\isaliteral{22}{\isachardoublequoteclose}}\ \ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5F}{\isacharunderscore}}{\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5F}{\isacharunderscore}}{\isaliteral{27}{\isacharprime}}{\isaliteral{2F}{\isacharslash}}{\isaliteral{5F}{\isacharunderscore}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{22}{\isachardoublequoteclose}}\ {\isaliteral{5B}{\isacharbrackleft}}{\isadigit{3}}{\isadigit{0}}{\isadigit{0}}{\isaliteral{2C}{\isacharcomma}}\ {\isadigit{0}}{\isaliteral{2C}{\isacharcomma}}\ {\isadigit{0}}{\isaliteral{5D}{\isacharbrackright}}\ {\isadigit{3}}{\isadigit{0}}{\isadigit{0}}{\isaliteral{29}{\isacharparenright}}\isanewline
  2497 \isakeyword{where}\isanewline
  2498 \ \ \ \ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}Var\ i{\isaliteral{29}{\isacharparenright}}{\isaliteral{5B}{\isacharbrackleft}}s{\isaliteral{2F}{\isacharslash}}k{\isaliteral{5D}{\isacharbrackright}}\ {\isaliteral{3D}{\isacharequal}}\isanewline
  2499 \ \ \ \ \ \ {\isaliteral{28}{\isacharparenleft}}if\ k\ {\isaliteral{3C}{\isacharless}}\ i\ then\ Var\ {\isaliteral{28}{\isacharparenleft}}i\ {\isaliteral{2D}{\isacharminus}}\ {\isadigit{1}}{\isaliteral{29}{\isacharparenright}}\ else\ if\ i\ {\isaliteral{3D}{\isacharequal}}\ k\ then\ s\ else\ Var\ i{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  2500 \ \ {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}t\ {\isaliteral{5C3C6465677265653E}{\isasymdegree}}\ u{\isaliteral{29}{\isacharparenright}}{\isaliteral{5B}{\isacharbrackleft}}s{\isaliteral{2F}{\isacharslash}}k{\isaliteral{5D}{\isacharbrackright}}\ {\isaliteral{3D}{\isacharequal}}\ t{\isaliteral{5B}{\isacharbrackleft}}s{\isaliteral{2F}{\isacharslash}}k{\isaliteral{5D}{\isacharbrackright}}\ {\isaliteral{5C3C6465677265653E}{\isasymdegree}}\ u{\isaliteral{5B}{\isacharbrackleft}}s{\isaliteral{2F}{\isacharslash}}k{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  2501 \ \ {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}Abs\ t{\isaliteral{29}{\isacharparenright}}{\isaliteral{5B}{\isacharbrackleft}}s{\isaliteral{2F}{\isacharslash}}k{\isaliteral{5D}{\isacharbrackright}}\ {\isaliteral{3D}{\isacharequal}}\ Abs\ {\isaliteral{28}{\isacharparenleft}}t{\isaliteral{5B}{\isacharbrackleft}}lift\ s\ {\isadigit{0}}\ {\isaliteral{2F}{\isacharslash}}\ k{\isaliteral{2B}{\isacharplus}}{\isadigit{1}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  2502 \isanewline
  2503 \isacommand{inductive}\isamarkupfalse%
  2504 \ beta\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}dB\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ dB\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ bool{\isaliteral{22}{\isachardoublequoteclose}}\ \ {\isaliteral{28}{\isacharparenleft}}\isakeyword{infixl}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isaliteral{5C3C626574613E}{\isasymbeta}}{\isaliteral{22}{\isachardoublequoteclose}}\ {\isadigit{5}}{\isadigit{0}}{\isaliteral{29}{\isacharparenright}}\isanewline
  2505 \isakeyword{where}\isanewline
  2506 \ \ \ \ beta{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}Abs\ s\ {\isaliteral{5C3C6465677265653E}{\isasymdegree}}\ t\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isaliteral{5C3C626574613E}{\isasymbeta}}\ s{\isaliteral{5B}{\isacharbrackleft}}t{\isaliteral{2F}{\isacharslash}}{\isadigit{0}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  2507 \ \ {\isaliteral{7C}{\isacharbar}}\ appL{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}s\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isaliteral{5C3C626574613E}{\isasymbeta}}\ t\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ s\ {\isaliteral{5C3C6465677265653E}{\isasymdegree}}\ u\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isaliteral{5C3C626574613E}{\isasymbeta}}\ t\ {\isaliteral{5C3C6465677265653E}{\isasymdegree}}\ u{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  2508 \ \ {\isaliteral{7C}{\isacharbar}}\ appR{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}s\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isaliteral{5C3C626574613E}{\isasymbeta}}\ t\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ u\ {\isaliteral{5C3C6465677265653E}{\isasymdegree}}\ s\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isaliteral{5C3C626574613E}{\isasymbeta}}\ u\ {\isaliteral{5C3C6465677265653E}{\isasymdegree}}\ t{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  2509 \ \ {\isaliteral{7C}{\isacharbar}}\ abs{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}s\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isaliteral{5C3C626574613E}{\isasymbeta}}\ t\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ Abs\ s\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isaliteral{5C3C626574613E}{\isasymbeta}}\ Abs\ t{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  2510 \isanewline
  2511 \isacommand{code{\isaliteral{5F}{\isacharunderscore}}module}\isamarkupfalse%
  2512 \ Test\isanewline
  2513 \isakeyword{contains}\isanewline
  2514 \ \ test{\isadigit{1}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{22}{\isachardoublequoteopen}}Abs\ {\isaliteral{28}{\isacharparenleft}}Var\ {\isadigit{0}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C6465677265653E}{\isasymdegree}}\ Var\ {\isadigit{0}}\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isaliteral{5C3C626574613E}{\isasymbeta}}\ Var\ {\isadigit{0}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  2515 \ \ test{\isadigit{2}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{22}{\isachardoublequoteopen}}Abs\ {\isaliteral{28}{\isacharparenleft}}Abs\ {\isaliteral{28}{\isacharparenleft}}Var\ {\isadigit{0}}\ {\isaliteral{5C3C6465677265653E}{\isasymdegree}}\ Var\ {\isadigit{0}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C6465677265653E}{\isasymdegree}}\ {\isaliteral{28}{\isacharparenleft}}Abs\ {\isaliteral{28}{\isacharparenleft}}Var\ {\isadigit{0}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C6465677265653E}{\isasymdegree}}\ Var\ {\isadigit{0}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isaliteral{5C3C626574613E}{\isasymbeta}}\ {\isaliteral{5F}{\isacharunderscore}}{\isaliteral{22}{\isachardoublequoteclose}}%
  2516 \begin{isamarkuptext}%
  2517 In the above example, \verb|Test.test1| evaluates to a boolean,
  2518   whereas \verb|Test.test2| is a lazy sequence whose elements can be
  2519   inspected separately.%
  2520 \end{isamarkuptext}%
  2521 \isamarkuptrue%
  2522 %
  2523 \isadelimML
  2524 %
  2525 \endisadelimML
  2526 %
  2527 \isatagML
  2528 \isacommand{ML}\isamarkupfalse%
  2529 \ {\isaliteral{7B2A}{\isacharverbatimopen}}\ %
  2530 \isaantiq
  2531 assert{}%
  2532 \endisaantiq
  2533 \ Test{\isaliteral{2E}{\isachardot}}test{\isadigit{1}}\ {\isaliteral{2A7D}{\isacharverbatimclose}}\isanewline
  2534 \isacommand{ML}\isamarkupfalse%
  2535 \ {\isaliteral{7B2A}{\isacharverbatimopen}}\ val\ results\ {\isaliteral{3D}{\isacharequal}}\ DSeq{\isaliteral{2E}{\isachardot}}list{\isaliteral{5F}{\isacharunderscore}}of\ Test{\isaliteral{2E}{\isachardot}}test{\isadigit{2}}\ {\isaliteral{2A7D}{\isacharverbatimclose}}\isanewline
  2536 \isacommand{ML}\isamarkupfalse%
  2537 \ {\isaliteral{7B2A}{\isacharverbatimopen}}\ %
  2538 \isaantiq
  2539 assert{}%
  2540 \endisaantiq
  2541 \ {\isaliteral{28}{\isacharparenleft}}length\ results\ {\isaliteral{3D}{\isacharequal}}\ {\isadigit{2}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{2A7D}{\isacharverbatimclose}}%
  2542 \endisatagML
  2543 {\isafoldML}%
  2544 %
  2545 \isadelimML
  2546 %
  2547 \endisadelimML
  2548 %
  2549 \begin{isamarkuptext}%
  2550 \medskip The theory underlying the HOL code generator is described
  2551   more detailed in \cite{Berghofer-Nipkow:2002}. More examples that
  2552   illustrate the usage of the code generator can be found e.g.\ in
  2553   \verb|~~/src/HOL/MicroJava/J/JListExample.thy| and \verb|~~/src/HOL/MicroJava/JVM/JVMListExample.thy|.%
  2554 \end{isamarkuptext}%
  2555 \isamarkuptrue%
  2556 %
  2557 \isamarkupsection{Definition by specification \label{sec:hol-specification}%
  2558 }
  2559 \isamarkuptrue%
  2560 %
  2561 \begin{isamarkuptext}%
  2562 \begin{matharray}{rcl}
  2563     \indexdef{HOL}{command}{specification}\hypertarget{command.HOL.specification}{\hyperlink{command.HOL.specification}{\mbox{\isa{\isacommand{specification}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ proof{\isaliteral{28}{\isacharparenleft}}prove{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}} \\
  2564     \indexdef{HOL}{command}{ax\_specification}\hypertarget{command.HOL.ax-specification}{\hyperlink{command.HOL.ax-specification}{\mbox{\isa{\isacommand{ax{\isaliteral{5F}{\isacharunderscore}}specification}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ proof{\isaliteral{28}{\isacharparenleft}}prove{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}} \\
  2565   \end{matharray}
  2566 
  2567   \begin{railoutput}
  2568 \rail@begin{6}{\isa{}}
  2569 \rail@bar
  2570 \rail@term{\hyperlink{command.HOL.specification}{\mbox{\isa{\isacommand{specification}}}}}[]
  2571 \rail@nextbar{1}
  2572 \rail@term{\hyperlink{command.HOL.ax-specification}{\mbox{\isa{\isacommand{ax{\isaliteral{5F}{\isacharunderscore}}specification}}}}}[]
  2573 \rail@endbar
  2574 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2575 \rail@plus
  2576 \rail@nont{\isa{decl}}[]
  2577 \rail@nextplus{1}
  2578 \rail@endplus
  2579 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2580 \rail@cr{3}
  2581 \rail@plus
  2582 \rail@bar
  2583 \rail@nextbar{4}
  2584 \rail@nont{\hyperlink{syntax.thmdecl}{\mbox{\isa{thmdecl}}}}[]
  2585 \rail@endbar
  2586 \rail@nont{\hyperlink{syntax.prop}{\mbox{\isa{prop}}}}[]
  2587 \rail@nextplus{5}
  2588 \rail@endplus
  2589 \rail@end
  2590 \rail@begin{2}{\isa{decl}}
  2591 \rail@bar
  2592 \rail@nextbar{1}
  2593 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2594 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}}}[]
  2595 \rail@endbar
  2596 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  2597 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2598 \rail@term{\isa{\isakeyword{overloaded}}}[]
  2599 \rail@bar
  2600 \rail@nextbar{1}
  2601 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2602 \rail@endbar
  2603 \rail@end
  2604 \end{railoutput}
  2605 
  2606 
  2607   \begin{description}
  2608 
  2609   \item \hyperlink{command.HOL.specification}{\mbox{\isa{\isacommand{specification}}}}~\isa{{\isaliteral{22}{\isachardoublequote}}decls\ {\isaliteral{5C3C7068693E}{\isasymphi}}{\isaliteral{22}{\isachardoublequote}}} sets up a
  2610   goal stating the existence of terms with the properties specified to
  2611   hold for the constants given in \isa{decls}.  After finishing the
  2612   proof, the theory will be augmented with definitions for the given
  2613   constants, as well as with theorems stating the properties for these
  2614   constants.
  2615 
  2616   \item \hyperlink{command.HOL.ax-specification}{\mbox{\isa{\isacommand{ax{\isaliteral{5F}{\isacharunderscore}}specification}}}}~\isa{{\isaliteral{22}{\isachardoublequote}}decls\ {\isaliteral{5C3C7068693E}{\isasymphi}}{\isaliteral{22}{\isachardoublequote}}} sets up
  2617   a goal stating the existence of terms with the properties specified
  2618   to hold for the constants given in \isa{decls}.  After finishing
  2619   the proof, the theory will be augmented with axioms expressing the
  2620   properties given in the first place.
  2621 
  2622   \item \isa{decl} declares a constant to be defined by the
  2623   specification given.  The definition for the constant \isa{c} is
  2624   bound to the name \isa{c{\isaliteral{5F}{\isacharunderscore}}def} unless a theorem name is given in
  2625   the declaration.  Overloaded constants should be declared as such.
  2626 
  2627   \end{description}
  2628 
  2629   Whether to use \hyperlink{command.HOL.specification}{\mbox{\isa{\isacommand{specification}}}} or \hyperlink{command.HOL.ax-specification}{\mbox{\isa{\isacommand{ax{\isaliteral{5F}{\isacharunderscore}}specification}}}} is to some extent a matter of style.  \hyperlink{command.HOL.specification}{\mbox{\isa{\isacommand{specification}}}} introduces no new axioms, and so by
  2630   construction cannot introduce inconsistencies, whereas \hyperlink{command.HOL.ax-specification}{\mbox{\isa{\isacommand{ax{\isaliteral{5F}{\isacharunderscore}}specification}}}} does introduce axioms, but only after the
  2631   user has explicitly proven it to be safe.  A practical issue must be
  2632   considered, though: After introducing two constants with the same
  2633   properties using \hyperlink{command.HOL.specification}{\mbox{\isa{\isacommand{specification}}}}, one can prove
  2634   that the two constants are, in fact, equal.  If this might be a
  2635   problem, one should use \hyperlink{command.HOL.ax-specification}{\mbox{\isa{\isacommand{ax{\isaliteral{5F}{\isacharunderscore}}specification}}}}.%
  2636 \end{isamarkuptext}%
  2637 \isamarkuptrue%
  2638 %
  2639 \isadelimtheory
  2640 %
  2641 \endisadelimtheory
  2642 %
  2643 \isatagtheory
  2644 \isacommand{end}\isamarkupfalse%
  2645 %
  2646 \endisatagtheory
  2647 {\isafoldtheory}%
  2648 %
  2649 \isadelimtheory
  2650 %
  2651 \endisadelimtheory
  2652 \isanewline
  2653 \end{isabellebody}%
  2654 %%% Local Variables:
  2655 %%% mode: latex
  2656 %%% TeX-master: "root"
  2657 %%% End: