doc-src/Ref/theories.tex
author wenzelm
Mon, 03 May 1999 18:35:48 +0200
changeset 6568 b38bc78d9a9d
parent 5390 0c9e6d860485
child 6569 66c941ea1f01
permissions -rw-r--r--
theory loader stuff updated and improved;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3201
7c3cbf675e85 removed garbage;
wenzelm
parents: 3108
diff changeset
     1
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     2
%% $Id$
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
     3
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     4
\chapter{Theories, Terms and Types} \label{theories}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     5
\index{theories|(}\index{signatures|bold}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
     6
\index{reading!axioms|see{{\tt assume_ax}}} Theories organize the
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
     7
syntax, declarations and axioms of a mathematical development.  They
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
     8
are built, starting from the {\Pure} or {\CPure} theory, by extending
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
     9
and merging existing theories.  They have the \ML\ type
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    10
\mltydx{theory}.  Theory operations signal errors by raising exception
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    11
\xdx{THEORY}, returning a message and a list of theories.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    12
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    13
Signatures, which contain information about sorts, types, constants and
332
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
    14
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
    15
signature carries a unique list of \bfindex{stamps}, which are \ML\
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    16
references to strings.  The strings serve as human-readable names; the
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    17
references serve as unique identifiers.  Each primitive signature has a
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    18
single stamp.  When two signatures are merged, their lists of stamps are
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    19
also merged.  Every theory carries a unique signature.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    20
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    21
Terms and types are the underlying representation of logical syntax.  Their
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
    22
\ML\ definitions are irrelevant to naive Isabelle users.  Programmers who
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
    23
wish to extend Isabelle may need to know such details, say to code a tactic
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
    24
that looks for subgoals of a particular form.  Terms and types may be
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    25
`certified' to be well-formed with respect to a given signature.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    26
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    27
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    28
\section{Defining theories}\label{sec:ref-defining-theories}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    29
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    30
Theories are usually defined using theory definition files (which have a name
3485
f27a30a18a17 Now there are TWO spaces after each full stop, so that the Emacs sentence
paulson
parents: 3201
diff changeset
    31
suffix {\tt .thy}).  There is also a low level interface provided by certain
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    32
\ML{} functions (see \S\ref{BuildingATheory}).
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    33
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
    34
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
    35
\begin{description}
6568
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
    36
\item[{\it theoryDef}] is the full definition.  The new theory is called $id$.
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
    37
  It is the union of the named {\bf parent
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    38
    theories}\indexbold{theories!parent}, possibly extended with new
6568
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
    39
  components.  \thydx{Pure} and \thydx{CPure} are the basic theories, which
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
    40
  contain only the meta-logic.  They differ just in their concrete syntax for
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
    41
  function applications.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    42
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    43
\item[$classes$]
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    44
  is a series of class declarations.  Declaring {\tt$id$ < $id@1$ \dots\
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    45
    $id@n$} makes $id$ a subclass of the existing classes $id@1\dots
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    46
  id@n$.  This rules out cyclic class structures.  Isabelle automatically
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    47
  computes the transitive closure of subclass hierarchies; it is not
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    48
  necessary to declare {\tt c < e} in addition to {\tt c < d} and {\tt d <
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    49
    e}.
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    50
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    51
\item[$default$]
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    52
  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
    53
  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
    54
  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
    55
  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
    56
  intersection).
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    57
  
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    58
\item[$sort$] is a finite set of classes.  A single class $id$
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    59
  abbreviates the sort $\ttlbrace id\ttrbrace$.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    60
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    61
\item[$types$]
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    62
  is a series of type declarations.  Each declares a new type constructor
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    63
  or type synonym.  An $n$-place type constructor is specified by
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    64
  $(\alpha@1,\dots,\alpha@n)name$, where the type variables serve only to
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    65
  indicate the number~$n$.
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    66
332
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
    67
  A {\bf type synonym}\indexbold{type synonyms} is an abbreviation
1387
9bcad9c22fd4 removed quotes from syntax and consts sections
clasohm
parents: 1380
diff changeset
    68
  $(\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
    69
  be strings.
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    70
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    71
\item[$infix$]
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    72
  declares a type or constant to be an infix operator of priority $nat$
3485
f27a30a18a17 Now there are TWO spaces after each full stop, so that the Emacs sentence
paulson
parents: 3201
diff changeset
    73
  associating to the left ({\tt infixl}) or right ({\tt infixr}).  Only
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
    74
  2-place type constructors can have infix status; an example is {\tt
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    75
  ('a,'b)~"*"~(infixr~20)}, which may express binary product types.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    76
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    77
\item[$arities$] is a series of type arity declarations.  Each assigns
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    78
  arities to type constructors.  The $name$ must be an existing type
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    79
  constructor, which is given the additional arity $arity$.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    80
  
5369
8384e01b6cf8 added nonterminals, setup;
wenzelm
parents: 4597
diff changeset
    81
\item[$nonterminals$]\index{*nonterminal symbols} declares purely
8384e01b6cf8 added nonterminals, setup;
wenzelm
parents: 4597
diff changeset
    82
  syntactic types to be used as nonterminal symbols of the context
8384e01b6cf8 added nonterminals, setup;
wenzelm
parents: 4597
diff changeset
    83
  free grammar.
8384e01b6cf8 added nonterminals, setup;
wenzelm
parents: 4597
diff changeset
    84
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    85
\item[$consts$] is a series of constant declarations.  Each new
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    86
  constant $name$ is given the specified type.  The optional $mixfix$
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    87
  annotations may attach concrete syntax to the constant.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    88
  
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    89
\item[$syntax$] \index{*syntax section}\index{print mode} is a variant
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    90
  of $consts$ which adds just syntax without actually declaring
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    91
  logical constants.  This gives full control over a theory's context
3485
f27a30a18a17 Now there are TWO spaces after each full stop, so that the Emacs sentence
paulson
parents: 3201
diff changeset
    92
  free grammar.  The optional $mode$ specifies the print mode where the
f27a30a18a17 Now there are TWO spaces after each full stop, so that the Emacs sentence
paulson
parents: 3201
diff changeset
    93
  mixfix productions should be added.  If there is no \texttt{output}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    94
  option given, all productions are also added to the input syntax
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
    95
  (regardless of the print mode).
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    96
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    97
\item[$mixfix$] \index{mixfix declarations}
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
    98
  annotations can take three forms:
273
538db1a98ba3 *** empty log message ***
nipkow
parents: 185
diff changeset
    99
  \begin{itemize}
538db1a98ba3 *** empty log message ***
nipkow
parents: 185
diff changeset
   100
  \item A mixfix template given as a $string$ of the form
538db1a98ba3 *** empty log message ***
nipkow
parents: 185
diff changeset
   101
    {\tt"}\dots{\tt\_}\dots{\tt\_}\dots{\tt"} where the $i$-th underscore
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   102
    indicates the position where the $i$-th argument should go.  The list
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   103
    of numbers gives the priority of each argument.  The final number gives
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   104
    the priority of the whole construct.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   105
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   106
  \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
   107
    infix} status.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   108
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   109
  \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
   110
    binder} status.  The declaration {\tt binder} $\cal Q$ $p$ causes
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   111
  ${\cal Q}\,x.F(x)$ to be treated
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   112
  like $f(F)$, where $p$ is the priority.
273
538db1a98ba3 *** empty log message ***
nipkow
parents: 185
diff changeset
   113
  \end{itemize}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   114
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   115
\item[$trans$]
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   116
  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
   117
  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
   118
  ==}).
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   119
1650
a4ed2655b08c Added 'constdefs'
nipkow
parents: 1551
diff changeset
   120
\item[$rules$]
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   121
  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
   122
  given by the $string$.  Rule names must be distinct within any single
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   123
  theory.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   124
1905
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   125
\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
   126
  that every $string$ must be a definition (see below for details).
1650
a4ed2655b08c Added 'constdefs'
nipkow
parents: 1551
diff changeset
   127
a4ed2655b08c Added 'constdefs'
nipkow
parents: 1551
diff changeset
   128
\item[$constdefs$] combines the declaration of constants and their
3485
f27a30a18a17 Now there are TWO spaces after each full stop, so that the Emacs sentence
paulson
parents: 3201
diff changeset
   129
  definition.  The first $string$ is the type, the second the definition.
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   130
  
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   131
\item[$axclass$] \index{*axclass section} defines an
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   132
  \rmindex{axiomatic type class} as the intersection of existing
3485
f27a30a18a17 Now there are TWO spaces after each full stop, so that the Emacs sentence
paulson
parents: 3201
diff changeset
   133
  classes, with additional axioms holding.  Class axioms may not
f27a30a18a17 Now there are TWO spaces after each full stop, so that the Emacs sentence
paulson
parents: 3201
diff changeset
   134
  contain more than one type variable.  The class axioms (with implicit
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   135
  sort constraints added) are bound to the given names.  Furthermore a
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   136
  class introduction rule is generated, which is automatically
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   137
  employed by $instance$ to prove instantiations of this class.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   138
  
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   139
\item[$instance$] \index{*instance section} proves class inclusions or
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   140
  type arities at the logical level and then transfers these to the
3485
f27a30a18a17 Now there are TWO spaces after each full stop, so that the Emacs sentence
paulson
parents: 3201
diff changeset
   141
  type signature.  The instantiation is proven and checked properly.
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   142
  The user has to supply sufficient witness information: theorems
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   143
  ($longident$), axioms ($string$), or even arbitrary \ML{} tactic
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   144
  code $verbatim$.
1650
a4ed2655b08c Added 'constdefs'
nipkow
parents: 1551
diff changeset
   145
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   146
\item[$oracle$] links the theory to a trusted external reasoner.  It is
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   147
  allowed to create theorems, but each theorem carries a proof object
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   148
  describing the oracle invocation.  See \S\ref{sec:oracles} for details.
4543
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   149
  
5369
8384e01b6cf8 added nonterminals, setup;
wenzelm
parents: 4597
diff changeset
   150
\item[$local$, $global$] change the current name declaration mode.
4543
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   151
  Initially, theories start in $local$ mode, causing all names of
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   152
  types, constants, axioms etc.\ to be automatically qualified by the
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   153
  theory name.  Changing this to $global$ causes all names to be
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   154
  declared as short base names only.
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   155
  
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   156
  The $local$ and $global$ declarations act like switches, affecting
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   157
  all following theory sections until changed again explicitly.  Also
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   158
  note that the final state at the end of the theory will persist.  In
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   159
  particular, this determines how the names of theorems stored later
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   160
  on are handled.
5369
8384e01b6cf8 added nonterminals, setup;
wenzelm
parents: 4597
diff changeset
   161
  
8384e01b6cf8 added nonterminals, setup;
wenzelm
parents: 4597
diff changeset
   162
\item[$setup$]\index{*setup!theory} applies a list of ML functions to
8384e01b6cf8 added nonterminals, setup;
wenzelm
parents: 4597
diff changeset
   163
  the theory.  The argument should denote a value of type
8384e01b6cf8 added nonterminals, setup;
wenzelm
parents: 4597
diff changeset
   164
  \texttt{(theory -> theory) list}.  Typically, ML packages are
8384e01b6cf8 added nonterminals, setup;
wenzelm
parents: 4597
diff changeset
   165
  initialized in this way.
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   166
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   167
\item[$ml$] \index{*ML section}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   168
  consists of \ML\ code, typically for parse and print translation functions.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   169
\end{description}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   170
%
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   171
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
   172
declarations, translation rules and the {\tt ML} section in more detail.
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   173
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   174
1905
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   175
\subsection{Definitions}\indexbold{definitions}
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   176
3485
f27a30a18a17 Now there are TWO spaces after each full stop, so that the Emacs sentence
paulson
parents: 3201
diff changeset
   177
{\bf Definitions} are intended to express abbreviations.  The simplest
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   178
form of a definition is $f \equiv t$, where $f$ is a constant.
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   179
Isabelle also allows a derived forms where the arguments of~$f$ appear
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   180
on the left, abbreviating a string of $\lambda$-abstractions.
1905
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   181
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   182
Isabelle makes the following checks on definitions:
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   183
\begin{itemize}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   184
\item Arguments (on the left-hand side) must be distinct variables.
1905
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   185
\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
   186
  side. 
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   187
\item All type variables on the right-hand side must also appear on
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   188
  the left-hand side; this prohibits definitions such as {\tt
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   189
    (zero::nat) == length ([]::'a list)}.
1905
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   190
\item The definition must not be recursive.  Most object-logics provide
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   191
  definitional principles that can be used to express recursion safely.
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   192
\end{itemize}
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   193
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
   194
accidentally.  Misspellings, for instance, might result in additional
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   195
variables appearing on the right-hand side.  More elaborate checks could be
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   196
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
   197
81061bd61ad3 Added a new section on Definitions
paulson
parents: 1880
diff changeset
   198
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   199
\subsection{*Classes and arities}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   200
\index{classes!context conditions}\index{arities!context conditions}
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   201
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   202
In order to guarantee principal types~\cite{nipkow-prehofer},
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   203
arity declarations must obey two conditions:
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   204
\begin{itemize}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   205
\item There must not be any two declarations $ty :: (\vec{r})c$ and
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   206
  $ty :: (\vec{s})c$ with $\vec{r} \neq \vec{s}$.  For example, this
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   207
  excludes the following:
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   208
\begin{ttbox}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   209
arities
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   210
  foo :: ({\ttlbrace}logic{\ttrbrace}) logic
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   211
  foo :: ({\ttlbrace}{\ttrbrace})logic
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   212
\end{ttbox}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   213
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   214
\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
   215
  (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
   216
  for $i=1,\dots,n$.  The relationship $\preceq$, defined as
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   217
\[ 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
   218
expresses that the set of types represented by $s'$ is a subset of the
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   219
set of types represented by $s$.  Assuming $term \preceq logic$, the
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   220
following is forbidden:
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   221
\begin{ttbox}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   222
arities
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   223
  foo :: ({\ttlbrace}logic{\ttrbrace})logic
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   224
  foo :: ({\ttlbrace}{\ttrbrace})term
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   225
\end{ttbox}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   226
145
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   227
\end{itemize}
422197c5a078 added subsection 'Classes and types';
wenzelm
parents: 141
diff changeset
   228
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   229
6568
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   230
\section{The theory loader}\label{sec:more-theories}
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   231
\index{theories!reading}\index{files!reading}
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   232
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   233
Isabelle's theory loader manages dependencies of the internal graph of theory
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   234
nodes (the \emph{theory database}) and the external view of the file system.
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   235
See \S\ref{sec:intro-theories} for its most basic commands, such as
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   236
\texttt{use_thy}.  There are a few more operations available.
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   237
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   238
\begin{ttbox}
6568
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   239
use_thy_only    : string -> unit
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   240
update_thy      : string -> unit
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   241
touch_thy       : string -> unit
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   242
delete_tmpfiles : bool ref \hfill{\bf initially true}
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   243
\end{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   244
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   245
\begin{ttdescription}
6568
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   246
\item[\ttindexbold{use_thy_only} $name$;] is similar to \texttt{use_thy}, but
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   247
  processes the actual theory file $name$\texttt{.thy} only, ignoring
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   248
  $name$\texttt{.ML}.  This might be useful in replaying proof scripts by hand
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   249
  from the very beginning, starting with the fresh theory.
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   250
  
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   251
\item[\ttindexbold{update_thy} $name$;] is similar to \texttt{use_thy}, but
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   252
  ensures that theory $name$ is fully up-to-date with respect to the file
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   253
  system --- apart from $name$ itself its parents may be reloaded as well.
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   254
  
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   255
\item[\ttindexbold{touch_thy} $name$;] marks theory node $name$ of the
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   256
  internal graph as outdated.  While the theory remains usable, subsequent
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   257
  operations such as \texttt{use_thy} may cause a reload.
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   258
  
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   259
\item[reset \ttindexbold{delete_tmpfiles};] processing theory files usually
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   260
  involves temporary {\ML} files to be created.  By default, these are deleted
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   261
  afterwards.  Resetting the \texttt{delete_tmpfiles} flag inhibits this,
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   262
  leaving the generated code for debugging purposes.  The basic location for
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   263
  temporary files is determined by the \texttt{ISABELLE_TMP} environment
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   264
  variable, which is private to the running Isabelle process (it may be
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   265
  retrieved by \ttindex{getenv} from {\ML}).
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   266
\end{ttdescription}
138
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   267
6568
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   268
\medskip Theory and {\ML} files are located by skimming through the
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   269
directories listed in Isabelle's internal load path, which merely contains the
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   270
current directory ``\texttt{.}'' by default.  The load path may be accessed by
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   271
the following operations.
332
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   272
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   273
\begin{ttbox}
6568
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   274
show_path: unit -> string list
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   275
add_path: string -> unit
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   276
del_path: string -> unit
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   277
reset_path: unit -> unit
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   278
\end{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   279
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   280
\begin{ttdescription}
6568
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   281
\item[\ttindexbold{show_path}();] displays the load path components in
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   282
  canonical string representation, which is always according to Unix rules.
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   283
  
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   284
\item[\ttindexbold{add_path} $dir$;] adds component $dir$ to the beginning of
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   285
  the load path.
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   286
  
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   287
\item[\ttindexbold{del_path} $dir$;] removes any occurrences of component
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   288
  $dir$ from the load path.
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   289
  
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   290
\item[\ttindexbold{reset_path}();] resets the load path to ``\texttt{.}''
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   291
  (current directory) only.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   292
\end{ttdescription}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   293
6568
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   294
In operations referring indirectly to some file, such as
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   295
\texttt{use_thy}~$name$, the argument may be prefixed by some directory that
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   296
will be used as temporary load path.  Note that, depending on which parts of
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   297
the ancestry of $name$ are already loaded, the dynamic change of paths might
b38bc78d9a9d theory loader stuff updated and improved;
wenzelm
parents: 5390
diff changeset
   298
be hard to predict.  Use this feature with care only.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   299
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   300
866
2d3d020eef11 added documentation of bind_thm, qed, qed_goal, get_thm, thms_of
clasohm
parents: 864
diff changeset
   301
\section{Basic operations on theories}\label{BasicOperationsOnTheories}
4384
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   302
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   303
\subsection{*Theory inclusion}
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   304
\begin{ttbox}
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   305
subthy      : theory * theory -> bool
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   306
eq_thy      : theory * theory -> bool
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   307
transfer    : theory -> thm -> thm
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   308
transfer_sg : Sign.sg -> thm -> thm
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   309
\end{ttbox}
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   310
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   311
Inclusion and equality of theories is determined by unique
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   312
identification stamps that are created when declaring new components.
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   313
Theorems contain a reference to the theory (actually to its signature)
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   314
they have been derived in.  Transferring theorems to super theories
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   315
has no logical significance, but may affect some operations in subtle
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   316
ways (e.g.\ implicit merges of signatures when applying rules, or
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   317
pretty printing of theorems).
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   318
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   319
\begin{ttdescription}
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   320
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   321
\item[\ttindexbold{subthy} ($thy@1$, $thy@2$)] determines if $thy@1$
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   322
  is included in $thy@2$ wrt.\ identification stamps.
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   323
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   324
\item[\ttindexbold{eq_thy} ($thy@1$, $thy@2$)] determines if $thy@1$
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   325
  is exactly the same as $thy@2$.
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   326
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   327
\item[\ttindexbold{transfer} $thy$ $thm$] transfers theorem $thm$ to
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   328
  theory $thy$, provided the latter includes the theory of $thm$.
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   329
  
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   330
\item[\ttindexbold{transfer_sg} $sign$ $thm$] is similar to
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   331
  \texttt{transfer}, but identifies the super theory via its
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   332
  signature.
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   333
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   334
\end{ttdescription}
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   335
429cba89b4c8 \subsection{*Theory inclusion};
wenzelm
parents: 4374
diff changeset
   336
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   337
\subsection{*Building a theory}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   338
\label{BuildingATheory}
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   339
\index{theories!constructing|bold}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   340
\begin{ttbox}
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   341
ProtoPure.thy  : theory
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   342
Pure.thy       : theory
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   343
CPure.thy      : theory
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   344
merge_theories : string -> theory * theory -> theory
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   345
\end{ttbox}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   346
\begin{description}
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   347
\item[\ttindexbold{ProtoPure.thy}, \ttindexbold{Pure.thy},
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   348
  \ttindexbold{CPure.thy}] contain the syntax and signature of the
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   349
  meta-logic.  There are basically no axioms: meta-level inferences
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   350
  are carried out by \ML\ functions.  \texttt{Pure} and \texttt{CPure}
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   351
  just differ in their concrete syntax of prefix function application:
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   352
  $t(u@1, \ldots, u@n)$ in \texttt{Pure} vs.\ $t\,u@1,\ldots\,u@n$ in
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   353
  \texttt{CPure}.  \texttt{ProtoPure} is their common parent,
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   354
  containing no syntax for printing prefix applications at all!
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   355
  
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   356
\item[\ttindexbold{merge_theories} $name$ ($thy@1$, $thy@2$)] merges
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   357
  the two theories $thy@1$ and $thy@2$, creating a new named theory
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   358
  node.  The resulting theory contains all of the syntax, signature
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   359
  and axioms of the constituent theories.  Merging theories that
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   360
  contain different identification stamps of the same name fails with
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   361
  the following message
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   362
\begin{ttbox}
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   363
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
   364
\end{ttbox}
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   365
This error may especially occur when a theory is redeclared --- say to
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   366
change an inappropriate definition --- and bindings to old versions
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   367
persist.  Isabelle ensures that old and new theories of the same name
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   368
are not involved in a proof.
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   369
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   370
%% FIXME
478
838bd766d536 added init_thy_reader and removed extend_theory
nipkow
parents: 332
diff changeset
   371
%\item [\ttindexbold{extend_theory} $thy$ {\tt"}$T${\tt"} $\cdots$] extends
838bd766d536 added init_thy_reader and removed extend_theory
nipkow
parents: 332
diff changeset
   372
%  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
   373
%  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
   374
%  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
   375
%  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
   376
%  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
   377
%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
   378
%\begin{ttbox}
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   379
%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
   380
%\end{ttbox}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   381
\end{description}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   382
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   383
%% FIXME
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   384
%\item [\ttindexbold{extend_theory} $thy$ {\tt"}$T${\tt"}
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   385
%      ($classes$, $default$, $types$, $arities$, $consts$, $sextopt$) $rules$]
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   386
%\hfill\break   %%% include if line is just too short
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   387
%is the \ML{} equivalent of the following theory definition:
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   388
%\begin{ttbox}
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   389
%\(T\) = \(thy\) +
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   390
%classes \(c\) < \(c@1\),\(\dots\),\(c@m\)
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   391
%        \dots
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   392
%default {\(d@1,\dots,d@r\)}
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   393
%types   \(tycon@1\),\dots,\(tycon@i\) \(n\)
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   394
%        \dots
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   395
%arities \(tycon@1'\),\dots,\(tycon@j'\) :: (\(s@1\),\dots,\(s@n\))\(c\)
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   396
%        \dots
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   397
%consts  \(b@1\),\dots,\(b@k\) :: \(\tau\)
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   398
%        \dots
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   399
%rules   \(name\) \(rule\)
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   400
%        \dots
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   401
%end
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   402
%\end{ttbox}
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   403
%where
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   404
%\begin{tabular}[t]{l@{~=~}l}
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   405
%$classes$ & \tt[("$c$",["$c@1$",\dots,"$c@m$"]),\dots] \\
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   406
%$default$ & \tt["$d@1$",\dots,"$d@r$"]\\
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   407
%$types$   & \tt[([$tycon@1$,\dots,$tycon@i$], $n$),\dots] \\
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   408
%$arities$ & \tt[([$tycon'@1$,\dots,$tycon'@j$], ([$s@1$,\dots,$s@n$],$c$)),\dots]
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   409
%\\
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   410
%$consts$  & \tt[([$b@1$,\dots,$b@k$],$\tau$),\dots] \\
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   411
%$rules$   & \tt[("$name$",$rule$),\dots]
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   412
%\end{tabular}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   413
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   414
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   415
\subsection{Inspecting a theory}\label{sec:inspct-thy}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   416
\index{theories!inspecting|bold}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   417
\begin{ttbox}
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   418
print_syntax        : theory -> unit
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   419
print_theory        : theory -> unit
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   420
parents_of          : theory -> theory list
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   421
ancestors_of        : theory -> theory list
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   422
sign_of             : theory -> Sign.sg
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   423
Sign.stamp_names_of : Sign.sg -> string list
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   424
\end{ttbox}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   425
These provide means of viewing a theory's components.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   426
\begin{ttdescription}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   427
\item[\ttindexbold{print_syntax} $thy$] prints the syntax of $thy$
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   428
  (grammar, macros, translation functions etc., see
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   429
  page~\pageref{pg:print_syn} for more details).
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   430
  
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   431
\item[\ttindexbold{print_theory} $thy$] prints the logical parts of
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   432
  $thy$, excluding the syntax.
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   433
  
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   434
\item[\ttindexbold{parents_of} $thy$] returns the direct ancestors
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   435
  of~$thy$.
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   436
  
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   437
\item[\ttindexbold{ancestors_of} $thy$] returns all ancestors of~$thy$
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   438
  (not including $thy$ itself).
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   439
  
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   440
\item[\ttindexbold{sign_of} $thy$] returns the signature associated
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   441
  with~$thy$.  It is useful with functions like {\tt
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   442
    read_instantiate_sg}, which take a signature as an argument.
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   443
  
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   444
\item[\ttindexbold{Sign.stamp_names_of} $sg$]\index{signatures}
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   445
  returns the names of the identification \rmindex{stamps} of ax
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   446
  signature.  These coincide with the names of its full ancestry
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   447
  including that of $sg$ itself.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   448
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   449
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   450
1369
b82815e61b30 corrected documentation of pseudo theories;
clasohm
parents: 866
diff changeset
   451
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   452
\section{Terms}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   453
\index{terms|bold}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   454
Terms belong to the \ML\ type \mltydx{term}, which is a concrete datatype
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1905
diff changeset
   455
with six constructors:
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   456
\begin{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   457
type indexname = string * int;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   458
infix 9 $;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   459
datatype term = Const of string * typ
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   460
              | Free  of string * typ
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   461
              | Var   of indexname * typ
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   462
              | Bound of int
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   463
              | Abs   of string * typ * term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   464
              | op $  of term * term;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   465
\end{ttbox}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   466
\begin{ttdescription}
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   467
\item[\ttindexbold{Const} ($a$, $T$)] \index{constants|bold}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   468
  is the {\bf constant} with name~$a$ and type~$T$.  Constants include
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   469
  connectives like $\land$ and $\forall$ as well as constants like~0
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   470
  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
   471
  syntax.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   472
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   473
\item[\ttindexbold{Free} ($a$, $T$)] \index{variables!free|bold}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   474
  is the {\bf free variable} with name~$a$ and type~$T$.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   475
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   476
\item[\ttindexbold{Var} ($v$, $T$)] \index{unknowns|bold}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   477
  is the {\bf scheme variable} with indexname~$v$ and type~$T$.  An
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   478
  \mltydx{indexname} is a string paired with a non-negative index, or
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   479
  subscript; a term's scheme variables can be systematically renamed by
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   480
  incrementing their subscripts.  Scheme variables are essentially free
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   481
  variables, but may be instantiated during unification.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   482
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   483
\item[\ttindexbold{Bound} $i$] \index{variables!bound|bold}
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   484
  is the {\bf bound variable} with de Bruijn index~$i$, which counts the
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   485
  number of lambdas, starting from zero, between a variable's occurrence
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   486
  and its binding.  The representation prevents capture of variables.  For
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   487
  more information see de Bruijn \cite{debruijn72} or
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   488
  Paulson~\cite[page~336]{paulson91}.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   489
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   490
\item[\ttindexbold{Abs} ($a$, $T$, $u$)]
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   491
  \index{lambda abs@$\lambda$-abstractions|bold}
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   492
  is the $\lambda$-{\bf abstraction} with body~$u$, and whose bound
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   493
  variable has name~$a$ and type~$T$.  The name is used only for parsing
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   494
  and printing; it has no logical significance.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   495
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   496
\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
   497
is the {\bf application} of~$t$ to~$u$.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   498
\end{ttdescription}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   499
Application is written as an infix operator to aid readability.
332
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   500
Here is an \ML\ pattern to recognize \FOL{} formulae of
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   501
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
   502
\begin{ttbox}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   503
Const("Trueprop",_) $ (Const("op -->",_) $ A $ B)
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   504
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   505
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   506
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   507
\section{*Variable binding}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   508
\begin{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   509
loose_bnos     : term -> int list
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   510
incr_boundvars : int -> term -> term
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   511
abstract_over  : term*term -> term
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   512
variant_abs    : string * typ * term -> string * term
4374
wenzelm
parents: 4317
diff changeset
   513
aconv          : term * term -> bool\hfill{\bf infix}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   514
\end{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   515
These functions are all concerned with the de Bruijn representation of
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   516
bound variables.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   517
\begin{ttdescription}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   518
\item[\ttindexbold{loose_bnos} $t$]
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   519
  returns the list of all dangling bound variable references.  In
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   520
  particular, {\tt Bound~0} is loose unless it is enclosed in an
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   521
  abstraction.  Similarly {\tt Bound~1} is loose unless it is enclosed in
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   522
  at least two abstractions; if enclosed in just one, the list will contain
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   523
  the number 0.  A well-formed term does not contain any loose variables.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   524
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   525
\item[\ttindexbold{incr_boundvars} $j$]
332
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   526
  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
   527
  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
   528
  different number of abstractions.  Bound variables with a matching
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   529
  abstraction are unaffected.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   530
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   531
\item[\ttindexbold{abstract_over} $(v,t)$]
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   532
  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
   533
  It replaces every occurrence of \(v\) by a {\tt Bound} variable with the
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   534
  correct index.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   535
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   536
\item[\ttindexbold{variant_abs} $(a,T,u)$]
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   537
  substitutes into $u$, which should be the body of an abstraction.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   538
  It replaces each occurrence of the outermost bound variable by a free
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   539
  variable.  The free variable has type~$T$ and its name is a variant
332
01b87a921967 final Springer copy
lcp
parents: 324
diff changeset
   540
  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
   541
  free in~$u$.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   542
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   543
\item[$t$ \ttindexbold{aconv} $u$]
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   544
  tests whether terms~$t$ and~$u$ are \(\alpha\)-convertible: identical up
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   545
  to renaming of bound variables.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   546
\begin{itemize}
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   547
  \item
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   548
    Two constants, {\tt Free}s, or {\tt Var}s are \(\alpha\)-convertible
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   549
    if their names and types are equal.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   550
    (Variables having the same name but different types are thus distinct.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   551
    This confusing situation should be avoided!)
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   552
  \item
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   553
    Two bound variables are \(\alpha\)-convertible
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   554
    if they have the same number.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   555
  \item
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   556
    Two abstractions are \(\alpha\)-convertible
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   557
    if their bodies are, and their bound variables have the same type.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   558
  \item
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   559
    Two applications are \(\alpha\)-convertible
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   560
    if the corresponding subterms are.
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   561
\end{itemize}
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   562
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   563
\end{ttdescription}
286
e7efbf03562b first draft of Springer book
lcp
parents: 275
diff changeset
   564
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   565
\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
   566
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
   567
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
   568
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
   569
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
   570
take certified terms as arguments.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   571
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   572
Certified terms belong to the abstract type \mltydx{cterm}.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   573
Elements of the type can only be created through the certification process.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   574
In case of error, Isabelle raises exception~\ttindex{TERM}\@.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   575
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   576
\subsection{Printing terms}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   577
\index{terms!printing of}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   578
\begin{ttbox}
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   579
     string_of_cterm :           cterm -> string
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   580
Sign.string_of_term  : Sign.sg -> term -> string
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   581
\end{ttbox}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   582
\begin{ttdescription}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   583
\item[\ttindexbold{string_of_cterm} $ct$]
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   584
displays $ct$ as a string.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   585
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   586
\item[\ttindexbold{Sign.string_of_term} $sign$ $t$]
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   587
displays $t$ as a string, using the syntax of~$sign$.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   588
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   589
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   590
\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
   591
\begin{ttbox}
4543
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   592
cterm_of          : Sign.sg -> term -> cterm
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   593
read_cterm        : Sign.sg -> string * typ -> cterm
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   594
cert_axm          : Sign.sg -> string * term -> string * term
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   595
read_axm          : Sign.sg -> string * string -> string * term
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   596
rep_cterm         : cterm -> {\ttlbrace}T:typ, t:term, sign:Sign.sg, maxidx:int\ttrbrace
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   597
Sign.certify_term : Sign.sg -> term -> term * typ * int
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   598
\end{ttbox}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   599
\begin{ttdescription}
4543
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   600
  
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   601
\item[\ttindexbold{cterm_of} $sign$ $t$] \index{signatures} certifies
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   602
  $t$ with respect to signature~$sign$.
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   603
  
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   604
\item[\ttindexbold{read_cterm} $sign$ ($s$, $T$)] reads the string~$s$
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   605
  using the syntax of~$sign$, creating a certified term.  The term is
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   606
  checked to have type~$T$; this type also tells the parser what kind
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   607
  of phrase to parse.
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   608
  
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   609
\item[\ttindexbold{cert_axm} $sign$ ($name$, $t$)] certifies $t$ with
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   610
  respect to $sign$ as a meta-proposition and converts all exceptions
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   611
  to an error, including the final message
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   612
\begin{ttbox}
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   613
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
   614
\end{ttbox}
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   615
4543
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   616
\item[\ttindexbold{read_axm} $sign$ ($name$, $s$)] similar to {\tt
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   617
    cert_axm}, but first reads the string $s$ using the syntax of
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   618
  $sign$.
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   619
  
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   620
\item[\ttindexbold{rep_cterm} $ct$] decomposes $ct$ as a record
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   621
  containing its type, the term itself, its signature, and the maximum
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   622
  subscript of its unknowns.  The type and maximum subscript are
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   623
  computed during certification.
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   624
  
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   625
\item[\ttindexbold{Sign.certify_term}] is a more primitive version of
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   626
  \texttt{cterm_of}, returning the internal representation instead of
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   627
  an abstract \texttt{cterm}.
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   628
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   629
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   630
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   631
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   632
\section{Types}\index{types|bold}
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   633
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
   634
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
   635
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
   636
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
   637
represented by a string.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   638
\begin{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   639
type class = string;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   640
type sort  = class list;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   641
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   642
datatype typ = Type  of string * typ list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   643
             | TFree of string * sort
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   644
             | TVar  of indexname * sort;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   645
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   646
infixr 5 -->;
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   647
fun S --> T = Type ("fun", [S, T]);
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   648
\end{ttbox}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   649
\begin{ttdescription}
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   650
\item[\ttindexbold{Type} ($a$, $Ts$)] \index{type constructors|bold}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   651
  applies the {\bf type constructor} named~$a$ to the type operands~$Ts$.
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   652
  Type constructors include~\tydx{fun}, the binary function space
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   653
  constructor, as well as nullary type constructors such as~\tydx{prop}.
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   654
  Other type constructors may be introduced.  In expressions, but not in
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   655
  patterns, \hbox{\tt$S$-->$T$} is a convenient shorthand for function
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   656
  types.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   657
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   658
\item[\ttindexbold{TFree} ($a$, $s$)] \index{type variables|bold}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   659
  is the {\bf type variable} with name~$a$ and sort~$s$.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   660
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   661
\item[\ttindexbold{TVar} ($v$, $s$)] \index{type unknowns|bold}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   662
  is the {\bf type unknown} with indexname~$v$ and sort~$s$.
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   663
  Type unknowns are essentially free type variables, but may be
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   664
  instantiated during unification.
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   665
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   666
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   667
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   668
\section{Certified types}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   669
\index{types!certified|bold}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   670
Certified types, which are analogous to certified terms, have type
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   671
\ttindexbold{ctyp}.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   672
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   673
\subsection{Printing types}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   674
\index{types!printing of}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   675
\begin{ttbox}
275
933ec96c522e update towards LNCS
nipkow
parents: 273
diff changeset
   676
     string_of_ctyp :           ctyp -> string
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   677
Sign.string_of_typ  : Sign.sg -> typ -> string
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   678
\end{ttbox}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   679
\begin{ttdescription}
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   680
\item[\ttindexbold{string_of_ctyp} $cT$]
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   681
displays $cT$ as a string.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   682
864
d63b111b917a quite a lot of minor and major revisions (inspecting theories, read_axm,
wenzelm
parents: 478
diff changeset
   683
\item[\ttindexbold{Sign.string_of_typ} $sign$ $T$]
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   684
displays $T$ as a string, using the syntax of~$sign$.
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   685
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   686
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   687
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   688
\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
   689
\begin{ttbox}
4543
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   690
ctyp_of          : Sign.sg -> typ -> ctyp
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   691
rep_ctyp         : ctyp -> {\ttlbrace}T: typ, sign: Sign.sg\ttrbrace
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   692
Sign.certify_typ : Sign.sg -> typ -> typ
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   693
\end{ttbox}
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   694
\begin{ttdescription}
4543
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   695
  
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   696
\item[\ttindexbold{ctyp_of} $sign$ $T$] \index{signatures} certifies
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   697
  $T$ with respect to signature~$sign$.
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   698
  
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   699
\item[\ttindexbold{rep_ctyp} $cT$] decomposes $cT$ as a record
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   700
  containing the type itself and its signature.
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   701
  
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   702
\item[\ttindexbold{Sign.certify_typ}] is a more primitive version of
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   703
  \texttt{ctyp_of}, returning the internal representation instead of
82a45bdd0e80 several minor updates;
wenzelm
parents: 4384
diff changeset
   704
  an abstract \texttt{ctyp}.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   705
324
34bc15b546e6 penultimate Springer draft
lcp
parents: 286
diff changeset
   706
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   707
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   708
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   709
\section{Oracles: calling trusted external reasoners}
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   710
\label{sec:oracles}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   711
\index{oracles|(}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   712
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   713
Oracles allow Isabelle to take advantage of external reasoners such as
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   714
arithmetic decision procedures, model checkers, fast tautology checkers or
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   715
computer algebra systems.  Invoked as an oracle, an external reasoner can
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   716
create arbitrary Isabelle theorems.  It is your responsibility to ensure that
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   717
the external reasoner is as trustworthy as your application requires.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   718
Isabelle's proof objects~(\S\ref{sec:proofObjects}) record how each theorem
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   719
depends upon oracle calls.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   720
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   721
\begin{ttbox}
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   722
invoke_oracle     : theory -> xstring -> Sign.sg * object -> thm
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4543
diff changeset
   723
Theory.add_oracle : bstring * (Sign.sg * object -> term) -> theory 
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4543
diff changeset
   724
                    -> theory
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   725
\end{ttbox}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   726
\begin{ttdescription}
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   727
\item[\ttindexbold{invoke_oracle} $thy$ $name$ ($sign$, $data$)]
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   728
  invokes the oracle $name$ of theory $thy$ passing the information
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   729
  contained in the exception value $data$ and creating a theorem
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   730
  having signature $sign$.  Note that type \ttindex{object} is just an
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   731
  abbreviation for \texttt{exn}.  Errors arise if $thy$ does not have
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   732
  an oracle called $name$, if the oracle rejects its arguments or if
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   733
  its result is ill-typed.
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   734
  
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   735
\item[\ttindexbold{Theory.add_oracle} $name$ $fun$ $thy$] extends
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   736
  $thy$ by oracle $fun$ called $name$.  It is seldom called
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   737
  explicitly, as there is concrete syntax for oracles in theory files.
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   738
\end{ttdescription}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   739
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   740
A curious feature of {\ML} exceptions is that they are ordinary constructors.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   741
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
   742
my {\em {ML} for the Working Programmer}~\cite{paulson-ml2}, especially
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   743
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
   744
take any information whatever.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   745
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   746
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
   747
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
   748
expects the {\ML} function to take two arguments: a signature and an
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   749
exception object.
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   750
\begin{itemize}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   751
\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
   752
  declaring the oracle.  The oracle will use it to distinguish constants from
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   753
  variables, etc., and it will be attached to the generated theorems.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   754
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   755
\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
   756
  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
   757
  the external reasoner, including any additional information that might be
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   758
  required.  The oracle may raise the exception to indicate that it cannot
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   759
  solve the specified problem.
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   760
\end{itemize}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   761
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   762
A trivial example is provided in theory {\tt FOL/ex/IffOracle}.  This
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   763
oracle generates tautologies of the form $P\bimp\cdots\bimp P$, with
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   764
an even number of $P$s.
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   765
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   766
The \texttt{ML} section of \texttt{IffOracle.thy} begins by declaring
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   767
a few auxiliary functions (suppressed below) for creating the
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   768
tautologies.  Then it declares a new exception constructor for the
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   769
information required by the oracle: here, just an integer. It finally
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   770
defines the oracle function itself.
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   771
\begin{ttbox}
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   772
exception IffOracleExn of int;\medskip
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   773
fun mk_iff_oracle (sign, IffOracleExn n) =
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   774
  if n > 0 andalso n mod 2 = 0
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   775
  then Trueprop $ mk_iff n
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   776
  else raise IffOracleExn n;
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   777
\end{ttbox}
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   778
Observe the function's two arguments, the signature {\tt sign} and the
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   779
exception given as a pattern.  The function checks its argument for
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   780
validity.  If $n$ is positive and even then it creates a tautology
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   781
containing $n$ occurrences of~$P$.  Otherwise it signals error by
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   782
raising its own exception (just by happy coincidence).  Errors may be
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   783
signalled by other means, such as returning the theorem {\tt True}.
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   784
Please ensure that the oracle's result is correctly typed; Isabelle
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   785
will reject ill-typed theorems by raising a cryptic exception at top
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   786
level.
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   787
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   788
The \texttt{oracle} section of {\tt IffOracle.thy} installs above
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   789
\texttt{ML} function as follows:
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   790
\begin{ttbox}
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   791
IffOracle = FOL +\medskip
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   792
oracle
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   793
  iff = mk_iff_oracle\medskip
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   794
end
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   795
\end{ttbox}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   796
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   797
Now in \texttt{IffOracle.ML} we first define a wrapper for invoking
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   798
the oracle:
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   799
\begin{ttbox}
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4543
diff changeset
   800
fun iff_oracle n = invoke_oracle IffOracle.thy "iff"
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4543
diff changeset
   801
                      (sign_of IffOracle.thy, IffOracleExn n);
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   802
\end{ttbox}
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   803
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   804
Here are some example applications of the \texttt{iff} oracle.  An
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   805
argument of 10 is allowed, but one of 5 is forbidden:
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   806
\begin{ttbox}
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   807
iff_oracle 10;
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   808
{\out  "P <-> P <-> P <-> P <-> P <-> P <-> P <-> P <-> P <-> P" : thm}
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3485
diff changeset
   809
iff_oracle 5;
1846
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   810
{\out Exception- IffOracleExn 5 raised}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   811
\end{ttbox}
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   812
763f08fb194f Documentation of oracles and their syntax
paulson
parents: 1650
diff changeset
   813
\index{oracles|)}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   814
\index{theories|)}
5369
8384e01b6cf8 added nonterminals, setup;
wenzelm
parents: 4597
diff changeset
   815
8384e01b6cf8 added nonterminals, setup;
wenzelm
parents: 4597
diff changeset
   816
8384e01b6cf8 added nonterminals, setup;
wenzelm
parents: 4597
diff changeset
   817
%%% Local Variables: 
8384e01b6cf8 added nonterminals, setup;
wenzelm
parents: 4597
diff changeset
   818
%%% mode: latex
8384e01b6cf8 added nonterminals, setup;
wenzelm
parents: 4597
diff changeset
   819
%%% TeX-master: "ref"
8384e01b6cf8 added nonterminals, setup;
wenzelm
parents: 4597
diff changeset
   820
%%% End: