This appendix gives a more precise description of the direct computation rules than the one given in chapter 8. It should probably be ignored by those who find the previous description adequate, for the details are rather complicated.
The direct computation rules allow one to modify a goal by directing the system to perform certain reduction steps within the conclusion or a hypothesis. The ``direct'' in ``direct computation'' refers to the fact that no well--formedness subgoals are entailed. The present form of these rules, involving ``tagged terms'' as described in chapter 8, was chosen to provide the user with a high degree of control over what reductions are performed. The tagged terms may be somewhat inconvenient at the rule--box level, but it is expected that the vast majority of uses of these rules will be by tactics.
First, we define what it means
to compute a term for n steps (for n a
nonnegative integer).
To do this we define a
function on terms t.
Roughly speaking,
is the result of doing
computation (as described in chapter 5) on t until it can
be done no further or until a total of n reductions have been
done, whichever comes first. The precise definition is as
follows.
If t is not a
term_of term and not a noncanonical term, or if n is
0, then
is t. If t is
term_of(name) then
is
, where
is the term extracted from the theorem
named name. If t is a noncanonical term with one
principal argument e then replace e in t by
to obtain
, and let k be the number
of replacements of redices by contracta done by
. If n>k, and
is a redex, then
is
, where
is the
contractum of
. If t is noncanonical with two
principal arguments (e.g., int_eq) then replace the
leftmost one, e, with
to
obtain
, and let k be the number of reductions done
by
.
If
is not a canonical term of the right
type then
is
; otherwise, it is
, where
is treated as having one (the
second) principal argument.
Having now defined
we can define what it means to do the
computations indicated by a tagging. If T is a term
with tags then the computed form of T is
obtained by successively replacing
subterms of T of the form [[n;t]] or
[[*;t]], where t has no tags in it, by
or
, respectively, where
is defined in the obvious way.
It seems very plausible that one should be able to put
tags anywhere in a term.
Unfortunately, it has not yet been proved that this
would be sound, so there is at present a rather
complicated restriction, based on technical considerations,
on the set of subterm occurrences that can
legally be tagged .
Let T be a term and define a relation
on subterm occurrences of T by
if and only if
u occurs
properly within v. A
may be tagged
if there are u and v with
such that: