doc-src/Ref/undocumented.tex
author lcp
Wed, 10 Nov 1993 05:00:57 +0100
changeset 104 d8205bb279a7
child 286 e7efbf03562b
permissions -rw-r--r--
Initial revision
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     1
%%%%Currently UNDOCUMENTED low-level functions!  from previous manual
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     2
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     3
%%%%Low level information about terms and module Logic.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     4
%%%%Mainly used for implementation of Pure.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     5
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     6
%move to ML sources?
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     7
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     8
\subsection{Basic declarations}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     9
The implication symbol is {\tt implies}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    10
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    11
The term \verb|all T| is the universal quantifier for type {\tt T}\@.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    12
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    13
The term \verb|equals T| is the equality predicate for type {\tt T}\@.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    14
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    15
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    16
There are a number of basic functions on terms and types.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    17
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    18
\index{--->}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    19
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    20
op ---> : typ list * typ -> typ
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    21
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    22
Given types \([ \tau_1, \ldots, \tau_n]\) and \(\tau\), it
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    23
forms the type \(\tau_1\to \cdots \to (\tau_n\to\tau)\).
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    24
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    25
\index{loose_bnos}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    26
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    27
loose_bnos: term -> int list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    28
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    29
Calling \verb|loose_bnos t| returns the list of all 'loose' bound variable
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    30
references.  In particular, {\tt Bound~0} is loose unless it is enclosed in
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    31
an abstraction.  Similarly {\tt Bound~1} is loose unless it is enclosed in
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    32
at least two abstractions; if enclosed in just one, the list will contain
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    33
the number 0.  A well-formed term does not contain any loose variables.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    34
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    35
Calling {\prog{}type_of \${t}}\index{type_of} computes the type of the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    36
term~$t$.  Raises exception {\tt TYPE} unless applications are well-typed.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    37
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    38
\index{aconv}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    39
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    40
op aconv: term*term -> bool
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    41
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    42
Calling $t\Term{ aconv }u$ tests whether terms~$t$ and~$u$ are
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    43
\(\alpha\)-convertible: identical up to renaming of bound variables.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    44
\begin{itemize}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    45
  \item
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    46
    Two constants, {\tt Free}s, or {\tt Var}s are \(\alpha\)-convertible
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    47
    just when their names and types are equal.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    48
    (Variables having the same name but different types are thus distinct.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    49
    This confusing situation should be avoided!)
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    50
  \item
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    51
    Two bound variables are \(\alpha\)-convertible
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    52
    just when they have the same number.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    53
  \item
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    54
    Two abstractions are \(\alpha\)-convertible
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    55
    just when their bodies are, and their bound variables have the same type.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    56
  \item
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    57
    Two applications are \(\alpha\)-convertible
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    58
    just when the corresponding subterms are.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    59
\end{itemize}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    60
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    61
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    62
\index{incr_boundvars}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    63
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    64
incr_boundvars: int -> term -> term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    65
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    66
This increments a term's `loose' bound variables by a given offset,
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    67
required when moving a subterm into a context
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    68
where it is enclosed by a different number of lambdas.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    69
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    70
\index{abstract_over}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    71
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    72
abstract_over: term*term -> term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    73
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    74
For abstracting a term over a subterm \(v\):
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    75
replaces every occurrence of \(v\) by a {\tt Bound} variable
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    76
with the correct index.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    77
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    78
Calling \verb|subst_bounds|$([u_{n-1},\ldots,u_0],\,t)$\index{subst_bounds}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    79
substitutes the $u_i$ for loose bound variables in $t$.  This achieves
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    80
\(\beta\)-reduction of \(u_{n-1} \cdots u_0\) into $t$, replacing {\tt
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    81
Bound~i} with $u_i$.  For \((\lambda x y.t)(u,v)\), the bound variable
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    82
indices in $t$ are $x:1$ and $y:0$.  The appropriate call is
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    83
\verb|subst_bounds([v,u],t)|.  Loose bound variables $\geq n$ are reduced
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    84
by $n$ to compensate for the disappearance of $n$ lambdas.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    85
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    86
\index{maxidx_of_term}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    87
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    88
maxidx_of_term: term -> int
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    89
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    90
Computes the maximum index of all the {\tt Var}s in a term.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    91
If there are no {\tt Var}s, the result is \(-1\).
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    92
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    93
\index{term_match}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    94
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    95
term_match: (term*term)list * term*term -> (term*term)list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    96
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    97
Calling \verb|term_match(vts,t,u)| instantiates {\tt Var}s in {\tt t} to
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    98
match it with {\tt u}.  The resulting list of variable/term pairs extends
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    99
{\tt vts}, which is typically empty.  First-order pattern matching is used
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   100
to implement meta-level rewriting.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   101
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   102
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   103
\subsection{The representation of object-rules}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   104
The module {\tt Logic} contains operations concerned with inference ---
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   105
especially, for constructing and destructing terms that represent
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   106
object-rules.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   107
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   108
\index{occs}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   109
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   110
op occs: term*term -> bool
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   111
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   112
Does one term occur in the other?
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   113
(This is a reflexive relation.)
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   114
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   115
\index{add_term_vars}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   116
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   117
add_term_vars: term*term list -> term list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   118
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   119
Accumulates the {\tt Var}s in the term, suppressing duplicates.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   120
The second argument should be the list of {\tt Var}s found so far.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   121
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   122
\index{add_term_frees}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   123
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   124
add_term_frees: term*term list -> term list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   125
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   126
Accumulates the {\tt Free}s in the term, suppressing duplicates.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   127
The second argument should be the list of {\tt Free}s found so far.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   128
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   129
\index{mk_equals}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   130
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   131
mk_equals: term*term -> term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   132
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   133
Given $t$ and $u$ makes the term $t\equiv u$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   134
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   135
\index{dest_equals}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   136
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   137
dest_equals: term -> term*term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   138
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   139
Given $t\equiv u$ returns the pair $(t,u)$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   140
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   141
\index{list_implies:}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   142
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   143
list_implies: term list * term -> term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   144
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   145
Given the pair $([\phi_1,\ldots, \phi_m], \phi)$
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   146
makes the term \([\phi_1;\ldots; \phi_m] \Imp \phi\).
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   147
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   148
\index{strip_imp_prems}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   149
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   150
strip_imp_prems: term -> term list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   151
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   152
Given \([\phi_1;\ldots; \phi_m] \Imp \phi\)
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   153
returns the list \([\phi_1,\ldots, \phi_m]\). 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   154
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   155
\index{strip_imp_concl}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   156
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   157
strip_imp_concl: term -> term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   158
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   159
Given \([\phi_1;\ldots; \phi_m] \Imp \phi\)
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   160
returns the term \(\phi\). 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   161
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   162
\index{list_equals}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   163
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   164
list_equals: (term*term)list * term -> term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   165
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   166
For adding flex-flex constraints to an object-rule. 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   167
Given $([(t_1,u_1),\ldots, (t_k,u_k)], \phi)$,
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   168
makes the term \([t_1\equiv u_1;\ldots; t_k\equiv u_k]\Imp \phi\).
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   169
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   170
\index{strip_equals}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   171
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   172
strip_equals: term -> (term*term) list * term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   173
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   174
Given \([t_1\equiv u_1;\ldots; t_k\equiv u_k]\Imp \phi\),
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   175
returns $([(t_1,u_1),\ldots, (t_k,u_k)], \phi)$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   176
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   177
\index{rule_of}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   178
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   179
rule_of: (term*term)list * term list * term -> term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   180
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   181
Makes an object-rule: given the triple
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   182
\[ ([(t_1,u_1),\ldots, (t_k,u_k)], [\phi_1,\ldots, \phi_m], \phi) \]
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   183
returns the term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   184
\([t_1\equiv u_1;\ldots; t_k\equiv u_k; \phi_1;\ldots; \phi_m]\Imp \phi\)
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   185
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   186
\index{strip_horn}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   187
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   188
strip_horn: term -> (term*term)list * term list * term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   189
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   190
Breaks an object-rule into its parts: given
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   191
\[ [t_1\equiv u_1;\ldots; t_k\equiv u_k; \phi_1;\ldots; \phi_m] \Imp \phi \]
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   192
returns the triple
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   193
\(([(t_k,u_k),\ldots, (t_1,u_1)], [\phi_1,\ldots, \phi_m], \phi).\)
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   194
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   195
\index{strip_assums}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   196
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   197
strip_assums: term -> (term*int) list * (string*typ) list * term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   198
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   199
Strips premises of a rule allowing a more general form,
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   200
where $\Forall$ and $\Imp$ may be intermixed.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   201
This is typical of assumptions of a subgoal in natural deduction.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   202
Returns additional information about the number, names,
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   203
and types of quantified variables.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   204
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   205
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   206
\index{strip_prems}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   207
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   208
strip_prems: int * term list * term -> term list * term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   209
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   210
For finding premise (or subgoal) $i$: given the triple
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   211
\( (i, [], \phi_1;\ldots \phi_i\Imp \phi) \)
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   212
it returns another triple,
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   213
\((\phi_i, [\phi_{i-1},\ldots, \phi_1], \phi)\),
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   214
where $\phi$ need not be atomic. Raises an exception if $i$ is out of
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   215
range.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   216
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   217
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   218
\subsection{Environments}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   219
The module {\tt Envir} (which is normally closed)
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   220
declares a type of environments.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   221
An environment holds variable assignments
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   222
and the next index to use when generating a variable.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   223
\par\indent\vbox{\small \begin{verbatim}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   224
    datatype env = Envir of {asol: term xolist, maxidx: int}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   225
\end{verbatim}}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   226
The operations of lookup, update, and generation of variables
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   227
are used during unification.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   228
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   229
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   230
empty: int->env
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   231
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   232
Creates the environment with no assignments
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   233
and the given index.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   234
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   235
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   236
lookup: env * indexname -> term option
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   237
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   238
Looks up a variable, specified by its indexname,
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   239
and returns {\tt None} or {\tt Some} as appropriate.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   240
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   241
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   242
update: (indexname * term) * env -> env
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   243
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   244
Given a variable, term, and environment,
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   245
produces {\em a new environment\/} where the variable has been updated.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   246
This has no side effect on the given environment.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   247
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   248
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   249
genvar: env * typ -> env * term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   250
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   251
Generates a variable of the given type and returns it,
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   252
paired with a new environment (with incremented {\tt maxidx} field).
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   253
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   254
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   255
alist_of: env -> (indexname * term) list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   256
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   257
Converts an environment into an association list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   258
containing the assignments.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   259
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   260
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   261
norm_term: env -> term -> term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   262
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   263
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   264
Copies a term, 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   265
following assignments in the environment,
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   266
and performing all possible \(\beta\)-reductions.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   267
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   268
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   269
rewrite: (env * (term*term)list) -> term -> term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   270
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   271
Rewrites a term using the given term pairs as rewrite rules.  Assignments
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   272
are ignored; the environment is used only with {\tt genvar}, to generate
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   273
unique {\tt Var}s as placeholders for bound variables.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   274
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   275
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   276
\subsection{The unification functions}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   277
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   278
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   279
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   280
unifiers: env * ((term*term)list) -> (env * (term*term)list) seq
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   281
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   282
This is the main unification function.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   283
Given an environment and a list of disagreement pairs,
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   284
it returns a sequence of outcomes.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   285
Each outcome consists of an updated environment and 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   286
a list of flex-flex pairs (these are discussed below).
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   287
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   288
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   289
smash_unifiers: env * (term*term)list -> env seq
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   290
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   291
This unification function maps an environment and a list of disagreement
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   292
pairs to a sequence of updated environments. The function obliterates
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   293
flex-flex pairs by choosing the obvious unifier. It may be used to tidy up
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   294
any flex-flex pairs remaining at the end of a proof.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   295
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   296
\subsubsection{Flexible-flexible disagreement pairs}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   297
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   298
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   299
\subsubsection{Multiple unifiers}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   300
The unification procedure performs Huet's {\sc match} operation
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   301
\cite{huet75} in big steps.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   302
It solves \(\Var{f}(t_1,\ldots,t_p) \equiv u\) for \(\Var{f}\) by finding
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   303
all ways of copying \(u\), first trying projection on the arguments
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   304
\(t_i\).  It never copies below any variable in \(u\); instead it returns a
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   305
new variable, resulting in a flex-flex disagreement pair.  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   306
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   307
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   308
\beginprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   309
type_assign: cterm -> cterm
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   310
\endprog
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   311
Produces a cterm by updating the signature of its argument
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   312
to include all variable/type assignments.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   313
Type inference under the resulting signature will assume the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   314
same type assignments as in the argument.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   315
This is used in the goal package to give persistence to type assignments
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   316
within each proof. 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   317
(Contrast with {\sc lcf}'s sticky types \cite[page 148]{paulson-book}.)
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   318
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   319