Nested_rec.

The contributed library "nested_rec" supplies preliminary support for
making polymorphic mutually recursive datatype definitions which can
contain occurrences of the types being defined within previously
defined polymorphic simple recursive types, such as lists, pairs, etc.
It also provides support for mutually primitive recursive function
definitions over such types. In fact, it's behaviour is almost
identical to that of the library "mutrec".  There is a functor named
NestedRecTypeFunc which you apply to a specification and it causes the
six new theorems (existence, uniqueness, induction, cases, and the
one-to-oneness and distinctness of constructors) to be bound to
identifiers in the top-level environment, and stored in the current
theory under the same names. The names of these theorems are
user-supplied in the input structure, along with the specification.
The functor also defines terms for extracting the arguments of
functional constructors, and binds these definitions, both in the
theory and in the top-level environment, to internally generated
names.
  There is also a function define_mutual_functions (the same as
for "mutrec") for  defining mutually recursive functions over the
datatypes.  It has the type

val define_mutual_functions : {name:string,
                               fixities:fixity list option,
                               rec_axiom:thm,
                               def:term} -> thm

Notice that the fixities of the constructors is given by an optional
list of fixity specifications.  If you wish to only have constructors
with no special fixity status, then you may give NONE as the value for
fixities.  Otherwise, you must use a value such as
SOME[Prefix,Infix 600,...] to specify each speficic fixity status of
each constructor.  Using the value NONE is the same as using the value
SOME[Prefix,...Prefix].
  There is no other documentation, other than some examples given in
the directory "example".

Send queries on this package to

			elsa@research.att.com

