doc-src/IsarRef/Thy/document/Inner_Syntax.tex
author wenzelm
Mon, 01 Mar 2010 17:12:43 +0100
changeset 35419 cc8e4276d093
parent 35352 7425aece4ee3
child 36524 03d2a2d0ee4a
permissions -rw-r--r--
updated generated files;
     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} 
   121     \indexdef{}{ML}{show\_types}\verb|show_types: bool Unsynchronized.ref| & default \verb|false| \\
   122     \indexdef{}{ML}{show\_sorts}\verb|show_sorts: bool Unsynchronized.ref| & default \verb|false| \\
   123     \indexdef{}{ML}{show\_consts}\verb|show_consts: bool Unsynchronized.ref| & default \verb|false| \\
   124     \indexdef{}{ML}{long\_names}\verb|long_names: bool Unsynchronized.ref| & default \verb|false| \\
   125     \indexdef{}{ML}{short\_names}\verb|short_names: bool Unsynchronized.ref| & default \verb|false| \\
   126     \indexdef{}{ML}{unique\_names}\verb|unique_names: bool Unsynchronized.ref| & default \verb|true| \\
   127     \indexdef{}{ML}{show\_brackets}\verb|show_brackets: bool Unsynchronized.ref| & default \verb|false| \\
   128     \indexdef{}{ML}{eta\_contract}\verb|eta_contract: bool Unsynchronized.ref| & default \verb|true| \\
   129     \indexdef{}{ML}{goals\_limit}\verb|goals_limit: int Unsynchronized.ref| & default \verb|10| \\
   130     \indexdef{}{ML}{Proof.show\_main\_goal}\verb|Proof.show_main_goal: bool Unsynchronized.ref| & default \verb|false| \\
   131     \indexdef{}{ML}{show\_hyps}\verb|show_hyps: bool Unsynchronized.ref| & default \verb|false| \\
   132     \indexdef{}{ML}{show\_tags}\verb|show_tags: bool Unsynchronized.ref| & default \verb|false| \\
   133     \indexdef{}{ML}{show\_question\_marks}\verb|show_question_marks: bool Unsynchronized.ref| & default \verb|true| \\
   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}
   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| \\
   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.  Locally fixed parameters in toplevel
   270   theorem statements, locale specifications etc.\ also admit mixfix
   271   annotations.
   272 
   273   \indexouternonterm{infix}\indexouternonterm{mixfix}\indexouternonterm{structmixfix}
   274   \begin{rail}
   275     infix: '(' ('infix' | 'infixl' | 'infixr') string nat ')'
   276     ;
   277     mixfix: infix | '(' string prios? nat? ')' | '(' 'binder' string prios? nat ')'
   278     ;
   279     structmixfix: mixfix | '(' 'structure' ')'
   280     ;
   281 
   282     prios: '[' (nat + ',') ']'
   283     ;
   284   \end{rail}
   285 
   286   Here the \railtok{string} specifications refer to the actual mixfix
   287   template, which may include literal text, spacing, blocks, and
   288   arguments (denoted by ``\isa{{\isacharunderscore}}''); the special symbol
   289   ``\verb|\<index>|'' (printed as ``\isa{{\isachardoublequote}{\isasymindex}{\isachardoublequote}}'') represents an index
   290   argument that specifies an implicit structure reference (see also
   291   \secref{sec:locale}).  Infix and binder declarations provide common
   292   abbreviations for particular mixfix declarations.  So in practice,
   293   mixfix templates mostly degenerate to literal text for concrete
   294   syntax, such as ``\verb|++|'' for an infix symbol.
   295 
   296   \medskip In full generality, mixfix declarations work as follows.
   297   Suppose a constant \isa{{\isachardoublequote}c\ {\isacharcolon}{\isacharcolon}\ {\isasymtau}\isactrlsub {\isadigit{1}}\ {\isasymRightarrow}\ {\isasymdots}\ {\isasymtau}\isactrlsub n\ {\isasymRightarrow}\ {\isasymtau}{\isachardoublequote}} is
   298   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
   299   delimiters that surround argument positions as indicated by
   300   underscores.
   301 
   302   Altogether this determines a production for a context-free priority
   303   grammar, where for each argument \isa{{\isachardoublequote}i{\isachardoublequote}} the syntactic category
   304   is determined by \isa{{\isachardoublequote}{\isasymtau}\isactrlsub i{\isachardoublequote}} (with priority \isa{{\isachardoublequote}p\isactrlsub i{\isachardoublequote}}), and
   305   the result category is determined from \isa{{\isachardoublequote}{\isasymtau}{\isachardoublequote}} (with
   306   priority \isa{{\isachardoublequote}p{\isachardoublequote}}).  Priority specifications are optional, with
   307   default 0 for arguments and 1000 for the result.
   308 
   309   Since \isa{{\isachardoublequote}{\isasymtau}{\isachardoublequote}} may be again a function type, the constant
   310   type scheme may have more argument positions than the mixfix
   311   pattern.  Printing a nested application \isa{{\isachardoublequote}c\ t\isactrlsub {\isadigit{1}}\ {\isasymdots}\ t\isactrlsub m{\isachardoublequote}} for
   312   \isa{{\isachardoublequote}m\ {\isachargreater}\ n{\isachardoublequote}} works by attaching concrete notation only to the
   313   innermost part, essentially by printing \isa{{\isachardoublequote}{\isacharparenleft}c\ t\isactrlsub {\isadigit{1}}\ {\isasymdots}\ t\isactrlsub n{\isacharparenright}\ {\isasymdots}\ t\isactrlsub m{\isachardoublequote}}
   314   instead.  If a term has fewer arguments than specified in the mixfix
   315   template, the concrete syntax is ignored.
   316 
   317   \medskip A mixfix template may also contain additional directives
   318   for pretty printing, notably spaces, blocks, and breaks.  The
   319   general template format is a sequence over any of the following
   320   entities.
   321 
   322   \begin{description}
   323 
   324   \item \isa{{\isachardoublequote}d{\isachardoublequote}} is a delimiter, namely a non-empty sequence of
   325   characters other than the following special characters:
   326 
   327   \smallskip
   328   \begin{tabular}{ll}
   329     \verb|'| & single quote \\
   330     \verb|_| & underscore \\
   331     \isa{{\isachardoublequote}{\isasymindex}{\isachardoublequote}} & index symbol \\
   332     \verb|(| & open parenthesis \\
   333     \verb|)| & close parenthesis \\
   334     \verb|/| & slash \\
   335   \end{tabular}
   336   \medskip
   337 
   338   \item \verb|'| escapes the special meaning of these
   339   meta-characters, producing a literal version of the following
   340   character, unless that is a blank.
   341 
   342   A single quote followed by a blank separates delimiters, without
   343   affecting printing, but input tokens may have additional white space
   344   here.
   345 
   346   \item \verb|_| is an argument position, which stands for a
   347   certain syntactic category in the underlying grammar.
   348 
   349   \item \isa{{\isachardoublequote}{\isasymindex}{\isachardoublequote}} is an indexed argument position; this is the place
   350   where implicit structure arguments can be attached.
   351 
   352   \item \isa{{\isachardoublequote}s{\isachardoublequote}} is a non-empty sequence of spaces for printing.
   353   This and the following specifications do not affect parsing at all.
   354 
   355   \item \verb|(|\isa{n} opens a pretty printing block.  The
   356   optional number specifies how much indentation to add when a line
   357   break occurs within the block.  If the parenthesis is not followed
   358   by digits, the indentation defaults to 0.  A block specified via
   359   \verb|(00| is unbreakable.
   360 
   361   \item \verb|)| closes a pretty printing block.
   362 
   363   \item \verb|//| forces a line break.
   364 
   365   \item \verb|/|\isa{s} allows a line break.  Here \isa{s}
   366   stands for the string of spaces (zero or more) right after the
   367   slash.  These spaces are printed if the break is \emph{not} taken.
   368 
   369   \end{description}
   370 
   371   For example, the template \verb|(_ +/ _)| specifies an infix
   372   operator.  There are two argument positions; the delimiter
   373   \verb|+| is preceded by a space and followed by a space or
   374   line break; the entire phrase is a pretty printing block.
   375 
   376   The general idea of pretty printing with blocks and breaks is also
   377   described in \cite{paulson-ml2}.%
   378 \end{isamarkuptext}%
   379 \isamarkuptrue%
   380 %
   381 \isamarkupsection{Explicit notation%
   382 }
   383 \isamarkuptrue%
   384 %
   385 \begin{isamarkuptext}%
   386 \begin{matharray}{rcll}
   387     \indexdef{}{command}{type\_notation}\hypertarget{command.type-notation}{\hyperlink{command.type-notation}{\mbox{\isa{\isacommand{type{\isacharunderscore}notation}}}}} & : & \isa{{\isachardoublequote}local{\isacharunderscore}theory\ {\isasymrightarrow}\ local{\isacharunderscore}theory{\isachardoublequote}} \\
   388     \indexdef{}{command}{no\_type\_notation}\hypertarget{command.no-type-notation}{\hyperlink{command.no-type-notation}{\mbox{\isa{\isacommand{no{\isacharunderscore}type{\isacharunderscore}notation}}}}} & : & \isa{{\isachardoublequote}local{\isacharunderscore}theory\ {\isasymrightarrow}\ local{\isacharunderscore}theory{\isachardoublequote}} \\
   389     \indexdef{}{command}{notation}\hypertarget{command.notation}{\hyperlink{command.notation}{\mbox{\isa{\isacommand{notation}}}}} & : & \isa{{\isachardoublequote}local{\isacharunderscore}theory\ {\isasymrightarrow}\ local{\isacharunderscore}theory{\isachardoublequote}} \\
   390     \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}} \\
   391   \end{matharray}
   392 
   393   \begin{rail}
   394     ('type\_notation' | 'no\_type\_notation') target? mode? \\ (nameref mixfix + 'and')
   395     ;
   396     ('notation' | 'no\_notation') target? mode? \\ (nameref structmixfix + 'and')
   397     ;
   398   \end{rail}
   399 
   400   \begin{description}
   401 
   402   \item \hyperlink{command.type-notation}{\mbox{\isa{\isacommand{type{\isacharunderscore}notation}}}}~\isa{{\isachardoublequote}c\ {\isacharparenleft}mx{\isacharparenright}{\isachardoublequote}} associates mixfix
   403   syntax with an existing type constructor.  The arity of the
   404   constructor is retrieved from the context.
   405   
   406   \item \hyperlink{command.no-type-notation}{\mbox{\isa{\isacommand{no{\isacharunderscore}type{\isacharunderscore}notation}}}} is similar to \hyperlink{command.type-notation}{\mbox{\isa{\isacommand{type{\isacharunderscore}notation}}}}, but removes the specified syntax annotation from
   407   the present context.
   408 
   409   \item \hyperlink{command.notation}{\mbox{\isa{\isacommand{notation}}}}~\isa{{\isachardoublequote}c\ {\isacharparenleft}mx{\isacharparenright}{\isachardoublequote}} associates mixfix
   410   syntax with an existing constant or fixed variable.  The type
   411   declaration of the given entity is retrieved from the context.
   412   
   413   \item \hyperlink{command.no-notation}{\mbox{\isa{\isacommand{no{\isacharunderscore}notation}}}} is similar to \hyperlink{command.notation}{\mbox{\isa{\isacommand{notation}}}},
   414   but removes the specified syntax annotation from the present
   415   context.
   416 
   417   \end{description}
   418 
   419   Compared to the underlying \hyperlink{command.syntax}{\mbox{\isa{\isacommand{syntax}}}} and \hyperlink{command.no-syntax}{\mbox{\isa{\isacommand{no{\isacharunderscore}syntax}}}} primitives (\secref{sec:syn-trans}), the above commands
   420   provide explicit checking wrt.\ the logical context, and work within
   421   general local theory targets, not just the global theory.%
   422 \end{isamarkuptext}%
   423 \isamarkuptrue%
   424 %
   425 \isamarkupsection{The Pure syntax \label{sec:pure-syntax}%
   426 }
   427 \isamarkuptrue%
   428 %
   429 \isamarkupsubsection{Priority grammars \label{sec:priority-grammar}%
   430 }
   431 \isamarkuptrue%
   432 %
   433 \begin{isamarkuptext}%
   434 A context-free grammar consists of a set of \emph{terminal
   435   symbols}, a set of \emph{nonterminal symbols} and a set of
   436   \emph{productions}.  Productions have the form \isa{{\isachardoublequote}A\ {\isacharequal}\ {\isasymgamma}{\isachardoublequote}},
   437   where \isa{A} is a nonterminal and \isa{{\isasymgamma}} is a string of
   438   terminals and nonterminals.  One designated nonterminal is called
   439   the \emph{root symbol}.  The language defined by the grammar
   440   consists of all strings of terminals that can be derived from the
   441   root symbol by applying productions as rewrite rules.
   442 
   443   The standard Isabelle parser for inner syntax uses a \emph{priority
   444   grammar}.  Each nonterminal is decorated by an integer priority:
   445   \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
   446   using a production \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup q\isactrlsup {\isacharparenright}\ {\isacharequal}\ {\isasymgamma}{\isachardoublequote}} only if \isa{{\isachardoublequote}p\ {\isasymle}\ q{\isachardoublequote}}.  Any
   447   priority grammar can be translated into a normal context-free
   448   grammar by introducing new nonterminals and productions.
   449 
   450   \medskip Formally, a set of context free productions \isa{G}
   451   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.
   452   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}
   453   contains some production \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup q\isactrlsup {\isacharparenright}\ {\isacharequal}\ {\isasymgamma}{\isachardoublequote}} for \isa{{\isachardoublequote}p\ {\isasymle}\ q{\isachardoublequote}}.
   454 
   455   \medskip The following grammar for arithmetic expressions
   456   demonstrates how binding power and associativity of operators can be
   457   enforced by priorities.
   458 
   459   \begin{center}
   460   \begin{tabular}{rclr}
   461   \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|)| \\
   462   \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| \\
   463   \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}} \\
   464   \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}} \\
   465   \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}} \\
   466   \end{tabular}
   467   \end{center}
   468   The choice of priorities determines that \verb|-| binds
   469   tighter than \verb|*|, which binds tighter than \verb|+|.  Furthermore \verb|+| associates to the left and
   470   \verb|*| to the right.
   471 
   472   \medskip For clarity, grammars obey these conventions:
   473   \begin{itemize}
   474 
   475   \item All priorities must lie between 0 and 1000.
   476 
   477   \item Priority 0 on the right-hand side and priority 1000 on the
   478   left-hand side may be omitted.
   479 
   480   \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
   481   a column on the far right.
   482 
   483   \item Alternatives are separated by \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}}.
   484 
   485   \item Repetition is indicated by dots \isa{{\isachardoublequote}{\isacharparenleft}{\isasymdots}{\isacharparenright}{\isachardoublequote}} in an informal
   486   but obvious way.
   487 
   488   \end{itemize}
   489 
   490   Using these conventions, the example grammar specification above
   491   takes the form:
   492   \begin{center}
   493   \begin{tabular}{rclc}
   494     \isa{A} & \isa{{\isachardoublequote}{\isacharequal}{\isachardoublequote}} & \verb|(| \isa{A} \verb|)| \\
   495               & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|0| & \qquad\qquad \\
   496               & \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}} \\
   497               & \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}} \\
   498               & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|-| \isa{{\isachardoublequote}A\isactrlsup {\isacharparenleft}\isactrlsup {\isadigit{3}}\isactrlsup {\isacharparenright}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{3}}{\isacharparenright}{\isachardoublequote}} \\
   499   \end{tabular}
   500   \end{center}%
   501 \end{isamarkuptext}%
   502 \isamarkuptrue%
   503 %
   504 \isamarkupsubsection{The Pure grammar%
   505 }
   506 \isamarkuptrue%
   507 %
   508 \begin{isamarkuptext}%
   509 The priority grammar of the \isa{{\isachardoublequote}Pure{\isachardoublequote}} theory is defined as follows:
   510 
   511   %FIXME syntax for "index" (?)
   512   %FIXME "op" versions of ==> etc. (?)
   513 
   514   \begin{center}
   515   \begin{supertabular}{rclr}
   516 
   517   \indexdef{inner}{syntax}{any}\hypertarget{syntax.inner.any}{\hyperlink{syntax.inner.any}{\mbox{\isa{any}}}} & = & \isa{{\isachardoublequote}prop\ \ {\isacharbar}\ \ logic{\isachardoublequote}} \\\\
   518 
   519   \indexdef{inner}{syntax}{prop}\hypertarget{syntax.inner.prop}{\hyperlink{syntax.inner.prop}{\mbox{\isa{prop}}}} & = & \verb|(| \isa{prop} \verb|)| \\
   520     & \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}} \\
   521     & \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}} \\
   522     & \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}} \\
   523     & \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}} \\
   524     & \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}} \\
   525     & \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}} \\
   526     & \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}} \\
   527     & \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}} \\
   528     & \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}} \\
   529     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|!!| \isa{idts} \verb|.| \isa{prop} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{0}}{\isacharparenright}{\isachardoublequote}} \\
   530     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}{\isasymAnd}{\isachardoublequote}} \isa{idts} \verb|.| \isa{prop} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{0}}{\isacharparenright}{\isachardoublequote}} \\
   531     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|OFCLASS| \verb|(| \isa{type} \verb|,| \isa{logic} \verb|)| \\
   532     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|SORT_CONSTRAINT| \verb|(| \isa{type} \verb|)| \\
   533     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|TERM| \isa{logic} \\
   534     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|PROP| \isa{aprop} \\\\
   535 
   536   \indexdef{inner}{syntax}{aprop}\hypertarget{syntax.inner.aprop}{\hyperlink{syntax.inner.aprop}{\mbox{\isa{aprop}}}} & = & \verb|(| \isa{aprop} \verb|)| \\
   537     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}id\ \ {\isacharbar}\ \ longid\ \ {\isacharbar}\ \ var\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|_|\isa{{\isachardoublequote}\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|...| \\
   538     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|CONST| \isa{{\isachardoublequote}id\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|CONST| \isa{{\isachardoublequote}longid{\isachardoublequote}} \\
   539     & \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}} \\\\
   540 
   541   \indexdef{inner}{syntax}{logic}\hypertarget{syntax.inner.logic}{\hyperlink{syntax.inner.logic}{\mbox{\isa{logic}}}} & = & \verb|(| \isa{logic} \verb|)| \\
   542     & \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}} \\
   543     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}id\ \ {\isacharbar}\ \ longid\ \ {\isacharbar}\ \ var\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|_|\isa{{\isachardoublequote}\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|...| \\
   544     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|CONST| \isa{{\isachardoublequote}id\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|CONST| \isa{{\isachardoublequote}longid{\isachardoublequote}} \\
   545     & \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}} \\
   546     & \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}} \\
   547     & \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}} \\
   548     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|TYPE| \verb|(| \isa{type} \verb|)| \\\\
   549 
   550   \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|_| \\
   551     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{id} \verb|::| \isa{type} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{0}}{\isacharparenright}{\isachardoublequote}} \\
   552     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|_| \verb|::| \isa{type} & \isa{{\isachardoublequote}{\isacharparenleft}{\isadigit{0}}{\isacharparenright}{\isachardoublequote}} \\\\
   553 
   554   \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}} \\\\
   555 
   556   \indexdef{inner}{syntax}{pttrn}\hypertarget{syntax.inner.pttrn}{\hyperlink{syntax.inner.pttrn}{\mbox{\isa{pttrn}}}} & = & \isa{idt} \\\\
   557 
   558   \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}} \\\\
   559 
   560   \indexdef{inner}{syntax}{type}\hypertarget{syntax.inner.type}{\hyperlink{syntax.inner.type}{\mbox{\isa{type}}}} & = & \verb|(| \isa{type} \verb|)| \\
   561     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \isa{{\isachardoublequote}tid\ \ {\isacharbar}\ \ tvar\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|_| \\
   562     & \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}} \\
   563     & \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} \\
   564     & \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}} \\
   565     & \isa{{\isachardoublequote}{\isacharbar}{\isachardoublequote}} & \verb|(| \isa{type} \verb|,| \isa{{\isachardoublequote}{\isasymdots}{\isachardoublequote}} \verb|,| \isa{type} \verb|)| \isa{longid} \\
   566     & \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}} \\
   567     & \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}} \\
   568     & \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}} \\
   569     & \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}} \\\\
   570 
   571   \indexdef{inner}{syntax}{sort}\hypertarget{syntax.inner.sort}{\hyperlink{syntax.inner.sort}{\mbox{\isa{sort}}}} & = & \isa{{\isachardoublequote}id\ \ {\isacharbar}\ \ longid\ \ {\isacharbar}\ \ {\isachardoublequote}}\verb|{}| \\
   572     & \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|}| \\
   573   \end{supertabular}
   574   \end{center}
   575 
   576   \medskip Here literal terminals are printed \verb|verbatim|;
   577   see also \secref{sec:inner-lex} for further token categories of the
   578   inner syntax.  The meaning of the nonterminals defined by the above
   579   grammar is as follows:
   580 
   581   \begin{description}
   582 
   583   \item \indexref{inner}{syntax}{any}\hyperlink{syntax.inner.any}{\mbox{\isa{any}}} denotes any term.
   584 
   585   \item \indexref{inner}{syntax}{prop}\hyperlink{syntax.inner.prop}{\mbox{\isa{prop}}} denotes meta-level propositions,
   586   which are terms of type \isa{prop}.  The syntax of such formulae of
   587   the meta-logic is carefully distinguished from usual conventions for
   588   object-logics.  In particular, plain \isa{{\isachardoublequote}{\isasymlambda}{\isachardoublequote}}-term notation is
   589   \emph{not} recognized as \hyperlink{syntax.inner.prop}{\mbox{\isa{prop}}}.
   590 
   591   \item \indexref{inner}{syntax}{aprop}\hyperlink{syntax.inner.aprop}{\mbox{\isa{aprop}}} denotes atomic propositions, which
   592   are embedded into regular \hyperlink{syntax.inner.prop}{\mbox{\isa{prop}}} by means of an
   593   explicit \verb|PROP| token.
   594 
   595   Terms of type \isa{prop} with non-constant head, e.g.\ a plain
   596   variable, are printed in this form.  Constants that yield type \isa{prop} are expected to provide their own concrete syntax; otherwise
   597   the printed version will appear like \hyperlink{syntax.inner.logic}{\mbox{\isa{logic}}} and
   598   cannot be parsed again as \hyperlink{syntax.inner.prop}{\mbox{\isa{prop}}}.
   599 
   600   \item \indexref{inner}{syntax}{logic}\hyperlink{syntax.inner.logic}{\mbox{\isa{logic}}} denotes arbitrary terms of a
   601   logical type, excluding type \isa{prop}.  This is the main
   602   syntactic category of object-logic entities, covering plain \isa{{\isasymlambda}}-term notation (variables, abstraction, application), plus
   603   anything defined by the user.
   604 
   605   When specifying notation for logical entities, all logical types
   606   (excluding \isa{prop}) are \emph{collapsed} to this single category
   607   of \hyperlink{syntax.inner.logic}{\mbox{\isa{logic}}}.
   608 
   609   \item \indexref{inner}{syntax}{idt}\hyperlink{syntax.inner.idt}{\mbox{\isa{idt}}} denotes identifiers, possibly
   610   constrained by types.
   611 
   612   \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
   613   iterated binders, such as \isa{{\isachardoublequote}{\isasymlambda}{\isachardoublequote}} or \isa{{\isachardoublequote}{\isasymAnd}{\isachardoublequote}}.
   614 
   615   \item \indexref{inner}{syntax}{pttrn}\hyperlink{syntax.inner.pttrn}{\mbox{\isa{pttrn}}} and \indexref{inner}{syntax}{pttrns}\hyperlink{syntax.inner.pttrns}{\mbox{\isa{pttrns}}}
   616   denote patterns for abstraction, cases bindings etc.  In Pure, these
   617   categories start as a merely copy of \hyperlink{syntax.inner.idt}{\mbox{\isa{idt}}} and
   618   \hyperlink{syntax.inner.idts}{\mbox{\isa{idts}}}, respectively.  Object-logics may add
   619   additional productions for binding forms.
   620 
   621   \item \indexref{inner}{syntax}{type}\hyperlink{syntax.inner.type}{\mbox{\isa{type}}} denotes types of the meta-logic.
   622 
   623   \item \indexref{inner}{syntax}{sort}\hyperlink{syntax.inner.sort}{\mbox{\isa{sort}}} denotes meta-level sorts.
   624 
   625   \end{description}
   626 
   627   Here are some further explanations of certain syntax features.
   628 
   629   \begin{itemize}
   630 
   631   \item In \hyperlink{syntax.inner.idts}{\mbox{\isa{idts}}}, note that \isa{{\isachardoublequote}x\ {\isacharcolon}{\isacharcolon}\ nat\ y{\isachardoublequote}} is
   632   parsed as \isa{{\isachardoublequote}x\ {\isacharcolon}{\isacharcolon}\ {\isacharparenleft}nat\ y{\isacharparenright}{\isachardoublequote}}, treating \isa{y} like a type
   633   constructor applied to \isa{nat}.  To avoid this interpretation,
   634   write \isa{{\isachardoublequote}{\isacharparenleft}x\ {\isacharcolon}{\isacharcolon}\ nat{\isacharparenright}\ y{\isachardoublequote}} with explicit parentheses.
   635 
   636   \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
   637   sequence of identifiers.
   638 
   639   \item Type constraints for terms bind very weakly.  For example,
   640   \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
   641   input is likely to be ambiguous.  The correct form is \isa{{\isachardoublequote}x\ {\isacharless}\ {\isacharparenleft}y\ {\isacharcolon}{\isacharcolon}\ nat{\isacharparenright}{\isachardoublequote}}.
   642 
   643   \item Constraints may be either written with two literal colons
   644   ``\verb|::|'' or the double-colon symbol \verb|\<Colon>|,
   645   which actually looks exactly the same in some {\LaTeX} styles.
   646 
   647   \item Dummy variables (written as underscore) may occur in different
   648   roles.
   649 
   650   \begin{description}
   651 
   652   \item A type ``\isa{{\isachardoublequote}{\isacharunderscore}{\isachardoublequote}}'' or ``\isa{{\isachardoublequote}{\isacharunderscore}\ {\isacharcolon}{\isacharcolon}\ sort{\isachardoublequote}}'' acts like an
   653   anonymous inference parameter, which is filled-in according to the
   654   most general type produced by the type-checking phase.
   655 
   656   \item A bound ``\isa{{\isachardoublequote}{\isacharunderscore}{\isachardoublequote}}'' refers to a vacuous abstraction, where
   657   the body does not refer to the binding introduced here.  As in the
   658   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}}.
   659 
   660   \item A free ``\isa{{\isachardoublequote}{\isacharunderscore}{\isachardoublequote}}'' refers to an implicit outer binding.
   661   Higher definitional packages usually allow forms like \isa{{\isachardoublequote}f\ x\ {\isacharunderscore}\ {\isacharequal}\ x{\isachardoublequote}}.
   662 
   663   \item A schematic ``\isa{{\isachardoublequote}{\isacharunderscore}{\isachardoublequote}}'' (within a term pattern, see
   664   \secref{sec:term-decls}) refers to an anonymous variable that is
   665   implicitly abstracted over its context of locally bound variables.
   666   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
   667   using both bound and schematic dummies.
   668 
   669   \end{description}
   670 
   671   \item The three literal dots ``\verb|...|'' may be also
   672   written as ellipsis symbol \verb|\<dots>|.  In both cases this
   673   refers to a special schematic variable, which is bound in the
   674   context.  This special term abbreviation works nicely with
   675   calculational reasoning (\secref{sec:calculation}).
   676 
   677   \end{itemize}%
   678 \end{isamarkuptext}%
   679 \isamarkuptrue%
   680 %
   681 \isamarkupsection{Lexical matters \label{sec:inner-lex}%
   682 }
   683 \isamarkuptrue%
   684 %
   685 \begin{isamarkuptext}%
   686 The inner lexical syntax vaguely resembles the outer one
   687   (\secref{sec:outer-lex}), but some details are different.  There are
   688   two main categories of inner syntax tokens:
   689 
   690   \begin{enumerate}
   691 
   692   \item \emph{delimiters} --- the literal tokens occurring in
   693   productions of the given priority grammar (cf.\
   694   \secref{sec:priority-grammar});
   695 
   696   \item \emph{named tokens} --- various categories of identifiers etc.
   697 
   698   \end{enumerate}
   699 
   700   Delimiters override named tokens and may thus render certain
   701   identifiers inaccessible.  Sometimes the logical context admits
   702   alternative ways to refer to the same entity, potentially via
   703   qualified names.
   704 
   705   \medskip The categories for named tokens are defined once and for
   706   all as follows, reusing some categories of the outer token syntax
   707   (\secref{sec:outer-lex}).
   708 
   709   \begin{center}
   710   \begin{supertabular}{rcl}
   711     \indexdef{inner}{syntax}{id}\hypertarget{syntax.inner.id}{\hyperlink{syntax.inner.id}{\mbox{\isa{id}}}} & = & \indexref{}{syntax}{ident}\hyperlink{syntax.ident}{\mbox{\isa{ident}}} \\
   712     \indexdef{inner}{syntax}{longid}\hypertarget{syntax.inner.longid}{\hyperlink{syntax.inner.longid}{\mbox{\isa{longid}}}} & = & \indexref{}{syntax}{longident}\hyperlink{syntax.longident}{\mbox{\isa{longident}}} \\
   713     \indexdef{inner}{syntax}{var}\hypertarget{syntax.inner.var}{\hyperlink{syntax.inner.var}{\mbox{\isa{var}}}} & = & \indexref{}{syntax}{var}\hyperlink{syntax.var}{\mbox{\isa{var}}} \\
   714     \indexdef{inner}{syntax}{tid}\hypertarget{syntax.inner.tid}{\hyperlink{syntax.inner.tid}{\mbox{\isa{tid}}}} & = & \indexref{}{syntax}{typefree}\hyperlink{syntax.typefree}{\mbox{\isa{typefree}}} \\
   715     \indexdef{inner}{syntax}{tvar}\hypertarget{syntax.inner.tvar}{\hyperlink{syntax.inner.tvar}{\mbox{\isa{tvar}}}} & = & \indexref{}{syntax}{typevar}\hyperlink{syntax.typevar}{\mbox{\isa{typevar}}} \\
   716     \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}}} \\
   717     \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}}} \\
   718     \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}}} \\
   719 
   720     \indexdef{inner}{syntax}{xstr}\hypertarget{syntax.inner.xstr}{\hyperlink{syntax.inner.xstr}{\mbox{\isa{xstr}}}} & = & \verb|''| \isa{{\isachardoublequote}{\isasymdots}{\isachardoublequote}} \verb|''| \\
   721   \end{supertabular}
   722   \end{center}
   723 
   724   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
   725   not used in Pure.  Object-logics may implement numerals and string
   726   constants by adding appropriate syntax declarations, together with
   727   some translation functions (e.g.\ see Isabelle/HOL).
   728 
   729   The derived categories \indexdef{inner}{syntax}{num\_const}\hypertarget{syntax.inner.num-const}{\hyperlink{syntax.inner.num-const}{\mbox{\isa{num{\isacharunderscore}const}}}} and
   730   \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
   731   syntax tree holds a syntactic constant instead of a free variable.%
   732 \end{isamarkuptext}%
   733 \isamarkuptrue%
   734 %
   735 \isamarkupsection{Syntax and translations \label{sec:syn-trans}%
   736 }
   737 \isamarkuptrue%
   738 %
   739 \begin{isamarkuptext}%
   740 \begin{matharray}{rcl}
   741     \indexdef{}{command}{nonterminals}\hypertarget{command.nonterminals}{\hyperlink{command.nonterminals}{\mbox{\isa{\isacommand{nonterminals}}}}} & : & \isa{{\isachardoublequote}theory\ {\isasymrightarrow}\ theory{\isachardoublequote}} \\
   742     \indexdef{}{command}{syntax}\hypertarget{command.syntax}{\hyperlink{command.syntax}{\mbox{\isa{\isacommand{syntax}}}}} & : & \isa{{\isachardoublequote}theory\ {\isasymrightarrow}\ theory{\isachardoublequote}} \\
   743     \indexdef{}{command}{no\_syntax}\hypertarget{command.no-syntax}{\hyperlink{command.no-syntax}{\mbox{\isa{\isacommand{no{\isacharunderscore}syntax}}}}} & : & \isa{{\isachardoublequote}theory\ {\isasymrightarrow}\ theory{\isachardoublequote}} \\
   744     \indexdef{}{command}{translations}\hypertarget{command.translations}{\hyperlink{command.translations}{\mbox{\isa{\isacommand{translations}}}}} & : & \isa{{\isachardoublequote}theory\ {\isasymrightarrow}\ theory{\isachardoublequote}} \\
   745     \indexdef{}{command}{no\_translations}\hypertarget{command.no-translations}{\hyperlink{command.no-translations}{\mbox{\isa{\isacommand{no{\isacharunderscore}translations}}}}} & : & \isa{{\isachardoublequote}theory\ {\isasymrightarrow}\ theory{\isachardoublequote}} \\
   746   \end{matharray}
   747 
   748   \begin{rail}
   749     'nonterminals' (name +)
   750     ;
   751     ('syntax' | 'no\_syntax') mode? (constdecl +)
   752     ;
   753     ('translations' | 'no\_translations') (transpat ('==' | '=>' | '<=' | rightleftharpoons | rightharpoonup | leftharpoondown) transpat +)
   754     ;
   755 
   756     mode: ('(' ( name | 'output' | name 'output' ) ')')
   757     ;
   758     transpat: ('(' nameref ')')? string
   759     ;
   760   \end{rail}
   761 
   762   \begin{description}
   763   
   764   \item \hyperlink{command.nonterminals}{\mbox{\isa{\isacommand{nonterminals}}}}~\isa{c} declares a type
   765   constructor \isa{c} (without arguments) to act as purely syntactic
   766   type: a nonterminal symbol of the inner syntax.
   767 
   768   \item \hyperlink{command.syntax}{\mbox{\isa{\isacommand{syntax}}}}~\isa{{\isachardoublequote}{\isacharparenleft}mode{\isacharparenright}\ decls{\isachardoublequote}} is similar to
   769   \hyperlink{command.consts}{\mbox{\isa{\isacommand{consts}}}}~\isa{decls}, except that the actual logical
   770   signature extension is omitted.  Thus the context free grammar of
   771   Isabelle's inner syntax may be augmented in arbitrary ways,
   772   independently of the logic.  The \isa{mode} argument refers to the
   773   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
   774   input and output grammar.
   775   
   776   \item \hyperlink{command.no-syntax}{\mbox{\isa{\isacommand{no{\isacharunderscore}syntax}}}}~\isa{{\isachardoublequote}{\isacharparenleft}mode{\isacharparenright}\ decls{\isachardoublequote}} removes grammar
   777   declarations (and translations) resulting from \isa{decls}, which
   778   are interpreted in the same manner as for \hyperlink{command.syntax}{\mbox{\isa{\isacommand{syntax}}}} above.
   779   
   780   \item \hyperlink{command.translations}{\mbox{\isa{\isacommand{translations}}}}~\isa{rules} specifies syntactic
   781   translation rules (i.e.\ macros): parse~/ print rules (\isa{{\isachardoublequote}{\isasymrightleftharpoons}{\isachardoublequote}}),
   782   parse rules (\isa{{\isachardoublequote}{\isasymrightharpoonup}{\isachardoublequote}}), or print rules (\isa{{\isachardoublequote}{\isasymleftharpoondown}{\isachardoublequote}}).
   783   Translation patterns may be prefixed by the syntactic category to be
   784   used for parsing; the default is \isa{logic}.
   785   
   786   \item \hyperlink{command.no-translations}{\mbox{\isa{\isacommand{no{\isacharunderscore}translations}}}}~\isa{rules} removes syntactic
   787   translation rules, which are interpreted in the same manner as for
   788   \hyperlink{command.translations}{\mbox{\isa{\isacommand{translations}}}} above.
   789 
   790   \end{description}%
   791 \end{isamarkuptext}%
   792 \isamarkuptrue%
   793 %
   794 \isamarkupsection{Syntax translation functions \label{sec:tr-funs}%
   795 }
   796 \isamarkuptrue%
   797 %
   798 \begin{isamarkuptext}%
   799 \begin{matharray}{rcl}
   800     \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}} \\
   801     \indexdef{}{command}{parse\_translation}\hypertarget{command.parse-translation}{\hyperlink{command.parse-translation}{\mbox{\isa{\isacommand{parse{\isacharunderscore}translation}}}}} & : & \isa{{\isachardoublequote}theory\ {\isasymrightarrow}\ theory{\isachardoublequote}} \\
   802     \indexdef{}{command}{print\_translation}\hypertarget{command.print-translation}{\hyperlink{command.print-translation}{\mbox{\isa{\isacommand{print{\isacharunderscore}translation}}}}} & : & \isa{{\isachardoublequote}theory\ {\isasymrightarrow}\ theory{\isachardoublequote}} \\
   803     \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}} \\
   804     \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}} \\
   805   \end{matharray}
   806 
   807   \begin{rail}
   808   ( 'parse\_ast\_translation' | 'parse\_translation' | 'print\_translation' |
   809     'typed\_print\_translation' | 'print\_ast\_translation' ) ('(advanced)')? text
   810   ;
   811   \end{rail}
   812 
   813   Syntax translation functions written in ML admit almost arbitrary
   814   manipulations of Isabelle's inner syntax.  Any of the above commands
   815   have a single \railqtok{text} argument that refers to an ML
   816   expression of appropriate type, which are as follows by default:
   817 
   818 %FIXME proper antiquotations
   819 \begin{ttbox}
   820 val parse_ast_translation   : (string * (ast list -> ast)) list
   821 val parse_translation       : (string * (term list -> term)) list
   822 val print_translation       : (string * (term list -> term)) list
   823 val typed_print_translation :
   824   (string * (bool -> typ -> term list -> term)) list
   825 val print_ast_translation   : (string * (ast list -> ast)) list
   826 \end{ttbox}
   827 
   828   If the \isa{{\isachardoublequote}{\isacharparenleft}advanced{\isacharparenright}{\isachardoublequote}} option is given, the corresponding
   829   translation functions may depend on the current theory or proof
   830   context.  This allows to implement advanced syntax mechanisms, as
   831   translations functions may refer to specific theory declarations or
   832   auxiliary proof data.
   833 
   834   See also \cite{isabelle-ref} for more information on the general
   835   concept of syntax transformations in Isabelle.
   836 
   837 %FIXME proper antiquotations
   838 \begin{ttbox}
   839 val parse_ast_translation:
   840   (string * (Proof.context -> ast list -> ast)) list
   841 val parse_translation:
   842   (string * (Proof.context -> term list -> term)) list
   843 val print_translation:
   844   (string * (Proof.context -> term list -> term)) list
   845 val typed_print_translation:
   846   (string * (Proof.context -> bool -> typ -> term list -> term)) list
   847 val print_ast_translation:
   848   (string * (Proof.context -> ast list -> ast)) list
   849 \end{ttbox}%
   850 \end{isamarkuptext}%
   851 \isamarkuptrue%
   852 %
   853 \isamarkupsection{Inspecting the syntax%
   854 }
   855 \isamarkuptrue%
   856 %
   857 \begin{isamarkuptext}%
   858 \begin{matharray}{rcl}
   859     \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}} \\
   860   \end{matharray}
   861 
   862   \begin{description}
   863 
   864   \item \hyperlink{command.print-syntax}{\mbox{\isa{\isacommand{print{\isacharunderscore}syntax}}}} prints the inner syntax of the
   865   current context.  The output can be quite large; the most important
   866   sections are explained below.
   867 
   868   \begin{description}
   869 
   870   \item \isa{{\isachardoublequote}lexicon{\isachardoublequote}} lists the delimiters of the inner token
   871   language; see \secref{sec:inner-lex}.
   872 
   873   \item \isa{{\isachardoublequote}prods{\isachardoublequote}} lists the productions of the underlying
   874   priority grammar; see \secref{sec:priority-grammar}.
   875 
   876   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
   877   \isa{{\isachardoublequote}{\isasymdots}\ {\isacharequal}{\isachargreater}\ name{\isachardoublequote}}.  These names later become the heads of parse
   878   trees; they also guide the pretty printer.
   879 
   880   Productions without such parse tree names are called \emph{copy
   881   productions}.  Their right-hand side must have exactly one
   882   nonterminal symbol (or named token).  The parser does not create a
   883   new parse tree node for copy productions, but simply returns the
   884   parse tree of the right-hand symbol.
   885 
   886   If the right-hand side of a copy production consists of a single
   887   nonterminal without any delimiters, then it is called a \emph{chain
   888   production}.  Chain productions act as abbreviations: conceptually,
   889   they are removed from the grammar by adding new productions.
   890   Priority information attached to chain productions is ignored; only
   891   the dummy value \isa{{\isachardoublequote}{\isacharminus}{\isadigit{1}}{\isachardoublequote}} is displayed.
   892 
   893   \item \isa{{\isachardoublequote}print\ modes{\isachardoublequote}} lists the alternative print modes
   894   provided by this grammar; see \secref{sec:print-modes}.
   895 
   896   \item \isa{{\isachardoublequote}parse{\isacharunderscore}rules{\isachardoublequote}} and \isa{{\isachardoublequote}print{\isacharunderscore}rules{\isachardoublequote}} relate to
   897   syntax translations (macros); see \secref{sec:syn-trans}.
   898 
   899   \item \isa{{\isachardoublequote}parse{\isacharunderscore}ast{\isacharunderscore}translation{\isachardoublequote}} and \isa{{\isachardoublequote}print{\isacharunderscore}ast{\isacharunderscore}translation{\isachardoublequote}} list sets of constants that invoke
   900   translation functions for abstract syntax trees, which are only
   901   required in very special situations; see \secref{sec:tr-funs}.
   902 
   903   \item \isa{{\isachardoublequote}parse{\isacharunderscore}translation{\isachardoublequote}} and \isa{{\isachardoublequote}print{\isacharunderscore}translation{\isachardoublequote}}
   904   list the sets of constants that invoke regular translation
   905   functions; see \secref{sec:tr-funs}.
   906 
   907   \end{description}
   908   
   909   \end{description}%
   910 \end{isamarkuptext}%
   911 \isamarkuptrue%
   912 %
   913 \isadelimtheory
   914 %
   915 \endisadelimtheory
   916 %
   917 \isatagtheory
   918 \isacommand{end}\isamarkupfalse%
   919 %
   920 \endisatagtheory
   921 {\isafoldtheory}%
   922 %
   923 \isadelimtheory
   924 %
   925 \endisadelimtheory
   926 \isanewline
   927 \end{isabellebody}%
   928 %%% Local Variables:
   929 %%% mode: latex
   930 %%% TeX-master: "root"
   931 %%% End: