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