| 28762 |      1 | %
 | 
|  |      2 | \begin{isabellebody}%
 | 
|  |      3 | \def\isabellecontext{Inner{\isacharunderscore}Syntax}%
 | 
|  |      4 | %
 | 
|  |      5 | \isadelimtheory
 | 
|  |      6 | %
 | 
|  |      7 | \endisadelimtheory
 | 
|  |      8 | %
 | 
|  |      9 | \isatagtheory
 | 
|  |     10 | \isacommand{theory}\isamarkupfalse%
 | 
|  |     11 | \ Inner{\isacharunderscore}Syntax\isanewline
 | 
|  |     12 | \isakeyword{imports}\ Main\isanewline
 | 
|  |     13 | \isakeyword{begin}%
 | 
|  |     14 | \endisatagtheory
 | 
|  |     15 | {\isafoldtheory}%
 | 
|  |     16 | %
 | 
|  |     17 | \isadelimtheory
 | 
|  |     18 | %
 | 
|  |     19 | \endisadelimtheory
 | 
|  |     20 | %
 | 
|  |     21 | \isamarkupchapter{Inner syntax --- the term language \label{ch:inner-syntax}%
 | 
|  |     22 | }
 | 
|  |     23 | \isamarkuptrue%
 | 
|  |     24 | %
 | 
|  |     25 | \isamarkupsection{Printing logical entities%
 | 
|  |     26 | }
 | 
|  |     27 | \isamarkuptrue%
 | 
|  |     28 | %
 | 
|  |     29 | \isamarkupsubsection{Diagnostic commands%
 | 
|  |     30 | }
 | 
|  |     31 | \isamarkuptrue%
 | 
|  |     32 | %
 | 
|  |     33 | \begin{isamarkuptext}%
 | 
|  |     34 | \begin{matharray}{rcl}
 | 
|  |     35 |     \indexdef{}{command}{typ}\hypertarget{command.typ}{\hyperlink{command.typ}{\mbox{\isa{\isacommand{typ}}}}}\isa{{\isachardoublequote}\isactrlsup {\isacharasterisk}{\isachardoublequote}} & : & \isa{{\isachardoublequote}context\ {\isasymrightarrow}{\isachardoublequote}} \\
 | 
|  |     36 |     \indexdef{}{command}{term}\hypertarget{command.term}{\hyperlink{command.term}{\mbox{\isa{\isacommand{term}}}}}\isa{{\isachardoublequote}\isactrlsup {\isacharasterisk}{\isachardoublequote}} & : & \isa{{\isachardoublequote}context\ {\isasymrightarrow}{\isachardoublequote}} \\
 | 
|  |     37 |     \indexdef{}{command}{prop}\hypertarget{command.prop}{\hyperlink{command.prop}{\mbox{\isa{\isacommand{prop}}}}}\isa{{\isachardoublequote}\isactrlsup {\isacharasterisk}{\isachardoublequote}} & : & \isa{{\isachardoublequote}context\ {\isasymrightarrow}{\isachardoublequote}} \\
 | 
|  |     38 |     \indexdef{}{command}{thm}\hypertarget{command.thm}{\hyperlink{command.thm}{\mbox{\isa{\isacommand{thm}}}}}\isa{{\isachardoublequote}\isactrlsup {\isacharasterisk}{\isachardoublequote}} & : & \isa{{\isachardoublequote}context\ {\isasymrightarrow}{\isachardoublequote}} \\
 | 
|  |     39 |     \indexdef{}{command}{prf}\hypertarget{command.prf}{\hyperlink{command.prf}{\mbox{\isa{\isacommand{prf}}}}}\isa{{\isachardoublequote}\isactrlsup {\isacharasterisk}{\isachardoublequote}} & : & \isa{{\isachardoublequote}context\ {\isasymrightarrow}{\isachardoublequote}} \\
 | 
|  |     40 |     \indexdef{}{command}{full\_prf}\hypertarget{command.full-prf}{\hyperlink{command.full-prf}{\mbox{\isa{\isacommand{full{\isacharunderscore}prf}}}}}\isa{{\isachardoublequote}\isactrlsup {\isacharasterisk}{\isachardoublequote}} & : & \isa{{\isachardoublequote}context\ {\isasymrightarrow}{\isachardoublequote}} \\
 | 
|  |     41 |     \indexdef{}{command}{pr}\hypertarget{command.pr}{\hyperlink{command.pr}{\mbox{\isa{\isacommand{pr}}}}}\isa{{\isachardoublequote}\isactrlsup {\isacharasterisk}{\isachardoublequote}} & : & \isa{{\isachardoublequote}any\ {\isasymrightarrow}{\isachardoublequote}} \\
 | 
|  |     42 |   \end{matharray}
 | 
|  |     43 | 
 | 
|  |     44 |   These diagnostic commands assist interactive development by printing
 | 
|  |     45 |   internal logical entities in a human-readable fashion.
 | 
|  |     46 | 
 | 
|  |     47 |   \begin{rail}
 | 
|  |     48 |     'typ' modes? type
 | 
|  |     49 |     ;
 | 
|  |     50 |     'term' modes? term
 | 
|  |     51 |     ;
 | 
|  |     52 |     'prop' modes? prop
 | 
|  |     53 |     ;
 | 
|  |     54 |     'thm' modes? thmrefs
 | 
|  |     55 |     ;
 | 
|  |     56 |     ( 'prf' | 'full\_prf' ) modes? thmrefs?
 | 
|  |     57 |     ;
 | 
|  |     58 |     'pr' modes? nat? (',' nat)?
 | 
|  |     59 |     ;
 | 
|  |     60 | 
 | 
|  |     61 |     modes: '(' (name + ) ')'
 | 
|  |     62 |     ;
 | 
|  |     63 |   \end{rail}
 | 
|  |     64 | 
 | 
|  |     65 |   \begin{description}
 | 
|  |     66 | 
 | 
|  |     67 |   \item \hyperlink{command.typ}{\mbox{\isa{\isacommand{typ}}}}~\isa{{\isasymtau}} reads and prints types of the
 | 
|  |     68 |   meta-logic according to the current theory or proof context.
 | 
|  |     69 | 
 | 
|  |     70 |   \item \hyperlink{command.term}{\mbox{\isa{\isacommand{term}}}}~\isa{t} and \hyperlink{command.prop}{\mbox{\isa{\isacommand{prop}}}}~\isa{{\isasymphi}}
 | 
|  |     71 |   read, type-check and print terms or propositions according to the
 | 
|  |     72 |   current theory or proof context; the inferred type of \isa{t} is
 | 
|  |     73 |   output as well.  Note that these commands are also useful in
 | 
|  |     74 |   inspecting the current environment of term abbreviations.
 | 
|  |     75 | 
 | 
|  |     76 |   \item \hyperlink{command.thm}{\mbox{\isa{\isacommand{thm}}}}~\isa{{\isachardoublequote}a\isactrlsub {\isadigit{1}}\ {\isasymdots}\ a\isactrlsub n{\isachardoublequote}} retrieves
 | 
|  |     77 |   theorems from the current theory or proof context.  Note that any
 | 
|  |     78 |   attributes included in the theorem specifications are applied to a
 | 
|  |     79 |   temporary context derived from the current theory or proof; the
 | 
|  |     80 |   result is discarded, i.e.\ attributes involved in \isa{{\isachardoublequote}a\isactrlsub {\isadigit{1}}{\isacharcomma}\ {\isasymdots}{\isacharcomma}\ a\isactrlsub n{\isachardoublequote}} do not have any permanent effect.
 | 
|  |     81 | 
 | 
|  |     82 |   \item \hyperlink{command.prf}{\mbox{\isa{\isacommand{prf}}}} displays the (compact) proof term of the
 | 
|  |     83 |   current proof state (if present), or of the given theorems. Note
 | 
|  |     84 |   that this requires proof terms to be switched on for the current
 | 
|  |     85 |   object logic (see the ``Proof terms'' section of the Isabelle
 | 
|  |     86 |   reference manual for information on how to do this).
 | 
|  |     87 | 
 | 
|  |     88 |   \item \hyperlink{command.full-prf}{\mbox{\isa{\isacommand{full{\isacharunderscore}prf}}}} is like \hyperlink{command.prf}{\mbox{\isa{\isacommand{prf}}}}, but displays
 | 
|  |     89 |   the full proof term, i.e.\ also displays information omitted in the
 | 
|  |     90 |   compact proof term, which is denoted by ``\isa{{\isacharunderscore}}'' placeholders
 | 
|  |     91 |   there.
 | 
|  |     92 | 
 | 
|  |     93 |   \item \hyperlink{command.pr}{\mbox{\isa{\isacommand{pr}}}}~\isa{{\isachardoublequote}goals{\isacharcomma}\ prems{\isachardoublequote}} prints the current
 | 
|  |     94 |   proof state (if present), including the proof context, current facts
 | 
|  |     95 |   and goals.  The optional limit arguments affect the number of goals
 | 
|  |     96 |   and premises to be displayed, which is initially 10 for both.
 | 
|  |     97 |   Omitting limit values leaves the current setting unchanged.
 | 
|  |     98 | 
 | 
|  |     99 |   \end{description}
 | 
|  |    100 | 
 | 
|  |    101 |   All of the diagnostic commands above admit a list of \isa{modes}
 | 
|  |    102 |   to be specified, which is appended to the current print mode (see
 | 
|  |    103 |   also \cite{isabelle-ref}).  Thus the output behavior may be modified
 | 
|  |    104 |   according particular print mode features.  For example, \hyperlink{command.pr}{\mbox{\isa{\isacommand{pr}}}}~\isa{{\isachardoublequote}{\isacharparenleft}latex\ xsymbols{\isacharparenright}{\isachardoublequote}} would print the current proof state
 | 
|  |    105 |   with mathematical symbols and special characters represented in
 | 
|  |    106 |   {\LaTeX} source, according to the Isabelle style
 | 
|  |    107 |   \cite{isabelle-sys}.
 | 
|  |    108 | 
 | 
|  |    109 |   Note that antiquotations (cf.\ \secref{sec:antiq}) provide a more
 | 
|  |    110 |   systematic way to include formal items into the printed text
 | 
|  |    111 |   document.%
 | 
|  |    112 | \end{isamarkuptext}%
 | 
|  |    113 | \isamarkuptrue%
 | 
|  |    114 | %
 | 
|  |    115 | \isamarkupsubsection{Details of printed content%
 | 
|  |    116 | }
 | 
|  |    117 | \isamarkuptrue%
 | 
|  |    118 | %
 | 
|  |    119 | \begin{isamarkuptext}%
 | 
|  |    120 | \begin{mldecls} 
 | 
| 30121 |    121 |     \indexdef{}{ML}{show\_types}\verb|show_types: bool ref| & default \verb|false| \\
 | 
|  |    122 |     \indexdef{}{ML}{show\_sorts}\verb|show_sorts: bool ref| & default \verb|false| \\
 | 
|  |    123 |     \indexdef{}{ML}{show\_consts}\verb|show_consts: bool ref| & default \verb|false| \\
 | 
|  |    124 |     \indexdef{}{ML}{long\_names}\verb|long_names: bool ref| & default \verb|false| \\
 | 
|  |    125 |     \indexdef{}{ML}{short\_names}\verb|short_names: bool ref| & default \verb|false| \\
 | 
|  |    126 |     \indexdef{}{ML}{unique\_names}\verb|unique_names: bool ref| & default \verb|true| \\
 | 
|  |    127 |     \indexdef{}{ML}{show\_brackets}\verb|show_brackets: bool ref| & default \verb|false| \\
 | 
|  |    128 |     \indexdef{}{ML}{eta\_contract}\verb|eta_contract: bool ref| & default \verb|true| \\
 | 
|  |    129 |     \indexdef{}{ML}{goals\_limit}\verb|goals_limit: int ref| & default \verb|10| \\
 | 
|  |    130 |     \indexdef{}{ML}{Proof.show\_main\_goal}\verb|Proof.show_main_goal: bool ref| & default \verb|false| \\
 | 
|  |    131 |     \indexdef{}{ML}{show\_hyps}\verb|show_hyps: bool ref| & default \verb|false| \\
 | 
|  |    132 |     \indexdef{}{ML}{show\_tags}\verb|show_tags: bool ref| & default \verb|false| \\
 | 
|  |    133 |     \indexdef{}{ML}{show\_question\_marks}\verb|show_question_marks: bool ref| & default \verb|true| \\
 | 
| 28762 |    134 |   \end{mldecls}
 | 
|  |    135 | 
 | 
|  |    136 |   These global ML variables control the detail of information that is
 | 
|  |    137 |   displayed for types, terms, theorems, goals etc.
 | 
|  |    138 | 
 | 
|  |    139 |   In interactive sessions, the user interface usually manages these
 | 
|  |    140 |   global parameters of the Isabelle process, even with some concept of
 | 
|  |    141 |   persistence.  Nonetheless it is occasionally useful to manipulate ML
 | 
|  |    142 |   variables directly, e.g.\ using \hyperlink{command.ML-val}{\mbox{\isa{\isacommand{ML{\isacharunderscore}val}}}} or \hyperlink{command.ML-command}{\mbox{\isa{\isacommand{ML{\isacharunderscore}command}}}}.
 | 
|  |    143 | 
 | 
|  |    144 |   Batch-mode logic sessions may be configured by putting appropriate
 | 
|  |    145 |   ML text directly into the \verb|ROOT.ML| file.
 | 
|  |    146 | 
 | 
|  |    147 |   \begin{description}
 | 
|  |    148 | 
 | 
|  |    149 |   \item \verb|show_types| and \verb|show_sorts| control printing of type
 | 
|  |    150 |   constraints for term variables, and sort constraints for type
 | 
|  |    151 |   variables.  By default, neither of these are shown in output.  If
 | 
|  |    152 |   \verb|show_sorts| is set to \verb|true|, types are always shown as
 | 
|  |    153 |   well.
 | 
|  |    154 | 
 | 
|  |    155 |   Note that displaying types and sorts may explain why a polymorphic
 | 
|  |    156 |   inference rule fails to resolve with some goal, or why a rewrite
 | 
|  |    157 |   rule does not apply as expected.
 | 
|  |    158 | 
 | 
|  |    159 |   \item \verb|show_consts| controls printing of types of constants when
 | 
|  |    160 |   displaying a goal state.
 | 
|  |    161 | 
 | 
|  |    162 |   Note that the output can be enormous, because polymorphic constants
 | 
|  |    163 |   often occur at several different type instances.
 | 
|  |    164 | 
 | 
|  |    165 |   \item \verb|long_names|, \verb|short_names|, and \verb|unique_names|
 | 
|  |    166 |   control the way of printing fully qualified internal names in
 | 
|  |    167 |   external form.  See also \secref{sec:antiq} for the document
 | 
|  |    168 |   antiquotation options of the same names.
 | 
|  |    169 | 
 | 
|  |    170 |   \item \verb|show_brackets| controls bracketing in pretty printed
 | 
|  |    171 |   output.  If set to \verb|true|, all sub-expressions of the pretty
 | 
|  |    172 |   printing tree will be parenthesized, even if this produces malformed
 | 
|  |    173 |   term syntax!  This crude way of showing the internal structure of
 | 
|  |    174 |   pretty printed entities may occasionally help to diagnose problems
 | 
|  |    175 |   with operator priorities, for example.
 | 
|  |    176 | 
 | 
|  |    177 |   \item \verb|eta_contract| controls \isa{{\isachardoublequote}{\isasymeta}{\isachardoublequote}}-contracted printing of
 | 
|  |    178 |   terms.
 | 
|  |    179 | 
 | 
|  |    180 |   The \isa{{\isasymeta}}-contraction law asserts \isa{{\isachardoublequote}{\isacharparenleft}{\isasymlambda}x{\isachardot}\ f\ x{\isacharparenright}\ {\isasymequiv}\ f{\isachardoublequote}},
 | 
|  |    181 |   provided \isa{x} is not free in \isa{f}.  It asserts
 | 
|  |    182 |   \emph{extensionality} of functions: \isa{{\isachardoublequote}f\ {\isasymequiv}\ g{\isachardoublequote}} if \isa{{\isachardoublequote}f\ x\ {\isasymequiv}\ g\ x{\isachardoublequote}} for all \isa{x}.  Higher-order unification frequently puts
 | 
|  |    183 |   terms into a fully \isa{{\isasymeta}}-expanded form.  For example, if \isa{F} has type \isa{{\isachardoublequote}{\isacharparenleft}{\isasymtau}\ {\isasymRightarrow}\ {\isasymtau}{\isacharparenright}\ {\isasymRightarrow}\ {\isasymtau}{\isachardoublequote}} then its expanded form is \isa{{\isachardoublequote}{\isasymlambda}h{\isachardot}\ F\ {\isacharparenleft}{\isasymlambda}x{\isachardot}\ h\ x{\isacharparenright}{\isachardoublequote}}.
 | 
|  |    184 | 
 | 
|  |    185 |   Setting \verb|eta_contract| makes Isabelle perform \isa{{\isasymeta}}-contractions before printing, so that \isa{{\isachardoublequote}{\isasymlambda}h{\isachardot}\ F\ {\isacharparenleft}{\isasymlambda}x{\isachardot}\ h\ x{\isacharparenright}{\isachardoublequote}}
 | 
|  |    186 |   appears simply as \isa{F}.
 | 
|  |    187 | 
 | 
|  |    188 |   Note that the distinction between a term and its \isa{{\isasymeta}}-expanded
 | 
|  |    189 |   form occasionally matters.  While higher-order resolution and
 | 
|  |    190 |   rewriting operate modulo \isa{{\isachardoublequote}{\isasymalpha}{\isasymbeta}{\isasymeta}{\isachardoublequote}}-conversion, some other tools
 | 
|  |    191 |   might look at terms more discretely.
 | 
|  |    192 | 
 | 
|  |    193 |   \item \verb|goals_limit| controls the maximum number of subgoals to
 | 
|  |    194 |   be shown in goal output.
 | 
|  |    195 | 
 | 
|  |    196 |   \item \verb|Proof.show_main_goal| controls whether the main result to
 | 
|  |    197 |   be proven should be displayed.  This information might be relevant
 | 
|  |    198 |   for schematic goals, to inspect the current claim that has been
 | 
|  |    199 |   synthesized so far.
 | 
|  |    200 | 
 | 
|  |    201 |   \item \verb|show_hyps| controls printing of implicit hypotheses of
 | 
|  |    202 |   local facts.  Normally, only those hypotheses are displayed that are
 | 
|  |    203 |   \emph{not} covered by the assumptions of the current context: this
 | 
|  |    204 |   situation indicates a fault in some tool being used.
 | 
|  |    205 | 
 | 
|  |    206 |   By setting \verb|show_hyps| to \verb|true|, output of \emph{all}
 | 
|  |    207 |   hypotheses can be enforced, which is occasionally useful for
 | 
|  |    208 |   diagnostic purposes.
 | 
|  |    209 | 
 | 
|  |    210 |   \item \verb|show_tags| controls printing of extra annotations within
 | 
|  |    211 |   theorems, such as internal position information, or the case names
 | 
|  |    212 |   being attached by the attribute \hyperlink{attribute.case-names}{\mbox{\isa{case{\isacharunderscore}names}}}.
 | 
|  |    213 | 
 | 
|  |    214 |   Note that the \hyperlink{attribute.tagged}{\mbox{\isa{tagged}}} and \hyperlink{attribute.untagged}{\mbox{\isa{untagged}}}
 | 
|  |    215 |   attributes provide low-level access to the collection of tags
 | 
|  |    216 |   associated with a theorem.
 | 
|  |    217 | 
 | 
|  |    218 |   \item \verb|show_question_marks| controls printing of question marks
 | 
|  |    219 |   for schematic variables, such as \isa{{\isacharquery}x}.  Only the leading
 | 
|  |    220 |   question mark is affected, the remaining text is unchanged
 | 
|  |    221 |   (including proper markup for schematic variables that might be
 | 
|  |    222 |   relevant for user interfaces).
 | 
|  |    223 | 
 | 
|  |    224 |   \end{description}%
 | 
|  |    225 | \end{isamarkuptext}%
 | 
|  |    226 | \isamarkuptrue%
 | 
|  |    227 | %
 | 
|  |    228 | \isamarkupsubsection{Printing limits%
 | 
|  |    229 | }
 | 
|  |    230 | \isamarkuptrue%
 | 
|  |    231 | %
 | 
|  |    232 | \begin{isamarkuptext}%
 | 
|  |    233 | \begin{mldecls}
 | 
| 30121 |    234 |     \indexdef{}{ML}{Pretty.setdepth}\verb|Pretty.setdepth: int -> unit| \\
 | 
|  |    235 |     \indexdef{}{ML}{Pretty.setmargin}\verb|Pretty.setmargin: int -> unit| \\
 | 
|  |    236 |     \indexdef{}{ML}{print\_depth}\verb|print_depth: int -> unit| \\
 | 
| 28762 |    237 |   \end{mldecls}
 | 
|  |    238 | 
 | 
|  |    239 |   These ML functions set limits for pretty printed text.
 | 
|  |    240 | 
 | 
|  |    241 |   \begin{description}
 | 
|  |    242 | 
 | 
|  |    243 |   \item \verb|Pretty.setdepth|~\isa{d} tells the pretty printer to
 | 
|  |    244 |   limit the printing depth to \isa{d}.  This affects the display of
 | 
|  |    245 |   types, terms, theorems etc.  The default value is 0, which permits
 | 
|  |    246 |   printing to an arbitrary depth.  Other useful values for \isa{d}
 | 
|  |    247 |   are 10 and 20.
 | 
|  |    248 | 
 | 
|  |    249 |   \item \verb|Pretty.setmargin|~\isa{m} tells the pretty printer to
 | 
|  |    250 |   assume a right margin (page width) of \isa{m}.  The initial margin
 | 
|  |    251 |   is 76, but user interfaces might adapt the margin automatically when
 | 
|  |    252 |   resizing windows.
 | 
|  |    253 | 
 | 
|  |    254 |   \item \verb|print_depth|~\isa{n} limits the printing depth of the
 | 
|  |    255 |   ML toplevel pretty printer; the precise effect depends on the ML
 | 
|  |    256 |   compiler and run-time system.  Typically \isa{n} should be less
 | 
|  |    257 |   than 10.  Bigger values such as 100--1000 are useful for debugging.
 | 
|  |    258 | 
 | 
|  |    259 |   \end{description}%
 | 
|  |    260 | \end{isamarkuptext}%
 | 
|  |    261 | \isamarkuptrue%
 | 
|  |    262 | %
 | 
|  |    263 | \isamarkupsection{Mixfix annotations%
 | 
|  |    264 | }
 | 
|  |    265 | \isamarkuptrue%
 | 
|  |    266 | %
 | 
|  |    267 | \begin{isamarkuptext}%
 | 
|  |    268 | Mixfix annotations specify concrete \emph{inner syntax} of
 | 
|  |    269 |   Isabelle types and terms.  Some commands such as \hyperlink{command.typedecl}{\mbox{\isa{\isacommand{typedecl}}}} admit infixes only, while \hyperlink{command.definition}{\mbox{\isa{\isacommand{definition}}}} etc.\
 | 
|  |    270 |   support the full range of general mixfixes and binders.  Fixed
 | 
|  |    271 |   parameters in toplevel theorem statements, locale specifications
 | 
|  |    272 |   also admit mixfix annotations.
 | 
|  |    273 | 
 | 
|  |    274 |   \indexouternonterm{infix}\indexouternonterm{mixfix}\indexouternonterm{structmixfix}
 | 
|  |    275 |   \begin{rail}
 | 
|  |    276 |     infix: '(' ('infix' | 'infixl' | 'infixr') string nat ')'
 | 
|  |    277 |     ;
 | 
|  |    278 |     mixfix: infix | '(' string prios? nat? ')' | '(' 'binder' string prios? nat ')'
 | 
|  |    279 |     ;
 | 
|  |    280 |     structmixfix: mixfix | '(' 'structure' ')'
 | 
|  |    281 |     ;
 | 
|  |    282 | 
 | 
|  |    283 |     prios: '[' (nat + ',') ']'
 | 
|  |    284 |     ;
 | 
|  |    285 |   \end{rail}
 | 
|  |    286 | 
 | 
|  |    287 |   Here the \railtok{string} specifications refer to the actual mixfix
 | 
|  |    288 |   template, which may include literal text, spacing, blocks, and
 | 
|  |    289 |   arguments (denoted by ``\isa{{\isacharunderscore}}''); the special symbol
 | 
|  |    290 |   ``\verb|\<index>|'' (printed as ``\isa{{\isachardoublequote}{\isasymindex}{\isachardoublequote}}'') represents an index
 | 
|  |    291 |   argument that specifies an implicit structure reference (see also
 | 
|  |    292 |   \secref{sec:locale}).  Infix and binder declarations provide common
 | 
|  |    293 |   abbreviations for particular mixfix declarations.  So in practice,
 | 
|  |    294 |   mixfix templates mostly degenerate to literal text for concrete
 | 
|  |    295 |   syntax, such as ``\verb|++|'' for an infix symbol.
 | 
|  |    296 | 
 | 
|  |    297 |   \medskip In full generality, mixfix declarations work as follows.
 | 
|  |    298 |   Suppose a constant \isa{{\isachardoublequote}c\ {\isacharcolon}{\isacharcolon}\ {\isasymtau}\isactrlsub {\isadigit{1}}\ {\isasymRightarrow}\ {\isasymdots}\ {\isasymtau}\isactrlsub n\ {\isasymRightarrow}\ {\isasymtau}{\isachardoublequote}} is
 | 
|  |    299 |   annotated by \isa{{\isachardoublequote}{\isacharparenleft}mixfix\ {\isacharbrackleft}p\isactrlsub {\isadigit{1}}{\isacharcomma}\ {\isasymdots}{\isacharcomma}\ p\isactrlsub n{\isacharbrackright}\ p{\isacharparenright}{\isachardoublequote}}, where \isa{{\isachardoublequote}mixfix{\isachardoublequote}} is a string \isa{{\isachardoublequote}d\isactrlsub {\isadigit{0}}\ {\isacharunderscore}\ d\isactrlsub {\isadigit{1}}\ {\isacharunderscore}\ {\isasymdots}\ {\isacharunderscore}\ d\isactrlsub n{\isachardoublequote}} consisting of
 | 
|  |    300 |   delimiters that surround argument positions as indicated by
 | 
|  |    301 |   underscores.
 | 
|  |    302 | 
 | 
|  |    303 |   Altogether this determines a production for a context-free priority
 | 
|  |    304 |   grammar, where for each argument \isa{{\isachardoublequote}i{\isachardoublequote}} the syntactic category
 | 
|  |    305 |   is determined by \isa{{\isachardoublequote}{\isasymtau}\isactrlsub i{\isachardoublequote}} (with priority \isa{{\isachardoublequote}p\isactrlsub i{\isachardoublequote}}), and
 | 
|  |    306 |   the result category is determined from \isa{{\isachardoublequote}{\isasymtau}{\isachardoublequote}} (with
 | 
|  |    307 |   priority \isa{{\isachardoublequote}p{\isachardoublequote}}).  Priority specifications are optional, with
 | 
|  |    308 |   default 0 for arguments and 1000 for the result.
 | 
|  |    309 | 
 | 
|  |    310 |   Since \isa{{\isachardoublequote}{\isasymtau}{\isachardoublequote}} may be again a function type, the constant
 | 
|  |    311 |   type scheme may have more argument positions than the mixfix
 | 
|  |    312 |   pattern.  Printing a nested application \isa{{\isachardoublequote}c\ t\isactrlsub {\isadigit{1}}\ {\isasymdots}\ t\isactrlsub m{\isachardoublequote}} for
 | 
|  |    313 |   \isa{{\isachardoublequote}m\ {\isachargreater}\ n{\isachardoublequote}} works by attaching concrete notation only to the
 | 
|  |    314 |   innermost part, essentially by printing \isa{{\isachardoublequote}{\isacharparenleft}c\ t\isactrlsub {\isadigit{1}}\ {\isasymdots}\ t\isactrlsub n{\isacharparenright}\ {\isasymdots}\ t\isactrlsub m{\isachardoublequote}}
 | 
|  |    315 |   instead.  If a term has fewer arguments than specified in the mixfix
 | 
|  |    316 |   template, the concrete syntax is ignored.
 | 
|  |    317 | 
 | 
|  |    318 |   \medskip A mixfix template may also contain additional directives
 | 
|  |    319 |   for pretty printing, notably spaces, blocks, and breaks.  The
 | 
|  |    320 |   general template format is a sequence over any of the following
 | 
|  |    321 |   entities.
 | 
|  |    322 | 
 | 
|  |    323 |   \begin{description}
 | 
|  |    324 | 
 | 
|  |    325 |   \item \isa{{\isachardoublequote}d{\isachardoublequote}} is a delimiter, namely a non-empty sequence of
 | 
|  |    326 |   characters other than the following special characters:
 | 
|  |    327 | 
 | 
|  |    328 |   \smallskip
 | 
|  |    329 |   \begin{tabular}{ll}
 | 
|  |    330 |     \verb|'| & single quote \\
 | 
|  |    331 |     \verb|_| & underscore \\
 | 
|  |    332 |     \isa{{\isachardoublequote}{\isasymindex}{\isachardoublequote}} & index symbol \\
 | 
|  |    333 |     \verb|(| & open parenthesis \\
 | 
|  |    334 |     \verb|)| & close parenthesis \\
 | 
|  |    335 |     \verb|/| & slash \\
 | 
|  |    336 |   \end{tabular}
 | 
|  |    337 |   \medskip
 | 
|  |    338 | 
 | 
|  |    339 |   \item \verb|'| escapes the special meaning of these
 | 
|  |    340 |   meta-characters, producing a literal version of the following
 | 
|  |    341 |   character, unless that is a blank.
 | 
|  |    342 | 
 | 
|  |    343 |   A single quote followed by a blank separates delimiters, without
 | 
|  |    344 |   affecting printing, but input tokens may have additional white space
 | 
|  |    345 |   here.
 | 
|  |    346 | 
 | 
|  |    347 |   \item \verb|_| is an argument position, which stands for a
 | 
|  |    348 |   certain syntactic category in the underlying grammar.
 | 
|  |    349 | 
 | 
|  |    350 |   \item \isa{{\isachardoublequote}{\isasymindex}{\isachardoublequote}} is an indexed argument position; this is the place
 | 
|  |    351 |   where implicit structure arguments can be attached.
 | 
|  |    352 | 
 | 
|  |    353 |   \item \isa{{\isachardoublequote}s{\isachardoublequote}} is a non-empty sequence of spaces for printing.
 | 
|  |    354 |   This and the following specifications do not affect parsing at all.
 | 
|  |    355 | 
 | 
|  |    356 |   \item \verb|(|\isa{n} opens a pretty printing block.  The
 | 
|  |    357 |   optional number specifies how much indentation to add when a line
 | 
|  |    358 |   break occurs within the block.  If the parenthesis is not followed
 | 
|  |    359 |   by digits, the indentation defaults to 0.  A block specified via
 | 
|  |    360 |   \verb|(00| is unbreakable.
 | 
|  |    361 | 
 | 
|  |    362 |   \item \verb|)| closes a pretty printing block.
 | 
|  |    363 | 
 | 
|  |    364 |   \item \verb|//| forces a line break.
 | 
|  |    365 | 
 | 
|  |    366 |   \item \verb|/|\isa{s} allows a line break.  Here \isa{s}
 | 
|  |    367 |   stands for the string of spaces (zero or more) right after the
 | 
|  |    368 |   slash.  These spaces are printed if the break is \emph{not} taken.
 | 
|  |    369 | 
 | 
|  |    370 |   \end{description}
 | 
|  |    371 | 
 | 
|  |    372 |   For example, the template \verb|(_ +/ _)| specifies an infix
 | 
|  |    373 |   operator.  There are two argument positions; the delimiter
 | 
|  |    374 |   \verb|+| is preceded by a space and followed by a space or
 | 
|  |    375 |   line break; the entire phrase is a pretty printing block.
 | 
|  |    376 | 
 | 
|  |    377 |   The general idea of pretty printing with blocks and breaks is also
 | 
|  |    378 |   described in \cite{paulson-ml2}.%
 | 
|  |    379 | \end{isamarkuptext}%
 | 
|  |    380 | \isamarkuptrue%
 | 
|  |    381 | %
 | 
|  |    382 | \isamarkupsection{Explicit term notation%
 | 
|  |    383 | }
 | 
|  |    384 | \isamarkuptrue%
 | 
|  |    385 | %
 | 
|  |    386 | \begin{isamarkuptext}%
 | 
|  |    387 | \begin{matharray}{rcll}
 | 
|  |    388 |     \indexdef{}{command}{notation}\hypertarget{command.notation}{\hyperlink{command.notation}{\mbox{\isa{\isacommand{notation}}}}} & : & \isa{{\isachardoublequote}local{\isacharunderscore}theory\ {\isasymrightarrow}\ local{\isacharunderscore}theory{\isachardoublequote}} \\
 | 
|  |    389 |     \indexdef{}{command}{no\_notation}\hypertarget{command.no-notation}{\hyperlink{command.no-notation}{\mbox{\isa{\isacommand{no{\isacharunderscore}notation}}}}} & : & \isa{{\isachardoublequote}local{\isacharunderscore}theory\ {\isasymrightarrow}\ local{\isacharunderscore}theory{\isachardoublequote}} \\
 | 
|  |    390 |   \end{matharray}
 | 
|  |    391 | 
 | 
|  |    392 |   \begin{rail}
 | 
| 29746 |    393 |     ('notation' | 'no\_notation') target? mode? \\ (nameref structmixfix + 'and')
 | 
| 28762 |    394 |     ;
 | 
|  |    395 |   \end{rail}
 | 
|  |    396 | 
 | 
|  |    397 |   \begin{description}
 | 
|  |    398 | 
 | 
|  |    399 |   \item \hyperlink{command.notation}{\mbox{\isa{\isacommand{notation}}}}~\isa{{\isachardoublequote}c\ {\isacharparenleft}mx{\isacharparenright}{\isachardoublequote}} associates mixfix
 | 
|  |    400 |   syntax with an existing constant or fixed variable.  This is a
 | 
|  |    401 |   robust interface to the underlying \hyperlink{command.syntax}{\mbox{\isa{\isacommand{syntax}}}} primitive
 | 
|  |    402 |   (\secref{sec:syn-trans}).  Type declaration and internal syntactic
 | 
|  |    403 |   representation of the given entity is retrieved from the context.
 | 
|  |    404 |   
 | 
|  |    405 |   \item \hyperlink{command.no-notation}{\mbox{\isa{\isacommand{no{\isacharunderscore}notation}}}} is similar to \hyperlink{command.notation}{\mbox{\isa{\isacommand{notation}}}},
 | 
|  |    406 |   but removes the specified syntax annotation from the present
 | 
|  |    407 |   context.
 | 
|  |    408 | 
 | 
|  |    409 |   \end{description}%
 | 
|  |    410 | \end{isamarkuptext}%
 | 
|  |    411 | \isamarkuptrue%
 | 
|  |    412 | %
 | 
|  |    413 | \isamarkupsection{The Pure syntax \label{sec:pure-syntax}%
 | 
|  |    414 | }
 | 
|  |    415 | \isamarkuptrue%
 | 
|  |    416 | %
 | 
|  |    417 | \isamarkupsubsection{Priority grammars \label{sec:priority-grammar}%
 | 
|  |    418 | }
 | 
|  |    419 | \isamarkuptrue%
 | 
|  |    420 | %
 | 
|  |    421 | \begin{isamarkuptext}%
 | 
|  |    422 | A context-free grammar consists of a set of \emph{terminal
 | 
|  |    423 |   symbols}, a set of \emph{nonterminal symbols} and a set of
 | 
|  |    424 |   \emph{productions}.  Productions have the form \isa{{\isachardoublequote}A\ {\isacharequal}\ {\isasymgamma}{\isachardoublequote}},
 | 
|  |    425 |   where \isa{A} is a nonterminal and \isa{{\isasymgamma}} is a string of
 | 
|  |    426 |   terminals and nonterminals.  One designated nonterminal is called
 | 
|  |    427 |   the \emph{root symbol}.  The language defined by the grammar
 | 
|  |    428 |   consists of all strings of terminals that can be derived from the
 | 
|  |    429 |   root symbol by applying productions as rewrite rules.
 | 
|  |    430 | 
 | 
|  |    431 |   The standard Isabelle parser for inner syntax uses a \emph{priority
 | 
|  |    432 |   grammar}.  Each nonterminal is decorated by an integer priority:
 | 
|  |    433 |   \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup p\isactrlsup {\isacharparenright}{\isachardoublequote}}.  In a derivation, \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup p\isactrlsup {\isacharparenright}{\isachardoublequote}} may be rewritten
 | 
|  |    434 |   using a production \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup q\isactrlsup {\isacharparenright}\ {\isacharequal}\ {\isasymgamma}{\isachardoublequote}} only if \isa{{\isachardoublequote}p\ {\isasymle}\ q{\isachardoublequote}}.  Any
 | 
|  |    435 |   priority grammar can be translated into a normal context-free
 | 
|  |    436 |   grammar by introducing new nonterminals and productions.
 | 
|  |    437 | 
 | 
|  |    438 |   \medskip Formally, a set of context free productions \isa{G}
 | 
|  |    439 |   induces a derivation relation \isa{{\isachardoublequote}{\isasymlongrightarrow}\isactrlsub G{\isachardoublequote}} as follows.  Let \isa{{\isasymalpha}} and \isa{{\isasymbeta}} denote strings of terminal or nonterminal symbols.
 | 
|  |    440 |   Then \isa{{\isachardoublequote}{\isasymalpha}\ A\isactrlsup {\isacharparenleft}\isactrlsup p\isactrlsup {\isacharparenright}\ {\isasymbeta}\ {\isasymlongrightarrow}\isactrlsub G\ {\isasymalpha}\ {\isasymgamma}\ {\isasymbeta}{\isachardoublequote}} holds if and only if \isa{G}
 | 
|  |    441 |   contains some production \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup q\isactrlsup {\isacharparenright}\ {\isacharequal}\ {\isasymgamma}{\isachardoublequote}} for \isa{{\isachardoublequote}p\ {\isasymle}\ q{\isachardoublequote}}.
 | 
|  |    442 | 
 | 
|  |    443 |   \medskip The following grammar for arithmetic expressions
 | 
|  |    444 |   demonstrates how binding power and associativity of operators can be
 | 
|  |    445 |   enforced by priorities.
 | 
|  |    446 | 
 | 
|  |    447 |   \begin{center}
 | 
|  |    448 |   \begin{tabular}{rclr}
 | 
|  |    449 |   \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharequal}{\isachardoublequote}} & \verb|(| \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{0}}\isactrlsup {\isacharparenright}{\isachardoublequote}} \verb|)| \\
 | 
|  |    450 |   \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharequal}{\isachardoublequote}} & \verb|0| \\
 | 
|  |    451 |   \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{0}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharequal}{\isachardoublequote}} & \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{0}}\isactrlsup {\isacharparenright}{\isachardoublequote}} \verb|+| \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    452 |   \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{2}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharequal}{\isachardoublequote}} & \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{3}}\isactrlsup {\isacharparenright}{\isachardoublequote}} \verb|*| \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{2}}\isactrlsup {\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    453 |   \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{3}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharequal}{\isachardoublequote}} & \verb|-| \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{3}}\isactrlsup {\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    454 |   \end{tabular}
 | 
|  |    455 |   \end{center}
 | 
|  |    456 |   The choice of priorities determines that \verb|-| binds
 | 
|  |    457 |   tighter than \verb|*|, which binds tighter than \verb|+|.  Furthermore \verb|+| associates to the left and
 | 
|  |    458 |   \verb|*| to the right.
 | 
|  |    459 | 
 | 
|  |    460 |   \medskip For clarity, grammars obey these conventions:
 | 
|  |    461 |   \begin{itemize}
 | 
|  |    462 | 
 | 
|  |    463 |   \item All priorities must lie between 0 and 1000.
 | 
|  |    464 | 
 | 
|  |    465 |   \item Priority 0 on the right-hand side and priority 1000 on the
 | 
|  |    466 |   left-hand side may be omitted.
 | 
|  |    467 | 
 | 
|  |    468 |   \item The production \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup p\isactrlsup {\isacharparenright}\ {\isacharequal}\ {\isasymalpha}{\isachardoublequote}} is written as \isa{{\isachardoublequote}A\ {\isacharequal}\ {\isasymalpha}\ {\isacharparenleft}p{\isacharparenright}{\isachardoublequote}}, i.e.\ the priority of the left-hand side actually appears in
 | 
|  |    469 |   a column on the far right.
 | 
|  |    470 | 
 | 
|  |    471 |   \item Alternatives are separated by \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}}.
 | 
|  |    472 | 
 | 
|  |    473 |   \item Repetition is indicated by dots \isa{{\isachardoublequote}{\isacharparenleft}{\isasymdots}{\isacharparenright}{\isachardoublequote}} in an informal
 | 
|  |    474 |   but obvious way.
 | 
|  |    475 | 
 | 
|  |    476 |   \end{itemize}
 | 
|  |    477 | 
 | 
|  |    478 |   Using these conventions, the example grammar specification above
 | 
|  |    479 |   takes the form:
 | 
|  |    480 |   \begin{center}
 | 
|  |    481 |   \begin{tabular}{rclc}
 | 
|  |    482 |     \isa{A} & \isa{{\isachardoublequote}{\isacharequal}{\isachardoublequote}} & \verb|(| \isa{A} \verb|)| \\
 | 
|  |    483 |               & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|0| & \qquad\qquad \\
 | 
|  |    484 |               & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{A} \verb|+| \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{0}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    485 |               & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{3}}\isactrlsup {\isacharparenright}{\isachardoublequote}} \verb|*| \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{2}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{2}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    486 |               & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|-| \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{3}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{3}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    487 |   \end{tabular}
 | 
|  |    488 |   \end{center}%
 | 
|  |    489 | \end{isamarkuptext}%
 | 
|  |    490 | \isamarkuptrue%
 | 
|  |    491 | %
 | 
|  |    492 | \isamarkupsubsection{The Pure grammar%
 | 
|  |    493 | }
 | 
|  |    494 | \isamarkuptrue%
 | 
|  |    495 | %
 | 
|  |    496 | \begin{isamarkuptext}%
 | 
|  |    497 | The priority grammar of the \isa{{\isachardoublequote}Pure{\isachardoublequote}} theory is defined as follows:
 | 
|  |    498 | 
 | 
|  |    499 |   %FIXME syntax for "index" (?)
 | 
|  |    500 |   %FIXME "op" versions of ==> etc. (?)
 | 
|  |    501 | 
 | 
|  |    502 |   \begin{center}
 | 
|  |    503 |   \begin{supertabular}{rclr}
 | 
|  |    504 | 
 | 
|  |    505 |   \indexdef{inner}{syntax}{any}\hypertarget{syntax.inner.any}{\hyperlink{syntax.inner.any}{\mbox{\isa{any}}}} & = & \isa{{\isachardoublequote}prop\ \ {\isacharbar}\ \ logic{\isachardoublequote}} \\\\
 | 
|  |    506 | 
 | 
|  |    507 |   \indexdef{inner}{syntax}{prop}\hypertarget{syntax.inner.prop}{\hyperlink{syntax.inner.prop}{\mbox{\isa{prop}}}} & = & \verb|(| \isa{prop} \verb|)| \\
 | 
|  |    508 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}prop\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{4}}\isactrlsup {\isacharparenright}{\isachardoublequote}} \verb|::| \isa{type} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{3}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    509 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}any\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{3}}\isactrlsup {\isacharparenright}{\isachardoublequote}} \verb|=?=| \isa{{\isachardoublequote}any\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{2}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{2}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    510 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}any\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{3}}\isactrlsup {\isacharparenright}{\isachardoublequote}} \verb|==| \isa{{\isachardoublequote}any\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{2}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{2}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    511 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}any\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{3}}\isactrlsup {\isacharparenright}{\isachardoublequote}} \isa{{\isachardoublequote}{\isasymequiv}{\isachardoublequote}} \isa{{\isachardoublequote}any\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{2}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{2}}{\isacharparenright}{\isachardoublequote}} \\
 | 
| 28857 |    512 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}prop\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{3}}\isactrlsup {\isacharparenright}{\isachardoublequote}} \verb|&&&| \isa{{\isachardoublequote}prop\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{2}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{2}}{\isacharparenright}{\isachardoublequote}} \\
 | 
| 28762 |    513 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}prop\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{2}}\isactrlsup {\isacharparenright}{\isachardoublequote}} \verb|==>| \isa{{\isachardoublequote}prop\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{1}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    514 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}prop\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{2}}\isactrlsup {\isacharparenright}{\isachardoublequote}} \isa{{\isachardoublequote}{\isasymLongrightarrow}{\isachardoublequote}} \isa{{\isachardoublequote}prop\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{1}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    515 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|[|\verb,|,\verb|| \isa{prop} \verb|;| \isa{{\isachardoublequote}{\isasymdots}{\isachardoublequote}} \verb|;| \isa{prop} \verb||\verb,|,\verb|]| \verb|==>| \isa{{\isachardoublequote}prop\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{1}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    516 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isasymlbrakk}{\isachardoublequote}} \isa{prop} \verb|;| \isa{{\isachardoublequote}{\isasymdots}{\isachardoublequote}} \verb|;| \isa{prop} \isa{{\isachardoublequote}{\isasymrbrakk}{\isachardoublequote}} \isa{{\isachardoublequote}{\isasymLongrightarrow}{\isachardoublequote}} \isa{{\isachardoublequote}prop\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{1}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    517 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|!!| \isa{idts} \verb|.| \isa{prop} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{0}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    518 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isasymAnd}{\isachardoublequote}} \isa{idts} \verb|.| \isa{prop} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{0}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    519 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|OFCLASS| \verb|(| \isa{type} \verb|,| \isa{logic} \verb|)| \\
 | 
|  |    520 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|SORT_CONSTRAINT| \verb|(| \isa{type} \verb|)| \\
 | 
| 28857 |    521 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|TERM| \isa{logic} \\
 | 
| 28762 |    522 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|PROP| \isa{aprop} \\\\
 | 
|  |    523 | 
 | 
| 28857 |    524 |   \indexdef{inner}{syntax}{aprop}\hypertarget{syntax.inner.aprop}{\hyperlink{syntax.inner.aprop}{\mbox{\isa{aprop}}}} & = & \verb|(| \isa{aprop} \verb|)| \\
 | 
|  |    525 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}id\ \ {\isacharbar}\ \ longid\ \ {\isacharbar}\ \ var\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|_|\isa{{\isachardoublequote}\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|...| \\
 | 
|  |    526 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|CONST| \isa{{\isachardoublequote}id\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|CONST| \isa{{\isachardoublequote}longid{\isachardoublequote}} \\
 | 
| 28762 |    527 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}logic\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isacharparenright}\ \ any\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isacharparenright}\ {\isasymdots}\ any\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{9}}{\isadigit{9}}{\isadigit{9}}{\isacharparenright}{\isachardoublequote}} \\\\
 | 
|  |    528 | 
 | 
|  |    529 |   \indexdef{inner}{syntax}{logic}\hypertarget{syntax.inner.logic}{\hyperlink{syntax.inner.logic}{\mbox{\isa{logic}}}} & = & \verb|(| \isa{logic} \verb|)| \\
 | 
|  |    530 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}logic\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{4}}\isactrlsup {\isacharparenright}{\isachardoublequote}} \verb|::| \isa{type} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{3}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    531 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}id\ \ {\isacharbar}\ \ longid\ \ {\isacharbar}\ \ var\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|_|\isa{{\isachardoublequote}\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|...| \\
 | 
| 28857 |    532 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|CONST| \isa{{\isachardoublequote}id\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|CONST| \isa{{\isachardoublequote}longid{\isachardoublequote}} \\
 | 
| 28762 |    533 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}logic\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isacharparenright}\ \ any\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isacharparenright}\ {\isasymdots}\ any\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{9}}{\isadigit{9}}{\isadigit{9}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    534 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|%| \isa{pttrns} \verb|.| \isa{{\isachardoublequote}any\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{3}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{3}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    535 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isasymlambda}} \isa{pttrns} \verb|.| \isa{{\isachardoublequote}any\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{3}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{3}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    536 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|TYPE| \verb|(| \isa{type} \verb|)| \\\\
 | 
|  |    537 | 
 | 
|  |    538 |   \indexdef{inner}{syntax}{idt}\hypertarget{syntax.inner.idt}{\hyperlink{syntax.inner.idt}{\mbox{\isa{idt}}}} & = & \verb|(| \isa{idt} \verb|)|\isa{{\isachardoublequote}\ \ {\isacharbar}\ \ id\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|_| \\
 | 
|  |    539 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{id} \verb|::| \isa{type} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{0}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    540 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|_| \verb|::| \isa{type} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{0}}{\isacharparenright}{\isachardoublequote}} \\\\
 | 
|  |    541 | 
 | 
|  |    542 |   \indexdef{inner}{syntax}{idts}\hypertarget{syntax.inner.idts}{\hyperlink{syntax.inner.idts}{\mbox{\isa{idts}}}} & = & \isa{{\isachardoublequote}idt\ \ {\isacharbar}\ \ idt\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isacharparenright}\ idts{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{0}}{\isacharparenright}{\isachardoublequote}} \\\\
 | 
|  |    543 | 
 | 
|  |    544 |   \indexdef{inner}{syntax}{pttrn}\hypertarget{syntax.inner.pttrn}{\hyperlink{syntax.inner.pttrn}{\mbox{\isa{pttrn}}}} & = & \isa{idt} \\\\
 | 
|  |    545 | 
 | 
|  |    546 |   \indexdef{inner}{syntax}{pttrns}\hypertarget{syntax.inner.pttrns}{\hyperlink{syntax.inner.pttrns}{\mbox{\isa{pttrns}}}} & = & \isa{{\isachardoublequote}pttrn\ \ {\isacharbar}\ \ pttrn\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isacharparenright}\ pttrns{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{0}}{\isacharparenright}{\isachardoublequote}} \\\\
 | 
|  |    547 | 
 | 
|  |    548 |   \indexdef{inner}{syntax}{type}\hypertarget{syntax.inner.type}{\hyperlink{syntax.inner.type}{\mbox{\isa{type}}}} & = & \verb|(| \isa{type} \verb|)| \\
 | 
|  |    549 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}tid\ \ {\isacharbar}\ \ tvar\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|_| \\
 | 
|  |    550 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}tid{\isachardoublequote}} \verb|::| \isa{{\isachardoublequote}sort\ \ {\isacharbar}\ \ tvar\ \ {\isachardoublequote}}\verb|::| \isa{{\isachardoublequote}sort\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|_| \verb|::| \isa{{\isachardoublequote}sort{\isachardoublequote}} \\
 | 
|  |    551 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}id\ \ {\isacharbar}\ \ type\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isacharparenright}\ id\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|(| \isa{type} \verb|,| \isa{{\isachardoublequote}{\isasymdots}{\isachardoublequote}} \verb|,| \isa{type} \verb|)| \isa{id} \\
 | 
| 29746 |    552 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}longid\ \ {\isacharbar}\ \ type\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isadigit{0}}\isactrlsup {\isacharparenright}\ longid{\isachardoublequote}} \\
 | 
|  |    553 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|(| \isa{type} \verb|,| \isa{{\isachardoublequote}{\isasymdots}{\isachardoublequote}} \verb|,| \isa{type} \verb|)| \isa{longid} \\
 | 
| 28762 |    554 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}type\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isacharparenright}{\isachardoublequote}} \verb|=>| \isa{type} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{0}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    555 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}type\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{1}}\isactrlsup {\isacharparenright}{\isachardoublequote}} \isa{{\isachardoublequote}{\isasymRightarrow}{\isachardoublequote}} \isa{type} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{0}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    556 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|[| \isa{type} \verb|,| \isa{{\isachardoublequote}{\isasymdots}{\isachardoublequote}} \verb|,| \isa{type} \verb|]| \verb|=>| \isa{type} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{0}}{\isacharparenright}{\isachardoublequote}} \\
 | 
|  |    557 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|[| \isa{type} \verb|,| \isa{{\isachardoublequote}{\isasymdots}{\isachardoublequote}} \verb|,| \isa{type} \verb|]| \isa{{\isachardoublequote}{\isasymRightarrow}{\isachardoublequote}} \isa{type} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{0}}{\isacharparenright}{\isachardoublequote}} \\\\
 | 
|  |    558 | 
 | 
| 29746 |    559 |   \indexdef{inner}{syntax}{sort}\hypertarget{syntax.inner.sort}{\hyperlink{syntax.inner.sort}{\mbox{\isa{sort}}}} & = & \isa{{\isachardoublequote}id\ \ {\isacharbar}\ \ longid\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|{}| \\
 | 
|  |    560 |     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|{| \isa{{\isachardoublequote}{\isacharparenleft}id\ {\isacharbar}\ longid{\isacharparenright}{\isachardoublequote}} \verb|,| \isa{{\isachardoublequote}{\isasymdots}{\isachardoublequote}} \verb|,| \isa{{\isachardoublequote}{\isacharparenleft}id\ {\isacharbar}\ longid{\isacharparenright}{\isachardoublequote}} \verb|}| \\
 | 
| 28762 |    561 |   \end{supertabular}
 | 
|  |    562 |   \end{center}
 | 
|  |    563 | 
 | 
|  |    564 |   \medskip Here literal terminals are printed \verb|verbatim|;
 | 
|  |    565 |   see also \secref{sec:inner-lex} for further token categories of the
 | 
|  |    566 |   inner syntax.  The meaning of the nonterminals defined by the above
 | 
|  |    567 |   grammar is as follows:
 | 
|  |    568 | 
 | 
|  |    569 |   \begin{description}
 | 
|  |    570 | 
 | 
|  |    571 |   \item \indexref{inner}{syntax}{any}\hyperlink{syntax.inner.any}{\mbox{\isa{any}}} denotes any term.
 | 
|  |    572 | 
 | 
|  |    573 |   \item \indexref{inner}{syntax}{prop}\hyperlink{syntax.inner.prop}{\mbox{\isa{prop}}} denotes meta-level propositions,
 | 
|  |    574 |   which are terms of type \isa{prop}.  The syntax of such formulae of
 | 
|  |    575 |   the meta-logic is carefully distinguished from usual conventions for
 | 
|  |    576 |   object-logics.  In particular, plain \isa{{\isachardoublequote}{\isasymlambda}{\isachardoublequote}}-term notation is
 | 
|  |    577 |   \emph{not} recognized as \hyperlink{syntax.inner.prop}{\mbox{\isa{prop}}}.
 | 
|  |    578 | 
 | 
|  |    579 |   \item \indexref{inner}{syntax}{aprop}\hyperlink{syntax.inner.aprop}{\mbox{\isa{aprop}}} denotes atomic propositions, which
 | 
|  |    580 |   are embedded into regular \hyperlink{syntax.inner.prop}{\mbox{\isa{prop}}} by means of an
 | 
|  |    581 |   explicit \verb|PROP| token.
 | 
|  |    582 | 
 | 
|  |    583 |   Terms of type \isa{prop} with non-constant head, e.g.\ a plain
 | 
|  |    584 |   variable, are printed in this form.  Constants that yield type \isa{prop} are expected to provide their own concrete syntax; otherwise
 | 
|  |    585 |   the printed version will appear like \hyperlink{syntax.inner.logic}{\mbox{\isa{logic}}} and
 | 
|  |    586 |   cannot be parsed again as \hyperlink{syntax.inner.prop}{\mbox{\isa{prop}}}.
 | 
|  |    587 | 
 | 
|  |    588 |   \item \indexref{inner}{syntax}{logic}\hyperlink{syntax.inner.logic}{\mbox{\isa{logic}}} denotes arbitrary terms of a
 | 
|  |    589 |   logical type, excluding type \isa{prop}.  This is the main
 | 
|  |    590 |   syntactic category of object-logic entities, covering plain \isa{{\isasymlambda}}-term notation (variables, abstraction, application), plus
 | 
|  |    591 |   anything defined by the user.
 | 
|  |    592 | 
 | 
|  |    593 |   When specifying notation for logical entities, all logical types
 | 
|  |    594 |   (excluding \isa{prop}) are \emph{collapsed} to this single category
 | 
|  |    595 |   of \hyperlink{syntax.inner.logic}{\mbox{\isa{logic}}}.
 | 
|  |    596 | 
 | 
|  |    597 |   \item \indexref{inner}{syntax}{idt}\hyperlink{syntax.inner.idt}{\mbox{\isa{idt}}} denotes identifiers, possibly
 | 
|  |    598 |   constrained by types.
 | 
|  |    599 | 
 | 
|  |    600 |   \item \indexref{inner}{syntax}{idts}\hyperlink{syntax.inner.idts}{\mbox{\isa{idts}}} denotes a sequence of \indexref{inner}{syntax}{idt}\hyperlink{syntax.inner.idt}{\mbox{\isa{idt}}}.  This is the most basic category for variables in
 | 
|  |    601 |   iterated binders, such as \isa{{\isachardoublequote}{\isasymlambda}{\isachardoublequote}} or \isa{{\isachardoublequote}{\isasymAnd}{\isachardoublequote}}.
 | 
|  |    602 | 
 | 
|  |    603 |   \item \indexref{inner}{syntax}{pttrn}\hyperlink{syntax.inner.pttrn}{\mbox{\isa{pttrn}}} and \indexref{inner}{syntax}{pttrns}\hyperlink{syntax.inner.pttrns}{\mbox{\isa{pttrns}}}
 | 
|  |    604 |   denote patterns for abstraction, cases bindings etc.  In Pure, these
 | 
|  |    605 |   categories start as a merely copy of \hyperlink{syntax.inner.idt}{\mbox{\isa{idt}}} and
 | 
|  |    606 |   \hyperlink{syntax.inner.idts}{\mbox{\isa{idts}}}, respectively.  Object-logics may add
 | 
|  |    607 |   additional productions for binding forms.
 | 
|  |    608 | 
 | 
|  |    609 |   \item \indexref{inner}{syntax}{type}\hyperlink{syntax.inner.type}{\mbox{\isa{type}}} denotes types of the meta-logic.
 | 
|  |    610 | 
 | 
|  |    611 |   \item \indexref{inner}{syntax}{sort}\hyperlink{syntax.inner.sort}{\mbox{\isa{sort}}} denotes meta-level sorts.
 | 
|  |    612 | 
 | 
|  |    613 |   \end{description}
 | 
|  |    614 | 
 | 
|  |    615 |   Here are some further explanations of certain syntax features.
 | 
|  |    616 | 
 | 
|  |    617 |   \begin{itemize}
 | 
|  |    618 | 
 | 
|  |    619 |   \item In \hyperlink{syntax.inner.idts}{\mbox{\isa{idts}}}, note that \isa{{\isachardoublequote}x\ {\isacharcolon}{\isacharcolon}\ nat\ y{\isachardoublequote}} is
 | 
|  |    620 |   parsed as \isa{{\isachardoublequote}x\ {\isacharcolon}{\isacharcolon}\ {\isacharparenleft}nat\ y{\isacharparenright}{\isachardoublequote}}, treating \isa{y} like a type
 | 
|  |    621 |   constructor applied to \isa{nat}.  To avoid this interpretation,
 | 
|  |    622 |   write \isa{{\isachardoublequote}{\isacharparenleft}x\ {\isacharcolon}{\isacharcolon}\ nat{\isacharparenright}\ y{\isachardoublequote}} with explicit parentheses.
 | 
|  |    623 | 
 | 
|  |    624 |   \item Similarly, \isa{{\isachardoublequote}x\ {\isacharcolon}{\isacharcolon}\ nat\ y\ {\isacharcolon}{\isacharcolon}\ nat{\isachardoublequote}} is parsed as \isa{{\isachardoublequote}x\ {\isacharcolon}{\isacharcolon}\ {\isacharparenleft}nat\ y\ {\isacharcolon}{\isacharcolon}\ nat{\isacharparenright}{\isachardoublequote}}.  The correct form is \isa{{\isachardoublequote}{\isacharparenleft}x\ {\isacharcolon}{\isacharcolon}\ nat{\isacharparenright}\ {\isacharparenleft}y\ {\isacharcolon}{\isacharcolon}\ nat{\isacharparenright}{\isachardoublequote}}, or \isa{{\isachardoublequote}{\isacharparenleft}x\ {\isacharcolon}{\isacharcolon}\ nat{\isacharparenright}\ y\ {\isacharcolon}{\isacharcolon}\ nat{\isachardoublequote}} if \isa{y} is last in the
 | 
|  |    625 |   sequence of identifiers.
 | 
|  |    626 | 
 | 
|  |    627 |   \item Type constraints for terms bind very weakly.  For example,
 | 
|  |    628 |   \isa{{\isachardoublequote}x\ {\isacharless}\ y\ {\isacharcolon}{\isacharcolon}\ nat{\isachardoublequote}} is normally parsed as \isa{{\isachardoublequote}{\isacharparenleft}x\ {\isacharless}\ y{\isacharparenright}\ {\isacharcolon}{\isacharcolon}\ nat{\isachardoublequote}}, unless \isa{{\isachardoublequote}{\isacharless}{\isachardoublequote}} has a very low priority, in which case the
 | 
|  |    629 |   input is likely to be ambiguous.  The correct form is \isa{{\isachardoublequote}x\ {\isacharless}\ {\isacharparenleft}y\ {\isacharcolon}{\isacharcolon}\ nat{\isacharparenright}{\isachardoublequote}}.
 | 
|  |    630 | 
 | 
|  |    631 |   \item Constraints may be either written with two literal colons
 | 
|  |    632 |   ``\verb|::|'' or the double-colon symbol \verb|\<Colon>|,
 | 
|  |    633 |   which actually looks exactly the same in some {\LaTeX} styles.
 | 
|  |    634 | 
 | 
|  |    635 |   \item Dummy variables (written as underscore) may occur in different
 | 
|  |    636 |   roles.
 | 
|  |    637 | 
 | 
|  |    638 |   \begin{description}
 | 
|  |    639 | 
 | 
|  |    640 |   \item A type ``\isa{{\isachardoublequote}{\isacharunderscore}{\isachardoublequote}}'' or ``\isa{{\isachardoublequote}{\isacharunderscore}\ {\isacharcolon}{\isacharcolon}\ sort{\isachardoublequote}}'' acts like an
 | 
|  |    641 |   anonymous inference parameter, which is filled-in according to the
 | 
|  |    642 |   most general type produced by the type-checking phase.
 | 
|  |    643 | 
 | 
|  |    644 |   \item A bound ``\isa{{\isachardoublequote}{\isacharunderscore}{\isachardoublequote}}'' refers to a vacuous abstraction, where
 | 
|  |    645 |   the body does not refer to the binding introduced here.  As in the
 | 
|  |    646 |   term \isa{{\isachardoublequote}{\isasymlambda}x\ {\isacharunderscore}{\isachardot}\ x{\isachardoublequote}}, which is \isa{{\isachardoublequote}{\isasymalpha}{\isachardoublequote}}-equivalent to \isa{{\isachardoublequote}{\isasymlambda}x\ y{\isachardot}\ x{\isachardoublequote}}.
 | 
|  |    647 | 
 | 
|  |    648 |   \item A free ``\isa{{\isachardoublequote}{\isacharunderscore}{\isachardoublequote}}'' refers to an implicit outer binding.
 | 
|  |    649 |   Higher definitional packages usually allow forms like \isa{{\isachardoublequote}f\ x\ {\isacharunderscore}\ {\isacharequal}\ x{\isachardoublequote}}.
 | 
|  |    650 | 
 | 
|  |    651 |   \item A schematic ``\isa{{\isachardoublequote}{\isacharunderscore}{\isachardoublequote}}'' (within a term pattern, see
 | 
|  |    652 |   \secref{sec:term-decls}) refers to an anonymous variable that is
 | 
|  |    653 |   implicitly abstracted over its context of locally bound variables.
 | 
|  |    654 |   For example, this allows pattern matching of \isa{{\isachardoublequote}{\isacharbraceleft}x{\isachardot}\ f\ x\ {\isacharequal}\ g\ x{\isacharbraceright}{\isachardoublequote}} against \isa{{\isachardoublequote}{\isacharbraceleft}x{\isachardot}\ {\isacharunderscore}\ {\isacharequal}\ {\isacharunderscore}{\isacharbraceright}{\isachardoublequote}}, or even \isa{{\isachardoublequote}{\isacharbraceleft}{\isacharunderscore}{\isachardot}\ {\isacharunderscore}\ {\isacharequal}\ {\isacharunderscore}{\isacharbraceright}{\isachardoublequote}} by
 | 
|  |    655 |   using both bound and schematic dummies.
 | 
|  |    656 | 
 | 
|  |    657 |   \end{description}
 | 
|  |    658 | 
 | 
|  |    659 |   \item The three literal dots ``\verb|...|'' may be also
 | 
|  |    660 |   written as ellipsis symbol \verb|\<dots>|.  In both cases this
 | 
|  |    661 |   refers to a special schematic variable, which is bound in the
 | 
|  |    662 |   context.  This special term abbreviation works nicely with
 | 
|  |    663 |   calculational reasoning (\secref{sec:calculation}).
 | 
|  |    664 | 
 | 
|  |    665 |   \end{itemize}%
 | 
|  |    666 | \end{isamarkuptext}%
 | 
|  |    667 | \isamarkuptrue%
 | 
|  |    668 | %
 | 
|  |    669 | \isamarkupsection{Lexical matters \label{sec:inner-lex}%
 | 
|  |    670 | }
 | 
|  |    671 | \isamarkuptrue%
 | 
|  |    672 | %
 | 
|  |    673 | \begin{isamarkuptext}%
 | 
|  |    674 | The inner lexical syntax vaguely resembles the outer one
 | 
|  |    675 |   (\secref{sec:outer-lex}), but some details are different.  There are
 | 
|  |    676 |   two main categories of inner syntax tokens:
 | 
|  |    677 | 
 | 
|  |    678 |   \begin{enumerate}
 | 
|  |    679 | 
 | 
|  |    680 |   \item \emph{delimiters} --- the literal tokens occurring in
 | 
|  |    681 |   productions of the given priority grammar (cf.\
 | 
|  |    682 |   \secref{sec:priority-grammar});
 | 
|  |    683 | 
 | 
|  |    684 |   \item \emph{named tokens} --- various categories of identifiers etc.
 | 
|  |    685 | 
 | 
|  |    686 |   \end{enumerate}
 | 
|  |    687 | 
 | 
|  |    688 |   Delimiters override named tokens and may thus render certain
 | 
|  |    689 |   identifiers inaccessible.  Sometimes the logical context admits
 | 
|  |    690 |   alternative ways to refer to the same entity, potentially via
 | 
|  |    691 |   qualified names.
 | 
|  |    692 | 
 | 
|  |    693 |   \medskip The categories for named tokens are defined once and for
 | 
|  |    694 |   all as follows, reusing some categories of the outer token syntax
 | 
|  |    695 |   (\secref{sec:outer-lex}).
 | 
|  |    696 | 
 | 
|  |    697 |   \begin{center}
 | 
|  |    698 |   \begin{supertabular}{rcl}
 | 
|  |    699 |     \indexdef{inner}{syntax}{id}\hypertarget{syntax.inner.id}{\hyperlink{syntax.inner.id}{\mbox{\isa{id}}}} & = & \indexref{}{syntax}{ident}\hyperlink{syntax.ident}{\mbox{\isa{ident}}} \\
 | 
|  |    700 |     \indexdef{inner}{syntax}{longid}\hypertarget{syntax.inner.longid}{\hyperlink{syntax.inner.longid}{\mbox{\isa{longid}}}} & = & \indexref{}{syntax}{longident}\hyperlink{syntax.longident}{\mbox{\isa{longident}}} \\
 | 
|  |    701 |     \indexdef{inner}{syntax}{var}\hypertarget{syntax.inner.var}{\hyperlink{syntax.inner.var}{\mbox{\isa{var}}}} & = & \indexref{}{syntax}{var}\hyperlink{syntax.var}{\mbox{\isa{var}}} \\
 | 
|  |    702 |     \indexdef{inner}{syntax}{tid}\hypertarget{syntax.inner.tid}{\hyperlink{syntax.inner.tid}{\mbox{\isa{tid}}}} & = & \indexref{}{syntax}{typefree}\hyperlink{syntax.typefree}{\mbox{\isa{typefree}}} \\
 | 
|  |    703 |     \indexdef{inner}{syntax}{tvar}\hypertarget{syntax.inner.tvar}{\hyperlink{syntax.inner.tvar}{\mbox{\isa{tvar}}}} & = & \indexref{}{syntax}{typevar}\hyperlink{syntax.typevar}{\mbox{\isa{typevar}}} \\
 | 
|  |    704 |     \indexdef{inner}{syntax}{num}\hypertarget{syntax.inner.num}{\hyperlink{syntax.inner.num}{\mbox{\isa{num}}}} & = & \indexref{}{syntax}{nat}\hyperlink{syntax.nat}{\mbox{\isa{nat}}}\isa{{\isachardoublequote}\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|-|\indexref{}{syntax}{nat}\hyperlink{syntax.nat}{\mbox{\isa{nat}}} \\
 | 
| 29158 |    705 |     \indexdef{inner}{syntax}{float\_token}\hypertarget{syntax.inner.float-token}{\hyperlink{syntax.inner.float-token}{\mbox{\isa{float{\isacharunderscore}token}}}} & = & \indexref{}{syntax}{nat}\hyperlink{syntax.nat}{\mbox{\isa{nat}}}\verb|.|\indexref{}{syntax}{nat}\hyperlink{syntax.nat}{\mbox{\isa{nat}}}\isa{{\isachardoublequote}\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|-|\indexref{}{syntax}{nat}\hyperlink{syntax.nat}{\mbox{\isa{nat}}}\verb|.|\indexref{}{syntax}{nat}\hyperlink{syntax.nat}{\mbox{\isa{nat}}} \\
 | 
| 28762 |    706 |     \indexdef{inner}{syntax}{xnum}\hypertarget{syntax.inner.xnum}{\hyperlink{syntax.inner.xnum}{\mbox{\isa{xnum}}}} & = & \verb|#|\indexref{}{syntax}{nat}\hyperlink{syntax.nat}{\mbox{\isa{nat}}}\isa{{\isachardoublequote}\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|#-|\indexref{}{syntax}{nat}\hyperlink{syntax.nat}{\mbox{\isa{nat}}} \\
 | 
|  |    707 | 
 | 
|  |    708 |     \indexdef{inner}{syntax}{xstr}\hypertarget{syntax.inner.xstr}{\hyperlink{syntax.inner.xstr}{\mbox{\isa{xstr}}}} & = & \verb|''| \isa{{\isachardoublequote}{\isasymdots}{\isachardoublequote}} \verb|''| \\
 | 
|  |    709 |   \end{supertabular}
 | 
|  |    710 |   \end{center}
 | 
|  |    711 | 
 | 
| 29158 |    712 |   The token categories \hyperlink{syntax.inner.num}{\mbox{\isa{num}}}, \hyperlink{syntax.inner.float-token}{\mbox{\isa{float{\isacharunderscore}token}}}, \hyperlink{syntax.inner.xnum}{\mbox{\isa{xnum}}}, and \hyperlink{syntax.inner.xstr}{\mbox{\isa{xstr}}} are
 | 
|  |    713 |   not used in Pure.  Object-logics may implement numerals and string
 | 
|  |    714 |   constants by adding appropriate syntax declarations, together with
 | 
|  |    715 |   some translation functions (e.g.\ see Isabelle/HOL).
 | 
|  |    716 | 
 | 
|  |    717 |   The derived categories \indexdef{inner}{syntax}{num\_const}\hypertarget{syntax.inner.num-const}{\hyperlink{syntax.inner.num-const}{\mbox{\isa{num{\isacharunderscore}const}}}} and
 | 
|  |    718 |   \indexdef{inner}{syntax}{float\_const}\hypertarget{syntax.inner.float-const}{\hyperlink{syntax.inner.float-const}{\mbox{\isa{float{\isacharunderscore}const}}}} provide robust access to \hyperlink{syntax.inner.num}{\mbox{\isa{num}}}, and \hyperlink{syntax.inner.float-token}{\mbox{\isa{float{\isacharunderscore}token}}}, respectively: the
 | 
|  |    719 |   syntax tree holds a syntactic constant instead of a free variable.%
 | 
| 28762 |    720 | \end{isamarkuptext}%
 | 
|  |    721 | \isamarkuptrue%
 | 
|  |    722 | %
 | 
|  |    723 | \isamarkupsection{Syntax and translations \label{sec:syn-trans}%
 | 
|  |    724 | }
 | 
|  |    725 | \isamarkuptrue%
 | 
|  |    726 | %
 | 
|  |    727 | \begin{isamarkuptext}%
 | 
|  |    728 | \begin{matharray}{rcl}
 | 
|  |    729 |     \indexdef{}{command}{nonterminals}\hypertarget{command.nonterminals}{\hyperlink{command.nonterminals}{\mbox{\isa{\isacommand{nonterminals}}}}} & : & \isa{{\isachardoublequote}theory\ {\isasymrightarrow}\ theory{\isachardoublequote}} \\
 | 
|  |    730 |     \indexdef{}{command}{syntax}\hypertarget{command.syntax}{\hyperlink{command.syntax}{\mbox{\isa{\isacommand{syntax}}}}} & : & \isa{{\isachardoublequote}theory\ {\isasymrightarrow}\ theory{\isachardoublequote}} \\
 | 
|  |    731 |     \indexdef{}{command}{no\_syntax}\hypertarget{command.no-syntax}{\hyperlink{command.no-syntax}{\mbox{\isa{\isacommand{no{\isacharunderscore}syntax}}}}} & : & \isa{{\isachardoublequote}theory\ {\isasymrightarrow}\ theory{\isachardoublequote}} \\
 | 
|  |    732 |     \indexdef{}{command}{translations}\hypertarget{command.translations}{\hyperlink{command.translations}{\mbox{\isa{\isacommand{translations}}}}} & : & \isa{{\isachardoublequote}theory\ {\isasymrightarrow}\ theory{\isachardoublequote}} \\
 | 
|  |    733 |     \indexdef{}{command}{no\_translations}\hypertarget{command.no-translations}{\hyperlink{command.no-translations}{\mbox{\isa{\isacommand{no{\isacharunderscore}translations}}}}} & : & \isa{{\isachardoublequote}theory\ {\isasymrightarrow}\ theory{\isachardoublequote}} \\
 | 
|  |    734 |   \end{matharray}
 | 
|  |    735 | 
 | 
|  |    736 |   \begin{rail}
 | 
|  |    737 |     'nonterminals' (name +)
 | 
|  |    738 |     ;
 | 
|  |    739 |     ('syntax' | 'no\_syntax') mode? (constdecl +)
 | 
|  |    740 |     ;
 | 
|  |    741 |     ('translations' | 'no\_translations') (transpat ('==' | '=>' | '<=' | rightleftharpoons | rightharpoonup | leftharpoondown) transpat +)
 | 
|  |    742 |     ;
 | 
|  |    743 | 
 | 
|  |    744 |     mode: ('(' ( name | 'output' | name 'output' ) ')')
 | 
|  |    745 |     ;
 | 
|  |    746 |     transpat: ('(' nameref ')')? string
 | 
|  |    747 |     ;
 | 
|  |    748 |   \end{rail}
 | 
|  |    749 | 
 | 
|  |    750 |   \begin{description}
 | 
|  |    751 |   
 | 
|  |    752 |   \item \hyperlink{command.nonterminals}{\mbox{\isa{\isacommand{nonterminals}}}}~\isa{c} declares a type
 | 
|  |    753 |   constructor \isa{c} (without arguments) to act as purely syntactic
 | 
|  |    754 |   type: a nonterminal symbol of the inner syntax.
 | 
|  |    755 | 
 | 
|  |    756 |   \item \hyperlink{command.syntax}{\mbox{\isa{\isacommand{syntax}}}}~\isa{{\isachardoublequote}{\isacharparenleft}mode{\isacharparenright}\ decls{\isachardoublequote}} is similar to
 | 
|  |    757 |   \hyperlink{command.consts}{\mbox{\isa{\isacommand{consts}}}}~\isa{decls}, except that the actual logical
 | 
|  |    758 |   signature extension is omitted.  Thus the context free grammar of
 | 
|  |    759 |   Isabelle's inner syntax may be augmented in arbitrary ways,
 | 
|  |    760 |   independently of the logic.  The \isa{mode} argument refers to the
 | 
|  |    761 |   print mode that the grammar rules belong; unless the \indexref{}{keyword}{output}\hyperlink{keyword.output}{\mbox{\isa{\isakeyword{output}}}} indicator is given, all productions are added both to the
 | 
|  |    762 |   input and output grammar.
 | 
|  |    763 |   
 | 
|  |    764 |   \item \hyperlink{command.no-syntax}{\mbox{\isa{\isacommand{no{\isacharunderscore}syntax}}}}~\isa{{\isachardoublequote}{\isacharparenleft}mode{\isacharparenright}\ decls{\isachardoublequote}} removes grammar
 | 
|  |    765 |   declarations (and translations) resulting from \isa{decls}, which
 | 
|  |    766 |   are interpreted in the same manner as for \hyperlink{command.syntax}{\mbox{\isa{\isacommand{syntax}}}} above.
 | 
|  |    767 |   
 | 
|  |    768 |   \item \hyperlink{command.translations}{\mbox{\isa{\isacommand{translations}}}}~\isa{rules} specifies syntactic
 | 
|  |    769 |   translation rules (i.e.\ macros): parse~/ print rules (\isa{{\isachardoublequote}{\isasymrightleftharpoons}{\isachardoublequote}}),
 | 
|  |    770 |   parse rules (\isa{{\isachardoublequote}{\isasymrightharpoonup}{\isachardoublequote}}), or print rules (\isa{{\isachardoublequote}{\isasymleftharpoondown}{\isachardoublequote}}).
 | 
|  |    771 |   Translation patterns may be prefixed by the syntactic category to be
 | 
|  |    772 |   used for parsing; the default is \isa{logic}.
 | 
|  |    773 |   
 | 
|  |    774 |   \item \hyperlink{command.no-translations}{\mbox{\isa{\isacommand{no{\isacharunderscore}translations}}}}~\isa{rules} removes syntactic
 | 
|  |    775 |   translation rules, which are interpreted in the same manner as for
 | 
|  |    776 |   \hyperlink{command.translations}{\mbox{\isa{\isacommand{translations}}}} above.
 | 
|  |    777 | 
 | 
|  |    778 |   \end{description}%
 | 
|  |    779 | \end{isamarkuptext}%
 | 
|  |    780 | \isamarkuptrue%
 | 
|  |    781 | %
 | 
|  |    782 | \isamarkupsection{Syntax translation functions \label{sec:tr-funs}%
 | 
|  |    783 | }
 | 
|  |    784 | \isamarkuptrue%
 | 
|  |    785 | %
 | 
|  |    786 | \begin{isamarkuptext}%
 | 
|  |    787 | \begin{matharray}{rcl}
 | 
|  |    788 |     \indexdef{}{command}{parse\_ast\_translation}\hypertarget{command.parse-ast-translation}{\hyperlink{command.parse-ast-translation}{\mbox{\isa{\isacommand{parse{\isacharunderscore}ast{\isacharunderscore}translation}}}}} & : & \isa{{\isachardoublequote}theory\ {\isasymrightarrow}\ theory{\isachardoublequote}} \\
 | 
|  |    789 |     \indexdef{}{command}{parse\_translation}\hypertarget{command.parse-translation}{\hyperlink{command.parse-translation}{\mbox{\isa{\isacommand{parse{\isacharunderscore}translation}}}}} & : & \isa{{\isachardoublequote}theory\ {\isasymrightarrow}\ theory{\isachardoublequote}} \\
 | 
|  |    790 |     \indexdef{}{command}{print\_translation}\hypertarget{command.print-translation}{\hyperlink{command.print-translation}{\mbox{\isa{\isacommand{print{\isacharunderscore}translation}}}}} & : & \isa{{\isachardoublequote}theory\ {\isasymrightarrow}\ theory{\isachardoublequote}} \\
 | 
|  |    791 |     \indexdef{}{command}{typed\_print\_translation}\hypertarget{command.typed-print-translation}{\hyperlink{command.typed-print-translation}{\mbox{\isa{\isacommand{typed{\isacharunderscore}print{\isacharunderscore}translation}}}}} & : & \isa{{\isachardoublequote}theory\ {\isasymrightarrow}\ theory{\isachardoublequote}} \\
 | 
|  |    792 |     \indexdef{}{command}{print\_ast\_translation}\hypertarget{command.print-ast-translation}{\hyperlink{command.print-ast-translation}{\mbox{\isa{\isacommand{print{\isacharunderscore}ast{\isacharunderscore}translation}}}}} & : & \isa{{\isachardoublequote}theory\ {\isasymrightarrow}\ theory{\isachardoublequote}} \\
 | 
|  |    793 |   \end{matharray}
 | 
|  |    794 | 
 | 
|  |    795 |   \begin{rail}
 | 
|  |    796 |   ( 'parse\_ast\_translation' | 'parse\_translation' | 'print\_translation' |
 | 
|  |    797 |     'typed\_print\_translation' | 'print\_ast\_translation' ) ('(advanced)')? text
 | 
|  |    798 |   ;
 | 
|  |    799 |   \end{rail}
 | 
|  |    800 | 
 | 
|  |    801 |   Syntax translation functions written in ML admit almost arbitrary
 | 
|  |    802 |   manipulations of Isabelle's inner syntax.  Any of the above commands
 | 
|  |    803 |   have a single \railqtok{text} argument that refers to an ML
 | 
|  |    804 |   expression of appropriate type, which are as follows by default:
 | 
|  |    805 | 
 | 
|  |    806 | %FIXME proper antiquotations
 | 
|  |    807 | \begin{ttbox}
 | 
|  |    808 | val parse_ast_translation   : (string * (ast list -> ast)) list
 | 
|  |    809 | val parse_translation       : (string * (term list -> term)) list
 | 
|  |    810 | val print_translation       : (string * (term list -> term)) list
 | 
|  |    811 | val typed_print_translation :
 | 
|  |    812 |   (string * (bool -> typ -> term list -> term)) list
 | 
|  |    813 | val print_ast_translation   : (string * (ast list -> ast)) list
 | 
|  |    814 | \end{ttbox}
 | 
|  |    815 | 
 | 
|  |    816 |   If the \isa{{\isachardoublequote}{\isacharparenleft}advanced{\isacharparenright}{\isachardoublequote}} option is given, the corresponding
 | 
|  |    817 |   translation functions may depend on the current theory or proof
 | 
|  |    818 |   context.  This allows to implement advanced syntax mechanisms, as
 | 
|  |    819 |   translations functions may refer to specific theory declarations or
 | 
|  |    820 |   auxiliary proof data.
 | 
|  |    821 | 
 | 
| 30397 |    822 |   See also \cite{isabelle-ref} for more information on the general
 | 
|  |    823 |   concept of syntax transformations in Isabelle.
 | 
| 28762 |    824 | 
 | 
|  |    825 | %FIXME proper antiquotations
 | 
|  |    826 | \begin{ttbox}
 | 
|  |    827 | val parse_ast_translation:
 | 
|  |    828 |   (string * (Proof.context -> ast list -> ast)) list
 | 
|  |    829 | val parse_translation:
 | 
|  |    830 |   (string * (Proof.context -> term list -> term)) list
 | 
|  |    831 | val print_translation:
 | 
|  |    832 |   (string * (Proof.context -> term list -> term)) list
 | 
|  |    833 | val typed_print_translation:
 | 
|  |    834 |   (string * (Proof.context -> bool -> typ -> term list -> term)) list
 | 
|  |    835 | val print_ast_translation:
 | 
|  |    836 |   (string * (Proof.context -> ast list -> ast)) list
 | 
|  |    837 | \end{ttbox}%
 | 
|  |    838 | \end{isamarkuptext}%
 | 
|  |    839 | \isamarkuptrue%
 | 
|  |    840 | %
 | 
|  |    841 | \isamarkupsection{Inspecting the syntax%
 | 
|  |    842 | }
 | 
|  |    843 | \isamarkuptrue%
 | 
|  |    844 | %
 | 
|  |    845 | \begin{isamarkuptext}%
 | 
|  |    846 | \begin{matharray}{rcl}
 | 
|  |    847 |     \indexdef{}{command}{print\_syntax}\hypertarget{command.print-syntax}{\hyperlink{command.print-syntax}{\mbox{\isa{\isacommand{print{\isacharunderscore}syntax}}}}}\isa{{\isachardoublequote}\isactrlsup {\isacharasterisk}{\isachardoublequote}} & : & \isa{{\isachardoublequote}context\ {\isasymrightarrow}{\isachardoublequote}} \\
 | 
|  |    848 |   \end{matharray}
 | 
|  |    849 | 
 | 
|  |    850 |   \begin{description}
 | 
|  |    851 | 
 | 
|  |    852 |   \item \hyperlink{command.print-syntax}{\mbox{\isa{\isacommand{print{\isacharunderscore}syntax}}}} prints the inner syntax of the
 | 
|  |    853 |   current context.  The output can be quite large; the most important
 | 
|  |    854 |   sections are explained below.
 | 
|  |    855 | 
 | 
|  |    856 |   \begin{description}
 | 
|  |    857 | 
 | 
|  |    858 |   \item \isa{{\isachardoublequote}lexicon{\isachardoublequote}} lists the delimiters of the inner token
 | 
|  |    859 |   language; see \secref{sec:inner-lex}.
 | 
|  |    860 | 
 | 
|  |    861 |   \item \isa{{\isachardoublequote}prods{\isachardoublequote}} lists the productions of the underlying
 | 
|  |    862 |   priority grammar; see \secref{sec:priority-grammar}.
 | 
|  |    863 | 
 | 
|  |    864 |   The nonterminal \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup p\isactrlsup {\isacharparenright}{\isachardoublequote}} is rendered in plain text as \isa{{\isachardoublequote}A{\isacharbrackleft}p{\isacharbrackright}{\isachardoublequote}}; delimiters are quoted.  Many productions have an extra
 | 
|  |    865 |   \isa{{\isachardoublequote}{\isasymdots}\ {\isacharequal}{\isachargreater}\ name{\isachardoublequote}}.  These names later become the heads of parse
 | 
|  |    866 |   trees; they also guide the pretty printer.
 | 
|  |    867 | 
 | 
|  |    868 |   Productions without such parse tree names are called \emph{copy
 | 
|  |    869 |   productions}.  Their right-hand side must have exactly one
 | 
|  |    870 |   nonterminal symbol (or named token).  The parser does not create a
 | 
|  |    871 |   new parse tree node for copy productions, but simply returns the
 | 
|  |    872 |   parse tree of the right-hand symbol.
 | 
|  |    873 | 
 | 
|  |    874 |   If the right-hand side of a copy production consists of a single
 | 
|  |    875 |   nonterminal without any delimiters, then it is called a \emph{chain
 | 
|  |    876 |   production}.  Chain productions act as abbreviations: conceptually,
 | 
|  |    877 |   they are removed from the grammar by adding new productions.
 | 
|  |    878 |   Priority information attached to chain productions is ignored; only
 | 
|  |    879 |   the dummy value \isa{{\isachardoublequote}{\isacharminus}{\isadigit{1}}{\isachardoublequote}} is displayed.
 | 
|  |    880 | 
 | 
| 28857 |    881 |   \item \isa{{\isachardoublequote}print\ modes{\isachardoublequote}} lists the alternative print modes
 | 
| 28762 |    882 |   provided by this grammar; see \secref{sec:print-modes}.
 | 
|  |    883 | 
 | 
|  |    884 |   \item \isa{{\isachardoublequote}parse{\isacharunderscore}rules{\isachardoublequote}} and \isa{{\isachardoublequote}print{\isacharunderscore}rules{\isachardoublequote}} relate to
 | 
|  |    885 |   syntax translations (macros); see \secref{sec:syn-trans}.
 | 
|  |    886 | 
 | 
|  |    887 |   \item \isa{{\isachardoublequote}parse{\isacharunderscore}ast{\isacharunderscore}translation{\isachardoublequote}} and \isa{{\isachardoublequote}print{\isacharunderscore}ast{\isacharunderscore}translation{\isachardoublequote}} list sets of constants that invoke
 | 
|  |    888 |   translation functions for abstract syntax trees, which are only
 | 
|  |    889 |   required in very special situations; see \secref{sec:tr-funs}.
 | 
|  |    890 | 
 | 
|  |    891 |   \item \isa{{\isachardoublequote}parse{\isacharunderscore}translation{\isachardoublequote}} and \isa{{\isachardoublequote}print{\isacharunderscore}translation{\isachardoublequote}}
 | 
|  |    892 |   list the sets of constants that invoke regular translation
 | 
|  |    893 |   functions; see \secref{sec:tr-funs}.
 | 
|  |    894 | 
 | 
|  |    895 |   \end{description}
 | 
|  |    896 |   
 | 
|  |    897 |   \end{description}%
 | 
|  |    898 | \end{isamarkuptext}%
 | 
|  |    899 | \isamarkuptrue%
 | 
|  |    900 | %
 | 
|  |    901 | \isadelimtheory
 | 
|  |    902 | %
 | 
|  |    903 | \endisadelimtheory
 | 
|  |    904 | %
 | 
|  |    905 | \isatagtheory
 | 
|  |    906 | \isacommand{end}\isamarkupfalse%
 | 
|  |    907 | %
 | 
|  |    908 | \endisatagtheory
 | 
|  |    909 | {\isafoldtheory}%
 | 
|  |    910 | %
 | 
|  |    911 | \isadelimtheory
 | 
|  |    912 | %
 | 
|  |    913 | \endisadelimtheory
 | 
|  |    914 | \isanewline
 | 
|  |    915 | \end{isabellebody}%
 | 
|  |    916 | %%% Local Variables:
 | 
|  |    917 | %%% mode: latex
 | 
|  |    918 | %%% TeX-master: "root"
 | 
|  |    919 | %%% End:
 |