text‹
The Isabelle/Isar theory format integrates specifications and proofs, with
support for interactive development by continuous document editing. There is
a separate document preparation system (see \chref{ch:document-prep}), for
typesetting formal developments together with informal text. The resulting
hyper-linked PDF documents can be used both for WWW presentation and printed
copies.
The Isar proof language (see \chref{ch:proofs}) is embedded into the theory
language as a proper sub-language. Proof mode is entered by stating some 🚫‹theorem› or 🚫‹lemma› at the theory level, and left again with the final
conclusion (e.g.\ via 🚫‹qed›). ›
Isabelle/Isar theories are defined via theory files, which consist of an
outermost sequence of definition--statement--proof elements. Some
definitions are self-sufficient (e.g.\ 🚫‹fun› in Isabelle/HOL), with
foundational proofs performed internally. Other definitions require an
explicit proof as justification (e.g.\ 🚫‹function› and 🚫‹termination› in
Isabelle/HOL). Plain statements like 🚫‹theorem› or 🚫‹lemma› are merely a
special case of that, defining a theorem from a given proposition and its
proof.
The theory body may be sub-structured by means of ∗‹local theory targets›,
such as 🚫‹locale› and 🚫‹class›. It is also possible to use 🚫‹context begin …
end› blocks to delimited a local theory context: a ∗‹named context› to
augment a locale or class specification, or an ∗‹unnamed context› to refer
to local parameters and assumptions that are discharged later. See \secref{sec:target} for more details.
┉
A theory is commenced by the 🚫‹theory› command, which indicates imports of
previous theories, according to an acyclic foundational order. Before the
initial 🚫‹theory› command, there may be optional document header material
(like 🚫‹section› or 🚫‹text›, see \secref{sec:markup}). The document header
is outside of the formal theory context, though.
A theory is concluded by a final @{command (global) "end"} command, one that
does not belong to a local theory target. No further commands may follow
such a global @{command (global) "end"}.
🚫🚫‹theory A imports B1… Bn begin› starts a new theory ‹A› based on the
merge of existing theories ‹B1… Bn›. Due to the possibility to import
more than one ancestor, the resulting theory structure of an Isabelle
session forms a directed acyclic graph (DAG). Isabelle takes care that
sources contributing to the development graph are always up-to-date: changed
files are automatically rechecked whenever a theory header specification is
processed.
Empty imports are only allowed in the bootstrap process of the special
theory 🚫‹Pure›, which is the start of any other formal development
based on Isabelle. Regular user theories usually refer to some more complex
entry point, such as theory 🚫‹Main› in Isabelle/HOL.
The @{keyword_def "keywords"} specification declares outer syntax
(\chref{ch:outer-syntax}) that is introduced in this theory later on (rare
in end-user applications). Both minor keywords and major keywords of the
Isar command language need to be specified, in order to make parsing of
proof documents work properly. Command keywords need to be classified
according to their structural role in the formal text. Examples may be seen
in Isabelle/HOL sources itself, such as @{keyword "keywords"}~▩‹"typedef"› ‹:: thy_goal_defn› or @{keyword "keywords"}~▩‹"datatype"›‹:: thy_defn› for
theory-level definitions with and without proof, respectively. Additional
@{syntax tags} provide defaults for document preparation
(\secref{sec:document-markers}).
The @{keyword_def "abbrevs"} specification declares additional abbreviations
for syntactic completion. The default for a new keyword is just its name,
but completion may be avoided by defining @{keyword "abbrevs"} with empty
text.
🚫 @{command (global) "end"} concludes the current theory definition. Note
that some other commands, e.g.\ local theory targets 🚫‹locale› or 🚫‹class›
may involve a 🚫‹begin› that needs to be matched by @{command (local) "end"},
according to the usual rules for nested blocks.
🚫🚫‹thy_deps› visualizes the theory hierarchy as a directed acyclic graph.
By default, all imported theories are shown. This may be restricted by
specifying bounds wrt. the theory inclusion relation. ›
A local theory target is a specification context that is managed separately
within the enclosing theory. Contexts may introduce parameters (fixed
variables) and assumptions (hypotheses). Definitions and theorems depending
on the context may be added incrementally later on.
∗‹Named contexts› refer to locales (cf.\ \secref{sec:locale}) or type
classes (cf.\ \secref{sec:class}); the name ``‹-›'' signifies the global
theory context.
∗‹Unnamed contexts› may introduce additional parameters and assumptions, and
results produced in the context are generalized accordingly. Such auxiliary
contexts may be nested within other targets, like 🚫‹locale›, 🚫‹class›, 🚫‹instantiation›, 🚫‹overloading›.
🚫🚫‹context c bundles begin› opens a named context, by recommencing an existing
locale or class ‹c›. Note that locale and class definitions allow to include
the 🚫‹begin› keyword as well, in order to continue the local theory
immediately after the initial specification. Optionally given ‹bundles› only take effect in the surface context within the 🚫‹begin› / 🚫‹end› block.
🚫🚫‹context bundles elements begin› opens an unnamed context, by extending
the enclosing global or local theory target by the given declaration bundles
(\secref{sec:bundle}) and context elements (🚫‹fixes›, 🚫‹assumes› etc.). This
means any results stemming from definitions and proofs in the extended
context will be exported into the enclosing target by lifting over extra
parameters and premises.
🚫 @{command (local) "end"} concludes the current local theory, according to
the nesting of contexts. Note that a global @{command (global) "end"} has a
different meaning: it concludes the theory itself (\secref{sec:begin-thy}).
🚫🚫‹private› or 🚫‹qualified› may be given as modifiers before any local
theory command. This restricts name space accesses to the local scope, as
determined by the enclosing 🚫‹context begin … end› block. Outside its scope,
a 🚫‹private› name is inaccessible, and a 🚫‹qualified› name is only
accessible with some qualification.
Neither a global 🚫‹theory› nor a 🚫‹locale› target provides a local scope by
itself: an extra unnamed context is required to use 🚫‹private› or 🚫‹qualified› here.
🚫‹(›@{keyword_def "in"}~‹c)› given after any local theory command specifies
an immediate target, e.g.\ ``🚫‹definition (in c)›'' or
``🚫‹theorem (in c)›''. This works both in a local or global theory context;
the current target context will be suspended for this command only. Note
that ``🚫‹(in -)›'' will always produce a global result independently of the
current target context.
Any specification element that operates on ‹local_theory› according to this
manual implicitly allows the above target syntax 🚫‹(in c)›, but individual
syntax diagrams omit that aspect for clarity.
┉
The exact meaning of results produced within a local theory context depends
on the underlying target infrastructure (locale, type class etc.). The
general idea is as follows, considering a context named ‹c› with parameter ‹x› and assumption ‹A[x]›.
Definitions are exported by introducing a global version with additional
arguments; a syntactic abbreviation links the long form with the abstract
version of the target context. For example, ‹a ≡ t[x]› becomes ‹c.a ?x ≡
t[?x]› at the theory level (for arbitrary ‹?x›), together with a local
abbreviation ‹a ≡ c.a x› in the target context (for the fixed parameter ‹x›).
Theorems are exported by discharging the assumptions and generalizing the
parameters of the context. For example, ‹a: B[x]› becomes ‹c.a: A[?x] ==>
B[?x]›, again for arbitrary ‹?x›. ›
The outer syntax of fact expressions (\secref{sec:syn-att}) involves
theorems and attributes, which are evaluated in the context and applied to
it. Attributes may declare theorems to the context, as in ‹this_rule [intro]
that_rule [elim]› for example. Configuration options (\secref{sec:config})
are special declaration attributes that operate on the context without a
theorem, as in ‹[[show_types = false]]› for example.
Expressions of this form may be defined as ∗‹bundled declarations› in the
context, and included in other situations later on. Including declaration
bundles augments a local context casually without logical dependencies,
which is in contrast to locales and locale interpretation
(\secref{sec:locale}).
🚫🚫‹bundle b = decls› defines a bundle of declarations in the current
context. The RHS is similar to the one of the 🚫‹declare› command. Bundles
defined in local theory targets are subject to transformations via
morphisms, when moved into different application contexts; this works
analogously to any other local theory specification.
🚫🚫‹bundle b begin body end› defines a bundle of declarations from the ‹body› of local theory specifications. It may consist of commands that are
technically equivalent to 🚫‹declare› or 🚫‹declaration›, which also includes 🚫‹notation›, for example. Named fact declarations like ``🚫‹lemmas a [simp] =
b›'' or ``🚫‹lemma a [simp]: B 🚫›'' are also admitted, but the name
bindings are not recorded in the bundle.
🚫🚫‹open_bundle b› is like 🚫‹bundle b› followed by 🚫‹unbundle b›, so its
declarations are activated immediately, but also named for later re-use.
🚫🚫‹unbundle 🚫b› activates the declarations from the given bundles in
the current local theory context. This is analogous to 🚫‹lemmas›
(\secref{sec:theorems}) with the expanded bundles.
🚫🚫‹print_bundles› prints the named bundles that are available in the
current context; the ``‹!›'' option indicates extra verbosity.
🚫🚫‹include 🚫b› activates the declarations from the given bundles in a
proof body (forward mode). This is analogous to 🚫‹note›
(\secref{sec:proof-facts}) with the expanded bundles.
🚫🚫‹including 🚫b› is similar to 🚫‹include›, but works in proof
refinement (backward mode). This is analogous to 🚫‹using›
(\secref{sec:proof-facts}) with the expanded bundles.
🚫🚫‹includes 🚫b› is similar to 🚫‹include›, but applies to a confined
specification context: unnamed 🚫‹context›s and long statements of 🚫‹theorem›.
🚫🚫‹opening 🚫b› is similar to 🚫‹includes›, but applies to a named
specification context: 🚫‹locale›s, 🚫‹class›es and named 🚫‹context›s. The
effect is confined to the surface context within the specification block
itself and the corresponding 🚫‹begin› / 🚫‹end› block.
🚫 Bundle names may be prefixed by the reserved word ▩‹no› to indicate that
the polarity of certain declaration commands should be inverted, notably:
▪ @{command syntax} versus @{command no_syntax} ▪ @{command translations} versus @{command no_translations} ▪ @{command notation} versus @{command no_notation} ▪ @{command type_notation} versus @{command no_type_notation} ▪ @{command adhoc_overloading} versus @{command no_adhoc_overloading}
This also works recursively for the @{command unbundle} command as
declaration inside a @{command bundle} definition: ▩‹no› means that
both the order and polarity of declarations is reversed (following
algebraic group laws).
Here is an artificial example of bundling various configuration options: ›
Term definitions may either happen within the logic (as equational axioms of
a certain form (see also \secref{sec:overloading}), or outside of it as
rewrite system on abstract syntax. The second form is called
``abbreviation''.
🚫🚫‹definition c where eq› produces an internal definition ‹c ≡ t› according
to the specification given as ‹eq›, which is then turned into a proven fact.
The given proposition may deviate from internal meta-level equality
according to the rewrite rules declared as @{attribute defn} by the
object-logic. This usually covers object-level equality ‹x = y› and
equivalence ‹A ⟷ B›. End-users normally need not change the @{attribute
defn} setup.
Definitions may be presented with explicit arguments on the LHS, as well as
additional conditions, e.g.\ ‹f x y = t› instead of ‹f ≡ λx y. t› and ‹y ≠ 0 ==> g x y = u› instead of an unrestricted ‹g ≡ λx y. u›.
🚫🚫‹print_defn_rules› prints the definitional rewrite rules declared via
@{attribute defn} in the current context.
🚫🚫‹abbreviation c where eq› introduces a syntactic constant which is
associated with a certain term according to the meta-level equality ‹eq›.
Abbreviations participate in the usual type-inference process, but are
expanded before the logic ever sees them. Pretty printing of terms involves
higher-order rewriting with rules stemming from reverted abbreviations. This
needs some care to avoid overlapping or looping syntactic replacements!
The optional ‹mode› specification restricts output to a particular print
mode; using ``‹input›'' here achieves the effect of one-way abbreviations.
The mode may also include an ``🚫‹output›'' qualifier that affects the
concrete syntax declared for abbreviations, cf.\ 🚫‹syntax› in \secref{sec:syn-trans}.
🚫🚫‹print_abbrevs› prints all constant abbreviations of the current context;
the ``‹!›'' option indicates extra verbosity. ›
🚫🚫‹axiomatization c1… cm where φ1… φn› introduces several constants
simultaneously and states axiomatic properties for these. The constants are
marked as being specified once and for all, which prevents additional
specifications for the same constants later on, but it is always possible to
emit axiomatizations without referring to particular constants. Note that
lack of precise dependency tracking of axiomatizations may disrupt the
well-formedness of an otherwise definitional theory.
Axiomatization is restricted to a global theory context: support for local
theory targets \secref{sec:target} would introduce an extra dimension of
uncertainty what the written specifications really are, and make it
infeasible to argue why they are correct.
Axiomatic specifications are required when declaring a new logical system
within Isabelle/Pure, but in an application environment like Isabelle/HOL
the user normally stays within definitional mechanisms provided by the logic
and its libraries. ›
Arbitrary operations on the background context may be wrapped-up as generic
declaration elements. Since the underlying concept of local theories may be
subject to later re-interpretation, there is an additional dependency on a
java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "macro" is null
the application context encountered later on. A fact declaration is an
important special case: it consists of a theorem which is applied to the
context by means of an attribute.
🚫🚫‹declaration d› adds the declaration function ‹d› of ML type 🚫‹Morphism.declaration›, to the current local theory under construction. In later
application contexts, the function is transformed according to the morphisms
being involved in the interpretation hierarchy.
If the 🚫‹(pervasive)› option is given, the corresponding declaration is
applied to all possible contexts involved, including the global background
theory.
🚫🚫‹syntax_declaration› is similar to 🚫‹declaration›, but is meant to affect
only ``syntactic'' tools by convention (such as notation and type-checking
information).
🚫🚫‹declare thms› declares theorems to the current local theory context. No
java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "macro" is null \secref{sec:theorems}), so 🚫‹declare› only has the effect of applying
attributes as included in the theorem specification. ›
section‹Locales \label{sec:locale}›
text‹
A locale is a functor that maps parameters (including implicit type
parameters) and a specification to a list of declarations. The syntax of
java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "macro" is null \secref{sec:proof-context}).
Locale hierarchies are supported by maintaining a graph of dependencies
between locale instances in the global theory. Dependencies may be
introduced through import (where a locale is defined as sublocale of the
imported instances) or by proving that an existing locale is a sublocale of
one or several locale instances.
A locale may be opened with the purpose of appending to its list of
declarations (cf.\ \secref{sec:target}). When opening a locale declarations
from all dependencies are collected and are presented as a local theory. In
this process, which is called ∗‹roundup›, redundant locale instances are
omitted. A locale instance is redundant if it is subsumed by an instance
encountered earlier. A more detailed description of this process is
available elsewhere cite‹Ballarin2014›. ›
text‹
A ∗‹locale expression› denotes a context composed of instances of existing
locales. The context consists of the declaration elements from the locale
instances. Redundant locale instances are omitted according to roundup.
A locale instance consists of a reference to a locale and either positional
or named parameter instantiations optionally followed by rewrites clauses.
Identical instantiations (that is, those
that instantiate a parameter by itself) may be omitted. The notation ``‹_›''
enables to omit the instantiation for a parameter inside a positional
instantiation.
Terms in instantiations are from the context the locale expressions is
declared in. Local names may be added to this context with the optional 🚫‹for› clause. This is useful for shadowing names bound in outer contexts,
and for declaring syntax. In addition, syntax declarations from one instance
are effective when parsing subsequent instances of the same expression.
Instances have an optional qualifier which applies to names in declarations.
Names include local definitions and theorem names. If present, the qualifier
itself is either mandatory (default) or non-mandatory (when followed by
``▩‹?›''). Non-mandatory means that the qualifier may be omitted on input.
Qualifiers only affect name spaces; they play no role in determining whether
one locale instance subsumes another.
Rewrite clauses amend instances with equations that act as rewrite rules.
This is particularly useful for changing concepts introduced through
definitions. Rewrite clauses are available only in interpretation commands
(see \secref{sec:locale-interpretation} below) and must be proved the user. ›
(*<*)experiment begin(*>*)
attribute_setup my_rule = ‹Attrib.thms >> (fn ths =>
Thm.rule_attribute ths
(fn context: Context.generic => fn th: thm =>
let val th' = th OF ths
in th' end))›
attribute_setup my_declaration = ‹Attrib.thms >> (fn ths =>
Thm.declaration_attribute
(fn th: thm => fn context: Context.generic =>
let val context' = context
in context' end))› (*<*)end(*>*)
text‹ 🚫 @{attribute ML_print_depth} controls the printing depth of the ML toplevel
pretty printer. Typically the limit should be less than 10. Bigger values
such as 100--1000 are occasionally useful for debugging.
🚫 @{attribute ML_source_trace} indicates whether the source text that is
given to the ML compiler should be output: it shows the raw Standard ML
after expansion of Isabelle/ML antiquotations.
🚫 @{attribute ML_debugger} controls compilation of sources with or without
debugging information. The global system option @{system_option_ref
ML_debugger} does the same when building a session image. It is also
possible use commands like 🚫‹ML_file_debug› etc. The ML debugger is
explained further in cite‹"isabelle-jedit"›.
🚫 @{attribute ML_exception_trace} indicates whether the ML run-time system
should print a detailed stack trace on exceptions. The result is dependent
on various ML compiler optimizations. The boundary for the exception trace
is the current Isar command transactions: it is occasionally better to
insert the combinator 🚫‹Runtime.exn_trace› into ML code for debugging cite‹"isabelle-implementation"›, closer to the point where it actually
happens.
🚫 @{attribute ML_exception_debugger} controls detailed exception trace via
the Poly/ML debugger, at the cost of extra compile-time and run-time
overhead. Relevant ML modules need to be compiled beforehand with debugging
enabled, see @{attribute ML_debugger} above.
🚫 @{attribute ML_environment} determines the named ML environment for
toplevel declarations, e.g.\ in command 🚫‹ML› or 🚫‹ML_file›. The following
ML environments are predefined in Isabelle/Pure:
▪‹Isabelle› for Isabelle/ML. It contains all modules of Isabelle/Pure and
further add-ons, e.g. material from Isabelle/HOL.
The Isabelle/ML function 🚫‹ML_Env.setup› defines a new ML environment.
This is useful to incorporate big SML projects in an isolated name space,
possibly with variations on ML syntax; the existing setup of 🚫‹ML_Env.SML_operations› follows the official standard.
It is also possible to move toplevel bindings between ML environments, using
a notation with ``‹>›'' as separator. For example: ›
text‹
Write access to the physical file-system is incompatible with the stateless
model of processing Isabelle documents. To avoid bad effects, the following
concepts for abstract file-management are provided by Isabelle:
🚫[Generated files] are stored within the theory context in Isabelle/ML.
This allows to operate on the content in Isabelle/ML, e.g. via the command
@{command compile_generated_files}.
🚫[Exported files] are stored within the session database in
Isabelle/Scala. This allows to deliver artefacts to external tools, see
also cite‹"isabelle-system"› for session ▩‹ROOT› declaration 🚫‹export_files›, and @{tool build} option ▩‹-e›.
A notable example is the command @{command_ref export_code}
(\chref{ch:export-code}): it uses both concepts simultaneously.
File names are hierarchically structured, using a slash as separator. The
(long) theory name is used as a prefix: the resulting name needs to be
globally unique.
🚫🚫‹generate_file path = content› augments the table of generated files
within the current theory by a new entry: duplicates are not allowed. The
name extension determines a pre-existent file-type; the ‹content› is a
string that is preprocessed according to rules of this file-type.
For example, Isabelle/Pure supports ▩‹.hs› as file-type for Haskell:
embedded cartouches are evaluated as Isabelle/ML expressions of type 🚫‹string›, the result is inlined in Haskell string syntax.
🚫🚫‹export_generated_files paths (in thy)› retrieves named generated files
from the given theory (that needs be reachable via imports of the current
one). By default, the current theory node is used. Using ``▩‹_›''
(underscore) instead of explicit path names refers to \emph{all} files of a
theory node.
The overall list of files is prefixed with the respective (long) theory name
and exported to the session database. In Isabelle/jEdit the result can be
browsed via the virtual file-system with prefix ``▩‹isabelle-export:›''
(using the regular file-browser).
🚫🚫‹scala_build_generated_files paths (in thy)› retrieves named generated
files as for 🚫‹export_generated_files› and writes them into a temporary
directory, which is taken as starting point for build process of
Isabelle/Scala/Java modules (see cite‹"isabelle-system"›). The
corresponding @{path ‹build.props›} file is expected directly in the toplevel
directory, instead of @{path ‹etc/build.props›} for Isabelle system
components. These properties need to specify sources, resources, services
etc. as usual. The resulting JAR module becomes an export artefact of the
session database, with a name of the form
``‹theory›▩‹:classpath/›‹module›▩‹.jar›''.
🚫🚫‹compile_generated_files paths (in thy) where compile_body› retrieves
named generated files as for 🚫‹export_generated_files› and writes them into
a temporary directory, such that the ‹compile_body› may operate on them as
an ML function of type 🚫‹Path.T -> unit›. This may create further
files, e.g.\ executables produced by a compiler that is invoked as external
process (e.g.\ via 🚫‹Isabelle_System.bash›), or any other files.
The option ``🚫‹external_files paths (in base_dir)›'' copies files from the
physical file-system into the temporary directory, \emph{before} invoking ‹compile_body›. The ‹base_dir› prefix is removed from each of the ‹paths›,
but the remaining sub-directory structure is reconstructed in the target
directory.
The option ``🚫‹export_files paths›'' exports the specified files from the
temporary directory to the session database, \emph{after} invoking ‹compile_body›. Entries may be decorated with ``🚫‹(exe)›'' to say that it is
a platform-specific executable program: the executable file-attribute will
be set, and on Windows the ▩‹.exe› file-extension will be included;
``🚫‹(executable)›'' only refers to the file-attribute, without special
treatment of the ▩‹.exe› extension.
The option ``🚫‹export_prefix path›'' specifies an extra path prefix for all
exports of 🚫‹export_files› above.
🚫🚫‹external_file name› declares the formal dependency on the given file
name, such that the Isabelle build process knows about it (see also cite‹"isabelle-system"›). This is required for any files mentioned in 🚫‹compile_generated_files / external_files› above, in order to document
source dependencies properly. It is also possible to use 🚫‹external_file›
alone, e.g.\ when other Isabelle/ML tools use 🚫‹File.read›, without
specific management of content by the Prover IDE. ›
🚫🚫‹default_sort s› makes sort ‹s› the new default sort for any type
variable that is given explicitly in the text, but lacks a sort constraint
(wrt.\ the current context). Type variables generated by type inference are
not affected.
Usually the default sort is only changed when defining a new object-logic.
For example, the default sort in Isabelle/HOL is 🚫‹type›, the class of
all HOL types.
When merging theories, the default sorts of the parents are logically
intersected, i.e.\ the representations as lists of classes are joined. ›
🚫🚫‹type_synonym (α1, …, αn) t = τ› introduces a ∗‹type synonym›‹(α1, …,
αn) t› for the existing type ‹τ›. Unlike the semantic type definitions in
Isabelle/HOL, type synonyms are merely syntactic abbreviations without any
logical significance. Internally, type synonyms are fully expanded.
🚫🚫‹typedecl (α1, …, αn) t› declares a new type constructor ‹t›. If the
object-logic defines a base sort ‹s›, then the constructor is declared to
operate on that, via the axiomatic type-class instance ‹t :: (s, …, s)s›.
\begin{warn}
If you introduce a new type axiomatically, i.e.\ via @{command_ref
typedecl} and @{command_ref axiomatization}
(\secref{sec:axiomatizations}), the minimum requirement is that it has a
non-empty model, to avoid immediate collapse of the logical environment.
Moreover, one needs to demonstrate that the interpretation of such
free-form axiomatizations can coexist with other axiomatization schemes
for types, notably @{command_def typedef} in Isabelle/HOL
(\secref{sec:hol-typedef}), or any other extension that people might have
introduced elsewhere. \end{warn} ›
🚫🚫‹lemmas a = b1… bn›~@{keyword_def "for"}~‹x1… xm› evaluates given
facts (with attributes) in the current context, which may be augmented by
java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "macro" is null
schematic variables are renamed to enforce index ‹0› uniformly.
🚫🚫‹named_theorems name description› declares a dynamic fact within the
context. The same ‹name› is used to define an attribute with the usual ‹add›/‹del› syntax (e.g.\ see \secref{sec:simp-rules}) to maintain the
content incrementally, in canonical declaration order of the text structure. ›
Oracles allow Isabelle to take advantage of external reasoners such as
arithmetic decision procedures, model checkers, fast tautology checkers or
computer algebra systems. Invoked as an oracle, an external reasoner can
create arbitrary Isabelle theorems.
It is the responsibility of the user to ensure that the external reasoner is
as trustworthy as the application requires. Another typical source of errors
is the linkup between Isabelle and the external tool, not just its concrete
implementation, but also the required translation between two different
logical environments.
Isabelle merely guarantees well-formedness of the propositions being
asserted, and records within the internal derivation object how presumed
theorems depend on unproven suppositions. This also includes implicit
type-class reasoning via the order-sorted algebra of class relations and
type arities (see also @{command_ref instantiation} and @{command_ref
instance}).
🚫🚫‹oracle name = "text"› turns the given ML expression ‹text› of type 🚫‹'a -> cterm› into an ML function of type 🚫‹'a -> thm›,
which is bound to the global identifier 🚫‹name›. This acts like an
infinitary specification of axioms! Invoking the oracle only works within
the scope of the resulting theory.
See 🚫‹~~/src/HOL/Examples/Iff_Oracle.thy› for a worked example of defining
a new primitive rule as oracle, and turning it into a proof method.
🚫🚫‹thm_oracles thms› displays all oracles used in the internal derivation
of the given theorems; this covers the full graph of transitive
dependencies. ›
Isabelle organizes any kind of name declarations (of types, constants,
theorems etc.) by separate hierarchically structured name spaces. Normally
the user does not have to control the behaviour of name spaces by hand, yet
the following commands provide some way to do so.
🚫🚫‹alias› and 🚫‹type_alias› introduce aliases for constants and type
constructors, respectively. This allows adhoc changes to name-space
accesses.
🚫🚫‹type_alias b = c› introduces an alias for an existing type constructor.
🚫🚫‹hide_class names› fully removes class declarations from a given name
space; with the ‹(open)› option, only the unqualified base name is hidden.
Note that hiding name space accesses has no impact on logical declarations
--- they remain valid internally. Entities that are no longer accessible to
the user are printed with the special qualifier ``‹??›'' prefixed to the
full internal name.
🚫🚫‹hide_type›, 🚫‹hide_const›, and 🚫‹hide_fact› are similar to 🚫‹hide_class›, but hide types, constants, and facts, respectively. ›
end
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.95Bemerkung:
(vorverarbeitet am 2026-06-30)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.