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