doc-src/IsarRef/Thy/document/HOL_Specific.tex
author bulwahn
Wed, 27 Jul 2011 20:28:00 +0200
changeset 44864 b141d7a3d4e3
parent 44785 64819f353c53
child 44865 5de4bde3ad41
permissions -rw-r--r--
rudimentary documentation of the quotient package in the isar reference manual
     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{Higher-Order Logic%
    26 }
    27 \isamarkuptrue%
    28 %
    29 \begin{isamarkuptext}%
    30 Isabelle/HOL is based on Higher-Order Logic, a polymorphic
    31   version of Church's Simple Theory of Types.  HOL can be best
    32   understood as a simply-typed version of classical set theory.  The
    33   logic was first implemented in Gordon's HOL system
    34   \cite{mgordon-hol}.  It extends Church's original logic
    35   \cite{church40} by explicit type variables (naive polymorphism) and
    36   a sound axiomatization scheme for new types based on subsets of
    37   existing types.
    38 
    39   Andrews's book \cite{andrews86} is a full description of the
    40   original Church-style higher-order logic, with proofs of correctness
    41   and completeness wrt.\ certain set-theoretic interpretations.  The
    42   particular extensions of Gordon-style HOL are explained semantically
    43   in two chapters of the 1993 HOL book \cite{pitts93}.
    44 
    45   Experience with HOL over decades has demonstrated that higher-order
    46   logic is widely applicable in many areas of mathematics and computer
    47   science.  In a sense, Higher-Order Logic is simpler than First-Order
    48   Logic, because there are fewer restrictions and special cases.  Note
    49   that HOL is \emph{weaker} than FOL with axioms for ZF set theory,
    50   which is traditionally considered the standard foundation of regular
    51   mathematics, but for most applications this does not matter.  If you
    52   prefer ML to Lisp, you will probably prefer HOL to ZF.
    53 
    54   \medskip The syntax of HOL follows \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C616D6264613E}{\isasymlambda}}{\isaliteral{22}{\isachardoublequote}}}-calculus and
    55   functional programming.  Function application is curried.  To apply
    56   the function \isa{f} of type \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C7461753E}{\isasymtau}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C7461753E}{\isasymtau}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{2}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{5C3C7461753E}{\isasymtau}}\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{3}}{\isaliteral{22}{\isachardoublequote}}} to the
    57   arguments \isa{a} and \isa{b} in HOL, you simply write \isa{{\isaliteral{22}{\isachardoublequote}}f\ a\ b{\isaliteral{22}{\isachardoublequote}}} (as in ML or Haskell).  There is no ``apply'' operator; the
    58   existing application of the Pure \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6C616D6264613E}{\isasymlambda}}{\isaliteral{22}{\isachardoublequote}}}-calculus is re-used.
    59   Note that in HOL \isa{{\isaliteral{22}{\isachardoublequote}}f\ {\isaliteral{28}{\isacharparenleft}}a{\isaliteral{2C}{\isacharcomma}}\ b{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}} means ``\isa{{\isaliteral{22}{\isachardoublequote}}f{\isaliteral{22}{\isachardoublequote}}} applied to
    60   the pair \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}a{\isaliteral{2C}{\isacharcomma}}\ b{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}} (which is notation for \isa{{\isaliteral{22}{\isachardoublequote}}Pair\ a\ b{\isaliteral{22}{\isachardoublequote}}}).  The latter typically introduces extra formal efforts that can
    61   be avoided by currying functions by default.  Explicit tuples are as
    62   infrequent in HOL formalizations as in good ML or Haskell programs.
    63 
    64   \medskip Isabelle/HOL has a distinct feel, compared to other
    65   object-logics like Isabelle/ZF.  It identifies object-level types
    66   with meta-level types, taking advantage of the default
    67   type-inference mechanism of Isabelle/Pure.  HOL fully identifies
    68   object-level functions with meta-level functions, with native
    69   abstraction and application.
    70 
    71   These identifications allow Isabelle to support HOL particularly
    72   nicely, but they also mean that HOL requires some sophistication
    73   from the user.  In particular, an understanding of Hindley-Milner
    74   type-inference with type-classes, which are both used extensively in
    75   the standard libraries and applications.  Beginners can set
    76   \hyperlink{attribute.show-types}{\mbox{\isa{show{\isaliteral{5F}{\isacharunderscore}}types}}} or even \hyperlink{attribute.show-sorts}{\mbox{\isa{show{\isaliteral{5F}{\isacharunderscore}}sorts}}} to get more
    77   explicit information about the result of type-inference.%
    78 \end{isamarkuptext}%
    79 \isamarkuptrue%
    80 %
    81 \isamarkupsection{Inductive and coinductive definitions \label{sec:hol-inductive}%
    82 }
    83 \isamarkuptrue%
    84 %
    85 \begin{isamarkuptext}%
    86 An \emph{inductive definition} specifies the least predicate
    87   or set \isa{R} closed under given rules: applying a rule to
    88   elements of \isa{R} yields a result within \isa{R}.  For
    89   example, a structural operational semantics is an inductive
    90   definition of an evaluation relation.
    91 
    92   Dually, a \emph{coinductive definition} specifies the greatest
    93   predicate or set \isa{R} that is consistent with given rules:
    94   every element of \isa{R} can be seen as arising by applying a rule
    95   to elements of \isa{R}.  An important example is using
    96   bisimulation relations to formalise equivalence of processes and
    97   infinite data structures.
    98   
    99   Both inductive and coinductive definitions are based on the
   100   Knaster-Tarski fixed-point theorem for complete lattices.  The
   101   collection of introduction rules given by the user determines a
   102   functor on subsets of set-theoretic relations.  The required
   103   monotonicity of the recursion scheme is proven as a prerequisite to
   104   the fixed-point definition and the resulting consequences.  This
   105   works by pushing inclusion through logical connectives and any other
   106   operator that might be wrapped around recursive occurrences of the
   107   defined relation: there must be a monotonicity theorem of the form
   108   \isa{{\isaliteral{22}{\isachardoublequote}}A\ {\isaliteral{5C3C6C653E}{\isasymle}}\ B\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ {\isaliteral{5C3C4D3E}{\isasymM}}\ A\ {\isaliteral{5C3C6C653E}{\isasymle}}\ {\isaliteral{5C3C4D3E}{\isasymM}}\ B{\isaliteral{22}{\isachardoublequote}}}, for each premise \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C4D3E}{\isasymM}}\ R\ t{\isaliteral{22}{\isachardoublequote}}} in an
   109   introduction rule.  The default rule declarations of Isabelle/HOL
   110   already take care of most common situations.
   111 
   112   \begin{matharray}{rcl}
   113     \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}}} \\
   114     \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}}} \\
   115     \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}}} \\
   116     \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}}} \\
   117     \indexdef{HOL}{attribute}{mono}\hypertarget{attribute.HOL.mono}{\hyperlink{attribute.HOL.mono}{\mbox{\isa{mono}}}} & : & \isa{attribute} \\
   118   \end{matharray}
   119 
   120   \begin{railoutput}
   121 \rail@begin{10}{}
   122 \rail@bar
   123 \rail@term{\hyperlink{command.HOL.inductive}{\mbox{\isa{\isacommand{inductive}}}}}[]
   124 \rail@nextbar{1}
   125 \rail@term{\hyperlink{command.HOL.inductive-set}{\mbox{\isa{\isacommand{inductive{\isaliteral{5F}{\isacharunderscore}}set}}}}}[]
   126 \rail@nextbar{2}
   127 \rail@term{\hyperlink{command.HOL.coinductive}{\mbox{\isa{\isacommand{coinductive}}}}}[]
   128 \rail@nextbar{3}
   129 \rail@term{\hyperlink{command.HOL.coinductive-set}{\mbox{\isa{\isacommand{coinductive{\isaliteral{5F}{\isacharunderscore}}set}}}}}[]
   130 \rail@endbar
   131 \rail@bar
   132 \rail@nextbar{1}
   133 \rail@nont{\hyperlink{syntax.target}{\mbox{\isa{target}}}}[]
   134 \rail@endbar
   135 \rail@cr{5}
   136 \rail@nont{\hyperlink{syntax.fixes}{\mbox{\isa{fixes}}}}[]
   137 \rail@bar
   138 \rail@nextbar{6}
   139 \rail@term{\isa{\isakeyword{for}}}[]
   140 \rail@nont{\hyperlink{syntax.fixes}{\mbox{\isa{fixes}}}}[]
   141 \rail@endbar
   142 \rail@bar
   143 \rail@nextbar{6}
   144 \rail@term{\isa{\isakeyword{where}}}[]
   145 \rail@nont{\isa{clauses}}[]
   146 \rail@endbar
   147 \rail@cr{8}
   148 \rail@bar
   149 \rail@nextbar{9}
   150 \rail@term{\isa{\isakeyword{monos}}}[]
   151 \rail@nont{\hyperlink{syntax.thmrefs}{\mbox{\isa{thmrefs}}}}[]
   152 \rail@endbar
   153 \rail@end
   154 \rail@begin{3}{\isa{clauses}}
   155 \rail@plus
   156 \rail@bar
   157 \rail@nextbar{1}
   158 \rail@nont{\hyperlink{syntax.thmdecl}{\mbox{\isa{thmdecl}}}}[]
   159 \rail@endbar
   160 \rail@nont{\hyperlink{syntax.prop}{\mbox{\isa{prop}}}}[]
   161 \rail@nextplus{2}
   162 \rail@cterm{\isa{{\isaliteral{7C}{\isacharbar}}}}[]
   163 \rail@endplus
   164 \rail@end
   165 \rail@begin{3}{}
   166 \rail@term{\hyperlink{attribute.HOL.mono}{\mbox{\isa{mono}}}}[]
   167 \rail@bar
   168 \rail@nextbar{1}
   169 \rail@term{\isa{add}}[]
   170 \rail@nextbar{2}
   171 \rail@term{\isa{del}}[]
   172 \rail@endbar
   173 \rail@end
   174 \end{railoutput}
   175 
   176 
   177   \begin{description}
   178 
   179   \item \hyperlink{command.HOL.inductive}{\mbox{\isa{\isacommand{inductive}}}} and \hyperlink{command.HOL.coinductive}{\mbox{\isa{\isacommand{coinductive}}}} define (co)inductive predicates from the introduction
   180   rules.
   181 
   182   The propositions given as \isa{{\isaliteral{22}{\isachardoublequote}}clauses{\isaliteral{22}{\isachardoublequote}}} in the \hyperlink{keyword.where}{\mbox{\isa{\isakeyword{where}}}} part are either rules of the usual \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C416E643E}{\isasymAnd}}{\isaliteral{2F}{\isacharslash}}{\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}{\isaliteral{22}{\isachardoublequote}}} format
   183   (with arbitrary nesting), or equalities using \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C65717569763E}{\isasymequiv}}{\isaliteral{22}{\isachardoublequote}}}.  The
   184   latter specifies extra-logical abbreviations in the sense of
   185   \indexref{}{command}{abbreviation}\hyperlink{command.abbreviation}{\mbox{\isa{\isacommand{abbreviation}}}}.  Introducing abstract syntax
   186   simultaneously with the actual introduction rules is occasionally
   187   useful for complex specifications.
   188 
   189   The optional \hyperlink{keyword.for}{\mbox{\isa{\isakeyword{for}}}} part contains a list of parameters of
   190   the (co)inductive predicates that remain fixed throughout the
   191   definition, in contrast to arguments of the relation that may vary
   192   in each occurrence within the given \isa{{\isaliteral{22}{\isachardoublequote}}clauses{\isaliteral{22}{\isachardoublequote}}}.
   193 
   194   The optional \hyperlink{keyword.monos}{\mbox{\isa{\isakeyword{monos}}}} declaration contains additional
   195   \emph{monotonicity theorems}, which are required for each operator
   196   applied to a recursive set in the introduction rules.
   197 
   198   \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 for
   199   native HOL predicates.  This allows to define (co)inductive sets,
   200   where multiple arguments are simulated via tuples.
   201 
   202   \item \hyperlink{attribute.HOL.mono}{\mbox{\isa{mono}}} declares monotonicity rules in the
   203   context.  These rule are involved in the automated monotonicity
   204   proof of the above inductive and coinductive definitions.
   205 
   206   \end{description}%
   207 \end{isamarkuptext}%
   208 \isamarkuptrue%
   209 %
   210 \isamarkupsubsection{Derived rules%
   211 }
   212 \isamarkuptrue%
   213 %
   214 \begin{isamarkuptext}%
   215 A (co)inductive definition of \isa{R} provides the following
   216   main theorems:
   217 
   218   \begin{description}
   219 
   220   \item \isa{R{\isaliteral{2E}{\isachardot}}intros} is the list of introduction rules as proven
   221   theorems, for the recursive predicates (or sets).  The rules are
   222   also available individually, using the names given them in the
   223   theory file;
   224 
   225   \item \isa{R{\isaliteral{2E}{\isachardot}}cases} is the case analysis (or elimination) rule;
   226 
   227   \item \isa{R{\isaliteral{2E}{\isachardot}}induct} or \isa{R{\isaliteral{2E}{\isachardot}}coinduct} is the (co)induction
   228   rule.
   229 
   230   \end{description}
   231 
   232   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
   233   defined simultaneously, the list of introduction rules is called
   234   \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
   235   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
   236   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}}}.%
   237 \end{isamarkuptext}%
   238 \isamarkuptrue%
   239 %
   240 \isamarkupsubsection{Monotonicity theorems%
   241 }
   242 \isamarkuptrue%
   243 %
   244 \begin{isamarkuptext}%
   245 The context maintains a default set of theorems that are used
   246   in monotonicity proofs.  New rules can be declared via the
   247   \hyperlink{attribute.HOL.mono}{\mbox{\isa{mono}}} attribute.  See the main Isabelle/HOL
   248   sources for some examples.  The general format of such monotonicity
   249   theorems is as follows:
   250 
   251   \begin{itemize}
   252 
   253   \item Theorems of the form \isa{{\isaliteral{22}{\isachardoublequote}}A\ {\isaliteral{5C3C6C653E}{\isasymle}}\ B\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ {\isaliteral{5C3C4D3E}{\isasymM}}\ A\ {\isaliteral{5C3C6C653E}{\isasymle}}\ {\isaliteral{5C3C4D3E}{\isasymM}}\ B{\isaliteral{22}{\isachardoublequote}}}, for proving
   254   monotonicity of inductive definitions whose introduction rules have
   255   premises involving terms such as \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C4D3E}{\isasymM}}\ R\ t{\isaliteral{22}{\isachardoublequote}}}.
   256 
   257   \item Monotonicity theorems for logical operators, which are of the
   258   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
   259   the case of the operator \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6F723E}{\isasymor}}{\isaliteral{22}{\isachardoublequote}}}, the corresponding theorem is
   260   \[
   261   \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}}}}
   262   \]
   263 
   264   \item De Morgan style equations for reasoning about the ``polarity''
   265   of expressions, e.g.
   266   \[
   267   \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6E6F743E}{\isasymnot}}\ {\isaliteral{5C3C6E6F743E}{\isasymnot}}\ P\ {\isaliteral{5C3C6C6F6E676C65667472696768746172726F773E}{\isasymlongleftrightarrow}}\ P{\isaliteral{22}{\isachardoublequote}}} \qquad\qquad
   268   \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}}}
   269   \]
   270 
   271   \item Equations for reducing complex operators to more primitive
   272   ones whose monotonicity can easily be proved, e.g.
   273   \[
   274   \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
   275   \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}}}
   276   \]
   277 
   278   \end{itemize}%
   279 \end{isamarkuptext}%
   280 \isamarkuptrue%
   281 %
   282 \isamarkupsubsubsection{Examples%
   283 }
   284 \isamarkuptrue%
   285 %
   286 \begin{isamarkuptext}%
   287 The finite powerset operator can be defined inductively like this:%
   288 \end{isamarkuptext}%
   289 \isamarkuptrue%
   290 \isacommand{inductive{\isaliteral{5F}{\isacharunderscore}}set}\isamarkupfalse%
   291 \ Fin\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ set\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ set\ set{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{for}\ A\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ set{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   292 \isakeyword{where}\isanewline
   293 \ \ empty{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{7B}{\isacharbraceleft}}{\isaliteral{7D}{\isacharbraceright}}\ {\isaliteral{5C3C696E3E}{\isasymin}}\ Fin\ A{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   294 {\isaliteral{7C}{\isacharbar}}\ insert{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}a\ {\isaliteral{5C3C696E3E}{\isasymin}}\ A\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ B\ {\isaliteral{5C3C696E3E}{\isasymin}}\ Fin\ A\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ insert\ a\ B\ {\isaliteral{5C3C696E3E}{\isasymin}}\ Fin\ A{\isaliteral{22}{\isachardoublequoteclose}}%
   295 \begin{isamarkuptext}%
   296 The accessible part of a relation is defined as follows:%
   297 \end{isamarkuptext}%
   298 \isamarkuptrue%
   299 \isacommand{inductive}\isamarkupfalse%
   300 \ acc\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ bool{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ bool{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   301 \ \ \isakeyword{for}\ r\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ bool{\isaliteral{22}{\isachardoublequoteclose}}\ \ {\isaliteral{28}{\isacharparenleft}}\isakeyword{infix}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C707265633E}{\isasymprec}}{\isaliteral{22}{\isachardoublequoteclose}}\ {\isadigit{5}}{\isadigit{0}}{\isaliteral{29}{\isacharparenright}}\isanewline
   302 \isakeyword{where}\ acc{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C416E643E}{\isasymAnd}}y{\isaliteral{2E}{\isachardot}}\ y\ {\isaliteral{5C3C707265633E}{\isasymprec}}\ x\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ acc\ r\ y{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ acc\ r\ x{\isaliteral{22}{\isachardoublequoteclose}}%
   303 \begin{isamarkuptext}%
   304 Common logical connectives can be easily characterized as
   305 non-recursive inductive definitions with parameters, but without
   306 arguments.%
   307 \end{isamarkuptext}%
   308 \isamarkuptrue%
   309 \isacommand{inductive}\isamarkupfalse%
   310 \ AND\ \isakeyword{for}\ A\ B\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ bool\isanewline
   311 \isakeyword{where}\ {\isaliteral{22}{\isachardoublequoteopen}}A\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ B\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ AND\ A\ B{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   312 \isanewline
   313 \isacommand{inductive}\isamarkupfalse%
   314 \ OR\ \isakeyword{for}\ A\ B\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ bool\isanewline
   315 \isakeyword{where}\ {\isaliteral{22}{\isachardoublequoteopen}}A\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ OR\ A\ B{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   316 \ \ {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}B\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ OR\ A\ B{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   317 \isanewline
   318 \isacommand{inductive}\isamarkupfalse%
   319 \ EXISTS\ \isakeyword{for}\ B\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ bool{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   320 \isakeyword{where}\ {\isaliteral{22}{\isachardoublequoteopen}}B\ a\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ EXISTS\ B{\isaliteral{22}{\isachardoublequoteclose}}%
   321 \begin{isamarkuptext}%
   322 Here the \isa{{\isaliteral{22}{\isachardoublequote}}cases{\isaliteral{22}{\isachardoublequote}}} or \isa{{\isaliteral{22}{\isachardoublequote}}induct{\isaliteral{22}{\isachardoublequote}}} rules produced by
   323   the \hyperlink{command.inductive}{\mbox{\isa{\isacommand{inductive}}}} package coincide with the expected
   324   elimination rules for Natural Deduction.  Already in the original
   325   article by Gerhard Gentzen \cite{Gentzen:1935} there is a hint that
   326   each connective can be characterized by its introductions, and the
   327   elimination can be constructed systematically.%
   328 \end{isamarkuptext}%
   329 \isamarkuptrue%
   330 %
   331 \isamarkupsection{Recursive functions \label{sec:recursion}%
   332 }
   333 \isamarkuptrue%
   334 %
   335 \begin{isamarkuptext}%
   336 \begin{matharray}{rcl}
   337     \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}}} \\
   338     \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}}} \\
   339     \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}}} \\
   340     \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}}} \\
   341   \end{matharray}
   342 
   343   \begin{railoutput}
   344 \rail@begin{2}{}
   345 \rail@term{\hyperlink{command.HOL.primrec}{\mbox{\isa{\isacommand{primrec}}}}}[]
   346 \rail@bar
   347 \rail@nextbar{1}
   348 \rail@nont{\hyperlink{syntax.target}{\mbox{\isa{target}}}}[]
   349 \rail@endbar
   350 \rail@nont{\hyperlink{syntax.fixes}{\mbox{\isa{fixes}}}}[]
   351 \rail@term{\isa{\isakeyword{where}}}[]
   352 \rail@nont{\isa{equations}}[]
   353 \rail@end
   354 \rail@begin{4}{}
   355 \rail@bar
   356 \rail@term{\hyperlink{command.HOL.fun}{\mbox{\isa{\isacommand{fun}}}}}[]
   357 \rail@nextbar{1}
   358 \rail@term{\hyperlink{command.HOL.function}{\mbox{\isa{\isacommand{function}}}}}[]
   359 \rail@endbar
   360 \rail@bar
   361 \rail@nextbar{1}
   362 \rail@nont{\hyperlink{syntax.target}{\mbox{\isa{target}}}}[]
   363 \rail@endbar
   364 \rail@bar
   365 \rail@nextbar{1}
   366 \rail@nont{\isa{functionopts}}[]
   367 \rail@endbar
   368 \rail@nont{\hyperlink{syntax.fixes}{\mbox{\isa{fixes}}}}[]
   369 \rail@cr{3}
   370 \rail@term{\isa{\isakeyword{where}}}[]
   371 \rail@nont{\isa{equations}}[]
   372 \rail@end
   373 \rail@begin{3}{\isa{equations}}
   374 \rail@plus
   375 \rail@bar
   376 \rail@nextbar{1}
   377 \rail@nont{\hyperlink{syntax.thmdecl}{\mbox{\isa{thmdecl}}}}[]
   378 \rail@endbar
   379 \rail@nont{\hyperlink{syntax.prop}{\mbox{\isa{prop}}}}[]
   380 \rail@nextplus{2}
   381 \rail@cterm{\isa{{\isaliteral{7C}{\isacharbar}}}}[]
   382 \rail@endplus
   383 \rail@end
   384 \rail@begin{3}{\isa{functionopts}}
   385 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
   386 \rail@plus
   387 \rail@bar
   388 \rail@term{\isa{sequential}}[]
   389 \rail@nextbar{1}
   390 \rail@term{\isa{domintros}}[]
   391 \rail@endbar
   392 \rail@nextplus{2}
   393 \rail@cterm{\isa{{\isaliteral{2C}{\isacharcomma}}}}[]
   394 \rail@endplus
   395 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
   396 \rail@end
   397 \rail@begin{2}{}
   398 \rail@term{\hyperlink{command.HOL.termination}{\mbox{\isa{\isacommand{termination}}}}}[]
   399 \rail@bar
   400 \rail@nextbar{1}
   401 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
   402 \rail@endbar
   403 \rail@end
   404 \end{railoutput}
   405 
   406 
   407   \begin{description}
   408 
   409   \item \hyperlink{command.HOL.primrec}{\mbox{\isa{\isacommand{primrec}}}} defines primitive recursive
   410   functions over datatypes (see also \indexref{HOL}{command}{datatype}\hyperlink{command.HOL.datatype}{\mbox{\isa{\isacommand{datatype}}}} and
   411   \indexref{HOL}{command}{rep\_datatype}\hyperlink{command.HOL.rep-datatype}{\mbox{\isa{\isacommand{rep{\isaliteral{5F}{\isacharunderscore}}datatype}}}}).  The given \isa{equations}
   412   specify reduction rules that are produced by instantiating the
   413   generic combinator for primitive recursion that is available for
   414   each datatype.
   415 
   416   Each equation needs to be of the form:
   417 
   418   \begin{isabelle}%
   419 {\isaliteral{22}{\isachardoublequote}}f\ x\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ x\isaliteral{5C3C5E7375623E}{}\isactrlsub m\ {\isaliteral{28}{\isacharparenleft}}C\ y\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ y\isaliteral{5C3C5E7375623E}{}\isactrlsub k{\isaliteral{29}{\isacharparenright}}\ z\isaliteral{5C3C5E7375623E}{}\isactrlsub {\isadigit{1}}\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ z\isaliteral{5C3C5E7375623E}{}\isactrlsub n\ {\isaliteral{3D}{\isacharequal}}\ rhs{\isaliteral{22}{\isachardoublequote}}%
   420 \end{isabelle}
   421 
   422   such that \isa{C} is a datatype constructor, \isa{rhs} contains
   423   only the free variables on the left-hand side (or from the context),
   424   and all recursive occurrences of \isa{{\isaliteral{22}{\isachardoublequote}}f{\isaliteral{22}{\isachardoublequote}}} in \isa{{\isaliteral{22}{\isachardoublequote}}rhs{\isaliteral{22}{\isachardoublequote}}} are of
   425   the form \isa{{\isaliteral{22}{\isachardoublequote}}f\ {\isaliteral{5C3C646F74733E}{\isasymdots}}\ y\isaliteral{5C3C5E7375623E}{}\isactrlsub i\ {\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{22}{\isachardoublequote}}} for some \isa{i}.  At most one
   426   reduction rule for each constructor can be given.  The order does
   427   not matter.  For missing constructors, the function is defined to
   428   return a default value, but this equation is made difficult to
   429   access for users.
   430 
   431   The reduction rules are declared as \hyperlink{attribute.simp}{\mbox{\isa{simp}}} by default,
   432   which enables standard proof methods like \hyperlink{method.simp}{\mbox{\isa{simp}}} and
   433   \hyperlink{method.auto}{\mbox{\isa{auto}}} to normalize expressions of \isa{{\isaliteral{22}{\isachardoublequote}}f{\isaliteral{22}{\isachardoublequote}}} applied to
   434   datatype constructions, by simulating symbolic computation via
   435   rewriting.
   436 
   437   \item \hyperlink{command.HOL.function}{\mbox{\isa{\isacommand{function}}}} defines functions by general
   438   wellfounded recursion. A detailed description with examples can be
   439   found in \cite{isabelle-function}. The function is specified by a
   440   set of (possibly conditional) recursive equations with arbitrary
   441   pattern matching. The command generates proof obligations for the
   442   completeness and the compatibility of patterns.
   443 
   444   The defined function is considered partial, and the resulting
   445   simplification rules (named \isa{{\isaliteral{22}{\isachardoublequote}}f{\isaliteral{2E}{\isachardot}}psimps{\isaliteral{22}{\isachardoublequote}}}) and induction rule
   446   (named \isa{{\isaliteral{22}{\isachardoublequote}}f{\isaliteral{2E}{\isachardot}}pinduct{\isaliteral{22}{\isachardoublequote}}}) are guarded by a generated domain
   447   predicate \isa{{\isaliteral{22}{\isachardoublequote}}f{\isaliteral{5F}{\isacharunderscore}}dom{\isaliteral{22}{\isachardoublequote}}}. The \hyperlink{command.HOL.termination}{\mbox{\isa{\isacommand{termination}}}}
   448   command can then be used to establish that the function is total.
   449 
   450   \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
   451   proof attempts regarding pattern matching and termination.  See
   452   \cite{isabelle-function} for further details.
   453 
   454   \item \hyperlink{command.HOL.termination}{\mbox{\isa{\isacommand{termination}}}}~\isa{f} commences a
   455   termination proof for the previously defined function \isa{f}.  If
   456   this is omitted, the command refers to the most recent function
   457   definition.  After the proof is closed, the recursive equations and
   458   the induction principle is established.
   459 
   460   \end{description}
   461 
   462   Recursive definitions introduced by the \hyperlink{command.HOL.function}{\mbox{\isa{\isacommand{function}}}}
   463   command accommodate reasoning by induction (cf.\ \hyperlink{method.induct}{\mbox{\isa{induct}}}):
   464   rule \isa{{\isaliteral{22}{\isachardoublequote}}f{\isaliteral{2E}{\isachardot}}induct{\isaliteral{22}{\isachardoublequote}}} refers to a specific induction rule, with
   465   parameters named according to the user-specified equations. Cases
   466   are numbered starting from 1.  For \hyperlink{command.HOL.primrec}{\mbox{\isa{\isacommand{primrec}}}}, the
   467   induction principle coincides with structural recursion on the
   468   datatype where the recursion is carried out.
   469 
   470   The equations provided by these packages may be referred later as
   471   theorem list \isa{{\isaliteral{22}{\isachardoublequote}}f{\isaliteral{2E}{\isachardot}}simps{\isaliteral{22}{\isachardoublequote}}}, where \isa{f} is the (collective)
   472   name of the functions defined.  Individual equations may be named
   473   explicitly as well.
   474 
   475   The \hyperlink{command.HOL.function}{\mbox{\isa{\isacommand{function}}}} command accepts the following
   476   options.
   477 
   478   \begin{description}
   479 
   480   \item \isa{sequential} enables a preprocessor which disambiguates
   481   overlapping patterns by making them mutually disjoint.  Earlier
   482   equations take precedence over later ones.  This allows to give the
   483   specification in a format very similar to functional programming.
   484   Note that the resulting simplification and induction rules
   485   correspond to the transformed specification, not the one given
   486   originally. This usually means that each equation given by the user
   487   may result in several theorems.  Also note that this automatic
   488   transformation only works for ML-style datatype patterns.
   489 
   490   \item \isa{domintros} enables the automated generation of
   491   introduction rules for the domain predicate. While mostly not
   492   needed, they can be helpful in some proofs about partial functions.
   493 
   494   \end{description}%
   495 \end{isamarkuptext}%
   496 \isamarkuptrue%
   497 %
   498 \isamarkupsubsubsection{Example: evaluation of expressions%
   499 }
   500 \isamarkuptrue%
   501 %
   502 \begin{isamarkuptext}%
   503 Subsequently, we define mutual datatypes for arithmetic and
   504   boolean expressions, and use \hyperlink{command.primrec}{\mbox{\isa{\isacommand{primrec}}}} for evaluation
   505   functions that follow the same recursive structure.%
   506 \end{isamarkuptext}%
   507 \isamarkuptrue%
   508 \isacommand{datatype}\isamarkupfalse%
   509 \ {\isaliteral{27}{\isacharprime}}a\ aexp\ {\isaliteral{3D}{\isacharequal}}\isanewline
   510 \ \ \ \ IF\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ bexp{\isaliteral{22}{\isachardoublequoteclose}}\ \ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ aexp{\isaliteral{22}{\isachardoublequoteclose}}\ \ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ aexp{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   511 \ \ {\isaliteral{7C}{\isacharbar}}\ Sum\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ aexp{\isaliteral{22}{\isachardoublequoteclose}}\ \ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ aexp{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   512 \ \ {\isaliteral{7C}{\isacharbar}}\ Diff\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ aexp{\isaliteral{22}{\isachardoublequoteclose}}\ \ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ aexp{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   513 \ \ {\isaliteral{7C}{\isacharbar}}\ Var\ {\isaliteral{27}{\isacharprime}}a\isanewline
   514 \ \ {\isaliteral{7C}{\isacharbar}}\ Num\ nat\isanewline
   515 \isakeyword{and}\ {\isaliteral{27}{\isacharprime}}a\ bexp\ {\isaliteral{3D}{\isacharequal}}\isanewline
   516 \ \ \ \ Less\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ aexp{\isaliteral{22}{\isachardoublequoteclose}}\ \ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ aexp{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   517 \ \ {\isaliteral{7C}{\isacharbar}}\ And\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ bexp{\isaliteral{22}{\isachardoublequoteclose}}\ \ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ bexp{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   518 \ \ {\isaliteral{7C}{\isacharbar}}\ Neg\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ bexp{\isaliteral{22}{\isachardoublequoteclose}}%
   519 \begin{isamarkuptext}%
   520 \medskip Evaluation of arithmetic and boolean expressions%
   521 \end{isamarkuptext}%
   522 \isamarkuptrue%
   523 \isacommand{primrec}\isamarkupfalse%
   524 \ evala\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ aexp\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   525 \ \ \isakeyword{and}\ evalb\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ bexp\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ bool{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   526 \isakeyword{where}\isanewline
   527 \ \ {\isaliteral{22}{\isachardoublequoteopen}}evala\ env\ {\isaliteral{28}{\isacharparenleft}}IF\ b\ a{\isadigit{1}}\ a{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}if\ evalb\ env\ b\ then\ evala\ env\ a{\isadigit{1}}\ else\ evala\ env\ a{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   528 {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}evala\ env\ {\isaliteral{28}{\isacharparenleft}}Sum\ a{\isadigit{1}}\ a{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ evala\ env\ a{\isadigit{1}}\ {\isaliteral{2B}{\isacharplus}}\ evala\ env\ a{\isadigit{2}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   529 {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}evala\ env\ {\isaliteral{28}{\isacharparenleft}}Diff\ a{\isadigit{1}}\ a{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ evala\ env\ a{\isadigit{1}}\ {\isaliteral{2D}{\isacharminus}}\ evala\ env\ a{\isadigit{2}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   530 {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}evala\ env\ {\isaliteral{28}{\isacharparenleft}}Var\ v{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ env\ v{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   531 {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}evala\ env\ {\isaliteral{28}{\isacharparenleft}}Num\ n{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ n{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   532 {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}evalb\ env\ {\isaliteral{28}{\isacharparenleft}}Less\ a{\isadigit{1}}\ a{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}evala\ env\ a{\isadigit{1}}\ {\isaliteral{3C}{\isacharless}}\ evala\ env\ a{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   533 {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}evalb\ env\ {\isaliteral{28}{\isacharparenleft}}And\ b{\isadigit{1}}\ b{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}evalb\ env\ b{\isadigit{1}}\ {\isaliteral{5C3C616E643E}{\isasymand}}\ evalb\ env\ b{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   534 {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}evalb\ env\ {\isaliteral{28}{\isacharparenleft}}Neg\ b{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C6E6F743E}{\isasymnot}}\ evalb\ env\ b{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}%
   535 \begin{isamarkuptext}%
   536 Since the value of an expression depends on the value of its
   537   variables, the functions \isa{evala} and \isa{evalb} take an
   538   additional parameter, an \emph{environment} that maps variables to
   539   their values.
   540 
   541   \medskip Substitution on expressions can be defined similarly.  The
   542   mapping \isa{f} of type \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ aexp{\isaliteral{22}{\isachardoublequote}}} given as a
   543   parameter is lifted canonically on the types \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{27}{\isacharprime}}a\ aexp{\isaliteral{22}{\isachardoublequote}}} and
   544   \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{27}{\isacharprime}}a\ bexp{\isaliteral{22}{\isachardoublequote}}}, respectively.%
   545 \end{isamarkuptext}%
   546 \isamarkuptrue%
   547 \isacommand{primrec}\isamarkupfalse%
   548 \ substa\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}b\ aexp{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ aexp\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}b\ aexp{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   549 \ \ \isakeyword{and}\ substb\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}b\ aexp{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ bexp\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}b\ bexp{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   550 \isakeyword{where}\isanewline
   551 \ \ {\isaliteral{22}{\isachardoublequoteopen}}substa\ f\ {\isaliteral{28}{\isacharparenleft}}IF\ b\ a{\isadigit{1}}\ a{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ IF\ {\isaliteral{28}{\isacharparenleft}}substb\ f\ b{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{28}{\isacharparenleft}}substa\ f\ a{\isadigit{1}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{28}{\isacharparenleft}}substa\ f\ a{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   552 {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}substa\ f\ {\isaliteral{28}{\isacharparenleft}}Sum\ a{\isadigit{1}}\ a{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ Sum\ {\isaliteral{28}{\isacharparenleft}}substa\ f\ a{\isadigit{1}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{28}{\isacharparenleft}}substa\ f\ a{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   553 {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}substa\ f\ {\isaliteral{28}{\isacharparenleft}}Diff\ a{\isadigit{1}}\ a{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ Diff\ {\isaliteral{28}{\isacharparenleft}}substa\ f\ a{\isadigit{1}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{28}{\isacharparenleft}}substa\ f\ a{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   554 {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}substa\ f\ {\isaliteral{28}{\isacharparenleft}}Var\ v{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ f\ v{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   555 {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}substa\ f\ {\isaliteral{28}{\isacharparenleft}}Num\ n{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ Num\ n{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   556 {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}substb\ f\ {\isaliteral{28}{\isacharparenleft}}Less\ a{\isadigit{1}}\ a{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ Less\ {\isaliteral{28}{\isacharparenleft}}substa\ f\ a{\isadigit{1}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{28}{\isacharparenleft}}substa\ f\ a{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   557 {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}substb\ f\ {\isaliteral{28}{\isacharparenleft}}And\ b{\isadigit{1}}\ b{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ And\ {\isaliteral{28}{\isacharparenleft}}substb\ f\ b{\isadigit{1}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{28}{\isacharparenleft}}substb\ f\ b{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   558 {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}substb\ f\ {\isaliteral{28}{\isacharparenleft}}Neg\ b{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ Neg\ {\isaliteral{28}{\isacharparenleft}}substb\ f\ b{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}%
   559 \begin{isamarkuptext}%
   560 In textbooks about semantics one often finds substitution
   561   theorems, which express the relationship between substitution and
   562   evaluation.  For \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{27}{\isacharprime}}a\ aexp{\isaliteral{22}{\isachardoublequote}}} and \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{27}{\isacharprime}}a\ bexp{\isaliteral{22}{\isachardoublequote}}}, we can prove
   563   such a theorem by mutual induction, followed by simplification.%
   564 \end{isamarkuptext}%
   565 \isamarkuptrue%
   566 \isacommand{lemma}\isamarkupfalse%
   567 \ subst{\isaliteral{5F}{\isacharunderscore}}one{\isaliteral{3A}{\isacharcolon}}\isanewline
   568 \ \ {\isaliteral{22}{\isachardoublequoteopen}}evala\ env\ {\isaliteral{28}{\isacharparenleft}}substa\ {\isaliteral{28}{\isacharparenleft}}Var\ {\isaliteral{28}{\isacharparenleft}}v\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3D}{\isacharequal}}\ a{\isaliteral{27}{\isacharprime}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ a{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ evala\ {\isaliteral{28}{\isacharparenleft}}env\ {\isaliteral{28}{\isacharparenleft}}v\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3D}{\isacharequal}}\ evala\ env\ a{\isaliteral{27}{\isacharprime}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ a{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   569 \ \ {\isaliteral{22}{\isachardoublequoteopen}}evalb\ env\ {\isaliteral{28}{\isacharparenleft}}substb\ {\isaliteral{28}{\isacharparenleft}}Var\ {\isaliteral{28}{\isacharparenleft}}v\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3D}{\isacharequal}}\ a{\isaliteral{27}{\isacharprime}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ b{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ evalb\ {\isaliteral{28}{\isacharparenleft}}env\ {\isaliteral{28}{\isacharparenleft}}v\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3D}{\isacharequal}}\ evala\ env\ a{\isaliteral{27}{\isacharprime}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ b{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   570 %
   571 \isadelimproof
   572 \ \ %
   573 \endisadelimproof
   574 %
   575 \isatagproof
   576 \isacommand{by}\isamarkupfalse%
   577 \ {\isaliteral{28}{\isacharparenleft}}induct\ a\ \isakeyword{and}\ b{\isaliteral{29}{\isacharparenright}}\ simp{\isaliteral{5F}{\isacharunderscore}}all%
   578 \endisatagproof
   579 {\isafoldproof}%
   580 %
   581 \isadelimproof
   582 \isanewline
   583 %
   584 \endisadelimproof
   585 \isanewline
   586 \isacommand{lemma}\isamarkupfalse%
   587 \ subst{\isaliteral{5F}{\isacharunderscore}}all{\isaliteral{3A}{\isacharcolon}}\isanewline
   588 \ \ {\isaliteral{22}{\isachardoublequoteopen}}evala\ env\ {\isaliteral{28}{\isacharparenleft}}substa\ s\ a{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ evala\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C6C616D6264613E}{\isasymlambda}}x{\isaliteral{2E}{\isachardot}}\ evala\ env\ {\isaliteral{28}{\isacharparenleft}}s\ x{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ a{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   589 \ \ {\isaliteral{22}{\isachardoublequoteopen}}evalb\ env\ {\isaliteral{28}{\isacharparenleft}}substb\ s\ b{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ evalb\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C6C616D6264613E}{\isasymlambda}}x{\isaliteral{2E}{\isachardot}}\ evala\ env\ {\isaliteral{28}{\isacharparenleft}}s\ x{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ b{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   590 %
   591 \isadelimproof
   592 \ \ %
   593 \endisadelimproof
   594 %
   595 \isatagproof
   596 \isacommand{by}\isamarkupfalse%
   597 \ {\isaliteral{28}{\isacharparenleft}}induct\ a\ \isakeyword{and}\ b{\isaliteral{29}{\isacharparenright}}\ simp{\isaliteral{5F}{\isacharunderscore}}all%
   598 \endisatagproof
   599 {\isafoldproof}%
   600 %
   601 \isadelimproof
   602 %
   603 \endisadelimproof
   604 %
   605 \isamarkupsubsubsection{Example: a substitution function for terms%
   606 }
   607 \isamarkuptrue%
   608 %
   609 \begin{isamarkuptext}%
   610 Functions on datatypes with nested recursion are also defined
   611   by mutual primitive recursion.%
   612 \end{isamarkuptext}%
   613 \isamarkuptrue%
   614 \isacommand{datatype}\isamarkupfalse%
   615 \ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{22}{\isachardoublequoteopen}}term{\isaliteral{22}{\isachardoublequoteclose}}\ {\isaliteral{3D}{\isacharequal}}\ Var\ {\isaliteral{27}{\isacharprime}}a\ {\isaliteral{7C}{\isacharbar}}\ App\ {\isaliteral{27}{\isacharprime}}b\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{29}{\isacharparenright}}\ term\ list{\isaliteral{22}{\isachardoublequoteclose}}%
   616 \begin{isamarkuptext}%
   617 A substitution function on type \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{29}{\isacharparenright}}\ term{\isaliteral{22}{\isachardoublequote}}} can be
   618   defined as follows, by working simultaneously on \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{29}{\isacharparenright}}\ term\ list{\isaliteral{22}{\isachardoublequote}}}:%
   619 \end{isamarkuptext}%
   620 \isamarkuptrue%
   621 \isacommand{primrec}\isamarkupfalse%
   622 \ subst{\isaliteral{5F}{\isacharunderscore}}term\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{29}{\isacharparenright}}\ term{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{29}{\isacharparenright}}\ term\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{29}{\isacharparenright}}\ term{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{and}\isanewline
   623 \ \ subst{\isaliteral{5F}{\isacharunderscore}}term{\isaliteral{5F}{\isacharunderscore}}list\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{29}{\isacharparenright}}\ term{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{29}{\isacharparenright}}\ term\ list\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{29}{\isacharparenright}}\ term\ list{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   624 \isakeyword{where}\isanewline
   625 \ \ {\isaliteral{22}{\isachardoublequoteopen}}subst{\isaliteral{5F}{\isacharunderscore}}term\ f\ {\isaliteral{28}{\isacharparenleft}}Var\ a{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ f\ a{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   626 {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}subst{\isaliteral{5F}{\isacharunderscore}}term\ f\ {\isaliteral{28}{\isacharparenleft}}App\ b\ ts{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ App\ b\ {\isaliteral{28}{\isacharparenleft}}subst{\isaliteral{5F}{\isacharunderscore}}term{\isaliteral{5F}{\isacharunderscore}}list\ f\ ts{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   627 {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}subst{\isaliteral{5F}{\isacharunderscore}}term{\isaliteral{5F}{\isacharunderscore}}list\ f\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   628 {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}subst{\isaliteral{5F}{\isacharunderscore}}term{\isaliteral{5F}{\isacharunderscore}}list\ f\ {\isaliteral{28}{\isacharparenleft}}t\ {\isaliteral{23}{\isacharhash}}\ ts{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ subst{\isaliteral{5F}{\isacharunderscore}}term\ f\ t\ {\isaliteral{23}{\isacharhash}}\ subst{\isaliteral{5F}{\isacharunderscore}}term{\isaliteral{5F}{\isacharunderscore}}list\ f\ ts{\isaliteral{22}{\isachardoublequoteclose}}%
   629 \begin{isamarkuptext}%
   630 The recursion scheme follows the structure of the unfolded
   631   definition of type \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{29}{\isacharparenright}}\ term{\isaliteral{22}{\isachardoublequote}}}.  To prove properties of this
   632   substitution function, mutual induction is needed:%
   633 \end{isamarkuptext}%
   634 \isamarkuptrue%
   635 \isacommand{lemma}\isamarkupfalse%
   636 \ {\isaliteral{22}{\isachardoublequoteopen}}subst{\isaliteral{5F}{\isacharunderscore}}term\ {\isaliteral{28}{\isacharparenleft}}subst{\isaliteral{5F}{\isacharunderscore}}term\ f{\isadigit{1}}\ {\isaliteral{5C3C636972633E}{\isasymcirc}}\ f{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}\ t\ {\isaliteral{3D}{\isacharequal}}\ subst{\isaliteral{5F}{\isacharunderscore}}term\ f{\isadigit{1}}\ {\isaliteral{28}{\isacharparenleft}}subst{\isaliteral{5F}{\isacharunderscore}}term\ f{\isadigit{2}}\ t{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{and}\isanewline
   637 \ \ {\isaliteral{22}{\isachardoublequoteopen}}subst{\isaliteral{5F}{\isacharunderscore}}term{\isaliteral{5F}{\isacharunderscore}}list\ {\isaliteral{28}{\isacharparenleft}}subst{\isaliteral{5F}{\isacharunderscore}}term\ f{\isadigit{1}}\ {\isaliteral{5C3C636972633E}{\isasymcirc}}\ f{\isadigit{2}}{\isaliteral{29}{\isacharparenright}}\ ts\ {\isaliteral{3D}{\isacharequal}}\ subst{\isaliteral{5F}{\isacharunderscore}}term{\isaliteral{5F}{\isacharunderscore}}list\ f{\isadigit{1}}\ {\isaliteral{28}{\isacharparenleft}}subst{\isaliteral{5F}{\isacharunderscore}}term{\isaliteral{5F}{\isacharunderscore}}list\ f{\isadigit{2}}\ ts{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   638 %
   639 \isadelimproof
   640 \ \ %
   641 \endisadelimproof
   642 %
   643 \isatagproof
   644 \isacommand{by}\isamarkupfalse%
   645 \ {\isaliteral{28}{\isacharparenleft}}induct\ t\ \isakeyword{and}\ ts{\isaliteral{29}{\isacharparenright}}\ simp{\isaliteral{5F}{\isacharunderscore}}all%
   646 \endisatagproof
   647 {\isafoldproof}%
   648 %
   649 \isadelimproof
   650 %
   651 \endisadelimproof
   652 %
   653 \isamarkupsubsubsection{Example: a map function for infinitely branching trees%
   654 }
   655 \isamarkuptrue%
   656 %
   657 \begin{isamarkuptext}%
   658 Defining functions on infinitely branching datatypes by
   659   primitive recursion is just as easy.%
   660 \end{isamarkuptext}%
   661 \isamarkuptrue%
   662 \isacommand{datatype}\isamarkupfalse%
   663 \ {\isaliteral{27}{\isacharprime}}a\ tree\ {\isaliteral{3D}{\isacharequal}}\ Atom\ {\isaliteral{27}{\isacharprime}}a\ {\isaliteral{7C}{\isacharbar}}\ Branch\ {\isaliteral{22}{\isachardoublequoteopen}}nat\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ tree{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   664 \isanewline
   665 \isacommand{primrec}\isamarkupfalse%
   666 \ map{\isaliteral{5F}{\isacharunderscore}}tree\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ tree\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}b\ tree{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   667 \isakeyword{where}\isanewline
   668 \ \ {\isaliteral{22}{\isachardoublequoteopen}}map{\isaliteral{5F}{\isacharunderscore}}tree\ f\ {\isaliteral{28}{\isacharparenleft}}Atom\ a{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ Atom\ {\isaliteral{28}{\isacharparenleft}}f\ a{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   669 {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}map{\isaliteral{5F}{\isacharunderscore}}tree\ f\ {\isaliteral{28}{\isacharparenleft}}Branch\ ts{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ Branch\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C6C616D6264613E}{\isasymlambda}}x{\isaliteral{2E}{\isachardot}}\ map{\isaliteral{5F}{\isacharunderscore}}tree\ f\ {\isaliteral{28}{\isacharparenleft}}ts\ x{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}%
   670 \begin{isamarkuptext}%
   671 Note that all occurrences of functions such as \isa{ts}
   672   above must be applied to an argument.  In particular, \isa{{\isaliteral{22}{\isachardoublequote}}map{\isaliteral{5F}{\isacharunderscore}}tree\ f\ {\isaliteral{5C3C636972633E}{\isasymcirc}}\ ts{\isaliteral{22}{\isachardoublequote}}} is not allowed here.%
   673 \end{isamarkuptext}%
   674 \isamarkuptrue%
   675 %
   676 \begin{isamarkuptext}%
   677 Here is a simple composition lemma for \isa{map{\isaliteral{5F}{\isacharunderscore}}tree}:%
   678 \end{isamarkuptext}%
   679 \isamarkuptrue%
   680 \isacommand{lemma}\isamarkupfalse%
   681 \ {\isaliteral{22}{\isachardoublequoteopen}}map{\isaliteral{5F}{\isacharunderscore}}tree\ g\ {\isaliteral{28}{\isacharparenleft}}map{\isaliteral{5F}{\isacharunderscore}}tree\ f\ t{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ map{\isaliteral{5F}{\isacharunderscore}}tree\ {\isaliteral{28}{\isacharparenleft}}g\ {\isaliteral{5C3C636972633E}{\isasymcirc}}\ f{\isaliteral{29}{\isacharparenright}}\ t{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
   682 %
   683 \isadelimproof
   684 \ \ %
   685 \endisadelimproof
   686 %
   687 \isatagproof
   688 \isacommand{by}\isamarkupfalse%
   689 \ {\isaliteral{28}{\isacharparenleft}}induct\ t{\isaliteral{29}{\isacharparenright}}\ simp{\isaliteral{5F}{\isacharunderscore}}all%
   690 \endisatagproof
   691 {\isafoldproof}%
   692 %
   693 \isadelimproof
   694 %
   695 \endisadelimproof
   696 %
   697 \isamarkupsubsection{Proof methods related to recursive definitions%
   698 }
   699 \isamarkuptrue%
   700 %
   701 \begin{isamarkuptext}%
   702 \begin{matharray}{rcl}
   703     \indexdef{HOL}{method}{pat\_completeness}\hypertarget{method.HOL.pat-completeness}{\hyperlink{method.HOL.pat-completeness}{\mbox{\isa{pat{\isaliteral{5F}{\isacharunderscore}}completeness}}}} & : & \isa{method} \\
   704     \indexdef{HOL}{method}{relation}\hypertarget{method.HOL.relation}{\hyperlink{method.HOL.relation}{\mbox{\isa{relation}}}} & : & \isa{method} \\
   705     \indexdef{HOL}{method}{lexicographic\_order}\hypertarget{method.HOL.lexicographic-order}{\hyperlink{method.HOL.lexicographic-order}{\mbox{\isa{lexicographic{\isaliteral{5F}{\isacharunderscore}}order}}}} & : & \isa{method} \\
   706     \indexdef{HOL}{method}{size\_change}\hypertarget{method.HOL.size-change}{\hyperlink{method.HOL.size-change}{\mbox{\isa{size{\isaliteral{5F}{\isacharunderscore}}change}}}} & : & \isa{method} \\
   707   \end{matharray}
   708 
   709   \begin{railoutput}
   710 \rail@begin{1}{}
   711 \rail@term{\hyperlink{method.HOL.relation}{\mbox{\isa{relation}}}}[]
   712 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
   713 \rail@end
   714 \rail@begin{2}{}
   715 \rail@term{\hyperlink{method.HOL.lexicographic-order}{\mbox{\isa{lexicographic{\isaliteral{5F}{\isacharunderscore}}order}}}}[]
   716 \rail@plus
   717 \rail@nextplus{1}
   718 \rail@cnont{\hyperlink{syntax.clasimpmod}{\mbox{\isa{clasimpmod}}}}[]
   719 \rail@endplus
   720 \rail@end
   721 \rail@begin{2}{}
   722 \rail@term{\hyperlink{method.HOL.size-change}{\mbox{\isa{size{\isaliteral{5F}{\isacharunderscore}}change}}}}[]
   723 \rail@nont{\isa{orders}}[]
   724 \rail@plus
   725 \rail@nextplus{1}
   726 \rail@cnont{\hyperlink{syntax.clasimpmod}{\mbox{\isa{clasimpmod}}}}[]
   727 \rail@endplus
   728 \rail@end
   729 \rail@begin{4}{\isa{orders}}
   730 \rail@plus
   731 \rail@nextplus{1}
   732 \rail@bar
   733 \rail@term{\isa{max}}[]
   734 \rail@nextbar{2}
   735 \rail@term{\isa{min}}[]
   736 \rail@nextbar{3}
   737 \rail@term{\isa{ms}}[]
   738 \rail@endbar
   739 \rail@endplus
   740 \rail@end
   741 \end{railoutput}
   742 
   743 
   744   \begin{description}
   745 
   746   \item \hyperlink{method.HOL.pat-completeness}{\mbox{\isa{pat{\isaliteral{5F}{\isacharunderscore}}completeness}}} is a specialized method to
   747   solve goals regarding the completeness of pattern matching, as
   748   required by the \hyperlink{command.HOL.function}{\mbox{\isa{\isacommand{function}}}} package (cf.\
   749   \cite{isabelle-function}).
   750 
   751   \item \hyperlink{method.HOL.relation}{\mbox{\isa{relation}}}~\isa{R} introduces a termination
   752   proof using the relation \isa{R}.  The resulting proof state will
   753   contain goals expressing that \isa{R} is wellfounded, and that the
   754   arguments of recursive calls decrease with respect to \isa{R}.
   755   Usually, this method is used as the initial proof step of manual
   756   termination proofs.
   757 
   758   \item \hyperlink{method.HOL.lexicographic-order}{\mbox{\isa{lexicographic{\isaliteral{5F}{\isacharunderscore}}order}}} attempts a fully
   759   automated termination proof by searching for a lexicographic
   760   combination of size measures on the arguments of the function. The
   761   method accepts the same arguments as the \hyperlink{method.auto}{\mbox{\isa{auto}}} method,
   762   which it uses internally to prove local descents.  The \hyperlink{syntax.clasimpmod}{\mbox{\isa{clasimpmod}}} modifiers are accepted (as for \hyperlink{method.auto}{\mbox{\isa{auto}}}).
   763 
   764   In case of failure, extensive information is printed, which can help
   765   to analyse the situation (cf.\ \cite{isabelle-function}).
   766 
   767   \item \hyperlink{method.HOL.size-change}{\mbox{\isa{size{\isaliteral{5F}{\isacharunderscore}}change}}} also works on termination goals,
   768   using a variation of the size-change principle, together with a
   769   graph decomposition technique (see \cite{krauss_phd} for details).
   770   Three kinds of orders are used internally: \isa{max}, \isa{min},
   771   and \isa{ms} (multiset), which is only available when the theory
   772   \isa{Multiset} is loaded. When no order kinds are given, they are
   773   tried in order. The search for a termination proof uses SAT solving
   774   internally.
   775 
   776   For local descent proofs, the \hyperlink{syntax.clasimpmod}{\mbox{\isa{clasimpmod}}} modifiers are
   777   accepted (as for \hyperlink{method.auto}{\mbox{\isa{auto}}}).
   778 
   779   \end{description}%
   780 \end{isamarkuptext}%
   781 \isamarkuptrue%
   782 %
   783 \isamarkupsubsection{Functions with explicit partiality%
   784 }
   785 \isamarkuptrue%
   786 %
   787 \begin{isamarkuptext}%
   788 \begin{matharray}{rcl}
   789     \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}}} \\
   790     \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} \\
   791   \end{matharray}
   792 
   793   \begin{railoutput}
   794 \rail@begin{5}{}
   795 \rail@term{\hyperlink{command.HOL.partial-function}{\mbox{\isa{\isacommand{partial{\isaliteral{5F}{\isacharunderscore}}function}}}}}[]
   796 \rail@bar
   797 \rail@nextbar{1}
   798 \rail@nont{\hyperlink{syntax.target}{\mbox{\isa{target}}}}[]
   799 \rail@endbar
   800 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
   801 \rail@nont{\hyperlink{syntax.nameref}{\mbox{\isa{nameref}}}}[]
   802 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
   803 \rail@nont{\hyperlink{syntax.fixes}{\mbox{\isa{fixes}}}}[]
   804 \rail@cr{3}
   805 \rail@term{\isa{\isakeyword{where}}}[]
   806 \rail@bar
   807 \rail@nextbar{4}
   808 \rail@nont{\hyperlink{syntax.thmdecl}{\mbox{\isa{thmdecl}}}}[]
   809 \rail@endbar
   810 \rail@nont{\hyperlink{syntax.prop}{\mbox{\isa{prop}}}}[]
   811 \rail@end
   812 \end{railoutput}
   813 
   814 
   815   \begin{description}
   816 
   817   \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
   818   recursive functions based on fixpoints in complete partial
   819   orders. No termination proof is required from the user or
   820   constructed internally. Instead, the possibility of non-termination
   821   is modelled explicitly in the result type, which contains an
   822   explicit bottom element.
   823 
   824   Pattern matching and mutual recursion are currently not supported.
   825   Thus, the specification consists of a single function described by a
   826   single recursive equation.
   827 
   828   There are no fixed syntactic restrictions on the body of the
   829   function, but the induced functional must be provably monotonic
   830   wrt.\ the underlying order.  The monotonicitity proof is performed
   831   internally, and the definition is rejected when it fails. The proof
   832   can be influenced by declaring hints using the
   833   \hyperlink{attribute.HOL.partial-function-mono}{\mbox{\isa{partial{\isaliteral{5F}{\isacharunderscore}}function{\isaliteral{5F}{\isacharunderscore}}mono}}} attribute.
   834 
   835   The mandatory \isa{mode} argument specifies the mode of operation
   836   of the command, which directly corresponds to a complete partial
   837   order on the result type. By default, the following modes are
   838   defined:
   839 
   840   \begin{description}
   841   \item \isa{option} defines functions that map into the \isa{option} type. Here, the value \isa{None} is used to model a
   842   non-terminating computation. Monotonicity requires that if \isa{None} is returned by a recursive call, then the overall result
   843   must also be \isa{None}. This is best achieved through the use of
   844   the monadic operator \isa{{\isaliteral{22}{\isachardoublequote}}Option{\isaliteral{2E}{\isachardot}}bind{\isaliteral{22}{\isachardoublequote}}}.
   845 
   846   \item \isa{tailrec} defines functions with an arbitrary result
   847   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
   848   if \isa{undefined} is returned by a recursive call, then the
   849   overall result must also be \isa{undefined}. In practice, this is
   850   only satisfied when each recursive call is a tail call, whose result
   851   is directly returned. Thus, this mode of operation allows the
   852   definition of arbitrary tail-recursive functions.
   853   \end{description}
   854 
   855   Experienced users may define new modes by instantiating the locale
   856   \isa{{\isaliteral{22}{\isachardoublequote}}partial{\isaliteral{5F}{\isacharunderscore}}function{\isaliteral{5F}{\isacharunderscore}}definitions{\isaliteral{22}{\isachardoublequote}}} appropriately.
   857 
   858   \item \hyperlink{attribute.HOL.partial-function-mono}{\mbox{\isa{partial{\isaliteral{5F}{\isacharunderscore}}function{\isaliteral{5F}{\isacharunderscore}}mono}}} declares rules for
   859   use in the internal monononicity proofs of partial function
   860   definitions.
   861 
   862   \end{description}%
   863 \end{isamarkuptext}%
   864 \isamarkuptrue%
   865 %
   866 \isamarkupsubsection{Old-style recursive function definitions (TFL)%
   867 }
   868 \isamarkuptrue%
   869 %
   870 \begin{isamarkuptext}%
   871 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.
   872 
   873   \begin{matharray}{rcl}
   874     \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}}} \\
   875     \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}}} \\
   876   \end{matharray}
   877 
   878   \begin{railoutput}
   879 \rail@begin{5}{}
   880 \rail@term{\hyperlink{command.HOL.recdef}{\mbox{\isa{\isacommand{recdef}}}}}[]
   881 \rail@bar
   882 \rail@nextbar{1}
   883 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
   884 \rail@term{\isa{\isakeyword{permissive}}}[]
   885 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
   886 \rail@endbar
   887 \rail@cr{3}
   888 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
   889 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
   890 \rail@plus
   891 \rail@nont{\hyperlink{syntax.prop}{\mbox{\isa{prop}}}}[]
   892 \rail@nextplus{4}
   893 \rail@endplus
   894 \rail@bar
   895 \rail@nextbar{4}
   896 \rail@nont{\isa{hints}}[]
   897 \rail@endbar
   898 \rail@end
   899 \rail@begin{2}{}
   900 \rail@nont{\isa{recdeftc}}[]
   901 \rail@bar
   902 \rail@nextbar{1}
   903 \rail@nont{\hyperlink{syntax.thmdecl}{\mbox{\isa{thmdecl}}}}[]
   904 \rail@endbar
   905 \rail@nont{\isa{tc}}[]
   906 \rail@end
   907 \rail@begin{2}{\isa{hints}}
   908 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
   909 \rail@term{\isa{\isakeyword{hints}}}[]
   910 \rail@plus
   911 \rail@nextplus{1}
   912 \rail@cnont{\isa{recdefmod}}[]
   913 \rail@endplus
   914 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
   915 \rail@end
   916 \rail@begin{4}{\isa{recdefmod}}
   917 \rail@bar
   918 \rail@bar
   919 \rail@term{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}simp}}[]
   920 \rail@nextbar{1}
   921 \rail@term{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}cong}}[]
   922 \rail@nextbar{2}
   923 \rail@term{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}wf}}[]
   924 \rail@endbar
   925 \rail@bar
   926 \rail@nextbar{1}
   927 \rail@term{\isa{add}}[]
   928 \rail@nextbar{2}
   929 \rail@term{\isa{del}}[]
   930 \rail@endbar
   931 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}}}[]
   932 \rail@nont{\hyperlink{syntax.thmrefs}{\mbox{\isa{thmrefs}}}}[]
   933 \rail@nextbar{3}
   934 \rail@nont{\hyperlink{syntax.clasimpmod}{\mbox{\isa{clasimpmod}}}}[]
   935 \rail@endbar
   936 \rail@end
   937 \rail@begin{2}{\isa{tc}}
   938 \rail@nont{\hyperlink{syntax.nameref}{\mbox{\isa{nameref}}}}[]
   939 \rail@bar
   940 \rail@nextbar{1}
   941 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
   942 \rail@nont{\hyperlink{syntax.nat}{\mbox{\isa{nat}}}}[]
   943 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
   944 \rail@endbar
   945 \rail@end
   946 \end{railoutput}
   947 
   948 
   949   \begin{description}
   950 
   951   \item \hyperlink{command.HOL.recdef}{\mbox{\isa{\isacommand{recdef}}}} defines general well-founded
   952   recursive functions (using the TFL package), see also
   953   \cite{isabelle-HOL}.  The ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}permissive{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}}'' option tells
   954   TFL to recover from failed proof attempts, returning unfinished
   955   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
   956   automated proof process of TFL.  Additional \hyperlink{syntax.clasimpmod}{\mbox{\isa{clasimpmod}}}
   957   declarations may be given to tune the context of the Simplifier
   958   (cf.\ \secref{sec:simplifier}) and Classical reasoner (cf.\
   959   \secref{sec:classical}).
   960 
   961   \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
   962   proof for leftover termination condition number \isa{i} (default
   963   1) as generated by a \hyperlink{command.HOL.recdef}{\mbox{\isa{\isacommand{recdef}}}} definition of
   964   constant \isa{c}.
   965 
   966   Note that in most cases, \hyperlink{command.HOL.recdef}{\mbox{\isa{\isacommand{recdef}}}} is able to finish
   967   its internal proofs without manual intervention.
   968 
   969   \end{description}
   970 
   971   \medskip Hints for \hyperlink{command.HOL.recdef}{\mbox{\isa{\isacommand{recdef}}}} may be also declared
   972   globally, using the following attributes.
   973 
   974   \begin{matharray}{rcl}
   975     \indexdef{HOL}{attribute}{recdef\_simp}\hypertarget{attribute.HOL.recdef-simp}{\hyperlink{attribute.HOL.recdef-simp}{\mbox{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}simp}}}} & : & \isa{attribute} \\
   976     \indexdef{HOL}{attribute}{recdef\_cong}\hypertarget{attribute.HOL.recdef-cong}{\hyperlink{attribute.HOL.recdef-cong}{\mbox{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}cong}}}} & : & \isa{attribute} \\
   977     \indexdef{HOL}{attribute}{recdef\_wf}\hypertarget{attribute.HOL.recdef-wf}{\hyperlink{attribute.HOL.recdef-wf}{\mbox{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}wf}}}} & : & \isa{attribute} \\
   978   \end{matharray}
   979 
   980   \begin{railoutput}
   981 \rail@begin{3}{}
   982 \rail@bar
   983 \rail@term{\hyperlink{attribute.HOL.recdef-simp}{\mbox{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}simp}}}}[]
   984 \rail@nextbar{1}
   985 \rail@term{\hyperlink{attribute.HOL.recdef-cong}{\mbox{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}cong}}}}[]
   986 \rail@nextbar{2}
   987 \rail@term{\hyperlink{attribute.HOL.recdef-wf}{\mbox{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}wf}}}}[]
   988 \rail@endbar
   989 \rail@bar
   990 \rail@nextbar{1}
   991 \rail@term{\isa{add}}[]
   992 \rail@nextbar{2}
   993 \rail@term{\isa{del}}[]
   994 \rail@endbar
   995 \rail@end
   996 \end{railoutput}%
   997 \end{isamarkuptext}%
   998 \isamarkuptrue%
   999 %
  1000 \isamarkupsection{Datatypes \label{sec:hol-datatype}%
  1001 }
  1002 \isamarkuptrue%
  1003 %
  1004 \begin{isamarkuptext}%
  1005 \begin{matharray}{rcl}
  1006     \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}}} \\
  1007     \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}}} \\
  1008   \end{matharray}
  1009 
  1010   \begin{railoutput}
  1011 \rail@begin{2}{}
  1012 \rail@term{\hyperlink{command.HOL.datatype}{\mbox{\isa{\isacommand{datatype}}}}}[]
  1013 \rail@plus
  1014 \rail@nont{\isa{spec}}[]
  1015 \rail@nextplus{1}
  1016 \rail@cterm{\isa{\isakeyword{and}}}[]
  1017 \rail@endplus
  1018 \rail@end
  1019 \rail@begin{3}{}
  1020 \rail@term{\hyperlink{command.HOL.rep-datatype}{\mbox{\isa{\isacommand{rep{\isaliteral{5F}{\isacharunderscore}}datatype}}}}}[]
  1021 \rail@bar
  1022 \rail@nextbar{1}
  1023 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  1024 \rail@plus
  1025 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1026 \rail@nextplus{2}
  1027 \rail@endplus
  1028 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  1029 \rail@endbar
  1030 \rail@plus
  1031 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  1032 \rail@nextplus{1}
  1033 \rail@endplus
  1034 \rail@end
  1035 \rail@begin{2}{\isa{spec}}
  1036 \rail@bar
  1037 \rail@nextbar{1}
  1038 \rail@nont{\hyperlink{syntax.parname}{\mbox{\isa{parname}}}}[]
  1039 \rail@endbar
  1040 \rail@nont{\hyperlink{syntax.typespec}{\mbox{\isa{typespec}}}}[]
  1041 \rail@bar
  1042 \rail@nextbar{1}
  1043 \rail@nont{\hyperlink{syntax.mixfix}{\mbox{\isa{mixfix}}}}[]
  1044 \rail@endbar
  1045 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
  1046 \rail@plus
  1047 \rail@nont{\isa{cons}}[]
  1048 \rail@nextplus{1}
  1049 \rail@cterm{\isa{{\isaliteral{7C}{\isacharbar}}}}[]
  1050 \rail@endplus
  1051 \rail@end
  1052 \rail@begin{2}{\isa{cons}}
  1053 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1054 \rail@plus
  1055 \rail@nextplus{1}
  1056 \rail@cnont{\hyperlink{syntax.type}{\mbox{\isa{type}}}}[]
  1057 \rail@endplus
  1058 \rail@bar
  1059 \rail@nextbar{1}
  1060 \rail@nont{\hyperlink{syntax.mixfix}{\mbox{\isa{mixfix}}}}[]
  1061 \rail@endbar
  1062 \rail@end
  1063 \end{railoutput}
  1064 
  1065 
  1066   \begin{description}
  1067 
  1068   \item \hyperlink{command.HOL.datatype}{\mbox{\isa{\isacommand{datatype}}}} defines inductive datatypes in
  1069   HOL.
  1070 
  1071   \item \hyperlink{command.HOL.rep-datatype}{\mbox{\isa{\isacommand{rep{\isaliteral{5F}{\isacharunderscore}}datatype}}}} represents existing types as
  1072   datatypes.
  1073 
  1074   For foundational reasons, some basic types such as \isa{nat}, \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C74696D65733E}{\isasymtimes}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{22}{\isachardoublequote}}}, \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{2B}{\isacharplus}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{22}{\isachardoublequote}}}, \isa{bool} and \isa{unit} are
  1075   introduced by more primitive means using \indexref{}{command}{typedef}\hyperlink{command.typedef}{\mbox{\isa{\isacommand{typedef}}}}.  To
  1076   recover the rich infrastructure of \hyperlink{command.datatype}{\mbox{\isa{\isacommand{datatype}}}} (e.g.\ rules
  1077   for \hyperlink{method.cases}{\mbox{\isa{cases}}} and \hyperlink{method.induct}{\mbox{\isa{induct}}} and the primitive recursion
  1078   combinators), such types may be represented as actual datatypes
  1079   later.  This is done by specifying the constructors of the desired
  1080   type, and giving a proof of the induction rule, distinctness and
  1081   injectivity of constructors.
  1082 
  1083   For example, see \verb|~~/src/HOL/Sum_Type.thy| for the
  1084   representation of the primitive sum type as fully-featured datatype.
  1085 
  1086   \end{description}
  1087 
  1088   The generated rules for \hyperlink{method.induct}{\mbox{\isa{induct}}} and \hyperlink{method.cases}{\mbox{\isa{cases}}} provide
  1089   case names according to the given constructors, while parameters are
  1090   named after the types (see also \secref{sec:cases-induct}).
  1091 
  1092   See \cite{isabelle-HOL} for more details on datatypes, but beware of
  1093   the old-style theory syntax being used there!  Apart from proper
  1094   proof methods for case-analysis and induction, there are also
  1095   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
  1096   to refer directly to the internal structure of subgoals (including
  1097   internally bound parameters).%
  1098 \end{isamarkuptext}%
  1099 \isamarkuptrue%
  1100 %
  1101 \isamarkupsubsubsection{Examples%
  1102 }
  1103 \isamarkuptrue%
  1104 %
  1105 \begin{isamarkuptext}%
  1106 We define a type of finite sequences, with slightly different
  1107   names than the existing \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{27}{\isacharprime}}a\ list{\isaliteral{22}{\isachardoublequote}}} that is already in \hyperlink{theory.Main}{\mbox{\isa{Main}}}:%
  1108 \end{isamarkuptext}%
  1109 \isamarkuptrue%
  1110 \isacommand{datatype}\isamarkupfalse%
  1111 \ {\isaliteral{27}{\isacharprime}}a\ seq\ {\isaliteral{3D}{\isacharequal}}\ Empty\ {\isaliteral{7C}{\isacharbar}}\ Seq\ {\isaliteral{27}{\isacharprime}}a\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ seq{\isaliteral{22}{\isachardoublequoteclose}}%
  1112 \begin{isamarkuptext}%
  1113 We can now prove some simple lemma by structural induction:%
  1114 \end{isamarkuptext}%
  1115 \isamarkuptrue%
  1116 \isacommand{lemma}\isamarkupfalse%
  1117 \ {\isaliteral{22}{\isachardoublequoteopen}}Seq\ x\ xs\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ xs{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  1118 %
  1119 \isadelimproof
  1120 %
  1121 \endisadelimproof
  1122 %
  1123 \isatagproof
  1124 \isacommand{proof}\isamarkupfalse%
  1125 \ {\isaliteral{28}{\isacharparenleft}}induct\ xs\ arbitrary{\isaliteral{3A}{\isacharcolon}}\ x{\isaliteral{29}{\isacharparenright}}\isanewline
  1126 \ \ \isacommand{case}\isamarkupfalse%
  1127 \ Empty%
  1128 \begin{isamarkuptxt}%
  1129 This case can be proved using the simplifier: the freeness
  1130     properties of the datatype are already declared as \hyperlink{attribute.simp}{\mbox{\isa{simp}}} rules.%
  1131 \end{isamarkuptxt}%
  1132 \isamarkuptrue%
  1133 \ \ \isacommand{show}\isamarkupfalse%
  1134 \ {\isaliteral{22}{\isachardoublequoteopen}}Seq\ x\ Empty\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ Empty{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  1135 \ \ \ \ \isacommand{by}\isamarkupfalse%
  1136 \ simp\isanewline
  1137 \isacommand{next}\isamarkupfalse%
  1138 \isanewline
  1139 \ \ \isacommand{case}\isamarkupfalse%
  1140 \ {\isaliteral{28}{\isacharparenleft}}Seq\ y\ ys{\isaliteral{29}{\isacharparenright}}%
  1141 \begin{isamarkuptxt}%
  1142 The step case is proved similarly.%
  1143 \end{isamarkuptxt}%
  1144 \isamarkuptrue%
  1145 \ \ \isacommand{show}\isamarkupfalse%
  1146 \ {\isaliteral{22}{\isachardoublequoteopen}}Seq\ x\ {\isaliteral{28}{\isacharparenleft}}Seq\ y\ ys{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ Seq\ y\ ys{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  1147 \ \ \ \ \isacommand{using}\isamarkupfalse%
  1148 \ {\isaliteral{60}{\isacharbackquoteopen}}Seq\ y\ ys\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ ys{\isaliteral{60}{\isacharbackquoteclose}}\ \isacommand{by}\isamarkupfalse%
  1149 \ simp\isanewline
  1150 \isacommand{qed}\isamarkupfalse%
  1151 %
  1152 \endisatagproof
  1153 {\isafoldproof}%
  1154 %
  1155 \isadelimproof
  1156 %
  1157 \endisadelimproof
  1158 %
  1159 \begin{isamarkuptext}%
  1160 Here is a more succinct version of the same proof:%
  1161 \end{isamarkuptext}%
  1162 \isamarkuptrue%
  1163 \isacommand{lemma}\isamarkupfalse%
  1164 \ {\isaliteral{22}{\isachardoublequoteopen}}Seq\ x\ xs\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ xs{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  1165 %
  1166 \isadelimproof
  1167 \ \ %
  1168 \endisadelimproof
  1169 %
  1170 \isatagproof
  1171 \isacommand{by}\isamarkupfalse%
  1172 \ {\isaliteral{28}{\isacharparenleft}}induct\ xs\ arbitrary{\isaliteral{3A}{\isacharcolon}}\ x{\isaliteral{29}{\isacharparenright}}\ simp{\isaliteral{5F}{\isacharunderscore}}all%
  1173 \endisatagproof
  1174 {\isafoldproof}%
  1175 %
  1176 \isadelimproof
  1177 %
  1178 \endisadelimproof
  1179 %
  1180 \isamarkupsection{Records \label{sec:hol-record}%
  1181 }
  1182 \isamarkuptrue%
  1183 %
  1184 \begin{isamarkuptext}%
  1185 In principle, records merely generalize the concept of tuples, where
  1186   components may be addressed by labels instead of just position.  The
  1187   logical infrastructure of records in Isabelle/HOL is slightly more
  1188   advanced, though, supporting truly extensible record schemes.  This
  1189   admits operations that are polymorphic with respect to record
  1190   extension, yielding ``object-oriented'' effects like (single)
  1191   inheritance.  See also \cite{NaraschewskiW-TPHOLs98} for more
  1192   details on object-oriented verification and record subtyping in HOL.%
  1193 \end{isamarkuptext}%
  1194 \isamarkuptrue%
  1195 %
  1196 \isamarkupsubsection{Basic concepts%
  1197 }
  1198 \isamarkuptrue%
  1199 %
  1200 \begin{isamarkuptext}%
  1201 Isabelle/HOL supports both \emph{fixed} and \emph{schematic} records
  1202   at the level of terms and types.  The notation is as follows:
  1203 
  1204   \begin{center}
  1205   \begin{tabular}{l|l|l}
  1206     & record terms & record types \\ \hline
  1207     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}}} \\
  1208     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}}} &
  1209       \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}}} \\
  1210   \end{tabular}
  1211   \end{center}
  1212 
  1213   \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}}}.
  1214 
  1215   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
  1216   \isa{a} and field \isa{y} of value \isa{b}.  The corresponding
  1217   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}}}
  1218   and \isa{{\isaliteral{22}{\isachardoublequote}}b\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ B{\isaliteral{22}{\isachardoublequote}}}.
  1219 
  1220   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
  1221   \isa{x} and \isa{y} as before, but also possibly further fields
  1222   as indicated by the ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{22}{\isachardoublequote}}}'' notation (which is actually part
  1223   of the syntax).  The improper field ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{22}{\isachardoublequote}}}'' of a record
  1224   scheme is called the \emph{more part}.  Logically it is just a free
  1225   variable, which is occasionally referred to as ``row variable'' in
  1226   the literature.  The more part of a record scheme may be
  1227   instantiated by zero or more further components.  For example, the
  1228   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.
  1229   Fixed records are special instances of record schemes, where
  1230   ``\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}}}
  1231   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
  1232   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}}}.
  1233 
  1234   \medskip Two key observations make extensible records in a simply
  1235   typed language like HOL work out:
  1236 
  1237   \begin{enumerate}
  1238 
  1239   \item the more part is internalized, as a free term or type
  1240   variable,
  1241 
  1242   \item field names are externalized, they cannot be accessed within
  1243   the logic as first-class values.
  1244 
  1245   \end{enumerate}
  1246 
  1247   \medskip In Isabelle/HOL record types have to be defined explicitly,
  1248   fixing their field names and types, and their (optional) parent
  1249   record.  Afterwards, records may be formed using above syntax, while
  1250   obeying the canonical order of fields as given by their declaration.
  1251   The record package provides several standard operations like
  1252   selectors and updates.  The common setup for various generic proof
  1253   tools enable succinct reasoning patterns.  See also the Isabelle/HOL
  1254   tutorial \cite{isabelle-hol-book} for further instructions on using
  1255   records in practice.%
  1256 \end{isamarkuptext}%
  1257 \isamarkuptrue%
  1258 %
  1259 \isamarkupsubsection{Record specifications%
  1260 }
  1261 \isamarkuptrue%
  1262 %
  1263 \begin{isamarkuptext}%
  1264 \begin{matharray}{rcl}
  1265     \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}}} \\
  1266   \end{matharray}
  1267 
  1268   \begin{railoutput}
  1269 \rail@begin{4}{}
  1270 \rail@term{\hyperlink{command.HOL.record}{\mbox{\isa{\isacommand{record}}}}}[]
  1271 \rail@nont{\hyperlink{syntax.typespec-sorts}{\mbox{\isa{typespec{\isaliteral{5F}{\isacharunderscore}}sorts}}}}[]
  1272 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
  1273 \rail@cr{2}
  1274 \rail@bar
  1275 \rail@nextbar{3}
  1276 \rail@nont{\hyperlink{syntax.type}{\mbox{\isa{type}}}}[]
  1277 \rail@term{\isa{{\isaliteral{2B}{\isacharplus}}}}[]
  1278 \rail@endbar
  1279 \rail@plus
  1280 \rail@nont{\hyperlink{syntax.constdecl}{\mbox{\isa{constdecl}}}}[]
  1281 \rail@nextplus{3}
  1282 \rail@endplus
  1283 \rail@end
  1284 \end{railoutput}
  1285 
  1286 
  1287   \begin{description}
  1288 
  1289   \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}}},
  1290   derived from the optional parent record \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C7461753E}{\isasymtau}}{\isaliteral{22}{\isachardoublequote}}} by adding new
  1291   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.
  1292 
  1293   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
  1294   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
  1295   least one new field \isa{{\isaliteral{22}{\isachardoublequote}}c\isaliteral{5C3C5E7375623E}{}\isactrlsub i{\isaliteral{22}{\isachardoublequote}}} has to be specified.
  1296   Basically, field names need to belong to a unique record.  This is
  1297   not a real restriction in practice, since fields are qualified by
  1298   the record name internally.
  1299 
  1300   The parent record specification \isa{{\isaliteral{5C3C7461753E}{\isasymtau}}} is optional; if omitted
  1301   \isa{t} becomes a root record.  The hierarchy of all records
  1302   declared within a theory context forms a forest structure, i.e.\ a
  1303   set of trees starting with a root record each.  There is no way to
  1304   merge multiple parent records!
  1305 
  1306   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
  1307   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
  1308   \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}}}.
  1309 
  1310   \end{description}%
  1311 \end{isamarkuptext}%
  1312 \isamarkuptrue%
  1313 %
  1314 \isamarkupsubsection{Record operations%
  1315 }
  1316 \isamarkuptrue%
  1317 %
  1318 \begin{isamarkuptext}%
  1319 Any record definition of the form presented above produces certain
  1320   standard operations.  Selectors and updates are provided for any
  1321   field, including the improper one ``\isa{more}''.  There are also
  1322   cumulative record constructor functions.  To simplify the
  1323   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}}}.
  1324 
  1325   \medskip \textbf{Selectors} and \textbf{updates} are available for
  1326   any field (including ``\isa{more}''):
  1327 
  1328   \begin{matharray}{lll}
  1329     \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}}} \\
  1330     \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}}} \\
  1331   \end{matharray}
  1332 
  1333   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
  1334   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
  1335   because of postfix notation the order of fields shown here is
  1336   reverse than in the actual term.  Since repeated updates are just
  1337   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.
  1338   Thus commutativity of independent updates can be proven within the
  1339   logic for any two fields, but not as a general theorem.
  1340 
  1341   \medskip The \textbf{make} operation provides a cumulative record
  1342   constructor function:
  1343 
  1344   \begin{matharray}{lll}
  1345     \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}}} \\
  1346   \end{matharray}
  1347 
  1348   \medskip We now reconsider the case of non-root records, which are
  1349   derived of some parent.  In general, the latter may depend on
  1350   another parent as well, resulting in a list of \emph{ancestor
  1351   records}.  Appending the lists of fields of all ancestors results in
  1352   a certain field prefix.  The record package automatically takes care
  1353   of this by lifting operations over this context of ancestor fields.
  1354   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
  1355   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}}},
  1356   the above record operations will get the following types:
  1357 
  1358   \medskip
  1359   \begin{tabular}{lll}
  1360     \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}}} \\
  1361     \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}}} \\
  1362     \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}}} \\
  1363   \end{tabular}
  1364   \medskip
  1365 
  1366   \noindent Some further operations address the extension aspect of a
  1367   derived record scheme specifically: \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}fields{\isaliteral{22}{\isachardoublequote}}} produces a
  1368   record fragment consisting of exactly the new fields introduced here
  1369   (the result may serve as a more part elsewhere); \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}extend{\isaliteral{22}{\isachardoublequote}}}
  1370   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.
  1371 
  1372   \medskip
  1373   \begin{tabular}{lll}
  1374     \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}}} \\
  1375     \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}}} \\
  1376     \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}}} \\
  1377   \end{tabular}
  1378   \medskip
  1379 
  1380   \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
  1381   for root records.%
  1382 \end{isamarkuptext}%
  1383 \isamarkuptrue%
  1384 %
  1385 \isamarkupsubsection{Derived rules and proof tools%
  1386 }
  1387 \isamarkuptrue%
  1388 %
  1389 \begin{isamarkuptext}%
  1390 The record package proves several results internally, declaring
  1391   these facts to appropriate proof tools.  This enables users to
  1392   reason about record structures quite conveniently.  Assume that
  1393   \isa{t} is a record type as specified above.
  1394 
  1395   \begin{enumerate}
  1396 
  1397   \item Standard conversions for selectors or updates applied to
  1398   record constructor terms are made part of the default Simplifier
  1399   context; thus proofs by reduction of basic operations merely require
  1400   the \hyperlink{method.simp}{\mbox{\isa{simp}}} method without further arguments.  These rules
  1401   are available as \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}simps{\isaliteral{22}{\isachardoublequote}}}, too.
  1402 
  1403   \item Selectors applied to updated records are automatically reduced
  1404   by an internal simplification procedure, which is also part of the
  1405   standard Simplifier setup.
  1406 
  1407   \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
  1408   Reasoner as \hyperlink{attribute.iff}{\mbox{\isa{iff}}} rules.  These rules are available as
  1409   \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}iffs{\isaliteral{22}{\isachardoublequote}}}.
  1410 
  1411   \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,
  1412   and as the basic rule context as ``\hyperlink{attribute.intro}{\mbox{\isa{intro}}}\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{3F}{\isacharquery}}{\isaliteral{22}{\isachardoublequote}}}''.
  1413   The rule is called \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}equality{\isaliteral{22}{\isachardoublequote}}}.
  1414 
  1415   \item Representations of arbitrary record expressions as canonical
  1416   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,
  1417   \secref{sec:cases-induct}).  Several variations are available, for
  1418   fixed records, record schemes, more parts etc.
  1419 
  1420   The generic proof methods are sufficiently smart to pick the most
  1421   sensible rule according to the type of the indicated record
  1422   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.
  1423 
  1424   \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}
  1425   treated automatically, but usually need to be expanded by hand,
  1426   using the collective fact \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}defs{\isaliteral{22}{\isachardoublequote}}}.
  1427 
  1428   \end{enumerate}%
  1429 \end{isamarkuptext}%
  1430 \isamarkuptrue%
  1431 %
  1432 \isamarkupsubsubsection{Examples%
  1433 }
  1434 \isamarkuptrue%
  1435 %
  1436 \begin{isamarkuptext}%
  1437 See \verb|~~/src/HOL/ex/Records.thy|, for example.%
  1438 \end{isamarkuptext}%
  1439 \isamarkuptrue%
  1440 %
  1441 \isamarkupsection{Adhoc tuples%
  1442 }
  1443 \isamarkuptrue%
  1444 %
  1445 \begin{isamarkuptext}%
  1446 \begin{matharray}{rcl}
  1447     \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} \\
  1448   \end{matharray}
  1449 
  1450   \begin{railoutput}
  1451 \rail@begin{2}{}
  1452 \rail@term{\hyperlink{attribute.HOL.split-format}{\mbox{\isa{split{\isaliteral{5F}{\isacharunderscore}}format}}}}[]
  1453 \rail@bar
  1454 \rail@nextbar{1}
  1455 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  1456 \rail@term{\isa{complete}}[]
  1457 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  1458 \rail@endbar
  1459 \rail@end
  1460 \end{railoutput}
  1461 
  1462 
  1463   \begin{description}
  1464 
  1465   \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
  1466   arguments in function applications to be represented canonically
  1467   according to their tuple type structure.
  1468 
  1469   Note that this operation tends to invent funny names for new local
  1470   parameters introduced.
  1471 
  1472   \end{description}%
  1473 \end{isamarkuptext}%
  1474 \isamarkuptrue%
  1475 %
  1476 \isamarkupsection{Typedef axiomatization \label{sec:hol-typedef}%
  1477 }
  1478 \isamarkuptrue%
  1479 %
  1480 \begin{isamarkuptext}%
  1481 A Gordon/HOL-style type definition is a certain axiom scheme
  1482   that identifies a new type with a subset of an existing type.  More
  1483   precisely, the new type is defined by exhibiting an existing type
  1484   \isa{{\isaliteral{5C3C7461753E}{\isasymtau}}}, a set \isa{{\isaliteral{22}{\isachardoublequote}}A\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{5C3C7461753E}{\isasymtau}}\ set{\isaliteral{22}{\isachardoublequote}}}, and a theorem that proves
  1485   \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C6578697374733E}{\isasymexists}}x{\isaliteral{2E}{\isachardot}}\ x\ {\isaliteral{5C3C696E3E}{\isasymin}}\ A{\isaliteral{22}{\isachardoublequote}}}.  Thus \isa{A} is a non-empty subset of \isa{{\isaliteral{5C3C7461753E}{\isasymtau}}}, and the new type denotes this subset.  New functions are
  1486   postulated that establish an isomorphism between the new type and
  1487   the subset.  In general, the type \isa{{\isaliteral{5C3C7461753E}{\isasymtau}}} may involve type
  1488   variables \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 n{\isaliteral{22}{\isachardoublequote}}} which means that the type definition
  1489   produces a type constructor \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{22}{\isachardoublequote}}} depending on
  1490   those type arguments.
  1491 
  1492   The axiomatization can be considered a ``definition'' in the sense
  1493   of the particular set-theoretic interpretation of HOL
  1494   \cite{pitts93}, where the universe of types is required to be
  1495   downwards-closed wrt.\ arbitrary non-empty subsets.  Thus genuinely
  1496   new types introduced by \hyperlink{command.typedef}{\mbox{\isa{\isacommand{typedef}}}} stay within the range
  1497   of HOL models by construction.  Note that \indexref{}{command}{type\_synonym}\hyperlink{command.type-synonym}{\mbox{\isa{\isacommand{type{\isaliteral{5F}{\isacharunderscore}}synonym}}}} from Isabelle/Pure merely introduces syntactic
  1498   abbreviations, without any logical significance.
  1499   
  1500   \begin{matharray}{rcl}
  1501     \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}}} \\
  1502   \end{matharray}
  1503 
  1504   \begin{railoutput}
  1505 \rail@begin{2}{}
  1506 \rail@term{\hyperlink{command.HOL.typedef}{\mbox{\isa{\isacommand{typedef}}}}}[]
  1507 \rail@bar
  1508 \rail@nextbar{1}
  1509 \rail@nont{\isa{alt{\isaliteral{5F}{\isacharunderscore}}name}}[]
  1510 \rail@endbar
  1511 \rail@nont{\isa{abs{\isaliteral{5F}{\isacharunderscore}}type}}[]
  1512 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
  1513 \rail@nont{\isa{rep{\isaliteral{5F}{\isacharunderscore}}set}}[]
  1514 \rail@end
  1515 \rail@begin{3}{\isa{alt{\isaliteral{5F}{\isacharunderscore}}name}}
  1516 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  1517 \rail@bar
  1518 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1519 \rail@nextbar{1}
  1520 \rail@term{\isa{\isakeyword{open}}}[]
  1521 \rail@nextbar{2}
  1522 \rail@term{\isa{\isakeyword{open}}}[]
  1523 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1524 \rail@endbar
  1525 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  1526 \rail@end
  1527 \rail@begin{2}{\isa{abs{\isaliteral{5F}{\isacharunderscore}}type}}
  1528 \rail@nont{\hyperlink{syntax.typespec-sorts}{\mbox{\isa{typespec{\isaliteral{5F}{\isacharunderscore}}sorts}}}}[]
  1529 \rail@bar
  1530 \rail@nextbar{1}
  1531 \rail@nont{\hyperlink{syntax.mixfix}{\mbox{\isa{mixfix}}}}[]
  1532 \rail@endbar
  1533 \rail@end
  1534 \rail@begin{2}{\isa{rep{\isaliteral{5F}{\isacharunderscore}}set}}
  1535 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  1536 \rail@bar
  1537 \rail@nextbar{1}
  1538 \rail@term{\isa{\isakeyword{morphisms}}}[]
  1539 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1540 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1541 \rail@endbar
  1542 \rail@end
  1543 \end{railoutput}
  1544 
  1545 
  1546   \begin{description}
  1547 
  1548   \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}}}
  1549   axiomatizes a type definition in the background theory of the
  1550   current context, depending on a non-emptiness result of the set
  1551   \isa{A} that needs to be proven here.  The set \isa{A} may
  1552   contain type variables \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 n{\isaliteral{22}{\isachardoublequote}}} as specified on the LHS,
  1553   but no term variables.
  1554 
  1555   Even though a local theory specification, the newly introduced type
  1556   constructor cannot depend on parameters or assumptions of the
  1557   context: this is structurally impossible in HOL.  In contrast, the
  1558   non-emptiness proof may use local assumptions in unusual situations,
  1559   which could result in different interpretations in target contexts:
  1560   the meaning of the bijection between the representing set \isa{A}
  1561   and the new type \isa{t} may then change in different application
  1562   contexts.
  1563 
  1564   By default, \hyperlink{command.HOL.typedef}{\mbox{\isa{\isacommand{typedef}}}} defines both a type
  1565   constructor \isa{t} for the new type, and a term constant \isa{t} for the representing set within the old type.  Use the ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}open{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}}'' option to suppress a separate constant definition
  1566   altogether.  The injection from type to set is called \isa{Rep{\isaliteral{5F}{\isacharunderscore}}t},
  1567   its inverse \isa{Abs{\isaliteral{5F}{\isacharunderscore}}t}, unless explicit \hyperlink{keyword.HOL.morphisms}{\mbox{\isa{\isakeyword{morphisms}}}} specification provides alternative names.
  1568 
  1569   The core axiomatization uses the locale predicate \isa{type{\isaliteral{5F}{\isacharunderscore}}definition} as defined in Isabelle/HOL.  Various basic
  1570   consequences of that are instantiated accordingly, re-using the
  1571   locale facts with names derived from the new type constructor.  Thus
  1572   the generic \isa{type{\isaliteral{5F}{\isacharunderscore}}definition{\isaliteral{2E}{\isachardot}}Rep} is turned into the specific
  1573   \isa{{\isaliteral{22}{\isachardoublequote}}Rep{\isaliteral{5F}{\isacharunderscore}}t{\isaliteral{22}{\isachardoublequote}}}, for example.
  1574 
  1575   Theorems \isa{type{\isaliteral{5F}{\isacharunderscore}}definition{\isaliteral{2E}{\isachardot}}Rep}, \isa{type{\isaliteral{5F}{\isacharunderscore}}definition{\isaliteral{2E}{\isachardot}}Rep{\isaliteral{5F}{\isacharunderscore}}inverse}, and \isa{type{\isaliteral{5F}{\isacharunderscore}}definition{\isaliteral{2E}{\isachardot}}Abs{\isaliteral{5F}{\isacharunderscore}}inverse}
  1576   provide the most basic characterization as a corresponding
  1577   injection/surjection pair (in both directions).  The derived rules
  1578   \isa{type{\isaliteral{5F}{\isacharunderscore}}definition{\isaliteral{2E}{\isachardot}}Rep{\isaliteral{5F}{\isacharunderscore}}inject} and \isa{type{\isaliteral{5F}{\isacharunderscore}}definition{\isaliteral{2E}{\isachardot}}Abs{\isaliteral{5F}{\isacharunderscore}}inject} provide a more convenient version of
  1579   injectivity, suitable for automated proof tools (e.g.\ in
  1580   declarations involving \hyperlink{attribute.simp}{\mbox{\isa{simp}}} or \hyperlink{attribute.iff}{\mbox{\isa{iff}}}).
  1581   Furthermore, the rules \isa{type{\isaliteral{5F}{\isacharunderscore}}definition{\isaliteral{2E}{\isachardot}}Rep{\isaliteral{5F}{\isacharunderscore}}cases}~/ \isa{type{\isaliteral{5F}{\isacharunderscore}}definition{\isaliteral{2E}{\isachardot}}Rep{\isaliteral{5F}{\isacharunderscore}}induct}, and \isa{type{\isaliteral{5F}{\isacharunderscore}}definition{\isaliteral{2E}{\isachardot}}Abs{\isaliteral{5F}{\isacharunderscore}}cases}~/
  1582   \isa{type{\isaliteral{5F}{\isacharunderscore}}definition{\isaliteral{2E}{\isachardot}}Abs{\isaliteral{5F}{\isacharunderscore}}induct} provide alternative views on
  1583   surjectivity.  These rules are already declared as set or type rules
  1584   for the generic \hyperlink{method.cases}{\mbox{\isa{cases}}} and \hyperlink{method.induct}{\mbox{\isa{induct}}} methods,
  1585   respectively.
  1586 
  1587   An alternative name for the set definition (and other derived
  1588   entities) may be specified in parentheses; the default is to use
  1589   \isa{t} directly.
  1590 
  1591   \end{description}
  1592 
  1593   \begin{warn}
  1594   If you introduce a new type axiomatically, i.e.\ via \indexref{}{command}{typedecl}\hyperlink{command.typedecl}{\mbox{\isa{\isacommand{typedecl}}}} and \indexref{}{command}{axiomatization}\hyperlink{command.axiomatization}{\mbox{\isa{\isacommand{axiomatization}}}}, the minimum requirement
  1595   is that it has a non-empty model, to avoid immediate collapse of the
  1596   HOL logic.  Moreover, one needs to demonstrate that the
  1597   interpretation of such free-form axiomatizations can coexist with
  1598   that of the regular \indexdef{}{command}{typedef}\hypertarget{command.typedef}{\hyperlink{command.typedef}{\mbox{\isa{\isacommand{typedef}}}}} scheme, and any extension
  1599   that other people might have introduced elsewhere (e.g.\ in HOLCF
  1600   \cite{MuellerNvOS99}).
  1601   \end{warn}%
  1602 \end{isamarkuptext}%
  1603 \isamarkuptrue%
  1604 %
  1605 \isamarkupsubsubsection{Examples%
  1606 }
  1607 \isamarkuptrue%
  1608 %
  1609 \begin{isamarkuptext}%
  1610 Type definitions permit the introduction of abstract data
  1611   types in a safe way, namely by providing models based on already
  1612   existing types.  Given some abstract axiomatic description \isa{P}
  1613   of a type, this involves two steps:
  1614 
  1615   \begin{enumerate}
  1616 
  1617   \item Find an appropriate type \isa{{\isaliteral{5C3C7461753E}{\isasymtau}}} and subset \isa{A} which
  1618   has the desired properties \isa{P}, and make a type definition
  1619   based on this representation.
  1620 
  1621   \item Prove that \isa{P} holds for \isa{{\isaliteral{5C3C7461753E}{\isasymtau}}} by lifting \isa{P}
  1622   from the representation.
  1623 
  1624   \end{enumerate}
  1625 
  1626   You can later forget about the representation and work solely in
  1627   terms of the abstract properties \isa{P}.
  1628 
  1629   \medskip The following trivial example pulls a three-element type
  1630   into existence within the formal logical environment of HOL.%
  1631 \end{isamarkuptext}%
  1632 \isamarkuptrue%
  1633 \isacommand{typedef}\isamarkupfalse%
  1634 \ three\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{7B}{\isacharbraceleft}}{\isaliteral{28}{\isacharparenleft}}True{\isaliteral{2C}{\isacharcomma}}\ True{\isaliteral{29}{\isacharparenright}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{28}{\isacharparenleft}}True{\isaliteral{2C}{\isacharcomma}}\ False{\isaliteral{29}{\isacharparenright}}{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{28}{\isacharparenleft}}False{\isaliteral{2C}{\isacharcomma}}\ True{\isaliteral{29}{\isacharparenright}}{\isaliteral{7D}{\isacharbraceright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  1635 %
  1636 \isadelimproof
  1637 \ \ %
  1638 \endisadelimproof
  1639 %
  1640 \isatagproof
  1641 \isacommand{by}\isamarkupfalse%
  1642 \ blast%
  1643 \endisatagproof
  1644 {\isafoldproof}%
  1645 %
  1646 \isadelimproof
  1647 \isanewline
  1648 %
  1649 \endisadelimproof
  1650 \isanewline
  1651 \isacommand{definition}\isamarkupfalse%
  1652 \ {\isaliteral{22}{\isachardoublequoteopen}}One\ {\isaliteral{3D}{\isacharequal}}\ Abs{\isaliteral{5F}{\isacharunderscore}}three\ {\isaliteral{28}{\isacharparenleft}}True{\isaliteral{2C}{\isacharcomma}}\ True{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  1653 \isacommand{definition}\isamarkupfalse%
  1654 \ {\isaliteral{22}{\isachardoublequoteopen}}Two\ {\isaliteral{3D}{\isacharequal}}\ Abs{\isaliteral{5F}{\isacharunderscore}}three\ {\isaliteral{28}{\isacharparenleft}}True{\isaliteral{2C}{\isacharcomma}}\ False{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  1655 \isacommand{definition}\isamarkupfalse%
  1656 \ {\isaliteral{22}{\isachardoublequoteopen}}Three\ {\isaliteral{3D}{\isacharequal}}\ Abs{\isaliteral{5F}{\isacharunderscore}}three\ {\isaliteral{28}{\isacharparenleft}}False{\isaliteral{2C}{\isacharcomma}}\ True{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  1657 \isanewline
  1658 \isacommand{lemma}\isamarkupfalse%
  1659 \ three{\isaliteral{5F}{\isacharunderscore}}distinct{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}One\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ Two{\isaliteral{22}{\isachardoublequoteclose}}\ \ {\isaliteral{22}{\isachardoublequoteopen}}One\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ Three{\isaliteral{22}{\isachardoublequoteclose}}\ \ {\isaliteral{22}{\isachardoublequoteopen}}Two\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ Three{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  1660 %
  1661 \isadelimproof
  1662 \ \ %
  1663 \endisadelimproof
  1664 %
  1665 \isatagproof
  1666 \isacommand{by}\isamarkupfalse%
  1667 \ {\isaliteral{28}{\isacharparenleft}}simp{\isaliteral{5F}{\isacharunderscore}}all\ add{\isaliteral{3A}{\isacharcolon}}\ One{\isaliteral{5F}{\isacharunderscore}}def\ Two{\isaliteral{5F}{\isacharunderscore}}def\ Three{\isaliteral{5F}{\isacharunderscore}}def\ Abs{\isaliteral{5F}{\isacharunderscore}}three{\isaliteral{5F}{\isacharunderscore}}inject\ three{\isaliteral{5F}{\isacharunderscore}}def{\isaliteral{29}{\isacharparenright}}%
  1668 \endisatagproof
  1669 {\isafoldproof}%
  1670 %
  1671 \isadelimproof
  1672 \isanewline
  1673 %
  1674 \endisadelimproof
  1675 \isanewline
  1676 \isacommand{lemma}\isamarkupfalse%
  1677 \ three{\isaliteral{5F}{\isacharunderscore}}cases{\isaliteral{3A}{\isacharcolon}}\isanewline
  1678 \ \ \isakeyword{fixes}\ x\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ three\ \isakeyword{obtains}\ {\isaliteral{22}{\isachardoublequoteopen}}x\ {\isaliteral{3D}{\isacharequal}}\ One{\isaliteral{22}{\isachardoublequoteclose}}\ {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}x\ {\isaliteral{3D}{\isacharequal}}\ Two{\isaliteral{22}{\isachardoublequoteclose}}\ {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{22}{\isachardoublequoteopen}}x\ {\isaliteral{3D}{\isacharequal}}\ Three{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  1679 %
  1680 \isadelimproof
  1681 \ \ %
  1682 \endisadelimproof
  1683 %
  1684 \isatagproof
  1685 \isacommand{by}\isamarkupfalse%
  1686 \ {\isaliteral{28}{\isacharparenleft}}cases\ x{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{28}{\isacharparenleft}}auto\ simp{\isaliteral{3A}{\isacharcolon}}\ One{\isaliteral{5F}{\isacharunderscore}}def\ Two{\isaliteral{5F}{\isacharunderscore}}def\ Three{\isaliteral{5F}{\isacharunderscore}}def\ Abs{\isaliteral{5F}{\isacharunderscore}}three{\isaliteral{5F}{\isacharunderscore}}inject\ three{\isaliteral{5F}{\isacharunderscore}}def{\isaliteral{29}{\isacharparenright}}%
  1687 \endisatagproof
  1688 {\isafoldproof}%
  1689 %
  1690 \isadelimproof
  1691 %
  1692 \endisadelimproof
  1693 %
  1694 \begin{isamarkuptext}%
  1695 Note that such trivial constructions are better done with
  1696   derived specification mechanisms such as \hyperlink{command.datatype}{\mbox{\isa{\isacommand{datatype}}}}:%
  1697 \end{isamarkuptext}%
  1698 \isamarkuptrue%
  1699 \isacommand{datatype}\isamarkupfalse%
  1700 \ three{\isaliteral{27}{\isacharprime}}\ {\isaliteral{3D}{\isacharequal}}\ One{\isaliteral{27}{\isacharprime}}\ {\isaliteral{7C}{\isacharbar}}\ Two{\isaliteral{27}{\isacharprime}}\ {\isaliteral{7C}{\isacharbar}}\ Three{\isaliteral{27}{\isacharprime}}%
  1701 \begin{isamarkuptext}%
  1702 This avoids re-doing basic definitions and proofs from the
  1703   primitive \hyperlink{command.typedef}{\mbox{\isa{\isacommand{typedef}}}} above.%
  1704 \end{isamarkuptext}%
  1705 \isamarkuptrue%
  1706 %
  1707 \isamarkupsection{Functorial structure of types%
  1708 }
  1709 \isamarkuptrue%
  1710 %
  1711 \begin{isamarkuptext}%
  1712 \begin{matharray}{rcl}
  1713     \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}}}
  1714   \end{matharray}
  1715 
  1716   \begin{railoutput}
  1717 \rail@begin{2}{}
  1718 \rail@term{\hyperlink{command.HOL.enriched-type}{\mbox{\isa{\isacommand{enriched{\isaliteral{5F}{\isacharunderscore}}type}}}}}[]
  1719 \rail@bar
  1720 \rail@nextbar{1}
  1721 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1722 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}}}[]
  1723 \rail@endbar
  1724 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  1725 \rail@end
  1726 \end{railoutput}
  1727 
  1728 
  1729   \begin{description}
  1730 
  1731   \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
  1732   prove and register properties about the functorial structure of type
  1733   constructors.  These properties then can be used by other packages
  1734   to deal with those type constructors in certain type constructions.
  1735   Characteristic theorems are noted in the current local theory.  By
  1736   default, they are prefixed with the base name of the type
  1737   constructor, an explicit prefix can be given alternatively.
  1738 
  1739   The given term \isa{{\isaliteral{22}{\isachardoublequote}}m{\isaliteral{22}{\isachardoublequote}}} is considered as \emph{mapper} for the
  1740   corresponding type constructor and must conform to the following
  1741   type pattern:
  1742 
  1743   \begin{matharray}{lll}
  1744     \isa{{\isaliteral{22}{\isachardoublequote}}m{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{22}{\isachardoublequote}}} &
  1745       \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}}} \\
  1746   \end{matharray}
  1747 
  1748   \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
  1749   type variables free in the local theory and \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{1}}{\isaliteral{22}{\isachardoublequote}}},
  1750   \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,
  1751   \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}}}.
  1752 
  1753   \end{description}%
  1754 \end{isamarkuptext}%
  1755 \isamarkuptrue%
  1756 %
  1757 \isamarkupsection{Quotient types%
  1758 }
  1759 \isamarkuptrue%
  1760 %
  1761 \begin{isamarkuptext}%
  1762 The quotient package defines a new quotient type given a raw type
  1763   and a partial equivalence relation.
  1764   It also includes automation for transporting definitions and theorems.
  1765   It can automatically produce definitions and theorems on the quotient type,
  1766   given the corresponding constants and facts on the raw type.
  1767 
  1768   \begin{matharray}{rcl}
  1769     \indexdef{HOL}{command}{quotient\_type}\hypertarget{command.HOL.quotient-type}{\hyperlink{command.HOL.quotient-type}{\mbox{\isa{\isacommand{quotient{\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}}}\\
  1770     \indexdef{HOL}{command}{quotient\_definition}\hypertarget{command.HOL.quotient-definition}{\hyperlink{command.HOL.quotient-definition}{\mbox{\isa{\isacommand{quotient{\isaliteral{5F}{\isacharunderscore}}definition}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}local{\isaliteral{5F}{\isacharunderscore}}theory\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}\ proof{\isaliteral{28}{\isacharparenleft}}prove{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}}\\
  1771     \indexdef{HOL}{command}{print\_quotmaps}\hypertarget{command.HOL.print-quotmaps}{\hyperlink{command.HOL.print-quotmaps}{\mbox{\isa{\isacommand{print{\isaliteral{5F}{\isacharunderscore}}quotmaps}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}context\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}{\isaliteral{22}{\isachardoublequote}}}\\
  1772     \indexdef{HOL}{command}{print\_quotients}\hypertarget{command.HOL.print-quotients}{\hyperlink{command.HOL.print-quotients}{\mbox{\isa{\isacommand{print{\isaliteral{5F}{\isacharunderscore}}quotients}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}context\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}{\isaliteral{22}{\isachardoublequote}}}\\
  1773     \indexdef{HOL}{command}{print\_quotconsts}\hypertarget{command.HOL.print-quotconsts}{\hyperlink{command.HOL.print-quotconsts}{\mbox{\isa{\isacommand{print{\isaliteral{5F}{\isacharunderscore}}quotconsts}}}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}context\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}{\isaliteral{22}{\isachardoublequote}}}\\
  1774   \end{matharray}
  1775 
  1776   \begin{railoutput}
  1777 \rail@begin{2}{}
  1778 \rail@term{\hyperlink{command.HOL.quotient-type}{\mbox{\isa{\isacommand{quotient{\isaliteral{5F}{\isacharunderscore}}type}}}}}[]
  1779 \rail@plus
  1780 \rail@nont{\isa{spec}}[]
  1781 \rail@nextplus{1}
  1782 \rail@cterm{\isa{\isakeyword{and}}}[]
  1783 \rail@endplus
  1784 \rail@end
  1785 \rail@begin{5}{\isa{spec}}
  1786 \rail@nont{\hyperlink{syntax.typespec}{\mbox{\isa{typespec}}}}[]
  1787 \rail@bar
  1788 \rail@nextbar{1}
  1789 \rail@nont{\hyperlink{syntax.mixfix}{\mbox{\isa{mixfix}}}}[]
  1790 \rail@endbar
  1791 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
  1792 \rail@cr{3}
  1793 \rail@nont{\hyperlink{syntax.type}{\mbox{\isa{type}}}}[]
  1794 \rail@term{\isa{{\isaliteral{2F}{\isacharslash}}}}[]
  1795 \rail@bar
  1796 \rail@nextbar{4}
  1797 \rail@term{\isa{partial}}[]
  1798 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}}}[]
  1799 \rail@endbar
  1800 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  1801 \rail@end
  1802 \end{railoutput}
  1803 
  1804 
  1805   \begin{railoutput}
  1806 \rail@begin{4}{}
  1807 \rail@term{\hyperlink{command.HOL.quotient-definition}{\mbox{\isa{\isacommand{quotient{\isaliteral{5F}{\isacharunderscore}}definition}}}}}[]
  1808 \rail@bar
  1809 \rail@nextbar{1}
  1810 \rail@nont{\isa{constdecl}}[]
  1811 \rail@endbar
  1812 \rail@bar
  1813 \rail@nextbar{1}
  1814 \rail@nont{\hyperlink{syntax.thmdecl}{\mbox{\isa{thmdecl}}}}[]
  1815 \rail@endbar
  1816 \rail@cr{3}
  1817 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  1818 \rail@term{\isa{is}}[]
  1819 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  1820 \rail@end
  1821 \rail@begin{2}{\isa{constdecl}}
  1822 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1823 \rail@bar
  1824 \rail@nextbar{1}
  1825 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}}}[]
  1826 \rail@nont{\hyperlink{syntax.type}{\mbox{\isa{type}}}}[]
  1827 \rail@endbar
  1828 \rail@bar
  1829 \rail@nextbar{1}
  1830 \rail@nont{\hyperlink{syntax.mixfix}{\mbox{\isa{mixfix}}}}[]
  1831 \rail@endbar
  1832 \rail@end
  1833 \end{railoutput}
  1834 
  1835 
  1836   \begin{description}
  1837   
  1838   \item \hyperlink{command.HOL.quotient-type}{\mbox{\isa{\isacommand{quotient{\isaliteral{5F}{\isacharunderscore}}type}}}} defines quotient types.
  1839 
  1840   \item \hyperlink{command.HOL.quotient-definition}{\mbox{\isa{\isacommand{quotient{\isaliteral{5F}{\isacharunderscore}}definition}}}} defines a constant on the quotient type.
  1841 
  1842   \item \hyperlink{command.HOL.print-quotmaps}{\mbox{\isa{\isacommand{print{\isaliteral{5F}{\isacharunderscore}}quotmaps}}}} prints quotient map functions.
  1843 
  1844   \item \hyperlink{command.HOL.print-quotients}{\mbox{\isa{\isacommand{print{\isaliteral{5F}{\isacharunderscore}}quotients}}}} prints quotients.
  1845 
  1846   \item \hyperlink{command.HOL.print-quotconsts}{\mbox{\isa{\isacommand{print{\isaliteral{5F}{\isacharunderscore}}quotconsts}}}} prints quotient constants.
  1847 
  1848   \end{description}%
  1849 \end{isamarkuptext}%
  1850 \isamarkuptrue%
  1851 %
  1852 \isamarkupsection{Arithmetic proof support%
  1853 }
  1854 \isamarkuptrue%
  1855 %
  1856 \begin{isamarkuptext}%
  1857 \begin{matharray}{rcl}
  1858     \indexdef{HOL}{method}{arith}\hypertarget{method.HOL.arith}{\hyperlink{method.HOL.arith}{\mbox{\isa{arith}}}} & : & \isa{method} \\
  1859     \indexdef{HOL}{attribute}{arith}\hypertarget{attribute.HOL.arith}{\hyperlink{attribute.HOL.arith}{\mbox{\isa{arith}}}} & : & \isa{attribute} \\
  1860     \indexdef{HOL}{attribute}{arith\_split}\hypertarget{attribute.HOL.arith-split}{\hyperlink{attribute.HOL.arith-split}{\mbox{\isa{arith{\isaliteral{5F}{\isacharunderscore}}split}}}} & : & \isa{attribute} \\
  1861   \end{matharray}
  1862 
  1863   The \hyperlink{method.HOL.arith}{\mbox{\isa{arith}}} method decides linear arithmetic problems
  1864   (on types \isa{nat}, \isa{int}, \isa{real}).  Any current
  1865   facts are inserted into the goal before running the procedure.
  1866 
  1867   The \hyperlink{attribute.HOL.arith}{\mbox{\isa{arith}}} attribute declares facts that are
  1868   always supplied to the arithmetic provers implicitly.
  1869 
  1870   The \hyperlink{attribute.HOL.arith-split}{\mbox{\isa{arith{\isaliteral{5F}{\isacharunderscore}}split}}} attribute declares case split
  1871   rules to be expanded before \hyperlink{method.HOL.arith}{\mbox{\isa{arith}}} is invoked.
  1872 
  1873   Note that a simpler (but faster) arithmetic prover is
  1874   already invoked by the Simplifier.%
  1875 \end{isamarkuptext}%
  1876 \isamarkuptrue%
  1877 %
  1878 \isamarkupsection{Intuitionistic proof search%
  1879 }
  1880 \isamarkuptrue%
  1881 %
  1882 \begin{isamarkuptext}%
  1883 \begin{matharray}{rcl}
  1884     \indexdef{HOL}{method}{iprover}\hypertarget{method.HOL.iprover}{\hyperlink{method.HOL.iprover}{\mbox{\isa{iprover}}}} & : & \isa{method} \\
  1885   \end{matharray}
  1886 
  1887   \begin{railoutput}
  1888 \rail@begin{2}{}
  1889 \rail@term{\hyperlink{method.HOL.iprover}{\mbox{\isa{iprover}}}}[]
  1890 \rail@plus
  1891 \rail@nextplus{1}
  1892 \rail@cnont{\hyperlink{syntax.rulemod}{\mbox{\isa{rulemod}}}}[]
  1893 \rail@endplus
  1894 \rail@end
  1895 \end{railoutput}
  1896 
  1897 
  1898   The \hyperlink{method.HOL.iprover}{\mbox{\isa{iprover}}} method performs intuitionistic proof
  1899   search, depending on specifically declared rules from the context,
  1900   or given as explicit arguments.  Chained facts are inserted into the
  1901   goal before commencing proof search.
  1902 
  1903   Rules need to be classified as \hyperlink{attribute.Pure.intro}{\mbox{\isa{intro}}},
  1904   \hyperlink{attribute.Pure.elim}{\mbox{\isa{elim}}}, or \hyperlink{attribute.Pure.dest}{\mbox{\isa{dest}}}; here the
  1905   ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{21}{\isacharbang}}{\isaliteral{22}{\isachardoublequote}}}'' indicator refers to ``safe'' rules, which may be
  1906   applied aggressively (without considering back-tracking later).
  1907   Rules declared with ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{3F}{\isacharquery}}{\isaliteral{22}{\isachardoublequote}}}'' are ignored in proof search (the
  1908   single-step \hyperlink{method.Pure.rule}{\mbox{\isa{rule}}} method still observes these).  An
  1909   explicit weight annotation may be given as well; otherwise the
  1910   number of rule premises will be taken into account here.%
  1911 \end{isamarkuptext}%
  1912 \isamarkuptrue%
  1913 %
  1914 \isamarkupsection{Model Elimination and Resolution%
  1915 }
  1916 \isamarkuptrue%
  1917 %
  1918 \begin{isamarkuptext}%
  1919 \begin{matharray}{rcl}
  1920     \indexdef{HOL}{method}{meson}\hypertarget{method.HOL.meson}{\hyperlink{method.HOL.meson}{\mbox{\isa{meson}}}} & : & \isa{method} \\
  1921     \indexdef{HOL}{method}{metis}\hypertarget{method.HOL.metis}{\hyperlink{method.HOL.metis}{\mbox{\isa{metis}}}} & : & \isa{method} \\
  1922   \end{matharray}
  1923 
  1924   \begin{railoutput}
  1925 \rail@begin{2}{}
  1926 \rail@term{\hyperlink{method.HOL.meson}{\mbox{\isa{meson}}}}[]
  1927 \rail@bar
  1928 \rail@nextbar{1}
  1929 \rail@nont{\hyperlink{syntax.thmrefs}{\mbox{\isa{thmrefs}}}}[]
  1930 \rail@endbar
  1931 \rail@end
  1932 \rail@begin{5}{}
  1933 \rail@term{\hyperlink{method.HOL.metis}{\mbox{\isa{metis}}}}[]
  1934 \rail@bar
  1935 \rail@nextbar{1}
  1936 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  1937 \rail@bar
  1938 \rail@term{\isa{partial{\isaliteral{5F}{\isacharunderscore}}types}}[]
  1939 \rail@nextbar{2}
  1940 \rail@term{\isa{full{\isaliteral{5F}{\isacharunderscore}}types}}[]
  1941 \rail@nextbar{3}
  1942 \rail@term{\isa{no{\isaliteral{5F}{\isacharunderscore}}types}}[]
  1943 \rail@nextbar{4}
  1944 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1945 \rail@endbar
  1946 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  1947 \rail@endbar
  1948 \rail@bar
  1949 \rail@nextbar{1}
  1950 \rail@nont{\hyperlink{syntax.thmrefs}{\mbox{\isa{thmrefs}}}}[]
  1951 \rail@endbar
  1952 \rail@end
  1953 \end{railoutput}
  1954 
  1955 
  1956   The \hyperlink{method.HOL.meson}{\mbox{\isa{meson}}} method implements Loveland's model elimination
  1957   procedure \cite{loveland-78}. See \verb|~~/src/HOL/ex/Meson_Test.thy| for
  1958   examples.
  1959 
  1960   The \hyperlink{method.HOL.metis}{\mbox{\isa{metis}}} method combines ordered resolution and ordered
  1961   paramodulation to find first-order (or mildly higher-order) proofs. The first
  1962   optional argument specifies a type encoding; see the Sledgehammer manual
  1963   \cite{isabelle-sledgehammer} for details. The \verb|~~/src/HOL/Metis_Examples| directory contains several small theories
  1964   developed to a large extent using Metis.%
  1965 \end{isamarkuptext}%
  1966 \isamarkuptrue%
  1967 %
  1968 \isamarkupsection{Coherent Logic%
  1969 }
  1970 \isamarkuptrue%
  1971 %
  1972 \begin{isamarkuptext}%
  1973 \begin{matharray}{rcl}
  1974     \indexdef{HOL}{method}{coherent}\hypertarget{method.HOL.coherent}{\hyperlink{method.HOL.coherent}{\mbox{\isa{coherent}}}} & : & \isa{method} \\
  1975   \end{matharray}
  1976 
  1977   \begin{railoutput}
  1978 \rail@begin{2}{}
  1979 \rail@term{\hyperlink{method.HOL.coherent}{\mbox{\isa{coherent}}}}[]
  1980 \rail@bar
  1981 \rail@nextbar{1}
  1982 \rail@nont{\hyperlink{syntax.thmrefs}{\mbox{\isa{thmrefs}}}}[]
  1983 \rail@endbar
  1984 \rail@end
  1985 \end{railoutput}
  1986 
  1987 
  1988   The \hyperlink{method.HOL.coherent}{\mbox{\isa{coherent}}} method solves problems of
  1989   \emph{Coherent Logic} \cite{Bezem-Coquand:2005}, which covers
  1990   applications in confluence theory, lattice theory and projective
  1991   geometry.  See \verb|~~/src/HOL/ex/Coherent.thy| for some
  1992   examples.%
  1993 \end{isamarkuptext}%
  1994 \isamarkuptrue%
  1995 %
  1996 \isamarkupsection{Proving propositions%
  1997 }
  1998 \isamarkuptrue%
  1999 %
  2000 \begin{isamarkuptext}%
  2001 In addition to the standard proof methods, a number of diagnosis
  2002   tools search for proofs and provide an Isar proof snippet on success.
  2003   These tools are available via the following commands.
  2004 
  2005   \begin{matharray}{rcl}
  2006     \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}}} \\
  2007     \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}}} \\
  2008     \indexdef{HOL}{command}{try\_methods}\hypertarget{command.HOL.try-methods}{\hyperlink{command.HOL.try-methods}{\mbox{\isa{\isacommand{try{\isaliteral{5F}{\isacharunderscore}}methods}}}}}\isa{{\isaliteral{22}{\isachardoublequote}}\isaliteral{5C3C5E7375703E}{}\isactrlsup {\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}} & : & \isa{{\isaliteral{22}{\isachardoublequote}}proof\ {\isaliteral{5C3C72696768746172726F773E}{\isasymrightarrow}}{\isaliteral{22}{\isachardoublequote}}} \\
  2009     \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}}} \\
  2010     \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}}}
  2011   \end{matharray}
  2012 
  2013   \begin{railoutput}
  2014 \rail@begin{1}{}
  2015 \rail@term{\hyperlink{command.HOL.try}{\mbox{\isa{\isacommand{try}}}}}[]
  2016 \rail@end
  2017 \rail@begin{6}{}
  2018 \rail@term{\hyperlink{command.HOL.try-methods}{\mbox{\isa{\isacommand{try{\isaliteral{5F}{\isacharunderscore}}methods}}}}}[]
  2019 \rail@bar
  2020 \rail@nextbar{1}
  2021 \rail@plus
  2022 \rail@bar
  2023 \rail@term{\isa{simp}}[]
  2024 \rail@nextbar{2}
  2025 \rail@term{\isa{intro}}[]
  2026 \rail@nextbar{3}
  2027 \rail@term{\isa{elim}}[]
  2028 \rail@nextbar{4}
  2029 \rail@term{\isa{dest}}[]
  2030 \rail@endbar
  2031 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}}}[]
  2032 \rail@nont{\hyperlink{syntax.thmrefs}{\mbox{\isa{thmrefs}}}}[]
  2033 \rail@nextplus{5}
  2034 \rail@endplus
  2035 \rail@endbar
  2036 \rail@bar
  2037 \rail@nextbar{1}
  2038 \rail@nont{\hyperlink{syntax.nat}{\mbox{\isa{nat}}}}[]
  2039 \rail@endbar
  2040 \rail@end
  2041 \rail@begin{2}{}
  2042 \rail@term{\hyperlink{command.HOL.sledgehammer}{\mbox{\isa{\isacommand{sledgehammer}}}}}[]
  2043 \rail@bar
  2044 \rail@nextbar{1}
  2045 \rail@term{\isa{{\isaliteral{5B}{\isacharbrackleft}}}}[]
  2046 \rail@nont{\isa{args}}[]
  2047 \rail@term{\isa{{\isaliteral{5D}{\isacharbrackright}}}}[]
  2048 \rail@endbar
  2049 \rail@bar
  2050 \rail@nextbar{1}
  2051 \rail@nont{\isa{facts}}[]
  2052 \rail@endbar
  2053 \rail@bar
  2054 \rail@nextbar{1}
  2055 \rail@nont{\hyperlink{syntax.nat}{\mbox{\isa{nat}}}}[]
  2056 \rail@endbar
  2057 \rail@end
  2058 \rail@begin{2}{}
  2059 \rail@term{\hyperlink{command.HOL.sledgehammer-params}{\mbox{\isa{\isacommand{sledgehammer{\isaliteral{5F}{\isacharunderscore}}params}}}}}[]
  2060 \rail@bar
  2061 \rail@nextbar{1}
  2062 \rail@term{\isa{{\isaliteral{5B}{\isacharbrackleft}}}}[]
  2063 \rail@nont{\isa{args}}[]
  2064 \rail@term{\isa{{\isaliteral{5D}{\isacharbrackright}}}}[]
  2065 \rail@endbar
  2066 \rail@end
  2067 \rail@begin{2}{\isa{args}}
  2068 \rail@plus
  2069 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2070 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
  2071 \rail@nont{\isa{value}}[]
  2072 \rail@nextplus{1}
  2073 \rail@cterm{\isa{{\isaliteral{2C}{\isacharcomma}}}}[]
  2074 \rail@endplus
  2075 \rail@end
  2076 \rail@begin{5}{\isa{facts}}
  2077 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2078 \rail@bar
  2079 \rail@nextbar{1}
  2080 \rail@plus
  2081 \rail@bar
  2082 \rail@nextbar{2}
  2083 \rail@bar
  2084 \rail@term{\isa{add}}[]
  2085 \rail@nextbar{3}
  2086 \rail@term{\isa{del}}[]
  2087 \rail@endbar
  2088 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}}}[]
  2089 \rail@endbar
  2090 \rail@nont{\hyperlink{syntax.thmrefs}{\mbox{\isa{thmrefs}}}}[]
  2091 \rail@nextplus{4}
  2092 \rail@endplus
  2093 \rail@endbar
  2094 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2095 \rail@end
  2096 \end{railoutput}
  2097  % FIXME check args "value"
  2098 
  2099   \begin{description}
  2100 
  2101   \item \hyperlink{command.HOL.solve-direct}{\mbox{\isa{\isacommand{solve{\isaliteral{5F}{\isacharunderscore}}direct}}}} checks whether the current subgoals can
  2102     be solved directly by an existing theorem. Duplicate lemmas can be detected
  2103     in this way.
  2104 
  2105   \item \hyperlink{command.HOL.try-methods}{\mbox{\isa{\isacommand{try{\isaliteral{5F}{\isacharunderscore}}methods}}}} attempts to prove a subgoal using a combination
  2106     of standard proof methods (\isa{auto}, \isa{simp}, \isa{blast}, etc.).
  2107     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}}},
  2108     \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
  2109     methods.
  2110 
  2111   \item \hyperlink{command.HOL.try}{\mbox{\isa{\isacommand{try}}}} attempts to prove or disprove a subgoal
  2112     using a combination of provers and disprovers (\isa{{\isaliteral{22}{\isachardoublequote}}solve{\isaliteral{5F}{\isacharunderscore}}direct{\isaliteral{22}{\isachardoublequote}}},
  2113     \isa{{\isaliteral{22}{\isachardoublequote}}quickcheck{\isaliteral{22}{\isachardoublequote}}}, \isa{{\isaliteral{22}{\isachardoublequote}}try{\isaliteral{5F}{\isacharunderscore}}methods{\isaliteral{22}{\isachardoublequote}}}, \isa{{\isaliteral{22}{\isachardoublequote}}sledgehammer{\isaliteral{22}{\isachardoublequote}}},
  2114     \isa{{\isaliteral{22}{\isachardoublequote}}nitpick{\isaliteral{22}{\isachardoublequote}}}).
  2115 
  2116   \item \hyperlink{command.HOL.sledgehammer}{\mbox{\isa{\isacommand{sledgehammer}}}} attempts to prove a subgoal using external
  2117     automatic provers (resolution provers and SMT solvers). See the Sledgehammer
  2118     manual \cite{isabelle-sledgehammer} for details.
  2119 
  2120   \item \hyperlink{command.HOL.sledgehammer-params}{\mbox{\isa{\isacommand{sledgehammer{\isaliteral{5F}{\isacharunderscore}}params}}}} changes
  2121     \hyperlink{command.HOL.sledgehammer}{\mbox{\isa{\isacommand{sledgehammer}}}} configuration options persistently.
  2122 
  2123   \end{description}%
  2124 \end{isamarkuptext}%
  2125 \isamarkuptrue%
  2126 %
  2127 \isamarkupsection{Checking and refuting propositions%
  2128 }
  2129 \isamarkuptrue%
  2130 %
  2131 \begin{isamarkuptext}%
  2132 Identifying incorrect propositions usually involves evaluation of
  2133   particular assignments and systematic counterexample search.  This
  2134   is supported by the following commands.
  2135 
  2136   \begin{matharray}{rcl}
  2137     \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}}} \\
  2138     \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}}} \\
  2139     \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}}} \\
  2140     \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}}} \\
  2141     \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}}} \\
  2142     \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}}} \\
  2143     \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}}}
  2144   \end{matharray}
  2145 
  2146   \begin{railoutput}
  2147 \rail@begin{2}{}
  2148 \rail@term{\hyperlink{command.HOL.value}{\mbox{\isa{\isacommand{value}}}}}[]
  2149 \rail@bar
  2150 \rail@nextbar{1}
  2151 \rail@term{\isa{{\isaliteral{5B}{\isacharbrackleft}}}}[]
  2152 \rail@nont{\isa{name}}[]
  2153 \rail@term{\isa{{\isaliteral{5D}{\isacharbrackright}}}}[]
  2154 \rail@endbar
  2155 \rail@bar
  2156 \rail@nextbar{1}
  2157 \rail@nont{\isa{modes}}[]
  2158 \rail@endbar
  2159 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  2160 \rail@end
  2161 \rail@begin{3}{}
  2162 \rail@bar
  2163 \rail@term{\hyperlink{command.HOL.quickcheck}{\mbox{\isa{\isacommand{quickcheck}}}}}[]
  2164 \rail@nextbar{1}
  2165 \rail@term{\hyperlink{command.HOL.refute}{\mbox{\isa{\isacommand{refute}}}}}[]
  2166 \rail@nextbar{2}
  2167 \rail@term{\hyperlink{command.HOL.nitpick}{\mbox{\isa{\isacommand{nitpick}}}}}[]
  2168 \rail@endbar
  2169 \rail@bar
  2170 \rail@nextbar{1}
  2171 \rail@term{\isa{{\isaliteral{5B}{\isacharbrackleft}}}}[]
  2172 \rail@nont{\isa{args}}[]
  2173 \rail@term{\isa{{\isaliteral{5D}{\isacharbrackright}}}}[]
  2174 \rail@endbar
  2175 \rail@bar
  2176 \rail@nextbar{1}
  2177 \rail@nont{\hyperlink{syntax.nat}{\mbox{\isa{nat}}}}[]
  2178 \rail@endbar
  2179 \rail@end
  2180 \rail@begin{3}{}
  2181 \rail@bar
  2182 \rail@term{\hyperlink{command.HOL.quickcheck-params}{\mbox{\isa{\isacommand{quickcheck{\isaliteral{5F}{\isacharunderscore}}params}}}}}[]
  2183 \rail@nextbar{1}
  2184 \rail@term{\hyperlink{command.HOL.refute-params}{\mbox{\isa{\isacommand{refute{\isaliteral{5F}{\isacharunderscore}}params}}}}}[]
  2185 \rail@nextbar{2}
  2186 \rail@term{\hyperlink{command.HOL.nitpick-params}{\mbox{\isa{\isacommand{nitpick{\isaliteral{5F}{\isacharunderscore}}params}}}}}[]
  2187 \rail@endbar
  2188 \rail@bar
  2189 \rail@nextbar{1}
  2190 \rail@term{\isa{{\isaliteral{5B}{\isacharbrackleft}}}}[]
  2191 \rail@nont{\isa{args}}[]
  2192 \rail@term{\isa{{\isaliteral{5D}{\isacharbrackright}}}}[]
  2193 \rail@endbar
  2194 \rail@end
  2195 \rail@begin{2}{\isa{modes}}
  2196 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2197 \rail@plus
  2198 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2199 \rail@nextplus{1}
  2200 \rail@endplus
  2201 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2202 \rail@end
  2203 \rail@begin{2}{\isa{args}}
  2204 \rail@plus
  2205 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2206 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
  2207 \rail@nont{\isa{value}}[]
  2208 \rail@nextplus{1}
  2209 \rail@cterm{\isa{{\isaliteral{2C}{\isacharcomma}}}}[]
  2210 \rail@endplus
  2211 \rail@end
  2212 \end{railoutput}
  2213  % FIXME check "value"
  2214 
  2215   \begin{description}
  2216 
  2217   \item \hyperlink{command.HOL.value}{\mbox{\isa{\isacommand{value}}}}~\isa{t} evaluates and prints a
  2218     term; optionally \isa{modes} can be specified, which are
  2219     appended to the current print mode; see \secref{sec:print-modes}.
  2220     Internally, the evaluation is performed by registered evaluators,
  2221     which are invoked sequentially until a result is returned.
  2222     Alternatively a specific evaluator can be selected using square
  2223     brackets; typical evaluators use the current set of code equations
  2224     to normalize and include \isa{simp} for fully symbolic
  2225     evaluation using the simplifier, \isa{nbe} for
  2226     \emph{normalization by evaluation} and \emph{code} for code
  2227     generation in SML.
  2228 
  2229   \item \hyperlink{command.HOL.quickcheck}{\mbox{\isa{\isacommand{quickcheck}}}} tests the current goal for
  2230     counterexamples using a series of assignments for its
  2231     free variables; by default the first subgoal is tested, an other
  2232     can be selected explicitly using an optional goal index.
  2233     Assignments can be chosen exhausting the search space upto a given
  2234     size, or using a fixed number of random assignments in the search space,
  2235     or exploring the search space symbolically using narrowing.
  2236     By default, quickcheck uses exhaustive testing.
  2237     A number of configuration options are supported for
  2238     \hyperlink{command.HOL.quickcheck}{\mbox{\isa{\isacommand{quickcheck}}}}, notably:
  2239 
  2240     \begin{description}
  2241 
  2242     \item[\isa{tester}] specifies which testing approach to apply.
  2243       There are three testers, \isa{exhaustive},
  2244       \isa{random}, and \isa{narrowing}.
  2245       An unknown configuration option is treated as an argument to tester,
  2246       making \isa{{\isaliteral{22}{\isachardoublequote}}tester\ {\isaliteral{3D}{\isacharequal}}{\isaliteral{22}{\isachardoublequote}}} optional.
  2247       When multiple testers are given, these are applied in parallel. 
  2248       If no tester is specified, quickcheck uses the testers that are
  2249       set active, i.e., configurations
  2250       \isa{quickcheck{\isaliteral{5F}{\isacharunderscore}}exhaustive{\isaliteral{5F}{\isacharunderscore}}active}, \isa{quickcheck{\isaliteral{5F}{\isacharunderscore}}random{\isaliteral{5F}{\isacharunderscore}}active},
  2251       \isa{quickcheck{\isaliteral{5F}{\isacharunderscore}}narrowing{\isaliteral{5F}{\isacharunderscore}}active} are set to true.
  2252     \item[\isa{size}] specifies the maximum size of the search space
  2253     for assignment values.
  2254 
  2255     \item[\isa{eval}] takes a term or a list of terms and evaluates
  2256       these terms under the variable assignment found by quickcheck.
  2257 
  2258     \item[\isa{iterations}] sets how many sets of assignments are
  2259     generated for each particular size.
  2260 
  2261     \item[\isa{no{\isaliteral{5F}{\isacharunderscore}}assms}] specifies whether assumptions in
  2262     structured proofs should be ignored.
  2263 
  2264     \item[\isa{timeout}] sets the time limit in seconds.
  2265 
  2266     \item[\isa{default{\isaliteral{5F}{\isacharunderscore}}type}] sets the type(s) generally used to
  2267     instantiate type variables.
  2268 
  2269     \item[\isa{report}] if set quickcheck reports how many tests
  2270     fulfilled the preconditions.
  2271 
  2272     \item[\isa{quiet}] if not set quickcheck informs about the
  2273     current size for assignment values.
  2274 
  2275     \item[\isa{expect}] can be used to check if the user's
  2276     expectation was met (\isa{no{\isaliteral{5F}{\isacharunderscore}}expectation}, \isa{no{\isaliteral{5F}{\isacharunderscore}}counterexample}, or \isa{counterexample}).
  2277 
  2278     \end{description}
  2279 
  2280     These option can be given within square brackets.
  2281 
  2282   \item \hyperlink{command.HOL.quickcheck-params}{\mbox{\isa{\isacommand{quickcheck{\isaliteral{5F}{\isacharunderscore}}params}}}} changes
  2283     \hyperlink{command.HOL.quickcheck}{\mbox{\isa{\isacommand{quickcheck}}}} configuration options persistently.
  2284 
  2285   \item \hyperlink{command.HOL.refute}{\mbox{\isa{\isacommand{refute}}}} tests the current goal for
  2286     counterexamples using a reduction to SAT. The following configuration
  2287     options are supported:
  2288 
  2289     \begin{description}
  2290 
  2291     \item[\isa{minsize}] specifies the minimum size (cardinality) of the
  2292       models to search for.
  2293 
  2294     \item[\isa{maxsize}] specifies the maximum size (cardinality) of the
  2295       models to search for. Nonpositive values mean $\infty$.
  2296 
  2297     \item[\isa{maxvars}] specifies the maximum number of Boolean variables
  2298     to use when transforming the term into a propositional formula.
  2299     Nonpositive values mean $\infty$.
  2300 
  2301     \item[\isa{satsolver}] specifies the SAT solver to use.
  2302 
  2303     \item[\isa{no{\isaliteral{5F}{\isacharunderscore}}assms}] specifies whether assumptions in
  2304     structured proofs should be ignored.
  2305 
  2306     \item[\isa{maxtime}] sets the time limit in seconds.
  2307 
  2308     \item[\isa{expect}] can be used to check if the user's
  2309     expectation was met (\isa{genuine}, \isa{potential},
  2310     \isa{none}, or \isa{unknown}).
  2311 
  2312     \end{description}
  2313 
  2314     These option can be given within square brackets.
  2315 
  2316   \item \hyperlink{command.HOL.refute-params}{\mbox{\isa{\isacommand{refute{\isaliteral{5F}{\isacharunderscore}}params}}}} changes
  2317     \hyperlink{command.HOL.refute}{\mbox{\isa{\isacommand{refute}}}} configuration options persistently.
  2318 
  2319   \item \hyperlink{command.HOL.nitpick}{\mbox{\isa{\isacommand{nitpick}}}} tests the current goal for counterexamples
  2320     using a reduction to first-order relational logic. See the Nitpick manual
  2321     \cite{isabelle-nitpick} for details.
  2322 
  2323   \item \hyperlink{command.HOL.nitpick-params}{\mbox{\isa{\isacommand{nitpick{\isaliteral{5F}{\isacharunderscore}}params}}}} changes
  2324     \hyperlink{command.HOL.nitpick}{\mbox{\isa{\isacommand{nitpick}}}} configuration options persistently.
  2325 
  2326   \end{description}%
  2327 \end{isamarkuptext}%
  2328 \isamarkuptrue%
  2329 %
  2330 \isamarkupsection{Unstructured case analysis and induction \label{sec:hol-induct-tac}%
  2331 }
  2332 \isamarkuptrue%
  2333 %
  2334 \begin{isamarkuptext}%
  2335 The following tools of Isabelle/HOL support cases analysis and
  2336   induction in unstructured tactic scripts; see also
  2337   \secref{sec:cases-induct} for proper Isar versions of similar ideas.
  2338 
  2339   \begin{matharray}{rcl}
  2340     \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} \\
  2341     \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} \\
  2342     \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} \\
  2343     \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}}} \\
  2344   \end{matharray}
  2345 
  2346   \begin{railoutput}
  2347 \rail@begin{2}{}
  2348 \rail@term{\hyperlink{method.HOL.case-tac}{\mbox{\isa{case{\isaliteral{5F}{\isacharunderscore}}tac}}}}[]
  2349 \rail@bar
  2350 \rail@nextbar{1}
  2351 \rail@nont{\hyperlink{syntax.goal-spec}{\mbox{\isa{goal{\isaliteral{5F}{\isacharunderscore}}spec}}}}[]
  2352 \rail@endbar
  2353 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  2354 \rail@bar
  2355 \rail@nextbar{1}
  2356 \rail@nont{\isa{rule}}[]
  2357 \rail@endbar
  2358 \rail@end
  2359 \rail@begin{3}{}
  2360 \rail@term{\hyperlink{method.HOL.induct-tac}{\mbox{\isa{induct{\isaliteral{5F}{\isacharunderscore}}tac}}}}[]
  2361 \rail@bar
  2362 \rail@nextbar{1}
  2363 \rail@nont{\hyperlink{syntax.goal-spec}{\mbox{\isa{goal{\isaliteral{5F}{\isacharunderscore}}spec}}}}[]
  2364 \rail@endbar
  2365 \rail@bar
  2366 \rail@nextbar{1}
  2367 \rail@plus
  2368 \rail@nont{\hyperlink{syntax.insts}{\mbox{\isa{insts}}}}[]
  2369 \rail@nextplus{2}
  2370 \rail@cterm{\isa{\isakeyword{and}}}[]
  2371 \rail@endplus
  2372 \rail@endbar
  2373 \rail@bar
  2374 \rail@nextbar{1}
  2375 \rail@nont{\isa{rule}}[]
  2376 \rail@endbar
  2377 \rail@end
  2378 \rail@begin{3}{}
  2379 \rail@term{\hyperlink{method.HOL.ind-cases}{\mbox{\isa{ind{\isaliteral{5F}{\isacharunderscore}}cases}}}}[]
  2380 \rail@plus
  2381 \rail@nont{\hyperlink{syntax.prop}{\mbox{\isa{prop}}}}[]
  2382 \rail@nextplus{1}
  2383 \rail@endplus
  2384 \rail@bar
  2385 \rail@nextbar{1}
  2386 \rail@term{\isa{\isakeyword{for}}}[]
  2387 \rail@plus
  2388 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2389 \rail@nextplus{2}
  2390 \rail@endplus
  2391 \rail@endbar
  2392 \rail@end
  2393 \rail@begin{3}{}
  2394 \rail@term{\hyperlink{command.HOL.inductive-cases}{\mbox{\isa{\isacommand{inductive{\isaliteral{5F}{\isacharunderscore}}cases}}}}}[]
  2395 \rail@plus
  2396 \rail@bar
  2397 \rail@nextbar{1}
  2398 \rail@nont{\hyperlink{syntax.thmdecl}{\mbox{\isa{thmdecl}}}}[]
  2399 \rail@endbar
  2400 \rail@plus
  2401 \rail@nont{\hyperlink{syntax.prop}{\mbox{\isa{prop}}}}[]
  2402 \rail@nextplus{1}
  2403 \rail@endplus
  2404 \rail@nextplus{2}
  2405 \rail@cterm{\isa{\isakeyword{and}}}[]
  2406 \rail@endplus
  2407 \rail@end
  2408 \rail@begin{1}{\isa{rule}}
  2409 \rail@term{\isa{rule}}[]
  2410 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}}}[]
  2411 \rail@nont{\hyperlink{syntax.thmref}{\mbox{\isa{thmref}}}}[]
  2412 \rail@end
  2413 \end{railoutput}
  2414 
  2415 
  2416   \begin{description}
  2417 
  2418   \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
  2419   to reason about inductive types.  Rules are selected according to
  2420   the declarations by the \hyperlink{attribute.cases}{\mbox{\isa{cases}}} and \hyperlink{attribute.induct}{\mbox{\isa{induct}}}
  2421   attributes, cf.\ \secref{sec:cases-induct}.  The \hyperlink{command.HOL.datatype}{\mbox{\isa{\isacommand{datatype}}}} package already takes care of this.
  2422 
  2423   These unstructured tactics feature both goal addressing and dynamic
  2424   instantiation.  Note that named rule cases are \emph{not} provided
  2425   as would be by the proper \hyperlink{method.cases}{\mbox{\isa{cases}}} and \hyperlink{method.induct}{\mbox{\isa{induct}}} proof
  2426   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
  2427   statements, only the compact object-logic conclusion of the subgoal
  2428   being addressed.
  2429 
  2430   \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
  2431   forward manner.
  2432 
  2433   While \hyperlink{method.HOL.ind-cases}{\mbox{\isa{ind{\isaliteral{5F}{\isacharunderscore}}cases}}} is a proof method to apply the
  2434   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
  2435   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
  2436   be generalized before applying the resulting rule.
  2437 
  2438   \end{description}%
  2439 \end{isamarkuptext}%
  2440 \isamarkuptrue%
  2441 %
  2442 \isamarkupsection{Executable code%
  2443 }
  2444 \isamarkuptrue%
  2445 %
  2446 \begin{isamarkuptext}%
  2447 For validation purposes, it is often useful to \emph{execute}
  2448   specifications.  In principle, execution could be simulated by
  2449   Isabelle's inference kernel, i.e. by a combination of resolution and
  2450   simplification.  Unfortunately, this approach is rather inefficient.
  2451   A more efficient way of executing specifications is to translate
  2452   them into a functional programming language such as ML.
  2453 
  2454   Isabelle provides two generic frameworks to support code generation
  2455   from executable specifications.  Isabelle/HOL instantiates these
  2456   mechanisms in a way that is amenable to end-user applications.%
  2457 \end{isamarkuptext}%
  2458 \isamarkuptrue%
  2459 %
  2460 \isamarkupsubsection{The new code generator (F. Haftmann)%
  2461 }
  2462 \isamarkuptrue%
  2463 %
  2464 \begin{isamarkuptext}%
  2465 This framework generates code from functional programs
  2466   (including overloading using type classes) to SML \cite{SML}, OCaml
  2467   \cite{OCaml}, Haskell \cite{haskell-revised-report} and Scala
  2468   \cite{scala-overview-tech-report}.  Conceptually, code generation is
  2469   split up in three steps: \emph{selection} of code theorems,
  2470   \emph{translation} into an abstract executable view and
  2471   \emph{serialization} to a specific \emph{target language}.
  2472   Inductive specifications can be executed using the predicate
  2473   compiler which operates within HOL.  See \cite{isabelle-codegen} for
  2474   an introduction.
  2475 
  2476   \begin{matharray}{rcl}
  2477     \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}}} \\
  2478     \indexdef{HOL}{attribute}{code}\hypertarget{attribute.HOL.code}{\hyperlink{attribute.HOL.code}{\mbox{\isa{code}}}} & : & \isa{attribute} \\
  2479     \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}}} \\
  2480     \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}}} \\
  2481     \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}}} \\
  2482     \indexdef{HOL}{attribute}{code\_inline}\hypertarget{attribute.HOL.code-inline}{\hyperlink{attribute.HOL.code-inline}{\mbox{\isa{code{\isaliteral{5F}{\isacharunderscore}}inline}}}} & : & \isa{attribute} \\
  2483     \indexdef{HOL}{attribute}{code\_post}\hypertarget{attribute.HOL.code-post}{\hyperlink{attribute.HOL.code-post}{\mbox{\isa{code{\isaliteral{5F}{\isacharunderscore}}post}}}} & : & \isa{attribute} \\
  2484     \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}}} \\
  2485     \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}}} \\
  2486     \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}}} \\
  2487     \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}}} \\
  2488     \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}}} \\
  2489     \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}}} \\
  2490     \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}}} \\
  2491     \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}}} \\
  2492     \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}}} \\
  2493     \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}}} \\
  2494     \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}}} \\
  2495     \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}}}
  2496   \end{matharray}
  2497 
  2498   \begin{railoutput}
  2499 \rail@begin{11}{}
  2500 \rail@term{\hyperlink{command.HOL.export-code}{\mbox{\isa{\isacommand{export{\isaliteral{5F}{\isacharunderscore}}code}}}}}[]
  2501 \rail@plus
  2502 \rail@nont{\isa{constexpr}}[]
  2503 \rail@nextplus{1}
  2504 \rail@endplus
  2505 \rail@cr{3}
  2506 \rail@bar
  2507 \rail@nextbar{4}
  2508 \rail@plus
  2509 \rail@term{\isa{\isakeyword{in}}}[]
  2510 \rail@nont{\isa{target}}[]
  2511 \rail@bar
  2512 \rail@nextbar{5}
  2513 \rail@term{\isa{\isakeyword{module{\isaliteral{5F}{\isacharunderscore}}name}}}[]
  2514 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2515 \rail@endbar
  2516 \rail@cr{7}
  2517 \rail@bar
  2518 \rail@nextbar{8}
  2519 \rail@term{\isa{\isakeyword{file}}}[]
  2520 \rail@bar
  2521 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2522 \rail@nextbar{9}
  2523 \rail@term{\isa{{\isaliteral{2D}{\isacharminus}}}}[]
  2524 \rail@endbar
  2525 \rail@endbar
  2526 \rail@bar
  2527 \rail@nextbar{8}
  2528 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2529 \rail@nont{\isa{args}}[]
  2530 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2531 \rail@endbar
  2532 \rail@nextplus{10}
  2533 \rail@endplus
  2534 \rail@endbar
  2535 \rail@end
  2536 \rail@begin{1}{\isa{const}}
  2537 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  2538 \rail@end
  2539 \rail@begin{3}{\isa{constexpr}}
  2540 \rail@bar
  2541 \rail@nont{\isa{const}}[]
  2542 \rail@nextbar{1}
  2543 \rail@term{\isa{name{\isaliteral{2E}{\isachardot}}{\isaliteral{5F}{\isacharunderscore}}}}[]
  2544 \rail@nextbar{2}
  2545 \rail@term{\isa{{\isaliteral{5F}{\isacharunderscore}}}}[]
  2546 \rail@endbar
  2547 \rail@end
  2548 \rail@begin{1}{\isa{typeconstructor}}
  2549 \rail@nont{\hyperlink{syntax.nameref}{\mbox{\isa{nameref}}}}[]
  2550 \rail@end
  2551 \rail@begin{1}{\isa{class}}
  2552 \rail@nont{\hyperlink{syntax.nameref}{\mbox{\isa{nameref}}}}[]
  2553 \rail@end
  2554 \rail@begin{4}{\isa{target}}
  2555 \rail@bar
  2556 \rail@term{\isa{SML}}[]
  2557 \rail@nextbar{1}
  2558 \rail@term{\isa{OCaml}}[]
  2559 \rail@nextbar{2}
  2560 \rail@term{\isa{Haskell}}[]
  2561 \rail@nextbar{3}
  2562 \rail@term{\isa{Scala}}[]
  2563 \rail@endbar
  2564 \rail@end
  2565 \rail@begin{4}{}
  2566 \rail@term{\hyperlink{attribute.HOL.code}{\mbox{\isa{code}}}}[]
  2567 \rail@bar
  2568 \rail@nextbar{1}
  2569 \rail@bar
  2570 \rail@term{\isa{del}}[]
  2571 \rail@nextbar{2}
  2572 \rail@term{\isa{abstype}}[]
  2573 \rail@nextbar{3}
  2574 \rail@term{\isa{abstract}}[]
  2575 \rail@endbar
  2576 \rail@endbar
  2577 \rail@end
  2578 \rail@begin{2}{}
  2579 \rail@term{\hyperlink{command.HOL.code-abort}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}abort}}}}}[]
  2580 \rail@plus
  2581 \rail@nont{\isa{const}}[]
  2582 \rail@nextplus{1}
  2583 \rail@endplus
  2584 \rail@end
  2585 \rail@begin{2}{}
  2586 \rail@term{\hyperlink{command.HOL.code-datatype}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}datatype}}}}}[]
  2587 \rail@plus
  2588 \rail@nont{\isa{const}}[]
  2589 \rail@nextplus{1}
  2590 \rail@endplus
  2591 \rail@end
  2592 \rail@begin{2}{}
  2593 \rail@term{\hyperlink{attribute.HOL.code-inline}{\mbox{\isa{code{\isaliteral{5F}{\isacharunderscore}}inline}}}}[]
  2594 \rail@bar
  2595 \rail@nextbar{1}
  2596 \rail@term{\isa{del}}[]
  2597 \rail@endbar
  2598 \rail@end
  2599 \rail@begin{2}{}
  2600 \rail@term{\hyperlink{attribute.HOL.code-post}{\mbox{\isa{code{\isaliteral{5F}{\isacharunderscore}}post}}}}[]
  2601 \rail@bar
  2602 \rail@nextbar{1}
  2603 \rail@term{\isa{del}}[]
  2604 \rail@endbar
  2605 \rail@end
  2606 \rail@begin{3}{}
  2607 \rail@term{\hyperlink{command.HOL.code-thms}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}thms}}}}}[]
  2608 \rail@bar
  2609 \rail@nextbar{1}
  2610 \rail@plus
  2611 \rail@nont{\isa{constexpr}}[]
  2612 \rail@nextplus{2}
  2613 \rail@endplus
  2614 \rail@endbar
  2615 \rail@end
  2616 \rail@begin{3}{}
  2617 \rail@term{\hyperlink{command.HOL.code-deps}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}deps}}}}}[]
  2618 \rail@bar
  2619 \rail@nextbar{1}
  2620 \rail@plus
  2621 \rail@nont{\isa{constexpr}}[]
  2622 \rail@nextplus{2}
  2623 \rail@endplus
  2624 \rail@endbar
  2625 \rail@end
  2626 \rail@begin{7}{}
  2627 \rail@term{\hyperlink{command.HOL.code-const}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}const}}}}}[]
  2628 \rail@plus
  2629 \rail@nont{\isa{const}}[]
  2630 \rail@nextplus{1}
  2631 \rail@cterm{\isa{\isakeyword{and}}}[]
  2632 \rail@endplus
  2633 \rail@cr{3}
  2634 \rail@plus
  2635 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2636 \rail@nont{\isa{target}}[]
  2637 \rail@plus
  2638 \rail@bar
  2639 \rail@nextbar{4}
  2640 \rail@nont{\isa{syntax}}[]
  2641 \rail@endbar
  2642 \rail@nextplus{5}
  2643 \rail@cterm{\isa{\isakeyword{and}}}[]
  2644 \rail@endplus
  2645 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2646 \rail@nextplus{6}
  2647 \rail@endplus
  2648 \rail@end
  2649 \rail@begin{7}{}
  2650 \rail@term{\hyperlink{command.HOL.code-type}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}type}}}}}[]
  2651 \rail@plus
  2652 \rail@nont{\isa{typeconstructor}}[]
  2653 \rail@nextplus{1}
  2654 \rail@cterm{\isa{\isakeyword{and}}}[]
  2655 \rail@endplus
  2656 \rail@cr{3}
  2657 \rail@plus
  2658 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2659 \rail@nont{\isa{target}}[]
  2660 \rail@plus
  2661 \rail@bar
  2662 \rail@nextbar{4}
  2663 \rail@nont{\isa{syntax}}[]
  2664 \rail@endbar
  2665 \rail@nextplus{5}
  2666 \rail@cterm{\isa{\isakeyword{and}}}[]
  2667 \rail@endplus
  2668 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2669 \rail@nextplus{6}
  2670 \rail@endplus
  2671 \rail@end
  2672 \rail@begin{9}{}
  2673 \rail@term{\hyperlink{command.HOL.code-class}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}class}}}}}[]
  2674 \rail@plus
  2675 \rail@nont{\isa{class}}[]
  2676 \rail@nextplus{1}
  2677 \rail@cterm{\isa{\isakeyword{and}}}[]
  2678 \rail@endplus
  2679 \rail@cr{3}
  2680 \rail@plus
  2681 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2682 \rail@nont{\isa{target}}[]
  2683 \rail@cr{5}
  2684 \rail@plus
  2685 \rail@bar
  2686 \rail@nextbar{6}
  2687 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2688 \rail@endbar
  2689 \rail@nextplus{7}
  2690 \rail@cterm{\isa{\isakeyword{and}}}[]
  2691 \rail@endplus
  2692 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2693 \rail@nextplus{8}
  2694 \rail@endplus
  2695 \rail@end
  2696 \rail@begin{7}{}
  2697 \rail@term{\hyperlink{command.HOL.code-instance}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}instance}}}}}[]
  2698 \rail@plus
  2699 \rail@nont{\isa{typeconstructor}}[]
  2700 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}}}[]
  2701 \rail@nont{\isa{class}}[]
  2702 \rail@nextplus{1}
  2703 \rail@cterm{\isa{\isakeyword{and}}}[]
  2704 \rail@endplus
  2705 \rail@cr{3}
  2706 \rail@plus
  2707 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2708 \rail@nont{\isa{target}}[]
  2709 \rail@plus
  2710 \rail@bar
  2711 \rail@nextbar{4}
  2712 \rail@term{\isa{{\isaliteral{2D}{\isacharminus}}}}[]
  2713 \rail@endbar
  2714 \rail@nextplus{5}
  2715 \rail@cterm{\isa{\isakeyword{and}}}[]
  2716 \rail@endplus
  2717 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2718 \rail@nextplus{6}
  2719 \rail@endplus
  2720 \rail@end
  2721 \rail@begin{2}{}
  2722 \rail@term{\hyperlink{command.HOL.code-reserved}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}reserved}}}}}[]
  2723 \rail@nont{\isa{target}}[]
  2724 \rail@plus
  2725 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2726 \rail@nextplus{1}
  2727 \rail@endplus
  2728 \rail@end
  2729 \rail@begin{1}{}
  2730 \rail@term{\hyperlink{command.HOL.code-monad}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}monad}}}}}[]
  2731 \rail@nont{\isa{const}}[]
  2732 \rail@nont{\isa{const}}[]
  2733 \rail@nont{\isa{target}}[]
  2734 \rail@end
  2735 \rail@begin{2}{}
  2736 \rail@term{\hyperlink{command.HOL.code-include}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}include}}}}}[]
  2737 \rail@nont{\isa{target}}[]
  2738 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2739 \rail@bar
  2740 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2741 \rail@nextbar{1}
  2742 \rail@term{\isa{{\isaliteral{2D}{\isacharminus}}}}[]
  2743 \rail@endbar
  2744 \rail@end
  2745 \rail@begin{2}{}
  2746 \rail@term{\hyperlink{command.HOL.code-modulename}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}modulename}}}}}[]
  2747 \rail@nont{\isa{target}}[]
  2748 \rail@plus
  2749 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2750 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2751 \rail@nextplus{1}
  2752 \rail@endplus
  2753 \rail@end
  2754 \rail@begin{11}{}
  2755 \rail@term{\hyperlink{command.HOL.code-reflect}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}reflect}}}}}[]
  2756 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2757 \rail@cr{2}
  2758 \rail@bar
  2759 \rail@nextbar{3}
  2760 \rail@term{\isa{\isakeyword{datatypes}}}[]
  2761 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2762 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
  2763 \rail@bar
  2764 \rail@term{\isa{{\isaliteral{5F}{\isacharunderscore}}}}[]
  2765 \rail@nextbar{4}
  2766 \rail@plus
  2767 \rail@plus
  2768 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2769 \rail@nextplus{5}
  2770 \rail@cterm{\isa{{\isaliteral{7C}{\isacharbar}}}}[]
  2771 \rail@endplus
  2772 \rail@nextplus{6}
  2773 \rail@cterm{\isa{\isakeyword{and}}}[]
  2774 \rail@endplus
  2775 \rail@endbar
  2776 \rail@endbar
  2777 \rail@cr{8}
  2778 \rail@bar
  2779 \rail@nextbar{9}
  2780 \rail@term{\isa{\isakeyword{functions}}}[]
  2781 \rail@plus
  2782 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2783 \rail@nextplus{10}
  2784 \rail@endplus
  2785 \rail@endbar
  2786 \rail@bar
  2787 \rail@nextbar{9}
  2788 \rail@term{\isa{\isakeyword{file}}}[]
  2789 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2790 \rail@endbar
  2791 \rail@end
  2792 \rail@begin{4}{\isa{syntax}}
  2793 \rail@bar
  2794 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2795 \rail@nextbar{1}
  2796 \rail@bar
  2797 \rail@term{\isa{\isakeyword{infix}}}[]
  2798 \rail@nextbar{2}
  2799 \rail@term{\isa{\isakeyword{infixl}}}[]
  2800 \rail@nextbar{3}
  2801 \rail@term{\isa{\isakeyword{infixr}}}[]
  2802 \rail@endbar
  2803 \rail@nont{\hyperlink{syntax.nat}{\mbox{\isa{nat}}}}[]
  2804 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2805 \rail@endbar
  2806 \rail@end
  2807 \end{railoutput}
  2808 
  2809 
  2810   \begin{description}
  2811 
  2812   \item \hyperlink{command.HOL.export-code}{\mbox{\isa{\isacommand{export{\isaliteral{5F}{\isacharunderscore}}code}}}} generates code for a given list
  2813   of constants in the specified target language(s).  If no
  2814   serialization instruction is given, only abstract code is generated
  2815   internally.
  2816 
  2817   Constants may be specified by giving them literally, referring to
  2818   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
  2819   available by giving \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}}.
  2820 
  2821   By default, for each involved theory one corresponding name space
  2822   module is generated.  Alternativly, a module name may be specified
  2823   after the \hyperlink{keyword.module-name}{\mbox{\isa{\isakeyword{module{\isaliteral{5F}{\isacharunderscore}}name}}}} keyword; then \emph{all} code is
  2824   placed in this module.
  2825 
  2826   For \emph{SML}, \emph{OCaml} and \emph{Scala} the file specification
  2827   refers to a single file; for \emph{Haskell}, it refers to a whole
  2828   directory, where code is generated in multiple files reflecting the
  2829   module hierarchy.  Omitting the file specification denotes standard
  2830   output.
  2831 
  2832   Serializers take an optional list of arguments in parentheses.  For
  2833   \emph{SML} and \emph{OCaml}, ``\isa{no{\isaliteral{5F}{\isacharunderscore}}signatures}`` omits
  2834   explicit module signatures.
  2835 
  2836   For \emph{Haskell} a module name prefix may be given using the
  2837   ``\isa{{\isaliteral{22}{\isachardoublequote}}root{\isaliteral{3A}{\isacharcolon}}{\isaliteral{22}{\isachardoublequote}}}'' argument; ``\isa{string{\isaliteral{5F}{\isacharunderscore}}classes}'' adds a
  2838   ``\verb|deriving (Read, Show)|'' clause to each appropriate
  2839   datatype declaration.
  2840 
  2841   \item \hyperlink{attribute.HOL.code}{\mbox{\isa{code}}} explicitly selects (or with option
  2842   ``\isa{{\isaliteral{22}{\isachardoublequote}}del{\isaliteral{22}{\isachardoublequote}}}'' deselects) a code equation for code generation.
  2843   Usually packages introducing code equations provide a reasonable
  2844   default setup for selection.  Variants \isa{{\isaliteral{22}{\isachardoublequote}}code\ abstype{\isaliteral{22}{\isachardoublequote}}} and
  2845   \isa{{\isaliteral{22}{\isachardoublequote}}code\ abstract{\isaliteral{22}{\isachardoublequote}}} declare abstract datatype certificates or
  2846   code equations on abstract datatype representations respectively.
  2847 
  2848   \item \hyperlink{command.HOL.code-abort}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}abort}}}} declares constants which are not
  2849   required to have a definition by means of code equations; if needed
  2850   these are implemented by program abort instead.
  2851 
  2852   \item \hyperlink{command.HOL.code-datatype}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}datatype}}}} specifies a constructor set
  2853   for a logical type.
  2854 
  2855   \item \hyperlink{command.HOL.print-codesetup}{\mbox{\isa{\isacommand{print{\isaliteral{5F}{\isacharunderscore}}codesetup}}}} gives an overview on
  2856   selected code equations and code generator datatypes.
  2857 
  2858   \item \hyperlink{attribute.HOL.code-inline}{\mbox{\isa{code{\isaliteral{5F}{\isacharunderscore}}inline}}} declares (or with option
  2859   ``\isa{{\isaliteral{22}{\isachardoublequote}}del{\isaliteral{22}{\isachardoublequote}}}'' removes) inlining theorems which are applied as
  2860   rewrite rules to any code equation during preprocessing.
  2861 
  2862   \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
  2863   result of an evaluation.
  2864 
  2865   \item \hyperlink{command.HOL.print-codeproc}{\mbox{\isa{\isacommand{print{\isaliteral{5F}{\isacharunderscore}}codeproc}}}} prints the setup of the code
  2866   generator preprocessor.
  2867 
  2868   \item \hyperlink{command.HOL.code-thms}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}thms}}}} prints a list of theorems
  2869   representing the corresponding program containing all given
  2870   constants after preprocessing.
  2871 
  2872   \item \hyperlink{command.HOL.code-deps}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}deps}}}} visualizes dependencies of
  2873   theorems representing the corresponding program containing all given
  2874   constants after preprocessing.
  2875 
  2876   \item \hyperlink{command.HOL.code-const}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}const}}}} associates a list of constants
  2877   with target-specific serializations; omitting a serialization
  2878   deletes an existing serialization.
  2879 
  2880   \item \hyperlink{command.HOL.code-type}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}type}}}} associates a list of type
  2881   constructors with target-specific serializations; omitting a
  2882   serialization deletes an existing serialization.
  2883 
  2884   \item \hyperlink{command.HOL.code-class}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}class}}}} associates a list of classes
  2885   with target-specific class names; omitting a serialization deletes
  2886   an existing serialization.  This applies only to \emph{Haskell}.
  2887 
  2888   \item \hyperlink{command.HOL.code-instance}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}instance}}}} declares a list of type
  2889   constructor / class instance relations as ``already present'' for a
  2890   given target.  Omitting a ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{2D}{\isacharminus}}{\isaliteral{22}{\isachardoublequote}}}'' deletes an existing
  2891   ``already present'' declaration.  This applies only to
  2892   \emph{Haskell}.
  2893 
  2894   \item \hyperlink{command.HOL.code-reserved}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}reserved}}}} declares a list of names as
  2895   reserved for a given target, preventing it to be shadowed by any
  2896   generated code.
  2897 
  2898   \item \hyperlink{command.HOL.code-monad}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}monad}}}} provides an auxiliary mechanism
  2899   to generate monadic code for Haskell.
  2900 
  2901   \item \hyperlink{command.HOL.code-include}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}include}}}} adds arbitrary named content
  2902   (``include'') to generated code.  A ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{2D}{\isacharminus}}{\isaliteral{22}{\isachardoublequote}}}'' as last argument
  2903   will remove an already added ``include''.
  2904 
  2905   \item \hyperlink{command.HOL.code-modulename}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}modulename}}}} declares aliasings from one
  2906   module name onto another.
  2907 
  2908   \item \hyperlink{command.HOL.code-reflect}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}reflect}}}} without a ``\isa{{\isaliteral{22}{\isachardoublequote}}file{\isaliteral{22}{\isachardoublequote}}}''
  2909   argument compiles code into the system runtime environment and
  2910   modifies the code generator setup that future invocations of system
  2911   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
  2912   entities.  With a ``\isa{{\isaliteral{22}{\isachardoublequote}}file{\isaliteral{22}{\isachardoublequote}}}'' argument, the corresponding code
  2913   is generated into that specified file without modifying the code
  2914   generator setup.
  2915 
  2916   \end{description}%
  2917 \end{isamarkuptext}%
  2918 \isamarkuptrue%
  2919 %
  2920 \isamarkupsubsection{The old code generator (S. Berghofer)%
  2921 }
  2922 \isamarkuptrue%
  2923 %
  2924 \begin{isamarkuptext}%
  2925 This framework generates code from both functional and
  2926   relational programs to SML, as explained below.
  2927 
  2928   \begin{matharray}{rcl}
  2929     \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}}} \\
  2930     \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}}} \\
  2931     \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}}} \\
  2932     \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}}} \\
  2933     \indexdef{}{attribute}{code}\hypertarget{attribute.code}{\hyperlink{attribute.code}{\mbox{\isa{code}}}} & : & \isa{attribute} \\
  2934   \end{matharray}
  2935 
  2936   \begin{railoutput}
  2937 \rail@begin{11}{}
  2938 \rail@bar
  2939 \rail@term{\hyperlink{command.code-module}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}module}}}}}[]
  2940 \rail@nextbar{1}
  2941 \rail@term{\hyperlink{command.code-library}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}library}}}}}[]
  2942 \rail@endbar
  2943 \rail@bar
  2944 \rail@nextbar{1}
  2945 \rail@nont{\isa{modespec}}[]
  2946 \rail@endbar
  2947 \rail@bar
  2948 \rail@nextbar{1}
  2949 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2950 \rail@endbar
  2951 \rail@cr{3}
  2952 \rail@bar
  2953 \rail@nextbar{4}
  2954 \rail@term{\isa{\isakeyword{file}}}[]
  2955 \rail@nont{\isa{name}}[]
  2956 \rail@endbar
  2957 \rail@bar
  2958 \rail@nextbar{4}
  2959 \rail@term{\isa{\isakeyword{imports}}}[]
  2960 \rail@plus
  2961 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2962 \rail@nextplus{5}
  2963 \rail@endplus
  2964 \rail@endbar
  2965 \rail@cr{7}
  2966 \rail@term{\isa{\isakeyword{contains}}}[]
  2967 \rail@bar
  2968 \rail@plus
  2969 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2970 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
  2971 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  2972 \rail@nextplus{8}
  2973 \rail@endplus
  2974 \rail@nextbar{9}
  2975 \rail@plus
  2976 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  2977 \rail@nextplus{10}
  2978 \rail@endplus
  2979 \rail@endbar
  2980 \rail@end
  2981 \rail@begin{2}{\isa{modespec}}
  2982 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2983 \rail@plus
  2984 \rail@nextplus{1}
  2985 \rail@cnont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2986 \rail@endplus
  2987 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2988 \rail@end
  2989 \rail@begin{2}{}
  2990 \rail@term{\hyperlink{command.HOL.consts-code}{\mbox{\isa{\isacommand{consts{\isaliteral{5F}{\isacharunderscore}}code}}}}}[]
  2991 \rail@plus
  2992 \rail@nont{\isa{codespec}}[]
  2993 \rail@nextplus{1}
  2994 \rail@endplus
  2995 \rail@end
  2996 \rail@begin{2}{\isa{codespec}}
  2997 \rail@nont{\isa{const}}[]
  2998 \rail@nont{\isa{template}}[]
  2999 \rail@bar
  3000 \rail@nextbar{1}
  3001 \rail@nont{\isa{attachment}}[]
  3002 \rail@endbar
  3003 \rail@end
  3004 \rail@begin{2}{}
  3005 \rail@term{\hyperlink{command.HOL.types-code}{\mbox{\isa{\isacommand{types{\isaliteral{5F}{\isacharunderscore}}code}}}}}[]
  3006 \rail@plus
  3007 \rail@nont{\isa{tycodespec}}[]
  3008 \rail@nextplus{1}
  3009 \rail@endplus
  3010 \rail@end
  3011 \rail@begin{2}{\isa{tycodespec}}
  3012 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  3013 \rail@nont{\isa{template}}[]
  3014 \rail@bar
  3015 \rail@nextbar{1}
  3016 \rail@nont{\isa{attachment}}[]
  3017 \rail@endbar
  3018 \rail@end
  3019 \rail@begin{1}{\isa{const}}
  3020 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  3021 \rail@end
  3022 \rail@begin{1}{\isa{template}}
  3023 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  3024 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  3025 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  3026 \rail@end
  3027 \rail@begin{2}{\isa{attachment}}
  3028 \rail@term{\isa{attach}}[]
  3029 \rail@bar
  3030 \rail@nextbar{1}
  3031 \rail@nont{\isa{modespec}}[]
  3032 \rail@endbar
  3033 \rail@term{\isa{{\isaliteral{7B}{\isacharbraceleft}}}}[]
  3034 \rail@nont{\hyperlink{syntax.text}{\mbox{\isa{text}}}}[]
  3035 \rail@term{\isa{{\isaliteral{7D}{\isacharbraceright}}}}[]
  3036 \rail@end
  3037 \rail@begin{2}{}
  3038 \rail@term{\hyperlink{attribute.code}{\mbox{\isa{code}}}}[]
  3039 \rail@bar
  3040 \rail@nextbar{1}
  3041 \rail@nont{\isa{name}}[]
  3042 \rail@endbar
  3043 \rail@end
  3044 \end{railoutput}%
  3045 \end{isamarkuptext}%
  3046 \isamarkuptrue%
  3047 %
  3048 \isamarkupsubsubsection{Invoking the code generator%
  3049 }
  3050 \isamarkuptrue%
  3051 %
  3052 \begin{isamarkuptext}%
  3053 The code generator is invoked via the \hyperlink{command.code-module}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}module}}}}
  3054   and \hyperlink{command.code-library}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}library}}}} commands, which correspond to
  3055   \emph{incremental} and \emph{modular} code generation, respectively.
  3056 
  3057   \begin{description}
  3058 
  3059   \item [Modular] For each theory, an ML structure is generated,
  3060   containing the code generated from the constants defined in this
  3061   theory.
  3062 
  3063   \item [Incremental] All the generated code is emitted into the same
  3064   structure.  This structure may import code from previously generated
  3065   structures, which can be specified via \hyperlink{keyword.imports}{\mbox{\isa{\isakeyword{imports}}}}.
  3066   Moreover, the generated structure may also be referred to in later
  3067   invocations of the code generator.
  3068 
  3069   \end{description}
  3070 
  3071   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}}}}
  3072   keywords, the user may specify an optional list of ``modes'' in
  3073   parentheses. These can be used to instruct the code generator to
  3074   emit additional code for special purposes, e.g.\ functions for
  3075   converting elements of generated datatypes to Isabelle terms, or
  3076   test data generators. The list of modes is followed by a module
  3077   name.  The module name is optional for modular code generation, but
  3078   must be specified for incremental code generation.
  3079 
  3080   The code can either be written to a file, in which case a file name
  3081   has to be specified after the \hyperlink{keyword.file}{\mbox{\isa{\isakeyword{file}}}} keyword, or be loaded
  3082   directly into Isabelle's ML environment. In the latter case, the
  3083   \hyperlink{command.ML}{\mbox{\isa{\isacommand{ML}}}} theory command can be used to inspect the results
  3084   interactively, for example.
  3085 
  3086   The terms from which to generate code can be specified after the
  3087   \hyperlink{keyword.contains}{\mbox{\isa{\isakeyword{contains}}}} keyword, either as a list of bindings, or just
  3088   as a list of terms. In the latter case, the code generator just
  3089   produces code for all constants and types occuring in the term, but
  3090   does not bind the compiled terms to ML identifiers.
  3091 
  3092   Here is an example:%
  3093 \end{isamarkuptext}%
  3094 \isamarkuptrue%
  3095 \isacommand{code{\isaliteral{5F}{\isacharunderscore}}module}\isamarkupfalse%
  3096 \ Test\isanewline
  3097 \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}}%
  3098 \begin{isamarkuptext}%
  3099 \noindent This binds the result of compiling the given term to
  3100   the ML identifier \verb|Test.test|.%
  3101 \end{isamarkuptext}%
  3102 \isamarkuptrue%
  3103 %
  3104 \isadelimML
  3105 %
  3106 \endisadelimML
  3107 %
  3108 \isatagML
  3109 \isacommand{ML}\isamarkupfalse%
  3110 \ {\isaliteral{7B2A}{\isacharverbatimopen}}\ %
  3111 \isaantiq
  3112 assert{}%
  3113 \endisaantiq
  3114 \ {\isaliteral{28}{\isacharparenleft}}Test{\isaliteral{2E}{\isachardot}}test\ {\isaliteral{3D}{\isacharequal}}\ {\isadigit{1}}{\isadigit{5}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{2A7D}{\isacharverbatimclose}}%
  3115 \endisatagML
  3116 {\isafoldML}%
  3117 %
  3118 \isadelimML
  3119 %
  3120 \endisadelimML
  3121 %
  3122 \isamarkupsubsubsection{Configuring the code generator%
  3123 }
  3124 \isamarkuptrue%
  3125 %
  3126 \begin{isamarkuptext}%
  3127 When generating code for a complex term, the code generator
  3128   recursively calls itself for all subterms.  When it arrives at a
  3129   constant, the default strategy of the code generator is to look up
  3130   its definition and try to generate code for it.  Constants which
  3131   have no definitions that are immediately executable, may be
  3132   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
  3133   constant (given in usual term syntax -- an explicit type constraint
  3134   accounts for overloading), and a mixfix template describing the ML
  3135   code. The latter is very much the same as the mixfix templates used
  3136   when declaring new constants.  The most notable difference is that
  3137   terms may be included in the ML template using antiquotation
  3138   brackets \verb|{|\verb|*|~\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{2E}{\isachardot}}{\isaliteral{2E}{\isachardot}}{\isaliteral{2E}{\isachardot}}{\isaliteral{22}{\isachardoublequote}}}~\verb|*|\verb|}|.
  3139 
  3140   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.
  3141 
  3142   For example, the following declarations copied from \verb|~~/src/HOL/Product_Type.thy| describe how the product type of
  3143   Isabelle/HOL should be compiled to ML.%
  3144 \end{isamarkuptext}%
  3145 \isamarkuptrue%
  3146 \isacommand{typedecl}\isamarkupfalse%
  3147 \ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{29}{\isacharparenright}}\ prod\isanewline
  3148 \isacommand{consts}\isamarkupfalse%
  3149 \ 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
  3150 \isanewline
  3151 \isacommand{types{\isaliteral{5F}{\isacharunderscore}}code}\isamarkupfalse%
  3152 \ 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
  3153 \isacommand{consts{\isaliteral{5F}{\isacharunderscore}}code}\isamarkupfalse%
  3154 \ 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}}%
  3155 \begin{isamarkuptext}%
  3156 Sometimes, the code associated with a constant or type may
  3157   need to refer to auxiliary functions, which have to be emitted when
  3158   the constant is used. Code for such auxiliary functions can be
  3159   declared using \hyperlink{keyword.attach}{\mbox{\isa{\isakeyword{attach}}}}. For example, the \isa{wfrec}
  3160   function can be implemented as follows:%
  3161 \end{isamarkuptext}%
  3162 \isamarkuptrue%
  3163 \isacommand{consts{\isaliteral{5F}{\isacharunderscore}}code}\isamarkupfalse%
  3164 \ wfrec\ \ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C6D6F64756C653E}{\isasymmodule}}wfrec{\isaliteral{3F}{\isacharquery}}{\isaliteral{22}{\isachardoublequoteclose}}{\isaliteral{29}{\isacharparenright}}\ \ \isanewline
  3165 \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}}%
  3166 \begin{isamarkuptext}%
  3167 If the code containing a call to \isa{wfrec} resides in an
  3168   ML structure different from the one containing the function
  3169   definition attached to \isa{wfrec}, the name of the ML structure
  3170   (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
  3171   the code generator should ignore the first argument of \isa{wfrec}, i.e.\ the termination relation, which is usually not
  3172   executable.
  3173 
  3174   \medskip Another possibility of configuring the code generator is to
  3175   register theorems to be used for code generation. Theorems can be
  3176   registered via the \hyperlink{attribute.code}{\mbox{\isa{code}}} attribute. It takes an optional
  3177   name as an argument, which indicates the format of the
  3178   theorem. Currently supported formats are equations (this is the
  3179   default when no name is specified) and horn clauses (this is
  3180   indicated by the name \texttt{ind}). The left-hand sides of
  3181   equations may only contain constructors and distinct variables,
  3182   whereas horn clauses must have the same format as introduction rules
  3183   of inductive definitions.
  3184 
  3185   The following example specifies three equations from which to
  3186   generate code for \isa{{\isaliteral{22}{\isachardoublequote}}op\ {\isaliteral{3C}{\isacharless}}{\isaliteral{22}{\isachardoublequote}}} on natural numbers (see also
  3187   \verb|~~/src/HOL/Nat.thy|).%
  3188 \end{isamarkuptext}%
  3189 \isamarkuptrue%
  3190 \isacommand{lemma}\isamarkupfalse%
  3191 \ {\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
  3192 \ \ \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
  3193 \ \ \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}}%
  3194 \isadelimproof
  3195 \ %
  3196 \endisadelimproof
  3197 %
  3198 \isatagproof
  3199 \isacommand{by}\isamarkupfalse%
  3200 \ simp{\isaliteral{5F}{\isacharunderscore}}all%
  3201 \endisatagproof
  3202 {\isafoldproof}%
  3203 %
  3204 \isadelimproof
  3205 %
  3206 \endisadelimproof
  3207 %
  3208 \isamarkupsubsubsection{Specific HOL code generators%
  3209 }
  3210 \isamarkuptrue%
  3211 %
  3212 \begin{isamarkuptext}%
  3213 The basic code generator framework offered by Isabelle/Pure
  3214   has already been extended with additional code generators for
  3215   specific HOL constructs. These include datatypes, recursive
  3216   functions and inductive relations. The code generator for inductive
  3217   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
  3218   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}}}'',
  3219   the above expression evaluates to a sequence of possible answers. If
  3220   all of the \isa{{\isaliteral{22}{\isachardoublequote}}t\isaliteral{5C3C5E7375623E}{}\isactrlsub i{\isaliteral{22}{\isachardoublequote}}} are proper terms, the expression evaluates
  3221   to a boolean value.
  3222 
  3223   The following example demonstrates this for beta-reduction on lambda
  3224   terms (see also \verb|~~/src/HOL/Proofs/Lambda/Lambda.thy|).%
  3225 \end{isamarkuptext}%
  3226 \isamarkuptrue%
  3227 \isacommand{datatype}\isamarkupfalse%
  3228 \ dB\ {\isaliteral{3D}{\isacharequal}}\isanewline
  3229 \ \ \ \ Var\ nat\isanewline
  3230 \ \ {\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
  3231 \ \ {\isaliteral{7C}{\isacharbar}}\ Abs\ dB\isanewline
  3232 \isanewline
  3233 \isacommand{primrec}\isamarkupfalse%
  3234 \ lift\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}dB\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ dB{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  3235 \isakeyword{where}\isanewline
  3236 \ \ \ \ {\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
  3237 \ \ {\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
  3238 \ \ {\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
  3239 \isanewline
  3240 \isacommand{primrec}\isamarkupfalse%
  3241 \ 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
  3242 \isakeyword{where}\isanewline
  3243 \ \ \ \ {\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
  3244 \ \ \ \ \ \ {\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
  3245 \ \ {\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
  3246 \ \ {\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
  3247 \isanewline
  3248 \isacommand{inductive}\isamarkupfalse%
  3249 \ 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
  3250 \isakeyword{where}\isanewline
  3251 \ \ \ \ 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
  3252 \ \ {\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
  3253 \ \ {\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
  3254 \ \ {\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
  3255 \isanewline
  3256 \isacommand{code{\isaliteral{5F}{\isacharunderscore}}module}\isamarkupfalse%
  3257 \ Test\isanewline
  3258 \isakeyword{contains}\isanewline
  3259 \ \ 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
  3260 \ \ 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}}%
  3261 \begin{isamarkuptext}%
  3262 In the above example, \verb|Test.test1| evaluates to a boolean,
  3263   whereas \verb|Test.test2| is a lazy sequence whose elements can be
  3264   inspected separately.%
  3265 \end{isamarkuptext}%
  3266 \isamarkuptrue%
  3267 %
  3268 \isadelimML
  3269 %
  3270 \endisadelimML
  3271 %
  3272 \isatagML
  3273 \isacommand{ML}\isamarkupfalse%
  3274 \ {\isaliteral{7B2A}{\isacharverbatimopen}}\ %
  3275 \isaantiq
  3276 assert{}%
  3277 \endisaantiq
  3278 \ Test{\isaliteral{2E}{\isachardot}}test{\isadigit{1}}\ {\isaliteral{2A7D}{\isacharverbatimclose}}\isanewline
  3279 \isacommand{ML}\isamarkupfalse%
  3280 \ {\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
  3281 \isacommand{ML}\isamarkupfalse%
  3282 \ {\isaliteral{7B2A}{\isacharverbatimopen}}\ %
  3283 \isaantiq
  3284 assert{}%
  3285 \endisaantiq
  3286 \ {\isaliteral{28}{\isacharparenleft}}length\ results\ {\isaliteral{3D}{\isacharequal}}\ {\isadigit{2}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{2A7D}{\isacharverbatimclose}}%
  3287 \endisatagML
  3288 {\isafoldML}%
  3289 %
  3290 \isadelimML
  3291 %
  3292 \endisadelimML
  3293 %
  3294 \begin{isamarkuptext}%
  3295 \medskip The theory underlying the HOL code generator is described
  3296   more detailed in \cite{Berghofer-Nipkow:2002}. More examples that
  3297   illustrate the usage of the code generator can be found e.g.\ in
  3298   \verb|~~/src/HOL/MicroJava/J/JListExample.thy| and \verb|~~/src/HOL/MicroJava/JVM/JVMListExample.thy|.%
  3299 \end{isamarkuptext}%
  3300 \isamarkuptrue%
  3301 %
  3302 \isamarkupsection{Definition by specification \label{sec:hol-specification}%
  3303 }
  3304 \isamarkuptrue%
  3305 %
  3306 \begin{isamarkuptext}%
  3307 \begin{matharray}{rcl}
  3308     \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}}} \\
  3309     \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}}} \\
  3310   \end{matharray}
  3311 
  3312   \begin{railoutput}
  3313 \rail@begin{6}{}
  3314 \rail@bar
  3315 \rail@term{\hyperlink{command.HOL.specification}{\mbox{\isa{\isacommand{specification}}}}}[]
  3316 \rail@nextbar{1}
  3317 \rail@term{\hyperlink{command.HOL.ax-specification}{\mbox{\isa{\isacommand{ax{\isaliteral{5F}{\isacharunderscore}}specification}}}}}[]
  3318 \rail@endbar
  3319 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  3320 \rail@plus
  3321 \rail@nont{\isa{decl}}[]
  3322 \rail@nextplus{1}
  3323 \rail@endplus
  3324 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  3325 \rail@cr{3}
  3326 \rail@plus
  3327 \rail@bar
  3328 \rail@nextbar{4}
  3329 \rail@nont{\hyperlink{syntax.thmdecl}{\mbox{\isa{thmdecl}}}}[]
  3330 \rail@endbar
  3331 \rail@nont{\hyperlink{syntax.prop}{\mbox{\isa{prop}}}}[]
  3332 \rail@nextplus{5}
  3333 \rail@endplus
  3334 \rail@end
  3335 \rail@begin{2}{\isa{decl}}
  3336 \rail@bar
  3337 \rail@nextbar{1}
  3338 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  3339 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}}}[]
  3340 \rail@endbar
  3341 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  3342 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  3343 \rail@term{\isa{\isakeyword{overloaded}}}[]
  3344 \rail@bar
  3345 \rail@nextbar{1}
  3346 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  3347 \rail@endbar
  3348 \rail@end
  3349 \end{railoutput}
  3350 
  3351 
  3352   \begin{description}
  3353 
  3354   \item \hyperlink{command.HOL.specification}{\mbox{\isa{\isacommand{specification}}}}~\isa{{\isaliteral{22}{\isachardoublequote}}decls\ {\isaliteral{5C3C7068693E}{\isasymphi}}{\isaliteral{22}{\isachardoublequote}}} sets up a
  3355   goal stating the existence of terms with the properties specified to
  3356   hold for the constants given in \isa{decls}.  After finishing the
  3357   proof, the theory will be augmented with definitions for the given
  3358   constants, as well as with theorems stating the properties for these
  3359   constants.
  3360 
  3361   \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
  3362   a goal stating the existence of terms with the properties specified
  3363   to hold for the constants given in \isa{decls}.  After finishing
  3364   the proof, the theory will be augmented with axioms expressing the
  3365   properties given in the first place.
  3366 
  3367   \item \isa{decl} declares a constant to be defined by the
  3368   specification given.  The definition for the constant \isa{c} is
  3369   bound to the name \isa{c{\isaliteral{5F}{\isacharunderscore}}def} unless a theorem name is given in
  3370   the declaration.  Overloaded constants should be declared as such.
  3371 
  3372   \end{description}
  3373 
  3374   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
  3375   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
  3376   user has explicitly proven it to be safe.  A practical issue must be
  3377   considered, though: After introducing two constants with the same
  3378   properties using \hyperlink{command.HOL.specification}{\mbox{\isa{\isacommand{specification}}}}, one can prove
  3379   that the two constants are, in fact, equal.  If this might be a
  3380   problem, one should use \hyperlink{command.HOL.ax-specification}{\mbox{\isa{\isacommand{ax{\isaliteral{5F}{\isacharunderscore}}specification}}}}.%
  3381 \end{isamarkuptext}%
  3382 \isamarkuptrue%
  3383 %
  3384 \isadelimtheory
  3385 %
  3386 \endisadelimtheory
  3387 %
  3388 \isatagtheory
  3389 \isacommand{end}\isamarkupfalse%
  3390 %
  3391 \endisatagtheory
  3392 {\isafoldtheory}%
  3393 %
  3394 \isadelimtheory
  3395 %
  3396 \endisadelimtheory
  3397 \isanewline
  3398 \end{isabellebody}%
  3399 %%% Local Variables:
  3400 %%% mode: latex
  3401 %%% TeX-master: "root"
  3402 %%% End: