doc-src/IsarImplementation/Thy/document/integration.tex
author wenzelm
Fri, 19 Jan 2007 13:16:37 +0100
changeset 22090 bc8aee017f8a
parent 21402 c15bcd87f47c
child 22096 fed088a475f9
permissions -rw-r--r--
adapted ML context operations;
     1 %
     2 \begin{isabellebody}%
     3 \def\isabellecontext{integration}%
     4 %
     5 \isadelimtheory
     6 \isanewline
     7 \isanewline
     8 \isanewline
     9 %
    10 \endisadelimtheory
    11 %
    12 \isatagtheory
    13 \isacommand{theory}\isamarkupfalse%
    14 \ integration\ \isakeyword{imports}\ base\ \isakeyword{begin}%
    15 \endisatagtheory
    16 {\isafoldtheory}%
    17 %
    18 \isadelimtheory
    19 %
    20 \endisadelimtheory
    21 %
    22 \isamarkupchapter{System integration%
    23 }
    24 \isamarkuptrue%
    25 %
    26 \isamarkupsection{Isar toplevel \label{sec:isar-toplevel}%
    27 }
    28 \isamarkuptrue%
    29 %
    30 \begin{isamarkuptext}%
    31 The Isar toplevel may be considered the centeral hub of the
    32   Isabelle/Isar system, where all key components and sub-systems are
    33   integrated into a single read-eval-print loop of Isar commands.  We
    34   shall even incorporate the existing {\ML} toplevel of the compiler
    35   and run-time system (cf.\ \secref{sec:ML-toplevel}).
    36 
    37   Isabelle/Isar departs from the original ``LCF system architecture''
    38   where {\ML} was really The Meta Language for defining theories and
    39   conducting proofs.  Instead, {\ML} now only serves as the
    40   implementation language for the system (and user extensions), while
    41   the specific Isar toplevel supports the concepts of theory and proof
    42   development natively.  This includes the graph structure of theories
    43   and the block structure of proofs, support for unlimited undo,
    44   facilities for tracing, debugging, timing, profiling etc.
    45 
    46   \medskip The toplevel maintains an implicit state, which is
    47   transformed by a sequence of transitions -- either interactively or
    48   in batch-mode.  In interactive mode, Isar state transitions are
    49   encapsulated as safe transactions, such that both failure and undo
    50   are handled conveniently without destroying the underlying draft
    51   theory (cf.~\secref{sec:context-theory}).  In batch mode,
    52   transitions operate in a linear (destructive) fashion, such that
    53   error conditions abort the present attempt to construct a theory or
    54   proof altogether.
    55 
    56   The toplevel state is a disjoint sum of empty \isa{toplevel}, or
    57   \isa{theory}, or \isa{proof}.  On entering the main Isar loop we
    58   start with an empty toplevel.  A theory is commenced by giving a
    59   \isa{{\isasymTHEORY}} header; within a theory we may issue theory
    60   commands such as \isa{{\isasymDEFINITION}}, or state a \isa{{\isasymTHEOREM}} to be proven.  Now we are within a proof state, with a
    61   rich collection of Isar proof commands for structured proof
    62   composition, or unstructured proof scripts.  When the proof is
    63   concluded we get back to the theory, which is then updated by
    64   storing the resulting fact.  Further theory declarations or theorem
    65   statements with proofs may follow, until we eventually conclude the
    66   theory development by issuing \isa{{\isasymEND}}.  The resulting theory
    67   is then stored within the theory database and we are back to the
    68   empty toplevel.
    69 
    70   In addition to these proper state transformations, there are also
    71   some diagnostic commands for peeking at the toplevel state without
    72   modifying it (e.g.\ \isakeyword{thm}, \isakeyword{term},
    73   \isakeyword{print-cases}).%
    74 \end{isamarkuptext}%
    75 \isamarkuptrue%
    76 %
    77 \isadelimmlref
    78 %
    79 \endisadelimmlref
    80 %
    81 \isatagmlref
    82 %
    83 \begin{isamarkuptext}%
    84 \begin{mldecls}
    85   \indexmltype{Toplevel.state}\verb|type Toplevel.state| \\
    86   \indexml{Toplevel.UNDEF}\verb|Toplevel.UNDEF: exn| \\
    87   \indexml{Toplevel.is-toplevel}\verb|Toplevel.is_toplevel: Toplevel.state -> bool| \\
    88   \indexml{Toplevel.theory-of}\verb|Toplevel.theory_of: Toplevel.state -> theory| \\
    89   \indexml{Toplevel.proof-of}\verb|Toplevel.proof_of: Toplevel.state -> Proof.state| \\
    90   \indexml{Toplevel.debug}\verb|Toplevel.debug: bool ref| \\
    91   \indexml{Toplevel.timing}\verb|Toplevel.timing: bool ref| \\
    92   \indexml{Toplevel.profiling}\verb|Toplevel.profiling: int ref| \\
    93   \end{mldecls}
    94 
    95   \begin{description}
    96 
    97   \item \verb|Toplevel.state| represents Isar toplevel states,
    98   which are normally manipulated through the concept of toplevel
    99   transitions only (\secref{sec:toplevel-transition}).  Also note that
   100   a raw toplevel state is subject to the same linearity restrictions
   101   as a theory context (cf.~\secref{sec:context-theory}).
   102 
   103   \item \verb|Toplevel.UNDEF| is raised for undefined toplevel
   104   operations.  Many operations work only partially for certain cases,
   105   since \verb|Toplevel.state| is a sum type.
   106 
   107   \item \verb|Toplevel.is_toplevel|~\isa{state} checks for an empty
   108   toplevel state.
   109 
   110   \item \verb|Toplevel.theory_of|~\isa{state} selects the theory of
   111   a theory or proof (!), otherwise raises \verb|Toplevel.UNDEF|.
   112 
   113   \item \verb|Toplevel.proof_of|~\isa{state} selects the Isar proof
   114   state if available, otherwise raises \verb|Toplevel.UNDEF|.
   115 
   116   \item \verb|set Toplevel.debug| makes the toplevel print further
   117   details about internal error conditions, exceptions being raised
   118   etc.
   119 
   120   \item \verb|set Toplevel.timing| makes the toplevel print timing
   121   information for each Isar command being executed.
   122 
   123   \item \verb|Toplevel.profiling|~\verb|:=|~\isa{n} controls
   124   low-level profiling of the underlying {\ML} runtime system.  For
   125   Poly/ML, \isa{n\ {\isacharequal}\ {\isadigit{1}}} means time and \isa{n\ {\isacharequal}\ {\isadigit{2}}} space
   126   profiling.
   127 
   128   \end{description}%
   129 \end{isamarkuptext}%
   130 \isamarkuptrue%
   131 %
   132 \endisatagmlref
   133 {\isafoldmlref}%
   134 %
   135 \isadelimmlref
   136 %
   137 \endisadelimmlref
   138 %
   139 \isamarkupsubsection{Toplevel transitions \label{sec:toplevel-transition}%
   140 }
   141 \isamarkuptrue%
   142 %
   143 \begin{isamarkuptext}%
   144 An Isar toplevel transition consists of a partial function on the
   145   toplevel state, with additional information for diagnostics and
   146   error reporting: there are fields for command name, source position,
   147   optional source text, as well as flags for interactive-only commands
   148   (which issue a warning in batch-mode), printing of result state,
   149   etc.
   150 
   151   The operational part is represented as the sequential union of a
   152   list of partial functions, which are tried in turn until the first
   153   one succeeds.  This acts like an outer case-expression for various
   154   alternative state transitions.  For example, \isakeyword{qed} acts
   155   differently for a local proofs vs.\ the global ending of the main
   156   proof.
   157 
   158   Toplevel transitions are composed via transition transformers.
   159   Internally, Isar commands are put together from an empty transition
   160   extended by name and source position (and optional source text).  It
   161   is then left to the individual command parser to turn the given
   162   concrete syntax into a suitable transition transformer that adjoin
   163   actual operations on a theory or proof state etc.%
   164 \end{isamarkuptext}%
   165 \isamarkuptrue%
   166 %
   167 \isadelimmlref
   168 %
   169 \endisadelimmlref
   170 %
   171 \isatagmlref
   172 %
   173 \begin{isamarkuptext}%
   174 \begin{mldecls}
   175   \indexml{Toplevel.print}\verb|Toplevel.print: Toplevel.transition -> Toplevel.transition| \\
   176   \indexml{Toplevel.no-timing}\verb|Toplevel.no_timing: Toplevel.transition -> Toplevel.transition| \\
   177   \indexml{Toplevel.keep}\verb|Toplevel.keep: (Toplevel.state -> unit) ->|\isasep\isanewline%
   178 \verb|  Toplevel.transition -> Toplevel.transition| \\
   179   \indexml{Toplevel.theory}\verb|Toplevel.theory: (theory -> theory) ->|\isasep\isanewline%
   180 \verb|  Toplevel.transition -> Toplevel.transition| \\
   181   \indexml{Toplevel.theory-to-proof}\verb|Toplevel.theory_to_proof: (theory -> Proof.state) ->|\isasep\isanewline%
   182 \verb|  Toplevel.transition -> Toplevel.transition| \\
   183   \indexml{Toplevel.proof}\verb|Toplevel.proof: (Proof.state -> Proof.state) ->|\isasep\isanewline%
   184 \verb|  Toplevel.transition -> Toplevel.transition| \\
   185   \indexml{Toplevel.proofs}\verb|Toplevel.proofs: (Proof.state -> Proof.state Seq.seq) ->|\isasep\isanewline%
   186 \verb|  Toplevel.transition -> Toplevel.transition| \\
   187   \indexml{Toplevel.end-proof}\verb|Toplevel.end_proof: (bool -> Proof.state -> Proof.context) ->|\isasep\isanewline%
   188 \verb|  Toplevel.transition -> Toplevel.transition| \\
   189   \end{mldecls}
   190 
   191   \begin{description}
   192 
   193   \item \verb|Toplevel.print|~\isa{tr} sets the print flag, which
   194   causes the toplevel loop to echo the result state (in interactive
   195   mode).
   196 
   197   \item \verb|Toplevel.no_timing|~\isa{tr} indicates that the
   198   transition should never show timing information, e.g.\ because it is
   199   a diagnostic command.
   200 
   201   \item \verb|Toplevel.keep|~\isa{tr} adjoins a diagnostic
   202   function.
   203 
   204   \item \verb|Toplevel.theory|~\isa{tr} adjoins a theory
   205   transformer.
   206 
   207   \item \verb|Toplevel.theory_to_proof|~\isa{tr} adjoins a global
   208   goal function, which turns a theory into a proof state.  The theory
   209   may be changed before entering the proof; the generic Isar goal
   210   setup includes an argument that specifies how to apply the proven
   211   result to the theory, when the proof is finished.
   212 
   213   \item \verb|Toplevel.proof|~\isa{tr} adjoins a deterministic
   214   proof command, with a singleton result.
   215 
   216   \item \verb|Toplevel.proofs|~\isa{tr} adjoins a general proof
   217   command, with zero or more result states (represented as a lazy
   218   list).
   219 
   220   \item \verb|Toplevel.end_proof|~\isa{tr} adjoins a concluding
   221   proof command, that returns the resulting theory, after storing the
   222   resulting facts in the context etc.
   223 
   224   \end{description}%
   225 \end{isamarkuptext}%
   226 \isamarkuptrue%
   227 %
   228 \endisatagmlref
   229 {\isafoldmlref}%
   230 %
   231 \isadelimmlref
   232 %
   233 \endisadelimmlref
   234 %
   235 \isamarkupsubsection{Toplevel control%
   236 }
   237 \isamarkuptrue%
   238 %
   239 \begin{isamarkuptext}%
   240 There are a few special control commands that modify the behavior
   241   the toplevel itself, and only make sense in interactive mode.  Under
   242   normal circumstances, the user encounters these only implicitly as
   243   part of the protocol between the Isabelle/Isar system and a
   244   user-interface such as ProofGeneral.
   245 
   246   \begin{description}
   247 
   248   \item \isacommand{undo} follows the three-level hierarchy of empty
   249   toplevel vs.\ theory vs.\ proof: undo within a proof reverts to the
   250   previous proof context, undo after a proof reverts to the theory
   251   before the initial goal statement, undo of a theory command reverts
   252   to the previous theory value, undo of a theory header discontinues
   253   the current theory development and removes it from the theory
   254   database (\secref{sec:theory-database}).
   255 
   256   \item \isacommand{kill} aborts the current level of development:
   257   kill in a proof context reverts to the theory before the initial
   258   goal statement, kill in a theory context aborts the current theory
   259   development, removing it from the database.
   260 
   261   \item \isacommand{exit} drops out of the Isar toplevel into the
   262   underlying {\ML} toplevel (\secref{sec:ML-toplevel}).  The Isar
   263   toplevel state is preserved and may be continued later.
   264 
   265   \item \isacommand{quit} terminates the Isabelle/Isar process without
   266   saving.
   267 
   268   \end{description}%
   269 \end{isamarkuptext}%
   270 \isamarkuptrue%
   271 %
   272 \isamarkupsection{ML toplevel \label{sec:ML-toplevel}%
   273 }
   274 \isamarkuptrue%
   275 %
   276 \begin{isamarkuptext}%
   277 The {\ML} toplevel provides a read-compile-eval-print loop for {\ML}
   278   values, types, structures, and functors.  {\ML} declarations operate
   279   on the global system state, which consists of the compiler
   280   environment plus the values of {\ML} reference variables.  There is
   281   no clean way to undo {\ML} declarations, except for reverting to a
   282   previously saved state of the whole Isabelle process.  {\ML} input
   283   is either read interactively from a TTY, or from a string (usually
   284   within a theory text), or from a source file (usually loaded from a
   285   theory).
   286 
   287   Whenever the {\ML} toplevel is active, the current Isabelle theory
   288   context is passed as an internal reference variable.  Thus {\ML}
   289   code may access the theory context during compilation, it may even
   290   change the value of a theory being under construction --- while
   291   observing the usual linearity restrictions
   292   (cf.~\secref{sec:context-theory}).%
   293 \end{isamarkuptext}%
   294 \isamarkuptrue%
   295 %
   296 \isadelimmlref
   297 %
   298 \endisadelimmlref
   299 %
   300 \isatagmlref
   301 %
   302 \begin{isamarkuptext}%
   303 \begin{mldecls}
   304   \indexml{the-context}\verb|the_context: unit -> theory| \\
   305   \indexml{Context.$>$$>$ }\verb|Context.>> : (theory -> theory) -> unit| \\
   306   \end{mldecls}
   307 
   308   \begin{description}
   309 
   310   \item \verb|the_context ()| refers to the theory context of the
   311   {\ML} toplevel --- at compile time!  {\ML} code needs to take care
   312   to refer to \verb|the_context ()| correctly.  Recall that
   313   evaluation of a function body is delayed until actual runtime.
   314   Moreover, persistent {\ML} toplevel bindings to an unfinished theory
   315   should be avoided: code should either project out the desired
   316   information immediately, or produce an explicit \verb|theory_ref| (cf.\ \secref{sec:context-theory}).
   317 
   318   \item \verb|Context.>>|~\isa{f} applies theory transformation
   319   \isa{f} to the current theory of the {\ML} toplevel.  In order to
   320   work as expected, the theory should be still under construction, and
   321   the Isar language element that invoked the {\ML} compiler in the
   322   first place should be ready to accept the changed theory value
   323   (e.g.\ \isakeyword{ML-setup}, but not plain \isakeyword{ML}).
   324   Otherwise the theory becomes stale!
   325 
   326   \end{description}
   327 
   328   It is very important to note that the above functions are really
   329   restricted to the compile time, even though the {\ML} compiler is
   330   invoked at runtime!  The majority of {\ML} code uses explicit
   331   functional arguments of a theory or proof context instead.  Thus it
   332   may be invoked for an arbitrary context later on, without having to
   333   worry about any operational details.
   334 
   335   \bigskip
   336 
   337   \begin{mldecls}
   338   \indexml{Isar.main}\verb|Isar.main: unit -> unit| \\
   339   \indexml{Isar.loop}\verb|Isar.loop: unit -> unit| \\
   340   \indexml{Isar.state}\verb|Isar.state: unit -> Toplevel.state| \\
   341   \indexml{Isar.exn}\verb|Isar.exn: unit -> (exn * string) option| \\
   342   \indexml{Isar.context}\verb|Isar.context: unit -> Proof.context| \\
   343   \indexml{Isar.goal}\verb|Isar.goal: unit -> thm list * thm| \\
   344   \end{mldecls}
   345 
   346   \begin{description}
   347 
   348   \item \verb|Isar.main ()| invokes the Isar toplevel from {\ML},
   349   initializing an empty toplevel state.
   350 
   351   \item \verb|Isar.loop ()| continues the Isar toplevel with the
   352   current state, after having dropped out of the Isar toplevel loop.
   353 
   354   \item \verb|Isar.state ()| and \verb|Isar.exn ()| get current
   355   toplevel state and error condition, respectively.  This only works
   356   after having dropped out of the Isar toplevel loop.
   357 
   358   \item \verb|Isar.context ()| produces the proof context from \verb|Isar.state ()|, analogous to \verb|Context.proof_of|
   359   (\secref{sec:generic-context}).
   360 
   361   \item \verb|Isar.goal ()| picks the goal configuration from \verb|Isar.state ()|, consisting on the current facts and the goal
   362   represented as a theorem according to \secref{sec:tactical-goals}.
   363 
   364   \end{description}%
   365 \end{isamarkuptext}%
   366 \isamarkuptrue%
   367 %
   368 \endisatagmlref
   369 {\isafoldmlref}%
   370 %
   371 \isadelimmlref
   372 %
   373 \endisadelimmlref
   374 %
   375 \isamarkupsection{Theory database \label{sec:theory-database}%
   376 }
   377 \isamarkuptrue%
   378 %
   379 \begin{isamarkuptext}%
   380 The theory database maintains a collection of theories, together
   381   with some administrative information about their original sources,
   382   which are held in an external store (i.e.\ some directory within the
   383   regular file system).
   384 
   385   The theory database is organized as a directed acyclic graph;
   386   entries are referenced by theory name.  Although some additional
   387   interfaces allow to include a directory specification as well, this
   388   is only a hint to the underlying theory loader.  The internal theory
   389   name space is flat!
   390 
   391   Theory \isa{A} is associated with the main theory file \isa{A}\verb,.thy,, which needs to be accessible through the theory
   392   loader path.  Any number of additional {\ML} source files may be
   393   associated with each theory, by declaring these dependencies in the
   394   theory header as \isa{{\isasymUSES}}, and loading them consecutively
   395   within the theory context.  The system keeps track of incoming {\ML}
   396   sources and associates them with the current theory.  The file
   397   \isa{A}\verb,.ML, is loaded after a theory has been concluded, in
   398   order to support legacy proof {\ML} proof scripts.
   399 
   400   The basic internal actions of the theory database are \isa{update}, \isa{outdate}, and \isa{remove}:
   401 
   402   \begin{itemize}
   403 
   404   \item \isa{update\ A} introduces a link of \isa{A} with a
   405   \isa{theory} value of the same name; it asserts that the theory
   406   sources are now consistent with that value;
   407 
   408   \item \isa{outdate\ A} invalidates the link of a theory database
   409   entry to its sources, but retains the present theory value;
   410 
   411   \item \isa{remove\ A} deletes entry \isa{A} from the theory
   412   database.
   413   
   414   \end{itemize}
   415 
   416   These actions are propagated to sub- or super-graphs of a theory
   417   entry as expected, in order to preserve global consistency of the
   418   state of all loaded theories with the sources of the external store.
   419   This implies certain causalities between actions: \isa{update}
   420   or \isa{outdate} of an entry will \isa{outdate} all
   421   descendants; \isa{remove} will \isa{remove} all descendants.
   422 
   423   \medskip There are separate user-level interfaces to operate on the
   424   theory database directly or indirectly.  The primitive actions then
   425   just happen automatically while working with the system.  In
   426   particular, processing a theory header \isa{{\isasymTHEORY}\ A\ {\isasymIMPORTS}\ B\isactrlsub {\isadigit{1}}\ {\isasymdots}\ B\isactrlsub n\ {\isasymBEGIN}} ensures that the
   427   sub-graph of the collective imports \isa{B\isactrlsub {\isadigit{1}}\ {\isasymdots}\ B\isactrlsub n}
   428   is up-to-date, too.  Earlier theories are reloaded as required, with
   429   \isa{update} actions proceeding in topological order according to
   430   theory dependencies.  There may be also a wave of implied \isa{outdate} actions for derived theory nodes until a stable situation
   431   is achieved eventually.%
   432 \end{isamarkuptext}%
   433 \isamarkuptrue%
   434 %
   435 \isadelimmlref
   436 %
   437 \endisadelimmlref
   438 %
   439 \isatagmlref
   440 %
   441 \begin{isamarkuptext}%
   442 \begin{mldecls}
   443   \indexml{theory}\verb|theory: string -> theory| \\
   444   \indexml{use-thy}\verb|use_thy: string -> unit| \\
   445   \indexml{update-thy}\verb|update_thy: string -> unit| \\
   446   \indexml{touch-thy}\verb|touch_thy: string -> unit| \\
   447   \indexml{remove-thy}\verb|remove_thy: string -> unit| \\[1ex]
   448   \indexml{ThyInfo.begin-theory}\verb|ThyInfo.begin_theory|\verb|: ... -> bool -> theory| \\
   449   \indexml{ThyInfo.end-theory}\verb|ThyInfo.end_theory: theory -> theory| \\
   450   \indexml{ThyInfo.register-theory}\verb|ThyInfo.register_theory: theory -> unit| \\[1ex]
   451   \verb|datatype action = Update |\verb,|,\verb| Outdate |\verb,|,\verb| Remove| \\
   452   \indexml{ThyInfo.add-hook}\verb|ThyInfo.add_hook: (ThyInfo.action -> string -> unit) -> unit| \\
   453   \end{mldecls}
   454 
   455   \begin{description}
   456 
   457   \item \verb|theory|~\isa{A} retrieves the theory value presently
   458   associated with name \isa{A}.  Note that the result might be
   459   outdated.
   460 
   461   \item \verb|use_thy|~\isa{A} loads theory \isa{A} if it is absent
   462   or out-of-date.  It ensures that all parent theories are available
   463   as well, but does not reload them if older versions are already
   464   present.
   465 
   466   \item \verb|update_thy| is similar to \verb|use_thy|, but ensures that
   467   theory \isa{A} and all ancestors are fully up-to-date.
   468 
   469   \item \verb|touch_thy|~\isa{A} performs and \isa{outdate} action
   470   on theory \isa{A} and all descendants.
   471 
   472   \item \verb|remove_thy|~\isa{A} deletes theory \isa{A} and all
   473   descendants from the theory database.
   474 
   475   \item \verb|ThyInfo.begin_theory| is the basic operation behind a
   476   \isa{{\isasymTHEORY}} header declaration.  The boolean argument
   477   indicates the strictness of treating ancestors: for \verb|true| (as
   478   in interactive mode) like \verb|update_thy|, and for \verb|false| (as
   479   in batch mode) like \verb|use_thy|.  This is {\ML} functions is
   480   normally not invoked directly.
   481 
   482   \item \verb|ThyInfo.end_theory| concludes the loading of a theory
   483   proper.  An attached theory {\ML} file may be still loaded later on.
   484   This is function is normally not invoked directly.
   485 
   486   \item \verb|ThyInfo.register_theory|~\isa{text\ thy} registers an
   487   existing theory value with the theory loader database.  There is no
   488   management of associated sources.
   489 
   490   \item \verb|ThyInfo.add_hook|~\isa{f} registers function \isa{f} as a hook for theory database actions.  The function will be
   491   invoked with the action and theory name being involved; thus derived
   492   actions may be performed in associated system components, e.g.\
   493   maintaining the state of an editor for the theory sources.
   494 
   495   The kind and order of actions occurring in practice depends both on
   496   user interactions and the internal process of resolving theory
   497   imports.  Hooks should not rely on a particular policy here!  Any
   498   exceptions raised by the hook are ignored.
   499 
   500   \end{description}%
   501 \end{isamarkuptext}%
   502 \isamarkuptrue%
   503 %
   504 \endisatagmlref
   505 {\isafoldmlref}%
   506 %
   507 \isadelimmlref
   508 %
   509 \endisadelimmlref
   510 %
   511 \isadelimtheory
   512 %
   513 \endisadelimtheory
   514 %
   515 \isatagtheory
   516 \isacommand{end}\isamarkupfalse%
   517 %
   518 \endisatagtheory
   519 {\isafoldtheory}%
   520 %
   521 \isadelimtheory
   522 %
   523 \endisadelimtheory
   524 \isanewline
   525 \end{isabellebody}%
   526 %%% Local Variables:
   527 %%% mode: latex
   528 %%% TeX-master: "root"
   529 %%% End: