doc-src/Ref/theories.tex
author clasohm
Mon, 22 Nov 1993 16:03:36 +0100
changeset 138 9ba8bff1addc
parent 104 d8205bb279a7
child 139 4f83c0a0c3f4
permissions -rw-r--r--
added chapter "Defining Theories" and made changes for new Readthy functions
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     1
%% $Id$
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     2
\chapter{Theories, Terms and Types} \label{theories}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     3
\index{theories|(}\index{signatures|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     4
\index{reading!axioms|see{{\tt extend_theory} and {\tt assume_ax}}}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     5
Theories organize the syntax, declarations and axioms of a mathematical
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     6
development.  They are built, starting from the Pure theory, by extending
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     7
and merging existing theories.  They have the \ML{} type \ttindex{theory}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     8
Theory operations signal errors by raising exception \ttindex{THEORY},
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     9
returning a message and a list of theories.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    10
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    11
Signatures, which contain information about sorts, types, constants and
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    12
syntax, have the \ML{} type~\ttindexbold{Sign.sg}.  For identification,
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    13
each signature carries a unique list of {\bf stamps}, which are~\ML{}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    14
references (to strings).  The strings serve as human-readable names; the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    15
references serve as unique identifiers.  Each primitive signature has a
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    16
single stamp.  When two signatures are merged, their lists of stamps are
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    17
also merged.  Every theory carries a unique signature.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    18
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    19
Terms and types are the underlying representation of logical syntax.  Their
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    20
\ML{} definitions are irrelevant to naive Isabelle users.  Programmers who wish
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    21
to extend Isabelle may need to know such details, say to code a tactic that
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    22
looks for subgoals of a particular form.  Terms and types may be
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    23
`certified' to be well-formed with respect to a given signature.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    24
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    25
\section{Defining Theories}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    26
\label{DefiningTheories}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    27
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    28
Theories can be defined either using concrete syntax or by calling certain
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    29
\ML-functions (see \S\ref{BuildingATheory}).  Figure~\ref{TheorySyntax}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    30
presents the concrete syntax for theories.  This grammar employs the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    31
following conventions: 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    32
\begin{itemize}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    33
\item Identifiers such as $theoryDef$ denote nonterminal symbols.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    34
\item Text in {\tt typewriter font} denotes terminal symbols.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    35
\item \ldots{} indicates repetition of a phrase.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    36
\item A vertical bar~($|$) separates alternative phrases.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    37
\item Square [brackets] enclose optional phrases.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    38
\item $id$ stands for an Isabelle identifier.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    39
\item $string$ stands for an ML string, with its quotation marks.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    40
\item $k$ stands for a natural number.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    41
\item $text$ stands for arbitrary ML text.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    42
\end{itemize}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    43
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    44
\begin{figure}[hp]
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    45
\begin{center}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    46
\begin{tabular}{rclc}
138
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
    47
$theoryDef$ &=& $id$ {\tt=} $name@1$ {\tt+} \dots {\tt+} $name@n$
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    48
                            [{\tt+} $extension$]\\\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    49
$extension$ &=& [$classes$] [$default$] [$types$] [$arities$] [$consts$]
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    50
                [$rules$] {\tt end} [$ml$]\\\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    51
$classes$ &=& \ttindex{classes} $class$ \dots $class$ \\\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    52
$class$ &=& $id$ [{\tt<} $id@1${\tt,} \dots{\tt,} $id@n$] \\\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    53
$default$ &=& \ttindex{default} $sort$ \\\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    54
$sort$ &=& $id$ ~~$|$~~ {\tt\{} $id@1${\tt,} \dots{\tt,} $id@n$ {\tt\}} \\\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    55
$name$ &=& $id$ ~~$|$~~ $string$ \\\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    56
$types$ &=& \ttindex{types} $typeDecl$ \dots $typeDecl$ \\\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    57
$typeDecl$ &=& $name${\tt,} \dots{\tt,} $name$ $k$
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    58
               [{\tt(} $infix$ {\tt)}] \\\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    59
$infix$ &=& \ttindex{infixl} $k$ ~~$|$~~ \ttindex{infixr} $k$ \\\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    60
$arities$ &=& \ttindex{arities} $arityDecl$ \dots $arityDecl$ \\\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    61
$arityDecl$ &=& $name${\tt,} \dots{\tt,} $name$ {\tt::} $arity$ \\\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    62
$arity$ &=& [{\tt(} $sort${\tt,} \dots{\tt,} $sort$ {\tt)}] $id$ \\\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    63
$consts$ &=& \ttindex{consts} $constDecl$ \dots $constDecl$ \\\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    64
$constDecl$ &=& $name@1${\tt,} \dots{\tt,} $name@n$ {\tt::} $string$
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    65
                [{\tt(} $mixfix$ {\tt)}] \\\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    66
$mixfix$ &=& $string$
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    67
             [ [\quad{\tt[} $k@1${\tt,} \dots{\tt,} $k@n$ {\tt]}\quad] $k$]\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    68
       &$|$& $infix$ \\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    69
       &$|$& \ttindex{binder} $string$ $k$\\\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    70
$rules$ &=& \ttindex{rules} $rule$ \dots $rule$ \\\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    71
$rule$ &=& $id$ $string$ \\\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    72
$ml$ &=& \ttindex{ML} $text$
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    73
\end{tabular}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    74
\end{center}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    75
\caption{Theory Syntax}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    76
\label{TheorySyntax}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    77
\end{figure}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    78
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    79
The different parts of a theory definition are interpreted as follows:
138
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
    80
\begin{description} 
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
    81
\item[$theoryDef$] A theory has a name $id$ and is an
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
    82
  extension of the union of theories $id@1$ \dots $id@n$ with new
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
    83
  classes, types, constants, syntax and axioms. The basic theory, which 
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
    84
  contains only the meta-logic, is called {\tt Pure}.
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
    85
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
    86
  If $name@i$ is a string the theory $name@i$ is {\em not} used in building
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
    87
  the base of theory $id$.  The reason for using strings in $theoryDef$ is that
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
    88
  many theories use objects created in a \ML-file that does not belong to a
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
    89
  theory itself.  Because $name@1$ \dots $name@n$ are loaded automatically a
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
    90
  string can be used to specify a file that is needed as a series of 
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
    91
  \ML{}-declarations but not as a parent for theory $id$.  See
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
    92
  Chapter~\ref{LoadingTheories} for details.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    93
\item[$class$] The new class $id$ is declared as a subclass of existing
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    94
  classes $id@1$ \dots $id@n$.  This rules out cyclic class structures.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    95
  Isabelle automatically computes the transitive closure of subclass
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    96
  hierarchies.  Hence it is not necessary to declare $c@1 < c@3$ in addition
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    97
  to $c@1 < c@2$ and $c@2 < c@3$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    98
\item[$default$] introduces $sort$ as the new default sort for type
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    99
  variables.  Unconstrained type variables in an input string are
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   100
  automatically constrained by $sort$; this does not apply to type variables
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   101
  created internally during type inference.  If omitted,
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   102
  the default sort is the same as in the parent theory.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   103
\item[$sort$] is a finite set $id@1$ \dots $id@n$ of classes; a single class
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   104
  $id$ abbreviates the singleton set {\tt\{}$id${\tt\}}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   105
\item[$name$] is either an alphanumeric identifier or an arbitrary string.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   106
\item[$typeDecl$] Each $name$ is declared as a new type constructor with
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   107
  $k$ arguments.  Only binary type constructors can have infix status and
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   108
  symbolic names ($string$).
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   109
\item[$infix$] declares a type or constant to be an infix operator of
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   110
  precedence $k$ associating to the left ({\tt infixl}) or right ({\tt
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   111
    infixr}).
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   112
\item[$arityDecl$] Each existing type constructor $name@1$ \dots $name@n$
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   113
  is given the additional arity $arity$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   114
\item[$constDecl$] The new constants $name@1$ \dots $name@n$ are declared to
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   115
  be of type $string$.  For display purposes they can be annotated with
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   116
  $mixfix$ declarations.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   117
\item[$mixfix$] $string$ is a mixfix template of the form {\tt"}\dots{\tt\_}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   118
  \dots{\tt\_} \dots{\tt"} where the $i$-th underscore indicates the position
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   119
  where the $i$-th argument should go, $k@i$ is the minimum precedence of
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   120
  the $i$-th argument, and $k$ the precedence of the construct.  The list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   121
  \hbox{\tt[$k@1$, \dots, $k@n$]} is optional.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   122
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   123
  Binary constants can be given infix status.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   124
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   125
  A constant $f$ {\tt::} $(\tau@1\To\tau@2)\To\tau@3$ can be given {\em
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   126
    binder} status: {\tt binder} $Q$ $p$ causes $Q\,x.F(x)$ to be treated
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   127
  like $f(F)$; $p$ is the precedence of the construct.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   128
\item[$rule$] A rule consists of a name $id$ and a formula $string$.  Rule
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   129
  names must be distinct.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   130
\item[$ml$] This final part of a theory consists of ML code, 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   131
  typically for parse and print translations.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   132
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   133
The $mixfix$ and $ml$ sections are explained in more detail in the {\it
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   134
Defining Logics} chapter of the {\it Logics} manual.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   135
138
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   136
\section{Loading Theories}
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   137
\label{LoadingTheories}
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   138
\subsection{Reading a new theory}
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   139
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   140
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   141
use_thy: string -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   142
\end{ttbox}
138
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   143
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   144
Each theory definition must reside in a separate file.  Let the file {\it
138
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   145
tf}{\tt.thy} contain the definition of a theory called $TF$ with parent
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   146
theories $TB@1$ \dots $TB@n$.  Calling \ttindexbold{use_thy}~{\tt"}{\it
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   147
TF\/}{\tt"} reads file {\it tf}{\tt.thy}, writes an intermediate {\ML}-file
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   148
{\tt.}{\it tf}{\tt.thy.ML}, and reads the latter file.  Any of the parent
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   149
theories that have not been loaded yet are read now by recursive {\tt use_thy}
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   150
calls until either an already loaded theory or {\tt Pure} is reached.
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   151
Therefore one can read a complete logic by just one {\tt use_thy} call if all
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   152
theories are linked appropriatly.  Afterwards an {\ML} structure~$TF$
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   153
containing a component {\tt thy} for the new theory and components $r@1$ \dots
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   154
$r@n$ for the rules is declared; it also contains the definitions of the {\tt
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   155
ML} section if any. (Normally {\tt.}{\it tf}{\tt.thy.ML} is deleted now if
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   156
there have occured no errors. In case one wants to have a look at it,
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   157
{\tt delete_tmpfiles := false} can be set before calling {\tt use_thy}.)  
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   158
Finally the file {\it tf}{\tt.ML} is read, if it exists; this file normally
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   159
contains proofs involving the new theory.
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   160
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   161
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   162
\subsection{Filenames and paths}
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   163
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   164
The files the theory definition resides in must have the lower case name of
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   165
the theory with ".thy" or ".ML" appended.  On the other hand {\tt use_thy}'s
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   166
parameter has to be the exact theory name.  Optionally the name can be
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   167
preceeded by a path to specify the directory where the files can be found.  If
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   168
no path is provided the reference variable {\tt loadpath} is used which
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   169
contains a list of paths that are searched in the given order.  After the
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   170
".thy"-file for a theory has been found the same path is used to locate the
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   171
(optional) ".ML"-file.  (You might note that it is also possible to only
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   172
provide a ".ML"- but no ".thy"-file.  In this case a \ML{} structure with the
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   173
theory's name has to be created in the ".ML" file.  If both the ".thy"-file
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   174
and a structure declaration in the ".ML"-file exist the declaration in the
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   175
latter file is used.  See {\tt ZF/ex/llist.ML} for an example.)
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   176
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   177
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   178
\subsection{Reloading a theory}
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   179
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   180
{\tt use_thy} keeps track of all loaded theories and stores information about
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   181
their files.  If it finds that the theory to be loaded was already read before
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   182
the following happens:  First the theory's files are searched at the place
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   183
they were located at the last time they were read. If they are found their
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   184
time of last modification is compared to the internal data and {\tt use_thy}
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   185
stops if they are equal. In case the files have been moved, {\tt use_thy}
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   186
searches them the same way as a new theory would be searched for.  After all
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   187
these tests have been passed the theory is reloaded and all theories that
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   188
depend on it (i.e. that have its name in their $theoryDef$) are marked as
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   189
out-of-date.
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   190
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   191
As changing a theory often makes it necessary to reload all theories that
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   192
(indirectly) depend on it, {\tt update} should be used instead of {\tt
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   193
use_thy} to read a modified theory.  This function reloads all changed
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   194
theories and their descendants in the correct order.
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   195
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   196
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   197
\subsection{Pseudo theories}
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   198
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   199
There is a problem with {\tt update}: objects created in \ML-files that do not
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   200
belong to a theory (see explanation of $theoryDef$ in \ref{DefiningTheories}).
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   201
These files are read manually between {\tt use_thy} calls and define objects
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   202
used in different theories.  As {\tt update} only knows about the
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   203
theories there still exist objects with references to the old theory version
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   204
after the new one has been read.  This (most probably) will produce the fatal
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   205
error
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   206
\begin{center} \tt
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   207
Attempt to merge different versions of theory: $T$
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   208
\end{center}
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   209
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   210
Therefore there is a way to link theories and the $orphaned$ \ML-files. The
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   211
link from a theory to a \ML-file has been mentioned in
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   212
Chapter~\ref{DefiningTheories} (strings in $theoryDef$).  But to make this
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   213
work and to establish a link in the opposite direction we need to create a
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   214
{\it pseudo theory}.  Let's assume we have a \ML-file named {\tt orphan.ML} that
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   215
depends on theory $A$ and itself is used in theory $B$.  To link the three we
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   216
have to create the file {\tt orphan.thy} containing the line
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   217
\begin{ttbox}
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   218
orphan = A
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   219
\end{ttbox}
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   220
and add {\tt "orphan"} to theory $B$'s $theoryDef$.  Creating {\tt orphan.thy}
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   221
is necessary because of two reasons: First it enables automatic loading of
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   222
$orphan$'s parents and second it creates the \ML{}-object {\tt orphan} that
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   223
is needed by {\tt use_thy} (though it is not added to the base of theory $B$). 
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   224
If {\tt orphan.ML} depended on no theory then {\tt Pure} would have been used
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   225
instead of {\tt A}.
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   226
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   227
For an extensive example of how this technique can be used to link over 30
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   228
files and read them by just two {\tt use_thy} calls have a look at the ZF logic.
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   229
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   230
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   231
\subsection{Removing a theory}
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   232
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   233
If a previously read file is removed the {\tt update} function will keep
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   234
on complaining about a missing file.  The theory is not automatically removed
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   235
from the internal list to preserve the links to other theories in case one
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   236
forgot to adjust the {\tt loadpath} after moving a file.  To manually remove a
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   237
theory use {\tt unlink_thy}.
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   238
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   239
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   240
\subsection{Using Poly/\ML}
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   241
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   242
As the functions for reading theories depend on reference variables one has to
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   243
take into consideration the way Poly/\ML{} handles them.  They are only saved
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   244
together with the state if they were declared in the current database.  E.g.
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   245
changes made to a reference variable declared in the $Pure$ database are $not$
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   246
saved if made while using a child database.  Therefore a new {\tt Readthy}
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   247
structure has to be declared by
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   248
\begin{ttbox}
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   249
structure Readthy = ReadthyFUN (structure ThySyn = ThySyn);
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   250
open Readthy;
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   251
\end{ttbox}
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   252
in every newly created database.  This is not necessary if the database is
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   253
created by copying an existent one.
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   254
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   255
The above declarations are contained in the $Pure$ database, so one could
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   256
simply use e.g. {\tt use_thy} if saving of the reference variables is not
9ba8bff1addc added chapter "Defining Theories" and made changes for new Readthy functions
clasohm
parents: 104
diff changeset
   257
needed.  Also Standard ML of New Jersey does not have this behaviour.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   258
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   259
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   260
\section{Basic operations on theories}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   261
\subsection{Extracting an axiom from a theory}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   262
\index{theories!extracting axioms|bold}\index{axioms}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   263
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   264
get_axiom: theory -> string -> thm
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   265
assume_ax: theory -> string -> thm
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   266
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   267
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   268
\item[\ttindexbold{get_axiom} $thy$ $name$] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   269
returns an axiom with the given $name$ from $thy$, raising exception
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   270
\ttindex{THEORY} if none exists.  Merging theories can cause several axioms
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   271
to have the same name; {\tt get_axiom} returns an arbitrary one.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   272
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   273
\item[\ttindexbold{assume_ax} $thy$ $formula$] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   274
reads the {\it formula} using the syntax of $thy$, following the same
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   275
conventions as axioms in a theory definition.  You can thus pretend that
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   276
{\it formula} is an axiom; in fact, {\tt assume_ax} returns an assumption.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   277
You can use the resulting theorem like an axiom.  Note that 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   278
\ttindex{result} complains about additional assumptions, but 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   279
\ttindex{uresult} does not.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   280
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   281
For example, if {\it formula} is
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   282
\hbox{\tt a=b ==> b=a} then the resulting theorem might have the form
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   283
\hbox{\tt\frenchspacing ?a=?b ==> ?b=?a  [!!a b. a=b ==> b=a]}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   284
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   285
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   286
\subsection{Building a theory}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   287
\label{BuildingATheory}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   288
\index{theories!constructing|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   289
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   290
pure_thy: theory
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   291
merge_theories: theory * theory -> theory
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   292
extend_theory: theory -> string
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   293
        -> (class * class list) list 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   294
           * sort
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   295
           * (string list * int)list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   296
           * (string list * (sort list * class))list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   297
           * (string list * string)list * sext option
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   298
        -> (string*string)list -> theory
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   299
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   300
Type \ttindex{class} is a synonym for {\tt string}; type \ttindex{sort} is
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   301
a synonym for \hbox{\tt class list}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   302
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   303
\item[\ttindexbold{pure_thy}] contains just the types, constants, and syntax
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   304
  of the meta-logic.  There are no axioms: meta-level inferences are carried
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   305
  out by \ML\ functions.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   306
\item[\ttindexbold{merge_theories} ($thy@1$, $thy@2$)] merges the two
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   307
  theories $thy@1$ and $thy@2$.  The resulting theory contains all types,
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   308
  constants and axioms of the constituent theories; its default sort is the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   309
  union of the default sorts of the constituent theories.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   310
\item [\ttindexbold{extend_theory} $thy$ {\tt"}$T${\tt"}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   311
      ($classes$, $default$, $types$, $arities$, $consts$, $sextopt$) $rules$]
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   312
\hfill\break   %%% include if line is just too short
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   313
is the \ML-equivalent of the following theory definition:
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   314
\begin{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   315
\(T\) = \(thy\) +
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   316
classes \(c\) < \(c@1\),\(\dots\),\(c@m\)
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   317
        \dots
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   318
default {\(d@1,\dots,d@r\)}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   319
types   \(tycon@1\),\dots,\(tycon@i\) \(n\)
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   320
        \dots
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   321
arities \(tycon@1'\),\dots,\(tycon@j'\) :: (\(s@1\),\dots,\(s@n\))\(c\)
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   322
        \dots
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   323
consts  \(b@1\),\dots,\(b@k\) :: \(\tau\)
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   324
        \dots
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   325
rules   \(name\) \(rule\)
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   326
        \dots
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   327
end
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   328
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   329
where
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   330
\begin{tabular}[t]{l@{~=~}l}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   331
$classes$ & \tt[("$c$",["$c@1$",\dots,"$c@m$"]),\dots] \\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   332
$default$ & \tt["$d@1$",\dots,"$d@r$"]\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   333
$types$   & \tt[([$tycon@1$,\dots,$tycon@i$], $n$),\dots] \\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   334
$arities$ & \tt[([$tycon'@1$,\dots,$tycon'@j$], ([$s@1$,\dots,$s@n$],$c$)),\dots]
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   335
\\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   336
$consts$  & \tt[([$b@1$,\dots,$b@k$],$\tau$),\dots] \\
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   337
$rules$   & \tt[("$name$",$rule$),\dots]
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   338
\end{tabular}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   339
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   340
If theories are defined as in \S\ref{DefiningTheories}, new syntax is added
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   341
as mixfix annotations to constants.  Using {\tt extend_theory}, new syntax can
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   342
be added via $sextopt$ which is either {\tt None}, or {\tt Some($sext$)}.  The
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   343
latter case is not documented.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   344
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   345
$T$ identifies the theory internally.  When a theory is redeclared, say to
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   346
change an incorrect axiom, bindings to the old axiom may persist.  Isabelle
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   347
ensures that the old and new theories are not involved in the same proof.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   348
Attempting to combine different theories having the same name $T$ yields the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   349
fatal error
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   350
\begin{center} \tt
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   351
Attempt to merge different versions of theory: $T$
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   352
\end{center}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   353
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   354
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   355
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   356
\subsection{Inspecting a theory}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   357
\index{theories!inspecting|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   358
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   359
print_theory  : theory -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   360
axioms_of     : theory -> (string*thm)list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   361
parents_of    : theory -> theory list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   362
sign_of       : theory -> Sign.sg
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   363
stamps_of_thy : theory -> string ref list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   364
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   365
These provide a simple means of viewing a theory's components.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   366
Unfortunately, there is no direct connection between a theorem and its
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   367
theory.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   368
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   369
\item[\ttindexbold{print_theory} {\it thy}]  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   370
prints the theory {\it thy\/} at the terminal as a set of identifiers.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   371
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   372
\item[\ttindexbold{axioms_of} $thy$] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   373
returns the axioms of~$thy$ and its ancestors.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   374
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   375
\item[\ttindexbold{parents_of} $thy$] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   376
returns the parents of~$thy$.  This list contains zero, one or two
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   377
elements, depending upon whether $thy$ is {\tt pure_thy}, 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   378
\hbox{\tt extend_theory $thy$} or \hbox{\tt merge_theories ($thy@1$, $thy@2$)}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   379
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   380
\item[\ttindexbold{stamps_of_thy} $thy$]\index{signatures}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   381
returns the stamps of the signature associated with~$thy$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   382
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   383
\item[\ttindexbold{sign_of} $thy$] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   384
returns the signature associated with~$thy$.  It is useful with functions
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   385
like {\tt read_instantiate_sg}, which take a signature as an argument.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   386
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   387
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   388
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   389
\section{Terms}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   390
\index{terms|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   391
Terms belong to the \ML{} type \ttindexbold{term}, which is a concrete datatype
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   392
with six constructors: there are six kinds of term.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   393
\begin{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   394
type indexname = string * int;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   395
infix 9 $;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   396
datatype term = Const of string * typ
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   397
              | Free  of string * typ
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   398
              | Var   of indexname * typ
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   399
              | Bound of int
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   400
              | Abs   of string * typ * term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   401
              | op $  of term * term;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   402
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   403
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   404
\item[\ttindexbold{Const}($a$, $T$)] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   405
is the {\bf constant} with name~$a$ and type~$T$.  Constants include
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   406
connectives like $\land$ and $\forall$ (logical constants), as well as
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   407
constants like~0 and~$Suc$.  Other constants may be required to define the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   408
concrete syntax of a logic.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   409
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   410
\item[\ttindexbold{Free}($a$, $T$)] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   411
is the {\bf free variable} with name~$a$ and type~$T$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   412
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   413
\item[\ttindexbold{Var}($v$, $T$)] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   414
is the {\bf scheme variable} with indexname~$v$ and type~$T$.  An
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   415
\ttindexbold{indexname} is a string paired with a non-negative index, or
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   416
subscript; a term's scheme variables can be systematically renamed by
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   417
incrementing their subscripts.  Scheme variables are essentially free
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   418
variables, but may be instantiated during unification.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   419
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   420
\item[\ttindexbold{Bound} $i$] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   421
is the {\bf bound variable} with de Bruijn index~$i$, which counts the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   422
number of lambdas, starting from zero, between a variable's occurrence and
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   423
its binding.  The representation prevents capture of variables.  For more
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   424
information see de Bruijn \cite{debruijn72} or
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   425
Paulson~\cite[page~336]{paulson91}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   426
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   427
\item[\ttindexbold{Abs}($a$, $T$, $u$)] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   428
is the {\bf abstraction} with body~$u$, and whose bound variable has
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   429
name~$a$ and type~$T$.  The name is used only for parsing and printing; it
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   430
has no logical significance.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   431
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   432
\item[\tt $t$ \$ $u$] \index{$@{\tt\$}|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   433
is the {\bf application} of~$t$ to~$u$.  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   434
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   435
Application is written as an infix operator in order to aid readability.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   436
For example, here is an \ML{} pattern to recognize first-order formula of
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   437
the form~$A\imp B$, binding the subformulae to~$A$ and~$B$:
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   438
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   439
Const("Trueprop",_) $ (Const("op -->",_) $ A $ B)
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   440
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   441
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   442
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   443
\section{Certified terms}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   444
\index{terms!certified|bold}\index{signatures}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   445
A term $t$ can be {\bf certified} under a signature to ensure that every
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   446
type in~$t$ is declared in the signature and every constant in~$t$ is
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   447
declared as a constant of the same type in the signature.  It must be
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   448
well-typed and must not have any `loose' bound variable
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   449
references.\footnote{This concerns the internal representation of variable
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   450
binding using de Bruijn indexes.} Meta-rules such as {\tt forall_elim} take
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   451
certified terms as arguments.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   452
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   453
Certified terms belong to the abstract type \ttindexbold{Sign.cterm}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   454
Elements of the type can only be created through the certification process.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   455
In case of error, Isabelle raises exception~\ttindex{TERM}\@.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   456
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   457
\subsection{Printing terms}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   458
\index{printing!terms|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   459
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   460
Sign.string_of_cterm :      Sign.cterm -> string
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   461
Sign.string_of_term  : Sign.sg -> term -> string
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   462
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   463
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   464
\item[\ttindexbold{Sign.string_of_cterm} $ct$] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   465
displays $ct$ as a string.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   466
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   467
\item[\ttindexbold{Sign.string_of_term} $sign$ $t$] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   468
displays $t$ as a string, using the syntax of~$sign$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   469
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   470
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   471
\subsection{Making and inspecting certified terms}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   472
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   473
Sign.cterm_of   : Sign.sg -> term -> Sign.cterm
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   474
Sign.read_cterm : Sign.sg -> string * typ -> Sign.cterm
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   475
Sign.rep_cterm  : Sign.cterm -> \{T:typ, t:term, 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   476
                                 sign: Sign.sg, maxidx:int\}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   477
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   478
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   479
\item[\ttindexbold{Sign.cterm_of} $sign$ $t$] \index{signatures}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   480
certifies $t$ with respect to signature~$sign$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   481
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   482
\item[\ttindexbold{Sign.read_cterm} $sign$ ($s$, $T$)] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   483
reads the string~$s$ using the syntax of~$sign$, creating a certified term.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   484
The term is checked to have type~$T$; this type also tells the parser what
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   485
kind of phrase to parse.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   486
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   487
\item[\ttindexbold{Sign.rep_cterm} $ct$] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   488
decomposes $ct$ as a record containing its type, the term itself, its
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   489
signature, and the maximum subscript of its unknowns.  The type and maximum
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   490
subscript are computed during certification.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   491
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   492
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   493
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   494
\section{Types}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   495
\index{types|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   496
Types belong to the \ML{} type \ttindexbold{typ}, which is a concrete
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   497
datatype with three constructors.  Types are classified by sorts, which are
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   498
lists of classes.  A class is represented by a string.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   499
\begin{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   500
type class = string;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   501
type sort  = class list;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   502
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   503
datatype typ = Type  of string * typ list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   504
             | TFree of string * sort
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   505
             | TVar  of indexname * sort;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   506
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   507
infixr 5 -->;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   508
fun S --> T = Type("fun",[S,T]);
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   509
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   510
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   511
\item[\ttindexbold{Type}($a$, $Ts$)] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   512
applies the {\bf type constructor} named~$a$ to the type operands~$Ts$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   513
Type constructors include~\ttindexbold{fun}, the binary function space
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   514
constructor, as well as nullary type constructors such
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   515
as~\ttindexbold{prop}.  Other type constructors may be introduced.  In
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   516
expressions, but not in patterns, \hbox{\tt$S$-->$T$} is a convenient
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   517
shorthand for function types.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   518
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   519
\item[\ttindexbold{TFree}($a$, $s$)] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   520
is the {\bf free type variable} with name~$a$ and sort~$s$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   521
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   522
\item[\ttindexbold{TVar}($v$, $s$)] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   523
is the {\bf scheme type variable} with indexname~$v$ and sort~$s$.  Scheme
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   524
type variables are essentially free type variables, but may be instantiated
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   525
during unification.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   526
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   527
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   528
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   529
\section{Certified types}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   530
\index{types!certified|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   531
Certified types, which are analogous to certified terms, have type 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   532
\ttindexbold{Sign.ctyp}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   533
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   534
\subsection{Printing types}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   535
\index{printing!types|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   536
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   537
Sign.string_of_ctyp :      Sign.ctyp -> string
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   538
Sign.string_of_typ  : Sign.sg -> typ -> string
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   539
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   540
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   541
\item[\ttindexbold{Sign.string_of_ctyp} $cT$] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   542
displays $cT$ as a string.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   543
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   544
\item[\ttindexbold{Sign.string_of_typ} $sign$ $T$] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   545
displays $T$ as a string, using the syntax of~$sign$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   546
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   547
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   548
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   549
\subsection{Making and inspecting certified types}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   550
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   551
Sign.ctyp_of  : Sign.sg -> typ -> Sign.ctyp
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   552
Sign.rep_ctyp : Sign.ctyp -> \{T: typ, sign: Sign.sg\}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   553
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   554
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   555
\item[\ttindexbold{Sign.ctyp_of} $sign$ $T$] \index{signatures}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   556
certifies $T$ with respect to signature~$sign$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   557
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   558
\item[\ttindexbold{Sign.rep_ctyp} $cT$] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   559
decomposes $cT$ as a record containing the type itself and its signature.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   560
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   561
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   562
\index{theories|)}