doc-src/IsarRef/Thy/document/HOL_Specific.tex
author wenzelm
Thu, 26 May 2011 22:42:52 +0200
changeset 44118 e6ed6b951201
parent 44117 68bc69bdce88
child 44130 a8b655d089ac
permissions -rw-r--r--
moved/updated basic HOL overview;
     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 same context
   763   modifiers as for \hyperlink{method.auto}{\mbox{\isa{auto}}} are accepted, see
   764   \secref{sec:clasimp}.
   765 
   766   In case of failure, extensive information is printed, which can help
   767   to analyse the situation (cf.\ \cite{isabelle-function}).
   768 
   769   \item \hyperlink{method.HOL.size-change}{\mbox{\isa{size{\isaliteral{5F}{\isacharunderscore}}change}}} also works on termination goals,
   770   using a variation of the size-change principle, together with a
   771   graph decomposition technique (see \cite{krauss_phd} for details).
   772   Three kinds of orders are used internally: \isa{max}, \isa{min},
   773   and \isa{ms} (multiset), which is only available when the theory
   774   \isa{Multiset} is loaded. When no order kinds are given, they are
   775   tried in order. The search for a termination proof uses SAT solving
   776   internally.
   777 
   778  For local descent proofs, the same context modifiers as for \hyperlink{method.auto}{\mbox{\isa{auto}}} are accepted, see \secref{sec:clasimp}.
   779 
   780   \end{description}%
   781 \end{isamarkuptext}%
   782 \isamarkuptrue%
   783 %
   784 \isamarkupsubsection{Functions with explicit partiality%
   785 }
   786 \isamarkuptrue%
   787 %
   788 \begin{isamarkuptext}%
   789 \begin{matharray}{rcl}
   790     \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}}} \\
   791     \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} \\
   792   \end{matharray}
   793 
   794   \begin{railoutput}
   795 \rail@begin{5}{}
   796 \rail@term{\hyperlink{command.HOL.partial-function}{\mbox{\isa{\isacommand{partial{\isaliteral{5F}{\isacharunderscore}}function}}}}}[]
   797 \rail@bar
   798 \rail@nextbar{1}
   799 \rail@nont{\hyperlink{syntax.target}{\mbox{\isa{target}}}}[]
   800 \rail@endbar
   801 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
   802 \rail@nont{\hyperlink{syntax.nameref}{\mbox{\isa{nameref}}}}[]
   803 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
   804 \rail@nont{\hyperlink{syntax.fixes}{\mbox{\isa{fixes}}}}[]
   805 \rail@cr{3}
   806 \rail@term{\isa{\isakeyword{where}}}[]
   807 \rail@bar
   808 \rail@nextbar{4}
   809 \rail@nont{\hyperlink{syntax.thmdecl}{\mbox{\isa{thmdecl}}}}[]
   810 \rail@endbar
   811 \rail@nont{\hyperlink{syntax.prop}{\mbox{\isa{prop}}}}[]
   812 \rail@end
   813 \end{railoutput}
   814 
   815 
   816   \begin{description}
   817 
   818   \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
   819   recursive functions based on fixpoints in complete partial
   820   orders. No termination proof is required from the user or
   821   constructed internally. Instead, the possibility of non-termination
   822   is modelled explicitly in the result type, which contains an
   823   explicit bottom element.
   824 
   825   Pattern matching and mutual recursion are currently not supported.
   826   Thus, the specification consists of a single function described by a
   827   single recursive equation.
   828 
   829   There are no fixed syntactic restrictions on the body of the
   830   function, but the induced functional must be provably monotonic
   831   wrt.\ the underlying order.  The monotonicitity proof is performed
   832   internally, and the definition is rejected when it fails. The proof
   833   can be influenced by declaring hints using the
   834   \hyperlink{attribute.HOL.partial-function-mono}{\mbox{\isa{partial{\isaliteral{5F}{\isacharunderscore}}function{\isaliteral{5F}{\isacharunderscore}}mono}}} attribute.
   835 
   836   The mandatory \isa{mode} argument specifies the mode of operation
   837   of the command, which directly corresponds to a complete partial
   838   order on the result type. By default, the following modes are
   839   defined:
   840 
   841   \begin{description}
   842   \item \isa{option} defines functions that map into the \isa{option} type. Here, the value \isa{None} is used to model a
   843   non-terminating computation. Monotonicity requires that if \isa{None} is returned by a recursive call, then the overall result
   844   must also be \isa{None}. This is best achieved through the use of
   845   the monadic operator \isa{{\isaliteral{22}{\isachardoublequote}}Option{\isaliteral{2E}{\isachardot}}bind{\isaliteral{22}{\isachardoublequote}}}.
   846 
   847   \item \isa{tailrec} defines functions with an arbitrary result
   848   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
   849   if \isa{undefined} is returned by a recursive call, then the
   850   overall result must also be \isa{undefined}. In practice, this is
   851   only satisfied when each recursive call is a tail call, whose result
   852   is directly returned. Thus, this mode of operation allows the
   853   definition of arbitrary tail-recursive functions.
   854   \end{description}
   855 
   856   Experienced users may define new modes by instantiating the locale
   857   \isa{{\isaliteral{22}{\isachardoublequote}}partial{\isaliteral{5F}{\isacharunderscore}}function{\isaliteral{5F}{\isacharunderscore}}definitions{\isaliteral{22}{\isachardoublequote}}} appropriately.
   858 
   859   \item \hyperlink{attribute.HOL.partial-function-mono}{\mbox{\isa{partial{\isaliteral{5F}{\isacharunderscore}}function{\isaliteral{5F}{\isacharunderscore}}mono}}} declares rules for
   860   use in the internal monononicity proofs of partial function
   861   definitions.
   862 
   863   \end{description}%
   864 \end{isamarkuptext}%
   865 \isamarkuptrue%
   866 %
   867 \isamarkupsubsection{Old-style recursive function definitions (TFL)%
   868 }
   869 \isamarkuptrue%
   870 %
   871 \begin{isamarkuptext}%
   872 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.
   873 
   874   \begin{matharray}{rcl}
   875     \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}}} \\
   876     \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}}} \\
   877   \end{matharray}
   878 
   879   \begin{railoutput}
   880 \rail@begin{5}{}
   881 \rail@term{\hyperlink{command.HOL.recdef}{\mbox{\isa{\isacommand{recdef}}}}}[]
   882 \rail@bar
   883 \rail@nextbar{1}
   884 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
   885 \rail@term{\isa{\isakeyword{permissive}}}[]
   886 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
   887 \rail@endbar
   888 \rail@cr{3}
   889 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
   890 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
   891 \rail@plus
   892 \rail@nont{\hyperlink{syntax.prop}{\mbox{\isa{prop}}}}[]
   893 \rail@nextplus{4}
   894 \rail@endplus
   895 \rail@bar
   896 \rail@nextbar{4}
   897 \rail@nont{\isa{hints}}[]
   898 \rail@endbar
   899 \rail@end
   900 \rail@begin{2}{}
   901 \rail@nont{\isa{recdeftc}}[]
   902 \rail@bar
   903 \rail@nextbar{1}
   904 \rail@nont{\hyperlink{syntax.thmdecl}{\mbox{\isa{thmdecl}}}}[]
   905 \rail@endbar
   906 \rail@nont{\isa{tc}}[]
   907 \rail@end
   908 \rail@begin{2}{\isa{hints}}
   909 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
   910 \rail@term{\isa{\isakeyword{hints}}}[]
   911 \rail@plus
   912 \rail@nextplus{1}
   913 \rail@cnont{\isa{recdefmod}}[]
   914 \rail@endplus
   915 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
   916 \rail@end
   917 \rail@begin{4}{\isa{recdefmod}}
   918 \rail@bar
   919 \rail@bar
   920 \rail@term{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}simp}}[]
   921 \rail@nextbar{1}
   922 \rail@term{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}cong}}[]
   923 \rail@nextbar{2}
   924 \rail@term{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}wf}}[]
   925 \rail@endbar
   926 \rail@bar
   927 \rail@nextbar{1}
   928 \rail@term{\isa{add}}[]
   929 \rail@nextbar{2}
   930 \rail@term{\isa{del}}[]
   931 \rail@endbar
   932 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}}}[]
   933 \rail@nont{\hyperlink{syntax.thmrefs}{\mbox{\isa{thmrefs}}}}[]
   934 \rail@nextbar{3}
   935 \rail@nont{\hyperlink{syntax.clasimpmod}{\mbox{\isa{clasimpmod}}}}[]
   936 \rail@endbar
   937 \rail@end
   938 \rail@begin{2}{\isa{tc}}
   939 \rail@nont{\hyperlink{syntax.nameref}{\mbox{\isa{nameref}}}}[]
   940 \rail@bar
   941 \rail@nextbar{1}
   942 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
   943 \rail@nont{\hyperlink{syntax.nat}{\mbox{\isa{nat}}}}[]
   944 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
   945 \rail@endbar
   946 \rail@end
   947 \end{railoutput}
   948 
   949 
   950   \begin{description}
   951 
   952   \item \hyperlink{command.HOL.recdef}{\mbox{\isa{\isacommand{recdef}}}} defines general well-founded
   953   recursive functions (using the TFL package), see also
   954   \cite{isabelle-HOL}.  The ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{28}{\isacharparenleft}}permissive{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequote}}}'' option tells
   955   TFL to recover from failed proof attempts, returning unfinished
   956   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
   957   automated proof process of TFL.  Additional \hyperlink{syntax.clasimpmod}{\mbox{\isa{clasimpmod}}}
   958   declarations (cf.\ \secref{sec:clasimp}) may be given to tune the
   959   context of the Simplifier (cf.\ \secref{sec:simplifier}) and
   960   Classical reasoner (cf.\ \secref{sec:classical}).
   961 
   962   \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
   963   proof for leftover termination condition number \isa{i} (default
   964   1) as generated by a \hyperlink{command.HOL.recdef}{\mbox{\isa{\isacommand{recdef}}}} definition of
   965   constant \isa{c}.
   966 
   967   Note that in most cases, \hyperlink{command.HOL.recdef}{\mbox{\isa{\isacommand{recdef}}}} is able to finish
   968   its internal proofs without manual intervention.
   969 
   970   \end{description}
   971 
   972   \medskip Hints for \hyperlink{command.HOL.recdef}{\mbox{\isa{\isacommand{recdef}}}} may be also declared
   973   globally, using the following attributes.
   974 
   975   \begin{matharray}{rcl}
   976     \indexdef{HOL}{attribute}{recdef\_simp}\hypertarget{attribute.HOL.recdef-simp}{\hyperlink{attribute.HOL.recdef-simp}{\mbox{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}simp}}}} & : & \isa{attribute} \\
   977     \indexdef{HOL}{attribute}{recdef\_cong}\hypertarget{attribute.HOL.recdef-cong}{\hyperlink{attribute.HOL.recdef-cong}{\mbox{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}cong}}}} & : & \isa{attribute} \\
   978     \indexdef{HOL}{attribute}{recdef\_wf}\hypertarget{attribute.HOL.recdef-wf}{\hyperlink{attribute.HOL.recdef-wf}{\mbox{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}wf}}}} & : & \isa{attribute} \\
   979   \end{matharray}
   980 
   981   \begin{railoutput}
   982 \rail@begin{3}{}
   983 \rail@bar
   984 \rail@term{\hyperlink{attribute.HOL.recdef-simp}{\mbox{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}simp}}}}[]
   985 \rail@nextbar{1}
   986 \rail@term{\hyperlink{attribute.HOL.recdef-cong}{\mbox{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}cong}}}}[]
   987 \rail@nextbar{2}
   988 \rail@term{\hyperlink{attribute.HOL.recdef-wf}{\mbox{\isa{recdef{\isaliteral{5F}{\isacharunderscore}}wf}}}}[]
   989 \rail@endbar
   990 \rail@bar
   991 \rail@nextbar{1}
   992 \rail@term{\isa{add}}[]
   993 \rail@nextbar{2}
   994 \rail@term{\isa{del}}[]
   995 \rail@endbar
   996 \rail@end
   997 \end{railoutput}%
   998 \end{isamarkuptext}%
   999 \isamarkuptrue%
  1000 %
  1001 \isamarkupsection{Datatypes \label{sec:hol-datatype}%
  1002 }
  1003 \isamarkuptrue%
  1004 %
  1005 \begin{isamarkuptext}%
  1006 \begin{matharray}{rcl}
  1007     \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}}} \\
  1008     \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}}} \\
  1009   \end{matharray}
  1010 
  1011   \begin{railoutput}
  1012 \rail@begin{2}{}
  1013 \rail@term{\hyperlink{command.HOL.datatype}{\mbox{\isa{\isacommand{datatype}}}}}[]
  1014 \rail@plus
  1015 \rail@nont{\isa{spec}}[]
  1016 \rail@nextplus{1}
  1017 \rail@cterm{\isa{\isakeyword{and}}}[]
  1018 \rail@endplus
  1019 \rail@end
  1020 \rail@begin{3}{}
  1021 \rail@term{\hyperlink{command.HOL.rep-datatype}{\mbox{\isa{\isacommand{rep{\isaliteral{5F}{\isacharunderscore}}datatype}}}}}[]
  1022 \rail@bar
  1023 \rail@nextbar{1}
  1024 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  1025 \rail@plus
  1026 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1027 \rail@nextplus{2}
  1028 \rail@endplus
  1029 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  1030 \rail@endbar
  1031 \rail@plus
  1032 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  1033 \rail@nextplus{1}
  1034 \rail@endplus
  1035 \rail@end
  1036 \rail@begin{2}{\isa{spec}}
  1037 \rail@bar
  1038 \rail@nextbar{1}
  1039 \rail@nont{\hyperlink{syntax.parname}{\mbox{\isa{parname}}}}[]
  1040 \rail@endbar
  1041 \rail@nont{\hyperlink{syntax.typespec}{\mbox{\isa{typespec}}}}[]
  1042 \rail@bar
  1043 \rail@nextbar{1}
  1044 \rail@nont{\hyperlink{syntax.mixfix}{\mbox{\isa{mixfix}}}}[]
  1045 \rail@endbar
  1046 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
  1047 \rail@plus
  1048 \rail@nont{\isa{cons}}[]
  1049 \rail@nextplus{1}
  1050 \rail@cterm{\isa{{\isaliteral{7C}{\isacharbar}}}}[]
  1051 \rail@endplus
  1052 \rail@end
  1053 \rail@begin{2}{\isa{cons}}
  1054 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1055 \rail@plus
  1056 \rail@nextplus{1}
  1057 \rail@cnont{\hyperlink{syntax.type}{\mbox{\isa{type}}}}[]
  1058 \rail@endplus
  1059 \rail@bar
  1060 \rail@nextbar{1}
  1061 \rail@nont{\hyperlink{syntax.mixfix}{\mbox{\isa{mixfix}}}}[]
  1062 \rail@endbar
  1063 \rail@end
  1064 \end{railoutput}
  1065 
  1066 
  1067   \begin{description}
  1068 
  1069   \item \hyperlink{command.HOL.datatype}{\mbox{\isa{\isacommand{datatype}}}} defines inductive datatypes in
  1070   HOL.
  1071 
  1072   \item \hyperlink{command.HOL.rep-datatype}{\mbox{\isa{\isacommand{rep{\isaliteral{5F}{\isacharunderscore}}datatype}}}} represents existing types as
  1073   datatypes.
  1074 
  1075   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
  1076   introduced by more primitive means using \indexref{}{command}{typedef}\hyperlink{command.typedef}{\mbox{\isa{\isacommand{typedef}}}}.  To
  1077   recover the rich infrastructure of \hyperlink{command.datatype}{\mbox{\isa{\isacommand{datatype}}}} (e.g.\ rules
  1078   for \hyperlink{method.cases}{\mbox{\isa{cases}}} and \hyperlink{method.induct}{\mbox{\isa{induct}}} and the primitive recursion
  1079   combinators), such types may be represented as actual datatypes
  1080   later.  This is done by specifying the constructors of the desired
  1081   type, and giving a proof of the induction rule, distinctness and
  1082   injectivity of constructors.
  1083 
  1084   For example, see \verb|~~/src/HOL/Sum_Type.thy| for the
  1085   representation of the primitive sum type as fully-featured datatype.
  1086 
  1087   \end{description}
  1088 
  1089   The generated rules for \hyperlink{method.induct}{\mbox{\isa{induct}}} and \hyperlink{method.cases}{\mbox{\isa{cases}}} provide
  1090   case names according to the given constructors, while parameters are
  1091   named after the types (see also \secref{sec:cases-induct}).
  1092 
  1093   See \cite{isabelle-HOL} for more details on datatypes, but beware of
  1094   the old-style theory syntax being used there!  Apart from proper
  1095   proof methods for case-analysis and induction, there are also
  1096   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
  1097   to refer directly to the internal structure of subgoals (including
  1098   internally bound parameters).%
  1099 \end{isamarkuptext}%
  1100 \isamarkuptrue%
  1101 %
  1102 \isamarkupsubsubsection{Examples%
  1103 }
  1104 \isamarkuptrue%
  1105 %
  1106 \begin{isamarkuptext}%
  1107 We define a type of finite sequences, with slightly different
  1108   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}}}:%
  1109 \end{isamarkuptext}%
  1110 \isamarkuptrue%
  1111 \isacommand{datatype}\isamarkupfalse%
  1112 \ {\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}}%
  1113 \begin{isamarkuptext}%
  1114 We can now prove some simple lemma by structural induction:%
  1115 \end{isamarkuptext}%
  1116 \isamarkuptrue%
  1117 \isacommand{lemma}\isamarkupfalse%
  1118 \ {\isaliteral{22}{\isachardoublequoteopen}}Seq\ x\ xs\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ xs{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  1119 %
  1120 \isadelimproof
  1121 %
  1122 \endisadelimproof
  1123 %
  1124 \isatagproof
  1125 \isacommand{proof}\isamarkupfalse%
  1126 \ {\isaliteral{28}{\isacharparenleft}}induct\ xs\ arbitrary{\isaliteral{3A}{\isacharcolon}}\ x{\isaliteral{29}{\isacharparenright}}\isanewline
  1127 \ \ \isacommand{case}\isamarkupfalse%
  1128 \ Empty%
  1129 \begin{isamarkuptxt}%
  1130 This case can be proved using the simplifier: the freeness
  1131     properties of the datatype are already declared as \hyperlink{attribute.simp}{\mbox{\isa{simp}}} rules.%
  1132 \end{isamarkuptxt}%
  1133 \isamarkuptrue%
  1134 \ \ \isacommand{show}\isamarkupfalse%
  1135 \ {\isaliteral{22}{\isachardoublequoteopen}}Seq\ x\ Empty\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ Empty{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  1136 \ \ \ \ \isacommand{by}\isamarkupfalse%
  1137 \ simp\isanewline
  1138 \isacommand{next}\isamarkupfalse%
  1139 \isanewline
  1140 \ \ \isacommand{case}\isamarkupfalse%
  1141 \ {\isaliteral{28}{\isacharparenleft}}Seq\ y\ ys{\isaliteral{29}{\isacharparenright}}%
  1142 \begin{isamarkuptxt}%
  1143 The step case is proved similarly.%
  1144 \end{isamarkuptxt}%
  1145 \isamarkuptrue%
  1146 \ \ \isacommand{show}\isamarkupfalse%
  1147 \ {\isaliteral{22}{\isachardoublequoteopen}}Seq\ x\ {\isaliteral{28}{\isacharparenleft}}Seq\ y\ ys{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ Seq\ y\ ys{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  1148 \ \ \ \ \isacommand{using}\isamarkupfalse%
  1149 \ {\isaliteral{60}{\isacharbackquoteopen}}Seq\ y\ ys\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ ys{\isaliteral{60}{\isacharbackquoteclose}}\ \isacommand{by}\isamarkupfalse%
  1150 \ simp\isanewline
  1151 \isacommand{qed}\isamarkupfalse%
  1152 %
  1153 \endisatagproof
  1154 {\isafoldproof}%
  1155 %
  1156 \isadelimproof
  1157 %
  1158 \endisadelimproof
  1159 %
  1160 \begin{isamarkuptext}%
  1161 Here is a more succinct version of the same proof:%
  1162 \end{isamarkuptext}%
  1163 \isamarkuptrue%
  1164 \isacommand{lemma}\isamarkupfalse%
  1165 \ {\isaliteral{22}{\isachardoublequoteopen}}Seq\ x\ xs\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ xs{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  1166 %
  1167 \isadelimproof
  1168 \ \ %
  1169 \endisadelimproof
  1170 %
  1171 \isatagproof
  1172 \isacommand{by}\isamarkupfalse%
  1173 \ {\isaliteral{28}{\isacharparenleft}}induct\ xs\ arbitrary{\isaliteral{3A}{\isacharcolon}}\ x{\isaliteral{29}{\isacharparenright}}\ simp{\isaliteral{5F}{\isacharunderscore}}all%
  1174 \endisatagproof
  1175 {\isafoldproof}%
  1176 %
  1177 \isadelimproof
  1178 %
  1179 \endisadelimproof
  1180 %
  1181 \isamarkupsection{Records \label{sec:hol-record}%
  1182 }
  1183 \isamarkuptrue%
  1184 %
  1185 \begin{isamarkuptext}%
  1186 In principle, records merely generalize the concept of tuples, where
  1187   components may be addressed by labels instead of just position.  The
  1188   logical infrastructure of records in Isabelle/HOL is slightly more
  1189   advanced, though, supporting truly extensible record schemes.  This
  1190   admits operations that are polymorphic with respect to record
  1191   extension, yielding ``object-oriented'' effects like (single)
  1192   inheritance.  See also \cite{NaraschewskiW-TPHOLs98} for more
  1193   details on object-oriented verification and record subtyping in HOL.%
  1194 \end{isamarkuptext}%
  1195 \isamarkuptrue%
  1196 %
  1197 \isamarkupsubsection{Basic concepts%
  1198 }
  1199 \isamarkuptrue%
  1200 %
  1201 \begin{isamarkuptext}%
  1202 Isabelle/HOL supports both \emph{fixed} and \emph{schematic} records
  1203   at the level of terms and types.  The notation is as follows:
  1204 
  1205   \begin{center}
  1206   \begin{tabular}{l|l|l}
  1207     & record terms & record types \\ \hline
  1208     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}}} \\
  1209     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}}} &
  1210       \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}}} \\
  1211   \end{tabular}
  1212   \end{center}
  1213 
  1214   \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}}}.
  1215 
  1216   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
  1217   \isa{a} and field \isa{y} of value \isa{b}.  The corresponding
  1218   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}}}
  1219   and \isa{{\isaliteral{22}{\isachardoublequote}}b\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ B{\isaliteral{22}{\isachardoublequote}}}.
  1220 
  1221   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
  1222   \isa{x} and \isa{y} as before, but also possibly further fields
  1223   as indicated by the ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{22}{\isachardoublequote}}}'' notation (which is actually part
  1224   of the syntax).  The improper field ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C646F74733E}{\isasymdots}}{\isaliteral{22}{\isachardoublequote}}}'' of a record
  1225   scheme is called the \emph{more part}.  Logically it is just a free
  1226   variable, which is occasionally referred to as ``row variable'' in
  1227   the literature.  The more part of a record scheme may be
  1228   instantiated by zero or more further components.  For example, the
  1229   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.
  1230   Fixed records are special instances of record schemes, where
  1231   ``\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}}}
  1232   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
  1233   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}}}.
  1234 
  1235   \medskip Two key observations make extensible records in a simply
  1236   typed language like HOL work out:
  1237 
  1238   \begin{enumerate}
  1239 
  1240   \item the more part is internalized, as a free term or type
  1241   variable,
  1242 
  1243   \item field names are externalized, they cannot be accessed within
  1244   the logic as first-class values.
  1245 
  1246   \end{enumerate}
  1247 
  1248   \medskip In Isabelle/HOL record types have to be defined explicitly,
  1249   fixing their field names and types, and their (optional) parent
  1250   record.  Afterwards, records may be formed using above syntax, while
  1251   obeying the canonical order of fields as given by their declaration.
  1252   The record package provides several standard operations like
  1253   selectors and updates.  The common setup for various generic proof
  1254   tools enable succinct reasoning patterns.  See also the Isabelle/HOL
  1255   tutorial \cite{isabelle-hol-book} for further instructions on using
  1256   records in practice.%
  1257 \end{isamarkuptext}%
  1258 \isamarkuptrue%
  1259 %
  1260 \isamarkupsubsection{Record specifications%
  1261 }
  1262 \isamarkuptrue%
  1263 %
  1264 \begin{isamarkuptext}%
  1265 \begin{matharray}{rcl}
  1266     \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}}} \\
  1267   \end{matharray}
  1268 
  1269   \begin{railoutput}
  1270 \rail@begin{4}{}
  1271 \rail@term{\hyperlink{command.HOL.record}{\mbox{\isa{\isacommand{record}}}}}[]
  1272 \rail@nont{\hyperlink{syntax.typespec-sorts}{\mbox{\isa{typespec{\isaliteral{5F}{\isacharunderscore}}sorts}}}}[]
  1273 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
  1274 \rail@cr{2}
  1275 \rail@bar
  1276 \rail@nextbar{3}
  1277 \rail@nont{\hyperlink{syntax.type}{\mbox{\isa{type}}}}[]
  1278 \rail@term{\isa{{\isaliteral{2B}{\isacharplus}}}}[]
  1279 \rail@endbar
  1280 \rail@plus
  1281 \rail@nont{\hyperlink{syntax.constdecl}{\mbox{\isa{constdecl}}}}[]
  1282 \rail@nextplus{3}
  1283 \rail@endplus
  1284 \rail@end
  1285 \end{railoutput}
  1286 
  1287 
  1288   \begin{description}
  1289 
  1290   \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}}},
  1291   derived from the optional parent record \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C7461753E}{\isasymtau}}{\isaliteral{22}{\isachardoublequote}}} by adding new
  1292   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.
  1293 
  1294   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
  1295   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
  1296   least one new field \isa{{\isaliteral{22}{\isachardoublequote}}c\isaliteral{5C3C5E7375623E}{}\isactrlsub i{\isaliteral{22}{\isachardoublequote}}} has to be specified.
  1297   Basically, field names need to belong to a unique record.  This is
  1298   not a real restriction in practice, since fields are qualified by
  1299   the record name internally.
  1300 
  1301   The parent record specification \isa{{\isaliteral{5C3C7461753E}{\isasymtau}}} is optional; if omitted
  1302   \isa{t} becomes a root record.  The hierarchy of all records
  1303   declared within a theory context forms a forest structure, i.e.\ a
  1304   set of trees starting with a root record each.  There is no way to
  1305   merge multiple parent records!
  1306 
  1307   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
  1308   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
  1309   \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}}}.
  1310 
  1311   \end{description}%
  1312 \end{isamarkuptext}%
  1313 \isamarkuptrue%
  1314 %
  1315 \isamarkupsubsection{Record operations%
  1316 }
  1317 \isamarkuptrue%
  1318 %
  1319 \begin{isamarkuptext}%
  1320 Any record definition of the form presented above produces certain
  1321   standard operations.  Selectors and updates are provided for any
  1322   field, including the improper one ``\isa{more}''.  There are also
  1323   cumulative record constructor functions.  To simplify the
  1324   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}}}.
  1325 
  1326   \medskip \textbf{Selectors} and \textbf{updates} are available for
  1327   any field (including ``\isa{more}''):
  1328 
  1329   \begin{matharray}{lll}
  1330     \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}}} \\
  1331     \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}}} \\
  1332   \end{matharray}
  1333 
  1334   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
  1335   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
  1336   because of postfix notation the order of fields shown here is
  1337   reverse than in the actual term.  Since repeated updates are just
  1338   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.
  1339   Thus commutativity of independent updates can be proven within the
  1340   logic for any two fields, but not as a general theorem.
  1341 
  1342   \medskip The \textbf{make} operation provides a cumulative record
  1343   constructor function:
  1344 
  1345   \begin{matharray}{lll}
  1346     \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}}} \\
  1347   \end{matharray}
  1348 
  1349   \medskip We now reconsider the case of non-root records, which are
  1350   derived of some parent.  In general, the latter may depend on
  1351   another parent as well, resulting in a list of \emph{ancestor
  1352   records}.  Appending the lists of fields of all ancestors results in
  1353   a certain field prefix.  The record package automatically takes care
  1354   of this by lifting operations over this context of ancestor fields.
  1355   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
  1356   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}}},
  1357   the above record operations will get the following types:
  1358 
  1359   \medskip
  1360   \begin{tabular}{lll}
  1361     \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}}} \\
  1362     \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}}} \\
  1363     \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}}} \\
  1364   \end{tabular}
  1365   \medskip
  1366 
  1367   \noindent Some further operations address the extension aspect of a
  1368   derived record scheme specifically: \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}fields{\isaliteral{22}{\isachardoublequote}}} produces a
  1369   record fragment consisting of exactly the new fields introduced here
  1370   (the result may serve as a more part elsewhere); \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}extend{\isaliteral{22}{\isachardoublequote}}}
  1371   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.
  1372 
  1373   \medskip
  1374   \begin{tabular}{lll}
  1375     \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}}} \\
  1376     \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}}} \\
  1377     \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}}} \\
  1378   \end{tabular}
  1379   \medskip
  1380 
  1381   \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
  1382   for root records.%
  1383 \end{isamarkuptext}%
  1384 \isamarkuptrue%
  1385 %
  1386 \isamarkupsubsection{Derived rules and proof tools%
  1387 }
  1388 \isamarkuptrue%
  1389 %
  1390 \begin{isamarkuptext}%
  1391 The record package proves several results internally, declaring
  1392   these facts to appropriate proof tools.  This enables users to
  1393   reason about record structures quite conveniently.  Assume that
  1394   \isa{t} is a record type as specified above.
  1395 
  1396   \begin{enumerate}
  1397 
  1398   \item Standard conversions for selectors or updates applied to
  1399   record constructor terms are made part of the default Simplifier
  1400   context; thus proofs by reduction of basic operations merely require
  1401   the \hyperlink{method.simp}{\mbox{\isa{simp}}} method without further arguments.  These rules
  1402   are available as \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}simps{\isaliteral{22}{\isachardoublequote}}}, too.
  1403 
  1404   \item Selectors applied to updated records are automatically reduced
  1405   by an internal simplification procedure, which is also part of the
  1406   standard Simplifier setup.
  1407 
  1408   \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
  1409   Reasoner as \hyperlink{attribute.iff}{\mbox{\isa{iff}}} rules.  These rules are available as
  1410   \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}iffs{\isaliteral{22}{\isachardoublequote}}}.
  1411 
  1412   \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,
  1413   and as the basic rule context as ``\hyperlink{attribute.intro}{\mbox{\isa{intro}}}\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{3F}{\isacharquery}}{\isaliteral{22}{\isachardoublequote}}}''.
  1414   The rule is called \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}equality{\isaliteral{22}{\isachardoublequote}}}.
  1415 
  1416   \item Representations of arbitrary record expressions as canonical
  1417   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,
  1418   \secref{sec:cases-induct}).  Several variations are available, for
  1419   fixed records, record schemes, more parts etc.
  1420 
  1421   The generic proof methods are sufficiently smart to pick the most
  1422   sensible rule according to the type of the indicated record
  1423   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.
  1424 
  1425   \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}
  1426   treated automatically, but usually need to be expanded by hand,
  1427   using the collective fact \isa{{\isaliteral{22}{\isachardoublequote}}t{\isaliteral{2E}{\isachardot}}defs{\isaliteral{22}{\isachardoublequote}}}.
  1428 
  1429   \end{enumerate}%
  1430 \end{isamarkuptext}%
  1431 \isamarkuptrue%
  1432 %
  1433 \isamarkupsubsubsection{Examples%
  1434 }
  1435 \isamarkuptrue%
  1436 %
  1437 \begin{isamarkuptext}%
  1438 See \verb|~~/src/HOL/ex/Records.thy|, for example.%
  1439 \end{isamarkuptext}%
  1440 \isamarkuptrue%
  1441 %
  1442 \isamarkupsection{Adhoc tuples%
  1443 }
  1444 \isamarkuptrue%
  1445 %
  1446 \begin{isamarkuptext}%
  1447 \begin{matharray}{rcl}
  1448     \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} \\
  1449   \end{matharray}
  1450 
  1451   \begin{railoutput}
  1452 \rail@begin{2}{}
  1453 \rail@term{\hyperlink{attribute.HOL.split-format}{\mbox{\isa{split{\isaliteral{5F}{\isacharunderscore}}format}}}}[]
  1454 \rail@bar
  1455 \rail@nextbar{1}
  1456 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  1457 \rail@term{\isa{complete}}[]
  1458 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  1459 \rail@endbar
  1460 \rail@end
  1461 \end{railoutput}
  1462 
  1463 
  1464   \begin{description}
  1465 
  1466   \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
  1467   arguments in function applications to be represented canonically
  1468   according to their tuple type structure.
  1469 
  1470   Note that this operation tends to invent funny names for new local
  1471   parameters introduced.
  1472 
  1473   \end{description}%
  1474 \end{isamarkuptext}%
  1475 \isamarkuptrue%
  1476 %
  1477 \isamarkupsection{Typedef axiomatization \label{sec:hol-typedef}%
  1478 }
  1479 \isamarkuptrue%
  1480 %
  1481 \begin{isamarkuptext}%
  1482 A Gordon/HOL-style type definition is a certain axiom scheme
  1483   that identifies a new type with a subset of an existing type.  More
  1484   precisely, the new type is defined by exhibiting an existing type
  1485   \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
  1486   \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
  1487   postulated that establish an isomorphism between the new type and
  1488   the subset.  In general, the type \isa{{\isaliteral{5C3C7461753E}{\isasymtau}}} may involve type
  1489   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
  1490   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
  1491   those type arguments.
  1492 
  1493   The axiomatization can be considered a ``definition'' in the sense
  1494   of the particular set-theoretic interpretation of HOL
  1495   \cite{pitts93}, where the universe of types is required to be
  1496   downwards-closed wrt.\ arbitrary non-empty subsets.  Thus genuinely
  1497   new types introduced by \hyperlink{command.typedef}{\mbox{\isa{\isacommand{typedef}}}} stay within the range
  1498   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
  1499   abbreviations, without any logical significance.
  1500   
  1501   \begin{matharray}{rcl}
  1502     \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}}} \\
  1503   \end{matharray}
  1504 
  1505   \begin{railoutput}
  1506 \rail@begin{2}{}
  1507 \rail@term{\hyperlink{command.HOL.typedef}{\mbox{\isa{\isacommand{typedef}}}}}[]
  1508 \rail@bar
  1509 \rail@nextbar{1}
  1510 \rail@nont{\isa{alt{\isaliteral{5F}{\isacharunderscore}}name}}[]
  1511 \rail@endbar
  1512 \rail@nont{\isa{abs{\isaliteral{5F}{\isacharunderscore}}type}}[]
  1513 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
  1514 \rail@nont{\isa{rep{\isaliteral{5F}{\isacharunderscore}}set}}[]
  1515 \rail@end
  1516 \rail@begin{3}{\isa{alt{\isaliteral{5F}{\isacharunderscore}}name}}
  1517 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  1518 \rail@bar
  1519 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1520 \rail@nextbar{1}
  1521 \rail@term{\isa{\isakeyword{open}}}[]
  1522 \rail@nextbar{2}
  1523 \rail@term{\isa{\isakeyword{open}}}[]
  1524 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1525 \rail@endbar
  1526 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  1527 \rail@end
  1528 \rail@begin{2}{\isa{abs{\isaliteral{5F}{\isacharunderscore}}type}}
  1529 \rail@nont{\hyperlink{syntax.typespec-sorts}{\mbox{\isa{typespec{\isaliteral{5F}{\isacharunderscore}}sorts}}}}[]
  1530 \rail@bar
  1531 \rail@nextbar{1}
  1532 \rail@nont{\hyperlink{syntax.mixfix}{\mbox{\isa{mixfix}}}}[]
  1533 \rail@endbar
  1534 \rail@end
  1535 \rail@begin{2}{\isa{rep{\isaliteral{5F}{\isacharunderscore}}set}}
  1536 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  1537 \rail@bar
  1538 \rail@nextbar{1}
  1539 \rail@term{\isa{\isakeyword{morphisms}}}[]
  1540 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1541 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1542 \rail@endbar
  1543 \rail@end
  1544 \end{railoutput}
  1545 
  1546 
  1547   \begin{description}
  1548 
  1549   \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}}}
  1550   axiomatizes a type definition in the background theory of the
  1551   current context, depending on a non-emptiness result of the set
  1552   \isa{A} that needs to be proven here.  The set \isa{A} may
  1553   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,
  1554   but no term variables.
  1555 
  1556   Even though a local theory specification, the newly introduced type
  1557   constructor cannot depend on parameters or assumptions of the
  1558   context: this is structurally impossible in HOL.  In contrast, the
  1559   non-emptiness proof may use local assumptions in unusual situations,
  1560   which could result in different interpretations in target contexts:
  1561   the meaning of the bijection between the representing set \isa{A}
  1562   and the new type \isa{t} may then change in different application
  1563   contexts.
  1564 
  1565   By default, \hyperlink{command.HOL.typedef}{\mbox{\isa{\isacommand{typedef}}}} defines both a type
  1566   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
  1567   altogether.  The injection from type to set is called \isa{Rep{\isaliteral{5F}{\isacharunderscore}}t},
  1568   its inverse \isa{Abs{\isaliteral{5F}{\isacharunderscore}}t}, unless explicit \hyperlink{keyword.HOL.morphisms}{\mbox{\isa{\isakeyword{morphisms}}}} specification provides alternative names.
  1569 
  1570   The core axiomatization uses the locale predicate \isa{type{\isaliteral{5F}{\isacharunderscore}}definition} as defined in Isabelle/HOL.  Various basic
  1571   consequences of that are instantiated accordingly, re-using the
  1572   locale facts with names derived from the new type constructor.  Thus
  1573   the generic \isa{type{\isaliteral{5F}{\isacharunderscore}}definition{\isaliteral{2E}{\isachardot}}Rep} is turned into the specific
  1574   \isa{{\isaliteral{22}{\isachardoublequote}}Rep{\isaliteral{5F}{\isacharunderscore}}t{\isaliteral{22}{\isachardoublequote}}}, for example.
  1575 
  1576   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}
  1577   provide the most basic characterization as a corresponding
  1578   injection/surjection pair (in both directions).  The derived rules
  1579   \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
  1580   injectivity, suitable for automated proof tools (e.g.\ in
  1581   declarations involving \hyperlink{attribute.simp}{\mbox{\isa{simp}}} or \hyperlink{attribute.iff}{\mbox{\isa{iff}}}).
  1582   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}~/
  1583   \isa{type{\isaliteral{5F}{\isacharunderscore}}definition{\isaliteral{2E}{\isachardot}}Abs{\isaliteral{5F}{\isacharunderscore}}induct} provide alternative views on
  1584   surjectivity.  These rules are already declared as set or type rules
  1585   for the generic \hyperlink{method.cases}{\mbox{\isa{cases}}} and \hyperlink{method.induct}{\mbox{\isa{induct}}} methods,
  1586   respectively.
  1587 
  1588   An alternative name for the set definition (and other derived
  1589   entities) may be specified in parentheses; the default is to use
  1590   \isa{t} directly.
  1591 
  1592   \end{description}
  1593 
  1594   \begin{warn}
  1595   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
  1596   is that it has a non-empty model, to avoid immediate collapse of the
  1597   HOL logic.  Moreover, one needs to demonstrate that the
  1598   interpretation of such free-form axiomatizations can coexist with
  1599   that of the regular \indexdef{}{command}{typedef}\hypertarget{command.typedef}{\hyperlink{command.typedef}{\mbox{\isa{\isacommand{typedef}}}}} scheme, and any extension
  1600   that other people might have introduced elsewhere (e.g.\ in HOLCF
  1601   \cite{MuellerNvOS99}).
  1602   \end{warn}%
  1603 \end{isamarkuptext}%
  1604 \isamarkuptrue%
  1605 %
  1606 \isamarkupsubsubsection{Examples%
  1607 }
  1608 \isamarkuptrue%
  1609 %
  1610 \begin{isamarkuptext}%
  1611 Type definitions permit the introduction of abstract data
  1612   types in a safe way, namely by providing models based on already
  1613   existing types.  Given some abstract axiomatic description \isa{P}
  1614   of a type, this involves two steps:
  1615 
  1616   \begin{enumerate}
  1617 
  1618   \item Find an appropriate type \isa{{\isaliteral{5C3C7461753E}{\isasymtau}}} and subset \isa{A} which
  1619   has the desired properties \isa{P}, and make a type definition
  1620   based on this representation.
  1621 
  1622   \item Prove that \isa{P} holds for \isa{{\isaliteral{5C3C7461753E}{\isasymtau}}} by lifting \isa{P}
  1623   from the representation.
  1624 
  1625   \end{enumerate}
  1626 
  1627   You can later forget about the representation and work solely in
  1628   terms of the abstract properties \isa{P}.
  1629 
  1630   \medskip The following trivial example pulls a three-element type
  1631   into existence within the formal logical environment of HOL.%
  1632 \end{isamarkuptext}%
  1633 \isamarkuptrue%
  1634 \isacommand{typedef}\isamarkupfalse%
  1635 \ 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
  1636 %
  1637 \isadelimproof
  1638 \ \ %
  1639 \endisadelimproof
  1640 %
  1641 \isatagproof
  1642 \isacommand{by}\isamarkupfalse%
  1643 \ blast%
  1644 \endisatagproof
  1645 {\isafoldproof}%
  1646 %
  1647 \isadelimproof
  1648 \isanewline
  1649 %
  1650 \endisadelimproof
  1651 \isanewline
  1652 \isacommand{definition}\isamarkupfalse%
  1653 \ {\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
  1654 \isacommand{definition}\isamarkupfalse%
  1655 \ {\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
  1656 \isacommand{definition}\isamarkupfalse%
  1657 \ {\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
  1658 \isanewline
  1659 \isacommand{lemma}\isamarkupfalse%
  1660 \ 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
  1661 %
  1662 \isadelimproof
  1663 \ \ %
  1664 \endisadelimproof
  1665 %
  1666 \isatagproof
  1667 \isacommand{by}\isamarkupfalse%
  1668 \ {\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}}%
  1669 \endisatagproof
  1670 {\isafoldproof}%
  1671 %
  1672 \isadelimproof
  1673 \isanewline
  1674 %
  1675 \endisadelimproof
  1676 \isanewline
  1677 \isacommand{lemma}\isamarkupfalse%
  1678 \ three{\isaliteral{5F}{\isacharunderscore}}cases{\isaliteral{3A}{\isacharcolon}}\isanewline
  1679 \ \ \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
  1680 %
  1681 \isadelimproof
  1682 \ \ %
  1683 \endisadelimproof
  1684 %
  1685 \isatagproof
  1686 \isacommand{by}\isamarkupfalse%
  1687 \ {\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}}%
  1688 \endisatagproof
  1689 {\isafoldproof}%
  1690 %
  1691 \isadelimproof
  1692 %
  1693 \endisadelimproof
  1694 %
  1695 \begin{isamarkuptext}%
  1696 Note that such trivial constructions are better done with
  1697   derived specification mechanisms such as \hyperlink{command.datatype}{\mbox{\isa{\isacommand{datatype}}}}:%
  1698 \end{isamarkuptext}%
  1699 \isamarkuptrue%
  1700 \isacommand{datatype}\isamarkupfalse%
  1701 \ 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}}%
  1702 \begin{isamarkuptext}%
  1703 This avoids re-doing basic definitions and proofs from the
  1704   primitive \hyperlink{command.typedef}{\mbox{\isa{\isacommand{typedef}}}} above.%
  1705 \end{isamarkuptext}%
  1706 \isamarkuptrue%
  1707 %
  1708 \isamarkupsection{Functorial structure of types%
  1709 }
  1710 \isamarkuptrue%
  1711 %
  1712 \begin{isamarkuptext}%
  1713 \begin{matharray}{rcl}
  1714     \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}}}
  1715   \end{matharray}
  1716 
  1717   \begin{railoutput}
  1718 \rail@begin{2}{}
  1719 \rail@term{\hyperlink{command.HOL.enriched-type}{\mbox{\isa{\isacommand{enriched{\isaliteral{5F}{\isacharunderscore}}type}}}}}[]
  1720 \rail@bar
  1721 \rail@nextbar{1}
  1722 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1723 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}}}[]
  1724 \rail@endbar
  1725 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  1726 \rail@end
  1727 \end{railoutput}
  1728 
  1729 
  1730   \begin{description}
  1731 
  1732   \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
  1733   prove and register properties about the functorial structure of type
  1734   constructors.  These properties then can be used by other packages
  1735   to deal with those type constructors in certain type constructions.
  1736   Characteristic theorems are noted in the current local theory.  By
  1737   default, they are prefixed with the base name of the type
  1738   constructor, an explicit prefix can be given alternatively.
  1739 
  1740   The given term \isa{{\isaliteral{22}{\isachardoublequote}}m{\isaliteral{22}{\isachardoublequote}}} is considered as \emph{mapper} for the
  1741   corresponding type constructor and must conform to the following
  1742   type pattern:
  1743 
  1744   \begin{matharray}{lll}
  1745     \isa{{\isaliteral{22}{\isachardoublequote}}m{\isaliteral{22}{\isachardoublequote}}} & \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{22}{\isachardoublequote}}} &
  1746       \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}}} \\
  1747   \end{matharray}
  1748 
  1749   \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
  1750   type variables free in the local theory and \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{5C3C7369676D613E}{\isasymsigma}}\isaliteral{5C3C5E697375623E}{}\isactrlisub {\isadigit{1}}{\isaliteral{22}{\isachardoublequote}}},
  1751   \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,
  1752   \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}}}.
  1753 
  1754   \end{description}%
  1755 \end{isamarkuptext}%
  1756 \isamarkuptrue%
  1757 %
  1758 \isamarkupsection{Arithmetic proof support%
  1759 }
  1760 \isamarkuptrue%
  1761 %
  1762 \begin{isamarkuptext}%
  1763 \begin{matharray}{rcl}
  1764     \indexdef{HOL}{method}{arith}\hypertarget{method.HOL.arith}{\hyperlink{method.HOL.arith}{\mbox{\isa{arith}}}} & : & \isa{method} \\
  1765     \indexdef{HOL}{attribute}{arith}\hypertarget{attribute.HOL.arith}{\hyperlink{attribute.HOL.arith}{\mbox{\isa{arith}}}} & : & \isa{attribute} \\
  1766     \indexdef{HOL}{attribute}{arith\_split}\hypertarget{attribute.HOL.arith-split}{\hyperlink{attribute.HOL.arith-split}{\mbox{\isa{arith{\isaliteral{5F}{\isacharunderscore}}split}}}} & : & \isa{attribute} \\
  1767   \end{matharray}
  1768 
  1769   The \hyperlink{method.HOL.arith}{\mbox{\isa{arith}}} method decides linear arithmetic problems
  1770   (on types \isa{nat}, \isa{int}, \isa{real}).  Any current
  1771   facts are inserted into the goal before running the procedure.
  1772 
  1773   The \hyperlink{attribute.HOL.arith}{\mbox{\isa{arith}}} attribute declares facts that are
  1774   always supplied to the arithmetic provers implicitly.
  1775 
  1776   The \hyperlink{attribute.HOL.arith-split}{\mbox{\isa{arith{\isaliteral{5F}{\isacharunderscore}}split}}} attribute declares case split
  1777   rules to be expanded before \hyperlink{method.HOL.arith}{\mbox{\isa{arith}}} is invoked.
  1778 
  1779   Note that a simpler (but faster) arithmetic prover is
  1780   already invoked by the Simplifier.%
  1781 \end{isamarkuptext}%
  1782 \isamarkuptrue%
  1783 %
  1784 \isamarkupsection{Intuitionistic proof search%
  1785 }
  1786 \isamarkuptrue%
  1787 %
  1788 \begin{isamarkuptext}%
  1789 \begin{matharray}{rcl}
  1790     \indexdef{HOL}{method}{iprover}\hypertarget{method.HOL.iprover}{\hyperlink{method.HOL.iprover}{\mbox{\isa{iprover}}}} & : & \isa{method} \\
  1791   \end{matharray}
  1792 
  1793   \begin{railoutput}
  1794 \rail@begin{2}{}
  1795 \rail@term{\hyperlink{method.HOL.iprover}{\mbox{\isa{iprover}}}}[]
  1796 \rail@plus
  1797 \rail@nextplus{1}
  1798 \rail@cnont{\hyperlink{syntax.rulemod}{\mbox{\isa{rulemod}}}}[]
  1799 \rail@endplus
  1800 \rail@end
  1801 \end{railoutput}
  1802 
  1803 
  1804   The \hyperlink{method.HOL.iprover}{\mbox{\isa{iprover}}} method performs intuitionistic proof
  1805   search, depending on specifically declared rules from the context,
  1806   or given as explicit arguments.  Chained facts are inserted into the
  1807   goal before commencing proof search.
  1808 
  1809   Rules need to be classified as \hyperlink{attribute.Pure.intro}{\mbox{\isa{intro}}},
  1810   \hyperlink{attribute.Pure.elim}{\mbox{\isa{elim}}}, or \hyperlink{attribute.Pure.dest}{\mbox{\isa{dest}}}; here the
  1811   ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{21}{\isacharbang}}{\isaliteral{22}{\isachardoublequote}}}'' indicator refers to ``safe'' rules, which may be
  1812   applied aggressively (without considering back-tracking later).
  1813   Rules declared with ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{3F}{\isacharquery}}{\isaliteral{22}{\isachardoublequote}}}'' are ignored in proof search (the
  1814   single-step \hyperlink{method.Pure.rule}{\mbox{\isa{rule}}} method still observes these).  An
  1815   explicit weight annotation may be given as well; otherwise the
  1816   number of rule premises will be taken into account here.%
  1817 \end{isamarkuptext}%
  1818 \isamarkuptrue%
  1819 %
  1820 \isamarkupsection{Coherent Logic%
  1821 }
  1822 \isamarkuptrue%
  1823 %
  1824 \begin{isamarkuptext}%
  1825 \begin{matharray}{rcl}
  1826     \indexdef{HOL}{method}{coherent}\hypertarget{method.HOL.coherent}{\hyperlink{method.HOL.coherent}{\mbox{\isa{coherent}}}} & : & \isa{method} \\
  1827   \end{matharray}
  1828 
  1829   \begin{railoutput}
  1830 \rail@begin{2}{}
  1831 \rail@term{\hyperlink{method.HOL.coherent}{\mbox{\isa{coherent}}}}[]
  1832 \rail@bar
  1833 \rail@nextbar{1}
  1834 \rail@nont{\hyperlink{syntax.thmrefs}{\mbox{\isa{thmrefs}}}}[]
  1835 \rail@endbar
  1836 \rail@end
  1837 \end{railoutput}
  1838 
  1839 
  1840   The \hyperlink{method.HOL.coherent}{\mbox{\isa{coherent}}} method solves problems of
  1841   \emph{Coherent Logic} \cite{Bezem-Coquand:2005}, which covers
  1842   applications in confluence theory, lattice theory and projective
  1843   geometry.  See \verb|~~/src/HOL/ex/Coherent.thy| for some
  1844   examples.%
  1845 \end{isamarkuptext}%
  1846 \isamarkuptrue%
  1847 %
  1848 \isamarkupsection{Proving propositions%
  1849 }
  1850 \isamarkuptrue%
  1851 %
  1852 \begin{isamarkuptext}%
  1853 In addition to the standard proof methods, a number of diagnosis
  1854   tools search for proofs and provide an Isar proof snippet on success.
  1855   These tools are available via the following commands.
  1856 
  1857   \begin{matharray}{rcl}
  1858     \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}}} \\
  1859     \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}}} \\
  1860     \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}}} \\
  1861     \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}}}
  1862   \end{matharray}
  1863 
  1864   \begin{railoutput}
  1865 \rail@begin{6}{}
  1866 \rail@term{\hyperlink{command.HOL.try}{\mbox{\isa{\isacommand{try}}}}}[]
  1867 \rail@bar
  1868 \rail@nextbar{1}
  1869 \rail@plus
  1870 \rail@bar
  1871 \rail@term{\isa{simp}}[]
  1872 \rail@nextbar{2}
  1873 \rail@term{\isa{intro}}[]
  1874 \rail@nextbar{3}
  1875 \rail@term{\isa{elim}}[]
  1876 \rail@nextbar{4}
  1877 \rail@term{\isa{dest}}[]
  1878 \rail@endbar
  1879 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}}}[]
  1880 \rail@nont{\hyperlink{syntax.thmrefs}{\mbox{\isa{thmrefs}}}}[]
  1881 \rail@nextplus{5}
  1882 \rail@endplus
  1883 \rail@endbar
  1884 \rail@bar
  1885 \rail@nextbar{1}
  1886 \rail@nont{\hyperlink{syntax.nat}{\mbox{\isa{nat}}}}[]
  1887 \rail@endbar
  1888 \rail@end
  1889 \rail@begin{2}{}
  1890 \rail@term{\hyperlink{command.HOL.sledgehammer}{\mbox{\isa{\isacommand{sledgehammer}}}}}[]
  1891 \rail@bar
  1892 \rail@nextbar{1}
  1893 \rail@term{\isa{{\isaliteral{5B}{\isacharbrackleft}}}}[]
  1894 \rail@nont{\isa{args}}[]
  1895 \rail@term{\isa{{\isaliteral{5D}{\isacharbrackright}}}}[]
  1896 \rail@endbar
  1897 \rail@bar
  1898 \rail@nextbar{1}
  1899 \rail@nont{\isa{facts}}[]
  1900 \rail@endbar
  1901 \rail@bar
  1902 \rail@nextbar{1}
  1903 \rail@nont{\hyperlink{syntax.nat}{\mbox{\isa{nat}}}}[]
  1904 \rail@endbar
  1905 \rail@end
  1906 \rail@begin{2}{}
  1907 \rail@term{\hyperlink{command.HOL.sledgehammer-params}{\mbox{\isa{\isacommand{sledgehammer{\isaliteral{5F}{\isacharunderscore}}params}}}}}[]
  1908 \rail@bar
  1909 \rail@nextbar{1}
  1910 \rail@term{\isa{{\isaliteral{5B}{\isacharbrackleft}}}}[]
  1911 \rail@nont{\isa{args}}[]
  1912 \rail@term{\isa{{\isaliteral{5D}{\isacharbrackright}}}}[]
  1913 \rail@endbar
  1914 \rail@end
  1915 \rail@begin{2}{\isa{args}}
  1916 \rail@plus
  1917 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  1918 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
  1919 \rail@nont{\isa{value}}[]
  1920 \rail@nextplus{1}
  1921 \rail@cterm{\isa{{\isaliteral{2C}{\isacharcomma}}}}[]
  1922 \rail@endplus
  1923 \rail@end
  1924 \rail@begin{5}{\isa{facts}}
  1925 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  1926 \rail@bar
  1927 \rail@nextbar{1}
  1928 \rail@plus
  1929 \rail@bar
  1930 \rail@nextbar{2}
  1931 \rail@bar
  1932 \rail@term{\isa{add}}[]
  1933 \rail@nextbar{3}
  1934 \rail@term{\isa{del}}[]
  1935 \rail@endbar
  1936 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}}}[]
  1937 \rail@endbar
  1938 \rail@nont{\hyperlink{syntax.thmrefs}{\mbox{\isa{thmrefs}}}}[]
  1939 \rail@nextplus{4}
  1940 \rail@endplus
  1941 \rail@endbar
  1942 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  1943 \rail@end
  1944 \end{railoutput}
  1945  % FIXME try: proper clasimpmod!?
  1946   % FIXME check args "value"
  1947 
  1948   \begin{description}
  1949 
  1950   \item \hyperlink{command.HOL.solve-direct}{\mbox{\isa{\isacommand{solve{\isaliteral{5F}{\isacharunderscore}}direct}}}} checks whether the current subgoals can
  1951     be solved directly by an existing theorem. Duplicate lemmas can be detected
  1952     in this way.
  1953 
  1954   \item \hyperlink{command.HOL.try}{\mbox{\isa{\isacommand{try}}}} attempts to prove a subgoal using a combination
  1955     of standard proof methods (\isa{auto}, \isa{simp}, \isa{blast}, etc.).
  1956     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}}},
  1957     \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
  1958     methods.
  1959 
  1960   \item \hyperlink{command.HOL.sledgehammer}{\mbox{\isa{\isacommand{sledgehammer}}}} attempts to prove a subgoal using external
  1961     automatic provers (resolution provers and SMT solvers). See the Sledgehammer
  1962     manual \cite{isabelle-sledgehammer} for details.
  1963 
  1964   \item \hyperlink{command.HOL.sledgehammer-params}{\mbox{\isa{\isacommand{sledgehammer{\isaliteral{5F}{\isacharunderscore}}params}}}} changes
  1965     \hyperlink{command.HOL.sledgehammer}{\mbox{\isa{\isacommand{sledgehammer}}}} configuration options persistently.
  1966 
  1967   \end{description}%
  1968 \end{isamarkuptext}%
  1969 \isamarkuptrue%
  1970 %
  1971 \isamarkupsection{Checking and refuting propositions%
  1972 }
  1973 \isamarkuptrue%
  1974 %
  1975 \begin{isamarkuptext}%
  1976 Identifying incorrect propositions usually involves evaluation of
  1977   particular assignments and systematic counterexample search.  This
  1978   is supported by the following commands.
  1979 
  1980   \begin{matharray}{rcl}
  1981     \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}}} \\
  1982     \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}}} \\
  1983     \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}}} \\
  1984     \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}}} \\
  1985     \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}}} \\
  1986     \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}}} \\
  1987     \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}}}
  1988   \end{matharray}
  1989 
  1990   \begin{railoutput}
  1991 \rail@begin{2}{}
  1992 \rail@term{\hyperlink{command.HOL.value}{\mbox{\isa{\isacommand{value}}}}}[]
  1993 \rail@bar
  1994 \rail@nextbar{1}
  1995 \rail@term{\isa{{\isaliteral{5B}{\isacharbrackleft}}}}[]
  1996 \rail@nont{\isa{name}}[]
  1997 \rail@term{\isa{{\isaliteral{5D}{\isacharbrackright}}}}[]
  1998 \rail@endbar
  1999 \rail@bar
  2000 \rail@nextbar{1}
  2001 \rail@nont{\isa{modes}}[]
  2002 \rail@endbar
  2003 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  2004 \rail@end
  2005 \rail@begin{3}{}
  2006 \rail@bar
  2007 \rail@term{\hyperlink{command.HOL.quickcheck}{\mbox{\isa{\isacommand{quickcheck}}}}}[]
  2008 \rail@nextbar{1}
  2009 \rail@term{\hyperlink{command.HOL.refute}{\mbox{\isa{\isacommand{refute}}}}}[]
  2010 \rail@nextbar{2}
  2011 \rail@term{\hyperlink{command.HOL.nitpick}{\mbox{\isa{\isacommand{nitpick}}}}}[]
  2012 \rail@endbar
  2013 \rail@bar
  2014 \rail@nextbar{1}
  2015 \rail@term{\isa{{\isaliteral{5B}{\isacharbrackleft}}}}[]
  2016 \rail@nont{\isa{args}}[]
  2017 \rail@term{\isa{{\isaliteral{5D}{\isacharbrackright}}}}[]
  2018 \rail@endbar
  2019 \rail@bar
  2020 \rail@nextbar{1}
  2021 \rail@nont{\hyperlink{syntax.nat}{\mbox{\isa{nat}}}}[]
  2022 \rail@endbar
  2023 \rail@end
  2024 \rail@begin{3}{}
  2025 \rail@bar
  2026 \rail@term{\hyperlink{command.HOL.quickcheck-params}{\mbox{\isa{\isacommand{quickcheck{\isaliteral{5F}{\isacharunderscore}}params}}}}}[]
  2027 \rail@nextbar{1}
  2028 \rail@term{\hyperlink{command.HOL.refute-params}{\mbox{\isa{\isacommand{refute{\isaliteral{5F}{\isacharunderscore}}params}}}}}[]
  2029 \rail@nextbar{2}
  2030 \rail@term{\hyperlink{command.HOL.nitpick-params}{\mbox{\isa{\isacommand{nitpick{\isaliteral{5F}{\isacharunderscore}}params}}}}}[]
  2031 \rail@endbar
  2032 \rail@bar
  2033 \rail@nextbar{1}
  2034 \rail@term{\isa{{\isaliteral{5B}{\isacharbrackleft}}}}[]
  2035 \rail@nont{\isa{args}}[]
  2036 \rail@term{\isa{{\isaliteral{5D}{\isacharbrackright}}}}[]
  2037 \rail@endbar
  2038 \rail@end
  2039 \rail@begin{2}{\isa{modes}}
  2040 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2041 \rail@plus
  2042 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2043 \rail@nextplus{1}
  2044 \rail@endplus
  2045 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2046 \rail@end
  2047 \rail@begin{2}{\isa{args}}
  2048 \rail@plus
  2049 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2050 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
  2051 \rail@nont{\isa{value}}[]
  2052 \rail@nextplus{1}
  2053 \rail@cterm{\isa{{\isaliteral{2C}{\isacharcomma}}}}[]
  2054 \rail@endplus
  2055 \rail@end
  2056 \end{railoutput}
  2057  % FIXME check "value"
  2058 
  2059   \begin{description}
  2060 
  2061   \item \hyperlink{command.HOL.value}{\mbox{\isa{\isacommand{value}}}}~\isa{t} evaluates and prints a
  2062     term; optionally \isa{modes} can be specified, which are
  2063     appended to the current print mode (see also \cite{isabelle-ref}).
  2064     Internally, the evaluation is performed by registered evaluators,
  2065     which are invoked sequentially until a result is returned.
  2066     Alternatively a specific evaluator can be selected using square
  2067     brackets; typical evaluators use the current set of code equations
  2068     to normalize and include \isa{simp} for fully symbolic evaluation
  2069     using the simplifier, \isa{nbe} for \emph{normalization by evaluation}
  2070     and \emph{code} for code generation in SML.
  2071 
  2072   \item \hyperlink{command.HOL.quickcheck}{\mbox{\isa{\isacommand{quickcheck}}}} tests the current goal for
  2073     counterexamples using a series of assignments for its
  2074     free variables; by default the first subgoal is tested, an other
  2075     can be selected explicitly using an optional goal index.
  2076     Assignments can be chosen exhausting the search space upto a given
  2077     size or using a fixed number of random assignments in the search space.
  2078     By default, quickcheck uses exhaustive testing.
  2079     A number of configuration options are supported for
  2080     \hyperlink{command.HOL.quickcheck}{\mbox{\isa{\isacommand{quickcheck}}}}, notably:
  2081 
  2082     \begin{description}
  2083 
  2084     \item[\isa{tester}] specifies how to explore the search space
  2085       (e.g. exhaustive or random).
  2086       An unknown configuration option is treated as an argument to tester,
  2087       making \isa{{\isaliteral{22}{\isachardoublequote}}tester\ {\isaliteral{3D}{\isacharequal}}{\isaliteral{22}{\isachardoublequote}}} optional.
  2088     \item[\isa{size}] specifies the maximum size of the search space
  2089     for assignment values.
  2090 
  2091     \item[\isa{eval}] takes a term or a list of terms and evaluates
  2092       these terms under the variable assignment found by quickcheck.
  2093 
  2094     \item[\isa{iterations}] sets how many sets of assignments are
  2095     generated for each particular size.
  2096 
  2097     \item[\isa{no{\isaliteral{5F}{\isacharunderscore}}assms}] specifies whether assumptions in
  2098     structured proofs should be ignored.
  2099 
  2100     \item[\isa{timeout}] sets the time limit in seconds.
  2101 
  2102     \item[\isa{default{\isaliteral{5F}{\isacharunderscore}}type}] sets the type(s) generally used to
  2103     instantiate type variables.
  2104 
  2105     \item[\isa{report}] if set quickcheck reports how many tests
  2106     fulfilled the preconditions.
  2107 
  2108     \item[\isa{quiet}] if not set quickcheck informs about the
  2109     current size for assignment values.
  2110 
  2111     \item[\isa{expect}] can be used to check if the user's
  2112     expectation was met (\isa{no{\isaliteral{5F}{\isacharunderscore}}expectation}, \isa{no{\isaliteral{5F}{\isacharunderscore}}counterexample}, or \isa{counterexample}).
  2113 
  2114     \end{description}
  2115 
  2116     These option can be given within square brackets.
  2117 
  2118   \item \hyperlink{command.HOL.quickcheck-params}{\mbox{\isa{\isacommand{quickcheck{\isaliteral{5F}{\isacharunderscore}}params}}}} changes
  2119     \hyperlink{command.HOL.quickcheck}{\mbox{\isa{\isacommand{quickcheck}}}} configuration options persistently.
  2120 
  2121   \item \hyperlink{command.HOL.refute}{\mbox{\isa{\isacommand{refute}}}} tests the current goal for
  2122     counterexamples using a reduction to SAT. The following configuration
  2123     options are supported:
  2124 
  2125     \begin{description}
  2126 
  2127     \item[\isa{minsize}] specifies the minimum size (cardinality) of the
  2128       models to search for.
  2129 
  2130     \item[\isa{maxsize}] specifies the maximum size (cardinality) of the
  2131       models to search for. Nonpositive values mean $\infty$.
  2132 
  2133     \item[\isa{maxvars}] specifies the maximum number of Boolean variables
  2134     to use when transforming the term into a propositional formula.
  2135     Nonpositive values mean $\infty$.
  2136 
  2137     \item[\isa{satsolver}] specifies the SAT solver to use.
  2138 
  2139     \item[\isa{no{\isaliteral{5F}{\isacharunderscore}}assms}] specifies whether assumptions in
  2140     structured proofs should be ignored.
  2141 
  2142     \item[\isa{maxtime}] sets the time limit in seconds.
  2143 
  2144     \item[\isa{expect}] can be used to check if the user's
  2145     expectation was met (\isa{genuine}, \isa{potential},
  2146     \isa{none}, or \isa{unknown}).
  2147 
  2148     \end{description}
  2149 
  2150     These option can be given within square brackets.
  2151 
  2152   \item \hyperlink{command.HOL.refute-params}{\mbox{\isa{\isacommand{refute{\isaliteral{5F}{\isacharunderscore}}params}}}} changes
  2153     \hyperlink{command.HOL.refute}{\mbox{\isa{\isacommand{refute}}}} configuration options persistently.
  2154 
  2155   \item \hyperlink{command.HOL.nitpick}{\mbox{\isa{\isacommand{nitpick}}}} tests the current goal for counterexamples
  2156     using a reduction to first-order relational logic. See the Nitpick manual
  2157     \cite{isabelle-nitpick} for details.
  2158 
  2159   \item \hyperlink{command.HOL.nitpick-params}{\mbox{\isa{\isacommand{nitpick{\isaliteral{5F}{\isacharunderscore}}params}}}} changes
  2160     \hyperlink{command.HOL.nitpick}{\mbox{\isa{\isacommand{nitpick}}}} configuration options persistently.
  2161 
  2162   \end{description}%
  2163 \end{isamarkuptext}%
  2164 \isamarkuptrue%
  2165 %
  2166 \isamarkupsection{Unstructured case analysis and induction \label{sec:hol-induct-tac}%
  2167 }
  2168 \isamarkuptrue%
  2169 %
  2170 \begin{isamarkuptext}%
  2171 The following tools of Isabelle/HOL support cases analysis and
  2172   induction in unstructured tactic scripts; see also
  2173   \secref{sec:cases-induct} for proper Isar versions of similar ideas.
  2174 
  2175   \begin{matharray}{rcl}
  2176     \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} \\
  2177     \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} \\
  2178     \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} \\
  2179     \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}}} \\
  2180   \end{matharray}
  2181 
  2182   \begin{railoutput}
  2183 \rail@begin{2}{}
  2184 \rail@term{\hyperlink{method.HOL.case-tac}{\mbox{\isa{case{\isaliteral{5F}{\isacharunderscore}}tac}}}}[]
  2185 \rail@bar
  2186 \rail@nextbar{1}
  2187 \rail@nont{\hyperlink{syntax.goal-spec}{\mbox{\isa{goal{\isaliteral{5F}{\isacharunderscore}}spec}}}}[]
  2188 \rail@endbar
  2189 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  2190 \rail@bar
  2191 \rail@nextbar{1}
  2192 \rail@nont{\isa{rule}}[]
  2193 \rail@endbar
  2194 \rail@end
  2195 \rail@begin{3}{}
  2196 \rail@term{\hyperlink{method.HOL.induct-tac}{\mbox{\isa{induct{\isaliteral{5F}{\isacharunderscore}}tac}}}}[]
  2197 \rail@bar
  2198 \rail@nextbar{1}
  2199 \rail@nont{\hyperlink{syntax.goal-spec}{\mbox{\isa{goal{\isaliteral{5F}{\isacharunderscore}}spec}}}}[]
  2200 \rail@endbar
  2201 \rail@bar
  2202 \rail@nextbar{1}
  2203 \rail@plus
  2204 \rail@nont{\hyperlink{syntax.insts}{\mbox{\isa{insts}}}}[]
  2205 \rail@nextplus{2}
  2206 \rail@cterm{\isa{\isakeyword{and}}}[]
  2207 \rail@endplus
  2208 \rail@endbar
  2209 \rail@bar
  2210 \rail@nextbar{1}
  2211 \rail@nont{\isa{rule}}[]
  2212 \rail@endbar
  2213 \rail@end
  2214 \rail@begin{3}{}
  2215 \rail@term{\hyperlink{method.HOL.ind-cases}{\mbox{\isa{ind{\isaliteral{5F}{\isacharunderscore}}cases}}}}[]
  2216 \rail@plus
  2217 \rail@nont{\hyperlink{syntax.prop}{\mbox{\isa{prop}}}}[]
  2218 \rail@nextplus{1}
  2219 \rail@endplus
  2220 \rail@bar
  2221 \rail@nextbar{1}
  2222 \rail@term{\isa{\isakeyword{for}}}[]
  2223 \rail@plus
  2224 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2225 \rail@nextplus{2}
  2226 \rail@endplus
  2227 \rail@endbar
  2228 \rail@end
  2229 \rail@begin{3}{}
  2230 \rail@term{\hyperlink{command.HOL.inductive-cases}{\mbox{\isa{\isacommand{inductive{\isaliteral{5F}{\isacharunderscore}}cases}}}}}[]
  2231 \rail@plus
  2232 \rail@bar
  2233 \rail@nextbar{1}
  2234 \rail@nont{\hyperlink{syntax.thmdecl}{\mbox{\isa{thmdecl}}}}[]
  2235 \rail@endbar
  2236 \rail@plus
  2237 \rail@nont{\hyperlink{syntax.prop}{\mbox{\isa{prop}}}}[]
  2238 \rail@nextplus{1}
  2239 \rail@endplus
  2240 \rail@nextplus{2}
  2241 \rail@cterm{\isa{\isakeyword{and}}}[]
  2242 \rail@endplus
  2243 \rail@end
  2244 \rail@begin{1}{\isa{rule}}
  2245 \rail@term{\isa{rule}}[]
  2246 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}}}[]
  2247 \rail@nont{\hyperlink{syntax.thmref}{\mbox{\isa{thmref}}}}[]
  2248 \rail@end
  2249 \end{railoutput}
  2250 
  2251 
  2252   \begin{description}
  2253 
  2254   \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
  2255   to reason about inductive types.  Rules are selected according to
  2256   the declarations by the \hyperlink{attribute.cases}{\mbox{\isa{cases}}} and \hyperlink{attribute.induct}{\mbox{\isa{induct}}}
  2257   attributes, cf.\ \secref{sec:cases-induct}.  The \hyperlink{command.HOL.datatype}{\mbox{\isa{\isacommand{datatype}}}} package already takes care of this.
  2258 
  2259   These unstructured tactics feature both goal addressing and dynamic
  2260   instantiation.  Note that named rule cases are \emph{not} provided
  2261   as would be by the proper \hyperlink{method.cases}{\mbox{\isa{cases}}} and \hyperlink{method.induct}{\mbox{\isa{induct}}} proof
  2262   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
  2263   statements, only the compact object-logic conclusion of the subgoal
  2264   being addressed.
  2265 
  2266   \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
  2267   forward manner.
  2268 
  2269   While \hyperlink{method.HOL.ind-cases}{\mbox{\isa{ind{\isaliteral{5F}{\isacharunderscore}}cases}}} is a proof method to apply the
  2270   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
  2271   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
  2272   be generalized before applying the resulting rule.
  2273 
  2274   \end{description}%
  2275 \end{isamarkuptext}%
  2276 \isamarkuptrue%
  2277 %
  2278 \isamarkupsection{Executable code%
  2279 }
  2280 \isamarkuptrue%
  2281 %
  2282 \begin{isamarkuptext}%
  2283 For validation purposes, it is often useful to \emph{execute}
  2284   specifications.  In principle, execution could be simulated by
  2285   Isabelle's inference kernel, i.e. by a combination of resolution and
  2286   simplification.  Unfortunately, this approach is rather inefficient.
  2287   A more efficient way of executing specifications is to translate
  2288   them into a functional programming language such as ML.
  2289 
  2290   Isabelle provides two generic frameworks to support code generation
  2291   from executable specifications.  Isabelle/HOL instantiates these
  2292   mechanisms in a way that is amenable to end-user applications.%
  2293 \end{isamarkuptext}%
  2294 \isamarkuptrue%
  2295 %
  2296 \isamarkupsubsection{The new code generator (F. Haftmann)%
  2297 }
  2298 \isamarkuptrue%
  2299 %
  2300 \begin{isamarkuptext}%
  2301 This framework generates code from functional programs
  2302   (including overloading using type classes) to SML \cite{SML}, OCaml
  2303   \cite{OCaml}, Haskell \cite{haskell-revised-report} and Scala
  2304   \cite{scala-overview-tech-report}.  Conceptually, code generation is
  2305   split up in three steps: \emph{selection} of code theorems,
  2306   \emph{translation} into an abstract executable view and
  2307   \emph{serialization} to a specific \emph{target language}.
  2308   Inductive specifications can be executed using the predicate
  2309   compiler which operates within HOL.  See \cite{isabelle-codegen} for
  2310   an introduction.
  2311 
  2312   \begin{matharray}{rcl}
  2313     \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}}} \\
  2314     \indexdef{HOL}{attribute}{code}\hypertarget{attribute.HOL.code}{\hyperlink{attribute.HOL.code}{\mbox{\isa{code}}}} & : & \isa{attribute} \\
  2315     \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}}} \\
  2316     \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}}} \\
  2317     \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}}} \\
  2318     \indexdef{HOL}{attribute}{code\_inline}\hypertarget{attribute.HOL.code-inline}{\hyperlink{attribute.HOL.code-inline}{\mbox{\isa{code{\isaliteral{5F}{\isacharunderscore}}inline}}}} & : & \isa{attribute} \\
  2319     \indexdef{HOL}{attribute}{code\_post}\hypertarget{attribute.HOL.code-post}{\hyperlink{attribute.HOL.code-post}{\mbox{\isa{code{\isaliteral{5F}{\isacharunderscore}}post}}}} & : & \isa{attribute} \\
  2320     \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}}} \\
  2321     \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}}} \\
  2322     \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}}} \\
  2323     \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}}} \\
  2324     \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}}} \\
  2325     \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}}} \\
  2326     \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}}} \\
  2327     \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}}} \\
  2328     \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}}} \\
  2329     \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}}} \\
  2330     \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}}} \\
  2331     \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}}}
  2332   \end{matharray}
  2333 
  2334   \begin{railoutput}
  2335 \rail@begin{11}{}
  2336 \rail@term{\hyperlink{command.HOL.export-code}{\mbox{\isa{\isacommand{export{\isaliteral{5F}{\isacharunderscore}}code}}}}}[]
  2337 \rail@plus
  2338 \rail@nont{\isa{constexpr}}[]
  2339 \rail@nextplus{1}
  2340 \rail@endplus
  2341 \rail@cr{3}
  2342 \rail@bar
  2343 \rail@nextbar{4}
  2344 \rail@plus
  2345 \rail@term{\isa{\isakeyword{in}}}[]
  2346 \rail@nont{\isa{target}}[]
  2347 \rail@bar
  2348 \rail@nextbar{5}
  2349 \rail@term{\isa{\isakeyword{module{\isaliteral{5F}{\isacharunderscore}}name}}}[]
  2350 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2351 \rail@endbar
  2352 \rail@cr{7}
  2353 \rail@bar
  2354 \rail@nextbar{8}
  2355 \rail@term{\isa{\isakeyword{file}}}[]
  2356 \rail@bar
  2357 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2358 \rail@nextbar{9}
  2359 \rail@term{\isa{{\isaliteral{2D}{\isacharminus}}}}[]
  2360 \rail@endbar
  2361 \rail@endbar
  2362 \rail@bar
  2363 \rail@nextbar{8}
  2364 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2365 \rail@nont{\isa{args}}[]
  2366 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2367 \rail@endbar
  2368 \rail@nextplus{10}
  2369 \rail@endplus
  2370 \rail@endbar
  2371 \rail@end
  2372 \rail@begin{1}{\isa{const}}
  2373 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  2374 \rail@end
  2375 \rail@begin{3}{\isa{constexpr}}
  2376 \rail@bar
  2377 \rail@nont{\isa{const}}[]
  2378 \rail@nextbar{1}
  2379 \rail@term{\isa{name{\isaliteral{2E}{\isachardot}}{\isaliteral{5F}{\isacharunderscore}}}}[]
  2380 \rail@nextbar{2}
  2381 \rail@term{\isa{{\isaliteral{5F}{\isacharunderscore}}}}[]
  2382 \rail@endbar
  2383 \rail@end
  2384 \rail@begin{1}{\isa{typeconstructor}}
  2385 \rail@nont{\hyperlink{syntax.nameref}{\mbox{\isa{nameref}}}}[]
  2386 \rail@end
  2387 \rail@begin{1}{\isa{class}}
  2388 \rail@nont{\hyperlink{syntax.nameref}{\mbox{\isa{nameref}}}}[]
  2389 \rail@end
  2390 \rail@begin{4}{\isa{target}}
  2391 \rail@bar
  2392 \rail@term{\isa{SML}}[]
  2393 \rail@nextbar{1}
  2394 \rail@term{\isa{OCaml}}[]
  2395 \rail@nextbar{2}
  2396 \rail@term{\isa{Haskell}}[]
  2397 \rail@nextbar{3}
  2398 \rail@term{\isa{Scala}}[]
  2399 \rail@endbar
  2400 \rail@end
  2401 \rail@begin{4}{}
  2402 \rail@term{\hyperlink{attribute.HOL.code}{\mbox{\isa{code}}}}[]
  2403 \rail@bar
  2404 \rail@nextbar{1}
  2405 \rail@bar
  2406 \rail@term{\isa{del}}[]
  2407 \rail@nextbar{2}
  2408 \rail@term{\isa{abstype}}[]
  2409 \rail@nextbar{3}
  2410 \rail@term{\isa{abstract}}[]
  2411 \rail@endbar
  2412 \rail@endbar
  2413 \rail@end
  2414 \rail@begin{2}{}
  2415 \rail@term{\hyperlink{command.HOL.code-abort}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}abort}}}}}[]
  2416 \rail@plus
  2417 \rail@nont{\isa{const}}[]
  2418 \rail@nextplus{1}
  2419 \rail@endplus
  2420 \rail@end
  2421 \rail@begin{2}{}
  2422 \rail@term{\hyperlink{command.HOL.code-datatype}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}datatype}}}}}[]
  2423 \rail@plus
  2424 \rail@nont{\isa{const}}[]
  2425 \rail@nextplus{1}
  2426 \rail@endplus
  2427 \rail@end
  2428 \rail@begin{2}{}
  2429 \rail@term{\hyperlink{attribute.HOL.code-inline}{\mbox{\isa{code{\isaliteral{5F}{\isacharunderscore}}inline}}}}[]
  2430 \rail@bar
  2431 \rail@nextbar{1}
  2432 \rail@term{\isa{del}}[]
  2433 \rail@endbar
  2434 \rail@end
  2435 \rail@begin{2}{}
  2436 \rail@term{\hyperlink{attribute.HOL.code-post}{\mbox{\isa{code{\isaliteral{5F}{\isacharunderscore}}post}}}}[]
  2437 \rail@bar
  2438 \rail@nextbar{1}
  2439 \rail@term{\isa{del}}[]
  2440 \rail@endbar
  2441 \rail@end
  2442 \rail@begin{3}{}
  2443 \rail@term{\hyperlink{command.HOL.code-thms}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}thms}}}}}[]
  2444 \rail@bar
  2445 \rail@nextbar{1}
  2446 \rail@plus
  2447 \rail@nont{\isa{constexpr}}[]
  2448 \rail@nextplus{2}
  2449 \rail@endplus
  2450 \rail@endbar
  2451 \rail@end
  2452 \rail@begin{3}{}
  2453 \rail@term{\hyperlink{command.HOL.code-deps}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}deps}}}}}[]
  2454 \rail@bar
  2455 \rail@nextbar{1}
  2456 \rail@plus
  2457 \rail@nont{\isa{constexpr}}[]
  2458 \rail@nextplus{2}
  2459 \rail@endplus
  2460 \rail@endbar
  2461 \rail@end
  2462 \rail@begin{7}{}
  2463 \rail@term{\hyperlink{command.HOL.code-const}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}const}}}}}[]
  2464 \rail@plus
  2465 \rail@nont{\isa{const}}[]
  2466 \rail@nextplus{1}
  2467 \rail@cterm{\isa{\isakeyword{and}}}[]
  2468 \rail@endplus
  2469 \rail@cr{3}
  2470 \rail@plus
  2471 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2472 \rail@nont{\isa{target}}[]
  2473 \rail@plus
  2474 \rail@bar
  2475 \rail@nextbar{4}
  2476 \rail@nont{\isa{syntax}}[]
  2477 \rail@endbar
  2478 \rail@nextplus{5}
  2479 \rail@cterm{\isa{\isakeyword{and}}}[]
  2480 \rail@endplus
  2481 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2482 \rail@nextplus{6}
  2483 \rail@endplus
  2484 \rail@end
  2485 \rail@begin{7}{}
  2486 \rail@term{\hyperlink{command.HOL.code-type}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}type}}}}}[]
  2487 \rail@plus
  2488 \rail@nont{\isa{typeconstructor}}[]
  2489 \rail@nextplus{1}
  2490 \rail@cterm{\isa{\isakeyword{and}}}[]
  2491 \rail@endplus
  2492 \rail@cr{3}
  2493 \rail@plus
  2494 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2495 \rail@nont{\isa{target}}[]
  2496 \rail@plus
  2497 \rail@bar
  2498 \rail@nextbar{4}
  2499 \rail@nont{\isa{syntax}}[]
  2500 \rail@endbar
  2501 \rail@nextplus{5}
  2502 \rail@cterm{\isa{\isakeyword{and}}}[]
  2503 \rail@endplus
  2504 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2505 \rail@nextplus{6}
  2506 \rail@endplus
  2507 \rail@end
  2508 \rail@begin{9}{}
  2509 \rail@term{\hyperlink{command.HOL.code-class}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}class}}}}}[]
  2510 \rail@plus
  2511 \rail@nont{\isa{class}}[]
  2512 \rail@nextplus{1}
  2513 \rail@cterm{\isa{\isakeyword{and}}}[]
  2514 \rail@endplus
  2515 \rail@cr{3}
  2516 \rail@plus
  2517 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2518 \rail@nont{\isa{target}}[]
  2519 \rail@cr{5}
  2520 \rail@plus
  2521 \rail@bar
  2522 \rail@nextbar{6}
  2523 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2524 \rail@endbar
  2525 \rail@nextplus{7}
  2526 \rail@cterm{\isa{\isakeyword{and}}}[]
  2527 \rail@endplus
  2528 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2529 \rail@nextplus{8}
  2530 \rail@endplus
  2531 \rail@end
  2532 \rail@begin{7}{}
  2533 \rail@term{\hyperlink{command.HOL.code-instance}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}instance}}}}}[]
  2534 \rail@plus
  2535 \rail@nont{\isa{typeconstructor}}[]
  2536 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}}}[]
  2537 \rail@nont{\isa{class}}[]
  2538 \rail@nextplus{1}
  2539 \rail@cterm{\isa{\isakeyword{and}}}[]
  2540 \rail@endplus
  2541 \rail@cr{3}
  2542 \rail@plus
  2543 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2544 \rail@nont{\isa{target}}[]
  2545 \rail@plus
  2546 \rail@bar
  2547 \rail@nextbar{4}
  2548 \rail@term{\isa{{\isaliteral{2D}{\isacharminus}}}}[]
  2549 \rail@endbar
  2550 \rail@nextplus{5}
  2551 \rail@cterm{\isa{\isakeyword{and}}}[]
  2552 \rail@endplus
  2553 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2554 \rail@nextplus{6}
  2555 \rail@endplus
  2556 \rail@end
  2557 \rail@begin{2}{}
  2558 \rail@term{\hyperlink{command.HOL.code-reserved}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}reserved}}}}}[]
  2559 \rail@nont{\isa{target}}[]
  2560 \rail@plus
  2561 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2562 \rail@nextplus{1}
  2563 \rail@endplus
  2564 \rail@end
  2565 \rail@begin{1}{}
  2566 \rail@term{\hyperlink{command.HOL.code-monad}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}monad}}}}}[]
  2567 \rail@nont{\isa{const}}[]
  2568 \rail@nont{\isa{const}}[]
  2569 \rail@nont{\isa{target}}[]
  2570 \rail@end
  2571 \rail@begin{2}{}
  2572 \rail@term{\hyperlink{command.HOL.code-include}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}include}}}}}[]
  2573 \rail@nont{\isa{target}}[]
  2574 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2575 \rail@bar
  2576 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2577 \rail@nextbar{1}
  2578 \rail@term{\isa{{\isaliteral{2D}{\isacharminus}}}}[]
  2579 \rail@endbar
  2580 \rail@end
  2581 \rail@begin{2}{}
  2582 \rail@term{\hyperlink{command.HOL.code-modulename}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}modulename}}}}}[]
  2583 \rail@nont{\isa{target}}[]
  2584 \rail@plus
  2585 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2586 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2587 \rail@nextplus{1}
  2588 \rail@endplus
  2589 \rail@end
  2590 \rail@begin{11}{}
  2591 \rail@term{\hyperlink{command.HOL.code-reflect}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}reflect}}}}}[]
  2592 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2593 \rail@cr{2}
  2594 \rail@bar
  2595 \rail@nextbar{3}
  2596 \rail@term{\isa{\isakeyword{datatypes}}}[]
  2597 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2598 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
  2599 \rail@bar
  2600 \rail@term{\isa{{\isaliteral{5F}{\isacharunderscore}}}}[]
  2601 \rail@nextbar{4}
  2602 \rail@plus
  2603 \rail@plus
  2604 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2605 \rail@nextplus{5}
  2606 \rail@cterm{\isa{{\isaliteral{7C}{\isacharbar}}}}[]
  2607 \rail@endplus
  2608 \rail@nextplus{6}
  2609 \rail@cterm{\isa{\isakeyword{and}}}[]
  2610 \rail@endplus
  2611 \rail@endbar
  2612 \rail@endbar
  2613 \rail@cr{8}
  2614 \rail@bar
  2615 \rail@nextbar{9}
  2616 \rail@term{\isa{\isakeyword{functions}}}[]
  2617 \rail@plus
  2618 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2619 \rail@nextplus{10}
  2620 \rail@endplus
  2621 \rail@endbar
  2622 \rail@bar
  2623 \rail@nextbar{9}
  2624 \rail@term{\isa{\isakeyword{file}}}[]
  2625 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2626 \rail@endbar
  2627 \rail@end
  2628 \rail@begin{4}{\isa{syntax}}
  2629 \rail@bar
  2630 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2631 \rail@nextbar{1}
  2632 \rail@bar
  2633 \rail@term{\isa{\isakeyword{infix}}}[]
  2634 \rail@nextbar{2}
  2635 \rail@term{\isa{\isakeyword{infixl}}}[]
  2636 \rail@nextbar{3}
  2637 \rail@term{\isa{\isakeyword{infixr}}}[]
  2638 \rail@endbar
  2639 \rail@nont{\hyperlink{syntax.nat}{\mbox{\isa{nat}}}}[]
  2640 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2641 \rail@endbar
  2642 \rail@end
  2643 \end{railoutput}
  2644 
  2645 
  2646   \begin{description}
  2647 
  2648   \item \hyperlink{command.HOL.export-code}{\mbox{\isa{\isacommand{export{\isaliteral{5F}{\isacharunderscore}}code}}}} generates code for a given list
  2649   of constants in the specified target language(s).  If no
  2650   serialization instruction is given, only abstract code is generated
  2651   internally.
  2652 
  2653   Constants may be specified by giving them literally, referring to
  2654   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
  2655   available by giving \isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{2A}{\isacharasterisk}}{\isaliteral{22}{\isachardoublequote}}}.
  2656 
  2657   By default, for each involved theory one corresponding name space
  2658   module is generated.  Alternativly, a module name may be specified
  2659   after the \hyperlink{keyword.module-name}{\mbox{\isa{\isakeyword{module{\isaliteral{5F}{\isacharunderscore}}name}}}} keyword; then \emph{all} code is
  2660   placed in this module.
  2661 
  2662   For \emph{SML}, \emph{OCaml} and \emph{Scala} the file specification
  2663   refers to a single file; for \emph{Haskell}, it refers to a whole
  2664   directory, where code is generated in multiple files reflecting the
  2665   module hierarchy.  Omitting the file specification denotes standard
  2666   output.
  2667 
  2668   Serializers take an optional list of arguments in parentheses.  For
  2669   \emph{SML} and \emph{OCaml}, ``\isa{no{\isaliteral{5F}{\isacharunderscore}}signatures}`` omits
  2670   explicit module signatures.
  2671 
  2672   For \emph{Haskell} a module name prefix may be given using the
  2673   ``\isa{{\isaliteral{22}{\isachardoublequote}}root{\isaliteral{3A}{\isacharcolon}}{\isaliteral{22}{\isachardoublequote}}}'' argument; ``\isa{string{\isaliteral{5F}{\isacharunderscore}}classes}'' adds a
  2674   ``\verb|deriving (Read, Show)|'' clause to each appropriate
  2675   datatype declaration.
  2676 
  2677   \item \hyperlink{attribute.HOL.code}{\mbox{\isa{code}}} explicitly selects (or with option
  2678   ``\isa{{\isaliteral{22}{\isachardoublequote}}del{\isaliteral{22}{\isachardoublequote}}}'' deselects) a code equation for code generation.
  2679   Usually packages introducing code equations provide a reasonable
  2680   default setup for selection.  Variants \isa{{\isaliteral{22}{\isachardoublequote}}code\ abstype{\isaliteral{22}{\isachardoublequote}}} and
  2681   \isa{{\isaliteral{22}{\isachardoublequote}}code\ abstract{\isaliteral{22}{\isachardoublequote}}} declare abstract datatype certificates or
  2682   code equations on abstract datatype representations respectively.
  2683 
  2684   \item \hyperlink{command.HOL.code-abort}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}abort}}}} declares constants which are not
  2685   required to have a definition by means of code equations; if needed
  2686   these are implemented by program abort instead.
  2687 
  2688   \item \hyperlink{command.HOL.code-datatype}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}datatype}}}} specifies a constructor set
  2689   for a logical type.
  2690 
  2691   \item \hyperlink{command.HOL.print-codesetup}{\mbox{\isa{\isacommand{print{\isaliteral{5F}{\isacharunderscore}}codesetup}}}} gives an overview on
  2692   selected code equations and code generator datatypes.
  2693 
  2694   \item \hyperlink{attribute.HOL.code-inline}{\mbox{\isa{code{\isaliteral{5F}{\isacharunderscore}}inline}}} declares (or with option
  2695   ``\isa{{\isaliteral{22}{\isachardoublequote}}del{\isaliteral{22}{\isachardoublequote}}}'' removes) inlining theorems which are applied as
  2696   rewrite rules to any code equation during preprocessing.
  2697 
  2698   \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
  2699   result of an evaluation.
  2700 
  2701   \item \hyperlink{command.HOL.print-codeproc}{\mbox{\isa{\isacommand{print{\isaliteral{5F}{\isacharunderscore}}codeproc}}}} prints the setup of the code
  2702   generator preprocessor.
  2703 
  2704   \item \hyperlink{command.HOL.code-thms}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}thms}}}} prints a list of theorems
  2705   representing the corresponding program containing all given
  2706   constants after preprocessing.
  2707 
  2708   \item \hyperlink{command.HOL.code-deps}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}deps}}}} visualizes dependencies of
  2709   theorems representing the corresponding program containing all given
  2710   constants after preprocessing.
  2711 
  2712   \item \hyperlink{command.HOL.code-const}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}const}}}} associates a list of constants
  2713   with target-specific serializations; omitting a serialization
  2714   deletes an existing serialization.
  2715 
  2716   \item \hyperlink{command.HOL.code-type}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}type}}}} associates a list of type
  2717   constructors with target-specific serializations; omitting a
  2718   serialization deletes an existing serialization.
  2719 
  2720   \item \hyperlink{command.HOL.code-class}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}class}}}} associates a list of classes
  2721   with target-specific class names; omitting a serialization deletes
  2722   an existing serialization.  This applies only to \emph{Haskell}.
  2723 
  2724   \item \hyperlink{command.HOL.code-instance}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}instance}}}} declares a list of type
  2725   constructor / class instance relations as ``already present'' for a
  2726   given target.  Omitting a ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{2D}{\isacharminus}}{\isaliteral{22}{\isachardoublequote}}}'' deletes an existing
  2727   ``already present'' declaration.  This applies only to
  2728   \emph{Haskell}.
  2729 
  2730   \item \hyperlink{command.HOL.code-reserved}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}reserved}}}} declares a list of names as
  2731   reserved for a given target, preventing it to be shadowed by any
  2732   generated code.
  2733 
  2734   \item \hyperlink{command.HOL.code-monad}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}monad}}}} provides an auxiliary mechanism
  2735   to generate monadic code for Haskell.
  2736 
  2737   \item \hyperlink{command.HOL.code-include}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}include}}}} adds arbitrary named content
  2738   (``include'') to generated code.  A ``\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{2D}{\isacharminus}}{\isaliteral{22}{\isachardoublequote}}}'' as last argument
  2739   will remove an already added ``include''.
  2740 
  2741   \item \hyperlink{command.HOL.code-modulename}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}modulename}}}} declares aliasings from one
  2742   module name onto another.
  2743 
  2744   \item \hyperlink{command.HOL.code-reflect}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}reflect}}}} without a ``\isa{{\isaliteral{22}{\isachardoublequote}}file{\isaliteral{22}{\isachardoublequote}}}''
  2745   argument compiles code into the system runtime environment and
  2746   modifies the code generator setup that future invocations of system
  2747   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
  2748   entities.  With a ``\isa{{\isaliteral{22}{\isachardoublequote}}file{\isaliteral{22}{\isachardoublequote}}}'' argument, the corresponding code
  2749   is generated into that specified file without modifying the code
  2750   generator setup.
  2751 
  2752   \end{description}%
  2753 \end{isamarkuptext}%
  2754 \isamarkuptrue%
  2755 %
  2756 \isamarkupsubsection{The old code generator (S. Berghofer)%
  2757 }
  2758 \isamarkuptrue%
  2759 %
  2760 \begin{isamarkuptext}%
  2761 This framework generates code from both functional and
  2762   relational programs to SML, as explained below.
  2763 
  2764   \begin{matharray}{rcl}
  2765     \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}}} \\
  2766     \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}}} \\
  2767     \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}}} \\
  2768     \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}}} \\
  2769     \indexdef{}{attribute}{code}\hypertarget{attribute.code}{\hyperlink{attribute.code}{\mbox{\isa{code}}}} & : & \isa{attribute} \\
  2770   \end{matharray}
  2771 
  2772   \begin{railoutput}
  2773 \rail@begin{11}{}
  2774 \rail@bar
  2775 \rail@term{\hyperlink{command.code-module}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}module}}}}}[]
  2776 \rail@nextbar{1}
  2777 \rail@term{\hyperlink{command.code-library}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}library}}}}}[]
  2778 \rail@endbar
  2779 \rail@bar
  2780 \rail@nextbar{1}
  2781 \rail@nont{\isa{modespec}}[]
  2782 \rail@endbar
  2783 \rail@bar
  2784 \rail@nextbar{1}
  2785 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2786 \rail@endbar
  2787 \rail@cr{3}
  2788 \rail@bar
  2789 \rail@nextbar{4}
  2790 \rail@term{\isa{\isakeyword{file}}}[]
  2791 \rail@nont{\isa{name}}[]
  2792 \rail@endbar
  2793 \rail@bar
  2794 \rail@nextbar{4}
  2795 \rail@term{\isa{\isakeyword{imports}}}[]
  2796 \rail@plus
  2797 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2798 \rail@nextplus{5}
  2799 \rail@endplus
  2800 \rail@endbar
  2801 \rail@cr{7}
  2802 \rail@term{\isa{\isakeyword{contains}}}[]
  2803 \rail@bar
  2804 \rail@plus
  2805 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2806 \rail@term{\isa{{\isaliteral{3D}{\isacharequal}}}}[]
  2807 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  2808 \rail@nextplus{8}
  2809 \rail@endplus
  2810 \rail@nextbar{9}
  2811 \rail@plus
  2812 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  2813 \rail@nextplus{10}
  2814 \rail@endplus
  2815 \rail@endbar
  2816 \rail@end
  2817 \rail@begin{2}{\isa{modespec}}
  2818 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2819 \rail@plus
  2820 \rail@nextplus{1}
  2821 \rail@cnont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2822 \rail@endplus
  2823 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2824 \rail@end
  2825 \rail@begin{2}{}
  2826 \rail@term{\hyperlink{command.HOL.consts-code}{\mbox{\isa{\isacommand{consts{\isaliteral{5F}{\isacharunderscore}}code}}}}}[]
  2827 \rail@plus
  2828 \rail@nont{\isa{codespec}}[]
  2829 \rail@nextplus{1}
  2830 \rail@endplus
  2831 \rail@end
  2832 \rail@begin{2}{\isa{codespec}}
  2833 \rail@nont{\isa{const}}[]
  2834 \rail@nont{\isa{template}}[]
  2835 \rail@bar
  2836 \rail@nextbar{1}
  2837 \rail@nont{\isa{attachment}}[]
  2838 \rail@endbar
  2839 \rail@end
  2840 \rail@begin{2}{}
  2841 \rail@term{\hyperlink{command.HOL.types-code}{\mbox{\isa{\isacommand{types{\isaliteral{5F}{\isacharunderscore}}code}}}}}[]
  2842 \rail@plus
  2843 \rail@nont{\isa{tycodespec}}[]
  2844 \rail@nextplus{1}
  2845 \rail@endplus
  2846 \rail@end
  2847 \rail@begin{2}{\isa{tycodespec}}
  2848 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  2849 \rail@nont{\isa{template}}[]
  2850 \rail@bar
  2851 \rail@nextbar{1}
  2852 \rail@nont{\isa{attachment}}[]
  2853 \rail@endbar
  2854 \rail@end
  2855 \rail@begin{1}{\isa{const}}
  2856 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  2857 \rail@end
  2858 \rail@begin{1}{\isa{template}}
  2859 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  2860 \rail@nont{\hyperlink{syntax.string}{\mbox{\isa{string}}}}[]
  2861 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  2862 \rail@end
  2863 \rail@begin{2}{\isa{attachment}}
  2864 \rail@term{\isa{attach}}[]
  2865 \rail@bar
  2866 \rail@nextbar{1}
  2867 \rail@nont{\isa{modespec}}[]
  2868 \rail@endbar
  2869 \rail@term{\isa{{\isaliteral{7B}{\isacharbraceleft}}}}[]
  2870 \rail@nont{\hyperlink{syntax.text}{\mbox{\isa{text}}}}[]
  2871 \rail@term{\isa{{\isaliteral{7D}{\isacharbraceright}}}}[]
  2872 \rail@end
  2873 \rail@begin{2}{}
  2874 \rail@term{\hyperlink{attribute.code}{\mbox{\isa{code}}}}[]
  2875 \rail@bar
  2876 \rail@nextbar{1}
  2877 \rail@nont{\isa{name}}[]
  2878 \rail@endbar
  2879 \rail@end
  2880 \end{railoutput}%
  2881 \end{isamarkuptext}%
  2882 \isamarkuptrue%
  2883 %
  2884 \isamarkupsubsubsection{Invoking the code generator%
  2885 }
  2886 \isamarkuptrue%
  2887 %
  2888 \begin{isamarkuptext}%
  2889 The code generator is invoked via the \hyperlink{command.code-module}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}module}}}}
  2890   and \hyperlink{command.code-library}{\mbox{\isa{\isacommand{code{\isaliteral{5F}{\isacharunderscore}}library}}}} commands, which correspond to
  2891   \emph{incremental} and \emph{modular} code generation, respectively.
  2892 
  2893   \begin{description}
  2894 
  2895   \item [Modular] For each theory, an ML structure is generated,
  2896   containing the code generated from the constants defined in this
  2897   theory.
  2898 
  2899   \item [Incremental] All the generated code is emitted into the same
  2900   structure.  This structure may import code from previously generated
  2901   structures, which can be specified via \hyperlink{keyword.imports}{\mbox{\isa{\isakeyword{imports}}}}.
  2902   Moreover, the generated structure may also be referred to in later
  2903   invocations of the code generator.
  2904 
  2905   \end{description}
  2906 
  2907   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}}}}
  2908   keywords, the user may specify an optional list of ``modes'' in
  2909   parentheses. These can be used to instruct the code generator to
  2910   emit additional code for special purposes, e.g.\ functions for
  2911   converting elements of generated datatypes to Isabelle terms, or
  2912   test data generators. The list of modes is followed by a module
  2913   name.  The module name is optional for modular code generation, but
  2914   must be specified for incremental code generation.
  2915 
  2916   The code can either be written to a file, in which case a file name
  2917   has to be specified after the \hyperlink{keyword.file}{\mbox{\isa{\isakeyword{file}}}} keyword, or be loaded
  2918   directly into Isabelle's ML environment. In the latter case, the
  2919   \hyperlink{command.ML}{\mbox{\isa{\isacommand{ML}}}} theory command can be used to inspect the results
  2920   interactively, for example.
  2921 
  2922   The terms from which to generate code can be specified after the
  2923   \hyperlink{keyword.contains}{\mbox{\isa{\isakeyword{contains}}}} keyword, either as a list of bindings, or just
  2924   as a list of terms. In the latter case, the code generator just
  2925   produces code for all constants and types occuring in the term, but
  2926   does not bind the compiled terms to ML identifiers.
  2927 
  2928   Here is an example:%
  2929 \end{isamarkuptext}%
  2930 \isamarkuptrue%
  2931 \isacommand{code{\isaliteral{5F}{\isacharunderscore}}module}\isamarkupfalse%
  2932 \ Test\isanewline
  2933 \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}}%
  2934 \begin{isamarkuptext}%
  2935 \noindent This binds the result of compiling the given term to
  2936   the ML identifier \verb|Test.test|.%
  2937 \end{isamarkuptext}%
  2938 \isamarkuptrue%
  2939 %
  2940 \isadelimML
  2941 %
  2942 \endisadelimML
  2943 %
  2944 \isatagML
  2945 \isacommand{ML}\isamarkupfalse%
  2946 \ {\isaliteral{7B2A}{\isacharverbatimopen}}\ %
  2947 \isaantiq
  2948 assert{}%
  2949 \endisaantiq
  2950 \ {\isaliteral{28}{\isacharparenleft}}Test{\isaliteral{2E}{\isachardot}}test\ {\isaliteral{3D}{\isacharequal}}\ {\isadigit{1}}{\isadigit{5}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{2A7D}{\isacharverbatimclose}}%
  2951 \endisatagML
  2952 {\isafoldML}%
  2953 %
  2954 \isadelimML
  2955 %
  2956 \endisadelimML
  2957 %
  2958 \isamarkupsubsubsection{Configuring the code generator%
  2959 }
  2960 \isamarkuptrue%
  2961 %
  2962 \begin{isamarkuptext}%
  2963 When generating code for a complex term, the code generator
  2964   recursively calls itself for all subterms.  When it arrives at a
  2965   constant, the default strategy of the code generator is to look up
  2966   its definition and try to generate code for it.  Constants which
  2967   have no definitions that are immediately executable, may be
  2968   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
  2969   constant (given in usual term syntax -- an explicit type constraint
  2970   accounts for overloading), and a mixfix template describing the ML
  2971   code. The latter is very much the same as the mixfix templates used
  2972   when declaring new constants.  The most notable difference is that
  2973   terms may be included in the ML template using antiquotation
  2974   brackets \verb|{|\verb|*|~\isa{{\isaliteral{22}{\isachardoublequote}}{\isaliteral{2E}{\isachardot}}{\isaliteral{2E}{\isachardot}}{\isaliteral{2E}{\isachardot}}{\isaliteral{22}{\isachardoublequote}}}~\verb|*|\verb|}|.
  2975 
  2976   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.
  2977 
  2978   For example, the following declarations copied from \verb|~~/src/HOL/Product_Type.thy| describe how the product type of
  2979   Isabelle/HOL should be compiled to ML.%
  2980 \end{isamarkuptext}%
  2981 \isamarkuptrue%
  2982 \isacommand{typedecl}\isamarkupfalse%
  2983 \ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a{\isaliteral{2C}{\isacharcomma}}\ {\isaliteral{27}{\isacharprime}}b{\isaliteral{29}{\isacharparenright}}\ prod\isanewline
  2984 \isacommand{consts}\isamarkupfalse%
  2985 \ 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
  2986 \isanewline
  2987 \isacommand{types{\isaliteral{5F}{\isacharunderscore}}code}\isamarkupfalse%
  2988 \ 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
  2989 \isacommand{consts{\isaliteral{5F}{\isacharunderscore}}code}\isamarkupfalse%
  2990 \ 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}}%
  2991 \begin{isamarkuptext}%
  2992 Sometimes, the code associated with a constant or type may
  2993   need to refer to auxiliary functions, which have to be emitted when
  2994   the constant is used. Code for such auxiliary functions can be
  2995   declared using \hyperlink{keyword.attach}{\mbox{\isa{\isakeyword{attach}}}}. For example, the \isa{wfrec}
  2996   function can be implemented as follows:%
  2997 \end{isamarkuptext}%
  2998 \isamarkuptrue%
  2999 \isacommand{consts{\isaliteral{5F}{\isacharunderscore}}code}\isamarkupfalse%
  3000 \ wfrec\ \ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C6D6F64756C653E}{\isasymmodule}}wfrec{\isaliteral{3F}{\isacharquery}}{\isaliteral{22}{\isachardoublequoteclose}}{\isaliteral{29}{\isacharparenright}}\ \ \isanewline
  3001 \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}}%
  3002 \begin{isamarkuptext}%
  3003 If the code containing a call to \isa{wfrec} resides in an
  3004   ML structure different from the one containing the function
  3005   definition attached to \isa{wfrec}, the name of the ML structure
  3006   (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
  3007   the code generator should ignore the first argument of \isa{wfrec}, i.e.\ the termination relation, which is usually not
  3008   executable.
  3009 
  3010   \medskip Another possibility of configuring the code generator is to
  3011   register theorems to be used for code generation. Theorems can be
  3012   registered via the \hyperlink{attribute.code}{\mbox{\isa{code}}} attribute. It takes an optional
  3013   name as an argument, which indicates the format of the
  3014   theorem. Currently supported formats are equations (this is the
  3015   default when no name is specified) and horn clauses (this is
  3016   indicated by the name \texttt{ind}). The left-hand sides of
  3017   equations may only contain constructors and distinct variables,
  3018   whereas horn clauses must have the same format as introduction rules
  3019   of inductive definitions.
  3020 
  3021   The following example specifies three equations from which to
  3022   generate code for \isa{{\isaliteral{22}{\isachardoublequote}}op\ {\isaliteral{3C}{\isacharless}}{\isaliteral{22}{\isachardoublequote}}} on natural numbers (see also
  3023   \verb|~~/src/HOL/Nat.thy|).%
  3024 \end{isamarkuptext}%
  3025 \isamarkuptrue%
  3026 \isacommand{lemma}\isamarkupfalse%
  3027 \ {\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
  3028 \ \ \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
  3029 \ \ \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}}%
  3030 \isadelimproof
  3031 \ %
  3032 \endisadelimproof
  3033 %
  3034 \isatagproof
  3035 \isacommand{by}\isamarkupfalse%
  3036 \ simp{\isaliteral{5F}{\isacharunderscore}}all%
  3037 \endisatagproof
  3038 {\isafoldproof}%
  3039 %
  3040 \isadelimproof
  3041 %
  3042 \endisadelimproof
  3043 %
  3044 \isamarkupsubsubsection{Specific HOL code generators%
  3045 }
  3046 \isamarkuptrue%
  3047 %
  3048 \begin{isamarkuptext}%
  3049 The basic code generator framework offered by Isabelle/Pure
  3050   has already been extended with additional code generators for
  3051   specific HOL constructs. These include datatypes, recursive
  3052   functions and inductive relations. The code generator for inductive
  3053   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
  3054   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}}}'',
  3055   the above expression evaluates to a sequence of possible answers. If
  3056   all of the \isa{{\isaliteral{22}{\isachardoublequote}}t\isaliteral{5C3C5E7375623E}{}\isactrlsub i{\isaliteral{22}{\isachardoublequote}}} are proper terms, the expression evaluates
  3057   to a boolean value.
  3058 
  3059   The following example demonstrates this for beta-reduction on lambda
  3060   terms (see also \verb|~~/src/HOL/Proofs/Lambda/Lambda.thy|).%
  3061 \end{isamarkuptext}%
  3062 \isamarkuptrue%
  3063 \isacommand{datatype}\isamarkupfalse%
  3064 \ dB\ {\isaliteral{3D}{\isacharequal}}\isanewline
  3065 \ \ \ \ Var\ nat\isanewline
  3066 \ \ {\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
  3067 \ \ {\isaliteral{7C}{\isacharbar}}\ Abs\ dB\isanewline
  3068 \isanewline
  3069 \isacommand{primrec}\isamarkupfalse%
  3070 \ lift\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}dB\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ dB{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
  3071 \isakeyword{where}\isanewline
  3072 \ \ \ \ {\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
  3073 \ \ {\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
  3074 \ \ {\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
  3075 \isanewline
  3076 \isacommand{primrec}\isamarkupfalse%
  3077 \ 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
  3078 \isakeyword{where}\isanewline
  3079 \ \ \ \ {\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
  3080 \ \ \ \ \ \ {\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
  3081 \ \ {\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
  3082 \ \ {\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
  3083 \isanewline
  3084 \isacommand{inductive}\isamarkupfalse%
  3085 \ 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
  3086 \isakeyword{where}\isanewline
  3087 \ \ \ \ 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
  3088 \ \ {\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
  3089 \ \ {\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
  3090 \ \ {\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
  3091 \isanewline
  3092 \isacommand{code{\isaliteral{5F}{\isacharunderscore}}module}\isamarkupfalse%
  3093 \ Test\isanewline
  3094 \isakeyword{contains}\isanewline
  3095 \ \ 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
  3096 \ \ 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}}%
  3097 \begin{isamarkuptext}%
  3098 In the above example, \verb|Test.test1| evaluates to a boolean,
  3099   whereas \verb|Test.test2| is a lazy sequence whose elements can be
  3100   inspected separately.%
  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 \ Test{\isaliteral{2E}{\isachardot}}test{\isadigit{1}}\ {\isaliteral{2A7D}{\isacharverbatimclose}}\isanewline
  3115 \isacommand{ML}\isamarkupfalse%
  3116 \ {\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
  3117 \isacommand{ML}\isamarkupfalse%
  3118 \ {\isaliteral{7B2A}{\isacharverbatimopen}}\ %
  3119 \isaantiq
  3120 assert{}%
  3121 \endisaantiq
  3122 \ {\isaliteral{28}{\isacharparenleft}}length\ results\ {\isaliteral{3D}{\isacharequal}}\ {\isadigit{2}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{2A7D}{\isacharverbatimclose}}%
  3123 \endisatagML
  3124 {\isafoldML}%
  3125 %
  3126 \isadelimML
  3127 %
  3128 \endisadelimML
  3129 %
  3130 \begin{isamarkuptext}%
  3131 \medskip The theory underlying the HOL code generator is described
  3132   more detailed in \cite{Berghofer-Nipkow:2002}. More examples that
  3133   illustrate the usage of the code generator can be found e.g.\ in
  3134   \verb|~~/src/HOL/MicroJava/J/JListExample.thy| and \verb|~~/src/HOL/MicroJava/JVM/JVMListExample.thy|.%
  3135 \end{isamarkuptext}%
  3136 \isamarkuptrue%
  3137 %
  3138 \isamarkupsection{Definition by specification \label{sec:hol-specification}%
  3139 }
  3140 \isamarkuptrue%
  3141 %
  3142 \begin{isamarkuptext}%
  3143 \begin{matharray}{rcl}
  3144     \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}}} \\
  3145     \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}}} \\
  3146   \end{matharray}
  3147 
  3148   \begin{railoutput}
  3149 \rail@begin{6}{}
  3150 \rail@bar
  3151 \rail@term{\hyperlink{command.HOL.specification}{\mbox{\isa{\isacommand{specification}}}}}[]
  3152 \rail@nextbar{1}
  3153 \rail@term{\hyperlink{command.HOL.ax-specification}{\mbox{\isa{\isacommand{ax{\isaliteral{5F}{\isacharunderscore}}specification}}}}}[]
  3154 \rail@endbar
  3155 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  3156 \rail@plus
  3157 \rail@nont{\isa{decl}}[]
  3158 \rail@nextplus{1}
  3159 \rail@endplus
  3160 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  3161 \rail@cr{3}
  3162 \rail@plus
  3163 \rail@bar
  3164 \rail@nextbar{4}
  3165 \rail@nont{\hyperlink{syntax.thmdecl}{\mbox{\isa{thmdecl}}}}[]
  3166 \rail@endbar
  3167 \rail@nont{\hyperlink{syntax.prop}{\mbox{\isa{prop}}}}[]
  3168 \rail@nextplus{5}
  3169 \rail@endplus
  3170 \rail@end
  3171 \rail@begin{2}{\isa{decl}}
  3172 \rail@bar
  3173 \rail@nextbar{1}
  3174 \rail@nont{\hyperlink{syntax.name}{\mbox{\isa{name}}}}[]
  3175 \rail@term{\isa{{\isaliteral{3A}{\isacharcolon}}}}[]
  3176 \rail@endbar
  3177 \rail@nont{\hyperlink{syntax.term}{\mbox{\isa{term}}}}[]
  3178 \rail@term{\isa{{\isaliteral{28}{\isacharparenleft}}}}[]
  3179 \rail@term{\isa{\isakeyword{overloaded}}}[]
  3180 \rail@bar
  3181 \rail@nextbar{1}
  3182 \rail@term{\isa{{\isaliteral{29}{\isacharparenright}}}}[]
  3183 \rail@endbar
  3184 \rail@end
  3185 \end{railoutput}
  3186 
  3187 
  3188   \begin{description}
  3189 
  3190   \item \hyperlink{command.HOL.specification}{\mbox{\isa{\isacommand{specification}}}}~\isa{{\isaliteral{22}{\isachardoublequote}}decls\ {\isaliteral{5C3C7068693E}{\isasymphi}}{\isaliteral{22}{\isachardoublequote}}} sets up a
  3191   goal stating the existence of terms with the properties specified to
  3192   hold for the constants given in \isa{decls}.  After finishing the
  3193   proof, the theory will be augmented with definitions for the given
  3194   constants, as well as with theorems stating the properties for these
  3195   constants.
  3196 
  3197   \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
  3198   a goal stating the existence of terms with the properties specified
  3199   to hold for the constants given in \isa{decls}.  After finishing
  3200   the proof, the theory will be augmented with axioms expressing the
  3201   properties given in the first place.
  3202 
  3203   \item \isa{decl} declares a constant to be defined by the
  3204   specification given.  The definition for the constant \isa{c} is
  3205   bound to the name \isa{c{\isaliteral{5F}{\isacharunderscore}}def} unless a theorem name is given in
  3206   the declaration.  Overloaded constants should be declared as such.
  3207 
  3208   \end{description}
  3209 
  3210   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
  3211   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
  3212   user has explicitly proven it to be safe.  A practical issue must be
  3213   considered, though: After introducing two constants with the same
  3214   properties using \hyperlink{command.HOL.specification}{\mbox{\isa{\isacommand{specification}}}}, one can prove
  3215   that the two constants are, in fact, equal.  If this might be a
  3216   problem, one should use \hyperlink{command.HOL.ax-specification}{\mbox{\isa{\isacommand{ax{\isaliteral{5F}{\isacharunderscore}}specification}}}}.%
  3217 \end{isamarkuptext}%
  3218 \isamarkuptrue%
  3219 %
  3220 \isadelimtheory
  3221 %
  3222 \endisadelimtheory
  3223 %
  3224 \isatagtheory
  3225 \isacommand{end}\isamarkupfalse%
  3226 %
  3227 \endisatagtheory
  3228 {\isafoldtheory}%
  3229 %
  3230 \isadelimtheory
  3231 %
  3232 \endisadelimtheory
  3233 \isanewline
  3234 \end{isabellebody}%
  3235 %%% Local Variables:
  3236 %%% mode: latex
  3237 %%% TeX-master: "root"
  3238 %%% End: