doc-src/Ref/theories.tex
author nipkow
Tue, 06 May 1997 13:33:33 +0200
changeset 3111 00fb015d27aa
parent 3108 335efc3f5632
child 3201 7c3cbf675e85
permissions -rw-r--r--
Stupid bug in induct_tac caused warning to always appear.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     1
%% $Id$
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
     2
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     3
\chapter{Theories, Terms and Types} \label{theories}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     4
\index{theories|(}\index{signatures|bold}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
     5
\index{reading!axioms|see{{\tt assume_ax}}} Theories organize the
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
     6
syntax, declarations and axioms of a mathematical development.  They
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
     7
are built, starting from the {\Pure} or {\CPure} theory, by extending
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
     8
and merging existing theories.  They have the \ML\ type
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
     9
\mltydx{theory}.  Theory operations signal errors by raising exception
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    10
\xdx{THEORY}, returning a message and a list of theories.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    11
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    12
Signatures, which contain information about sorts, types, constants and
332
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
    13
syntax, have the \ML\ type~\mltydx{Sign.sg}.  For identification, each
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    14
signature carries a unique list of \bfindex{stamps}, which are \ML\
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    15
references to strings.  The strings serve as human-readable names; the
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    16
references serve as unique identifiers.  Each primitive signature has a
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    17
single stamp.  When two signatures are merged, their lists of stamps are
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    18
also merged.  Every theory carries a unique signature.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    19
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    20
Terms and types are the underlying representation of logical syntax.  Their
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
    21
\ML\ definitions are irrelevant to naive Isabelle users.  Programmers who
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
    22
wish to extend Isabelle may need to know such details, say to code a tactic
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
    23
that looks for subgoals of a particular form.  Terms and types may be
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    24
`certified' to be well-formed with respect to a given signature.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    25
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    26
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    27
\section{Defining theories}\label{sec:ref-defining-theories}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    28
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    29
Theories are usually defined using theory definition files (which have a name
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    30
suffix {\tt .thy}). There is also a low level interface provided by certain
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    31
\ML{} functions (see \S\ref{BuildingATheory}).
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    32
Appendix~\ref{app:TheorySyntax} presents the concrete syntax for theory
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    33
definitions; here is an explanation of the constituent parts:
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    34
\begin{description}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    35
\item[{\it theoryDef}] is the full definition.  The new theory is
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    36
  called $id$.  It is the union of the named {\bf parent
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    37
    theories}\indexbold{theories!parent}, possibly extended with new
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    38
  components.  \thydx{Pure} and \thydx{CPure} are the basic theories,
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    39
  which contain only the meta-logic. They differ just in their
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    40
  concrete syntax for function applications.
138
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
    41
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    42
  Normally each {\it name\/} is an identifier, the name of the parent theory.
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    43
  Quoted strings can be used to document additional file dependencies; see
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
    44
  \S\ref{LoadingTheories} for details.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    45
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    46
\item[$classes$]
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    47
  is a series of class declarations.  Declaring {\tt$id$ < $id@1$ \dots\
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    48
    $id@n$} makes $id$ a subclass of the existing classes $id@1\dots
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    49
  id@n$.  This rules out cyclic class structures.  Isabelle automatically
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    50
  computes the transitive closure of subclass hierarchies; it is not
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    51
  necessary to declare {\tt c < e} in addition to {\tt c < d} and {\tt d <
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    52
    e}.
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    53
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    54
\item[$default$]
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    55
  introduces $sort$ as the new default sort for type variables.  This applies
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    56
  to unconstrained type variables in an input string but not to type
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    57
  variables created internally.  If omitted, the default sort is the listwise
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    58
  union of the default sorts of the parent theories (i.e.\ their logical
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    59
  intersection).
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    60
  
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    61
\item[$sort$] is a finite set of classes.  A single class $id$
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    62
  abbreviates the sort $\ttlbrace id\ttrbrace$.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    63
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    64
\item[$types$]
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    65
  is a series of type declarations.  Each declares a new type constructor
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    66
  or type synonym.  An $n$-place type constructor is specified by
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    67
  $(\alpha@1,\dots,\alpha@n)name$, where the type variables serve only to
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    68
  indicate the number~$n$.
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    69
332
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
    70
  A {\bf type synonym}\indexbold{type synonyms} is an abbreviation
1387
9bcad9c22fd4 removed quotes from syntax and consts sections
clasohm
parents: 1380
diff changeset
    71
  $(\alpha@1,\dots,\alpha@n)name = \tau$, where $name$ and $\tau$ can
9bcad9c22fd4 removed quotes from syntax and consts sections
clasohm
parents: 1380
diff changeset
    72
  be strings.
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    73
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    74
\item[$infix$]
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    75
  declares a type or constant to be an infix operator of priority $nat$
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    76
  associating to the left ({\tt infixl}) or right ({\tt infixr}). Only
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    77
  2-place type constructors can have infix status; an example is {\tt
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    78
  ('a,'b)~"*"~(infixr~20)}, which may express binary product types.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    79
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    80
\item[$arities$] is a series of type arity declarations.  Each assigns
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    81
  arities to type constructors.  The $name$ must be an existing type
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    82
  constructor, which is given the additional arity $arity$.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    83
  
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    84
\item[$consts$] is a series of constant declarations.  Each new
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    85
  constant $name$ is given the specified type.  The optional $mixfix$
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    86
  annotations may attach concrete syntax to the constant.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    87
  
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    88
\item[$syntax$] \index{*syntax section}\index{print mode} is a variant
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    89
  of $consts$ which adds just syntax without actually declaring
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    90
  logical constants.  This gives full control over a theory's context
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    91
  free grammar. The optional $mode$ specifies the print mode where the
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    92
  mixfix productions should be added. If there is no \texttt{output}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    93
  option given, all productions are also added to the input syntax
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    94
  (regardless of the print mode).
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    95
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    96
\item[$mixfix$] \index{mixfix declarations}
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    97
  annotations can take three forms:
273
538db1a98ba3 *** empty log message ***
nipkow
parents: 185
diff changeset
    98
  \begin{itemize}
538db1a98ba3 *** empty log message ***
nipkow
parents: 185
diff changeset
    99
  \item A mixfix template given as a $string$ of the form
538db1a98ba3 *** empty log message ***
nipkow
parents: 185
diff changeset
   100
    {\tt"}\dots{\tt\_}\dots{\tt\_}\dots{\tt"} where the $i$-th underscore
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   101
    indicates the position where the $i$-th argument should go.  The list
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   102
    of numbers gives the priority of each argument.  The final number gives
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   103
    the priority of the whole construct.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   104
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   105
  \item A constant $f$ of type $\tau@1\To(\tau@2\To\tau)$ can be given {\bf
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   106
    infix} status.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   107
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   108
  \item A constant $f$ of type $(\tau@1\To\tau@2)\To\tau$ can be given {\bf
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   109
    binder} status.  The declaration {\tt binder} $\cal Q$ $p$ causes
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   110
  ${\cal Q}\,x.F(x)$ to be treated
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   111
  like $f(F)$, where $p$ is the priority.
273
538db1a98ba3 *** empty log message ***
nipkow
parents: 185
diff changeset
   112
  \end{itemize}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   113
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   114
\item[$trans$]
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   115
  specifies syntactic translation rules (macros).  There are three forms:
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   116
  parse rules ({\tt =>}), print rules ({\tt <=}), and parse/print rules ({\tt
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   117
  ==}).
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   118
1650
a4ed2655b08c Added 'constdefs'
nipkow
parents: 1551
diff changeset
   119
\item[$rules$]
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   120
  is a series of rule declarations.  Each has a name $id$ and the formula is
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   121
  given by the $string$.  Rule names must be distinct within any single
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   122
  theory.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   123
1905
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   124
\item[$defs$] is a series of definitions.  They are just like $rules$, except
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   125
  that every $string$ must be a definition (see below for details).
1650
a4ed2655b08c Added 'constdefs'
nipkow
parents: 1551
diff changeset
   126
a4ed2655b08c Added 'constdefs'
nipkow
parents: 1551
diff changeset
   127
\item[$constdefs$] combines the declaration of constants and their
a4ed2655b08c Added 'constdefs'
nipkow
parents: 1551
diff changeset
   128
  definition. The first $string$ is the type, the second the definition.
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   129
  
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   130
\item[$axclass$] \index{*axclass section} defines an
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   131
  \rmindex{axiomatic type class} as the intersection of existing
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   132
  classes, with additional axioms holding. Class axioms may not
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   133
  contain more than one type variable. The class axioms (with implicit
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   134
  sort constraints added) are bound to the given names.  Furthermore a
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   135
  class introduction rule is generated, which is automatically
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   136
  employed by $instance$ to prove instantiations of this class.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   137
  
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   138
\item[$instance$] \index{*instance section} proves class inclusions or
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   139
  type arities at the logical level and then transfers these to the
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   140
  type signature. The instantiation is proven and checked properly.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   141
  The user has to supply sufficient witness information: theorems
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   142
  ($longident$), axioms ($string$), or even arbitrary \ML{} tactic
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   143
  code $verbatim$.
1650
a4ed2655b08c Added 'constdefs'
nipkow
parents: 1551
diff changeset
   144
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   145
\item[$oracle$] links the theory to a trusted external reasoner.  It is
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   146
  allowed to create theorems, but each theorem carries a proof object
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   147
  describing the oracle invocation.  See \S\ref{sec:oracles} for details.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   148
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   149
\item[$ml$] \index{*ML section}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   150
  consists of \ML\ code, typically for parse and print translation functions.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   151
\end{description}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   152
%
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   153
Chapters~\ref{Defining-Logics} and \ref{chap:syntax} explain mixfix
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   154
declarations, translation rules and the {\tt ML} section in more detail.
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   155
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   156
1905
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   157
\subsection{Definitions}\indexbold{definitions}
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   158
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   159
{\bf Definitions} are intended to express abbreviations. The simplest
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   160
form of a definition is $f \equiv t$, where $f$ is a constant.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   161
Isabelle also allows a derived forms where the arguments of~$f$ appear
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   162
on the left, abbreviating a string of $\lambda$-abstractions.
1905
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   163
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   164
Isabelle makes the following checks on definitions:
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   165
\begin{itemize}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   166
\item Arguments (on the left-hand side) must be distinct variables.
1905
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   167
\item All variables on the right-hand side must also appear on the left-hand
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   168
  side. 
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   169
\item All type variables on the right-hand side must also appear on
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   170
  the left-hand side; this prohibits definitions such as {\tt
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   171
    (zero::nat) == length ([]::'a list)}.
1905
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   172
\item The definition must not be recursive.  Most object-logics provide
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   173
  definitional principles that can be used to express recursion safely.
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   174
\end{itemize}
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   175
These checks are intended to catch the sort of errors that might be made
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   176
accidentally.  Misspellings, for instance, might result in additional
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   177
variables appearing on the right-hand side.  More elaborate checks could be
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   178
made, but the cost might be overly strict rules on declaration order, etc.
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   179
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   180
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   181
\subsection{*Classes and arities}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   182
\index{classes!context conditions}\index{arities!context conditions}
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   183
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   184
In order to guarantee principal types~\cite{nipkow-prehofer},
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   185
arity declarations must obey two conditions:
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   186
\begin{itemize}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   187
\item There must not be any two declarations $ty :: (\vec{r})c$ and
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   188
  $ty :: (\vec{s})c$ with $\vec{r} \neq \vec{s}$.  For example, this
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   189
  excludes the following:
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   190
\begin{ttbox}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   191
arities
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   192
  foo :: ({\ttlbrace}logic{\ttrbrace}) logic
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   193
  foo :: ({\ttlbrace}{\ttrbrace})logic
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   194
\end{ttbox}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   195
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   196
\item If there are two declarations $ty :: (s@1,\dots,s@n)c$ and $ty ::
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   197
  (s@1',\dots,s@n')c'$ such that $c' < c$ then $s@i' \preceq s@i$ must hold
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   198
  for $i=1,\dots,n$.  The relationship $\preceq$, defined as
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   199
\[ s' \preceq s \iff \forall c\in s. \exists c'\in s'.~ c'\le c, \]
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   200
expresses that the set of types represented by $s'$ is a subset of the
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   201
set of types represented by $s$.  Assuming $term \preceq logic$, the
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   202
following is forbidden:
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   203
\begin{ttbox}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   204
arities
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   205
  foo :: ({\ttlbrace}logic{\ttrbrace})logic
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   206
  foo :: ({\ttlbrace}{\ttrbrace})term
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   207
\end{ttbox}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   208
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   209
\end{itemize}
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   210
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   211
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   212
\section{Loading a new theory}\label{LoadingTheories}
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   213
\index{theories!loading}\index{files!reading}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   214
\begin{ttbox}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   215
use_thy         : string -> unit
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   216
time_use_thy    : string -> unit
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   217
loadpath        : string list ref \hfill{\bf initially {\tt["."]}}
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   218
delete_tmpfiles : bool ref \hfill{\bf initially true}
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   219
\end{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   220
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   221
\begin{ttdescription}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   222
\item[\ttindexbold{use_thy} $thyname$]
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   223
  reads the theory $thyname$ and creates an \ML{} structure as described below.
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   224
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   225
\item[\ttindexbold{time_use_thy} $thyname$]
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   226
  calls {\tt use_thy} $thyname$ and reports the time taken.
138
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   227
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   228
\item[\ttindexbold{loadpath}]
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   229
  contains a list of directories to search when locating the files that
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   230
  define a theory.  This list is only used if the theory name in {\tt
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   231
    use_thy} does not specify the path explicitly.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   232
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   233
\item[\ttindexbold{delete_tmpfiles} := false;]
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   234
suppresses the deletion of temporary files.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   235
\end{ttdescription}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   236
%
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   237
Each theory definition must reside in a separate file.  Let the file
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   238
{\it T}{\tt.thy} contain the definition of a theory called~$T$, whose
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   239
parent theories are $TB@1$ \dots $TB@n$.  Calling
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   240
\ttindex{use_thy}~{\tt"{\it T\/}"} reads the file {\it T}{\tt.thy},
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   241
writes a temporary \ML{} file {\tt.{\it T}.thy.ML}, and reads the
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   242
latter file.  Recursive {\tt use_thy} calls load those parent theories
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   243
that have not been loaded previously; the recursive calls may continue
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   244
to any depth.  One {\tt use_thy} call can read an entire logic
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   245
provided all theories are linked appropriately.
138
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   246
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   247
The result is an \ML\ structure~$T$ containing at least a component {\tt thy}
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   248
for the new theory and components for each of the rules.  The structure also
332
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   249
contains the definitions of the {\tt ML} section, if present.  The file
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   250
{\tt.{\it T}.thy.ML} is then deleted if {\tt delete_tmpfiles} is set to {\tt
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   251
true} and no errors occurred.
138
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   252
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   253
Finally the file {\it T}{\tt.ML} is read, if it exists.  Since the
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   254
structure $T$ is automatically open in this context, proof scripts may
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   255
(or even should) refer to its components by unqualified names.
332
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   256
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   257
Some applications construct theories directly by calling \ML\ functions.  In
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   258
this situation there is no {\tt.thy} file, only an {\tt.ML} file.  The
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   259
{\tt.ML} file must declare an \ML\ structure having the theory's name and a
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   260
component {\tt thy} containing the new theory object.
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   261
Section~\ref{sec:pseudo-theories} below describes a way of linking such
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   262
theories to their parents.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   263
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   264
\begin{warn}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   265
  Temporary files are written to the current directory, so this must be
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   266
  writable.  Isabelle inherits the current directory from the operating
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   267
  system; you can change it within Isabelle by typing {\tt
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   268
  cd"$dir$"}\index{*cd}.
273
538db1a98ba3 *** empty log message ***
nipkow
parents: 185
diff changeset
   269
\end{warn}
138
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   270
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   271
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   272
\section{Reloading modified theories}\label{sec:reloading-theories}
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   273
\indexbold{theories!reloading}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   274
\begin{ttbox}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   275
update     : unit -> unit
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   276
unlink_thy : string -> unit
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   277
\end{ttbox}
332
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   278
Changing a theory on disk often makes it necessary to reload all theories
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   279
descended from it.  However, {\tt use_thy} reads only one theory, even if
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   280
some of the parent theories are out of date.  In this case you should call
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   281
{\tt update()}.
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   282
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   283
Isabelle keeps track of all loaded theories and their files.  If
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   284
\ttindex{use_thy} finds that the theory to be loaded has been read before,
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   285
it determines whether to reload the theory as follows.  First it looks for
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   286
the theory's files in their previous location.  If it finds them, it
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   287
compares their modification times to the internal data and stops if they
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   288
are equal.  If the files have been moved, {\tt use_thy} searches for them
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   289
as it would for a new theory.  After {\tt use_thy} reloads a theory, it
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   290
marks the children as out-of-date.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   291
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   292
\begin{ttdescription}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   293
\item[\ttindexbold{update}()]
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   294
  reloads all modified theories and their descendants in the correct order.
138
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   295
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   296
\item[\ttindexbold{unlink_thy} $thyname$]\indexbold{theories!removing}
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   297
  informs Isabelle that theory $thyname$ no longer exists.  If you delete the
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   298
  theory files for $thyname$ then you must execute {\tt unlink_thy};
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   299
  otherwise {\tt update} will complain about a missing file.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   300
\end{ttdescription}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   301
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   302
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   303
%FIXME remove
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   304
%\goodbreak
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   305
%\subsection{Important note for Poly/ML users}\index{Poly/{\ML} compiler}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   306
%The theory mechanism depends upon reference variables.  At the end of a
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   307
%Poly/\ML{} session, the contents of references are lost unless they are
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   308
%declared in the current database.  In particular, assignments to references
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   309
%of the {\tt Pure} database are lost, including all information about loaded
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   310
%theories. To avoid losing this information simply call
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   311
%\begin{ttbox}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   312
%init_thy_reader();
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   313
%\end{ttbox}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   314
%when building the new database.
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   315
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   316
332
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   317
\subsection{*Pseudo theories}\label{sec:pseudo-theories}
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   318
\indexbold{theories!pseudo}%
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   319
Any automatic reloading facility requires complete knowledge of all
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   320
dependencies.  Sometimes theories depend on objects created in \ML{} files
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   321
with no associated theory definition file.  These objects may be theories but
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   322
they could also be theorems, proof procedures, etc.
332
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   323
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   324
Unless such dependencies are documented, {\tt update} fails to reload these
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   325
\ML{} files and the system is left in a state where some objects, such as
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   326
theorems, still refer to old versions of theories.  This may lead to the
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   327
error
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   328
\begin{ttbox}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   329
Attempt to merge different versions of theories: \dots
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   330
\end{ttbox}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   331
Therefore there is a way to link theories and {\bf orphaned} \ML{} files ---
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   332
those not associated with a theory definition.
138
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   333
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   334
Let us assume we have an orphaned \ML{} file named {\tt orphan.ML} and a
332
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   335
theory~$B$ that depends on {\tt orphan.ML} --- for example, {\tt B.ML} uses
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   336
theorems proved in {\tt orphan.ML}.  Then {\tt B.thy} should
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   337
mention this dependency as follows:
138
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   338
\begin{ttbox}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   339
B = \(\ldots\) + "orphan" + \(\ldots\)
138
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   340
\end{ttbox}
1369
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   341
Quoted strings stand for theories which have to be loaded before the
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   342
current theory is read but which are not used in building the base of
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   343
theory~$B$. Whenever {\tt orphan} changes and is reloaded, Isabelle
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   344
knows that $B$ has to be updated, too.
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   345
1369
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   346
Note that it's necessary for {\tt orphan} to declare a special ML
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   347
object of type {\tt theory} which is present in all theories. This is
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   348
normally achieved by adding the file {\tt orphan.thy} to make {\tt
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   349
orphan} a {\bf pseudo theory}. A minimum version of {\tt orphan.thy}
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   350
would be
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   351
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   352
\begin{ttbox}
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   353
orphan = Pure
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   354
\end{ttbox}
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   355
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   356
which uses {\tt Pure} to make a dummy theory. Normally though the
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   357
orphaned file has its own dependencies.  If {\tt orphan.ML} depends on
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   358
theories or files $A@1$, \ldots, $A@n$, record this by creating the
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   359
pseudo theory in the following way:
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   360
\begin{ttbox}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   361
orphan = \(A@1\) + \(\ldots\) + \(A@n\)
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   362
\end{ttbox}
1369
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   363
The resulting theory ensures that {\tt update} reloads {\tt orphan}
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   364
whenever it reloads one of the $A@i$.
138
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   365
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   366
For an extensive example of how this technique can be used to link
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   367
lots of theory files and load them by just a few {\tt use_thy} calls
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   368
see the sources of one of the major object-logics (e.g.\ \ZF).
138
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   369
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   370
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   371
866
2d3d020eef11 added documentation of bind_thm, qed, qed_goal, get_thm, thms_of
clasohm
parents: 864
diff changeset
   372
\section{Basic operations on theories}\label{BasicOperationsOnTheories}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   373
\subsection{Extracting an axiom or theorem from a theory}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   374
\index{theories!axioms of}\index{axioms!extracting}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   375
\index{theories!theorems of}\index{theorems!extracting}
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   376
\begin{ttbox}
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   377
get_axiom : theory -> string -> thm
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   378
get_thm   : theory -> string -> thm
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   379
assume_ax : theory -> string -> thm
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   380
\end{ttbox}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   381
\begin{ttdescription}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   382
\item[\ttindexbold{get_axiom} $thy$ $name$]
866
2d3d020eef11 added documentation of bind_thm, qed, qed_goal, get_thm, thms_of
clasohm
parents: 864
diff changeset
   383
  returns an axiom with the given $name$ from $thy$, raising exception
2d3d020eef11 added documentation of bind_thm, qed, qed_goal, get_thm, thms_of
clasohm
parents: 864
diff changeset
   384
  \xdx{THEORY} if none exists.  Merging theories can cause several axioms
2d3d020eef11 added documentation of bind_thm, qed, qed_goal, get_thm, thms_of
clasohm
parents: 864
diff changeset
   385
  to have the same name; {\tt get_axiom} returns an arbitrary one.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   386
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   387
\item[\ttindexbold{get_thm} $thy$ $name$]
866
2d3d020eef11 added documentation of bind_thm, qed, qed_goal, get_thm, thms_of
clasohm
parents: 864
diff changeset
   388
  is analogous to {\tt get_axiom}, but looks for a stored theorem. Like
2d3d020eef11 added documentation of bind_thm, qed, qed_goal, get_thm, thms_of
clasohm
parents: 864
diff changeset
   389
  {\tt get_axiom} it searches all parents of a theory if the theorem
2d3d020eef11 added documentation of bind_thm, qed, qed_goal, get_thm, thms_of
clasohm
parents: 864
diff changeset
   390
  is not associated with $thy$.
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   391
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   392
\item[\ttindexbold{assume_ax} $thy$ $formula$]
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   393
  reads the {\it formula} using the syntax of $thy$, following the same
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   394
  conventions as axioms in a theory definition.  You can thus pretend that
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   395
  {\it formula} is an axiom and use the resulting theorem like an axiom.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   396
  Actually {\tt assume_ax} returns an assumption;  \ttindex{result}
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   397
  complains about additional assumptions, but \ttindex{uresult} does not.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   398
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   399
For example, if {\it formula} is
332
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   400
\hbox{\tt a=b ==> b=a} then the resulting theorem has the form
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   401
\hbox{\verb'?a=?b ==> ?b=?a  [!!a b. a=b ==> b=a]'}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   402
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   403
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   404
\subsection{*Building a theory}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   405
\label{BuildingATheory}
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   406
\index{theories!constructing|bold}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   407
\begin{ttbox}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   408
Pure.thy       : theory
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   409
CPure.thy      : theory
332
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   410
merge_theories : theory * theory -> theory
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   411
\end{ttbox}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   412
\begin{description}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   413
\item[\ttindexbold{Pure.thy}, \ttindexbold{CPure.thy}] contain the
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   414
  syntax and signature of the meta-logic.  There are no axioms:
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   415
  meta-level inferences are carried out by \ML\ functions. The two
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   416
  \Pure s just differ in their concrete syntax of function
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   417
  application: $t(u@1, \ldots, u@n)$ vs.\ $t\,u@1,\ldots\,u@n$.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   418
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   419
\item[\ttindexbold{merge_theories} ($thy@1$, $thy@2$)] merges the two
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   420
  theories $thy@1$ and $thy@2$.  The resulting theory contains all of the
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   421
  syntax, signature and axioms of the constituent theories. Merging theories
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   422
  that contain different identification stamps of the same name fails with
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   423
  the following message
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   424
\begin{ttbox}
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   425
Attempt to merge different versions of theories: "\(T@1\)", \(\ldots\), "\(T@n\)"
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   426
\end{ttbox}
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   427
  This error may especially occur when a theory is redeclared --- say to
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   428
  change an incorrect axiom --- and bindings to old versions persist.
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   429
  Isabelle ensures that old and new theories of the same name are not
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   430
  involved in a proof.
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   431
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   432
%% FIXME
478
838bd766d536 added init_thy_reader and removed extend_theory
nipkow
parents: 332
diff changeset
   433
%\item [\ttindexbold{extend_theory} $thy$ {\tt"}$T${\tt"} $\cdots$] extends
838bd766d536 added init_thy_reader and removed extend_theory
nipkow
parents: 332
diff changeset
   434
%  the theory $thy$ with new types, constants, etc.  $T$ identifies the theory
838bd766d536 added init_thy_reader and removed extend_theory
nipkow
parents: 332
diff changeset
   435
%  internally.  When a theory is redeclared, say to change an incorrect axiom,
838bd766d536 added init_thy_reader and removed extend_theory
nipkow
parents: 332
diff changeset
   436
%  bindings to the old axiom may persist.  Isabelle ensures that the old and
838bd766d536 added init_thy_reader and removed extend_theory
nipkow
parents: 332
diff changeset
   437
%  new theories are not involved in the same proof.  Attempting to combine
838bd766d536 added init_thy_reader and removed extend_theory
nipkow
parents: 332
diff changeset
   438
%  different theories having the same name $T$ yields the fatal error
838bd766d536 added init_thy_reader and removed extend_theory
nipkow
parents: 332
diff changeset
   439
%extend_theory  : theory -> string -> \(\cdots\) -> theory
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   440
%\begin{ttbox}
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   441
%Attempt to merge different versions of theory: \(T\)
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   442
%\end{ttbox}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   443
\end{description}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   444
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   445
%% FIXME
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   446
%\item [\ttindexbold{extend_theory} $thy$ {\tt"}$T${\tt"}
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   447
%      ($classes$, $default$, $types$, $arities$, $consts$, $sextopt$) $rules$]
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   448
%\hfill\break   %%% include if line is just too short
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   449
%is the \ML{} equivalent of the following theory definition:
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   450
%\begin{ttbox}
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   451
%\(T\) = \(thy\) +
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   452
%classes \(c\) < \(c@1\),\(\dots\),\(c@m\)
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   453
%        \dots
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   454
%default {\(d@1,\dots,d@r\)}
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   455
%types   \(tycon@1\),\dots,\(tycon@i\) \(n\)
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   456
%        \dots
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   457
%arities \(tycon@1'\),\dots,\(tycon@j'\) :: (\(s@1\),\dots,\(s@n\))\(c\)
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   458
%        \dots
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   459
%consts  \(b@1\),\dots,\(b@k\) :: \(\tau\)
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   460
%        \dots
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   461
%rules   \(name\) \(rule\)
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   462
%        \dots
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   463
%end
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   464
%\end{ttbox}
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   465
%where
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   466
%\begin{tabular}[t]{l@{~=~}l}
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   467
%$classes$ & \tt[("$c$",["$c@1$",\dots,"$c@m$"]),\dots] \\
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   468
%$default$ & \tt["$d@1$",\dots,"$d@r$"]\\
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   469
%$types$   & \tt[([$tycon@1$,\dots,$tycon@i$], $n$),\dots] \\
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   470
%$arities$ & \tt[([$tycon'@1$,\dots,$tycon'@j$], ([$s@1$,\dots,$s@n$],$c$)),\dots]
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   471
%\\
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   472
%$consts$  & \tt[([$b@1$,\dots,$b@k$],$\tau$),\dots] \\
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   473
%$rules$   & \tt[("$name$",$rule$),\dots]
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   474
%\end{tabular}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   475
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   476
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   477
\subsection{Inspecting a theory}\label{sec:inspct-thy}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   478
\index{theories!inspecting|bold}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   479
\begin{ttbox}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   480
print_syntax  : theory -> unit
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   481
print_theory  : theory -> unit
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   482
axioms_of     : theory -> (string * thm) list
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   483
thms_of       : theory -> (string * thm) list
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   484
parents_of    : theory -> theory list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   485
sign_of       : theory -> Sign.sg
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   486
stamps_of_thy : theory -> string ref list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   487
\end{ttbox}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   488
These provide means of viewing a theory's components.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   489
\begin{ttdescription}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   490
\item[\ttindexbold{print_syntax} $thy$] prints the syntax of $thy$
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   491
  (grammar, macros, translation functions etc., see
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   492
  page~\pageref{pg:print_syn} for more details).
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   493
  
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   494
\item[\ttindexbold{print_theory} $thy$] prints the logical parts of
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   495
  $thy$, excluding the syntax.
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   496
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   497
\item[\ttindexbold{axioms_of} $thy$]
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   498
returns the additional axioms of the most recent extend node of~$thy$.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   499
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   500
\item[\ttindexbold{thms_of} $thy$]
866
2d3d020eef11 added documentation of bind_thm, qed, qed_goal, get_thm, thms_of
clasohm
parents: 864
diff changeset
   501
returns all theorems that are associated with $thy$.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   502
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   503
\item[\ttindexbold{parents_of} $thy$]
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   504
returns the direct ancestors of~$thy$.
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   505
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   506
\item[\ttindexbold{sign_of} $thy$]
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   507
returns the signature associated with~$thy$.  It is useful with functions
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   508
like {\tt read_instantiate_sg}, which take a signature as an argument.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   509
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   510
\item[\ttindexbold{stamps_of_thy} $thy$]\index{signatures}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   511
returns the identification \rmindex{stamps} of the signature associated
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   512
with~$thy$.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   513
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   514
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   515
%FIXME move to sysman!
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   516
%\section{Generating HTML documents}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   517
%\index{HTML|bold} 
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   518
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   519
%Isabelle is able to make HTML documents that show a theory's
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   520
%definition, the theorems proved in its ML file and the relationship
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   521
%with its ancestors and descendants. HTML stands for Hypertext Markup
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   522
%Language and is used in the World Wide Web to represent text
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   523
%containing images and links to other documents. Web browsers like
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   524
%{\tt xmosaic} or {\tt netscape} are used to view these documents.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   525
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   526
%Besides the three HTML files that are made for every theory
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   527
%(definition and theorems, ancestors, descendants), Isabelle stores
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   528
%links to all theories in an index file. These indexes are themself
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   529
%linked with other indexes to represent the hierarchic structure of
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   530
%Isabelle's logics.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   531
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   532
%To make HTML files for logics that are part of the Isabelle
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   533
%distribution, simply set the shell environment variable {\tt
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   534
%MAKE_HTML} before compiling a logic. This works for single logics as
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   535
%well as for the shell script {\tt make-all} (see
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   536
%\ref{sec:shell-scripts}). To make HTML files for {\tt FOL} using a
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   537
%{\tt csh} style shell, the following commands can be used:
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   538
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   539
%\begin{ttbox}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   540
%cd FOL
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   541
%setenv MAKE_HTML
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   542
%make
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   543
%\end{ttbox}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   544
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   545
%The databases made this way do not differ from the ones made with an
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   546
%unset {\tt MAKE_HTML}; in particular no HTML files are written if the
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   547
%database is used to manually load a theory.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   548
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   549
%As you will see below, the HTML generation is controlled by a boolean
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   550
%reference variable. If you want to make databases which define this
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   551
%variable's value as {\tt true} and where therefore HTML files are
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   552
%written each time {\tt use_thy} is invoked, you have to set {\tt
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   553
%MAKE_HTML} to ``{\tt true}'':
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   554
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   555
%\begin{ttbox}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   556
%cd FOL
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   557
%setenv MAKE_HTML true
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   558
%make
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   559
%\end{ttbox}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   560
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   561
%All theories loaded from within the {\tt FOL} database and all
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   562
%databases derived from it will now cause HTML files to be written.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   563
%This behaviour can be changed by assigning a value of {\tt false} to
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   564
%the boolean reference variable {\tt make_html}. Be careful when making
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   565
%such databases publicly available since it means that your users will
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   566
%generate HTML files though they might not intend to do so.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   567
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   568
%As some of Isabelle's logics are based on others (e.g. {\tt ZF} on
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   569
%{\tt FOL}) and because the HTML files list a theory's ancestors, you
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   570
%should not make HTML files for a logic if the HTML files for the base
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   571
%logic do not exist. Otherwise some of the hypertext links might point
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   572
%to non-existing documents.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   573
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   574
%The entry point to all logics is the {\tt index.html} file located in
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   575
%Isabelle's main directory. You can also access a HTML version of the
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   576
%distribution package at
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   577
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   578
%\begin{ttbox}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   579
%http://www4.informatik.tu-muenchen.de/~nipkow/isabelle/
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   580
%\end{ttbox}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   581
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   582
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   583
%\subsection*{Manual HTML generation}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   584
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   585
%To manually control the generation of HTML files the following
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   586
%commands and reference variables are used:
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   587
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   588
%\begin{ttbox}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   589
%init_html   : unit -> unit
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   590
%make_html   : bool ref
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   591
%finish_html : unit -> unit
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   592
%\end{ttbox}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   593
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   594
%\begin{ttdescription}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   595
%\item[\ttindexbold{init_html}]
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   596
%activates the HTML facility. It stores the current working directory
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   597
%as the place where the {\tt index.html} file for all theories loaded
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   598
%afterwards will be stored.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   599
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   600
%\item[\ttindexbold{make_html}]
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   601
%is a boolean reference variable read by {\tt use_thy} and other
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   602
%functions to decide whether HTML files should be made. After you have
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   603
%used {\tt init_html} you can manually change {\tt make_html}'s value
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   604
%to temporarily disable HTML generation.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   605
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   606
%\item[\ttindexbold{finish_html}]
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   607
%has to be called after all theories have been read that should be
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   608
%listed in the current {\tt index.html} file. It reads a temporary
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   609
%file with information about the theories read since the last use of
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   610
%{\tt init_html} and makes the {\tt index.html} file. If {\tt
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   611
%make_html} is {\tt false} nothing is done.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   612
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   613
%The indexes made by this function also contain a link to the {\tt
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   614
%README} file if there exists one in the directory where the index is
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   615
%stored. If there's a {\tt README.html} file it is used instead of
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   616
%{\tt README}.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   617
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   618
%\end{ttdescription}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   619
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   620
%The above functions could be used in the following way:
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   621
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   622
%\begin{ttbox}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   623
%init_html();
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   624
%{\out Setting path for index.html to "/home/clasohm/isabelle/HOL"}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   625
%use_thy "List";
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   626
%\dots
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   627
%finish_html();
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   628
%\end{ttbox}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   629
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   630
%Please note that HTML files are made only for those theories that are
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   631
%read while {\tt make_html} is {\tt true}. These files may contain
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   632
%links to theories that were read with a {\tt false} {\tt make_html}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   633
%and therefore point to non-existing files.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   634
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   635
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   636
%\subsection*{Extending or adding a logic}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   637
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   638
%If you add a new subdirectory to Isabelle's logics (or add a completly
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   639
%new logic), you would have to call {\tt init_html} at the start of every
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   640
%directory's {\tt ROOT.ML} file and {\tt finish_html} at the end of
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   641
%it. This is automatically done if you use
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   642
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   643
%\begin{ttbox}\index{use_dir}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   644
%use_dir : string -> unit
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   645
%\end{ttbox}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   646
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   647
%This function takes a path as its parameter, changes the working
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   648
%directory, calls {\tt init_html} if {\tt make_html} is {\tt true},
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   649
%executes {\tt ROOT.ML}, and calls {\tt finish_html}. The {\tt
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   650
%index.html} file written in this directory will be automatically
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   651
%linked to the first index found in the (recursively searched)
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   652
%superdirectories.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   653
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   654
%Instead of adding something like
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   655
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   656
%\begin{ttbox}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   657
%use"ex/ROOT.ML";
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   658
%\end{ttbox}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   659
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   660
%to the logic's makefile you have to use this:
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   661
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   662
%\begin{ttbox}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   663
%use_dir"ex";
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   664
%\end{ttbox}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   665
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   666
%Since {\tt use_dir} calls {\tt init_html} only if {\tt make_html} is
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   667
%{\tt true} the generation of HTML files depends on the value this
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   668
%reference variable has. It can either be inherited from the used \ML{}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   669
%database or set in the makefile before {\tt use_dir} is invoked,
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   670
%e.g. to set it's value according to the environment variable {\tt
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   671
%MAKE_HTML}.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   672
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   673
%The generated HTML files contain all theorems that were proved in the
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   674
%theory's \ML{} file with {\tt qed}, {\tt qed_goal} and {\tt qed_goalw},
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   675
%or stored with {\tt bind_thm} and {\tt store_thm}. Additionally there
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   676
%is a hypertext link to the whole \ML{} file.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   677
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   678
%You can add section headings to the list of theorems by using
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   679
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   680
%\begin{ttbox}\index{use_dir}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   681
%section: string -> unit
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   682
%\end{ttbox}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   683
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   684
%in a theory's ML file, which converts a plain string to a HTML
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   685
%heading and inserts it before the next theorem proved or stored with
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   686
%one of the above functions. If {\tt make_html} is {\tt false} nothing
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   687
%is done.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   688
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   689
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   690
%\subsection*{Using someone else's database}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   691
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   692
%To make them independent from their storage place, the HTML files only
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   693
%contain relative paths which are derived from absolute ones like the
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   694
%current working directory, {\tt gif_path} or {\tt base_path}. The
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   695
%latter two are reference variables which are initialized at the time
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   696
%when the {\tt Pure} database is made. Because you need write access
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   697
%for the current directory to make HTML files and therefore (probably)
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   698
%generate them in your home directory, the absolute {\tt base_path} is
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   699
%not correct if you use someone else's database or a database derived
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   700
%from it.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   701
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   702
%In that case you first should set {\tt base_path} to the value of {\em
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   703
%your} Isabelle main directory, i.e. the directory that contains the
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   704
%subdirectories where standard logics like {\tt FOL} and {\tt HOL} or
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   705
%your own logics are stored. If you do not do this, the generated HTML
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   706
%files will still be usable but may contain incomplete titles and lack
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   707
%some hypertext links.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   708
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   709
%It's also a good idea to set {\tt gif_path} which points to the
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   710
%directory containing two GIF images used in the HTML
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   711
%documents. Normally this is the {\tt Tools} subdirectory of Isabelle's
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   712
%main directory. While its value in general is still valid, your HTML
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   713
%files would depend on files not owned by you. This prevents you from
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   714
%changing the location of the HTML files (as they contain relative
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   715
%paths) and also causes trouble if the database's maker (re)moves the
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   716
%GIFs.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   717
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   718
%Here's what you should do before invoking {\tt init_html} using
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   719
%someone else's \ML{} database:
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   720
%
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   721
%\begin{ttbox}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   722
%base_path := "/home/smith/isabelle";
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   723
%gif_path := "/home/smith/isabelle/Tools";
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   724
%init_html();
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   725
%\dots
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   726
%\end{ttbox}
1369
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   727
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   728
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   729
\section{Terms}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   730
\index{terms|bold}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   731
Terms belong to the \ML\ type \mltydx{term}, which is a concrete datatype
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   732
with six constructors:
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   733
\begin{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   734
type indexname = string * int;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   735
infix 9 $;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   736
datatype term = Const of string * typ
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   737
              | Free  of string * typ
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   738
              | Var   of indexname * typ
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   739
              | Bound of int
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   740
              | Abs   of string * typ * term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   741
              | op $  of term * term;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   742
\end{ttbox}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   743
\begin{ttdescription}
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   744
\item[\ttindexbold{Const}($a$, $T$)] \index{constants|bold}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   745
  is the {\bf constant} with name~$a$ and type~$T$.  Constants include
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   746
  connectives like $\land$ and $\forall$ as well as constants like~0
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   747
  and~$Suc$.  Other constants may be required to define a logic's concrete
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   748
  syntax.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   749
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   750
\item[\ttindexbold{Free}($a$, $T$)] \index{variables!free|bold}
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   751
  is the {\bf free variable} with name~$a$ and type~$T$.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   752
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   753
\item[\ttindexbold{Var}($v$, $T$)] \index{unknowns|bold}
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   754
  is the {\bf scheme variable} with indexname~$v$ and type~$T$.  An
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   755
  \mltydx{indexname} is a string paired with a non-negative index, or
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   756
  subscript; a term's scheme variables can be systematically renamed by
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   757
  incrementing their subscripts.  Scheme variables are essentially free
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   758
  variables, but may be instantiated during unification.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   759
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   760
\item[\ttindexbold{Bound} $i$] \index{variables!bound|bold}
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   761
  is the {\bf bound variable} with de Bruijn index~$i$, which counts the
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   762
  number of lambdas, starting from zero, between a variable's occurrence
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   763
  and its binding.  The representation prevents capture of variables.  For
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   764
  more information see de Bruijn \cite{debruijn72} or
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   765
  Paulson~\cite[page~336]{paulson91}.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   766
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   767
\item[\ttindexbold{Abs}($a$, $T$, $u$)]
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   768
  \index{lambda abs@$\lambda$-abstractions|bold}
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   769
  is the $\lambda$-{\bf abstraction} with body~$u$, and whose bound
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   770
  variable has name~$a$ and type~$T$.  The name is used only for parsing
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   771
  and printing; it has no logical significance.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   772
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   773
\item[$t$ \$ $u$] \index{$@{\tt\$}|bold} \index{function applications|bold}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   774
is the {\bf application} of~$t$ to~$u$.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   775
\end{ttdescription}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   776
Application is written as an infix operator to aid readability.
332
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   777
Here is an \ML\ pattern to recognize \FOL{} formulae of
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   778
the form~$A\imp B$, binding the subformulae to~$A$ and~$B$:
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   779
\begin{ttbox}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   780
Const("Trueprop",_) $ (Const("op -->",_) $ A $ B)
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   781
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   782
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   783
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   784
\section{Variable binding}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   785
\begin{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   786
loose_bnos     : term -> int list
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   787
incr_boundvars : int -> term -> term
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   788
abstract_over  : term*term -> term
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   789
variant_abs    : string * typ * term -> string * term
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   790
aconv          : term*term -> bool\hfill{\bf infix}
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   791
\end{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   792
These functions are all concerned with the de Bruijn representation of
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   793
bound variables.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   794
\begin{ttdescription}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   795
\item[\ttindexbold{loose_bnos} $t$]
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   796
  returns the list of all dangling bound variable references.  In
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   797
  particular, {\tt Bound~0} is loose unless it is enclosed in an
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   798
  abstraction.  Similarly {\tt Bound~1} is loose unless it is enclosed in
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   799
  at least two abstractions; if enclosed in just one, the list will contain
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   800
  the number 0.  A well-formed term does not contain any loose variables.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   801
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   802
\item[\ttindexbold{incr_boundvars} $j$]
332
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   803
  increases a term's dangling bound variables by the offset~$j$.  This is
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   804
  required when moving a subterm into a context where it is enclosed by a
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   805
  different number of abstractions.  Bound variables with a matching
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   806
  abstraction are unaffected.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   807
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   808
\item[\ttindexbold{abstract_over} $(v,t)$]
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   809
  forms the abstraction of~$t$ over~$v$, which may be any well-formed term.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   810
  It replaces every occurrence of \(v\) by a {\tt Bound} variable with the
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   811
  correct index.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   812
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   813
\item[\ttindexbold{variant_abs} $(a,T,u)$]
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   814
  substitutes into $u$, which should be the body of an abstraction.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   815
  It replaces each occurrence of the outermost bound variable by a free
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   816
  variable.  The free variable has type~$T$ and its name is a variant
332
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   817
  of~$a$ chosen to be distinct from all constants and from all variables
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   818
  free in~$u$.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   819
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   820
\item[$t$ \ttindexbold{aconv} $u$]
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   821
  tests whether terms~$t$ and~$u$ are \(\alpha\)-convertible: identical up
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   822
  to renaming of bound variables.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   823
\begin{itemize}
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   824
  \item
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   825
    Two constants, {\tt Free}s, or {\tt Var}s are \(\alpha\)-convertible
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   826
    if their names and types are equal.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   827
    (Variables having the same name but different types are thus distinct.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   828
    This confusing situation should be avoided!)
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   829
  \item
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   830
    Two bound variables are \(\alpha\)-convertible
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   831
    if they have the same number.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   832
  \item
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   833
    Two abstractions are \(\alpha\)-convertible
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   834
    if their bodies are, and their bound variables have the same type.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   835
  \item
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   836
    Two applications are \(\alpha\)-convertible
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   837
    if the corresponding subterms are.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   838
\end{itemize}
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   839
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   840
\end{ttdescription}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   841
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   842
\section{Certified terms}\index{terms!certified|bold}\index{signatures}
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   843
A term $t$ can be {\bf certified} under a signature to ensure that every type
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   844
in~$t$ is well-formed and every constant in~$t$ is a type instance of a
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   845
constant declared in the signature.  The term must be well-typed and its use
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   846
of bound variables must be well-formed.  Meta-rules such as {\tt forall_elim}
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   847
take certified terms as arguments.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   848
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   849
Certified terms belong to the abstract type \mltydx{cterm}.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   850
Elements of the type can only be created through the certification process.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   851
In case of error, Isabelle raises exception~\ttindex{TERM}\@.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   852
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   853
\subsection{Printing terms}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   854
\index{terms!printing of}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   855
\begin{ttbox}
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   856
     string_of_cterm :           cterm -> string
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   857
Sign.string_of_term  : Sign.sg -> term -> string
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   858
\end{ttbox}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   859
\begin{ttdescription}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   860
\item[\ttindexbold{string_of_cterm} $ct$]
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   861
displays $ct$ as a string.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   862
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   863
\item[\ttindexbold{Sign.string_of_term} $sign$ $t$]
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   864
displays $t$ as a string, using the syntax of~$sign$.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   865
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   866
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   867
\subsection{Making and inspecting certified terms}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   868
\begin{ttbox}
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   869
cterm_of   : Sign.sg -> term -> cterm
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   870
read_cterm : Sign.sg -> string * typ -> cterm
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   871
cert_axm   : Sign.sg -> string * term -> string * term
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   872
read_axm   : Sign.sg -> string * string -> string * term
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   873
rep_cterm  : cterm -> {\ttlbrace}T:typ, t:term, sign:Sign.sg, maxidx:int\ttrbrace
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   874
\end{ttbox}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   875
\begin{ttdescription}
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   876
\item[\ttindexbold{cterm_of} $sign$ $t$] \index{signatures}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   877
certifies $t$ with respect to signature~$sign$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   878
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   879
\item[\ttindexbold{read_cterm} $sign$ ($s$, $T$)]
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   880
reads the string~$s$ using the syntax of~$sign$, creating a certified term.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   881
The term is checked to have type~$T$; this type also tells the parser what
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   882
kind of phrase to parse.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   883
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   884
\item[\ttindexbold{cert_axm} $sign$ ($name$, $t$)]
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   885
certifies $t$ with respect to $sign$ as a meta-proposition and converts all
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   886
exceptions to an error, including the final message
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   887
\begin{ttbox}
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   888
The error(s) above occurred in axiom "\(name\)"
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   889
\end{ttbox}
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   890
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   891
\item[\ttindexbold{read_axm} $sign$ ($name$, $s$)]
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   892
similar to {\tt cert_axm}, but first reads the string $s$ using the syntax of
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   893
$sign$.
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   894
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   895
\item[\ttindexbold{rep_cterm} $ct$]
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   896
decomposes $ct$ as a record containing its type, the term itself, its
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   897
signature, and the maximum subscript of its unknowns.  The type and maximum
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   898
subscript are computed during certification.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   899
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   900
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   901
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   902
\section{Types}\index{types|bold}
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   903
Types belong to the \ML\ type \mltydx{typ}, which is a concrete datatype with
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   904
three constructor functions.  These correspond to type constructors, free
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   905
type variables and schematic type variables.  Types are classified by sorts,
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   906
which are lists of classes (representing an intersection).  A class is
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   907
represented by a string.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   908
\begin{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   909
type class = string;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   910
type sort  = class list;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   911
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   912
datatype typ = Type  of string * typ list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   913
             | TFree of string * sort
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   914
             | TVar  of indexname * sort;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   915
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   916
infixr 5 -->;
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   917
fun S --> T = Type ("fun", [S, T]);
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   918
\end{ttbox}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   919
\begin{ttdescription}
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   920
\item[\ttindexbold{Type}($a$, $Ts$)] \index{type constructors|bold}
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   921
  applies the {\bf type constructor} named~$a$ to the type operands~$Ts$.
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   922
  Type constructors include~\tydx{fun}, the binary function space
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   923
  constructor, as well as nullary type constructors such as~\tydx{prop}.
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   924
  Other type constructors may be introduced.  In expressions, but not in
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   925
  patterns, \hbox{\tt$S$-->$T$} is a convenient shorthand for function
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   926
  types.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   927
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   928
\item[\ttindexbold{TFree}($a$, $s$)] \index{type variables|bold}
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   929
  is the {\bf type variable} with name~$a$ and sort~$s$.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   930
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   931
\item[\ttindexbold{TVar}($v$, $s$)] \index{type unknowns|bold}
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   932
  is the {\bf type unknown} with indexname~$v$ and sort~$s$.
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   933
  Type unknowns are essentially free type variables, but may be
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   934
  instantiated during unification.
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   935
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   936
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   937
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   938
\section{Certified types}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   939
\index{types!certified|bold}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   940
Certified types, which are analogous to certified terms, have type
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   941
\ttindexbold{ctyp}.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   942
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   943
\subsection{Printing types}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   944
\index{types!printing of}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   945
\begin{ttbox}
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   946
     string_of_ctyp :           ctyp -> string
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   947
Sign.string_of_typ  : Sign.sg -> typ -> string
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   948
\end{ttbox}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   949
\begin{ttdescription}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   950
\item[\ttindexbold{string_of_ctyp} $cT$]
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   951
displays $cT$ as a string.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   952
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   953
\item[\ttindexbold{Sign.string_of_typ} $sign$ $T$]
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   954
displays $T$ as a string, using the syntax of~$sign$.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   955
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   956
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   957
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   958
\subsection{Making and inspecting certified types}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   959
\begin{ttbox}
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   960
ctyp_of  : Sign.sg -> typ -> ctyp
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   961
rep_ctyp : ctyp -> {\ttlbrace}T: typ, sign: Sign.sg\ttrbrace
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   962
\end{ttbox}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   963
\begin{ttdescription}
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   964
\item[\ttindexbold{ctyp_of} $sign$ $T$] \index{signatures}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   965
certifies $T$ with respect to signature~$sign$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   966
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   967
\item[\ttindexbold{rep_ctyp} $cT$]
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   968
decomposes $cT$ as a record containing the type itself and its signature.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   969
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   970
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   971
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   972
\section{Oracles: calling external reasoners }
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   973
\label{sec:oracles}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   974
\index{oracles|(}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   975
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   976
Oracles allow Isabelle to take advantage of external reasoners such as
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   977
arithmetic decision procedures, model checkers, fast tautology checkers or
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   978
computer algebra systems.  Invoked as an oracle, an external reasoner can
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   979
create arbitrary Isabelle theorems.  It is your responsibility to ensure that
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   980
the external reasoner is as trustworthy as your application requires.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   981
Isabelle's proof objects~(\S\ref{sec:proofObjects}) record how each theorem
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   982
depends upon oracle calls.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   983
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   984
\begin{ttbox}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   985
     invoke_oracle : theory * Sign.sg * exn -> thm
1880
78c4b3ddba6c Corrected typo regarding the type of set_oracle
paulson
parents: 1846
diff changeset
   986
     set_oracle    : (Sign.sg * exn -> term) -> theory -> theory
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   987
\end{ttbox}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   988
\begin{ttdescription}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   989
\item[\ttindexbold{invoke_oracle} ($thy$, $sign$, $exn$)] invokes the oracle
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   990
  of theory $thy$ passing the information contained in the exception value
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   991
  $exn$ and creating a theorem having signature $sign$.  Errors arise if $thy$
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   992
  does not have an oracle, if the oracle rejects its arguments or if its
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   993
  result is ill-typed.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   994
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   995
\item[\ttindexbold{set_oracle} $fn$ $thy$] sets the oracle of theory $thy$ to
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   996
  be $fn$.  It is seldom called explicitly, as there is syntax for oracles in
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   997
  theory files.  Any theory node can have at most one oracle.
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   998
\end{ttdescription}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   999
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1000
A curious feature of {\ML} exceptions is that they are ordinary constructors.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1001
The {\ML} type {\tt exn} is a datatype that can be extended at any time.  (See
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1002
my {\em {ML} for the Working Programmer}~\cite{paulson-ml2}, especially
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1003
page~136.)  The oracle mechanism takes advantage of this to allow an oracle to
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1004
take any information whatever.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1005
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1006
There must be some way of invoking the external reasoner from \ML, either
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1007
because it is coded in {\ML} or via an operating system interface.  Isabelle
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1008
expects the {\ML} function to take two arguments: a signature and an
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1009
exception.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1010
\begin{itemize}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1011
\item The signature will typically be that of a desendant of the theory
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1012
  declaring the oracle.  The oracle will use it to distinguish constants from
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1013
  variables, etc., and it will be attached to the generated theorems.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1014
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1015
\item The exception is used to pass arbitrary information to the oracle.  This
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1016
  information must contain a full description of the problem to be solved by
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1017
  the external reasoner, including any additional information that might be
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1018
  required.  The oracle may raise the exception to indicate that it cannot
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1019
  solve the specified problem.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1020
\end{itemize}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1021
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1022
A trivial example is provided on directory {\tt FOL/ex}.  This oracle
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1023
generates tautologies of the form $P\bimp\cdots\bimp P$, with an even number
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1024
of $P$s. 
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1025
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1026
File {\tt declIffOracle.ML} begins by declaring a new exception constructor
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1027
for the oracle the information it requires: here, just an integer.  It
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1028
contains some code (suppressed below) for creating the tautologies, and
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1029
finally declares the oracle function itself:
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1030
\begin{ttbox}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1031
exception IffOracleExn of int;
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1032
\(\vdots\)
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1033
fun mk_iff_oracle (sign, IffOracleExn n) = 
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1034
    if n>0 andalso n mod 2 = 0 
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1035
    then Trueprop $ mk_iff n
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1036
    else raise IffOracleExn n;
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1037
\end{ttbox}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1038
Observe the function two arguments, the signature {\tt sign} and the exception
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1039
given as a pattern.  The function checks its argument for validity.  If $n$ is
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1040
positive and even then it creates a tautology containing $n$ occurrences
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1041
of~$P$.  Otherwise it signals error by raising its own exception.  Errors may
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1042
be signalled by other means, such as returning the theorem {\tt True}.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1043
Please ensure that the oracle's result is correctly typed; Isabelle will
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1044
reject ill-typed theorems by raising a cryptic exception at top level.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1045
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1046
The theory file {\tt IffOracle.thy} packages up the function above as an
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1047
oracle.  The first line indicates that the new theory depends upon the file
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1048
{\tt declIffOracle.ML} (which declares the {\ML} code) as well as on \FOL.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1049
The second line informs Isabelle that this theory has an oracle given by the
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1050
function {\tt mk_iff_oracle}.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1051
\begin{ttbox}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1052
IffOracle = "declIffOracle" + FOL +
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1053
oracle mk_iff_oracle
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1054
end
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1055
\end{ttbox}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1056
Because a theory can have at most one oracle, the theory itself serves to
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1057
identify the oracle.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1058
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1059
Here are some examples of invoking the oracle.  An argument of 10 is allowed,
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1060
but one of 5 is forbidden:
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1061
\begin{ttbox}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1062
invoke_oracle (IffOracle.thy, sign_of IffOracle.thy, IffOracleExn 10);
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1063
{\out  "P <-> P <-> P <-> P <-> P <-> P <-> P <-> P <-> P <-> P" : thm}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1064
invoke_oracle (IffOracle.thy, sign_of IffOracle.thy, IffOracleExn 5); 
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1065
{\out Exception- IffOracleExn 5 raised}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1066
\end{ttbox}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1067
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
  1068
\index{oracles|)}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
  1069
\index{theories|)}