home *** CD-ROM | disk | FTP | other *** search
- .\" Copyright (c) 1980 The Regents of the University of California.
- .\" All rights reserved.
- .\"
- .\" Redistribution and use in source and binary forms, with or without
- .\" modification, are permitted provided that the following conditions
- .\" are met:
- .\" 1. Redistributions of source code must retain the above copyright
- .\" notice, this list of conditions and the following disclaimer.
- .\" 2. Redistributions in binary form must reproduce the above copyright
- .\" notice, this list of conditions and the following disclaimer in the
- .\" documentation and/or other materials provided with the distribution.
- .\" 3. All advertising materials mentioning features or use of this software
- .\" must display the following acknowledgement:
- .\" This product includes software developed by the University of
- .\" California, Berkeley and its contributors.
- .\" 4. Neither the name of the University nor the names of its contributors
- .\" may be used to endorse or promote products derived from this software
- .\" without specific prior written permission.
- .\"
- .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- .\" SUCH DAMAGE.
- .\"
- .\" @(#)pumanA.n 6.3 (Berkeley) 4/17/91
- .\"
- .if !\n(xx \{\
- .so tmac.p \}
- .ND
- .nr H1 0
- .af H1 A
- .NH
- Appendix to Wirth's Pascal Report
- .PP
- This section is an appendix to
- the definition of the Pascal language in Niklaus Wirth's
- .I "Pascal Report"
- and, with that Report, precisely defines the
- Berkeley
- implementation.
- This appendix includes a summary of extensions to the language,
- gives the ways in which the undefined specifications were resolved,
- gives limitations and restrictions of the current implementation,
- and lists the added functions and procedures available.
- It concludes with a list of differences with the commonly available
- Pascal 6000\-3.4 implementation,
- and some comments on standard and portable Pascal.
- .NH 2
- Extensions to the language Pascal
- .PP
- This section defines non-standard language constructs available in
- .UP .
- The
- .B s
- standard Pascal option of the translators
- .PI
- and
- .PC
- can be used to detect these extensions in programs which are to be transported.
- .SH
- String padding
- .PP
- .UP
- will pad constant strings with blanks in expressions and as
- value parameters to make them as long as is required.
- The following is a legal
- .UP
- program:
- .LS
- \*bprogram\fP x(output);
- \*bvar\fP z : \*bpacked\fP \*barray\fP [ 1 .. 13 ] \*bof\fP char;
- \*bbegin\fP
- z := 'red';
- writeln(z)
- \*bend\fP;
- .LE
- The padded blanks are added on the right.
- Thus the assignment above is equivalent to:
- .LS
- z := 'red '
- .LE
- which is standard Pascal.
- .SH
- Octal constants, octal and hexadecimal write
- .PP
- Octal constants may be given as a sequence of octal digits followed
- by the character `b' or `B'.
- The forms
- .LS
- write(a:n \*boct\fP)
- .LE
- and
- .LS
- write(a:n \*bhex\fP)
- .LE
- cause the internal representation of
- expression
- .I a,
- which must be Boolean, character, integer, pointer, or a user-defined enumerated
- type,
- to be written in octal or hexadecimal respectively.
- .SH
- Assert statement
- .PP
- An
- .B assert
- statement causes a
- .I Boolean
- expression to be evaluated
- each time the statement is executed.
- A runtime error results if any of the expressions evaluates to be
- .I false .
- The
- .B assert
- statement is treated as a comment if run-time tests are disabled.
- The syntax for
- .B assert
- is:
- .LS
- \*bassert\fP <expr>
- .LE
- .SH
- Enumerated type input-output
- .PP
- Enumerated types may be read and written.
- On output the string name associated with the enumerated
- value is output.
- If the value is out of range,
- a runtime error occurs.
- On input an identifier is read and looked up
- in a table of names associated with the
- type of the variable, and
- the appropriate internal value is assigned to the variable being
- read.
- If the name is not found in the table
- a runtime error occurs.
- .SH
- Structure returning functions
- .PP
- An extension has been added which allows functions
- to return arbitrary sized structures rather than just
- scalars as in the standard.
- .SH
- Separate compilation
- .PP
- The compiler
- .PC
- has been extended to allow separate compilation of programs.
- Procedures and functions declared at the global level
- may be compiled separately.
- Type checking of calls to separately compiled routines is performed
- at load time to insure that the program as a whole
- is consistent.
- See section 5.10 for details.
- .NH 2
- Resolution of the undefined specifications
- .SH
- File name \- file variable associations
- .PP
- Each Pascal file variable is associated with a named
- .UX
- file.
- Except for
- .I input
- and
- .I output,
- which are
- exceptions to some of the rules, a name can become associated
- with a file in any of three ways:
- .IP "\ \ \ \ \ 1)" 10
- If a global Pascal file variable appears in the
- .B program
- statement
- then it is associated with
- .UX
- file of the same name.
- .IP "\ \ \ \ \ 2)"
- If a file was reset or rewritten using the
- extended two-argument form of
- .I reset
- or
- .I rewrite
- then the given name
- is associated.
- .IP "\ \ \ \ \ 3)"
- If a file which has never had
- .UX
- name associated
- is reset or rewritten without specifying a name
- via the second argument, then a temporary name
- of the form `tmp.x'
- is associated with the file.
- Temporary names start with
- `tmp.1' and continue by incrementing the last character in the
- .SM
- USASCII
- .NL
- ordering.
- Temporary files are removed automatically
- when their scope is exited.
- .SH
- The program statement
- .PP
- The syntax of the
- .B program
- statement is:
- .LS
- \*bprogram\fP <id> ( <file id> { , <file id > } ) ;
- .LE
- The file identifiers (other than
- .I input
- and
- .I output )
- must be declared as variables of
- .B file
- type in the global declaration part.
- .SH
- The files input and output
- .PP
- The formal parameters
- .I input
- and
- .I output
- are associated with the
- .UX
- standard input and output and have a
- somewhat special status.
- The following rules must be noted:
- .IP "\ \ \ \ \ 1)" 10
- The program heading
- .B must
- contains the formal parameter
- .I output.
- If
- .I input
- is used, explicitly or implicitly, then it must
- also be declared here.
- .IP "\ \ \ \ \ 2)"
- Unlike all other files, the
- Pascal files
- .I input
- and
- .I output
- must not be defined in a declaration,
- as their declaration is automatically:
- .LS
- \*bvar\fP input, output: text
- .LE
- .IP "\ \ \ \ \ 3)"
- The procedure
- .I reset
- may be used on
- .I input.
- If no
- .UX
- file name has ever been associated with
- .I input,
- and no file name is given, then an attempt will be made
- to `rewind'
- .I input.
- If this fails, a run time
- error will occur.
- .I Rewrite
- calls to output act as for any other file, except that
- .I output
- initially has no associated file.
- This means that a simple
- .LS
- rewrite(output)
- .LE
- associates a temporary name with
- .I output.
- .SH
- Details for files
- .PP
- If a file other than
- .I input
- is to be read,
- then reading must be initiated by a call to the
- procedure
- .I reset
- which causes the Pascal system to attempt to open the
- associated
- .UX
- file for reading.
- If this fails, then a runtime error occurs.
- Writing of a file other than
- .I output
- must be initiated by a
- .I rewrite
- call,
- which causes the Pascal system to create the associated
- .UX
- file and
- to then open the file for writing only.
- .SH
- Buffering
- .PP
- The buffering for
- .I output
- is determined by the value of the
- .B b
- option
- at the end of the
- .B program
- statement.
- If it has its default value 1,
- then
- .I output
- is
- buffered in blocks of up to 512 characters,
- flushed whenever a writeln occurs
- and at each reference to the file
- .I input.
- If it has the value 0,
- .I output
- is unbuffered.
- Any value of
- 2 or more gives block buffering without line or
- .I input
- reference flushing.
- All other output files are always buffered in blocks of 512 characters.
- All output buffers are flushed when the files are closed at scope exit,
- whenever the procedure
- .I message
- is called, and can be flushed using the
- built-in procedure
- .I flush.
- .PP
- An important point for an interactive implementation is the definition
- of `input\(ua'.
- If
- .I input
- is a teletype, and the Pascal system reads a character at the beginning
- of execution to define `input\(ua', then no prompt could be printed
- by the program before the user is required to type some input.
- For this reason, `input\(ua' is not defined by the system until its definition
- is needed, reading from a file occurring only when necessary.
- .SH
- The character set
- .PP
- Seven bit
- .SM USASCII
- is the character set used on
- .UX .
- The standard Pascal
- symbols `and', 'or', 'not', '<=', '>=', '<>',
- and the uparrow `\(ua' (for pointer qualification)
- are recognized.\*(dg
- .FS
- \*(dgOn many terminals and printers, the up arrow is represented
- as a circumflex `^'.
- These are not distinct characters, but rather different graphic
- representations of the same internal codes.
- .FE
- Less portable are the
- synonyms tilde `~'
- for
- .B not ,
- `&' for
- .B and ,
- and `|' for
- .B or .
- .PP
- Upper and lower case are considered to be distinct.\*(st
- .FS
- \*(stThe proposed standard for Pascal considers them to be the same.
- .FE
- Keywords and built-in
- .B procedure
- and
- .B function
- names are
- composed of all lower case letters.
- Thus the identifiers GOTO and GOto are distinct both from each other and
- from the keyword
- \*bgoto\fP.
- The standard type `boolean' is also available as `Boolean'.
- .PP
- Character strings and constants may be delimited by the character
- `\''
- or by the character `#';
- the latter is sometimes convenient when programs are to be transported.
- Note that the `#' character has special meaning
- .up
- when it is the first character on a line \- see
- .I "Multi-file programs"
- below.
- .SH
- The standard types
- .PP
- The standard type
- .I integer
- is conceptually defined as
- .LS
- \*btype\fP integer = minint .. maxint;
- .LE
- .I Integer
- is implemented with 32 bit twos complement arithmetic.
- Predefined constants of type
- .I integer
- are:
- .LS
- \*bconst\fP maxint = 2147483647; minint = -2147483648;
- .LE
- .PP
- The standard type
- .I char
- is conceptually defined as
- .LS
- \*btype\fP char = minchar .. maxchar;
- .LE
- Built-in character constants are `minchar' and `maxchar', `bell' and `tab';
- ord(minchar) = 0, ord(maxchar) = 127.
- .PP
- The type
- .I real
- is implemented using 64 bit floating point arithmetic.
- The floating point arithmetic is done in `rounded' mode, and
- provides approximately 17 digits of precision
- with numbers as small as 10 to the negative 38th power and as large as
- 10 to the 38th power.
- .SH
- Comments
- .PP
- Comments can be delimited by either `{' and `}' or by `(*' and `*)'.
- If the character `{' appears in a comment delimited by `{' and `}',
- a warning diagnostic is printed.
- A similar warning will be printed if the sequence `(*' appears in
- a comment delimited by `(*' and `*)'.
- The restriction implied by this warning is not part of standard Pascal,
- but detects many otherwise subtle errors.
- .SH
- Option control
- .PP
- Options of the translators may be controlled
- in two distinct ways.
- A number of options may appear on the command line invoking the translator.
- These options are given as one or more strings of letters preceded by the
- character `\-' and cause the default setting of
- each given option to be changed.
- This method of communication of options is expected to predominate
- for
- .UX .
- Thus the command
- .LS
- % \*bpi \-l \-s foo.p\fR
- .LE
- translates the file foo.p with the listing option enabled (as it normally
- is off), and with only standard Pascal features available.
- .PP
- If more control over the portions of the program where options are enabled is
- required, then option control in comments can and should be used.
- The
- format for option control in comments is identical to that used in Pascal
- 6000\-3.4.
- One places the character `$' as the first character of the comment
- and follows it by a comma separated list of directives.
- Thus an equivalent to the command line example given above would be:
- .LS
- {$l+,s+ listing on, standard Pascal}
- .LE
- as the first line of the program.
- The `l'
- option is more appropriately specified on the command line,
- since it is extremely unlikely in an interactive environment
- that one wants a listing of the program each time it is translated.
- .PP
- Directives consist of a letter designating the option,
- followed either by a `+' to turn the option on, or by a `\-' to turn the
- option off.
- The
- .B b
- option takes a single digit instead of
- a `+' or `\-'.
- .SH
- Notes on the listings
- .PP
- The first page of a listing
- includes a banner line indicating the version and date of generation of
- .PI
- or
- .PC .
- It also
- includes the
- .UX
- path name supplied for the source file and the date of
- last modification of that file.
- .PP
- Within the body of the listing, lines are numbered consecutively and
- correspond to the line numbers for the editor.
- Currently, two special
- kinds of lines may be used to format the listing:
- a line consisting of a form-feed
- character, control-l, which causes a page
- eject in the listing, and a line with
- no characters which causes the line number to be suppressed in the listing,
- creating a truly blank line.
- These lines thus correspond to `eject' and `space' macros found in many
- assemblers.
- Non-printing characters are printed as the character `?' in the listing.\*(dg
- .FS
- \*(dgThe character generated by a control-i indents
- to the next `tab stop'.
- Tab stops are set every 8 columns in
- .UX .
- Tabs thus provide a quick way of indenting in the program.
- .FE
- .SH
- The standard procedure write
- .PP
- If no minimum field length parameter is specified
- for a
- .I write,
- the following default
- values are assumed:
- .KS
- .TS
- center;
- l n.
- integer 10
- real 22
- Boolean length of `true' or `false'
- char 1
- string length of the string
- oct 11
- hex 8
- .TE
- .KE
- The end of each line in a text file should be explicitly
- indicated by `writeln(f)', where `writeln(output)' may be written
- simply as `writeln'.
- For
- .UX ,
- the built-in function `page(f)' puts a single
- .SM ASCII
- form-feed character on the output file.
- For programs which are to be transported the filter
- .I pcc
- can be used to interpret carriage control, as
- .UX
- does not normally do so.
- .NH 2
- Restrictions and limitations
- .SH
- Files
- .PP
- Files cannot be members of files or members of dynamically
- allocated structures.
- .SH
- Arrays, sets and strings
- .PP
- The calculations involving array subscripts and set elements
- are done with 16 bit arithmetic.
- This
- restricts the types over which arrays and sets may be defined.
- The lower bound of such a range must be greater than or equal to
- \-32768, and the upper bound less than 32768.
- In particular, strings may have any length from 1 to 65535 characters,
- and sets may contain no more than 65535 elements.
- .SH
- Line and symbol length
- .PP
- There is no intrinsic limit on the length of identifiers.
- Identifiers
- are considered to be distinct if they differ
- in any single position over their entire length.
- There is a limit, however, on the maximum input
- line length.
- This limit is quite generous however, currently exceeding 160
- characters.
- .SH
- Procedure and function nesting and program size
- .PP
- At most 20 levels of
- .B procedure
- and
- .B function
- nesting are allowed.
- There is no fundamental, translator defined limit on the size of the
- program which can be translated.
- The ultimate limit is supplied by the
- hardware and thus, on the \s-2PDP\s0-11,
- by the 16 bit address space.
- If
- one runs up against the `ran out of memory' diagnostic the program may yet
- translate if smaller procedures are used, as a lot of space is freed
- by the translator at the completion of each
- .B procedure
- or
- .B function
- in the current
- implementation.
- .PP
- On the \s-2VAX\s0-11, there is an implementation defined limit
- of 65536 bytes per variable.
- There is no limit on the number of variables.
- .SH
- Overflow
- .PP
- There is currently no checking for overflow on arithmetic operations at
- run-time on the \s-2PDP\s0-11.
- Overflow checking is performed on the \s-2VAX\s0-11 by the hardware.
- .br
- .ne 15
- .NH 2
- Added types, operators, procedures and functions
- .SH
- Additional predefined types
- .PP
- The type
- .I alfa
- is predefined as:
- .LS
- \*btype\fP alfa = \*bpacked\fP \*barray\fP [ 1..10 ] \*bof\fP \*bchar\fP
- .LE
- .PP
- The type
- .I intset
- is predefined as:
- .LS
- \*btype\fP intset = \*bset of\fP 0..127
- .LE
- In most cases the context of an expression involving a constant
- set allows the translator to determine the type of the set, even though the
- constant set itself may not uniquely determine this type.
- In the
- cases where it is not possible to determine the type of the set from
- local context, the expression type defaults to a set over the entire base
- type unless the base type is integer\*(dg.
- .FS
- \*(dgThe current translator makes a special case of the construct
- `if ... in [ ... ]' and enforces only the more lax restriction
- on 16 bit arithmetic given above in this case.
- .FE
- In the latter case the type defaults to the current
- binding of
- .I intset,
- which must be ``type set of (a subrange of) integer'' at that point.
- .PP
- Note that if
- .I intset
- is redefined via:
- .LS
- \*btype\fP intset = \*bset of\fP 0..58;
- .LE
- then the default integer set is the implicit
- .I intset
- of
- Pascal 6000\-3.4
- .SH
- Additional predefined operators
- .PP
- The relationals `<' and `>' of proper set
- inclusion are available.
- With
- .I a
- and
- .I b
- sets, note that
- .LS
- (\*bnot\fR (\fIa\fR < \fIb\fR)) <> (\fIa\fR >= \fIb\fR)
- .LE
- As an example consider the sets
- .I a
- = [0,2]
- and
- .I b
- = [1].
- The only relation true between these sets is `<>'.
- .SH
- Non-standard procedures
- .IP argv(i,a) 25
- where
- .I i
- is an integer and
- .I a
- is a string variable
- assigns the (possibly truncated or blank padded)
- .I i \|'th
- argument
- of the invocation of the current
- .UX
- process to the variable
- .I a .
- The range of valid
- .I i
- is
- .I 0
- to
- .I argc\-1 .
- .IP date(a)
- assigns the current date to the alfa variable
- .I a
- in the format `dd mmm yy ', where `mmm' is the first
- three characters of the month, i.e. `Apr'.
- .IP flush(f)
- writes the output buffered for Pascal file
- .I f
- into the associated
- .UX
- file.
- .IP halt
- terminates the execution of the program with
- a control flow backtrace.
- .IP linelimit(f,x)\*(dd
- .FS
- \*(ddCurrently ignored by pdp-11
- .X .
- .FE
- with
- .I f
- a textfile and
- .I x
- an integer expression
- causes
- the program to be abnormally terminated if more than
- .I x
- lines are
- written on file
- .I f .
- If
- .I x
- is less than 0 then no limit is imposed.
- .IP message(x,...)
- causes the parameters, which have the format of those
- to the
- built-in
- .B procedure
- .I write,
- to be written unbuffered on the diagnostic unit 2,
- almost always the user's terminal.
- .IP null
- a procedure of no arguments which does absolutely nothing.
- It is useful as a place holder,
- and is generated by
- .XP
- in place of the invisible empty statement.
- .IP remove(a)
- where
- .I a
- is a string causes the
- .UX
- file whose
- name is
- .I a,
- with trailing blanks eliminated, to be removed.
- .IP reset(f,a)
- where
- .I a
- is a string causes the file whose name
- is
- .I a
- (with blanks trimmed) to be associated with
- .I f
- in addition
- to the normal function of
- .I reset.
- .IP rewrite(f,a)
- is analogous to `reset' above.
- .IP stlimit(i)
- where
- .I i
- is an integer sets the statement limit to be
- .I i
- statements.
- Specifying the
- .B p
- option to
- .I pc
- disables statement limit counting.
- .IP time(a)
- causes the current time in the form `\ hh:mm:ss\ ' to be
- assigned to the alfa variable
- .I a.
- .SH
- Non-standard functions
- .IP argc 25
- returns the count of arguments when the Pascal program
- was invoked.
- .I Argc
- is always at least 1.
- .IP card(x)
- returns the cardinality of the set
- .I x,
- i.e. the
- number of elements contained in the set.
- .IP clock
- returns an integer which is the number of central processor
- milliseconds of user time used by this process.
- .IP expo(x)
- yields the integer valued exponent of the floating-point
- representation of
- .I x ;
- expo(\fIx\fP) = entier(log2(abs(\fIx\fP))).
- .IP random(x)
- where
- .I x
- is a real parameter, evaluated but otherwise
- ignored, invokes a linear congruential random number generator.
- Successive seeds are generated as (seed*a + c) mod m and
- the new random number is a normalization of the seed to the range 0.0 to 1.0;
- a is 62605, c is 113218009, and m is
- 536870912.
- The initial seed
- is 7774755.
- .IP seed(i)
- where
- .I i
- is an integer sets the random number generator seed
- to
- .I i
- and returns the previous seed.
- Thus seed(seed(i))
- has no effect except to yield value
- .I i.
- .IP sysclock
- an integer function of no arguments returns the number of central processor
- milliseconds of system time used by this process.
- .IP undefined(x)
- a Boolean function.
- Its argument is a real number and
- it always returns false.
- .IP wallclock
- an integer function of no arguments returns the time
- in seconds since 00:00:00 GMT January 1, 1970.
- .NH 2
- Remarks on standard and portable Pascal
- .PP
- It is occasionally desirable to prepare Pascal programs which will be
- acceptable at other Pascal installations.
- While certain system dependencies are bound to creep in,
- judicious design and programming practice can usually eliminate
- most of the non-portable usages.
- Wirth's
- .I "Pascal Report"
- concludes with a standard for implementation and program exchange.
- .PP
- In particular, the following differences may cause trouble when attempting
- to transport programs between this implementation and Pascal 6000\-3.4.
- Using the
- .B s
- translator option may serve to indicate many problem areas.\*(dg
- .FS
- \*(dgThe
- .B s
- option does not, however, check that identifiers differ
- in the first 8 characters.
- .I Pi
- and
- .PC
- also do not check the semantics of
- .B packed .
- .FE
- .SH
- Features not available in Berkeley Pascal
- .IP
- Segmented files and associated functions and procedures.
- .IP
- The function
- .I trunc
- with two arguments.
- .IP
- Arrays whose indices exceed the capacity of 16 bit arithmetic.
- .SH
- Features available in Berkeley Pascal but not in Pascal 6000-3.4
- .IP
- The procedures
- .I reset
- and
- .I rewrite
- with file names.
- .IP
- The functions
- .I argc,
- .I seed,
- .I sysclock,
- and
- .I wallclock.
- .IP
- The procedures
- .I argv,
- .I flush,
- and
- .I remove.
- .IP
- .I Message
- with arguments other than character strings.
- .IP
- .I Write
- with keyword
- .B hex .
- .IP
- The
- .B assert
- statement.
- .IP
- Reading and writing of enumerated types.
- .IP
- Allowing functions to return structures.
- .IP
- Separate compilation of programs.
- .IP
- Comparison of records.
- .SH
- Other problem areas
- .PP
- Sets and strings are more general in \*
- .UP ;
- see the restrictions given in
- the
- Jensen-Wirth
- .I "User Manual"
- for details on the 6000\-3.4 restrictions.
- .PP
- The character set differences may cause problems,
- especially the use of the function
- .I chr,
- characters as arguments to
- .I ord,
- and comparisons of characters,
- since the character set ordering
- differs between the two machines.
- .PP
- The Pascal 6000\-3.4 compiler uses a less strict notion of type equivalence.
- In
- .UP ,
- types are considered identical only if they are represented
- by the same type identifier.
- Thus, in particular, unnamed types are unique
- to the variables/fields declared with them.
- .PP
- Pascal 6000\-3.4 doesn't recognize our option
- flags, so it is wise to
- put the control of
- .UP
- options to the end of option lists or, better
- yet, restrict the option list length to one.
- .PP
- For Pascal 6000\-3.4 the ordering of files in the program statement has
- significance.
- It is desirable to place
- .I input
- and
- .I output
- as the first two files in the
- .B program
- statement.
- .sp 2
- .SH
- Acknowledgments
- .PP
- The financial support of William Joy and Susan Graham by
- the National Science Foundation under grants
- MCS74-07644-A04, MCS78-07291, and MCS80-05144,
- and the William Joy by an
- .SM IBM
- Graduate Fellowship are gratefully acknowledged.
-