2 \chapter{Basic language elements}\label{ch:pure-syntax}
4 Subsequently, we introduce the main part of Pure theory and proof commands,
5 together with fundamental proof methods and attributes.
6 Chapter~\ref{ch:gen-tools} describes further Isar elements provided by generic
7 tools and packages (such as the Simplifier) that are either part of Pure
8 Isabelle or pre-installed in most object logics. Chapter~\ref{ch:logics}
9 refers to object-logic specific elements (mainly for HOL and ZF).
13 Isar commands may be either \emph{proper} document constructors, or
14 \emph{improper commands}. Some proof methods and attributes introduced later
15 are classified as improper as well. Improper Isar language elements, which
16 are subsequently marked by ``$^*$'', are often helpful when developing proof
17 documents, while their use is discouraged for the final human-readable
18 outcome. Typical examples are diagnostic commands that print terms or
19 theorems according to the current context; other commands emulate old-style
20 tactical theorem proving.
23 \section{Theory commands}
25 \subsection{Defining theories}\label{sec:begin-thy}
27 \indexisarcmd{header}\indexisarcmd{theory}\indexisarcmd{context}\indexisarcmd{end}
28 \begin{matharray}{rcl}
29 \isarcmd{header} & : & \isarkeep{toplevel} \\
30 \isarcmd{theory} & : & \isartrans{toplevel}{theory} \\
31 \isarcmd{context}^* & : & \isartrans{toplevel}{theory} \\
32 \isarcmd{end} & : & \isartrans{theory}{toplevel} \\
35 Isabelle/Isar ``new-style'' theories are either defined via theory files or
36 interactively. Both theory-level specifications and proofs are handled
37 uniformly --- occasionally definitional mechanisms even require some explicit
38 proof as well. In contrast, ``old-style'' Isabelle theories support batch
39 processing only, with the proof scripts collected in separate ML files.
41 The first ``real'' command of any theory has to be $\THEORY$, which starts a
42 new theory based on the merge of existing ones. Just preceding $\THEORY$,
43 there may be an optional $\isarkeyword{header}$ declaration, which is relevant
44 to document preparation only; it acts very much like a special pre-theory
45 markup command (cf.\ \S\ref{sec:markup-thy} and \S\ref{sec:markup-thy}). The
46 $\END$ command concludes a theory development; it has to be the very last
47 command of any theory file loaded in batch-mode. The theory context may be
48 also changed interactively by $\CONTEXT$ without creating a new theory.
53 'theory' name 'imports' (name +) uses? 'begin'
58 uses: 'uses' ((name | parname) +);
62 \item [$\isarkeyword{header}~text$] provides plain text markup just preceding
63 the formal beginning of a theory. In actual document preparation the
64 corresponding {\LaTeX} macro \verb,\isamarkupheader, may be redefined to
65 produce chapter or section headings. See also \S\ref{sec:markup-thy} and
66 \S\ref{sec:markup-prf} for further markup commands.
68 \item [$\THEORY~A~\isarkeyword{imports}~B@1~\ldots~B@n~\isarkeyword{begin}$]
69 starts a new theory $A$ based on the merge of existing theories $B@1, \dots,
72 Due to inclusion of several ancestors, the overall theory structure emerging
73 in an Isabelle session forms a directed acyclic graph (DAG). Isabelle's
74 theory loader ensures that the sources contributing to the development graph
75 are always up-to-date. Changed files are automatically reloaded when
76 processing theory headers interactively; batch-mode explicitly distinguishes
77 \verb,update_thy, from \verb,use_thy,, see also \cite{isabelle-ref}.
79 The optional $\isarkeyword{uses}$ specification declares additional
80 dependencies on ML files. Files will be loaded immediately, unless the name
81 is put in parentheses, which merely documents the dependency to be resolved
82 later in the text (typically via explicit $\isarcmd{use}$ in the body text,
83 see \S\ref{sec:ML}). In reminiscence of the old-style theory system of
84 Isabelle, \texttt{$A$.thy} may be also accompanied by an additional file
85 \texttt{$A$.ML} consisting of ML code that is executed in the context of the
86 \emph{finished} theory $A$. That file should not be included in the
87 $\isarkeyword{files}$ dependency declaration, though.
89 \item [$\CONTEXT~B$] enters an existing theory context, basically in read-only
90 mode, so only a limited set of commands may be performed without destroying
91 the theory. Just as for $\THEORY$, the theory loader ensures that $B$ is
92 loaded and up-to-date.
94 This command is occasionally useful for quick interactive experiments;
95 normally one should always commence a new context via $\THEORY$.
97 \item [$\END$] concludes the current theory definition or context switch.
98 Note that this command cannot be undone, but the whole theory definition has
104 \subsection{Markup commands}\label{sec:markup-thy}
106 \indexisarcmd{chapter}\indexisarcmd{section}\indexisarcmd{subsection}
107 \indexisarcmd{subsubsection}\indexisarcmd{text}\indexisarcmd{text-raw}
108 \begin{matharray}{rcl}
109 \isarcmd{chapter} & : & \isartrans{theory}{theory} \\
110 \isarcmd{section} & : & \isartrans{theory}{theory} \\
111 \isarcmd{subsection} & : & \isartrans{theory}{theory} \\
112 \isarcmd{subsubsection} & : & \isartrans{theory}{theory} \\
113 \isarcmd{text} & : & \isartrans{theory}{theory} \\
114 \isarcmd{text_raw} & : & \isartrans{theory}{theory} \\
117 Apart from formal comments (see \S\ref{sec:comments}), markup commands provide
118 a structured way to insert text into the document generated from a theory (see
119 \cite{isabelle-sys} for more information on Isabelle's document preparation
123 ('chapter' | 'section' | 'subsection' | 'subsubsection' | 'text') locale? text
130 \item [$\isarkeyword{chapter}$, $\isarkeyword{section}$,
131 $\isarkeyword{subsection}$, and $\isarkeyword{subsubsection}$] mark chapter
132 and section headings.
133 \item [$\TEXT$] specifies paragraphs of plain text.
134 \item [$\isarkeyword{text_raw}$] inserts {\LaTeX} source into the output,
135 without additional markup. Thus the full range of document manipulations
139 The $text$ argument of these markup commands (except for
140 $\isarkeyword{text_raw}$) may contain references to formal entities
141 (``antiquotations'', see also \S\ref{sec:antiq}). These are interpreted in
142 the present theory context, or the specified $locale$.
144 Any of these markup elements corresponds to a {\LaTeX} command with the name
145 prefixed by \verb,\isamarkup,. For the sectioning commands this is a plain
146 macro with a single argument, e.g.\ \verb,\isamarkupchapter{,\dots\verb,}, for
147 $\isarkeyword{chapter}$. The $\isarkeyword{text}$ markup results in a
148 {\LaTeX} environment \verb,\begin{isamarkuptext}, {\dots}
149 \verb,\end{isamarkuptext},, while $\isarkeyword{text_raw}$ causes the text
150 to be inserted directly into the {\LaTeX} source.
154 Additional markup commands are available for proofs (see
155 \S\ref{sec:markup-prf}). Also note that the $\isarkeyword{header}$
156 declaration (see \S\ref{sec:begin-thy}) admits to insert section markup just
157 preceding the actual theory definition.
160 \subsection{Type classes and sorts}\label{sec:classes}
162 \indexisarcmd{classes}\indexisarcmd{classrel}\indexisarcmd{defaultsort}
163 \begin{matharray}{rcll}
164 \isarcmd{classes} & : & \isartrans{theory}{theory} \\
165 \isarcmd{classrel} & : & \isartrans{theory}{theory} & (axiomatic!) \\
166 \isarcmd{defaultsort} & : & \isartrans{theory}{theory} \\
170 'classes' (classdecl +)
172 'classrel' (nameref ('<' | subseteq) nameref + 'and')
179 \item [$\isarkeyword{classes}~c \subseteq \vec c$] declares class $c$ to be a
180 subclass of existing classes $\vec c$. Cyclic class structures are ruled
182 \item [$\isarkeyword{classrel}~c@1 \subseteq c@2$] states subclass relations
183 between existing classes $c@1$ and $c@2$. This is done axiomatically! The
184 $\INSTANCE$ command (see \S\ref{sec:axclass}) provides a way to introduce
185 proven class relations.
186 \item [$\isarkeyword{defaultsort}~s$] makes sort $s$ the new default sort for
187 any type variables given without sort constraints. Usually, the default
188 sort would be only changed when defining a new object-logic.
192 \subsection{Primitive types and type abbreviations}\label{sec:types-pure}
194 \indexisarcmd{typedecl}\indexisarcmd{types}\indexisarcmd{nonterminals}\indexisarcmd{arities}
195 \begin{matharray}{rcll}
196 \isarcmd{types} & : & \isartrans{theory}{theory} \\
197 \isarcmd{typedecl} & : & \isartrans{theory}{theory} \\
198 \isarcmd{nonterminals} & : & \isartrans{theory}{theory} \\
199 \isarcmd{arities} & : & \isartrans{theory}{theory} & (axiomatic!) \\
203 'types' (typespec '=' type infix? +)
205 'typedecl' typespec infix?
207 'nonterminals' (name +)
209 'arities' (nameref '::' arity +)
215 \item [$\TYPES~(\vec\alpha)t = \tau$] introduces \emph{type synonym}
216 $(\vec\alpha)t$ for existing type $\tau$. Unlike actual type definitions,
217 as are available in Isabelle/HOL for example, type synonyms are just purely
218 syntactic abbreviations without any logical significance. Internally, type
219 synonyms are fully expanded.
221 \item [$\isarkeyword{typedecl}~(\vec\alpha)t$] declares a new type constructor
222 $t$, intended as an actual logical type. Note that the Isabelle/HOL
223 object-logic overrides $\isarkeyword{typedecl}$ by its own version
224 (\S\ref{sec:hol-typedef}).
226 \item [$\isarkeyword{nonterminals}~\vec c$] declares $0$-ary type constructors
227 $\vec c$ to act as purely syntactic types, i.e.\ nonterminal symbols of
228 Isabelle's inner syntax of terms or types.
230 \item [$\isarkeyword{arities}~t::(\vec s)s$] augments Isabelle's order-sorted
231 signature of types by new type constructor arities. This is done
232 axiomatically! The $\INSTANCE$ command (see \S\ref{sec:axclass}) provides a
233 way to introduce proven type arities.
238 \subsection{Constants and simple definitions}\label{sec:consts}
240 \indexisarcmd{consts}\indexisarcmd{defs}\indexisarcmd{constdefs}\indexoutertoken{constdecl}
241 \begin{matharray}{rcl}
242 \isarcmd{consts} & : & \isartrans{theory}{theory} \\
243 \isarcmd{defs} & : & \isartrans{theory}{theory} \\
244 \isarcmd{constdefs} & : & \isartrans{theory}{theory} \\
248 'consts' ((name '::' type mixfix?) +)
250 'defs' ('(' 'overloaded' ')')? (axmdecl prop +)
255 'constdefs' structs? (constdecl? constdef +)
258 structs: '(' 'structure' (vars + 'and') ')'
260 constdecl: (name '::' type) mixfix | (name '::' type) | name 'where' | mixfix
262 constdef: thmdecl? prop
267 \item [$\CONSTS~c::\sigma$] declares constant $c$ to have any instance of type
268 scheme $\sigma$. The optional mixfix annotations may attach concrete syntax
269 to the constants declared.
271 \item [$\DEFS~name: eqn$] introduces $eqn$ as a definitional axiom for some
272 existing constant. See \cite[\S6]{isabelle-ref} for more details on the
273 form of equations admitted as constant definitions.
275 The $(overloaded)$ option declares definitions to be potentially overloaded.
276 Unless this option is given, a warning message would be issued for any
277 definitional equation with a more special type than that of the
278 corresponding constant declaration.
280 \item [$\CONSTDEFS$] provides a streamlined combination of constants
281 declarations and definitions: type-inference takes care of the most general
282 typing of the given specification (the optional type constraint may refer to
283 type-inference dummies ``$_$'' as usual). The resulting type declaration
284 needs to agree with that of the specification; overloading is \emph{not}
287 The constant name may be omitted altogether, if neither type nor syntax
288 declarations are given. The canonical name of the definitional axiom for
289 constant $c$ will be $c_def$, unless specified otherwise. Also note that
290 the given list of specifications is processed in a strictly sequential
291 manner, with type-checking being performed independently.
293 An optional initial context of $(structure)$ declarations admits use of
294 indexed syntax, using the special symbol \verb,\<index>, (printed as
295 ``\i''). The latter concept is particularly useful with locales (see also
300 \subsection{Syntax and translations}\label{sec:syn-trans}
302 \indexisarcmd{syntax}\indexisarcmd{no-syntax}\indexisarcmd{translations}
303 \begin{matharray}{rcl}
304 \isarcmd{syntax} & : & \isartrans{theory}{theory} \\
305 \isarcmd{no_syntax} & : & \isartrans{theory}{theory} \\
306 \isarcmd{translations} & : & \isartrans{theory}{theory} \\
309 \railalias{rightleftharpoons}{\isasymrightleftharpoons}
310 \railterm{rightleftharpoons}
312 \railalias{rightharpoonup}{\isasymrightharpoonup}
313 \railterm{rightharpoonup}
315 \railalias{leftharpoondown}{\isasymleftharpoondown}
316 \railterm{leftharpoondown}
318 \railalias{nosyntax}{no\_syntax}
322 ('syntax' | nosyntax) mode? (constdecl +)
324 'translations' (transpat ('==' | '=>' | '<=' | rightleftharpoons | rightharpoonup | leftharpoondown) transpat +)
327 mode: ('(' ( name | 'output' | name 'output' ) ')')
329 transpat: ('(' nameref ')')? string
335 \item [$\isarkeyword{syntax}~(mode)~decls$] is similar to $\CONSTS~decls$,
336 except that the actual logical signature extension is omitted. Thus the
337 context free grammar of Isabelle's inner syntax may be augmented in
338 arbitrary ways, independently of the logic. The $mode$ argument refers to
339 the print mode that the grammar rules belong; unless the
340 $\isarkeyword{output}$ indicator is given, all productions are added both to
341 the input and output grammar.
343 \item [$\isarkeyword{no_syntax}~(mode)~decls$] removes grammar declarations
344 (and translations) resulting from $decls$, which are interpreted in the same
345 manner as for $\isarkeyword{syntax}$ above.
347 \item [$\isarkeyword{translations}~rules$] specifies syntactic translation
348 rules (i.e.\ macros): parse~/ print rules (\isasymrightleftharpoons), parse
349 rules (\isasymrightharpoonup), or print rules (\isasymleftharpoondown).
350 Translation patterns may be prefixed by the syntactic category to be used
351 for parsing; the default is $logic$.
355 \subsection{Axioms and theorems}\label{sec:axms-thms}
357 \indexisarcmd{axioms}\indexisarcmd{lemmas}\indexisarcmd{theorems}
358 \begin{matharray}{rcll}
359 \isarcmd{axioms} & : & \isartrans{theory}{theory} & (axiomatic!) \\
360 \isarcmd{lemmas} & : & \isartrans{theory}{theory} \\
361 \isarcmd{theorems} & : & \isartrans{theory}{theory} \\
365 'axioms' (axmdecl prop +)
367 ('lemmas' | 'theorems') locale? (thmdef? thmrefs + 'and')
373 \item [$\isarkeyword{axioms}~a: \phi$] introduces arbitrary statements as
374 axioms of the meta-logic. In fact, axioms are ``axiomatic theorems'', and
375 may be referred later just as any other theorem.
377 Axioms are usually only introduced when declaring new logical systems.
378 Everyday work is typically done the hard way, with proper definitions and
381 \item [$\isarkeyword{lemmas}~a = \vec b$] retrieves and stores existing facts
382 in the theory context, or the specified locale (see also
383 \S\ref{sec:locale}). Typical applications would also involve attributes, to
384 declare Simplifier rules, for example.
386 \item [$\isarkeyword{theorems}$] is essentially the same as
387 $\isarkeyword{lemmas}$, but marks the result as a different kind of facts.
392 \subsection{Name spaces}
394 \indexisarcmd{global}\indexisarcmd{local}\indexisarcmd{hide}
395 \begin{matharray}{rcl}
396 \isarcmd{global} & : & \isartrans{theory}{theory} \\
397 \isarcmd{local} & : & \isartrans{theory}{theory} \\
398 \isarcmd{hide} & : & \isartrans{theory}{theory} \\
402 'hide' ('(' 'open' ')')? name (nameref + )
406 Isabelle organizes any kind of name declarations (of types, constants,
407 theorems etc.) by separate hierarchically structured name spaces. Normally
408 the user does not have to control the behavior of name spaces by hand, yet the
409 following commands provide some way to do so.
412 \item [$\isarkeyword{global}$ and $\isarkeyword{local}$] change the current
413 name declaration mode. Initially, theories start in $\isarkeyword{local}$
414 mode, causing all names to be automatically qualified by the theory name.
415 Changing this to $\isarkeyword{global}$ causes all names to be declared
416 without the theory prefix, until $\isarkeyword{local}$ is declared again.
418 Note that global names are prone to get hidden accidently later, when
419 qualified names of the same base name are introduced.
421 \item [$\isarkeyword{hide}~space~names$] fully removes declarations from a
422 given name space (which may be $class$, $type$, or $const$); with the
423 $(open)$ option, only the base name is hidden. Global (unqualified) names
426 Note that hiding name space accesses has no impact on logical declarations
427 -- they remain valid internally. Entities that are no longer accessible to
428 the user are printed with the special qualifier ``$\mathord?\mathord?$''
429 prefixed to the full internal name.
433 \subsection{Incorporating ML code}\label{sec:ML}
435 \indexisarcmd{use}\indexisarcmd{ML}\indexisarcmd{ML-command}
436 \indexisarcmd{ML-setup}\indexisarcmd{setup}
437 \indexisarcmd{method-setup}
438 \begin{matharray}{rcl}
439 \isarcmd{use} & : & \isartrans{\cdot}{\cdot} \\
440 \isarcmd{ML} & : & \isartrans{\cdot}{\cdot} \\
441 \isarcmd{ML_command} & : & \isartrans{\cdot}{\cdot} \\
442 \isarcmd{ML_setup} & : & \isartrans{theory}{theory} \\
443 \isarcmd{setup} & : & \isartrans{theory}{theory} \\
444 \isarcmd{method_setup} & : & \isartrans{theory}{theory} \\
447 \railalias{MLsetup}{ML\_setup}
450 \railalias{methodsetup}{method\_setup}
451 \railterm{methodsetup}
453 \railalias{MLcommand}{ML\_command}
459 ('ML' | MLcommand | MLsetup | 'setup') text
461 methodsetup name '=' text text
466 \item [$\isarkeyword{use}~file$] reads and executes ML commands from $file$.
467 The current theory context (if present) is passed down to the ML session,
468 but may not be modified. Furthermore, the file name is checked with the
469 $\isarkeyword{files}$ dependency declaration given in the theory header (see
470 also \S\ref{sec:begin-thy}).
472 \item [$\isarkeyword{ML}~text$ and $\isarkeyword{ML_command}~text$] execute ML
473 commands from $text$. The theory context is passed in the same way as for
474 $\isarkeyword{use}$, but may not be changed. Note that the output of
475 $\isarkeyword{ML_command}$ is less verbose than plain $\isarkeyword{ML}$.
477 \item [$\isarkeyword{ML_setup}~text$] executes ML commands from $text$. The
478 theory context is passed down to the ML session, and fetched back
479 afterwards. Thus $text$ may actually change the theory as a side effect.
481 \item [$\isarkeyword{setup}~text$] changes the current theory context by
482 applying $text$, which refers to an ML expression of type
483 \texttt{(theory~->~theory)~list}. The $\isarkeyword{setup}$ command is the
484 canonical way to initialize any object-logic specific tools and packages
487 \item [$\isarkeyword{method_setup}~name = text~description$] defines a proof
488 method in the current theory. The given $text$ has to be an ML expression
489 of type \texttt{Args.src -> Proof.context -> Proof.method}. Parsing
490 concrete method syntax from \texttt{Args.src} input can be quite tedious in
491 general. The following simple examples are for methods without any explicit
492 arguments, or a list of theorems, respectively.
496 Method.no_args (Method.METHOD (fn facts => foobar_tac))
497 Method.thms_args (fn thms => Method.METHOD (fn facts => foobar_tac))
498 Method.ctxt_args (fn ctxt => Method.METHOD (fn facts => foobar_tac))
499 Method.thms_ctxt_args (fn thms => fn ctxt =>
500 Method.METHOD (fn facts => foobar_tac))
504 Note that mere tactic emulations may ignore the \texttt{facts} parameter
505 above. Proper proof methods would do something appropriate with the list of
506 current facts, though. Single-rule methods usually do strict forward-chaining
507 (e.g.\ by using \texttt{Method.multi_resolves}), while automatic ones just
508 insert the facts using \texttt{Method.insert_tac} before applying the main
513 \subsection{Syntax translation functions}
515 \indexisarcmd{parse-ast-translation}\indexisarcmd{parse-translation}
516 \indexisarcmd{print-translation}\indexisarcmd{typed-print-translation}
517 \indexisarcmd{print-ast-translation}\indexisarcmd{token-translation}
518 \begin{matharray}{rcl}
519 \isarcmd{parse_ast_translation} & : & \isartrans{theory}{theory} \\
520 \isarcmd{parse_translation} & : & \isartrans{theory}{theory} \\
521 \isarcmd{print_translation} & : & \isartrans{theory}{theory} \\
522 \isarcmd{typed_print_translation} & : & \isartrans{theory}{theory} \\
523 \isarcmd{print_ast_translation} & : & \isartrans{theory}{theory} \\
524 \isarcmd{token_translation} & : & \isartrans{theory}{theory} \\
527 \railalias{parseasttranslation}{parse\_ast\_translation}
528 \railterm{parseasttranslation}
530 \railalias{parsetranslation}{parse\_translation}
531 \railterm{parsetranslation}
533 \railalias{printtranslation}{print\_translation}
534 \railterm{printtranslation}
536 \railalias{typedprinttranslation}{typed\_print\_translation}
537 \railterm{typedprinttranslation}
539 \railalias{printasttranslation}{print\_ast\_translation}
540 \railterm{printasttranslation}
542 \railalias{tokentranslation}{token\_translation}
543 \railterm{tokentranslation}
546 ( parseasttranslation | parsetranslation | printtranslation | typedprinttranslation |
547 printasttranslation ) ('(' 'advanced' ')')? text;
549 tokentranslation text
552 Syntax translation functions written in ML admit almost arbitrary
553 manipulations of Isabelle's inner syntax. Any of the above commands have a
554 single \railqtok{text} argument that refers to an ML expression of appropriate
555 type, which are as follows by default:
558 val parse_ast_translation : (string * (ast list -> ast)) list
559 val parse_translation : (string * (term list -> term)) list
560 val print_translation : (string * (term list -> term)) list
561 val typed_print_translation :
562 (string * (bool -> typ -> term list -> term)) list
563 val print_ast_translation : (string * (ast list -> ast)) list
564 val token_translation :
565 (string * string * (string -> string * real)) list
568 In case that the $(advanced)$ option is given, the corresponding translation
569 functions may depend on the signature of the current theory context. This
570 allows to implement advanced syntax mechanisms, as translations functions may
571 refer to specific theory declarations and auxiliary data.
573 See also \cite[\S8]{isabelle-ref} for more information on the general concept
574 of syntax transformations in Isabelle.
577 val parse_ast_translation:
578 (string * (Sign.sg -> ast list -> ast)) list
579 val parse_translation:
580 (string * (Sign.sg -> term list -> term)) list
581 val print_translation:
582 (string * (Sign.sg -> term list -> term)) list
583 val typed_print_translation:
584 (string * (Sign.sg -> bool -> typ -> term list -> term)) list
585 val print_ast_translation:
586 (string * (Sign.sg -> ast list -> ast)) list
592 \indexisarcmd{oracle}
593 \begin{matharray}{rcl}
594 \isarcmd{oracle} & : & \isartrans{theory}{theory} \\
597 The oracle interface promotes a given ML function \texttt{theory -> T -> term}
598 to \texttt{theory -> T -> thm}, for some type \texttt{T} given by the user.
599 This acts like an infinitary specification of axioms -- there is no internal
600 check of the correctness of the results! The inference kernel records oracle
601 invocations within the internal derivation object of theorems, and the pretty
602 printer attaches ``\texttt{[!]}'' to indicate results that are not fully
603 checked by Isabelle inferences.
606 'oracle' name '(' type ')' '=' text
611 \item [$\isarkeyword{oracle}~name~(type)=~text$] turns the given ML expression
612 $text$ of type \texttt{theory~->~$type$~->~term} into an ML function $name$
613 of type \texttt{theory~->~$type$~->~thm}.
617 \section{Proof commands}
619 Proof commands perform transitions of Isar/VM machine configurations, which
620 are block-structured, consisting of a stack of nodes with three main
621 components: logical proof context, current facts, and open goals. Isar/VM
622 transitions are \emph{typed} according to the following three different modes
625 \item [$proof(prove)$] means that a new goal has just been stated that is now
626 to be \emph{proven}; the next command may refine it by some proof method,
627 and enter a sub-proof to establish the actual result.
628 \item [$proof(state)$] is like a nested theory mode: the context may be
629 augmented by \emph{stating} additional assumptions, intermediate results
631 \item [$proof(chain)$] is intermediate between $proof(state)$ and
632 $proof(prove)$: existing facts (i.e.\ the contents of the special ``$this$''
633 register) have been just picked up in order to be used when refining the
637 The proof mode indicator may be read as a verb telling the writer what kind of
638 operation may be performed next. The corresponding typings of proof commands
639 restricts the shape of well-formed proof texts to particular command
640 sequences. So dynamic arrangements of commands eventually turn out as static
641 texts of a certain structure. Appendix~\ref{ap:refcard} gives a simplified
642 grammar of the overall (extensible) language emerging that way.
645 \subsection{Markup commands}\label{sec:markup-prf}
647 \indexisarcmd{sect}\indexisarcmd{subsect}\indexisarcmd{subsubsect}
648 \indexisarcmd{txt}\indexisarcmd{txt-raw}
649 \begin{matharray}{rcl}
650 \isarcmd{sect} & : & \isartrans{proof}{proof} \\
651 \isarcmd{subsect} & : & \isartrans{proof}{proof} \\
652 \isarcmd{subsubsect} & : & \isartrans{proof}{proof} \\
653 \isarcmd{txt} & : & \isartrans{proof}{proof} \\
654 \isarcmd{txt_raw} & : & \isartrans{proof}{proof} \\
657 These markup commands for proof mode closely correspond to the ones of theory
658 mode (see \S\ref{sec:markup-thy}).
660 \railalias{txtraw}{txt\_raw}
664 ('sect' | 'subsect' | 'subsubsect' | 'txt' | txtraw) text
669 \subsection{Context elements}\label{sec:proof-context}
671 \indexisarcmd{fix}\indexisarcmd{assume}\indexisarcmd{presume}\indexisarcmd{def}
672 \begin{matharray}{rcl}
673 \isarcmd{fix} & : & \isartrans{proof(state)}{proof(state)} \\
674 \isarcmd{assume} & : & \isartrans{proof(state)}{proof(state)} \\
675 \isarcmd{presume} & : & \isartrans{proof(state)}{proof(state)} \\
676 \isarcmd{def} & : & \isartrans{proof(state)}{proof(state)} \\
679 The logical proof context consists of fixed variables and assumptions. The
680 former closely correspond to Skolem constants, or meta-level universal
681 quantification as provided by the Isabelle/Pure logical framework.
682 Introducing some \emph{arbitrary, but fixed} variable via ``$\FIX x$'' results
683 in a local value that may be used in the subsequent proof as any other
684 variable or constant. Furthermore, any result $\edrv \phi[x]$ exported from
685 the context will be universally closed wrt.\ $x$ at the outermost level:
686 $\edrv \All x \phi$ (this is expressed using Isabelle's meta-variables).
688 Similarly, introducing some assumption $\chi$ has two effects. On the one
689 hand, a local theorem is created that may be used as a fact in subsequent
690 proof steps. On the other hand, any result $\chi \drv \phi$ exported from the
691 context becomes conditional wrt.\ the assumption: $\edrv \chi \Imp \phi$.
692 Thus, solving an enclosing goal using such a result would basically introduce
693 a new subgoal stemming from the assumption. How this situation is handled
694 depends on the actual version of assumption command used: while $\ASSUMENAME$
695 insists on solving the subgoal by unification with some premise of the goal,
696 $\PRESUMENAME$ leaves the subgoal unchanged in order to be proved later by the
699 Local definitions, introduced by ``$\DEF{}{x \equiv t}$'', are achieved by
700 combining ``$\FIX x$'' with another version of assumption that causes any
701 hypothetical equation $x \equiv t$ to be eliminated by the reflexivity rule.
702 Thus, exporting some result $x \equiv t \drv \phi[x]$ yields $\edrv \phi[t]$.
704 \railalias{equiv}{\isasymequiv}
710 ('assume' | 'presume') (props + 'and')
712 'def' thmdecl? \\ name ('==' | equiv) term termpat?
718 \item [$\FIX{\vec x}$] introduces local \emph{arbitrary, but fixed} variables
721 \item [$\ASSUME{a}{\vec\phi}$ and $\PRESUME{a}{\vec\phi}$] introduce local
722 theorems $\vec\phi$ by assumption. Subsequent results applied to an
723 enclosing goal (e.g.\ by $\SHOWNAME$) are handled as follows: $\ASSUMENAME$
724 expects to be able to unify with existing premises in the goal, while
725 $\PRESUMENAME$ leaves $\vec\phi$ as new subgoals.
727 Several lists of assumptions may be given (separated by
728 $\isarkeyword{and}$); the resulting list of current facts consists of all of
731 \item [$\DEF{a}{x \equiv t}$] introduces a local (non-polymorphic) definition.
732 In results exported from the context, $x$ is replaced by $t$. Basically,
733 ``$\DEF{}{x \equiv t}$'' abbreviates ``$\FIX{x}~\ASSUME{}{x \equiv t}$'',
734 with the resulting hypothetical equation solved by reflexivity.
736 The default name for the definitional equation is $x_def$.
740 The special name $prems$\indexisarthm{prems} refers to all assumptions of the
741 current context as a list of theorems.
744 \subsection{Facts and forward chaining}
746 \indexisarcmd{note}\indexisarcmd{then}\indexisarcmd{from}\indexisarcmd{with}
748 \begin{matharray}{rcl}
749 \isarcmd{note} & : & \isartrans{proof(state)}{proof(state)} \\
750 \isarcmd{then} & : & \isartrans{proof(state)}{proof(chain)} \\
751 \isarcmd{from} & : & \isartrans{proof(state)}{proof(chain)} \\
752 \isarcmd{with} & : & \isartrans{proof(state)}{proof(chain)} \\
753 \isarcmd{using} & : & \isartrans{proof(prove)}{proof(prove)} \\
756 New facts are established either by assumption or proof of local statements.
757 Any fact will usually be involved in further proofs, either as explicit
758 arguments of proof methods, or when forward chaining towards the next goal via
759 $\THEN$ (and variants); $\FROMNAME$ and $\WITHNAME$ are composite forms
760 involving $\NOTENAME$. The $\USINGNAME$ elements augments the collection of
761 used facts \emph{after} a goal has been stated. Note that the special theorem
762 name $this$\indexisarthm{this} refers to the most recently established facts,
763 but only \emph{before} issuing a follow-up claim.
766 'note' (thmdef? thmrefs + 'and')
768 ('from' | 'with' | 'using') (thmrefs + 'and')
774 \item [$\NOTE{a}{\vec b}$] recalls existing facts $\vec b$, binding the result
775 as $a$. Note that attributes may be involved as well, both on the left and
778 \item [$\THEN$] indicates forward chaining by the current facts in order to
779 establish the goal to be claimed next. The initial proof method invoked to
780 refine that will be offered the facts to do ``anything appropriate'' (see
781 also \S\ref{sec:proof-steps}). For example, method $rule$ (see
782 \S\ref{sec:pure-meth-att}) would typically do an elimination rather than an
783 introduction. Automatic methods usually insert the facts into the goal
784 state before operation. This provides a simple scheme to control relevance
785 of facts in automated proof search.
787 \item [$\FROM{\vec b}$] abbreviates ``$\NOTE{}{\vec b}~\THEN$''; thus $\THEN$
788 is equivalent to ``$\FROM{this}$''.
790 \item [$\WITH{\vec b}$] abbreviates ``$\FROM{\vec b~\AND~this}$''; thus the
791 forward chaining is from earlier facts together with the current ones.
793 \item [$\USING{\vec b}$] augments the facts being currently indicated for use
794 by a subsequent refinement step (such as $\APPLYNAME$ or $\PROOFNAME$).
798 Forward chaining with an empty list of theorems is the same as not chaining at
799 all. Thus ``$\FROM{nothing}$'' has no effect apart from entering
800 $prove(chain)$ mode, since $nothing$\indexisarthm{nothing} is bound to the
801 empty list of theorems.
803 Basic proof methods (such as $rule$) expect multiple facts to be given in
804 their proper order, corresponding to a prefix of the premises of the rule
805 involved. Note that positions may be easily skipped using something like
806 $\FROM{\Text{\texttt{_}}~a~b}$, for example. This involves the trivial rule
807 $\PROP\psi \Imp \PROP\psi$, which happens to be bound in Isabelle/Pure as
808 ``\texttt{_}'' (underscore).\indexisarthm{_@\texttt{_}}
810 Automated methods (such as $simp$ or $auto$) just insert any given facts
811 before their usual operation. Depending on the kind of procedure involved,
812 the order of facts is less significant here.
815 \subsection{Goal statements}\label{sec:goals}
817 \indexisarcmd{lemma}\indexisarcmd{theorem}\indexisarcmd{corollary}
818 \indexisarcmd{have}\indexisarcmd{show}\indexisarcmd{hence}\indexisarcmd{thus}
819 \begin{matharray}{rcl}
820 \isarcmd{lemma} & : & \isartrans{theory}{proof(prove)} \\
821 \isarcmd{theorem} & : & \isartrans{theory}{proof(prove)} \\
822 \isarcmd{corollary} & : & \isartrans{theory}{proof(prove)} \\
823 \isarcmd{have} & : & \isartrans{proof(state) ~|~ proof(chain)}{proof(prove)} \\
824 \isarcmd{show} & : & \isartrans{proof(state) ~|~ proof(chain)}{proof(prove)} \\
825 \isarcmd{hence} & : & \isartrans{proof(state)}{proof(prove)} \\
826 \isarcmd{thus} & : & \isartrans{proof(state)}{proof(prove)} \\
829 From a theory context, proof mode is entered by an initial goal command such
830 as $\LEMMANAME$, $\THEOREMNAME$, or $\COROLLARYNAME$. Within a proof, new
831 claims may be introduced locally as well; four variants are available here to
832 indicate whether forward chaining of facts should be performed initially (via
833 $\THEN$), and whether the final result is meant to solve some pending goal.
835 Goals may consist of multiple statements, resulting in a list of facts
836 eventually. A pending multi-goal is internally represented as a meta-level
837 conjunction (printed as \verb,&&,), which is usually split into the
838 corresponding number of sub-goals prior to an initial method application, via
839 $\PROOFNAME$ (\S\ref{sec:proof-steps}) or $\APPLYNAME$
840 (\S\ref{sec:tactic-commands}). The $induct$ method covered in
841 \S\ref{sec:cases-induct} acts on multiple claims simultaneously.
843 Claims at the theory level may be either in short or long form. A short goal
844 merely consists of several simultaneous propositions (often just one). A long
845 goal includes an explicit context specification for the subsequent
846 conclusions, involving local parameters; here the role of each part of the
847 statement is explicitly marked by separate keywords (see also
851 ('lemma' | 'theorem' | 'corollary') locale? (goal | longgoal)
853 ('have' | 'show' | 'hence' | 'thus') goal
856 goal: (props + 'and')
858 longgoal: thmdecl? (contextelem *) 'shows' goal
864 \item [$\LEMMA{a}{\vec\phi}$] enters proof mode with $\vec\phi$ as main goal,
865 eventually resulting in some fact $\turn \vec\phi$ to be put back into the
866 theory context, or into the specified locale (cf.\ \S\ref{sec:locale}). An
867 additional \railnonterm{context} specification may build up an initial proof
868 context for the subsequent claim; this includes local definitions and syntax
869 as well, see the definition of $contextelem$ in \S\ref{sec:locale}.
871 \item [$\THEOREM{a}{\vec\phi}$ and $\COROLLARY{a}{\vec\phi}$] are essentially
872 the same as $\LEMMA{a}{\vec\phi}$, but the facts are internally marked as
873 being of a different kind. This discrimination acts like a formal comment.
875 \item [$\HAVE{a}{\vec\phi}$] claims a local goal, eventually resulting in a
876 fact within the current logical context. This operation is completely
877 independent of any pending sub-goals of an enclosing goal statements, so
878 $\HAVENAME$ may be freely used for experimental exploration of potential
879 results within a proof body.
881 \item [$\SHOW{a}{\vec\phi}$] is like $\HAVE{a}{\vec\phi}$ plus a second stage
882 to refine some pending sub-goal for each one of the finished result, after
883 having been exported into the corresponding context (at the head of the
884 sub-proof of this $\SHOWNAME$ command).
886 To accommodate interactive debugging, resulting rules are printed before
887 being applied internally. Even more, interactive execution of $\SHOWNAME$
888 predicts potential failure and displays the resulting error as a warning
889 beforehand. Watch out for the following message:
892 Problem! Local statement will fail to solve any pending goal
895 \item [$\HENCENAME$] abbreviates ``$\THEN~\HAVENAME$'', i.e.\ claims a local
896 goal to be proven by forward chaining the current facts. Note that
897 $\HENCENAME$ is also equivalent to ``$\FROM{this}~\HAVENAME$''.
899 \item [$\THUSNAME$] abbreviates ``$\THEN~\SHOWNAME$''. Note that $\THUSNAME$
900 is also equivalent to ``$\FROM{this}~\SHOWNAME$''.
904 Any goal statement causes some term abbreviations (such as $\Var{thesis}$) to
905 be bound automatically, see also \S\ref{sec:term-abbrev}. Furthermore, the
906 local context of a (non-atomic) goal is provided via the
907 $rule_context$\indexisarcase{rule-context} case.
912 Isabelle/Isar suffers theory-level goal statements to contain \emph{unbound
913 schematic variables}, although this does not conform to the aim of
914 human-readable proof documents! The main problem with schematic goals is
915 that the actual outcome is usually hard to predict, depending on the
916 behavior of the proof methods applied during the course of reasoning. Note
917 that most semi-automated methods heavily depend on several kinds of implicit
918 rule declarations within the current theory context. As this would also
919 result in non-compositional checking of sub-proofs, \emph{local goals} are
920 not allowed to be schematic at all. Nevertheless, schematic goals do have
921 their use in Prolog-style interactive synthesis of proven results, usually
922 by stepwise refinement via emulation of traditional Isabelle tactic scripts
923 (see also \S\ref{sec:tactic-commands}). In any case, users should know what
928 \subsection{Initial and terminal proof steps}\label{sec:proof-steps}
930 \indexisarcmd{proof}\indexisarcmd{qed}\indexisarcmd{by}
931 \indexisarcmd{.}\indexisarcmd{..}\indexisarcmd{sorry}
932 \begin{matharray}{rcl}
933 \isarcmd{proof} & : & \isartrans{proof(prove)}{proof(state)} \\
934 \isarcmd{qed} & : & \isartrans{proof(state)}{proof(state) ~|~ theory} \\
935 \isarcmd{by} & : & \isartrans{proof(prove)}{proof(state) ~|~ theory} \\
936 \isarcmd{.\,.} & : & \isartrans{proof(prove)}{proof(state) ~|~ theory} \\
937 \isarcmd{.} & : & \isartrans{proof(prove)}{proof(state) ~|~ theory} \\
938 \isarcmd{sorry} & : & \isartrans{proof(prove)}{proof(state) ~|~ theory} \\
941 Arbitrary goal refinement via tactics is considered harmful. Properly, the
942 Isar framework admits proof methods to be invoked in two places only.
944 \item An \emph{initial} refinement step $\PROOF{m@1}$ reduces a newly stated
945 goal to a number of sub-goals that are to be solved later. Facts are passed
946 to $m@1$ for forward chaining, if so indicated by $proof(chain)$ mode.
948 \item A \emph{terminal} conclusion step $\QED{m@2}$ is intended to solve
949 remaining goals. No facts are passed to $m@2$.
952 The only other (proper) way to affect pending goals in a proof body is by
953 $\SHOWNAME$, which involves an explicit statement of what is to be solved
954 eventually. Thus we avoid the fundamental problem of unstructured tactic
955 scripts that consist of numerous consecutive goal transformations, with
960 As a general rule of thumb for good proof style, initial proof methods should
961 either solve the goal completely, or constitute some well-understood reduction
962 to new sub-goals. Arbitrary automatic proof tools that are prone leave a
963 large number of badly structured sub-goals are no help in continuing the proof
964 document in an intelligible manner.
966 Unless given explicitly by the user, the default initial method is ``$rule$'',
967 which applies a single standard elimination or introduction rule according to
968 the topmost symbol involved. There is no separate default terminal method.
969 Any remaining goals are always solved by assumption in the very last step.
978 ('.' | '..' | 'sorry')
984 \item [$\PROOF{m@1}$] refines the goal by proof method $m@1$; facts for
985 forward chaining are passed if so indicated by $proof(chain)$ mode.
987 \item [$\QED{m@2}$] refines any remaining goals by proof method $m@2$ and
988 concludes the sub-proof by assumption. If the goal had been $\SHOWNAME$ (or
989 $\THUSNAME$), some pending sub-goal is solved as well by the rule resulting
990 from the result \emph{exported} into the enclosing goal context. Thus
991 $\QEDNAME$ may fail for two reasons: either $m@2$ fails, or the resulting
992 rule does not fit to any pending goal\footnote{This includes any additional
993 ``strong'' assumptions as introduced by $\ASSUMENAME$.} of the enclosing
994 context. Debugging such a situation might involve temporarily changing
995 $\SHOWNAME$ into $\HAVENAME$, or weakening the local context by replacing
996 occurrences of $\ASSUMENAME$ by $\PRESUMENAME$.
998 \item [$\BYY{m@1}{m@2}$] is a \emph{terminal proof}\index{proof!terminal}; it
999 abbreviates $\PROOF{m@1}~\QED{m@2}$, but with backtracking across both
1000 methods. Debugging an unsuccessful $\BYY{m@1}{m@2}$ commands might be done
1001 by expanding its definition; in many cases $\PROOF{m@1}$ (or even
1002 $\APPLY{m@1}$) is already sufficient to see the problem.
1004 \item [``$\DDOT$''] is a \emph{default proof}\index{proof!default}; it
1005 abbreviates $\BY{rule}$.
1007 \item [``$\DOT$''] is a \emph{trivial proof}\index{proof!trivial}; it
1008 abbreviates $\BY{this}$.
1010 \item [$\SORRY$] is a \emph{fake proof}\index{proof!fake} pretending to solve
1011 the pending claim without further ado. This only works in interactive
1012 development, or if the \texttt{quick_and_dirty} flag is enabled. Facts
1013 emerging from fake proofs are not the real thing. Internally, each theorem
1014 container is tainted by an oracle invocation, which is indicated as
1015 ``$[!]$'' in the printed result.
1017 The most important application of $\SORRY$ is to support experimentation and
1018 top-down proof development.
1022 \subsection{Fundamental methods and attributes}\label{sec:pure-meth-att}
1024 The following proof methods and attributes refer to basic logical operations
1025 of Isar. Further methods and attributes are provided by several generic and
1026 object-logic specific tools and packages (see chapters \ref{ch:gen-tools} and
1029 \indexisarmeth{$-$}\indexisarmeth{fact}\indexisarmeth{assumption}
1030 \indexisarmeth{this}\indexisarmeth{rule}\indexisarmeth{iprover}
1031 \indexisarattof{Pure}{intro}\indexisarattof{Pure}{elim}
1032 \indexisarattof{Pure}{dest}\indexisarattof{Pure}{rule}
1033 \indexisaratt{OF}\indexisaratt{of}\indexisaratt{where}
1034 \begin{matharray}{rcl}
1035 - & : & \isarmeth \\
1036 fact & : & \isarmeth \\
1037 assumption & : & \isarmeth \\
1038 this & : & \isarmeth \\
1039 rule & : & \isarmeth \\
1040 iprover & : & \isarmeth \\[0.5ex]
1041 intro & : & \isaratt \\
1042 elim & : & \isaratt \\
1043 dest & : & \isaratt \\
1044 rule & : & \isaratt \\[0.5ex]
1045 OF & : & \isaratt \\
1046 of & : & \isaratt \\
1047 where & : & \isaratt \\
1055 'iprover' ('!' ?) (rulemod *)
1057 rulemod: ('intro' | 'elim' | 'dest') ((('!' | () | '?') nat?) | 'del') ':' thmrefs
1059 ('intro' | 'elim' | 'dest') ('!' | () | '?') nat?
1065 'of' insts ('concl' ':' insts)?
1067 'where' ((name | var | typefree | typevar) '=' (type | term) * 'and')
1073 \item [``$-$''] does nothing but insert the forward chaining facts as premises
1074 into the goal. Note that command $\PROOFNAME$ without any method actually
1075 performs a single reduction step using the $rule$ method; thus a plain
1076 \emph{do-nothing} proof step would be ``$\PROOF{-}$'' rather than
1079 \item [$fact~\vec a$] composes any previous fact from $\vec a$ (or implicitly
1080 from the current proof context) modulo matching of schematic type and term
1081 variables. The rule structure is not taken into account, i.e.\ meta-level
1082 implication is considered atomic. This is the same principle underlying
1083 literal facts (cf.\ \S\ref{sec:syn-att}): ``$\HAVE{}{\phi}~\BY{fact}$'' is
1084 equivalent to ``$\NOTE{}{\backquote\phi\backquote}$'' provided that $\edrv
1085 \phi$ is an instance of some known $\edrv \phi$ in the proof context.
1087 \item [$assumption$] solves some goal by a single assumption step. All given
1088 facts are guaranteed to participate in the refinement; this means there may
1089 be only $0$ or $1$ in the first place. Recall that $\QEDNAME$ (see
1090 \S\ref{sec:proof-steps}) already concludes any remaining sub-goals by
1091 assumption, so structured proofs usually need not quote the $assumption$
1094 \item [$this$] applies all of the current facts directly as rules. Recall
1095 that ``$\DOT$'' (dot) abbreviates ``$\BY{this}$''.
1097 \item [$rule~\vec a$] applies some rule given as argument in backward manner;
1098 facts are used to reduce the rule before applying it to the goal. Thus
1099 $rule$ without facts is plain introduction, while with facts it becomes
1102 When no arguments are given, the $rule$ method tries to pick appropriate
1103 rules automatically, as declared in the current context using the $intro$,
1104 $elim$, $dest$ attributes (see below). This is the default behavior of
1105 $\PROOFNAME$ and ``$\DDOT$'' (double-dot) steps (see
1106 \S\ref{sec:proof-steps}).
1108 \item [$iprover$] performs intuitionistic proof search, depending on
1109 specifically declared rules from the context, or given as explicit
1110 arguments. Chained facts are inserted into the goal before commencing proof
1111 search; ``$iprover!$'' means to include the current $prems$ as well.
1113 Rules need to be classified as $intro$, $elim$, or $dest$; here the ``$!$''
1114 indicator refers to ``safe'' rules, which may be applied aggressively
1115 (without considering back-tracking later). Rules declared with ``$?$'' are
1116 ignored in proof search (the single-step $rule$ method still observes
1117 these). An explicit weight annotation may be given as well; otherwise the
1118 number of rule premises will be taken into account here.
1120 \item [$intro$, $elim$, and $dest$] declare introduction, elimination, and
1121 destruct rules, to be used with the $rule$ and $iprover$ methods. Note that
1122 the latter will ignore rules declared with ``$?$'', while ``$!$'' are used
1125 The classical reasoner (see \S\ref{sec:classical}) introduces its own
1126 variants of these attributes; use qualified names to access the present
1127 versions of Isabelle/Pure, i.e.\ $Pure{\dtt}intro$ or $CPure{\dtt}intro$.
1129 \item [$rule~del$] undeclares introduction, elimination, or destruct rules.
1131 \item [$OF~\vec a$] applies some theorem to given rules $\vec a$ (in
1132 parallel). This corresponds to the \texttt{MRS} operator in ML
1133 \cite[\S5]{isabelle-ref}, but note the reversed order. Positions may be
1134 effectively skipped by including ``$\_$'' (underscore) as argument.
1136 \item [$of~\vec t$] performs positional instantiation of term variables. The
1137 terms $\vec t$ are substituted for any schematic variables occurring in a
1138 theorem from left to right; ``\texttt{_}'' (underscore) indicates to skip a
1139 position. Arguments following a ``$concl\colon$'' specification refer to
1140 positions of the conclusion of a rule.
1142 \item [$where~\vec x = \vec t$] performs named instantiation of schematic type
1143 and term variables occurring in a theorem. Schematic variables have to be
1144 specified on the left-hand side (e.g.\ $?x1\!.\!3$). The question mark may
1145 be omitted if the variable name is a plain identifier without index. As
1146 type instantiations are inferred from term instantiations, explicit type
1147 instantiations are seldom necessary.
1152 \subsection{Term abbreviations}\label{sec:term-abbrev}
1155 \begin{matharray}{rcl}
1156 \isarcmd{let} & : & \isartrans{proof(state)}{proof(state)} \\
1157 \isarkeyword{is} & : & syntax \\
1160 Abbreviations may be either bound by explicit $\LET{p \equiv t}$ statements,
1161 or by annotating assumptions or goal statements with a list of patterns
1162 ``$\ISS{p@1\;\dots}{p@n}$''. In both cases, higher-order matching is invoked
1163 to bind extra-logical term variables, which may be either named schematic
1164 variables of the form $\Var{x}$, or nameless dummies ``\texttt{_}''
1165 (underscore).\indexisarvar{_@\texttt{_}} Note that in the $\LETNAME$ form the
1166 patterns occur on the left-hand side, while the $\ISNAME$ patterns are in
1169 Polymorphism of term bindings is handled in Hindley-Milner style, similar to
1170 ML. Type variables referring to local assumptions or open goal statements are
1171 \emph{fixed}, while those of finished results or bound by $\LETNAME$ may occur
1172 in \emph{arbitrary} instances later. Even though actual polymorphism should
1173 be rarely used in practice, this mechanism is essential to achieve proper
1174 incremental type-inference, as the user proceeds to build up the Isar proof
1175 text from left to right.
1179 Term abbreviations are quite different from local definitions as introduced
1180 via $\DEFNAME$ (see \S\ref{sec:proof-context}). The latter are visible within
1181 the logic as actual equations, while abbreviations disappear during the input
1182 process just after type checking. Also note that $\DEFNAME$ does not support
1186 'let' ((term + 'and') '=' term + 'and')
1190 The syntax of $\ISNAME$ patterns follows \railnonterm{termpat} or
1191 \railnonterm{proppat} (see \S\ref{sec:term-decls}).
1194 \item [$\LET{\vec p = \vec t}$] binds any text variables in patters $\vec p$
1195 by simultaneous higher-order matching against terms $\vec t$.
1196 \item [$\IS{\vec p}$] resembles $\LETNAME$, but matches $\vec p$ against the
1197 preceding statement. Also note that $\ISNAME$ is not a separate command,
1198 but part of others (such as $\ASSUMENAME$, $\HAVENAME$ etc.).
1201 Some \emph{automatic} term abbreviations\index{term abbreviations} for goals
1202 and facts are available as well. For any open goal,
1203 $\Var{thesis}$\indexisarvar{thesis} refers to its object-level statement,
1204 abstracted over any meta-level parameters (if present). Likewise,
1205 $\Var{this}$\indexisarvar{this} is bound for fact statements resulting from
1206 assumptions or finished goals. In case $\Var{this}$ refers to an object-logic
1207 statement that is an application $f(t)$, then $t$ is bound to the special text
1208 variable ``$\dots$''\indexisarvar{\dots} (three dots). The canonical
1209 application of the latter are calculational proofs (see
1210 \S\ref{sec:calculation}).
1213 \subsection{Block structure}
1215 \indexisarcmd{next}\indexisarcmd{\{}\indexisarcmd{\}}
1216 \begin{matharray}{rcl}
1217 \NEXT & : & \isartrans{proof(state)}{proof(state)} \\
1218 \BG & : & \isartrans{proof(state)}{proof(state)} \\
1219 \EN & : & \isartrans{proof(state)}{proof(state)} \\
1222 While Isar is inherently block-structured, opening and closing blocks is
1223 mostly handled rather casually, with little explicit user-intervention. Any
1224 local goal statement automatically opens \emph{two} blocks, which are closed
1225 again when concluding the sub-proof (by $\QEDNAME$ etc.). Sections of
1226 different context within a sub-proof may be switched via $\NEXT$, which is
1227 just a single block-close followed by block-open again. The effect of $\NEXT$
1228 is to reset the local proof context; there is no goal focus involved here!
1230 For slightly more advanced applications, there are explicit block parentheses
1231 as well. These typically achieve a stronger forward style of reasoning.
1234 \item [$\NEXT$] switches to a fresh block within a sub-proof, resetting the
1235 local context to the initial one.
1236 \item [$\BG$ and $\EN$] explicitly open and close blocks. Any current facts
1237 pass through ``$\BG$'' unchanged, while ``$\EN$'' causes any result to be
1238 \emph{exported} into the enclosing context. Thus fixed variables are
1239 generalized, assumptions discharged, and local definitions unfolded (cf.\
1240 \S\ref{sec:proof-context}). There is no difference of $\ASSUMENAME$ and
1241 $\PRESUMENAME$ in this mode of forward reasoning --- in contrast to plain
1242 backward reasoning with the result exported at $\SHOWNAME$ time.
1246 \subsection{Emulating tactic scripts}\label{sec:tactic-commands}
1248 The Isar provides separate commands to accommodate tactic-style proof scripts
1249 within the same system. While being outside the orthodox Isar proof language,
1250 these might come in handy for interactive exploration and debugging, or even
1251 actual tactical proof within new-style theories (to benefit from document
1252 preparation, for example). See also \S\ref{sec:tactics} for actual tactics,
1253 that have been encapsulated as proof methods. Proper proof methods may be
1254 used in scripts, too.
1256 \indexisarcmd{apply}\indexisarcmd{apply-end}\indexisarcmd{done}
1257 \indexisarcmd{defer}\indexisarcmd{prefer}\indexisarcmd{back}
1258 \indexisarcmd{declare}
1259 \begin{matharray}{rcl}
1260 \isarcmd{apply}^* & : & \isartrans{proof(prove)}{proof(prove)} \\
1261 \isarcmd{apply_end}^* & : & \isartrans{proof(state)}{proof(state)} \\
1262 \isarcmd{done}^* & : & \isartrans{proof(prove)}{proof(state)} \\
1263 \isarcmd{defer}^* & : & \isartrans{proof}{proof} \\
1264 \isarcmd{prefer}^* & : & \isartrans{proof}{proof} \\
1265 \isarcmd{back}^* & : & \isartrans{proof}{proof} \\
1266 \isarcmd{declare}^* & : & \isartrans{theory}{theory} \\
1269 \railalias{applyend}{apply\_end}
1273 ( 'apply' | applyend ) method
1279 'declare' locale? (thmrefs + 'and')
1285 \item [$\APPLY{m}$] applies proof method $m$ in initial position, but unlike
1286 $\PROOFNAME$ it retains ``$proof(prove)$'' mode. Thus consecutive method
1287 applications may be given just as in tactic scripts.
1289 Facts are passed to $m$ as indicated by the goal's forward-chain mode, and
1290 are \emph{consumed} afterwards. Thus any further $\APPLYNAME$ command would
1291 always work in a purely backward manner.
1293 \item [$\isarkeyword{apply_end}~(m)$] applies proof method $m$ as if in
1294 terminal position. Basically, this simulates a multi-step tactic script for
1295 $\QEDNAME$, but may be given anywhere within the proof body.
1297 No facts are passed to $m$. Furthermore, the static context is that of the
1298 enclosing goal (as for actual $\QEDNAME$). Thus the proof method may not
1299 refer to any assumptions introduced in the current body, for example.
1301 \item [$\isarkeyword{done}$] completes a proof script, provided that the
1302 current goal state is solved completely. Note that actual structured proof
1303 commands (e.g.\ ``$\DOT$'' or $\SORRY$) may be used to conclude proof
1306 \item [$\isarkeyword{defer}~n$ and $\isarkeyword{prefer}~n$] shuffle the list
1307 of pending goals: $defer$ puts off goal $n$ to the end of the list ($n = 1$
1308 by default), while $prefer$ brings goal $n$ to the top.
1310 \item [$\isarkeyword{back}$] does back-tracking over the result sequence of
1311 the latest proof command. Basically, any proof command may return multiple
1314 \item [$\isarkeyword{declare}~thms$] declares theorems to the current theory
1315 context (or the specified locale, see also \S\ref{sec:locale}). No theorem
1316 binding is involved here, unlike $\isarkeyword{theorems}$ or
1317 $\isarkeyword{lemmas}$ (cf.\ \S\ref{sec:axms-thms}), so
1318 $\isarkeyword{declare}$ only has the effect of applying attributes as
1319 included in the theorem specification.
1323 Any proper Isar proof method may be used with tactic script commands such as
1324 $\APPLYNAME$. A few additional emulations of actual tactics are provided as
1325 well; these would be never used in actual structured proofs, of course.
1328 \subsection{Meta-linguistic features}
1331 \begin{matharray}{rcl}
1332 \isarcmd{oops} & : & \isartrans{proof}{theory} \\
1335 The $\OOPS$ command discontinues the current proof attempt, while considering
1336 the partial proof text as properly processed. This is conceptually quite
1337 different from ``faking'' actual proofs via $\SORRY$ (see
1338 \S\ref{sec:proof-steps}): $\OOPS$ does not observe the proof structure at all,
1339 but goes back right to the theory level. Furthermore, $\OOPS$ does not
1340 produce any result theorem --- there is no intended claim to be able to
1341 complete the proof anyhow.
1343 A typical application of $\OOPS$ is to explain Isar proofs \emph{within} the
1344 system itself, in conjunction with the document preparation tools of Isabelle
1345 described in \cite{isabelle-sys}. Thus partial or even wrong proof attempts
1346 can be discussed in a logically sound manner. Note that the Isabelle {\LaTeX}
1347 macros can be easily adapted to print something like ``$\dots$'' instead of an
1348 ``$\OOPS$'' keyword.
1350 \medskip The $\OOPS$ command is undo-able, unlike $\isarkeyword{kill}$ (see
1351 \S\ref{sec:history}). The effect is to get back to the theory just before the
1352 opening of the proof.
1355 \section{Other commands}
1357 \subsection{Diagnostics}
1359 \indexisarcmd{pr}\indexisarcmd{thm}\indexisarcmd{term}
1360 \indexisarcmd{prop}\indexisarcmd{typ}
1361 \begin{matharray}{rcl}
1362 \isarcmd{pr}^* & : & \isarkeep{\cdot} \\
1363 \isarcmd{thm}^* & : & \isarkeep{theory~|~proof} \\
1364 \isarcmd{term}^* & : & \isarkeep{theory~|~proof} \\
1365 \isarcmd{prop}^* & : & \isarkeep{theory~|~proof} \\
1366 \isarcmd{typ}^* & : & \isarkeep{theory~|~proof} \\
1367 \isarcmd{prf}^* & : & \isarkeep{theory~|~proof} \\
1368 \isarcmd{full_prf}^* & : & \isarkeep{theory~|~proof} \\
1371 These diagnostic commands assist interactive development. Note that $undo$
1372 does not apply here, the theory or proof configuration is not changed.
1375 'pr' modes? nat? (',' nat)?
1377 'thm' modes? thmrefs
1385 'prf' modes? thmrefs?
1387 'full\_prf' modes? thmrefs?
1390 modes: '(' (name + ) ')'
1395 \item [$\isarkeyword{pr}~goals, prems$] prints the current proof state (if
1396 present), including the proof context, current facts and goals. The
1397 optional limit arguments affect the number of goals and premises to be
1398 displayed, which is initially 10 for both. Omitting limit values leaves the
1399 current setting unchanged.
1400 \item [$\isarkeyword{thm}~\vec a$] retrieves theorems from the current theory
1401 or proof context. Note that any attributes included in the theorem
1402 specifications are applied to a temporary context derived from the current
1403 theory or proof; the result is discarded, i.e.\ attributes involved in $\vec
1404 a$ do not have any permanent effect.
1405 \item [$\isarkeyword{term}~t$ and $\isarkeyword{prop}~\phi$] read, type-check
1406 and print terms or propositions according to the current theory or proof
1407 context; the inferred type of $t$ is output as well. Note that these
1408 commands are also useful in inspecting the current environment of term
1410 \item [$\isarkeyword{typ}~\tau$] reads and prints types of the meta-logic
1411 according to the current theory or proof context.
1412 \item [$\isarkeyword{prf}$] displays the (compact) proof term of the current
1413 proof state (if present), or of the given theorems. Note that this
1414 requires proof terms to be switched on for the current object logic
1415 (see the ``Proof terms'' section of the Isabelle reference manual
1416 for information on how to do this).
1417 \item [$\isarkeyword{full_prf}$] is like $\isarkeyword{prf}$, but displays
1418 the full proof term, i.e.\ also displays information omitted in
1419 the compact proof term, which is denoted by ``$_$'' placeholders there.
1422 All of the diagnostic commands above admit a list of $modes$ to be specified,
1423 which is appended to the current print mode (see also \cite{isabelle-ref}).
1424 Thus the output behavior may be modified according particular print mode
1425 features. For example, $\isarkeyword{pr}~(latex~xsymbols~symbols)$ would
1426 print the current proof state with mathematical symbols and special characters
1427 represented in {\LaTeX} source, according to the Isabelle style
1428 \cite{isabelle-sys}.
1430 Note that antiquotations (cf.\ \S\ref{sec:antiq}) provide a more systematic
1431 way to include formal items into the printed text document.
1434 \subsection{Inspecting the context}
1436 \indexisarcmd{print-facts}\indexisarcmd{print-binds}
1437 \indexisarcmd{print-commands}\indexisarcmd{print-syntax}
1438 \indexisarcmd{print-methods}\indexisarcmd{print-attributes}
1439 \indexisarcmd{find-theorems}\indexisarcmd{thm-deps}
1440 \indexisarcmd{print-theorems}
1441 \begin{matharray}{rcl}
1442 \isarcmd{print_commands}^* & : & \isarkeep{\cdot} \\
1443 \isarcmd{print_syntax}^* & : & \isarkeep{theory~|~proof} \\
1444 \isarcmd{print_methods}^* & : & \isarkeep{theory~|~proof} \\
1445 \isarcmd{print_attributes}^* & : & \isarkeep{theory~|~proof} \\
1446 \isarcmd{print_theorems}^* & : & \isarkeep{theory~|~proof} \\
1447 \isarcmd{find_theorems}^* & : & \isarkeep{theory~|~proof} \\
1448 \isarcmd{thms_deps}^* & : & \isarkeep{theory~|~proof} \\
1449 \isarcmd{print_facts}^* & : & \isarkeep{proof} \\
1450 \isarcmd{print_binds}^* & : & \isarkeep{proof} \\
1454 'find\_theorems' (('(' nat ')')?) (criterion *)
1456 criterion: ('-'?) ('name' ':' nameref | 'intro' | 'elim' | 'dest' |
1457 'simp' ':' term | term)
1463 These commands print certain parts of the theory and proof context. Note that
1464 there are some further ones available, such as for the set of rules declared
1465 for simplifications.
1469 \item [$\isarkeyword{print_commands}$] prints Isabelle's outer theory syntax,
1470 including keywords and command.
1472 \item [$\isarkeyword{print_syntax}$] prints the inner syntax of types and
1473 terms, depending on the current context. The output can be very verbose,
1474 including grammar tables and syntax translation rules. See \cite[\S7,
1475 \S8]{isabelle-ref} for further information on Isabelle's inner syntax.
1477 \item [$\isarkeyword{print_methods}$] prints all proof methods available in
1478 the current theory context.
1480 \item [$\isarkeyword{print_attributes}$] prints all attributes available in
1481 the current theory context.
1483 \item [$\isarkeyword{print_theorems}$] prints theorems available in the
1484 current theory context.
1486 In interactive mode this actually refers to the theorems left by the last
1487 transaction; this allows to inspect the result of advanced definitional
1488 packages, such as $\isarkeyword{datatype}$.
1490 \item [$\isarkeyword{find_theorems}~\vec c$] retrieves facts from the theory
1491 or proof context matching all of the search criteria $\vec c$. The
1492 criterion $name: p$ selects all theorems whose fully qualified name matches
1493 pattern $p$, which may contain ``$*$'' wildcards. The criteria $intro$,
1494 $elim$, and $dest$ select theorems that match the current goal as
1495 introduction, elimination or destruction rules, respectively. The criterion
1496 $simp: t$ selects all rewrite rules whose left-hand side matches the given
1497 term. The criterion term $t$ selects all theorems that contain the pattern
1498 $t$ -- as usual, patterns may contain occurrences of the dummy ``$\_$'',
1499 schematic variables, and type constraints.
1501 Criteria can be preceded by ``$-$'' to select theorems that do \emph{not}
1502 match. Note that giving the empty list of criteria yields \emph{all}
1503 currently known facts. An optional limit for the number of printed facts
1504 may be given; the default is 40.
1506 \item [$\isarkeyword{thm_deps}~\vec a$] visualizes dependencies of facts,
1507 using Isabelle's graph browser tool (see also \cite{isabelle-sys}).
1509 \item [$\isarkeyword{print_facts}$] prints any named facts of the current
1510 context, including assumptions and local results.
1512 \item [$\isarkeyword{print_binds}$] prints all term abbreviations present in
1518 \subsection{History commands}\label{sec:history}
1520 \indexisarcmd{undo}\indexisarcmd{redo}\indexisarcmd{kill}
1521 \begin{matharray}{rcl}
1522 \isarcmd{undo}^{{*}{*}} & : & \isarkeep{\cdot} \\
1523 \isarcmd{redo}^{{*}{*}} & : & \isarkeep{\cdot} \\
1524 \isarcmd{kill}^{{*}{*}} & : & \isarkeep{\cdot} \\
1527 The Isabelle/Isar top-level maintains a two-stage history, for theory and
1528 proof state transformation. Basically, any command can be undone using
1529 $\isarkeyword{undo}$, excluding mere diagnostic elements. Its effect may be
1530 revoked via $\isarkeyword{redo}$, unless the corresponding
1531 $\isarkeyword{undo}$ step has crossed the beginning of a proof or theory. The
1532 $\isarkeyword{kill}$ command aborts the current history node altogether,
1533 discontinuing a proof or even the whole theory. This operation is \emph{not}
1537 History commands should never be used with user interfaces such as
1538 Proof~General \cite{proofgeneral,Aspinall:TACAS:2000}, which takes care of
1539 stepping forth and back itself. Interfering by manual $\isarkeyword{undo}$,
1540 $\isarkeyword{redo}$, or even $\isarkeyword{kill}$ commands would quickly
1541 result in utter confusion.
1545 \subsection{System operations}
1547 \indexisarcmd{cd}\indexisarcmd{pwd}\indexisarcmd{use-thy}\indexisarcmd{use-thy-only}
1548 \indexisarcmd{update-thy}\indexisarcmd{update-thy-only}\indexisarcmd{display-drafts}
1549 \indexisarcmd{print-drafts}
1550 \begin{matharray}{rcl}
1551 \isarcmd{cd}^* & : & \isarkeep{\cdot} \\
1552 \isarcmd{pwd}^* & : & \isarkeep{\cdot} \\
1553 \isarcmd{use_thy}^* & : & \isarkeep{\cdot} \\
1554 \isarcmd{use_thy_only}^* & : & \isarkeep{\cdot} \\
1555 \isarcmd{update_thy}^* & : & \isarkeep{\cdot} \\
1556 \isarcmd{update_thy_only}^* & : & \isarkeep{\cdot} \\
1557 \isarcmd{display_drafts}^* & : & \isarkeep{\cdot} \\
1558 \isarcmd{print_drafts}^* & : & \isarkeep{\cdot} \\
1561 \railalias{usethy}{use\_thy}
1563 \railalias{usethyonly}{use\_thy\_only}
1564 \railterm{usethyonly}
1565 \railalias{updatethy}{update\_thy}
1566 \railterm{updatethy}
1567 \railalias{updatethyonly}{update\_thy\_only}
1568 \railterm{updatethyonly}
1569 \railalias{displaydrafts}{display\_drafts}
1570 \railterm{displaydrafts}
1571 \railalias{printdrafts}{print\_drafts}
1572 \railterm{printdrafts}
1575 ('cd' | usethy | usethyonly | updatethy | updatethyonly) name
1577 (displaydrafts | printdrafts) (name +)
1582 \item [$\isarkeyword{cd}~path$] changes the current directory of the Isabelle
1584 \item [$\isarkeyword{pwd}~$] prints the current working directory.
1585 \item [$\isarkeyword{use_thy}$, $\isarkeyword{use_thy_only}$,
1586 $\isarkeyword{update_thy}$, $\isarkeyword{update_thy_only}$] load some
1587 theory given as $name$ argument. These commands are basically the same as
1588 the corresponding ML functions\footnote{The ML versions also change the
1589 implicit theory context to that of the theory loaded.} (see also
1590 \cite[\S1,\S6]{isabelle-ref}). Note that both the ML and Isar versions may
1591 load new- and old-style theories alike.
1592 \item [$\isarkeyword{display_drafts}~paths$ and
1593 $\isarkeyword{print_drafts}~paths$] perform simple output of a given list of
1594 raw source files. Only those symbols that do not require additional
1595 {\LaTeX} packages are displayed properly, everything else is left verbatim.
1598 These system commands are scarcely used when working with the Proof~General
1599 interface, since loading of theories is done transparently.
1601 %%% Local Variables:
1603 %%% TeX-master: "isar-ref"