Annotation of 43BSDReno/pgrm/lisp/pearl/manual.ms, revision 1.1

1.1     ! root        1: .ND
        !             2: .nr LL 75n
        !             3: .nr LT 80n
        !             4: .rm CF
        !             5: .ds LH PEARL Documentation
        !             6: .rm CH
        !             7: .ds RH Page %
        !             8: .po 1.00i
        !             9: .ls 1
        !            10: .hy 14
        !            11: .RP
        !            12: .TL
        !            13: .LG
        !            14: .LG
        !            15: Using the PEARL AI Package
        !            16: .sp 1
        !            17: .SM
        !            18: \fR(\fIP\fRackage for \fIE\fRfficient \fIA\fRccess to \fIR\fRepresentations in \fIL\fRisp)*
        !            19: .NL
        !            20: .FS
        !            21: * This research was sponsored in part by the Office of Naval Research
        !            22: under contract N00014-80-C-0732 and the National Science Foundation
        !            23: under grant MCS79-06543.
        !            24: .FE
        !            25: .AU
        !            26: Michael Deering
        !            27: Joseph Faletti
        !            28: Robert Wilensky
        !            29: .AI
        !            30: Computer Science Division
        !            31: Department of EECS
        !            32: University of California, Berkeley
        !            33: Berkeley, California 94720
        !            34: .sp 1
        !            35: February 1982
        !            36: .AB
        !            37: This document is a tutorial and manual for PEARL
        !            38: (Package for Efficient Access to Representations in Lisp),
        !            39: an AI language developed with space and time efficiencies in mind.
        !            40: PEARL provides a set of functions for creating hierarchically-defined
        !            41: slot-filler representations and for efficiently and flexibly inserting
        !            42: and fetching them from a forest of associative data bases.
        !            43: In addition to providing the usual facilities such as demons and matching,
        !            44: PEARL introduces stronger typing on slots and user-assisted hashing
        !            45: mechanisms.
        !            46: .AE
        !            47: .NH 0
        !            48: Introduction
        !            49: .PP
        !            50: PEARL (Package for Efficient Access to Representations in Lisp) is
        !            51: a set of functions for creating hierarchically-defined slot-filler
        !            52: representations and for efficiently and flexibly inserting and fetching
        !            53: them from a forest of data bases.
        !            54: Its intended use is in AI programming and it has been used at Berkeley
        !            55: in the development of several AI programs including PAM [7] and
        !            56: PANDORA [8].
        !            57: .PP
        !            58: PEARL has the expressive power found in other AI knowledge
        !            59: representation languages, but is extremely time-space efficient.
        !            60: For example, using a data base of 4000 entries, PEARL takes only
        !            61: about 4.2 CPU milliseconds for an average unsuccessful query and
        !            62: 7.3 CPU milliseconds of an average successful query on a PDP-10.
        !            63: .PP
        !            64: This document describes PEARL's use and is intended for the
        !            65: beginning user.
        !            66: (A description of the implementation of PEARL will be available
        !            67: shortly.)
        !            68: The best way to approach PEARL is to read this document up through
        !            69: section 11 and then to take it to a terminal and reread it, typing
        !            70: in the examples and observing their effects.
        !            71: .PP
        !            72: PEARL was implemented by Michael Deering and Joseph Faletti.
        !            73: It was originally developed on a DEC PDP-10 under UCI Lisp
        !            74: and was subsequently moved to a DEC VAX 11/780 under Franz Lisp
        !            75: with help from Douglas Lanam and Margaret Butler.
        !            76: Both PEARL and its documentation are still
        !            77: being developed, improved, and debugged.
        !            78: Any comments or suggestions will be appreciated.
        !            79: Send them to Joe Faletti via Arpanet or Unix mail
        !            80: (Kim\fB.\fRFaletti\fB@\fRBerkeley or ucbvax\fB!\fRkim\fB.\fRfaletti).
        !            81: .bp
        !            82: .DS
        !            83: .sp 5
        !            84: .DE
        !            85: .NH
        !            86: Running PEARL
        !            87: .PP
        !            88: PEARL is implemented as a set of functions compiled and
        !            89: loaded into Lisp.
        !            90: Thus the full power of Lisp is available in addition to the added
        !            91: power of PEARL.
        !            92: .PP
        !            93: Since PEARL runs under two different Lisps on two different machines,
        !            94: there are a few differences between versions.
        !            95: Most of these differences are in the method of starting PEARL up
        !            96: and in the names of external files accessed by PEARL.
        !            97: The two parts of this section describe how to start up PEARL either
        !            98: under Franz Lisp or under UCI Lisp.
        !            99: You need only read the section which is applicable to your Lisp.
        !           100: .NH 2
        !           101: Under Franz Lisp
        !           102: .PP
        !           103: To access PEARL, simply run the core version of Lisp
        !           104: containing PEARL. On Berkeley Unix, this is available by typing
        !           105: the command:
        !           106: .DS
        !           107:   %  ~bair/bin/pearl
        !           108: .DE
        !           109: or, if ~bair/bin is in your search path, simply:
        !           110: .DS
        !           111:   %  pearl
        !           112: .DE
        !           113: During the startup process, PEARL will read in two
        !           114: files, \fB.init.prl\fR and \fB.start.prl\fR, if they exist.
        !           115: These files are designed for purposes similar to those
        !           116: of \fI.lisprc\fR.
        !           117: However, they split these functions into two groups.
        !           118: In your \fI.init.prl\fR file you should include any
        !           119: expressions which change the user-settable parameters to PEARL.
        !           120: (For example, methods for setting the size of data bases,
        !           121: the print function, and the prompt are described below.)
        !           122: .PP
        !           123: When you wish to have other files read in at startup time,
        !           124: this usually needs to be done after PEARL's parameters are set.
        !           125: PEARL is set up so that after the reading of \fI.init.prl\fR, it sets
        !           126: any necessary parameters which you have not set in your .init.prl
        !           127: and then reads in the file \fI.start.prl\fR if you have one.
        !           128: This is where any processing which requires the
        !           129: attention of PEARL (such as the existence of its data bases)
        !           130: should be placed.
        !           131: Thus \fI.init.prl\fR is primarily for initializing PEARL
        !           132: and \fI.start.prl\fR is for starting up your use of PEARL.
        !           133: \fBNote:\fR unlike most Unix programs which look for startup files
        !           134: only in your home directory, thereby limitting you to only one
        !           135: environment for each program, PEARL looks for each file first in
        !           136: the current directory and if there is none, then it looks in your
        !           137: home directory.
        !           138: This allows you to tailor invocations of PEARL to the kind of work
        !           139: you do in a particular directory.
        !           140: .bp
        !           141: .PP
        !           142: After reading in these two files, PEARL will then place you in a
        !           143: modified prompt-read-eval-print loop, with a default prompt of "PEARL>  ".
        !           144: This can be changed by setting the special variable
        !           145: \fB*pearlprompt*\fR to the desired value.
        !           146: If you want the standard Lisp prompt "->  " to be used by PEARL,
        !           147: you must set \fI*pearlprompt*\fR to \fInil\fR in your \fI.init.prl\fR
        !           148: and PEARL will do the right thing.
        !           149: .PP
        !           150: The primary feature of the PEARL prompt-read-eval-print loop is that
        !           151: it uses a different print function.
        !           152: The default function is
        !           153: .DS
        !           154: (lambda (*printval*)
        !           155:         (valprint  *printval*  4) )
        !           156: .DE
        !           157: but this can be changed to whatever you desire by giving 
        !           158: a new function definition to \fBpearlprintfn\fR.
        !           159: The PEARL prompt-read-eval-print loop also contains a number of
        !           160: features to improve upon the standard Lisp top level.
        !           161: These include a history mechanism and are described in chapter 25.
        !           162: .PP
        !           163: There are quite a few functions from UCI Lisp which have been added
        !           164: to PEARL to make it easier to move programs to Franz Lisp.
        !           165: A list of these with brief documentation of differences is
        !           166: included in an appendix.
        !           167: .NH 2
        !           168: Under UCI Lisp
        !           169: .PP
        !           170: To access PEARL, simply run the core version of Lisp containing PEARL. 
        !           171: On the Berkeley KL-10 system, this is available by typing the system call
        !           172: .DS
        !           173: RU  PEARL[5500,504,PEARL]
        !           174: .DE
        !           175: During the startup process, PEARL will read in two files,
        !           176: INIT.PRL and START.PRL, if they exist.
        !           177: The file INIT.PRL is designed for purposes similar to those
        !           178: of INIT.LSP.
        !           179: In this file you should include any expressions which
        !           180: change the user-settable parameters to PEARL.
        !           181: (For example, methods for setting the size of data bases,
        !           182: the print function, and the prompt are described below.)
        !           183: If you wish to use the REALLOC function to
        !           184: enlarge your memory space, this call should be the
        !           185: last call in your INIT.PRL file.
        !           186: .PP
        !           187: When you wish to have other files read in at startup
        !           188: time, this usually needs to be done after the REALLOC.
        !           189: The common kludge with UCI Lisp to solve this is to define
        !           190: an INITFN (initialization function) which does this and then
        !           191: to reset the INITFN to \fInil\fR which returns you to the
        !           192: standard Lisp prompt-read-eval-print loop.
        !           193: However, PEARL sets the INITFN for its own purposes so
        !           194: that this common "solution" will not work.
        !           195: Instead, PEARL is set up so that after the reading of INIT.PRL,
        !           196: it sets any necessary parameters which you have not set in your
        !           197: INIT.PRL and then reads in the file START.PRL if you have one.
        !           198: This is where any processing which requires the
        !           199: attention of PEARL should be placed.
        !           200: Thus INIT.PRL is primarily for initializing PEARL and
        !           201: START.PRL is for starting up your use of PEARL.
        !           202: .PP
        !           203: After reading in these two files, PEARL will then place you in a
        !           204: modified prompt-read-eval-print loop, with a default prompt of "PEARL>  ".
        !           205: The ">" portion is the (modified) Lisp prompt which is printed
        !           206: whenever \fIread\fR is invoked and can be changed
        !           207: with the UCI Lisp function INITPROMPT.
        !           208: The "PEARL" is PEARL's addition and can be set by
        !           209: setting the special variable \fB*pearlprompt*\fR
        !           210: to the desired value.
        !           211: If you do not want any prompt added by PEARL other than the Lisp
        !           212: prompt you must set \fI*pearlprompt*\fR to \fInil\fR in your
        !           213: INIT.PRL and PEARL will do the right thing.
        !           214: .PP
        !           215: The main feature of the PEARL prompt-read-eval-print loop is
        !           216: that it uses a different print function.
        !           217: The default function is
        !           218: .DS
        !           219: (lambda (*printval*)
        !           220:         (valprint  *printval*  4) )
        !           221: .DE
        !           222: but this can be changed to whatever you desire by giving the
        !           223: function \fBpearlprintfn\fR a new definition.
        !           224: Note that \fIdskin\fR and the break package have been
        !           225: changed slightly to also use of this print function.
        !           226: Also, although the functions names and examples below are in
        !           227: lower case, PEARL in UCI Lisp expects them all in upper
        !           228: case, just as the rest of the UCI Lisp functions.
        !           229: .NH
        !           230: Creating Simple Objects.
        !           231: .PP
        !           232: PEARL allows four basic types of objects.
        !           233: The first two are integers and arbitrary Lisp objects
        !           234: and are created in the usual Lisp fashion.
        !           235: The second two are structured types provided by PEARL,
        !           236: and are stored in an internal form as blocks of memory.
        !           237: These latter types are called \fBsymbols\fR and \fBstructures\fR.
        !           238: .NH 2
        !           239: Defining Symbols
        !           240: .PP
        !           241: \fBSymbol\fRs are PEARL's internal atomic symbols.
        !           242: Semantically they are like Lisp atoms, but are represented
        !           243: and used differently to make PEARL more efficient.
        !           244: Before they are used, symbols must
        !           245: be declared (and thus defined to PEARL) by a call to the function
        !           246: \fBsymbol\fR, which takes as arguments any number of atoms
        !           247: whose names will be used to create symbols.
        !           248: For example,
        !           249: .DS
        !           250: (symbol  John)
        !           251: .DE
        !           252: creates one symbol called John and
        !           253: .DS
        !           254: (symbol  Bob  Carol  Ted  Alice  Home
        !           255:          Office  School  Healthy  NewYork)
        !           256: .DE
        !           257: creates several symbols at one time.
        !           258: \fISymbol\fR is an nlambda (fexpr) and returns
        !           259: a list containing the names of the symbols it created.
        !           260: A one-argument lambda (expr) version is available as \fBsymbole\fR.
        !           261: .PP
        !           262: There are two ways to get at the actual (unique) symbol:
        !           263: you can use the function \fBgetsymbol\fR or you can evaluate the
        !           264: atom whose name is built out of the symbol name with the characters
        !           265: \fBs:\fR on the front.
        !           266: The function \fBsymatom\fR will build this atom for you when
        !           267: given a symbol name.
        !           268: For example, to set B to the symbol Bob use any of:
        !           269: .DS
        !           270: (setq  B  (getsymbol  'Bob) )
        !           271: (setq  B  s:Bob)
        !           272: (setq  B  (eval (symatom 'Bob))
        !           273: .DE
        !           274: .LP
        !           275: Given an internal symbol, you can find out its print name by passing
        !           276: it to the function \fBpname\fR (which also will return the print name
        !           277: of other types of PEARL objects).
        !           278: .NH 2
        !           279: Defining Structures
        !           280: .PP
        !           281: \fBStructure\fRs in PEARL provide the ability to define and manipulate
        !           282: logical groupings of heterogeneous data and are essentially objects
        !           283: with slots and slot fillers.
        !           284: As such, they act more like "records"
        !           285: in Pascal or "structures" in C than Lisp lists.
        !           286: In reality they are more than both, but for the moment the reader
        !           287: should keep records in mind.
        !           288: .PP
        !           289: Just as you must define the form
        !           290: of a record in Pascal before defining the value of a variable whose
        !           291: type is that kind of record, it is necessary to define each particular
        !           292: form of structure you wish to use in PEARL before creating an
        !           293: object with that form.
        !           294: PEARL provides one function called \fBcreate\fR which
        !           295: is used both to define kinds of structures and to
        !           296: create individual instances of these structures.
        !           297: (One function is provided for both because a special individual
        !           298: is created as a side effect of each definition.
        !           299: More on this is provided in section 7 on defaults.)
        !           300: The first argument to \fIcreate\fR distinguishes
        !           301: between a call which defines and one which creates an individual.
        !           302: There are three kinds of defining calls (\fIbase\fR, \fIexpanded\fR
        !           303: and \fIfunction\fR) and two kinds of instance-creating calls
        !           304: (\fIindividual\fR, \fIpattern\fR) to \fIcreate\fR.
        !           305: Only one of each (\fIbase\fR and \fIindividual\fR) is described
        !           306: in this section.
        !           307: The rest are left for later.
        !           308: .PP
        !           309: To start off with an example, let us suppose that you wish to represent
        !           310: the conceptual act "PTrans" from the Conceptual Dependency (CD) notation
        !           311: of Schank.
        !           312: (The examples in this documentation assume a passing
        !           313: familiarity with CD but lack of this should not hurt you too badly
        !           314: and PEARL itself does not restrict you in any way to CD.
        !           315: PTrans stands for Physical Transfer which has four "cases": actor doing
        !           316: the transfer, object being transferred, original location and final
        !           317: location.)
        !           318: First we must define the form which PTrans structures will take.
        !           319: In C this would be a type definition for the type PTrans as
        !           320: follows (assuming a system-provided definition of the type \fIsymbol\fR):
        !           321: .DS
        !           322: struct  PTrans {
        !           323:         symbol  Actor;
        !           324:         symbol  Object;
        !           325:         symbol  From;
        !           326:         symbol  To;
        !           327: };
        !           328: .DE
        !           329: In Pascal this would be
        !           330: .DS
        !           331: type  PTrans  =  record
        !           332:                      Actor  :  symbol;
        !           333:                     Object  :  symbol;
        !           334:                     From  :  symbol;
        !           335:                     To  :  symbol
        !           336:                  end;
        !           337: .DE
        !           338: .LP
        !           339: In PEARL,
        !           340: .DS
        !           341: (create base  PTrans
        !           342:        (Actor  symbol)
        !           343:        (Object  symbol)
        !           344:        (From  symbol)
        !           345:        (To  symbol) )
        !           346: .DE
        !           347: does the job.
        !           348: Note first of all that in order to define a new form
        !           349: of structure, the first argument to \fIcreate\fR must be \fBbase\fR.
        !           350: Note also that the second argument to \fIcreate\fR is the name of the
        !           351: structure form to be created.
        !           352: Following this is a list of (<slotname> <type>) pairs.
        !           353: Structures are currently allowed to have up to 32 slots
        !           354: in Franz PEARL or 18 in UCI Lisp PEARL as long as all slots
        !           355: within a particular structure have mutually distinct names.
        !           356: Different structures may have slots of the same name.
        !           357: Thus in applications of PEARL to CD twenty different structure
        !           358: types might all have an Actor slot.
        !           359: .PP
        !           360: Five types are allowed for slots: \fBsymbol\fR, \fBstruct\fR,
        !           361: \fBint\fR, \fBlisp\fR, and \fBsetof <type>\fR.
        !           362: \fISymbol\fR and \fIstruct\fR are the types just described.
        !           363: \fIInt\fR is a normal Lisp integer value.
        !           364: The type \fIlisp\fR allows arbitrary \fBnon-atomic\fR Lisp values.
        !           365: Finally, \fIsetof <type>\fR allows you to define sets consisting
        !           366: of all symbols (\fIsetof symbol\fR) or all structures (\fIsetof struct\fR)
        !           367: and can be done recursively (\fIsetof setof struct\fR).
        !           368: .NH
        !           369: Creating Individual Instances of Defined Structures
        !           370: .PP
        !           371: Once you have defined a specific form of structure like PTrans, you
        !           372: can create an individual PTrans using \fBindividual\fR as the first
        !           373: argument to \fIcreate\fR and the name of the base structure you want
        !           374: an individual instance of as the second argument.
        !           375: The rest of the arguments are (<slotname> <value>) pairs in which
        !           376: the <value> must be of the type that the slot was declared to be.
        !           377: The slots may be listed in any order and need not be in the same
        !           378: order as defined.
        !           379: For example, to create an instance of John going home
        !           380: from the office (i.e., John PTransing himself from the office to
        !           381: home) you would use this call to \fIcreate\fR:
        !           382: .DS
        !           383: (create individual  PTrans
        !           384:        (Actor  John)
        !           385:        (Object  John)
        !           386:        (From  Office)
        !           387:        (To  Home) )
        !           388: .DE
        !           389: \fICreate\fR will return an object of type PTrans, with the slots filled
        !           390: in as indicated.
        !           391: The object returned has been created and stored as
        !           392: a \fIhunk\fR of memory in Franz Lisp or a block of memory in Binary
        !           393: Program Space in the UCI Lisp (rather than Free Storage where most
        !           394: Lisp objects are stored).
        !           395: Since you are using the PEARL prompt-read-eval-print loop,
        !           396: the object returned by \fIcreate\fR will be printed in an external list
        !           397: form, something like the above.
        !           398: However, if you print a structure using the standard Lisp print
        !           399: functions (as for example some break packages will do), it will
        !           400: be printed by Franz Lisp in the normal way it prints hunks.
        !           401: (Warning: Since the structure actually contains a circular
        !           402: reference to another hunk, this will cause problems with programs
        !           403: which do not set \fIprinlevel\fR in Franz Lisp so general packages which
        !           404: you wish to add to PEARL should be modified to use some PEARL
        !           405: print function.)
        !           406: With UCI Lisp's normal print function, it will show up as an
        !           407: address in Binary Program Space, looking something like "#31534".
        !           408: .PP
        !           409: As with any Lisp function that returns an object,
        !           410: we must store (a pointer to) the result of \fIcreate\fR somewhere
        !           411: (for example, in the atom Trip)
        !           412: if we wish to reference it in the future.
        !           413: Otherwise, the created object will be inaccessible.
        !           414: (This point is clearer if you consider
        !           415: that Pascal would insist that you do something with the result
        !           416: of the function call, although PEARL and many languages like Lisp
        !           417: and C in which every subprogram is a value-returning function allow
        !           418: you to construct a value and then blithely go on your way without
        !           419: using it.)
        !           420: .PP
        !           421: To store (a pointer to) the instance returned by \fIcreate\fR in
        !           422: the atom Trip, you could do the following:
        !           423: .DS
        !           424: (setq  Trip  (create individual  PTrans
        !           425:                     (Actor  John)
        !           426:                     (Object  John)
        !           427:                     (From  Office)
        !           428:                     (To  Home) ) )
        !           429: .DE
        !           430: Since this is a common operation, \fIcreate\fR provides the option of
        !           431: having (a pointer to) the newly created instance automatically
        !           432: assigned to a Lisp atom.
        !           433: This is accomplished by including the
        !           434: name of the atom as the third argument to \fIcreate\fR.
        !           435: If the third argument to \fIcreate\fR is an atom rather than a
        !           436: (<slotname> <value>) pair, \fIcreate\fR stores the new
        !           437: object in this atom.
        !           438: Thus the effect of the previous example can be achieved by:
        !           439: .DS
        !           440: (create individual  PTrans  Trip
        !           441:        (Actor  John)
        !           442:        (Object  John)
        !           443:        (From  Office)
        !           444:        (To  Home) )
        !           445: .DE
        !           446: (In addition, when \fIcreate base PTrans\fR is used, an assignment is
        !           447: automatically made to the atom PTrans, thus making the defaultinstance
        !           448: of a structure easily available.
        !           449: To preserve this, calls to create of the form
        !           450: \fI(create individual PTrans PTrans ...)\fR are disallowed (that
        !           451: is, ignored).
        !           452: In case you should actually wish to use the atom PTrans for other
        !           453: purposes, evaluating the atom built by prepending \fBi:\fR onto
        !           454: the structure name will give you the default instance of a base
        !           455: structure and evaluating the atom built by prepending \fBd:\fR
        !           456: will give you the actual definition.
        !           457: Changing the value of these atoms is \fBvery dangerous\fR.
        !           458: Given the name of a structure, the functions \fBinstatom\fR and
        !           459: \fBdefatom\fR will construct these atoms for you.
        !           460: For more information about the item assigned to \fIPTrans\fR
        !           461: and \fIi:PTrans\fR, see the section 7 on defaults.)
        !           462: .PP
        !           463: PTrans is an example of a structure whose slots are all
        !           464: of the type \fIsymbol\fR.
        !           465: A more complex example is that of MTrans (Mental Transfer:
        !           466: an actor transfering a concept (Mental Object) from one place
        !           467: to another (usually from himself to someone else).
        !           468: The MObject slot is some other act and so would be of
        !           469: type \fIstruct\fR resulting in the following definition:
        !           470: .DS
        !           471: (create base  MTrans
        !           472:        (Actor  symbol)
        !           473:        (MObject  struct)
        !           474:        (From  symbol)
        !           475:        (To  symbol) )
        !           476: .DE
        !           477: A sample instance of MTrans is \fIJohn told Carol that he
        !           478: was going home from the office\fR and would be created with
        !           479: .DS
        !           480: (create individual  MTrans  InformLeaving
        !           481:        (Actor  John)
        !           482:        (MObject  (PTrans  Leaving
        !           483:                           (Actor  John)
        !           484:                           (Object  John)
        !           485:                           (From  Office)
        !           486:                           (To  Home) ) )
        !           487:        (From  John)
        !           488:        (To  Carol) )
        !           489: .DE
        !           490: .LP
        !           491: Note that to fill a slot of type \fIstruct\fR (or \fIsetof struct\fR)
        !           492: with a structure value within a
        !           493: \fIcreate\fR one just embeds the appropriate arguments for a recursive
        !           494: call to \fIcreate\fR, \fIexcept\fR that you \fBmay\fR leave out
        !           495: \fIindividual\fR since it would just be repetitive.
        !           496: If you should want to create an object of another type within
        !           497: an individual or base structure, you must include the alternative
        !           498: argument (\fIindividual\fR, \fIbase\fR, \fIpattern\fR, \fIexpanded\fR,
        !           499: or \fIfunction\fR) before the type name.
        !           500: This is particularly useful when you wish to create a pattern
        !           501: with an individual instance in one of its slots.
        !           502: .PP
        !           503: The optional third argument of an atom name for storing
        !           504: in may be included at each level if you wish.
        !           505: In the example above, \fIcreate\fR actually will create two
        !           506: new instances, an MTrans which will be stored in InformLeaving,
        !           507: and a PTrans which is pointed to by the MObject slot of the
        !           508: MTrans and is also pointed to by Leaving.
        !           509: In this case, neither InformLeaving nor Leaving is required.
        !           510: If Leaving were left out, then one would still have a way
        !           511: to get at the PTrans via the MObject slot of the MTrans that 
        !           512: InformLeaving points to.
        !           513: However, if InformLeaving were left out and the
        !           514: result of the call to \fIcreate\fR were not stored any other way,
        !           515: there is one more way that the MTrans would be accessible.
        !           516: The value of the most recently created object is always
        !           517: stored in the special variable \fB*lastcreated*\fR by
        !           518: \fIcreate\fR so the value of the MTrans would remain
        !           519: accessible until the next call to \fIcreate\fR.
        !           520: Note that if there are recursive calls to \fIcreate\fR during this
        !           521: time in order to process structure values in slots, the value of
        !           522: \fI*lastcreated*\fR is continually changing to the most recent
        !           523: one and the setting of \fI*lastcreated*\fR is the last thing
        !           524: \fIcreate\fR does.
        !           525: There is also a special variable called \fB*currenttopcreated*\fR
        !           526: which is set by \fIcreate\fR at the top level call as soon as
        !           527: the space for an individual or default instance is allocated.
        !           528: Since it is sometimes handy for a piece of user code which
        !           529: runs during \fIcreate\fR (see the sections on !, $, predicates and
        !           530: demons) to be able to access the topmost object,
        !           531: \fI*currenttopcreated*\fR is sometimes quite useful.
        !           532: .PP
        !           533: As in C and Pascal, one can embed to any level.
        !           534: \fICreate\fR does not have facilities
        !           535: for more complex networks of structures, as there are other
        !           536: functions in PEARL which allow their construction.
        !           537: \fICreate\fR is mainly used to create objects for other
        !           538: functions to manipulate.
        !           539: .NH
        !           540: Accessing Slots of Structures
        !           541: .PP
        !           542: In C and Pascal one can access the slots of a record or structure by
        !           543: using dot notation.
        !           544: For example, in Pascal the To slot of the MObject slot of
        !           545: the MTrans pointed to by InformLeaving would be accessed
        !           546: with the expression InformLeaving.MObject.To (or perhaps
        !           547: more accurately InformLeaving\fB^\fR.MObject\fB^\fR.To
        !           548: since slots really contain pointers to objects).
        !           549: In Pascal and C, there are essentially only two things that
        !           550: one can do to a slot of a record or structure: access it
        !           551: (get its value) and assign to it (give it a new value).
        !           552: In PEARL the macro \fBpath\fR provides
        !           553: a large number of ways to access and/or change the values
        !           554: in slots of individual structures.
        !           555: (In the UCI Lisp version this is called \fIppath\fR
        !           556: to distinguish it from the system function \fIpath\fR.)
        !           557: A call to \fIpath\fR is of the following general form:
        !           558: .DS
        !           559: (path  <Selector>  <Structure>  <Slot-Name-or-List>  <Value>)
        !           560: .DE
        !           561: <Selector> determines the action to be performed
        !           562: and is not evaluated.
        !           563: <Structure> should evaluate to the object in which the slot
        !           564: occurs (or in whose depths the object occurs).
        !           565: <Slot-Name-or-List> should evaluate either to the atom name of the
        !           566: slot desired in <Structure> or a list of the slot names
        !           567: which one must follow to get down to the slot.
        !           568: <Value> (which is only needed when it makes sense) 
        !           569: should evaluate to the value to be put into the slot
        !           570: (or otherwise used in performing the function).
        !           571: At this point, we will only describe the two <Selector>s
        !           572: corresponding to accessing and assigning.
        !           573: These are \fBget\fR and \fBput\fR respectively.
        !           574: Thus to access the value of a slot, you would use
        !           575: .DS
        !           576: (path  get  <Structure>  <Slot-Name-or-List>)
        !           577: .DE
        !           578: (No value is needed;
        !           579: the purpose of this call is to get the value.)
        !           580: To assign a value to a slot, you would use
        !           581: .DS
        !           582: (path  put  <Structure>  <Slot-Name-or-List>  <Value>)
        !           583: .DE
        !           584: For example, to access the Actor slot of the PTrans in Trip, either of
        !           585: the following is appropriate:
        !           586: .DS
        !           587: (path  get  Trip  'Actor)
        !           588: (path  get  Trip  '(Actor) )
        !           589: .DE
        !           590: This is essentially equivalent to a reference to
        !           591: \fITrip\fB^\fI.Actor\fR in Pascal.
        !           592: .PP
        !           593: To access a slot within a structure in a slot of type \fIstruct\fR, 
        !           594: add the slot names to the <Slot-Name-or-List>, just as we access
        !           595: embedded fields within fields in Pascal by adding more slots
        !           596: to the accessing expression.
        !           597: For example, to access the place
        !           598: John told Carol he was going in our MTrans example above, we
        !           599: want the To slot of the MObject slot of the MTrans stored in
        !           600: InformLeaving:
        !           601: .DS
        !           602: (path  get  InformLeaving  '(MObject To) )
        !           603: .DE
        !           604: This is essentially equivalent to a reference to
        !           605: \fIInformLeaving\fB^\fI.MObject\fB^\fI.To\fR in Pascal.
        !           606: PEARL will check each slot reference, and will indicate if
        !           607: a slot name is not found (perhaps due to a misspelling or an
        !           608: unbound slot).
        !           609: .PP
        !           610: Similarly, to change the Actor of our PTrans in Trip to be Bob:
        !           611: .DS
        !           612: (path  put  Trip  '(Actor)   (getsymbol  'Bob) )
        !           613: .DE
        !           614: and to change the To slot within the MObject of the MTrans:
        !           615: .DS
        !           616: (path  put  InformLeaving  '(MObject  To)   (getsymbol  'School) )
        !           617: .DE
        !           618: which is essentially equivalent to assigning a value to
        !           619: \fIInformLeaving\fB^\fI.MObject\fB^\fI.To\fR in Pascal.
        !           620: Note that the order of the arguments to these functions is in
        !           621: \fBnot like\fR the argument ordering of \fIputprop\fR.
        !           622: .PP
        !           623: \fBCAUTION\fR:
        !           624: \fIPath\fR does not check values to ensure that they are of the
        !           625: correct type before putting them in a slot.
        !           626: Also, a change in a structure with \fIpath\fR
        !           627: does not cause it to be reinserted in the data base
        !           628: (see the next section).
        !           629: Thus, before changing a structure, one should remove it from
        !           630: the data base and then reinsert it after the change.
        !           631: .PP
        !           632: These functions were gathered under the macro \fIpath\fR because of
        !           633: their similarity.
        !           634: However, if you prefer to have the action being performed lead off the
        !           635: function name in keeping with \fIputprop\fR, \fIget\fR, \fIputd\fR,
        !           636: \fIgetd\fR, etc., these two functions are also available as
        !           637: \fBputpath\fR and \fBgetpath\fR with similar names also provided for
        !           638: all the other forms of path described below.
        !           639: Thus the name "path" may be tacked onto the end of one of the action
        !           640: selectors to \fIpath\fR but the rest of the arguments to these
        !           641: functions remain the same.
        !           642: .PP
        !           643: There are quite a few other operations which are allowed through
        !           644: \fIpath\fR which you will not need or understand until you have read
        !           645: the rest of this documentation.
        !           646: We describe them here for completeness but suggest you skip
        !           647: to the next section during your first reading.
        !           648: If you feel there is one missing, feel free to suggest it since
        !           649: they are easy to add.
        !           650: .IP
        !           651: \fIpath \fBclear\fR or \fBclearpath\fR -- sets the selected path to
        !           652: the standard default value for its type (\fInilsym\fR,
        !           653: \fInilstruct\fR, zero or \fInil\fR).
        !           654: Note that this is only the standard default and does
        !           655: not inherit a default from above.
        !           656: See section 7 for more on default values.
        !           657: .IP
        !           658: \fIpath \fBaddset\fR or \fBaddsetpath\fR -- add the specified value to
        !           659: a slot of type \fIsetof\fR.
        !           660: .IP
        !           661: \fIpath \fBdelset\fR or \fBdelsetpath\fR -- delete the specified value
        !           662: from a slot of type \fIsetof\fR.
        !           663: .IP
        !           664: \fIpath \fBgetpred\fR or \fBgetpredpath\fR -- get the list of
        !           665: predicates on the slot.
        !           666: .IP
        !           667: \fIpath \fBaddpred\fR or \fBaddpredpath\fR -- add the specified
        !           668: predicate to the predicates on the slot.
        !           669: .IP
        !           670: \fIpath \fBdelpred\fR or \fBdelpredpath\fR -- delete the specified
        !           671: predicate from the predicates on the slot.
        !           672: .IP
        !           673: \fIpath \fBgethook\fR or \fBgethookpath\fR -- get the assoc-list of 
        !           674: hooks (demons) on the slot.
        !           675: .IP
        !           676: \fIpath \fBapply\fR or \fBapplypath\fR -- arguments to this function
        !           677: are a <Function-or-Lambda-Body>, followed by the <Structure>, and
        !           678: <Slot-Name-or-List>.
        !           679: The <Function-or-Lambda-Body> is applied to the value of the slot.
        !           680: (In the UCI Lisp version, \fIapply#\fR is used so that macros will work.
        !           681: In the Franz Lisp version, a PEARL-supplied version of \fIapply\fR
        !           682: called \fBapply*\fR is used which also handles macros "right".)
        !           683: .PP
        !           684: (Skip this next paragraph until you have read about hashing and
        !           685: the data bases.)
        !           686: The method of processing the path in \fBpath\fR functions allows a
        !           687: form of indirection through the data base that is sometimes
        !           688: helpful when you use symbols in slots as unique pointers to
        !           689: other structures.
        !           690: Suppose you had the following definitions:
        !           691: .DS
        !           692: (create base  Person
        !           693:        (* Identity  symbol)
        !           694:        (   Name  lisp) )
        !           695: .DE
        !           696: .DS
        !           697: (dbcreate individual  Person
        !           698:          (Identity  John)
        !           699:          (Name  (John  Zappa) )
        !           700: .DE
        !           701: and you want to ask \fI"what is the Name of the Person in the
        !           702: Actor slot of Trip (above)"\fR which you might normally write as:
        !           703: .DS
        !           704: (getpath  (fetch  (create pattern  Person
        !           705:                          (Identity  !  (getpath  Trip  'Actor) ) ) )
        !           706:           'Name)
        !           707: .DE
        !           708: This is very hard to understand.
        !           709: A shorthand for this is the following:
        !           710: .DS
        !           711: (getpath  Trip  '(Actor  Person  Name) )
        !           712: .DE
        !           713: which behaves like this:  when \fIpath\fR gets to the symbol in
        !           714: the Actor slot of Trip, it notices that there is still more path
        !           715: to follow.
        !           716: It then interprets the next symbol in the path as the
        !           717: name of a type and does a quick equivalent of fetch of a Person
        !           718: with its first slot set to John.
        !           719: It then continues to follow the path specified in this new
        !           720: structure, finishing up with the value of the Name slot
        !           721: of the structure.
        !           722: (Note that this depends on Person structures being hashed by the
        !           723: relevant slot and will fail otherwise.
        !           724: Also note that the tendency of most users of PEARL has been away
        !           725: from the use of symbols as indirections to larger structures and
        !           726: toward actually putting the larger structure in the slot.
        !           727: In this case this would imply putting the Person structure in the
        !           728: Actor slot of PTrans and eliminate the need for "Person" in the
        !           729: path list.)
        !           730: .NH
        !           731: Storing In and Retrieving From the Data Base -- The Simplest Way
        !           732: .PP
        !           733: So far we have shown how to create structures and have treated
        !           734: them pretty much like C structures or Pascal records.
        !           735: However, PEARL's most important departures from these languages
        !           736: involve its data base facilities.
        !           737: PEARL's data base can be thought of as one large
        !           738: bag into which any structure can be placed.
        !           739: The data base can hold hundreds, even thousands of separate objects.
        !           740: There are two basic operations that can be performed upon
        !           741: the data base, inserting with the function \fIinsertdb\fR
        !           742: and retrieving with a combination of the functions
        !           743: \fIfetch\fR and \fInextitem\fR.
        !           744: .NH 2
        !           745: Storing In the Data Base: \fIInsertdb\fR and \fIRemovedb\fR
        !           746: .PP
        !           747: While the simplest forms of these actions are
        !           748: relatively straightforward, the power and efficiency of PEARL
        !           749: derives from the nuances and controls available with these
        !           750: functions which take up much of the rest of this document.
        !           751: Much of the power develops from knowledge provided by the user about
        !           752: how each kind of structure is likely to be retrieved (and therefore
        !           753: how it should be stored).
        !           754: Thus, the data base benefits from knowing as much as possible
        !           755: in advance about the objects that will be placed within it.
        !           756: This information is provided by using a large variety
        !           757: of extra flags during definition calls to \fIcreate\fR.
        !           758: It is used by \fIinsertdb\fR to hash objects into a specific
        !           759: \fIhash bucket\fR in the data base, by \fIfetch\fR to retrieve the
        !           760: correct hash bucket from the data base, and by \fInextitem\fR
        !           761: to filter the desired objects from this bucket.
        !           762: .PP
        !           763: PEARL allows the construction and use of multiple data bases which are
        !           764: described in detail later.
        !           765: Without exerting any effort, a data base is automatically created
        !           766: called \fB*maindb*\fR and pointed to by the special variable \fB*db*\fR.
        !           767: In general, all PEARL functions which deal with a data base have an
        !           768: optional last argument which specifies which data base to use.
        !           769: If it is missing, then the default data base pointed to by
        !           770: \fI*db*\fR is assumed.
        !           771: Thus you can change the default data base
        !           772: simply by assigning the desired data base to \fI*db*\fR.
        !           773: For simplicity, this optional data base argument is not
        !           774: mentioned in the following discussion.
        !           775: .PP
        !           776: The function \fBinsertdb\fR takes a single structure argument and
        !           777: inserts it into the data base.
        !           778: In its simplest form \fIinsertdb\fR requires no user flags on the
        !           779: definitions of structures.
        !           780: In this case, \fIinsertdb\fR simply hashes on the type of the
        !           781: structure regardless of its specific contents so that each
        !           782: entry ends up in a bucket with all other entries of that type.
        !           783: For example, to insert into the data base the PTrans which was
        !           784: saved in the Lisp variable Trip above, you simply provide it as an
        !           785: argument to \fIinsertdb\fR:
        !           786: .DS
        !           787: (insertdb  Trip)
        !           788: .DE
        !           789: We could also put the PTrans (saved in Leaving whose To slot
        !           790: was changed to School) which was the MObject of the MTrans above
        !           791: in the data base with:
        !           792: .DS
        !           793: (insertdb  Leaving)
        !           794: .DE
        !           795: Since no information has been provided by the user about how to
        !           796: efficiently distinguish PTranses in general, these two will be stored
        !           797: in the same bucket (as will all PTranses).
        !           798: When inserting an item into a bucket, \fIinsertdb\fR will check
        !           799: to ensure that this specific item is not already in that bucket
        !           800: (using \fIeq\fR) and will only insert it if
        !           801: it is not already there, thus avoiding duplicates.
        !           802: .PP
        !           803: The function \fBremovedb\fR takes a single structure argument
        !           804: and removes it from any place in the data base where it has been
        !           805: put using \fIeq\fR to determine equality.
        !           806: .PP
        !           807: Since one often wants to create an individual and then insert it into
        !           808: the data base, there is a macro \fBdbcreate\fR provided whose
        !           809: arguments are precisely like \fIcreate\fR.
        !           810: Thus, \fI(dbcreate individual PTrans ....)\fR expands into
        !           811: \fI(insertdb (create individual PTrans ....) )\fR.
        !           812: .NH 2
        !           813: Retrieving Hash Buckets From the Data Base: Fetch
        !           814: .PP
        !           815: .hy next-item
        !           816: The simplest case of fetching from the data base is
        !           817: equivalent to asking if a particular, completely defined
        !           818: object is in the data base.
        !           819: This is performed by a combination of the functions 
        !           820: fIfetch\fR and \fInextitem\fR.
        !           821: The first step is to retrieve the hash bucket(s) for the object.
        !           822: For example, to determine whether the object stored in Trip is in the
        !           823: data base, the first step is to call the function \fBfetch\fR and
        !           824: store what it returns (the form of what is returned is described
        !           825: below):
        !           826: .DS
        !           827: (setq  PotentialTrips  (fetch  Trip) )
        !           828: .DE
        !           829: .PP
        !           830: The function \fIfetch\fR takes a single structure argument which is
        !           831: called the \fBpattern\fR.
        !           832: What \fIfetch\fR returns includes this pattern and the hash bucket(s)
        !           833: from the data base which contain those structures which are
        !           834: most likely to "match".
        !           835: The rules of "matching" are fairly complex and are described in
        !           836: detail in section 20, but for the moment it is enough to know that
        !           837: two structures match if their respective slots contain equal values.
        !           838: Thus matching is closer to Lisp's \fIequal\fR than to \fIeq\fR.
        !           839: .NH 2
        !           840: Accessing the Results of a Fetch: Nextitem.
        !           841: .PP
        !           842: Conceptually, what \fIfetch\fR returns is a restricted type of \fBstream\fR.
        !           843: A stream is a "virtual" list, whose items are computed only as needed.
        !           844: When a fetch from the data base is performed, the pattern provided
        !           845: is only used to construct a stream containing that pattern and the
        !           846: appropriate hash bucket from the data base;
        !           847: no matching (comparing)
        !           848: between the pattern and objects in the data base occurs.
        !           849: Thus the stream contains pointers to all data base items in the
        !           850: same hash bucket, regardless of their likelihood of matching the pattern.
        !           851: Therefore, the \fIstream\fR or "virtual list" returned by \fIfetch\fR is
        !           852: in fact bigger than the list of actual items which match.
        !           853: (For this reason, the default PEARL print function only prints how
        !           854: many potential items are in the stream.)
        !           855: .PP
        !           856: For our purposes, you should regard the object that \fIfetch\fR
        !           857: returns to be a funny sort of black box, whose only use is as
        !           858: an argument to the function \fBnextitem\fR.
        !           859: \fINextitem\fR will compute the next element to be removed from the stream.
        !           860: When elements are extracted from the stream with the function \fInextitem\fR,
        !           861: the pattern is "matched" against successive items from the hash bucket
        !           862: until one matches (and is returned) or until the potential items run out
        !           863: (and \fInil\fR is returned).
        !           864: .PP
        !           865: \fINextitem\fR is very much like the function \fIpop\fR in Lisp because it
        !           866: updates the status of the stream to reflect the
        !           867: extraction of the "topmost element" similar to the way \fIpop\fR replaces
        !           868: its list argument with its \fIcdr\fR.
        !           869: \fINextitem\fR does this by destructively modifying the stream
        !           870: (but not the hash bucket);
        !           871: once the top item
        !           872: has come off it is no longer a part of the stream.
        !           873: Like \fIpop\fR, \fInextitem\fR returns \fInil\fR if the stream is empty.
        !           874: .PP
        !           875: A stream, as returned by \fIfetch\fR in PotentialTrips,
        !           876: will \fBnever\fR be \fInil\fR but instead will be a list.
        !           877: In all cases, the first element will be the atom \fB*stream*\fR.
        !           878: In most cases, the second element (\fIcadr\fR) is the pattern (object
        !           879: being fetched) and the rest (\fIcddr\fR) is
        !           880: the hash bucket that the object hashes to.
        !           881: However, it is entirely possible for the hash bucket to either
        !           882: fail to contain any instances of the object, or to contain
        !           883: multiple instances of the object.
        !           884: The form that is printed by PEARL's default print function is:
        !           885: the atom \fB*stream:*\fR, the object being fetched,
        !           886: and the number of potential items in the stream,
        !           887: avoiding the prining of a lengthy result.
        !           888: (If the pattern is actually a function structure, then the atom
        !           889: used is \fB*function-stream:*\fR.)
        !           890: .PP
        !           891: Thus, to actually determine whether the object in Trip is in the data
        !           892: base, it is necessary to ask for the \fInextitem\fR in the bucket of
        !           893: the stream PotentialTrips (that is, in the \fIcddr\fR)
        !           894: which matches the object being fetched (that is, the \fIcadr\fR
        !           895: of PotentialTrips):
        !           896: .DS
        !           897: (setq  FirstResult  (nextitem  PotentialTrips) )
        !           898: (setq  SecondResult  (nextitem  PotentialTrips) )
        !           899: .DE
        !           900: If nothing matching Trip occurred in the data base, FirstResult would
        !           901: contain \fInil\fR;
        !           902: otherwise, it would contain an object in the data base
        !           903: which matches Trip.
        !           904: If you have typed in all the examples we have shown you above,
        !           905: then FirstResult will contain the same value as Trip.
        !           906: SecondResult will be \fInil\fR.  (The only other object in the same
        !           907: bucket is the value of Leaving, but that does not match because
        !           908: its To slot contains School after the \fIpath put\fR above.)
        !           909: If the two structures in Trip and Leaving both contained
        !           910: the same slot fillers, they would both match Trip and each
        !           911: would be returned by \fInextitem\fR on successive calls.
        !           912: .PP
        !           913: This is essentially the only type of fetching that is
        !           914: useful with the information presented so far,
        !           915: but more powerful types will be described shortly.
        !           916: .PP
        !           917: Since the functions \fIcreate\fR, \fIfetch\fR, and \fInextitem\fR
        !           918: are often used in combination, several macros combining them are
        !           919: provided by PEARL:
        !           920: .IP
        !           921: When you wish to create a pattern only long enough to use it as an
        !           922: argument to \fIfetch\fR, you can use the macro \fBfetchcreate\fR
        !           923: which is defined in such a way that \fI(fetchcreate blah)\fR is
        !           924: equivalent to \fI(fetch (create blah) )\fR ).
        !           925: .IP
        !           926: If you want to do a \fIfetchcreate\fR in a function definition and
        !           927: you wish the pattern to be created only once but used each time
        !           928: this function is called (a potential savings in space and time),
        !           929: the macro \fBinlinefetchcreate\fR will call \fIcreate\fR when it
        !           930: expands and then expand to a call to fetch with this pattern.
        !           931: .IP
        !           932: If you want to do a \fIcreate\fR in a function definition and
        !           933: you wish the object to be created only once,
        !           934: the macro \fBinlinecreate\fR will call \fIcreate\fR when it
        !           935: expands and effectively replace itself with the result.
        !           936: .IP
        !           937: When you wish to fetch but only need the resulting stream long
        !           938: enough to use it as an argument to \fInextitem\fR, you can use
        !           939: the macro \fBfirstfetch\fR which is defined in such a way that
        !           940: \fI(firstfetch blah)\fR is equivalent to \fI(nextitem (fetch blah) )\fR ).
        !           941: .IP
        !           942: If your only goal in fetching some fully-specified object is to
        !           943: test for its existence in the data base, the function \fBindb\fR
        !           944: which expects a single structure argument will return \fInil\fR
        !           945: if it is not there, and non-\fInil\fR if it is.
        !           946: (Note that \fIindb\fR uses \fIstrequal\fR rather than \fImatch\fR.)
        !           947: .IP
        !           948: It is sometimes convenient to have a list of all the items which would be
        !           949: returned by successive calls to \fInextitem\fR on a stream.
        !           950: The function \fBstreamtolist\fR expects a stream argument and
        !           951: returns a list of the items which the stream would produce.
        !           952: .NH
        !           953: The Default Values for Unspecified Slots
        !           954: .PP
        !           955: When creating an instance of a given type, one may not always
        !           956: wish to fill in all the slots of the structure, either because
        !           957: the slot value is unknown or immaterial.
        !           958: PEARL has a mechanism for filling unfilled slots with default values.
        !           959: The simplest form of defaulting involves two
        !           960: predefined objects, \fBnilsym\fR and \fBnilstruct\fR.
        !           961: \fINilsym\fR is a \fIsymbol\fR, and roughly corresponds to Lisp's
        !           962: \fInil\fR when \fInil\fR is viewed as an atom.
        !           963: \fINilstruct\fR is a structure without any slots,
        !           964: and corresponds to a null structure.
        !           965: In the absence of a specified value, PEARL will fill in slots
        !           966: of an individual instance of a structure being created
        !           967: with \fInilsym\fR if the slot type is \fIsymbol\fR,
        !           968: \fInilstruct\fR if the slot type is \fIstruct\fR, zero if the slot
        !           969: is of type \fIint\fR, and Lisp \fInil\fR
        !           970: if the slot is of type \fIlisp\fR or \fIsetof <any type>\fR.
        !           971: Note that it is up to the user to decide upon the meaning of
        !           972: \fInilsym\fR and \fInilstruct\fR during further processing.
        !           973: For example, you must decide for your own application whether
        !           974: a \fInilstruct\fR filling the MObject slot of a MTrans indicates
        !           975: that nothing was said or that what was said is unknown.
        !           976: .PP
        !           977: Often you may desire closer control over the default values of
        !           978: a particular slot within individual instances.
        !           979: For example, suppose you had a definition of Person that
        !           980: includes several pieces of information about a person:
        !           981: .DS
        !           982: (create base  Person
        !           983:        (Identity  symbol)
        !           984:        (Age  int)
        !           985:        (Salary  int)
        !           986:        (Health  symbol) )
        !           987: .DE
        !           988: The Identity slot would be filled in with a unique symbol for
        !           989: that person (such as the symbol John), the Age slot would contain
        !           990: the age in years, the Salary slot would get the person's monthy salary
        !           991: in dollars, and the Health slot would contain a \fIsymbol\fR indicating
        !           992: their state of health.
        !           993: Now in creating an individual instance of a Person
        !           994: the Identity slot should be always filled in, but we may desire the
        !           995: other slots to be defaulted to 30 (years), 20000 (dollars) and Healthy.
        !           996: However, under the default system described so far, these would be
        !           997: defaulted to zero, zero and \fInilsym\fR.
        !           998: PEARL provides the ability to specify individual defaults for
        !           999: each slot of a particular structure type.
        !          1000: This is done at \fIbase\fR creation time by following the type
        !          1001: within a slot with the new default value.
        !          1002: Thus our definition of Person would be:
        !          1003: .DS
        !          1004: (create base  Person
        !          1005:        (Identity  symbol)
        !          1006:        (Age  int  30)
        !          1007:        (Salary  int  20000)
        !          1008:        (Health  symbol  Healthy) )
        !          1009: .DE
        !          1010: Although the main purpose of a call to \fIcreate base\fR is to define
        !          1011: a structure, it also creates a special individual of the type
        !          1012: being defined which has its slots filled with the default values.
        !          1013: For this reason this individual is called the \fBdefault instance\fR
        !          1014: of that type.
        !          1015: It is a structure instance like any other, only a
        !          1016: pointer to it is kept with the type definition, and it is consulted
        !          1017: whenever an instance of that type is constructed.
        !          1018: Thus the default values (either the user-defined defaults or
        !          1019: the standard defaults) will always be used whenever the user
        !          1020: declines to fill in a slot of a structure instance.
        !          1021: For more on defaults, see the discussion of inheriting in
        !          1022: section 19 on creating expanded structures.
        !          1023: .NH
        !          1024: Using Patterns For More Flexible and Powerful Retrieval
        !          1025: .PP
        !          1026: If the fetching mechanisms described so far were the
        !          1027: only sort of fetching that we could do, \fIfetch\fR
        !          1028: (and PEARL) would not be very useful.
        !          1029: What is needed is a way to only partially specify the
        !          1030: values in the structure to be fetched.
        !          1031: Note that the default mechanism does not accomplish this,
        !          1032: since all slots are specified at creation time, even if they
        !          1033: get \fInilsym\fR, \fInilstruct\fR, or \fInil\fR for a value.
        !          1034: What is needed is the ability to specify a \fIdon't care\fR
        !          1035: value for slots whose values should not affect the matching
        !          1036: process during retrieval.
        !          1037: The easiest way to accomplish this in PEARL is to create
        !          1038: a type of object called a \fBpattern\fR.
        !          1039: A \fIpattern\fR is similar to an \fIindividual\fR instance of
        !          1040: a structure except that a special pattern-matching variable
        !          1041: called \fB?*any*\fR which means \fIdon't care\fR or \fImatch anything\fR
        !          1042: is used as the default value for unspecified slots.
        !          1043: (The reason for its name will be clear after the description
        !          1044: of pattern-matching variables later in this section.
        !          1045: Even more detail on pattern-matching variables and more powerful
        !          1046: patterns is provided in sections 21-23 on the matching process,
        !          1047: blocks, lexically scoped variables, and the
        !          1048: unbinding of variables.)
        !          1049: .PP
        !          1050: Patterns are created with \fIcreate\fR using \fIpattern\fR
        !          1051: as the first argument.
        !          1052: Other than this, their syntax is exactly the same as individuals.
        !          1053: An example of a \fIpattern\fR creation is:
        !          1054: .DS
        !          1055: (create pattern  PTrans  JohnWentSomewhere
        !          1056:        (Actor  John)
        !          1057:        (Object  John) )
        !          1058: .DE
        !          1059: This pattern would match any instance of PTrans in which John
        !          1060: was both the actor and the object being moved.
        !          1061: (Note that this pattern is stored in the Lisp variable
        !          1062: JohnWentSomewhere in the same way as other individuals.)
        !          1063: The main use of patterns is as arguments to \fIfetch\fR, as in:
        !          1064: .DS
        !          1065: (setq  PotentialGoings  (fetch  JohnWentSomewhere) )
        !          1066: .DE
        !          1067: \fIFetch\fR will return a stream containing all PTranses in the
        !          1068: data base in which John was the actor and object, regardless
        !          1069: what the From and To slots contain.
        !          1070: More complex examples can be created.
        !          1071: Patterns can be embedded as in:
        !          1072: .DS
        !          1073: (create pattern  MTrans  InformJohnGoingSomewhere
        !          1074:        (MObject  (PTrans  (Actor  John)
        !          1075:                           (Object  John) ) ) )
        !          1076: .DE
        !          1077: Since all unspecified slots are filled with ?*any*, this pattern
        !          1078: will return any MTranses concerning any of John's PTranses
        !          1079: when passed to \fIfetch\fR.
        !          1080: Thus, if we insert InformLeaving from above in the data base:
        !          1081: .DS
        !          1082: (insertdb  InformLeaving)
        !          1083: .DE
        !          1084: then the following will fetch that object:
        !          1085: .DS
        !          1086: (nextitem  (fetch  InformJohnGoingSomewhere) )
        !          1087: .DE
        !          1088: .PP
        !          1089: Usually one is interested in a more specific piece of information.
        !          1090: For example, if you knew that John told Carol something and wanted
        !          1091: to find out what it was, then you could do this two ways.
        !          1092: One is to create a pattern, fetch it and look at the MObject slot of
        !          1093: the result:
        !          1094: .DS
        !          1095: (create pattern  MTrans  WhatDidJohnTellCarol
        !          1096:        (Actor  John)
        !          1097:        (From  John)
        !          1098:        (To  Carol) )
        !          1099: (setq  Result  (firstfetch  WhatDidJohnTellCarol) )
        !          1100: (path  get  Result  'MObject)
        !          1101: .DE
        !          1102: However, you might prefer to use a pattern which explicitly
        !          1103: shows that you want that value and gives you a slightly easier
        !          1104: way to get at it.
        !          1105: In this case, you can specify a pattern-matching variable
        !          1106: in the MObject slot of the pattern.
        !          1107: A pattern-matching variable is created by preceding an atom with a
        !          1108: question mark \fB?\fR as in \fI?What\fR.
        !          1109: The question mark is a read macro character which reads the next
        !          1110: atom and builds the list \fI(*var* What)\fR out of it (or
        !          1111: \fI(*global* What)\fR if \fIWhat\fR has previously been declared
        !          1112: global to PEARL;
        !          1113: see below for more on global variables.).
        !          1114: During matching, this variable will get bound to the value
        !          1115: of the slot it gets matched against:
        !          1116: .DS
        !          1117: (create individual  MTrans  WhatDidJohnTellCarol
        !          1118:        (Actor  John)
        !          1119:        (MObject  ?What)
        !          1120:        (From  John)
        !          1121:        (To  Carol) )
        !          1122: (firstfetch  WhatDidJohnTellCarol)
        !          1123: .DE
        !          1124: To access the value of a pattern-matching variable in
        !          1125: a structure, one uses either the function \fBvalueof\fR
        !          1126: (which is an expr) or the fexpr \fBvarvalue\fR.
        !          1127: Both functions have two arguments: the name of the
        !          1128: pattern-matching variable whose value you want and
        !          1129: the structure it occurs in (which is evaluated internally
        !          1130: by \fIvarvalue\fR).
        !          1131: Thus both of the following are equivalent:
        !          1132: .DS
        !          1133: (valueof   \fB'\fRWhat  WhatDidJohnTellCarol)
        !          1134: (varvalue  What  WhatDidJohnTellCarol)
        !          1135: .DE
        !          1136: .NH
        !          1137: Marking Structures During Creation For More Efficient Retrieval
        !          1138: .PP
        !          1139: Besides specifying what type each structure is, the simplest
        !          1140: piece of information that \fIinsertdb\fR would like the user
        !          1141: to give it through \fIcreate\fR concerns which slot(s) of
        !          1142: a type would be most likely to contain unique information
        !          1143: about a particular instance of that type.
        !          1144: This information is used to differentiate instances of the
        !          1145: type from each other, so that they will be hashed into
        !          1146: different hash buckets.
        !          1147: This is similar to the "keys" that many data base systems ask for.
        !          1148: For PTrans, the Actor slot is often the best choice for this role.
        !          1149: For Person, the Identity slot would be the best choice for this role.
        !          1150: Such unique slots are indicated to \fIcreate\fR when defining a
        !          1151: type by placing an asterisk '*' before the slotname in a
        !          1152: (<slotname> <type>) pair.
        !          1153: For example, our new definitions of PTrans and Person
        !          1154: to take advantage of this would look like:
        !          1155: .DS
        !          1156: (create base  PTrans
        !          1157:        (* Actor  symbol)
        !          1158:        (   Object  symbol)
        !          1159:        (   From  symbol)
        !          1160:        (   To  symbol) )
        !          1161: (create base  Person
        !          1162:        (* Identity  symbol)
        !          1163:        (   Age  int  30)
        !          1164:        (   Salary  int  20000)
        !          1165:        (   Health  symbol  Healthy) )
        !          1166: .DE
        !          1167: If you execute this when you have already executed the other examples
        !          1168: in this document, PEARL will warn you that you are redefining the
        !          1169: base structures PTrans and Person.
        !          1170: This is all right, since that is precisely what we want to happen.
        !          1171: However, the previous instances of PTrans will remain hashed in the
        !          1172: more inefficient way and will not match any later PTrans structures
        !          1173: that are defined. 
        !          1174: If you find these warnings annoying when redefining structures,
        !          1175: they may be turned off by setting the special variable
        !          1176: \fB*warn*\fR to \fInil\fR instead of the initial \fIt\fR.
        !          1177: (Note that the Lisp scanner requires a space (or other
        !          1178: white space) to separate the asterisk from the slotname.
        !          1179: Otherwise one would have the slotname \fI*Actor\fR).
        !          1180: .PP
        !          1181: Any number of starred slots may be provided within a structure
        !          1182: definition, but usually only one or two are necessary.
        !          1183: How one decides which slots should be starred is an
        !          1184: art, and depends significantly on your application and the nature
        !          1185: of your data.
        !          1186: The basic rule of thumb is to choose those slots
        !          1187: whose values vary the most widely from instance to instance.
        !          1188: A bad choice will not usually cause the system to bomb or
        !          1189: operate incorrectly in any way, but when it comes time to
        !          1190: fetch an object back out of the data base the system may have
        !          1191: to take the time to scan a large amount of the data base
        !          1192: rather than finding the desired object very rapidly.
        !          1193: Thus execution time is usually the only penalty one pays
        !          1194: for an improper choice of slots to star.
        !          1195: .PP
        !          1196: However, there is one type of use of a slot which can cause
        !          1197: problems in combination with hashing information.
        !          1198: It involves the use of pattern-matching variables and will
        !          1199: serve as a useful example of how to use variables and of how
        !          1200: \fIinsertdb\fR and \fIfetch\fR use the hashing
        !          1201: information to insert and find objects.
        !          1202: The key difference between them is that while \fIinsertdb\fR
        !          1203: inserts an object in as many places as it can, \fIfetch\fR only
        !          1204: looks for it in the \fBbest\fR place.
        !          1205: (What we mean by best will be more obvious after section 13.)
        !          1206: .PP
        !          1207: The problem situation occurs when you wish to insert items
        !          1208: into the data base which contain a variable in the starred
        !          1209: slot (representing general knowledge) and then use,
        !          1210: as a pattern, a structure with that slot filled.
        !          1211: Thus, the following sequence will fail to find Thing
        !          1212: in the data base and instead will return \fInil\fR:
        !          1213: .DS
        !          1214: (create base  Thing
        !          1215:        (*  One  int) )
        !          1216: .DE
        !          1217: .DS
        !          1218: (dbcreate individual  Thing  DBThing
        !          1219:          (One  ?O)
        !          1220:          (Two  2) )
        !          1221: .DE
        !          1222: .DS
        !          1223: (nextitem (fetchcreate individual  Thing  PatThing
        !          1224:                       (One  1)
        !          1225:                       (Two  2) )
        !          1226: .DE
        !          1227: This fails \fIsimply because of the hashing\fR.
        !          1228: Let us see why.
        !          1229: When \fIinsertdb\fR is asked to put something into the data base,
        !          1230: it seeks to put it as many places as the hashing information
        !          1231: indicates are good places to want to look for it.
        !          1232: With no hashing information at all, the only thing \fIinsertdb\fR
        !          1233: can do is to put the object with all other objects of its type.
        !          1234: Thus, with no hashing information, all Things are put together in
        !          1235: the same hash bucket.
        !          1236: With the hashing information, \fIinsertdb\fR would like to put
        !          1237: DBThing in a second (and better) place based on the fact that it
        !          1238: is a Thing \fIand\fR on the value of its One slot.
        !          1239: Unfortunately, its One slot has an unbound variable in it and does
        !          1240: not provide any information which is useful.
        !          1241: Thus the hashing process puts DBThing into the data base in 
        !          1242: only one place.
        !          1243: However, when \fIfetch\fR indexes PatThing, it uses the hashing
        !          1244: information to determine that it should look in the data base
        !          1245: under the best combination which is \fIThing + 1\fR.
        !          1246: Since DBThing is not there, it is not found.
        !          1247: If we remove the asterisk, this sequence will return
        !          1248: DBThing with ?O bound to 1 because both DBThing and PatThing will
        !          1249: get indexed into the same spot (along with all other Things).
        !          1250: Thus you should be very careful when determining how to hash 
        !          1251: types of structures when you intend to insert them into
        !          1252: the data base with variables in them.
        !          1253: (An alternative solution which could be more efficient if used
        !          1254: carefully is to use the function \fIfetcheverywhere\fR which is
        !          1255: described in section 13.
        !          1256: This problem can also sometimes be solved with the use of adjunct
        !          1257: variables, described in section 14.)
        !          1258: .PP
        !          1259: After more of the system has been described and examples of fetching
        !          1260: and inserting have been given the user will have a better
        !          1261: understanding of this process.
        !          1262: .PP
        !          1263: As another example, let us now create and insert an instance
        !          1264: of our new PTrans which has the Actor slot starred:
        !          1265: .DS
        !          1266: (dbcreate individual  PTrans  Trip
        !          1267:          (Actor  John)
        !          1268:          (Object  John)
        !          1269:          (From  Office)
        !          1270:          (To  Home) ) 
        !          1271: .DE
        !          1272: This would insert Trip with all other PTranses and, because of the
        !          1273: starred slot Actor, also with any other PTranses with a value of
        !          1274: John in the Actor slot.
        !          1275: Next we redefine and recreate the MTrans:
        !          1276: .DS
        !          1277: (create base  MTrans 
        !          1278:        (*  Actor  symbol)
        !          1279:        (    MObject  struct)
        !          1280:        (    From  symbol)
        !          1281:        (    To  symbol) )
        !          1282: .DE
        !          1283: .DS
        !          1284: (create individual  MTrans  InformLeaving
        !          1285:        (Actor  John)
        !          1286:        (MObject  (PTrans  Leaving
        !          1287:                           (Actor  John)
        !          1288:                           (Object  John)
        !          1289:                           (From  Office)
        !          1290:                           (To  Home) ) )
        !          1291:        (From  John)
        !          1292:        (To  Carol) )
        !          1293: .DE
        !          1294: reinsert the PTrans from the MTrans:
        !          1295: .DS
        !          1296: (insertdb  Leaving)
        !          1297: .DE
        !          1298: and finally create and insert two other instances of a PTrans,
        !          1299: one with different values in the From and To slots
        !          1300: and one with different values in the Actor and Object slot:
        !          1301: .DS
        !          1302: (create individual  PTrans  Trip
        !          1303:        (Actor  John)
        !          1304:        (Object  John)
        !          1305:        (From  Home)
        !          1306:        (To  School) ) 
        !          1307: .DE
        !          1308: .DS
        !          1309: (create individual  PTrans
        !          1310:        (Actor  Ted)
        !          1311:        (Object  Ted)
        !          1312:        (From  Office)
        !          1313:        (To  Home) )
        !          1314: .DE
        !          1315: Note that this last PTrans will be indexed under the combination
        !          1316: of PTrans and Ted and thus will not be in the same hash bucket we
        !          1317: look in when fetching Trip (which is indexed by PTrans and John):
        !          1318: .DS
        !          1319: (setq  PotentialTrips  (fetch  Trip) )
        !          1320: (setq  Result  (nextitem  PotentialTrips)
        !          1321: PotentialTrips
        !          1322: .DE
        !          1323: Notice the form of the stream PotentialTrips at this point.
        !          1324: .NH
        !          1325: Printing Structures, Symbols and Other PEARL Objects
        !          1326: .PP
        !          1327: As mentioned in the beginning, PEARL stores symbols and
        !          1328: structures (and their definitions) in hunks of memory
        !          1329: that are circularly linked.
        !          1330: Lisp cannot print out the contents of these blocks in a useful way.
        !          1331: Franz Lisp sometimes goes into an infinite loop trying to print them
        !          1332: and the best UCI Lisp can do is tell you its address,
        !          1333: like #2934, which is not very informative.
        !          1334: As mentioned above, the PEARL prompt-read-eval-print loop knows how
        !          1335: to print these in symbolic form.
        !          1336: However, when you want your own programs to print
        !          1337: them, PEARL provides you with two pairs of functions
        !          1338: to convert these blocks into more readable form.
        !          1339: The first we will discuss is the function \fBvalform\fR.
        !          1340: \fIValform\fR takes a \fIstruct\fR, a \fIsymbol\fR or any other type
        !          1341: of PEARL or Lisp object as an argument and returns a
        !          1342: Lisp S-expression describing the object.
        !          1343: Thus if one calls \fIvalform\fR on our PTrans in Trip:
        !          1344: .DS
        !          1345: (setq  TripAsList  (valform  Trip) )
        !          1346: .DE
        !          1347: the Lisp variable TripAsList will contain the S-expression:
        !          1348: .DS
        !          1349: (PTrans (Actor John) (Object John) (From Home) (To School) )
        !          1350: .DE
        !          1351: Note that \fIvalform\fR does not cause the PTrans to be printed out
        !          1352: at the user's terminal, it is merely a function that returns an
        !          1353: S-expression (just as the Lisp function \fIlist\fR does.)
        !          1354: PEARL functions will operate upon structures and symbols only
        !          1355: when they are in their internal form, so the primary reason
        !          1356: for converting structures to S-expressions is to print them
        !          1357: (or to modify them for use as new input to \fIcreate\fR).
        !          1358: So PEARL provides a more useful function \fBvalprint\fR
        !          1359: that is effectively \fI(sprint (valform <argument>) )\fR.
        !          1360: (\fBSprint\fR is a function provided by UCI Lisp or Franz PEARL
        !          1361: which prints a Lisp expression in a nicely indented form.
        !          1362: There are more details on \fIsprint\fR in the appendix on UCI Lisp
        !          1363: functions added to PEARL.)
        !          1364: \fIValprint\fR is normally used within a Lisp program to
        !          1365: print out any PEARL construct onto the user's terminal
        !          1366: and it is also used by the default print function in the
        !          1367: PEARL prompt-read-eval-print loop.
        !          1368: Try typing the following and notice that they are the
        !          1369: same except that the second value is slightly indented.
        !          1370: .DS
        !          1371: (valprint  Trip)
        !          1372: Trip
        !          1373: .DE
        !          1374: Like \fIsprint\fR, \fIvalprint\fR will accept a second integer
        !          1375: argument telling it which column to start printing in.
        !          1376: The default \fIpearlprintfn\fR uses a value of 4 for this argument
        !          1377: to make the items typed by the user more distinguisable from the 
        !          1378: results typed by PEARL.
        !          1379: .PP
        !          1380: There is one other form of each of these two functions.
        !          1381: The functions \fBfullform\fR and \fBfullprint\fR are
        !          1382: like \fIvalform\fR and \fIvalprint\fR but they print
        !          1383: more complete information.
        !          1384: If you type
        !          1385: .DS
        !          1386: (fullprint  Trip)
        !          1387: .DE
        !          1388: you will notice that the result has two mysterious
        !          1389: \fInil\fRs in each slot.
        !          1390: These represent other forms of information (predicates
        !          1391: and hooks or demons) which can be added to structures
        !          1392: and which will be described later.
        !          1393: At the moment therefore, \fIvalform\fR and \fIvalprint\fR
        !          1394: are all that the user need remember.
        !          1395: .PP
        !          1396: Note also from above that when a pattern with \fI?*any*\fR is printed,
        !          1397: only the name of that variable is printed, and not its value.
        !          1398: (Try typing JohnWentSomewhere and InformJohnGoingSomewhere
        !          1399: if you do not remember what this looked like.)
        !          1400: If a PEARL pattern-matching variable has not been bound,
        !          1401: PEARL indicates this by printing no value.
        !          1402: If a variable is bound, both the variable name and
        !          1403: its value are printed.
        !          1404: Later when you learn how to put your own variables
        !          1405: in slots, this will become more useful.
        !          1406: .PP
        !          1407: When given a data base, these functions assume that the user does
        !          1408: not really want the complete contents of the data base printed out
        !          1409: and so simply print \fI(database: <databasename>)\fR.
        !          1410: To actually have the complete contents of a data base printed out,
        !          1411: use the function \fBprintdb\fR.
        !          1412: With no argument, it prints the default data base.
        !          1413: Otherwise, it expects its argument to evaluate to a data base.
        !          1414: A print function which prints all the internal information contained
        !          1415: in a structure or its definition is \fBdebugprint\fR.
        !          1416: .NH
        !          1417: Error Messages, Bugs, and Error Handling Abilities
        !          1418: .PP
        !          1419: Due to the complex implemention of PEARL and the lack
        !          1420: of facilities in Lisp for easily distinguishing between
        !          1421: types of input, a user's error in using PEARL will not
        !          1422: show up as soon as it occurs, but may instead cause some
        !          1423: unfathomable part of PEARL to bomb out sometime later.
        !          1424: If this should happen, the user might try using the Lisp
        !          1425: trace facilities, but will often find little useful information.
        !          1426: This sad state of affairs is currently unavoidable due to the 
        !          1427: difficulty of catching user errors where they first occur.
        !          1428: This is partly due to our inability to predict what kinds of
        !          1429: errors users are most likely to make.
        !          1430: .PP
        !          1431: PEARL checks as much as it can, but many features are impossible
        !          1432: or prohibitively expensive to check.
        !          1433: The best strategy for the
        !          1434: user to follow is to examine his last interaction with PEARL.
        !          1435: If the error occurred in the bowels of \fIcreate\fR, then there is a
        !          1436: good chance that the user did something wrong in the details of
        !          1437: a slot description in the call to \fIcreate\fR, since gross structural
        !          1438: errors in such calls are checked for.
        !          1439: Inspect your call closely.
        !          1440: .PP
        !          1441: Other errors can be even more difficult, since a function call
        !          1442: may blow up or fail to produce the desired result due to bad
        !          1443: data passed to \fIcreate\fR several calls ago.
        !          1444: A general rule of thumb to use in tracking down mystifying
        !          1445: errors is to check out the definitions of the structures
        !          1446: involved in the function that failed.
        !          1447: Thus if \fIpath\fR blows up, one should determine the type of
        !          1448: the structure passed to \fIpath\fR, and then check the 
        !          1449: \fIcreate\fR call that defined that type.
        !          1450: .PP
        !          1451: Sometimes PEARL may appear to the user to be doing the wrong thing,
        !          1452: but due to PEARL's complex semantics, the user is really at fault.
        !          1453: To make matters worse, there is of course always the chance that
        !          1454: the error really \fBis\fR in PEARL.
        !          1455: Every effort has been made to minimize this chance, and at the
        !          1456: moment there are no known major errors (except those indicated
        !          1457: in this documentation), but as with any complex evolving
        !          1458: software system there is always the chance of obscure errors.
        !          1459: It has been our experience that most errors
        !          1460: are due to the user (including the implementors) not completely
        !          1461: understanding the semantics of some PEARL feature.
        !          1462: This documentation is an effort to minimize this type of error.
        !          1463: For any error which you commit in which PEARL gives what
        !          1464: you consider an unreasonable response, feel free to report
        !          1465: it and we will consider trying to catch it.
        !          1466: These or any other complaints, bugs or suggestions should be
        !          1467: mailed to Joe Faletti via Arpanet or Unix mail
        !          1468: (Kim.Faletti@Berkeley or ucbvax!kim.faletti).
        !          1469: .NH
        !          1470: Short-Circuiting and Redirecting Create Using !, $ and Atoms
        !          1471: .PP
        !          1472: Sometimes, when creating an individual structure,
        !          1473: one may want to fill a slot with an already created structure
        !          1474: that is pointed to by some atom or returned by some function
        !          1475: (or with whatever type of value the slot requires).
        !          1476: In this case, one does not wish to (or cannot) describe the
        !          1477: value for a slot as a list of atoms.
        !          1478: To handle this situation, PEARL allows you to list a Lisp expression
        !          1479: which evaluates to the desired internal form (that is, a form
        !          1480: which needs no processing by \fIcreate\fR), preceding it with
        !          1481: an exclamation point \fB"!"\fR.
        !          1482: The structure (or other object) resulting from evaluating
        !          1483: the Lisp expression will be tested to ensure it is the right type
        !          1484: of value and, if it is, inserted in the newly created structure
        !          1485: as the value of that slot.
        !          1486: (The mnemonic idea of this symbol is as a sort
        !          1487: of "barrier" meaning \fIStop processing here!!! and take this
        !          1488: (almost) literally!!!\fR)  For example, after using
        !          1489: .DS
        !          1490: (create individual  PTrans  Ptrans23
        !          1491:        (Actor  John)
        !          1492:        (Object  John)
        !          1493:        (To  Home) )
        !          1494: .DE
        !          1495: to create an individual PTrans, leaving it in internal form in the
        !          1496: atom Ptrans23, you can then insert this PTrans into a new MTrans
        !          1497: with:
        !          1498: .DS
        !          1499: (create individual  MTrans
        !          1500:        (Actor  Bob)
        !          1501:        (MObject  !  Ptrans23)
        !          1502:        (To  Carol) )
        !          1503: .DE
        !          1504: .PP
        !          1505: At other times the user may want to take the result of evaluating
        !          1506: some Lisp code and splice it into the Lisp expression describing the
        !          1507: structure being created at the point where the description of the
        !          1508: value of a slot would occur.
        !          1509: In this case, you wish some Lisp code to be evaluated and then
        !          1510: you wish \fIcreate\fR to build a value for this slot
        !          1511: by further processing (scanning) the result of this evaluation.
        !          1512: To this end, PEARL will evaluate any slot value preceded by a
        !          1513: \fB"$"\fR and insert its result into the \fIcreate\fR call,
        !          1514: proceeding to process it just as if
        !          1515: the user had typed it in directly.
        !          1516: So if one stores the atom Alice in Name with
        !          1517: .DS
        !          1518: (setq  Name  'Alice) ; the atom Alice, not the symbol Alice
        !          1519:                     ;   (or the value of s:Alice).
        !          1520: .DE
        !          1521: or possibly
        !          1522: .DS
        !          1523: (setq  Name  (read) )
        !          1524: .DE
        !          1525: with the user having typed \fIAlice\fR, then \fI$  Name\fR in
        !          1526: .DS
        !          1527: (create individual  PTrans
        !          1528:        (Actor  $  Name)
        !          1529:        (Object  $  Name)
        !          1530:        (From  Home)
        !          1531:        (To  NewYork) )
        !          1532: .DE
        !          1533: is equivalent to having Alice typed as the Actor and Object
        !          1534: values: \fIcreate\fR evaluates Name and then processes its
        !          1535: value \fIAlice\fR as input.
        !          1536: Thus, the PTrans will be equivalent to
        !          1537: .DS
        !          1538: (create individual  PTrans
        !          1539:        (Actor  Alice)
        !          1540:        (Object  Alice)
        !          1541:        (From  Home)
        !          1542:        (To  NewYork) )
        !          1543: .DE
        !          1544: The power of this construct occurs when Name is a atom whose
        !          1545: value changes at run time (as when it is read above) or the
        !          1546: \fIcreate\fR call is within a loop in which Name takes on many
        !          1547: different values.
        !          1548: .PP
        !          1549: In summary, both ! and $ cause the evaluation of the Lisp
        !          1550: expression following them.
        !          1551: However, ! stops the usual processing and expects an
        !          1552: internal value, whereas $ continues the usual
        !          1553: processing and expects a Lisp description of the value.
        !          1554: When you need either ! or $, you will know it!
        !          1555: Until then, do not worry if you do not understand them very well!
        !          1556: .PP
        !          1557: If the expression you want evaluated is simply an atom
        !          1558: bound to a value of the appropriate type, you need not use the !.
        !          1559: Whenever \fIcreate\fR is looking for a value of a particular
        !          1560: type, and finds a bound atom instead, it evaluates the atom and
        !          1561: if it is bound to the correct type of value, that value is used.
        !          1562: This is only done in \fIsymbol\fR slots when the atom is not a
        !          1563: symbolname and in \fIinteger\fR slots if the atom is not from
        !          1564: the ordinal type (if any) associated with the slot.
        !          1565: .NH
        !          1566: More Flexible Hash Selection
        !          1567: .PP
        !          1568: The use of stars (asterisks *) to indicate useful slots for hashing
        !          1569: described earlier is only one of many hashing schemes that PEARL allows.
        !          1570: This section describes the others, and how the user can control them.
        !          1571: The first point to note is that even with the star hashing a single
        !          1572: structure can be hashed in several different ways.
        !          1573: Thus if one thinks that in a particular program PTrans will be
        !          1574: frequently fetched from the data base given only the
        !          1575: Actor \fBor\fR only the Object (that is, the program might only
        !          1576: know the Actor and desire the whole PTrans, or know only
        !          1577: the Object and desire the whole PTrans) the user should
        !          1578: star \fBboth\fR the Actor and Object slots within
        !          1579: the definition of PTrans.
        !          1580: When PEARL stores a PTrans into the data base, it will index
        !          1581: it under both (PTrans + Actor) and (PTrans + Object) in addition
        !          1582: to the usual indexing with all other PTranses.
        !          1583: In general, any number of slots can be starred.
        !          1584: .PP
        !          1585: Another type of hashing does not use the type of the structure in
        !          1586: creating a hash index.
        !          1587: If the symbol colon (:) is used before the
        !          1588: name of a slot, objects of that type will be hashed under that slot
        !          1589: value only.
        !          1590: Thus if the Actor slot of the PTrans definition was
        !          1591: preceded by a colon instead of a star, then instances of PTrans
        !          1592: would be hashed under the value of the Actor slot alone rather the
        !          1593: value of the (PTrans + Actor).
        !          1594: This would be useful in the case in which one were interested in
        !          1595: fetching any structure in which a particular value, say the
        !          1596: symbol John, appered in a coloned slot.
        !          1597: For example all structures in which John appeared in the Actor slot
        !          1598: could be fetched at once (and very efficiently).
        !          1599: .PP
        !          1600: A third type of hashing is \fBstar-star\fR or \fBdouble-star (**)
        !          1601: hashing\fR.
        !          1602: If a double star is used instead of a single star,
        !          1603: PEARL will use \fBtriple hashing\fR.
        !          1604: Only one triple hashing is allowed per structure.
        !          1605: Triple hashing requires that two, and only two slots be double starred.
        !          1606: If PTrans were to be defined in the following way:
        !          1607: .DS
        !          1608: (create base  PTrans
        !          1609:        (**  Actor  symbol)
        !          1610:        (**  Object  symbol)
        !          1611:        (      From  symbol)
        !          1612:        (      To  symbol) )
        !          1613: .DE
        !          1614: then when an instance of a PTrans is created, it will be hashed
        !          1615: into the data base under a combination of the three values
        !          1616: (PTrans + Actor + Object).
        !          1617: As with all hashing, if a slot is necessary to a particular type
        !          1618: of hashing but is unfilled (or filled with \fInilsym\fR or
        !          1619: \fInilstruct\fR) the hashing will not occur.
        !          1620: Triple hashing is used when one wants fast access to all
        !          1621: individuals of a particular type with two slots likely to have
        !          1622: fairly unique values.
        !          1623: In the case of PTrans, this would allow one fast access to all
        !          1624: PTranses in which John PTranses Mary somewhere.
        !          1625: Distinctions this fine are not usually necessary, and as it
        !          1626: is slightly more expensive at creation and fetching time,
        !          1627: it should only be used when the user is sure of the need for it.
        !          1628: .PP
        !          1629: A fourth type of hashing is \fBcolon-colon\fR or \fBdouble colon (::)
        !          1630: hashing\fR.
        !          1631: It has the same relation to colon hashing as double star
        !          1632: hashing has to star hashing.
        !          1633: If the **'s in the above are replaced with ::, the hashing will be
        !          1634: on (Actor + Object) ignoring the fact that the structure is a PTrans.
        !          1635: This might be useful in fetching all structures involving John and Mary.
        !          1636: As with double star hashing, double colon hashing should be used
        !          1637: sparingly and only one such hashing pair may be used in a type.
        !          1638: .PP
        !          1639: However, it is possible to combine the use of any of these
        !          1640: hashing methods in a single structure.
        !          1641: Thus one could have both double colon hashing and double star
        !          1642: hashing, as well as several * and : hashings as well.
        !          1643: Given several ways, PEARL uses the one
        !          1644: which the most complex one is used during
        !          1645: fetching, since that should provide the greatest degree of
        !          1646: discrimination between items (that is, most likely to narrow
        !          1647: down the choices).
        !          1648: If the value in a slot intended to take part in hashing is unbound
        !          1649: or otherwise not useful, then the next most specific method it used.
        !          1650: Given the values which are considered useful and the hashing
        !          1651: information for the type of structure, the hierarchy of buckets
        !          1652: to be chosen is as follows:
        !          1653: .DS
        !          1654: **  hashing
        !          1655: ::  hashing
        !          1656: *  hashing
        !          1657: :  hashing
        !          1658: .DE
        !          1659: .PP
        !          1660: In section 9 we discussed a problem that arises when the pattern
        !          1661: you are using is more specific than the structures in the data base.
        !          1662: In this case, \fIfetch\fR looks in the data base in the most
        !          1663: specific place and does not find what it is looking.
        !          1664: One alternative is to eliminate the hashing that causes this problem
        !          1665: but this will force \fIfetch\fR to look through a large number of items.
        !          1666: If you do not intend to look all the way through the stream
        !          1667: returned by \fIfetch\fR, there is a version of fetch which will
        !          1668: build the stream out of all the ways the pattern could be fetched.
        !          1669: This function is called \fBfetcheverywhere\fR and will return a
        !          1670: stream made up of the (up to five) hash buckets that its pattern
        !          1671: could be -- potentially expensive if you intend to process the
        !          1672: whole thing.
        !          1673: .PP
        !          1674: In addition to these four methods of hashing, and the simplest one
        !          1675: based on the type of structure only, there are several
        !          1676: hashing labels which are modifiers on these methods and
        !          1677: affect what values are used to compute the index.
        !          1678: .PP
        !          1679: The remaining hashing flags do not introduce any new types
        !          1680: of hashing, but rather modify the way the existing types work.
        !          1681: To motivate these, consider the implementation of Goal withing CD.
        !          1682: In early versions of CD, there were several different types of
        !          1683: goals, including Delta-Prox (goal of being near something),
        !          1684: Delta-Poss (goal of possessing something), and so on.
        !          1685: In general these delta goals were of the form
        !          1686: (Delta-<some CD primitive> (Actor ...) (Objective ...) ).
        !          1687: This lead to an explosion of Delta-goals
        !          1688: (e.g. Delta-Move-Fingers-Within-Telephone-Dial),
        !          1689: and a new way of handling goals was established.
        !          1690: This was simply that all Goals were to have the form:
        !          1691: .DS
        !          1692: (create base  Goal
        !          1693:        (Planner  symbol)
        !          1694:        (Objective  struct) )
        !          1695: .DE
        !          1696: where the Objective would be filled with the appropriate structure,
        !          1697: whether it was a simple Poss or the $DialPhone script.
        !          1698: This change makes CD much cleaner, but poses somewhat of
        !          1699: a problem for hashing.
        !          1700: One of the major uses of hashing within some AI programs
        !          1701: written in PEARL is to associate plans with goals.
        !          1702: So it is best if this process is efficient.
        !          1703: .PP
        !          1704: As an example of this problem (using the early form of Delta-goals):
        !          1705: .DS
        !          1706: ; Declaration of PlanFor rules.
        !          1707: (create base  PlanFor
        !          1708:        (*  Objective  struct)
        !          1709:        (*  Plan  struct) )
        !          1710: .DE
        !          1711: .DS
        !          1712: (create base  Delta-Prox
        !          1713:        (Planner  symbol)
        !          1714:        (Location  symbol) )
        !          1715: .DE
        !          1716: .DS
        !          1717: (create base  Walk-Plan
        !          1718:        (Planner  symbol)
        !          1719:        (From  symbol)
        !          1720:        (To  symbol) )
        !          1721: .DE
        !          1722: .DS
        !          1723: ; Store in the data base the fact that walking is a way of accomplishing
        !          1724: ;    a Delta-Prox goal.
        !          1725: (dbcreate individual  PlanFor
        !          1726:           (Goal  (Delta-Prox  (Planner  ?X)
        !          1727:                              (Location  ?Y) ) )
        !          1728:           (Plan  (Walk-Plan  (Planner  ?X)
        !          1729:                             (From  nilsym)
        !          1730:                             (To  ?Y) ) ) )
        !          1731: .DE
        !          1732: This structure simply says the fact that if one has a goal of being
        !          1733: somewhere, then one plan for doing this is to walk.
        !          1734: Or, using the rule in reverse, if you note that someone is
        !          1735: walking to some location, then you might infer that they had
        !          1736: a goal of being at that location.
        !          1737: Note that after being put into the data base, the rule can be easily
        !          1738: fetched by presenting either half of it as a pattern.
        !          1739: .PP
        !          1740: Thus if a planning program has a goal of doing the action in
        !          1741: the atom GoalAct, then it can query the data base for
        !          1742: any direct plans for doing Act by:
        !          1743: .DS
        !          1744: (fetchcreate individual  PlanFor
        !          1745:             (Goal  !  GoalAct)
        !          1746:             (Plan  ?*any*) )
        !          1747: .DE
        !          1748: So if GoalAct happened to be a Delta-Prox goal, then the
        !          1749: rule above would be fetched.
        !          1750: However the revised form of goals hides the unique nature of
        !          1751: the Delta-goal, and the best one could do is fetch all PlanFor rules
        !          1752: that have a structure of type Goal in their Goal slot.
        !          1753: This is a serious loss since \fIall PlanFors\fR have a Goal
        !          1754: in their Goal slot;
        !          1755: thus the system would have to look through all
        !          1756: PlanFors whenever it was trying to fetch one.
        !          1757: What is needed is a way of telling PEARL that when hashing on Goals,
        !          1758: never hash the structure type Goal, but rather use the
        !          1759: item that fills the Objective slot of the Goal.
        !          1760: This would solve our problem nicely, as now all
        !          1761: PlanFors would be hashed on the name of the Objective (Prox,
        !          1762: Dial-Phone, etc.), and a list of all PlanFors would not have to be
        !          1763: searched to find a particular one, rather the system could just hash
        !          1764: directly to it.
        !          1765: .PP
        !          1766: To indicate to PEARL that this \fBhash aliasing\fR is desired,
        !          1767: place an ampersand '&' before the slot name to be substituted
        !          1768: for the structure name when defining the structure.
        !          1769: Thus Goal would be declared:
        !          1770: .DS
        !          1771: (create base  Goal
        !          1772:        (    Planner  symbol)
        !          1773:        (&  Objective  struct) )
        !          1774: .DE
        !          1775: Naturally only one slot can be selected for hash aliasing.
        !          1776: .PP
        !          1777: In this way, Goals change the way in which other structures
        !          1778: use them to index but the way in which Goals themselves
        !          1779: are indexed will not be affected.
        !          1780: Since many other types of structures are likely to contain Goals,
        !          1781: we must be careful about how this affects the hashing of all of them.
        !          1782: It might be the case that PlanFor was the only structure
        !          1783: indexed based on Goals which would benefit from hash aliasing
        !          1784: and that some structures would actually be hurt by this
        !          1785: because they expected Goals to be only one of many types
        !          1786: of values.
        !          1787: In this case, putting the control of how Goals get used by
        !          1788: other structures into the definition of Goal is a bad idea.
        !          1789: Instead, the control can be moved up into only the
        !          1790: problematic structures.
        !          1791: These structures can simply add the \fB">"\fR hash label to
        !          1792: a starred slot, causing PEARL to use the first starred
        !          1793: slot of the slot-filling structure instead of its type.
        !          1794: For example, when we put a both \fB"*"\fR and \fB">"\fR on the Goal
        !          1795: slot of PlanFor then it will always use the first starred
        !          1796: slot of the Goal in its Goal slot:
        !          1797: .DS
        !          1798: (create base  Goal
        !          1799:        (    Planner  symbol)
        !          1800:        (*  Objective  struct))
        !          1801: .DE
        !          1802: .DS
        !          1803: (create base  PlanFor
        !          1804:        (*  >  Goal  struct)
        !          1805:        (        Plan  struct))
        !          1806: .DE
        !          1807: Thus, the use of \fB">"\fR hashing is called \fBforced aliasing\fR since
        !          1808: the structure filling a slot has very little control over it.
        !          1809: .PP
        !          1810: However, there is one way for a structure to affect
        !          1811: how forced aliasing happens.
        !          1812: If the user wanted to also star the Planner slot of Goal,
        !          1813: but wanted the Objective slot to be used in cases of forced
        !          1814: aliasing, then the use of an \fB"^"\fR on the Objective slot will
        !          1815: allow that:
        !          1816: .DS
        !          1817: (create base  Goal
        !          1818:        (*       Planner  symbol)
        !          1819:        (*  ^  Objective  struct))
        !          1820: .DE
        !          1821: thus allowing Goals inserted directly into the data base to be
        !          1822: indexed by the combinations \fIGoal + Planner\fR and
        !          1823: \fIGoal + Objective\fR while other objects containing Goals would
        !          1824: use the Objective slot rather than Goal \fIOtherObject + Objective\fR.
        !          1825: .PP
        !          1826: On the other hand, if most structures containing Goals would
        !          1827: benefit from the use of the hash aliasing label \fB"&"\fR in Goal,
        !          1828: but only one or two are hurt by it, the use of \fB"&"\fR in Goal
        !          1829: can be overridden by the structures which will contain Goals
        !          1830: by adding the \fB"<"\fR hash label to the starred slot to produce
        !          1831: \fBanti-aliasing\fR.
        !          1832: This gives the controlling structure the last word
        !          1833: over how it is hashed.
        !          1834: .DS
        !          1835: (create base  Goal
        !          1836:        (    Planner  symbol)
        !          1837:        (&  Objective  struct))
        !          1838: .DE
        !          1839: .DS
        !          1840: (create base  OffendedStructure
        !          1841:        (*  <  Slot  struct))
        !          1842: .DE
        !          1843: Thus, the anti-aliasing \fB"<"\fR means \fIjust for this hashing, turn
        !          1844: off hash aliasing (if any) of any structure filling this slot\fR.
        !          1845: .PP
        !          1846: The proper use of hash aliasing and anti-aliasing,
        !          1847: like all the hashing specifiers is an art that must be learned by
        !          1848: applying them to real systems, and the correct hash directives
        !          1849: for a particular system rely critically upon the statistics of
        !          1850: that particular system operating upon a particular set of data.
        !          1851: The hashing mechanism was designed to give the user benefit in
        !          1852: proportion to the effort expended in determining hash labels.
        !          1853: With no effort, the structure type provides some help.
        !          1854: With the addition of each label or pair of labels,
        !          1855: an item to be inserted into the data base is indexed into
        !          1856: another location in the hash table.
        !          1857: Thus the cost of \fIextra\fR labels is simply the time to
        !          1858: find another hash bucket (a few adds and multiplies), and add
        !          1859: the item to the front of the list implying the time and
        !          1860: space incurred by one cons-cell.
        !          1861: .NH
        !          1862: Using Predicates to Constrain Fetching
        !          1863: .PP
        !          1864: Sometimes when you are creating a pattern to fetch a structure,
        !          1865: giving the overall form of the structure is not specific enough.
        !          1866: In particular, it is often desirable to restrict the value of a
        !          1867: slot to a subrange.
        !          1868: For example, using the structure Health:
        !          1869: .DS
        !          1870: (create base  Health
        !          1871:        (Actor  symbol)
        !          1872:        (Level  int) )
        !          1873: .DE
        !          1874: one might want to find out who is sick by creating a pattern
        !          1875: that only matches those Health structures in which the Level
        !          1876: is less than -1 (on a scale from -10 to 10 perhaps).
        !          1877: This can be done by simply writing a predicate (say Sick)
        !          1878: which expects to be given the value of the slot being matched
        !          1879: against as its one argument:
        !          1880: .DS
        !          1881: (de Sick  (Num)
        !          1882:     (lessp  Num  -1) )
        !          1883: .DE
        !          1884: Then you simply add its name after the value
        !          1885: within the <slotname filler> pair of the pattern:
        !          1886: .DS
        !          1887: (create pattern  Health  HealthPattern
        !          1888:        (Actor  ?Person)
        !          1889:        (Level  ?Level  Sick) )
        !          1890: .DE
        !          1891: Given these definitions, a (fetch HealthPattern) would pass
        !          1892: the Level slotfiller of each Health structure it
        !          1893: found in the data base to the predicate Sick.
        !          1894: If Sick returned true (non-\fInil\fR) then it would
        !          1895: consider the slot to have matched whereas a
        !          1896: \fInil\fR from Sick would be considered a mismatch.
        !          1897: There are no standard predicates for users to use for these
        !          1898: purposes, but they are relatively easy to create as needed.
        !          1899: .PP
        !          1900: However, one often has a predicate which has more than one
        !          1901: argument only one (or none) of which are the slot value.
        !          1902: For example, one might want to include a special variable
        !          1903: or the value of some other slot of the structure or the
        !          1904: structure itself.
        !          1905: To make this easy PEARL allows predicates to be arbitrary
        !          1906: s-expressions which may contain any of several special forms
        !          1907: for which PEARL substitutes the current slot or structure.
        !          1908: .PP
        !          1909: If a predicate includes an asterisk \fB*\fR, this is replaced by
        !          1910: the value of the current slot (in the structure being matched
        !          1911: against).
        !          1912: If it includes a double asterisk \fB**\fR, this is replaced
        !          1913: by the whole structure being matched against.
        !          1914: If you want the value of another slot in the current structure,
        !          1915: precede its name with an equal sign (as in \fB=SlotName\fR to
        !          1916: have the value of the slot named SlotName inserted).
        !          1917: There is a readmacro \fB"="\fR which converts \fI=S\fR into 
        !          1918: \fI(*slot* S)\fR, just as the readmacro \fB"?"\fR converts ?X into
        !          1919: \fI(*var* X)\fR (or \fI(*global* X)\fR) for pattern-matching variables.
        !          1920: While processing predicates before executing them, PEARL will
        !          1921: look for these three constructs and replace any of them with the
        !          1922: appropriate value, so pattern-matching variables can also be
        !          1923: used in predicates.
        !          1924: .PP
        !          1925: If there are several predicates on a slot, they are run in
        !          1926: succession until one returns nil or they have all been run.
        !          1927: Thus, a list of predicates provides the effect of a conditional
        !          1928: \fIand\fR.
        !          1929: Thus, although PEARL knows nothing special about logical
        !          1930: connectives like \fIor\fR and \fIand\fR, the effect of a
        !          1931: the usual Lisp \fIand\fR is automatically implied and
        !          1932: the conditional \fIor\fR of Lisp can be had by using the
        !          1933: s-expression type of predicate.
        !          1934: If you wish things to run regardless of their results,
        !          1935: providing the effect of unconditional \fIand\fR, use hooks (demons).
        !          1936: .PP
        !          1937: The above was one of two types of predicates available.
        !          1938: To motivate the other type, consider the case of wanting
        !          1939: to fetch all MTranses about the occurence of a PTrans.
        !          1940: This could be accomplished in one of two ways.
        !          1941: The first is:
        !          1942: .DS
        !          1943: ; In this pattern example, all slots are automatically filled
        !          1944: ;     with ?*any* except the MObject which must be a PTrans.
        !          1945: (create pattern  MTrans
        !          1946:        (MObject  (PTrans) ) )
        !          1947: .DE
        !          1948: Since this method actually results in \fI?*any*\fR being
        !          1949: matched against the fillers in each of the PTrans's
        !          1950: slots, it is a bit inefficient.
        !          1951: .PP
        !          1952: The second way uses \fBstructure predicates\fR
        !          1953: to avoid this matching by specifying merely that the filler
        !          1954: of the MObject slot must be a PTrans structure.
        !          1955: This is done by listing the name of a previously
        !          1956: defined structure after a pattern-matching variable:
        !          1957: .DS
        !          1958: (create pattern  MTrans
        !          1959:        (MObject  ?Obj  PTrans) )
        !          1960: .DE
        !          1961: PEARL will then bind Obj to any structure that is a PTrans
        !          1962: (or expanded PTrans) and match successfully without
        !          1963: examining any of the slots of that PTrans.
        !          1964: PEARL can tell the difference between these two types of
        !          1965: predicates since one will have some sort of function declaration
        !          1966: and the other will be the name of a defined structure.
        !          1967: In the case of a function with the
        !          1968: same name as a structure (which the user should never do as it
        !          1969: invites errors) the name's structure role takes precedence.
        !          1970: .PP
        !          1971: Since a similar effect is sometimes desired on slots of type
        !          1972: \fIsymbol\fR, a similar but more complex mechanism is provided
        !          1973: with symbols and with structures which failed the above test.
        !          1974: If the name of a predicate on a slot of type symbol or structure
        !          1975: is the name of a type of structure, PEARL will assume that what
        !          1976: you want to know about the value in this slot is whether there
        !          1977: is anything in the data base of the type specified by the structure
        !          1978: predicate with the slot value in its first slot.
        !          1979: Thus, if the data base contains an item saying that the symbol
        !          1980: John represents a person:
        !          1981: .DS
        !          1982: (symbol  John)
        !          1983: (dbcreate individual  Person
        !          1984:          (Identity  John))
        !          1985: .DE
        !          1986: then fetching a pattern with a symbol slot which has a Person
        !          1987: predicate on it:
        !          1988: .DS
        !          1989: (fetchcreate pattern  Thing
        !          1990:             (Slot  ?X  Person))
        !          1991: .DE
        !          1992: will cause the equivalent of a fetch from the (default) data base
        !          1993: of the pattern (Person (Identity John)).
        !          1994: Note that this implies that the first slot of a structure enjoys
        !          1995: somewhat of a pre-eminence and that this means that one should
        !          1996: carefully choose which slot to put first.
        !          1997: For efficiency however, \fIfetch\fR is not actually used.
        !          1998: The function actually used is \fBdisguisedas\fR which expects
        !          1999: the slot filler, the structure definition (not default instance)
        !          2000: and an optional data base to look in.
        !          2001: Slot filler may be either a symbol or structure.
        !          2002: .PP
        !          2003: This second type of predicate can also result in a kind of
        !          2004: inefficiency which you might like to avoid.
        !          2005: By putting a variable in the MObject slot of the MTrans along with
        !          2006: a PTrans structure predicate, we preclude PEARL from hashing the
        !          2007: object in any useful way, forcing it to look through all MTranses
        !          2008: instead of only MTranses with PTranses in their MObject slot.
        !          2009: Since patterns are most often less specific than the objects in
        !          2010: the data base, this can make a big difference.
        !          2011: Another problem with a variable plus a structure predicate is that the
        !          2012: structure predicate is either based on fetches and the first slot or it
        !          2013: is limitted to matching the type only.
        !          2014: We might sometimes want a more complicated structure to be used
        !          2015: as a predicate.
        !          2016: However, if we opt instead for the more efficient fetching and
        !          2017: matching by putting a structure in the slot, we have lost the
        !          2018: ability to have a variable bound during the match.
        !          2019: .PP
        !          2020: To allow you both to help improve the hashing and matching of a
        !          2021: structure and also to bind a variable as a side effect, PEARL
        !          2022: provides a mechanism to attach an \fBadjunct variable\fR to the slot.
        !          2023: This adjunct variable in a slot is bound as a side effect whenever the
        !          2024: values in the slot of the two structures were already bound, have
        !          2025: already been matched successfully and all predicates and slot hooks
        !          2026: have been run.
        !          2027: Adjunct variables may be local, lexically scoped or global, just
        !          2028: as any other variable.
        !          2029: To use an adjunct variable, include the variable \fIafter\fR the
        !          2030: value preceded by a colon and preceding any predicates or slot hooks.
        !          2031: For example, 
        !          2032: .DS
        !          2033: (create pattern  MTrans
        !          2034:        (MObject  (PTrans  (Actor  John) )  :  ?Obj) )
        !          2035: .DE
        !          2036: would match any MTrans about John PTransing something, and also
        !          2037: bind the adjunct variable ?Obj to the actual PTrans structure
        !          2038: that applied.
        !          2039: .PP
        !          2040: Since PEARL uses hunks to create so many types of values of its
        !          2041: own, it also provides a set of predicates to test an item to see
        !          2042: what type it is.
        !          2043: Many of them are quite definitely kludges since they depend upon
        !          2044: certain bizarre structures existing only in PEARL-created items
        !          2045: and not in user-created items and thus should not be depended
        !          2046: upon totally.
        !          2047: These functions are \fBstreamp\fR, \fBdatabasep\fR, \fBblockp\fR,
        !          2048: \fBdefinitionp\fR, \fBpsymbolp\fR (to distinguish from Franz Lisp
        !          2049: \fIsymbolp\fR), \fBstructurep\fR,
        !          2050: \fBsymbolnamep\fR, and \fBstructurenamep\fR.
        !          2051: .NH
        !          2052: More Useful Slot Types
        !          2053: .PP
        !          2054: These last few examples begin to show the restricted nature of basic
        !          2055: integer values and of labelling slots as being of type \fIstruct\fR.
        !          2056: If the values in an integer slot will range between -10 and 10,
        !          2057: then you would like to say that.
        !          2058: If the values which will fill a slot of type structure will
        !          2059: be Events or Acts or States, you would like to specify that.
        !          2060: PEARL provides mechanisms to fill both of these needs.
        !          2061: .PP
        !          2062: In the case of an integer slot to be filled with values from a range
        !          2063: of -10 to 10, these integer values do not represent "levels of health"
        !          2064: very well either.
        !          2065: Rather than saying that a person's "health level"
        !          2066: is -2, you might like to say it was "Sick".
        !          2067: In fact, you would
        !          2068: probably like to say that the values of the slot will be one from
        !          2069: among the set of values "Dead, Critical, Sick, OK, Healthy and InThePink".
        !          2070: Moreover, you might like to specify that these values are to be
        !          2071: associated with integer values in such a way that the ordering
        !          2072: you specified holds and you may or may not want to specify precisely
        !          2073: what integer values should be associated with these atoms.
        !          2074: In other words, you would like a type which consists of a set of
        !          2075: values with a linear ordering on them, similar to the Pascal scalar or
        !          2076: enumeration type.
        !          2077: .PP
        !          2078: Such a type exists in PEARL and is created by a call to
        !          2079: the function \fBordinal\fR.
        !          2080: For example, to create an ordered set of values to represent
        !          2081: levels of various states when you want the actual
        !          2082: integer values to be created by PEARL, you would say:
        !          2083: .DS
        !          2084: (ordinal  Levels  (Low  Middle  High))
        !          2085: .DE
        !          2086: which would associate the numbers 1, 2, and 3 with Low, Middle and
        !          2087: High respectively.
        !          2088: If you want to specify the values to be associated with each name,
        !          2089: you simply list the value after each name.
        !          2090: Thus, to create a set of values for use in the integer Level
        !          2091: slot of Health above, you might say the following (the values need
        !          2092: not be listed in order):
        !          2093: .DS
        !          2094: (ordinal  HealthLevels  (Dead -10  Critical -6  Sick -2  OK 2
        !          2095:                                   Healthy 6  InThePink 10))
        !          2096: .DE
        !          2097: Among the actions that \fIordinal\fR performs are the following:
        !          2098: .IP 1.
        !          2099: The assoc-list of names and values for the ordinal type can be
        !          2100: accessed by evaluating the atom built by prepending \fBo:\fR to
        !          2101: the name of the ordinal type.
        !          2102: Given the name of an ordinal type, the function \fBordatom\fR builds
        !          2103: this atom.
        !          2104: Thus \fIo:Levels\fR contains (and \fI(eval (ordatom 'Levels))\fR returns)
        !          2105: the value \fI((Low . 1) (Middle . 2) (High . 3))\fR.
        !          2106: .IP 2.
        !          2107: Atoms consisting of the name of the ordinal type concatenated
        !          2108: with a colon and the value name are created and set to the value
        !          2109: they represent.
        !          2110: Thus \fILevels:Low\fR is set to 1, \fILevels:Middle\fR is set to 2, etc.
        !          2111: .IP 3.
        !          2112: Two atoms with \fB:min\fR and \fB:max\fR concatenated to the
        !          2113: name of the ordinal type are created and set to the lowest
        !          2114: and highest integer values in the type.
        !          2115: Thus \fIHealthLevels:min\fR is -10, and \fIHealthLevels:max\fR is 10.
        !          2116: .IP 4.
        !          2117: The name of the ordinal type is added the list of all ordinal type
        !          2118: names kept in the special variable \fB*ordinalnames\fR*.
        !          2119: .IP 5.
        !          2120: The name of the ordinal type is stored with the slot
        !          2121: so that the print functions can convert from the
        !          2122: integer value back into the name.
        !          2123: Since the default value for integers is zero but most
        !          2124: ordinals will not have a zero value, the print functions will
        !          2125: print \fB*zero-ordinal-value*\fR instead of zero.
        !          2126: .PP
        !          2127: Having created an ordinal type, it is then possible to declare in
        !          2128: a structure definition that a slot will contain values of that type.
        !          2129: The use of values from this type is \fBnot enforced\fR
        !          2130: by PEARL but allows the definitions of integer slots to be
        !          2131: more readable, allows the use of the names of values instead
        !          2132: of their associated integers when creating individuals and
        !          2133: allows PEARL to print the more readable information when
        !          2134: printing an integer slot.
        !          2135: The special atoms created allow predicates, hooks (demons) and
        !          2136: other functions to refer to these values without knowing
        !          2137: their associated integers.
        !          2138: We can now redefine Health to use HealthLevels:
        !          2139: .DS
        !          2140: (create base  Health
        !          2141:        (Actor  symbol)
        !          2142:        (Level  HealthLevels) )
        !          2143: .DE
        !          2144: and create an individual which says that John is in
        !          2145: the pink of health:
        !          2146: .DS
        !          2147: (create individual  Health
        !          2148:        (Actor  John)
        !          2149:        (Level  InThePink) )
        !          2150: .DE
        !          2151: .PP
        !          2152: Declaring a slot to be of type \fIstruct\fR is similarly
        !          2153: unenlightening, so PEARL will accept the name of a
        !          2154: structure type in its place.
        !          2155: For example, we can make the following definitions:
        !          2156: .DS
        !          2157: (create base  Person
        !          2158:        (*  Identity  symbol) )
        !          2159: (create base  Health
        !          2160:        (Actor  Person)
        !          2161:        (Level  HealthLevels) )
        !          2162: .DE
        !          2163: and the Actor slot of Health will be of type \fIstruct\fR.
        !          2164: However, there is currently no extra type checking implied
        !          2165: by this declaration (although it is being considered), but
        !          2166: again it improves the readability of declarations tremendously.
        !          2167: .NH
        !          2168: Attaching Hooks to Structures (If-Added Demons)
        !          2169: .PP
        !          2170: A fairly old construct within AI is that of demons.
        !          2171: In their pure form they could be thought of as asynchronous
        !          2172: parallel processes that watch everything going on within a
        !          2173: system, lying in wait for a particular set of conditions to occur.
        !          2174: These conditions might be a block-manipulating program stacking
        !          2175: some blocks too high to be stable, or a data base program violating
        !          2176: a consistency constraint.
        !          2177: The main problem with classical demons was that in their most flexible
        !          2178: form they gobble up far too much system time, as well as being very
        !          2179: hard to program as it was hard to see just when they might pop up
        !          2180: during the execution of a program.
        !          2181: .PP
        !          2182: In an attempt to control the implementation of demons and at the same
        !          2183: time provide the user with increased control over the built-in PEARL
        !          2184: functions, PEARL allows the user to attach pieces of code to
        !          2185: structures that will be run when specific PEARL (or user) functions
        !          2186: access particular types of data or pieces of data at particular
        !          2187: places in the code.
        !          2188: Thus, PEARL provides a general but restricted and fairly efficient
        !          2189: ability to control the operation of specific functions on specific
        !          2190: pieces of data by providing \fBhooks\fR in the PEARL functions
        !          2191: which check for requests within structures that certain functions
        !          2192: be run when they are accessed in certain ways.
        !          2193: Thus PEARL has two useful sub-breeds of \fBhooks\fR which
        !          2194: watch over either
        !          2195: .IP a.
        !          2196: the value of a particular slot of a particular individual structure,
        !          2197: referred to as \fIslot hooks\fR.
        !          2198: .IP b.
        !          2199: operations upon all individuals of a particular base structure type
        !          2200: referred to as \fIbase hooks\fR.
        !          2201: .PP
        !          2202: Like predicates, hooks can either be the name of a function to
        !          2203: run or a Lisp s-expression to be evaluated.
        !          2204: If an s-expression, they can include the special forms 
        !          2205: \fB**\fR representing the current structure or \fB*\fR representing
        !          2206: the value of the current slot on slot hooks and of the current
        !          2207: structure on base hooks.
        !          2208: Variables or slot names preceded by \fB=\fR are also allowed
        !          2209: (just as in predicates), referring to variables or slots in
        !          2210: the current structure.
        !          2211: If hooks are run by functions which take two items as arguments,
        !          2212: like \fImatch\fR, then the special form \fB>**\fR may
        !          2213: be used to represent the \fBother\fR structure (which \fB>\fR is
        !          2214: meant to suggest) and \fB>*\fR may be used for the value in this
        !          2215: slot of the other structure.
        !          2216: (In the case of functions of only one argument, \fI>*\fR and
        !          2217: \fI>**\fR are the same as \fI**\fR and \fI*\fR.)
        !          2218: In functions which take two arguments, the special form \fB?\fR
        !          2219: may be used to represent the result that the function intends to
        !          2220: return.
        !          2221: (This will be \fI*pearlunbound*\fR in hooks which run before the
        !          2222: function has done its job.)
        !          2223: .PP
        !          2224: When hooks run in the context of a call to \fIpath\fR,
        !          2225: two special variables are available: \fB*pathtop*\fR which
        !          2226: is the topmost structure passed to path and \fB*pathlocal*\fR
        !          2227: which is the current innermost structure whose slot is
        !          2228: being accessed.
        !          2229: When hooks are run in the context of a call to a function which
        !          2230: deals with a data base, then the special variable \fBdb\fR
        !          2231: will contain the data base currently being used.
        !          2232: .PP
        !          2233: The functions used to fill in the special forms like *, **, =slot,
        !          2234: and variables before evaluation come in two flavors and are
        !          2235: called \fBfillin1\fR and \fBfillin2\fR.
        !          2236: \fIFillin1\fR is designed for hooks which run on single structures
        !          2237: and expects as arguments:
        !          2238: .IP a.
        !          2239: the function (s-expression) to fill in,
        !          2240: .IP b.
        !          2241: the slot value (or item if a base hook) to use for \fI*\fR,
        !          2242: .IP c.
        !          2243: the structure to use for \fI**\fR, and
        !          2244: .IP d.
        !          2245: the definition for the item provided as the third argument
        !          2246: (for interpretation of \fI=slot\fR forms).
        !          2247: .PP
        !          2248: \fIFillin2\fR is designed for hooks which run on two structures and
        !          2249: produce a result and expects as arguments:
        !          2250: .IP a.
        !          2251: the function (s-expression) to fill in,
        !          2252: .IP b-c.
        !          2253: the slot values (or structures if a base hook) to use for \fI*\fR and \fI>*\fR,
        !          2254: .IP d-e.
        !          2255: the structures to use for \fI**\fR and \fI>**\fR,
        !          2256: .IP f.
        !          2257: the definition for the structure provided as the fourth argument, and
        !          2258: .IP g.
        !          2259: the result the function intends to return to use for \fI?\fR.
        !          2260: .PP
        !          2261: Four functions for running hooks are provided for the user, two
        !          2262: for running slot hooks and base hooks for single items and two for
        !          2263: running slot hooks and base hooks for pairs of items.
        !          2264: \fBRunslothooks1\fR expects to be given the invoking function's
        !          2265: name, the structure and name of the slot on which to run the slot
        !          2266: hooks, and the value to be used for \fI*\fR.
        !          2267: \fBRunslothooks2\fR expects to be given the invoking function's
        !          2268: name, the two structures and name of the slot in them on which to
        !          2269: run the slot hooks, and the values to be used for \fI*\fR and \fI>*\fR.
        !          2270: \fBRunbasehooks1\fR expects to be given the invoking function's name
        !          2271: and the structure whose base hooks are to be run.
        !          2272: \fBRunbasehooks2\fR expects the invoking function's name, the two
        !          2273: structures whose base hooks are to be run and the result the
        !          2274: calling function plans to return.
        !          2275: .PP
        !          2276: If present, base hooks are run by most major PEARL functions.
        !          2277: If a base hook is labelled with \fI<foo\fR then the function
        !          2278: \fIfoo\fR will execute the hook just after entry and whatever
        !          2279: initialization is necessary.
        !          2280: If a base hook is labelled with \fI>foo\fR then the function \fIfoo\fR
        !          2281: will execute the hook just before exitting.
        !          2282: Slot hooks are run by most major PEARL functions which look through
        !          2283: the slots of a structure.
        !          2284: If a slot hook is labelled with \fI<foo\fR then the function \fIfoo\fR
        !          2285: will execute the hook just before processing the slot.
        !          2286: If a slot hook is labelled with \fI>foo\fR then the function \fIfoo\fR
        !          2287: will execute the hook just after processing the slot.
        !          2288: .PP
        !          2289: However, hooks can be turned off selectively or completely.
        !          2290: By setting the atoms \fB*runallslothooks*\fR and
        !          2291: \fB*runallbasehooks*\fR to nil, you can completely disable
        !          2292: the running of all hooks.
        !          2293: This is useful for debugging and also helps improve efficiency
        !          2294: a bit if you do not use hooks at all.
        !          2295: There is also an atom to go with each PEARL function (of the form
        !          2296: \fB*run...hooks*\fR) which can be used to disable hooks for selected
        !          2297: functions.
        !          2298: The following is a complete table of what PEARL functions run hooks
        !          2299: and the names of the labels that invoke them and the atoms that
        !          2300: control their running:
        !          2301: .LD
        !          2302: Base hooks are run by:                 \kminvoked by hooks labelled:
        !          2303:     create expanded                    \h'|\nmu'<expanded or >expanded 
        !          2304:     create individual                  \h'|\nmu'<individual or >individual 
        !          2305:     create pattern                     \h'|\nmu'<pattern or >pattern 
        !          2306:     smerge                             \h'|\nmu'<smerge or >smerge 
        !          2307:     nextitem                           \h'|\nmu'<nextitem or >nextitem 
        !          2308:     standardfetch *                    \h'|\nmu'<fetch or >fetch 
        !          2309:     expandedfetch *                    \h'|\nmu'<fetch or >fetch 
        !          2310:     fetcheverywhere *                  \h'|\nmu'<fetch or >fetch 
        !          2311:     insertdb                           \h'|\nmu'<insertdb or >insertdb 
        !          2312:     removedb                           \h'|\nmu'<removedb or >removedb 
        !          2313:     nextequal                          \h'|\nmu'<nextequal or >nextequal 
        !          2314:     indb                               \h'|\nmu'<indb or >indb 
        !          2315:     standardmatch                      \h'|\nmu'<match or >match 
        !          2316:     basicmatch                         \h'|\nmu'<match or >match 
        !          2317:     strequal                           \h'|\nmu'<strequal or >strequal 
        !          2318: _________
        !          2319: * \fIfetch\fR does not run hooks on function structures.
        !          2320: .sp 2
        !          2321: Slot hooks are run by:                 \h'|\nmu'invoked by hooks labelled:
        !          2322:     standardmatch                      \h'|\nmu'<match or >match
        !          2323:     basicmatch                         \h'|\nmu'<match or >match
        !          2324:     strequal                           \h'|\nmu'<strequal or >strequal
        !          2325:     path put                           \h'|\nmu'<put or >put
        !          2326:     path clear                         \h'|\nmu'<clear or >clear
        !          2327:     path addset                                \h'|\nmu'<addset or >addset
        !          2328:     path delset                                \h'|\nmu'<delset or >delset
        !          2329:     path addpred                       \h'|\nmu'<addpred or >addpred
        !          2330:     path delpred                       \h'|\nmu'<delpred or >delpred
        !          2331:     path get                           \h'|\nmu'<get or >get
        !          2332:     path getpred                       \h'|\nmu'<getpred or >getpred
        !          2333:     path gethook                       \h'|\nmu'<gethook or >gethook
        !          2334:     path apply                         \h'|\nmu'<apply or >apply
        !          2335: .sp 2
        !          2336: Hooks of both kinds are controlled by these atoms, initially t:
        !          2337:     *runallslothooks*  -- controls all slot hooks.
        !          2338:     *runallbasehooks*  -- controls all base hooks.
        !          2339:     *runputpathhooks*                  \h'|\nmu'*runclearpathhooks*
        !          2340:     *runaddsetpathhooks*               \h'|\nmu'*rundelsetpathhooks*
        !          2341:     *runaddpredpathhooks*              \h'|\nmu'*rundelpredpathhooks*
        !          2342:     *rungetpathhooks*                  \h'|\nmu'*rungetpredpathhooks*
        !          2343:     *rungethookpathhooks*              \h'|\nmu'*runapplypathhooks*
        !          2344:     *runmatchhooks*                    \h'|\nmu'*runsmergehooks*
        !          2345:     *runindividualhooks*               \h'|\nmu'*runexpandedhooks*
        !          2346:     *runpatternhooks*                  \h'|\nmu'*runnextitemhooks*
        !          2347:     *runfetchhooks*                    \h'|\nmu'*runinsertdbhooks*
        !          2348:     *runremovedbhooks*                 \h'|\nmu'*runindbhooks*
        !          2349:     *runnextequalhooks*                        \h'|\nmu'*runstrequalhooks*
        !          2350: .DE
        !          2351: .PP
        !          2352: It is likely that hooks attached to a particular function would like to run
        !          2353: the same function in such a way that hooks will not be invoked.
        !          2354: Or in general, it is possible that you will want to run some PEARL function
        !          2355: in such a way that it is "hidden" from hooks.
        !          2356: To make this easy, a macro is provided called \fBhidden\fR which temporarily
        !          2357: sets the atom \fI*run...hooks*\fR to nil, runs a command and then restores
        !          2358: the former value of that atom.
        !          2359: For this to work correctly, you \fBmust\fR invoke the function you wish hidden
        !          2360: with the name corresponding to the "..." in its \fI*run...hooks*\fR atom.
        !          2361: Thus, you can hide the creation of an individual from hooks by executing:
        !          2362: .DS
        !          2363: (hidden (individual PTrans ....) )
        !          2364: .DE
        !          2365: (see Section 27 for the macro \fIindividual\fR) but \fBnot\fR by executing:
        !          2366: .DS
        !          2367: (hidden (create individual PTrans ....) )
        !          2368: .DE
        !          2369: A parallel function \fBvisible\fR temporarily sets the associated
        !          2370: atom to \fIt\fR before evaluating the function.
        !          2371: .PP
        !          2372: One of the reasons that hooks are checked for both before and after
        !          2373: a PEARL function does its job is to provide the user with the
        !          2374: opportunity to affect the result of the particular task.
        !          2375: In the simplest case, a hook simply executes a piece of code
        !          2376: and does not directly affect the function it is labelled with.
        !          2377: However, if the value returned by a hook is a list whose \fIcar\fR
        !          2378: is either \fB*done*\fR, \fB*fail*\fR, and \fB*use*\fR, then the action
        !          2379: of that function will be modified.
        !          2380: If the result of a hook which runs before the task starts with
        !          2381: \fI*done*\fR, then the hook is presumed to have accomplished what the
        !          2382: PEARL function was supposed to have done and the function will return
        !          2383: immediately with the \fIcadr\fR of the hook's result if there is
        !          2384: one, or else with the structure being operated on (for base hooks)
        !          2385: or the value in the slot (for slot hooks).
        !          2386: If the result of a hook which runs after the task starts with
        !          2387: \fI*done*\fR, then the function will return immediately with the
        !          2388: \fIcadr\fR of the hook's result if there is one, or else with
        !          2389: the result that was going to be return anyway.
        !          2390: .PP
        !          2391: If the result of a hook which runs before the task starts with
        !          2392: \fI*fail*\fR, then the hook is presumed to have determined that the
        !          2393: PEARL function should quit and the function will return
        !          2394: immediately with the \fIcadr\fR of the hook's result if there is one,
        !          2395: or else with the atom \fI*fail*\fR.
        !          2396: If the result of a hook which runs after the task starts with
        !          2397: \fI*fail*\fR, then the function will return immediately with the
        !          2398: \fIcadr\fR of the hook's result (which may be nil).
        !          2399: .PP
        !          2400: If the result of a hook which runs before the task starts with
        !          2401: \fI*use*\fR, then the hook is presumed to have determined that the
        !          2402: PEARL function should use a different value instead of the originally
        !          2403: provided one and the function will use the \fIcadr\fR of the hook's
        !          2404: result for the rest of the task.
        !          2405: If the result of a hook which runs after the task starts with
        !          2406: \fI*use*\fR, then the function will replace its intended result with
        !          2407: the \fIcadr\fR of the hook's result (which may be nil).
        !          2408: Thus, for example, a slot hook labelled with \fI<match\fR can
        !          2409: short-circuit the matching of a slot and one labelled with
        !          2410: \fI<match\fR can reverse the decision made by matching of a slot.
        !          2411: Similarly, a base hook labelled with \fI<match\fR can use its own matching
        !          2412: algorithm and one labelled with \fI>match\fR can modify the result of the
        !          2413: whole match.
        !          2414: .PP
        !          2415: Obviously, these all should be used with great care.
        !          2416: Note that \fIreturn immediately\fR means without even running
        !          2417: any other slot hooks on that slot for slot hooks or without
        !          2418: running any other base hooks on that structure for base hooks.
        !          2419: .PP
        !          2420: For example consider the case of a structure representing someone's
        !          2421: order in a Chinese restaurant.
        !          2422: As items are added to the order, it would be nice if there was a
        !          2423: magical slot TotalBill that contained the current
        !          2424: running total of the cost of the items ordered.
        !          2425: Demons, being such magical creatures, fill the bill nicely.
        !          2426: However, we only wish to have our demon-like hooks
        !          2427: activated when particular slots are filled (added to or accessed).
        !          2428: First consider the simple case in which an order consists of
        !          2429: three items only, the name of the soup and one or two entrees:
        !          2430: .DS
        !          2431: (create base  Chinese-Food-Entree
        !          2432:        (Name  lisp)
        !          2433:        (Price  int) )
        !          2434: .DE
        !          2435: .DS
        !          2436: (create base  Chinese-Dinner-Order
        !          2437:        (Soup  Chinese-Food-Entree)
        !          2438:        (Entree1  Chinese-Food-Entree)
        !          2439:        (Entree2  Chinese-Food-Entree)
        !          2440:        (TotalBill  int) )
        !          2441: .DE
        !          2442: .DS
        !          2443: (create individual  Chinese-Food-Entree
        !          2444:        (Name  (Hot And Sour Soup) )
        !          2445:        (Price  323) )
        !          2446: .DE
        !          2447: .DS
        !          2448: (create individual  Chinese-Food-Entree
        !          2449:        (Name  (Sizzling Rice Soup) )
        !          2450:        (Price  349) )
        !          2451: .DE
        !          2452: .DS
        !          2453: (create individual  Chinese-Food-Entree
        !          2454:        (Name  (Lingnan Beef) )
        !          2455:        (Price  399) )
        !          2456: .DE
        !          2457: .DS
        !          2458: (create individual  Chinese-Food-Entree
        !          2459:        (Name  (Mandarin Chicken) )
        !          2460:        (Price  367) )
        !          2461: .DE
        !          2462: .DS
        !          2463: (create individual  Chinese-Food-Entree
        !          2464:        (Name  (Shrimp Cantonese) )
        !          2465:        (Price  479) )
        !          2466: .DE
        !          2467: .DS
        !          2468: ; an undetermined meal is created.
        !          2469: (create individual  Chinese-Dinner-Order Meal
        !          2470:        (Soup  ^  if  >put  (Maintain-Total  *  **  =TotalBill) )
        !          2471:        (Entree1  ^  if  >put  (Maintain-Total  *  **  =TotalBill) )
        !          2472:        (Entree2  ^  if  >put  (Maintain-Total  *  **  =TotalBill) )
        !          2473:        (TotalBill  0) )
        !          2474: .DE
        !          2475: Note that a slot hook is put after the value in a slot by using
        !          2476: the word \fBif\fR (or \fBhook\fR) followed by the appropriate label
        !          2477: for the invoking function followed by the function name or
        !          2478: s-expression to be evaluated.
        !          2479: Note also that when you want to put hooks on slots of an individual but
        !          2480: do not want to specify a value, the use of \fB"^"\fR will instruct
        !          2481: \fIcreate\fR to copy the default value instead.
        !          2482: If the Maintain-Total function is properly specified, whenever
        !          2483: one replaces one of the food slots with a real dish using
        !          2484: the \fIputpath\fR function, the Maintain-Total function would be
        !          2485: activated and would add the price of that meal to the running total
        !          2486: in the TotalBill slot.
        !          2487: If one changed one's mind a lot, it would be necessary to include
        !          2488: another hook Remove-Price which would be activated by a \fIclearpath\fR.
        !          2489: This would require adding the \fIif-cleared\fR hook
        !          2490: \fI"if >clear Remove-Price"\fR after the \fIif-put\fR hook:
        !          2491: .DS
        !          2492: (create individual  Chinese-Dinner-Order  ChangingMeal
        !          2493:        (Soup  ^  if  >put  (Maintain-Total  *  **  =TotalBill)
        !          2494:                  if  >clear  (Remove-Price  *  **  =TotalBill) )
        !          2495:        (Entree1  ^ if  >put  (Maintain-Total  *  **  =TotalBill)
        !          2496:                    if  >clear  (Remove-Price  *  **  =TotalBill) )
        !          2497:        (Entree2  ^ if  >put  (Maintain-Total  *  **  =TotalBill)
        !          2498:                    if  >clear  (Remove-Price  *  **  =TotalBill) )
        !          2499:        (TotalBill  0) )
        !          2500: .DE
        !          2501: The code for the two hooks follows:
        !          2502: .DS
        !          2503: (de Maintain-Total  (Food  Meal  CurrentMealTotal)
        !          2504:     (putpath  Meal  '(TotalBill)
        !          2505:              (*plus  CurrentTotal
        !          2506:                      (getpath  Food  '(Price) ) ) ) )
        !          2507: .DE
        !          2508: .DS
        !          2509: (de Remove-Price  (Food  Meal  CurrentMealTotal)
        !          2510:     (putpath  Meal  '(TotalBill)
        !          2511:              (*plus  CurrentTotal
        !          2512:                      (getpath  Food  '(Price) ) ) ) )
        !          2513: .DE
        !          2514: .PP
        !          2515: A more flexible meal order structure would not have three slots
        !          2516: for food, but rather a single slot of type \fIsetof struct\fR.
        !          2517: Then entries would be added by the \fIaddsetpath\fR functions,
        !          2518: and the \fIif-put\fR hook would be an \fIif-addset\fR hook but the
        !          2519: code would essentially be the same.
        !          2520: .PP
        !          2521: To attach a base hook to a structure, the first "slot" in its definition
        !          2522: must start with one of the atoms \fBif\fR or \fBhook\fR.
        !          2523: The rest of the slot must then contain a sequence of labels for invoking
        !          2524: functions and function names or s-expressions to be evaluated.
        !          2525: For example, to invoke \fIvalprint\fR before and a user function called
        !          2526: \fIverify\fR afterwards whenever a PTrans is inserted into the data base,
        !          2527: you would define PTrans as follows:
        !          2528: .DS
        !          2529: (create base  PTrans
        !          2530:        (if <insertdb (valprint * 5)
        !          2531:            >insertdb (verify *))
        !          2532:        (* Actor  symbol)
        !          2533:        (   Object  symbol)
        !          2534:        (   From  symbol)
        !          2535:        (   To  symbol) )
        !          2536: .DE
        !          2537: .PP
        !          2538: Recall that PEARL provides a print function called \fBfullprint\fR
        !          2539: which for most structures seen so far printed two extra \fInil\fRs
        !          2540: in each slot.
        !          2541: If a slot has predicates, the first \fInil\fR will be replaced by
        !          2542: a list of them.
        !          2543: If the slot has hooks, the second \fInil\fR will be
        !          2544: replaced by a list of cons-cells with the invoking function in the
        !          2545: \fIcar\fR and the hook in the \fIcdr\fR.
        !          2546: .PP
        !          2547: The invocation of hooks labelled with other forms of \fIpath\fR are similar
        !          2548: except for \fIapply\fR.
        !          2549: If \fI(path <apply Fcn ...)\fR or \fI(path >apply Fcn ...)\fR is executed,
        !          2550: then any hooks which are labelled with Fcn will be run.
        !          2551: .PP
        !          2552: At this point the syntax of a slot in a definition or individual has become
        !          2553: quite complicated, so we summarize with the following BNF grammar:
        !          2554: .DS
        !          2555: { a b c }      means select one of a, b, or c.
        !          2556: [ XXX ]                means optionally XXX.
        !          2557: XXX *          means zero or more XXX's
        !          2558: x | y          means x or y
        !          2559: .DE
        !          2560: .ID
        !          2561: <BaseSlot> ::=  (
        !          2562:                <HashLabels>
        !          2563:                <SlotName>
        !          2564:                <SlotType>
        !          2565:                <InheritOrValue>
        !          2566:                <AdjunctVariable>
        !          2567:                <PredicatesAndHooks>
        !          2568:                )
        !          2569: <IndividualSlot> ::=  (
        !          2570:                      <SlotName>
        !          2571:                      <InheritOrValue>
        !          2572:                      <AdjunctVariable>
        !          2573:                      <PredicatesAndHooks>
        !          2574:                      )
        !          2575: <ExpandedSlot> ::= <BaseSlot> | <IndividualSlot>
        !          2576: .sp 1
        !          2577: <HashLabels>  ::=  { "&" "^" "*" "**" ":" "::" ">" "<" } * 
        !          2578: <SlotType>  ::=  { "struct" "symbol" "int" "lisp" }  |
        !          2579:                 "setof" <SlotType>  |  <OrdinalName>  |
        !          2580:                 <StructureName>
        !          2581: <InheritOrValue>  ::=  <Value>  |  "^"  |  "nil"  |
        !          2582:                      "==" <Value>  |  ":=" <Value>
        !          2583: <Value> ::= <integer>  |  <atom>  |  <list>  |  <Variable>
        !          2584: <AdjunctVariable>  ::=   [ ":" <Variable> ]
        !          2585: <Variable>  ::=  ?<atom>
        !          2586: <PredicatesAndHooks>  ::=  { <Predicate>  |  <Hook> } *
        !          2587: <Predicate>  ::=  <StructureName>  |  <S-Expression>
        !          2588: <Hook>  ::=  "if" <atom> <HookFunction>
        !          2589: <HookFunction>  ::=  <atom>  |  <S-Expression>
        !          2590: .DE
        !          2591: .NH
        !          2592: Creating and Manipulating Multiple Data Bases
        !          2593: .PP
        !          2594: Without any effort on the user's part, a single data base of a
        !          2595: default size exists in PEARL when it starts up.
        !          2596: It is called \fB*maindb*\fR and is pointed to by the special
        !          2597: variable \fB*db*\fR which is assumed by all functions which use a
        !          2598: data base to point to the default data base (that is, the data
        !          2599: base to be used when an expected data base argument is missing).
        !          2600: .PP
        !          2601: To build another data base, choose a name for it and call the
        !          2602: function \fBbuilddb\fR which is an nlambda (fexpr) expecting
        !          2603: the name of the new data base.
        !          2604: You may build as many as you wish and store whichever one you want
        !          2605: in \fI*db*\fR.
        !          2606: .PP
        !          2607: Sometimes one may wish to clear out the data base and start out with a
        !          2608: clean slate.
        !          2609: To make this easy, there is a special function \fBcleardb\fR
        !          2610: which expects either zero or one data bases as arguments
        !          2611: and does the job.
        !          2612: If it receives no arguments, then the default data base is cleared.
        !          2613: \fICleardb\fR removes everything from the data base,
        !          2614: but does not actually delete (or reclaim the storage space of) the
        !          2615: objects within the data base.
        !          2616: But if the objects inside are not pointed to by any program
        !          2617: variables, they are gone for good.
        !          2618: (\fICleardb\fR clears out \fIonly\fR the named data base and not
        !          2619: data bases that it may be built upon as described in the next section.)
        !          2620: .PP
        !          2621: Data bases contain two parts, referred to as \fIdb1\fR and \fIdb2\fR.
        !          2622: \fIDb1\fR contains items which are indexed under only their type
        !          2623: or using single-colon hashing.
        !          2624: Its default size is 29.
        !          2625: \fIDb2\fR contains items which are indexed under two or three
        !          2626: values.
        !          2627: Its default size is 127.
        !          2628: These sizes are chosen to be prime numbers which are just barely
        !          2629: smaller than a power of two.
        !          2630: (This choice was made to take full advantage of hunks in Franz Lisp
        !          2631: which are always allocated to be a power of two.)
        !          2632: The ratio between the two sizes is approximately 1 to 4.
        !          2633: The size for data bases may be chosen by specifying the
        !          2634: power of two that you wish \fIdb2\fR to close to.
        !          2635: .PP
        !          2636: The function \fBsetdbsize\fR expects an integer between 2 and 13
        !          2637: representing the power to which two should be raised.
        !          2638: The default data base size is thus the result of calling
        !          2639: \fIsetdbsize\fR with an argument of 7.
        !          2640: To change the default size, you should call \fIsetdbsize\fR
        !          2641: in your \fI.init.prl\fR file, before creating any data bases of your
        !          2642: own.
        !          2643: \fISetdbsize\fR rebuilds \fI*maindb*\fR (without putting
        !          2644: anything into the new one) and releases all other data bases.
        !          2645: Thus, it should not \fInormally\fR be used at any time after the
        !          2646: processing of the \fI.init.prl\fR file.
        !          2647: (In the Franz Lisp version, although this full range of values is
        !          2648: accepted, the largest a data base in the 1 to 4 ratio can be
        !          2649: is 29 + 127 since hunks are limitted to 128 words.
        !          2650: However, an argument of 9 to \fIsetdbsize\fR will set the sizes
        !          2651: of both data bases to 127.)
        !          2652: Related special variables are \fB*db1size*\fR and
        !          2653: \fB*db2size*\fR which are set by \fIsetdbsize\fR and
        !          2654: \fB*availablesizes*\fR which contains the assoc-list used
        !          2655: to associate the power of two to a size.
        !          2656: .NH
        !          2657: Creating a Forest of Data Bases
        !          2658: .PP
        !          2659: Although having multiple data bases which are unconnected is often
        !          2660: enough, it is sometimes convenient to build onto an already
        !          2661: existing data base in a tree-like fashion.
        !          2662: For example, in a story understanding program, one might want
        !          2663: to have the default data base containing long-term knowledge
        !          2664: and then add a data base to contain the knowledge specific to a
        !          2665: particular story being processed.
        !          2666: In large applications, it can also help to split up special kinds
        !          2667: of knowledge to improve efficiency even more than PEARL's hashing
        !          2668: already does.
        !          2669: With only the ability to build separate data bases, searching for
        !          2670: a fact which might be either general knowledge or specific
        !          2671: knowledge learned from the story would require two fetches, one
        !          2672: from each data base.
        !          2673: However, if the story data base is built on top of the main data
        !          2674: base then simply fetching an item from the story data base will
        !          2675: also include fetching from the main data base.
        !          2676: To build another data base upon an existing one, use the function
        !          2677: \fBbuilddb\fR with two arguments, the name of the new data base
        !          2678: and the name of the old one to build onto:
        !          2679: .DS
        !          2680: (builddb  *story*  *maindb*)
        !          2681: (builddb  *future*  *maindb*)
        !          2682: .DE
        !          2683: These two statements will build two data bases on top of the main
        !          2684: one such that fetching from *story* will look both in it and in
        !          2685: *maindb* but not in *future*.
        !          2686: You can then build further upon any of these if you wish.
        !          2687: Note however, that the second argument must be \fIthe name of the
        !          2688: data base to build upon\fR and cannot be \fI*db*\fR to build upon
        !          2689: the default data base.
        !          2690: Also, if the second argument is missing, then the new data base is
        !          2691: isolated, not built on top of the default data base.
        !          2692: .PP
        !          2693: If your program builds many data bases, it is likely that some of
        !          2694: them will be temporary ones.
        !          2695: If this is so, it is possible to release a data base so that the
        !          2696: space can be garbage collected or reused for a later data base.
        !          2697: To release a data base, pass the actual data base (not its name)
        !          2698: to the function \fBreleasedb\fR.
        !          2699: If the data base is not a leaf of the data base tree, then the
        !          2700: space will not actually be released until all its children
        !          2701: are released also but PEARL will no longer accept it as a data
        !          2702: base argument.
        !          2703: .PP
        !          2704: A list of the names of the currently active data bases is
        !          2705: maintained by PEARL in the special variable \fB*activedbnames*\fR.
        !          2706: .NH
        !          2707: Creating Expanded Subtypes of Previously Defined Objects
        !          2708: .PP
        !          2709: Within CD, as in many applications, you may have many different structures
        !          2710: with some slots with the same name.
        !          2711: PEARL allows this, as it can always tell which type of structure
        !          2712: you are using, and thus it behaves just as if you had used
        !          2713: unique names for all slots.
        !          2714: But sometimes the fact that two different structure types have
        !          2715: slots with the same names is more than a coincidence:
        !          2716: there may be various semantic similarities
        !          2717: between the similar parts of the two structures.
        !          2718: PEARL has a mechanism for creating such structures using the
        !          2719: \fBexpanded\fR selector to \fIcreate\fR.
        !          2720: Basically, you must first define a base structure that contains
        !          2721: all the identical parts of two or more structures, and then you
        !          2722: must define the structures themselves as \fIthe base plus the differences\fR.
        !          2723: A good example of this from CD involves Acts.
        !          2724: All Acts within CD have an Actor slot, and all of
        !          2725: these slots have the same meaning.
        !          2726: That is, whatever is going on, the person in the actor slot is the
        !          2727: motivating force.
        !          2728: So we may first define this common part as a normal
        !          2729: base structure:
        !          2730: .DS
        !          2731: (create base  Act
        !          2732:        (*  Actor  symbol) )
        !          2733: .DE
        !          2734: and then we can define the various acts as expansions upon this base:
        !          2735: .DS
        !          2736: (create expanded  Act  PTrans
        !          2737:        (Object  symbol)
        !          2738:        (From  symbol)
        !          2739:        (To  symbol) )
        !          2740: .DE
        !          2741: .DS
        !          2742: (create expanded  Act  MTrans
        !          2743:        (MObject  struct)
        !          2744:        (From  symbol)
        !          2745:        (To  symbol) )
        !          2746: .DE
        !          2747: .DS
        !          2748: (create expanded  Act  ATrans
        !          2749:        (Object  symbol)
        !          2750:        (From  symbol)
        !          2751:        (To  symbol) )
        !          2752: .DE
        !          2753: .DS
        !          2754: (create expanded  Act  Injest
        !          2755:        (Object  symbol)
        !          2756:        (Through  symbol) )
        !          2757: .DE
        !          2758: Note that we did \fBnot\fR have to list the Actor slot,
        !          2759: it was \fBinherited\fR from the base structure Act.
        !          2760: The structure to be expanded need not be a base structure,
        !          2761: but could itself be an \fIexpanded\fR structure.
        !          2762: Thus we can capture the similarities of the various Transfers with:
        !          2763: .DS
        !          2764: (create expanded  Act  Trans
        !          2765:        (From  symbol)
        !          2766:        (To  symbol) )
        !          2767: .DE
        !          2768: followed by
        !          2769: .DS
        !          2770: (create expanded  Trans  PTrans
        !          2771:        (Object  symbol) )
        !          2772: .DE
        !          2773: .DS
        !          2774: (create expanded  Trans  MTrans
        !          2775:        (MObject  symbol) )
        !          2776: .DE
        !          2777: .DS
        !          2778: (create expanded  Trans  ATrans
        !          2779:        (Object  symbol) )
        !          2780: .DE
        !          2781: In expanded definitions as in base definitions one can
        !          2782: specify hashing and default information in the usual way.
        !          2783: However one can selectively inherit some of this
        !          2784: information from the structure being expanded.
        !          2785: Thus in our first Act example, since we specified star hashing on the
        !          2786: Actor slot, all the structures that we defined in terms of Act
        !          2787: have star hashing on their Actor slot by default.
        !          2788: If we had not wanted this for ATrans, we could have specified this
        !          2789: simply by listing the Actor slot over again without the asterisk.
        !          2790: However, since PEARL requires old slots in expanded structures
        !          2791: to also provide a new value, we need some way to say \fIinherit the
        !          2792: same old value\fR.
        !          2793: This is done by putting an up-arrow \fB"^"\fR where PEARL expects
        !          2794: to find a value, just as when you want to inherit the default
        !          2795: value but add hooks or predicates when creating individuals.
        !          2796: .DS
        !          2797: (create expanded  Act  ATrans
        !          2798:        (Actor  ^)
        !          2799:        (From  symbol) )
        !          2800: .DE
        !          2801: We also could have added colon hashing to the Actor slot by
        !          2802: listing it above as normal.
        !          2803: However, we cannot change the type of a slot and including a type
        !          2804: name after \fIActor\fR will cause PEARL to try to interpret that
        !          2805: type name as a value, (resulting in any of several errors,
        !          2806: depending on the type).
        !          2807: Thus, the hashing information for any slot is inherited from
        !          2808: above, \fIunless\fR it the slot appears in the expanded structure.
        !          2809: .PP
        !          2810: Default values are inherited in almost the same way.
        !          2811: The exception is that if in the original structure
        !          2812: the default is preceded by the symbol \fB":="\fR (rather than being
        !          2813: preceded by either nothing or the symbol \fB"=="\fR), expansions of that
        !          2814: structure will not inherit this value, but instead will get the
        !          2815: standard default for that type.
        !          2816: So if one defines:
        !          2817: .DS
        !          2818: (symbol  Pandora)
        !          2819: .DE
        !          2820: .DS
        !          2821: (create base  Act
        !          2822:        (Actor  symbol  Pandora) )
        !          2823: 
        !          2824:                or
        !          2825: .DE
        !          2826: .DS
        !          2827: (create base  Act
        !          2828:        (Actor  symbol  ==  Pandora) )
        !          2829: .DE
        !          2830: .DS
        !          2831: (create expanded  Act  PTrans
        !          2832:        (From  symbol) )
        !          2833: .DE
        !          2834: then all PTranses will have Pandora as their default Actor, whereas with:
        !          2835: .DS
        !          2836: (create base  Act
        !          2837:        (Actor  symbol  :=  Pandora) )
        !          2838: .DE
        !          2839: .DS
        !          2840: (create expanded  Act  PTrans
        !          2841:        (From  symbol) )
        !          2842: .DE
        !          2843: only the default instance of Act will have Pandora in its Actor
        !          2844: slot and the default Actor of PTrans will just be the usual
        !          2845: default for \fIsymbol\fR-valued slots which is \fInilsym\fR.
        !          2846: Which type of default inheritance to use depends upon the
        !          2847: application, and must be decided on a case by case basis.
        !          2848: .PP
        !          2849: Given this hierarchy, it is often useful to check whether an
        !          2850: object is of a certain type or an expanded version of it.
        !          2851: Two functions provide this ability with slightly different
        !          2852: arguments.
        !          2853: \fBIsa\fR expects an item and the name of the type you want to
        !          2854: check for.
        !          2855: \fBIsanexpanded\fR expects two instances.
        !          2856: Thus the following are always true for any structure X:
        !          2857: .DS
        !          2858: (isa  X  (pname X))
        !          2859: (isanexpanded  X  X)
        !          2860: .DE
        !          2861: Two related functions are \fBnullstruct\fR and \fBnullsym\fR which
        !          2862: are functions for testing for \fInilstruct\fR and \fInilsym\fR
        !          2863: (similar to \fInull\fR for \fInil\fR).
        !          2864: .NH
        !          2865: Fetching Expanded Structures
        !          2866: .PP
        !          2867: To make the extra information that \fIexpanded\fR structures provide
        !          2868: more useful, a special version of \fIfetch\fR called \fBexpandedfetch\fR
        !          2869: is provided which takes the hierarchy of structures defined into
        !          2870: account when fetching.
        !          2871: For example, using the above hierarchical
        !          2872: definitions of Act, Trans, PTrans, MTrans, and ATrans, you can insert
        !          2873: three different Transes into the data base:
        !          2874: .DS
        !          2875: (dbcreate individual  PTrans
        !          2876:          (Actor  Pandora)
        !          2877:          (Object  Pandora) )
        !          2878: .DE
        !          2879: .DS
        !          2880: (dbcreate individual  MTrans
        !          2881:          (Actor  Pandora)
        !          2882:          (To  Pandora) )
        !          2883: .DE
        !          2884: .DS
        !          2885: (dbcreate individual  ATrans
        !          2886:          (Actor  Pandora)
        !          2887:          (From  Pandora) )
        !          2888: .DE
        !          2889: and then to fetch all Transes performed by Pandora, you could use:
        !          2890: .DS
        !          2891: (create pattern  Trans  TransPattern
        !          2892:        (Actor  Pandora) )
        !          2893: .DE
        !          2894: .DS
        !          2895: (expandedfetch  TransPattern)
        !          2896: .DE
        !          2897: Once you start using expanded structures, you usually want to be
        !          2898: able to use the function name \fIfetch\fR and mean \fIexpandedfetch\fR. 
        !          2899: To this end, the standard fetch function is actually called
        !          2900: \fBstandardfetch\fR.
        !          2901: This leaves the function \fBfetch\fR to be bound to whichever
        !          2902: fetch function you wish.
        !          2903: It is initially given the same function definition as
        !          2904: \fIstandardfetch\fR.
        !          2905: .NH
        !          2906: How Two Objects Match
        !          2907: .PP
        !          2908: When a fetch from the data base is performed, the pattern provided
        !          2909: is only used to construct a stream containing that pattern and the
        !          2910: appropriate hash bucket from the data base;
        !          2911: no matching (comparing)
        !          2912: between the pattern and objects in the data base occurs.
        !          2913: Thus the stream contains pointers to all data base items in the
        !          2914: same hash bucket, regardless of their likelihood of
        !          2915: matching the pattern.
        !          2916: When elements are extracted from the stream with the function
        !          2917: \fInextitem\fR, the pattern is "matched" against successive
        !          2918: items from the hash bucket until one matches (and is returned)
        !          2919: or until the potential items run out (and \fInil\fR is returned).
        !          2920: .NH 2
        !          2921: When Is a Pattern Not a Pattern?
        !          2922: .PP
        !          2923: To understand the process with which two objects are
        !          2924: matched, it is necessary to understand what is meant by
        !          2925: a \fIpattern\fR in the context of matching.
        !          2926: The term \fIpattern\fR has been used in two ways in PEARL.
        !          2927: It has been used previously in this documentation in
        !          2928: a specialized sense which is only relevant in the context
        !          2929: of creating a \fIpattern\fR.
        !          2930: The use of the \fIpattern\fR selector to \fIcreate\fR is simply a
        !          2931: variation on \fIcreate individual\fR which uses the match-anything
        !          2932: variable ?*any* as the default for unspecified slots instead
        !          2933: of the usual default values (either the one inherited from the
        !          2934: base definition or the default for the type of slot).
        !          2935: It is called creating a \fIpattern\fR because the
        !          2936: change of default is usually only useful for constructing a pattern.
        !          2937: .PP
        !          2938: However, the use of the function \fIcreate\fR with object
        !          2939: selector \fIpattern\fR is \fBnot\fR the only way to create a
        !          2940: pattern which can be matched;
        !          2941: in fact, it is only useful for
        !          2942: forming simple patterns.
        !          2943: \fBAny\fR individual structure in PEARL can be used as a pattern.
        !          2944: If a fully specified structure (that is, one with an actual value
        !          2945: in all of its slots) is used as a pattern for fetching, it will
        !          2946: only match objects which are equal to it in a manner similar to
        !          2947: \fIequal\fR (versus \fIeq\fR) in Lisp.
        !          2948: (An exception to this occurs when patterns with pattern-matching
        !          2949: variables are stored in the data base.)
        !          2950: Thus a fully specified pattern is only useful for
        !          2951: determining whether a particular fact (object) is in the data base.
        !          2952: Any object is a pattern but the interesting patterns will not
        !          2953: be fully specified;
        !          2954: rather, they will have unspecified slots
        !          2955: which contain pattern-matching variables instead of values.
        !          2956: The details of the matching process will now be described.
        !          2957: .NH 2
        !          2958: The Matching Process
        !          2959: .PP
        !          2960: In general, the matching procedure takes two structures and either,
        !          2961: neither or both may contain pattern-matching variables.
        !          2962: So conceptually, both are patterns.
        !          2963: If the structures are not definitionally the same type
        !          2964: then the match fails automatically.
        !          2965: Otherwise, each structure is viewed as a sequence of slots
        !          2966: which are successively "matched" between the two structures.
        !          2967: Two structures of the same type match if and only if each of
        !          2968: their slots "matches" the corresponding slot of the other structure.
        !          2969: Each slot is of one of four types (\fIstruct\fR, \fIsymbol\fR, \fIint\fR,
        !          2970: or \fIlisp\fR), or is a \fIsetof\fR one of these types.
        !          2971: Regardless of its type, each slot is filled in one of four ways:
        !          2972: .IP (1)
        !          2973: The slot may contain an actual value of its type (for example,
        !          2974: a slot of type \fIstruct\fR may contain a PTrans).
        !          2975: .IP (2)
        !          2976: The slot may contain a variable which is local to the structure
        !          2977: (pattern-matching variables are local unless otherwise specified).
        !          2978: .IP (3)
        !          2979: The slot may contain a global variable, declared previously by a
        !          2980: call to the function \fIglobal\fR with the variable's name as argument.
        !          2981: .IP (4)
        !          2982: The slot may contain the special match-anything variable ?*any*.
        !          2983: .LP
        !          2984: If the slot contains a variable (other than ?*any*) which has not
        !          2985: been bound then it may become bound as a side effect of the
        !          2986: matching process.
        !          2987: All local pattern-matching variables are unbound at the start
        !          2988: of the matching process.
        !          2989: When a local variable is bound to a real
        !          2990: value during the matching process (it will never be bound to a
        !          2991: variable), it will not be unbound again but for the purposes of
        !          2992: matching will be treated as if the slot were filled with that value.
        !          2993: .PP
        !          2994: Let us now examine each of the pairings of slot values
        !          2995: which may occur and how they are matched.
        !          2996: If either of the two slots being matched contains the
        !          2997: special variable ?*any*, then the slots match by definition,
        !          2998: regardless of the contents of the other slot.
        !          2999: If both slots contain variables that are unbound, the slots
        !          3000: do not normally match, (even if the two variables are textually
        !          3001: the same name).
        !          3002: (Since some users want two unbound variables to match,
        !          3003: the value to be returned in this case is stored in the
        !          3004: special variable \fB*matchunboundsresult*\fR whose
        !          3005: initial value is \fInil\fR.
        !          3006: Setting this variable to non-\fInil\fR will cause two unbound
        !          3007: variables to match immediately but will not cause their
        !          3008: predicates to be run.)
        !          3009: If one slot contains an unbound variable (and the other
        !          3010: a bound variable or a value), then the predicates and
        !          3011: restrictions of the slot with the unbound variable are
        !          3012: tested, and hooks on that slot labelled
        !          3013: with \fImatch\fR are run to see if the unbound variable
        !          3014: should be bound to the bound value.
        !          3015: If so, then the unbound variable is bound to the value
        !          3016: of the other slot, and the two slots match.
        !          3017: Note that only the predicates and hooks on the
        !          3018: structure containing the unbound variable are run while
        !          3019: the symbols *, **, and =<slotname> refer to the other
        !          3020: structure (with the bound value in it).
        !          3021: If the predicates or restrictions return \fInil\fR,
        !          3022: the two slots do not match, the variable
        !          3023: is not bound, and the entire match fails.
        !          3024: .PP
        !          3025: If both slots contain either bound variables or values, then the values
        !          3026: of the two slots are compared.  If the slot is of type \fIstruct\fR,
        !          3027: then the entire matching algorithm is recursively applied.
        !          3028: If the slot is of types \fIint\fR or \fIlisp\fR,
        !          3029: then \fIequal\fR is used.
        !          3030: If the type is \fIsymbol\fR, then the two values must
        !          3031: be the same symbol.
        !          3032: Regardless of the type, restrictions associated with the slot
        !          3033: are executed until one fails or there are no more to run.
        !          3034: All must succeed for the match to succeed.
        !          3035: If the match succeeds, then any hooks
        !          3036: with the label \fImatch\fR are run.
        !          3037: .PP
        !          3038: The difference between the two types of variables is one of scope.
        !          3039: Normal variables (for PEARL) do not need to be declared, and
        !          3040: may be used in any structure by typing in \fI?<var>\fR during a
        !          3041: \fIcreate\fR (note that \fIputpath\fR is incapable of
        !          3042: installing variables).
        !          3043: The scope of these variables is only over the structure
        !          3044: in which they are typed.
        !          3045: Thus the variable \fI?V\fR typed into two different creations of
        !          3046: structures are in no way connected (in the same manner as two
        !          3047: local variables V in different Pascal subroutines are unrelated.)
        !          3048: If one becomes bound, the other is unaffected.
        !          3049: On the other hand, if a variable name is previously declared
        !          3050: as \fBglobal\fR:
        !          3051: .DS
        !          3052: (global  G)
        !          3053: .DE
        !          3054: then all instances of the variable name ?G are the same
        !          3055: (similar to global variables in Pascal).
        !          3056: The list of global variables is kept in the special variable \fB*globallist*\fR.
        !          3057: .PP
        !          3058: As mentioned before, when two structures are matched, all
        !          3059: normal (local) variables in both structures are unbound
        !          3060: (bound to the value \fI*pearlunbound*\fR) before any
        !          3061: slots are compared.
        !          3062: This is to ensure that any bindings induced by a previous
        !          3063: unsuccessful (or successful for that matter) match are removed.
        !          3064: This rule is useful because the type of matching that
        !          3065: early PEARL users have needed is in matching most
        !          3066: patterns against fully-specified values (that is, cases
        !          3067: in which one slot is always bound and the other either
        !          3068: bound or unbound).
        !          3069: Global variables are \fBnot\fR unbound before each match,
        !          3070: so they can be used to reflect global contexts.
        !          3071: They are given the value *\fIpearlunbound*\fR at the
        !          3072: time they are declared and remain bound thereafter unless
        !          3073: explicitly unbound by the user.
        !          3074: To unbind a global variable, you may use use the function
        !          3075: \fBunbind\fR, a fexpr which requires
        !          3076: the name of a (previously declared) global variable:
        !          3077: .DS
        !          3078: (unbind  G)
        !          3079: .DE
        !          3080: or use \fIsetq\fR and the function \fBpunbound\fR which
        !          3081: simply returns the atom \fI*pearlunbound*\fR:
        !          3082: .DS
        !          3083: (setq  G  (punbound) )
        !          3084: .DE
        !          3085: The function \fBpboundp\fR will test the value of a Lisp
        !          3086: (not PEARL) variable to see if it is \fI*pearlunbound*\fR.
        !          3087: The function \fBglobalp\fR will determine whether the variable
        !          3088: passed to it has been declared global.
        !          3089: .PP
        !          3090: Global variables should be used with care so that
        !          3091: they are not set by unsuccessful matches.
        !          3092: Generally this is achieved by first collecting the value
        !          3093: desired into a local variable via a series of matches
        !          3094: (only the last of which succeed), and then using the result of
        !          3095: this success to cause a further action which is guaranteed to
        !          3096: correctly bind the value of the global variable.
        !          3097: (These actions may be hooks which rebind the global
        !          3098: variable every time the local one is bound.
        !          3099: Effectively, this is a way to say \fIalways unbind this particular
        !          3100: global variable before matches\fR.
        !          3101: The action also could be performed by the user's program
        !          3102: when the right value is found.)
        !          3103: .PP
        !          3104: Each structure or tree of structures built by a call to \fIcreate\fR
        !          3105: constructs an individual assoc(association)-list of all the local
        !          3106: variables in that structure.
        !          3107: This assoc-list is stored with the root of the tree, thus
        !          3108: achieving local uniqueness of variables within a structure.
        !          3109: Global variables are bound values of the Lisp atom of
        !          3110: the same name and are accessed in the usual way.
        !          3111: To access the value of a local variable in a structure,
        !          3112: one uses either the function \fBvalueof\fR (which is an expr)
        !          3113: or the fexpr \fBvarvalue\fR both of which have two
        !          3114: arguments: the name of the variable whose value
        !          3115: you want and the structure it occurs in (evaluated internally by
        !          3116: \fIvarvalue\fR).
        !          3117: For example, to get the value of ?G in X, use either of:
        !          3118: .DS
        !          3119: (valueof  'G  X)
        !          3120: (varvalue  G  X)
        !          3121: .DE
        !          3122: Thus PEARL uses both deep and shallow binding.
        !          3123: .PP
        !          3124: The match algorithm is available to the user as a
        !          3125: separate function by the name \fBstandardmatch\fR.
        !          3126: This function unbinds all local variables before
        !          3127: proceeding with the match (using the macro \fBunbindvars\fR)
        !          3128: and again afterwards if the match failed.
        !          3129: A function which assumes that all local variables have been
        !          3130: unbound already and proceeds just as \fIstandardmatch\fR
        !          3131: would is \fBbasicmatch\fR.
        !          3132: The function name used to access the matching function by
        !          3133: \fInextitem\fR and all other built-in PEARL functions is
        !          3134: \fBmatch\fR which is normally given the same function definition
        !          3135: as \fIstandardmatch\fR but can be bound to whichever match function
        !          3136: you wish.
        !          3137: A function which compares two structures for equality without
        !          3138: affecting the values of their variables is available as
        !          3139: \fBstrequal\fR.
        !          3140: Since it does not bind variables, it also does not execute
        !          3141: predicates although it does run base hooks and slot hooks labelled
        !          3142: with \fIstrequal\fR.
        !          3143: A function parallel to \fInextitem\fR which uses \fIstrequal\fR
        !          3144: instead of \fImatch\fR is available as \fBnextequal\fR.
        !          3145: .PP
        !          3146: This rest of this section covers other ways to access and affect
        !          3147: the values of variables.
        !          3148: It will make more sense after reading the next section on blocks
        !          3149: but fits in better here so you should probably leave it for your
        !          3150: second reading.
        !          3151: .PP
        !          3152: Recall that the question mark read macro expands into either
        !          3153: \fI(*var* <varname>)\fR or \fI(*global* <varname>)\fR.
        !          3154: These two forms are not normally meant to be evaluated.
        !          3155: However, for convenience, there are two functions \fB*var*\fR and
        !          3156: \fB*global*\fR which return the value of the variable whose name
        !          3157: is their argument.
        !          3158: That is, if \fI?X\fR expands into \fI(*global* X)\fR, executing it
        !          3159: will returned the value of the atom X.
        !          3160: Thus \fIX\fR and \fI?X\fR are equivalent for a global variable.
        !          3161: For a local or lexically scoped variable, in which \fI?X\fR
        !          3162: expands into \fI(*var* X), the function \fI*var*\fR looks in
        !          3163: three places for a variable with the name \fIX\fR.
        !          3164: .IP 1.
        !          3165: First it looks to see if the special variable
        !          3166: \fB*currentstructure*\fR has been bound to a structure by
        !          3167: the user, and if so, looks in its variable list.
        !          3168: .IP 2.
        !          3169: If this fails, it looks in the special variable
        !          3170: \fB*currentpearlstructure*\fR for a structure.
        !          3171: This variable is set by various PEARL functions like
        !          3172: \fIcreate\fR, \fIfetch\fR, \fIpath\fR, and \fInextitem\fR
        !          3173: to the top level structure they last operated on.
        !          3174: .IP 3.
        !          3175: If this fails, it looks in the currently open block on
        !          3176: top of \fI*blockstack*\fR if there is one.
        !          3177: .IP 4.
        !          3178: If this fails, it returns \fInil\fR.
        !          3179: .LP
        !          3180: Note that the atom \fI*currentstructure*\fR is there simply for
        !          3181: the use of the user and is never set by PEARL.
        !          3182: .PP
        !          3183: A related function is \fBsetv\fR which takes a question-mark
        !          3184: variable, a value and an optional environment and sets that
        !          3185: variable in that environment or else in the default environment
        !          3186: described above to that value.
        !          3187: The environment can be either a structure or a block.
        !          3188: This stops with an error message if it fails to find a variable 
        !          3189: by that name in the specified or default environment.
        !          3190: .NH
        !          3191: Binding Blocks of Structures Together Via Common Variables
        !          3192: .PP
        !          3193: It is sometimes the case that you wish to create a group of
        !          3194: structures which are closely related in some way and which you
        !          3195: wish to tie together via pattern-matching variables.
        !          3196: For example, a \fIframe\fR might be considered such a loosely
        !          3197: connected group of structures.
        !          3198: In this case what is desired is for the pattern-matching variables
        !          3199: to \fIactually be the same\fR.
        !          3200: Normally however, if you create several structures in PEARL with
        !          3201: variables having the same name, each has its own local variable
        !          3202: with that name and they are totally unrelated.
        !          3203: If on the other hand, you declared them to be global, then all
        !          3204: structures having variables with that name would refer to the same
        !          3205: variable and it would no be unbound before matching.
        !          3206: For this purpose, PEARL provides variables of an intermediate
        !          3207: nature which are local to only a small group of structures and
        !          3208: which are all unbound before any one of the structures takes
        !          3209: parting in matching.
        !          3210: .PP
        !          3211: These variables are called \fBlexically scoped\fR (although if
        !          3212: the related functions \fIblock\fR and \fIendblock\fR are called
        !          3213: dynamically, they also provide a breed of dynamic scoping).
        !          3214: To declare a set of lexically-scoped variables, thus opening a
        !          3215: (nested) scope for them, use the function \fBblock\fR,
        !          3216: so named because of the similarity to the concept of a block
        !          3217: in Algol-like languages.
        !          3218: The function \fIblock\fR is a fexpr which in its simplest form
        !          3219: expects one argument which should be a list of new variables:
        !          3220: .DS
        !          3221: (block  (A  B  C))
        !          3222: .DE
        !          3223: Such a call to \fIblock\fR creates an unnamed block containing
        !          3224: these variables and any occurrences of variables with these
        !          3225: names in any structures \fIcreated\fR after this call will
        !          3226: refer to these lexically-scoped variables.
        !          3227: Thus, no structure created after the above call to \fIblock\fR
        !          3228: can contain a local variable called A, B, or C.
        !          3229: (However, if a variable has been previously declared to be global
        !          3230: this overrides \fBall\fR future declarations with \fIblock\fR.
        !          3231: Once again, global pattern-matching variables are to be
        !          3232: used with \fIextreme caution\fR.)
        !          3233: .PP
        !          3234: If you use several blocks, especially nested blocks,
        !          3235: it is helpful to give them names.
        !          3236: For this purpose, \fIblock\fR will accept two arguments, the first
        !          3237: an atom to name the block and the second the list of new variables.
        !          3238: For example:
        !          3239: .DS
        !          3240: (block  Name  (A  B  C))
        !          3241: .DE
        !          3242: .PP
        !          3243: To end the most recent block, use the fexpr \fBendblock\fR.
        !          3244: This function accepts any of three types of arguments.
        !          3245: If last block was unnamed, simply use:
        !          3246: .DS
        !          3247: (endblock)
        !          3248: .DE
        !          3249: If the last block was named, you must provide \fIendblock\fR
        !          3250: with this name:
        !          3251: .DS
        !          3252: (endblock  Name)
        !          3253: .DE
        !          3254: This is provided as a protection against unbalanced calls to
        !          3255: \fIblock\fR and \fIendblock\fR.
        !          3256: If you wish to end the most recent block, regardless of what
        !          3257: its name is, use
        !          3258: .DS
        !          3259: (endblock  *)
        !          3260: .DE
        !          3261: To end several blocks at once, you can use the fexpr
        !          3262: \fBendanyblocks\fR which ends all blocks back through
        !          3263: the one whose name matches its argument.
        !          3264: Again no argument (\fInil\fR) means the last unnamed block.
        !          3265: An argument of \fB"*"\fR causes PEARL to end all currently
        !          3266: open blocks.
        !          3267: A shorthand for \fI(endanyblocks *)\fR is \fB(endallblocks)\fR.
        !          3268: .PP
        !          3269: The function \fIblock\fR builds an assoc-list of
        !          3270: the variables listed.
        !          3271: If the block is nested, the assoc-list of the enclosing block is
        !          3272: hooked to the end of its assoc-list, thus providing a complete
        !          3273: assoc-list of all the variables available in the block.
        !          3274: A side effect of \fIblock\fR is that this assoc-list is bound to
        !          3275: the name of the block.
        !          3276: The block itself (the block's name plus this assoc-list) is available
        !          3277: as \fIb:<blockname>\fR so that the above call to block binds
        !          3278: \fIName\fR to
        !          3279: .DS L
        !          3280: ((A  .  *pearlunbound*)  (B  .  *pearlunbound*)  (C  .  *pearlunbound*))
        !          3281: .DE
        !          3282: and \fIb:Name\fR to
        !          3283: .DS
        !          3284: (Name  (A  .  *pearlunbound*)  (B  .  *pearlunbound*)
        !          3285:        (C  .  *pearlunbound*))
        !          3286: .DE
        !          3287: If a block is unnamed, PEARL calls it \fIunnamedblock\fR and the
        !          3288: corresponding variables are set.
        !          3289: The special variable \fB*blockstack*\fR contains a stack of all the
        !          3290: currently active blocks.
        !          3291: The effect of ending a block is to pop it off this stack.
        !          3292: Once a block is closed, it is still accessible through the Lisp
        !          3293: variable \fIb:<blockname>\fR.
        !          3294: Given the name of a block, the function \fBblockatom\fR will build
        !          3295: this atom for you.
        !          3296: .PP
        !          3297: It is possible to return to the scope of an earlier block with the
        !          3298: fexpr \fBsetblock\fR which expects the name of a named block.
        !          3299: This will have the effect of ending all currently open blocks and
        !          3300: setting the current block stack to contain this block.
        !          3301: Note that this block will contain all the variables of any blocks
        !          3302: it is nested in but that it is not possible to close off these
        !          3303: block selectively.
        !          3304: Thus, the block stack will contain only one block with all the
        !          3305: variables in its complete assoc-list.
        !          3306: .NH
        !          3307: Controlling the Unbinding of Variables by Match
        !          3308: .PP
        !          3309: It is sometimes desireable to use the filled-in result pattern
        !          3310: of a \fIfetch\fR or \fImatch\fR as a pattern for a further
        !          3311: \fIfetch\fR (or \fImatch\fR) or to otherwise store and restore
        !          3312: the current values of variables (for example, to allow
        !          3313: backtracking algorithms and/or hypothetical assertions).
        !          3314: Since all bound local variables would normally be unbound during this
        !          3315: further fetching or matching, this would not be possible given the
        !          3316: mechanism described so far.
        !          3317: To accomplish this action, which can be considered as "pushing"
        !          3318: the context of the current assoc-list,
        !          3319: you should use one of several functions provided for this purpose.
        !          3320: The function \fBfreezebindings\fR takes a structure as argument
        !          3321: and moves all bound variables from its normal assoc-list to a
        !          3322: backup so that \fIfetch\fR will not unbind them.
        !          3323: The function \fBthawbindings\fR takes a structure as argument and
        !          3324: will undo this action, restoring the assoc-list to its complete state.
        !          3325: These two functions affect the structure plus any bound variables
        !          3326: in all enclosing blocks.
        !          3327: To freeze or thaw only a single structure, use \fBfreezestruct\fR
        !          3328: and \fBthawstruct\fR.
        !          3329: To freeze or thaw only a single block, use \fBfreezeblock\fR
        !          3330: and \fBthawblock\fR which expect the name of a block as an
        !          3331: argument.
        !          3332: .PP
        !          3333: Above it was mentioned that two structures will match if
        !          3334: and only if they both are of the same type.
        !          3335: Actually the system has been extended to allow the matching
        !          3336: of a structure of one type with another of a type derived
        !          3337: from the first via a \fIcreate expanded\fR.
        !          3338: The extra slots of the larger (expanded)
        !          3339: structure are ignored during the match.
        !          3340: .PP
        !          3341: Lastly it should be mentioned that the matching rules are
        !          3342: an evolving system, and may be amended as experience
        !          3343: with their use is accumulated.
        !          3344: The rules may seem a bit complex at first, but in use they
        !          3345: are fairly natural.
        !          3346: The rules are biased towards efficiency (like much of PEARL).
        !          3347: The designers felt that hiding exponential time-complexity
        !          3348: processing within the language would lead users to
        !          3349: construct inefficient programs without realizing it.
        !          3350: Thus several "features" of other complex AI matchers are not built in.
        !          3351: The user must implement these individually at a higher level.
        !          3352: It has been our experience that this leads to much cleaner designs.
        !          3353: .NH
        !          3354: Function Structures
        !          3355: .PP
        !          3356: In using PEARL, it is sometimes handy to escape into Lisp in
        !          3357: a "\fIstructure\fRd" way.
        !          3358: Although PEARL allows ad hoc escapes by way of its hooks
        !          3359: and the ! and $ evaluation operators defined above,
        !          3360: the philosophy in PEARL \fBfunction structures\fR
        !          3361: is to allow structured escapes that restrict the generality
        !          3362: of the escape to the minimum necessary for the task.
        !          3363: At times you may wish to equate Lisp functions with their expected
        !          3364: arguments with PEARL structures with their associated slots.
        !          3365: For example while you may wish to describe an action in a program
        !          3366: as fetching an item from the data base, you may actually be
        !          3367: unable to describe the item as a structure and/or be unable or
        !          3368: unwilling to actually store it in the data base.
        !          3369: Instead, you will sometimes want the value to be provided by
        !          3370: a function called at fetching time instead of a structure in the
        !          3371: data base.
        !          3372: .PP
        !          3373: Take as an example the case of keeping track of whether any two
        !          3374: objects are near each other.
        !          3375: One possible way to do this is to keep structures in the data base
        !          3376: which record for each pair of objects that are near each other the
        !          3377: fact that they are near each other:
        !          3378: .DS
        !          3379: (create base  Near
        !          3380:        (Object1  struct)
        !          3381:        (Object2  struct))
        !          3382: .DE
        !          3383: Then determining whether two objects are near each other would
        !          3384: require a simple fetch.
        !          3385: However, if you are dealing with a large number of objects which
        !          3386: are moving around quite a bit but only want to know about nearness
        !          3387: once in a while, it might be easier or more efficient to compute
        !          3388: whether two objects are near each other only on demand.
        !          3389: In this case, you might like to write a function called Near
        !          3390: which expects two arguments.
        !          3391: However, for consistency, you may not want to design your program
        !          3392: so that it knows what things can be fetched and what things need
        !          3393: computing.
        !          3394: So you would like to define a structure which looks like our
        !          3395: definition of Near above but which actually invokes the
        !          3396: function Near.
        !          3397: .PP
        !          3398: To do this, one may create the function Near (which must be an
        !          3399: expr) and also a structure of type \fIfunction\fR named Near:
        !          3400: .DS
        !          3401: (de Near  (x  y)
        !          3402:     ... mechanism to actually determine nearness ... )
        !          3403: 
        !          3404: (create function  Near
        !          3405:        (Object1  struct)
        !          3406:        (Object2  struct))
        !          3407: .DE
        !          3408: and then can create an individual of it for fetching:
        !          3409: .DS
        !          3410: (create individual  Near  IsNear
        !          3411:        (Object1  John)
        !          3412:        (Object2  Office))
        !          3413: 
        !          3414: (fetch  IsNear)
        !          3415: .DE
        !          3416: Note that the format of function structures within PEARL
        !          3417: is the same as that of structures.
        !          3418: However, the name of the actual Lisp function to be called must
        !          3419: match the type name of the \fIfunction\fR structure, and the
        !          3420: arguments must occur in the same order and be of the same types
        !          3421: as the slots which will contain the actual arguments to the function.
        !          3422: .PP
        !          3423: As another simple example, to define a \fIfunction\fR structure
        !          3424: to correspond to the function \fIgetpath\fR, we would use the following:
        !          3425: .DS
        !          3426: (create function  getpath
        !          3427:        (Item  struct)
        !          3428:        (Path  lisp) )
        !          3429: .DE
        !          3430: and then an actual instance:
        !          3431: .DS
        !          3432: (create individual  getpath  Minst
        !          3433:        (Item  !  Mtrans1)
        !          3434:        (Path  '(MObject) ) )
        !          3435: .DE
        !          3436: This example is not too useful.
        !          3437: As a more realistic use, consider a program to return all
        !          3438: the MObjects of all MTranses that are in the data base:
        !          3439: .DS
        !          3440: (create function  nextitem
        !          3441:        (Stream  lisp) )
        !          3442: .DE
        !          3443: .DS
        !          3444: (create pattern  MTrans  MPat1
        !          3445:        (MObject  ?X) )
        !          3446: .DE
        !          3447: .DS
        !          3448: (global  MStream)
        !          3449: (setq  MStream  (fetch  MPat1) )
        !          3450: .DE
        !          3451: .DS
        !          3452: (create individual  getpath  Minst2
        !          3453:        (Item  (nextitem  (Stream  ?MStream) ) )
        !          3454:        (Path  '(MObject) )
        !          3455: .DE
        !          3456: .DS
        !          3457: (setq  Stream1  (fetch  Minst2) )
        !          3458: .DE
        !          3459: Note the recursive use of the data base: the \fIfetch\fR of
        !          3460: Minst2 will cause a \fIgetpath\fR to be executed.
        !          3461: But PEARL must first get the two arguments to pass on to
        !          3462: \fIgetpath\fR which causes the function \fInextitem\fR
        !          3463: to be evaluated, getting the next MTrans in MStream to
        !          3464: pass to \fIgetpath\fR. 
        !          3465: .PP
        !          3466: Thus, function structures provide a way to describe a function and
        !          3467: its arguments through a PEARL structure and then to include,
        !          3468: in a pattern to fetch or in a structure slot,
        !          3469: a function call which will provide the desired value
        !          3470: at fetching time.
        !          3471: However, this only works during fetching.
        !          3472: .PP
        !          3473: The function used by PEARL to execute a function
        !          3474: structure is \fBevalfcn\fR.
        !          3475: It takes an item as its argument and returns the result of
        !          3476: applying the associated expr to its slot values if the item
        !          3477: is a function structure.
        !          3478: If the item is a single structure it returns the item untouched.
        !          3479: If the item is a list of structures, it applies itself
        !          3480: recursively with \fImapcar\fR.
        !          3481: No other PEARL functions currently know about function structures
        !          3482: as being any different than other individual structures.
        !          3483: .NH
        !          3484: More About the PEARL Top Level Loop and History Mechanism
        !          3485: .PP
        !          3486: The PEARL prompt-read-eval-print loop includes two features which
        !          3487: make PEARL easier to work with than the usual top level of Lisp.
        !          3488: Both features were designed in imitation of the Berkeley Unix
        !          3489: shell program \fIcsh\fR.
        !          3490: .PP
        !          3491: The first is an aliasing mechanism which provides the ability to
        !          3492: use various atoms as aliases for commonly executed s-expressions.
        !          3493: If you type an atom to the top level and it has the property
        !          3494: \fBalias\fR, the value of its \fIalias\fR property will be
        !          3495: evaluated instead.
        !          3496: Thus, if you do a
        !          3497: .DS
        !          3498: (putprop  'dir  '(dir)  'alias)  ; in UCI Lisp
        !          3499:          or
        !          3500: (putprop  'ls  '(exec  ls)  'alias)  ; in Franz Lisp
        !          3501: .DE
        !          3502: then if you type the atom \fIdir\fR or \fIls\fR repectively
        !          3503: to the top level, you will get the contents of your
        !          3504: directory printed out.
        !          3505: Two such built-in atoms are \fBhistory\fR which will
        !          3506: run the function \fIhistory\fR and print out your last
        !          3507: 64 commands (see below) and \fBh\fR which will print the last 22
        !          3508: commands (one crt screenful).
        !          3509: The aliasing mechanism can be turned off (saving a \fIget\fR for
        !          3510: each atom you use at the top level) by setting the special
        !          3511: variable \fB*usealiases*\fR to \fInil\fR.
        !          3512: .PP
        !          3513: PEARL's top level also includes a simplified command-history mechanism.
        !          3514: As you type in expressions to the top level of PEARL, they are
        !          3515: stored away for future reference.
        !          3516: The results of evaluating each expression are also kept.
        !          3517: The commands and their results are kept in two hunks
        !          3518: whose default size is 64.
        !          3519: The hunk containing the commands is kept in the special
        !          3520: variable \fB*history*\fR and the hunk containing the results
        !          3521: is kept in the special variable \fB*histval*\fR
        !          3522: To change the number of commands remembered, set the special
        !          3523: variable \fB*historysize*\fR to something other than 64
        !          3524: in your \fI.init.prl\fR.
        !          3525: It cannot be changed later.
        !          3526: (If you are a novice user of PEARL, we recommend that you not
        !          3527: change it to be smaller, since the history command can sometimes
        !          3528: be helpful to someone helping you to debug something after you
        !          3529: have fiddled with it a while.)
        !          3530: .PP
        !          3531: The commands you type are squirrelled away so that you can ask
        !          3532: PEARL to re-execute them, thus saving the pain of retyping
        !          3533: a complicated expression.
        !          3534: To access the previous commands, the readmacro \fB"!"\fR is
        !          3535: provided.
        !          3536: To access the results of the previous commands,
        !          3537: the readmacro \fB"$"\fR is provided.
        !          3538: (The exclamation point is in imitation of the cshell;
        !          3539: the dollar sign is meant to suggest "value".)
        !          3540: These readmacros peek at the next character to determine what to do.
        !          3541: We discuss the variations available on these two readmacros in
        !          3542: parallel, since many of them coincide.
        !          3543: .PP
        !          3544: The simplest and most useful forms are \fB"!!"\fR and \fB"$$"\fR
        !          3545: which effectively re-execute and reprint the last command or its result.
        !          3546: Actually, both forms are executed, but the dollard sign macro
        !          3547: always returns its value quoted so that its effect is usually to
        !          3548: just reprint the result of the previous command.
        !          3549: Note that since these are readmacros which simply return the
        !          3550: last s-expression typed or its value, you can use them to build up
        !          3551: more complex commands.
        !          3552: For example:
        !          3553: .DS
        !          3554: pearl>  (fetch  Item)
        !          3555:     (*stream:*  . . .)
        !          3556: pearl>  (nextitem  !!)
        !          3557: .DE
        !          3558: will cause the fetch to be repeated and then do a \fInextitem\fR on it.
        !          3559: However, it is much more efficient to use the \fI$$\fR form in
        !          3560: this case, since what you really want is to do a \fInextitem\fR
        !          3561: on the result of the \fIfetch\fR in the last command:
        !          3562: .DS
        !          3563: pearl>  (fetch  Item)
        !          3564:     (*stream:*  . . .)
        !          3565: pearl>  (nextitem  $$)
        !          3566: .DE
        !          3567: .PP
        !          3568: The commands are numbered as you type them, starting with zero.
        !          3569: Although the values wrap around in the hunks, the \fIhistory number\fR
        !          3570: continues to climb.
        !          3571: The current history number is available in the special
        !          3572: variable \fB*historynumber*\fR.
        !          3573: To access a particular command or its value, you may type you may
        !          3574: follow an exclamation point or dollar sign with the number of the
        !          3575: command.
        !          3576: Thus \fB!23\fR and \fB$23\fR are the 23rd command and its result.
        !          3577: If you don't remember the command's number you can use the
        !          3578: function name or a prefix of it.
        !          3579: Thus \fB!fetch\fR and \fB$fetch\fR will access the last \fIfetch\fR
        !          3580: or its value.
        !          3581: Or \fB!fe\fR and \fB$fe\fR will access the last command starting
        !          3582: with \fIfe\fR or its value.
        !          3583: If there was a reference to an atom (instead of a list) with that
        !          3584: name or with that as a prefix somewhere, then the atom will be
        !          3585: evaluated again.
        !          3586: For exclamation point, this is a waste of typing except for long
        !          3587: atom names.
        !          3588: For dollar sign, it provides you a way of recovering the value of
        !          3589: a variable that has since changed.
        !          3590: (As a side effect of implementing this, PEARL contains a function
        !          3591: \fBprefix\fR which expects two lists and determines whether the
        !          3592: first is a prefix of the second, considered as a list of atoms.
        !          3593: Thus, PEARL just calls \fIprefix\fR on the results of \fIexplode\fRing
        !          3594: two atoms.)
        !          3595: .PP
        !          3596: Here the parallel between the two macros ends.
        !          3597: .PP
        !          3598: There are five forms which work only with exclamation point and
        !          3599: refer only to the last s-expression typed.
        !          3600: They are essentially ways to pick individual top-level elements
        !          3601: out of the last command:
        !          3602: .DS
        !          3603: \fB!^\fR       the first argument
        !          3604: \fB!$\fR       the last argument
        !          3605: \fB!*\fR       the complete set of arguments
        !          3606: \fB!:0\fR      the function name
        !          3607: \fB!:n\fR      the nth argument
        !          3608: .DE
        !          3609: Both macros are splicing macros so that their values may be
        !          3610: spliced into the current s-expression.
        !          3611: \fB!*\fR is designed so that the following will work:
        !          3612: .DS
        !          3613: pearl>  (add  1  2  3  4)
        !          3614:     10
        !          3615: pearl>  (times  !*)
        !          3616: (times  1  2  3  4)
        !          3617:     24
        !          3618: .DE
        !          3619: .PP
        !          3620: To see the last 64 commands you gave printed out, use the function
        !          3621: \fBhistory\fR (or type the atom \fBhistory\fR).
        !          3622: If you don't want all 64 commands, \fIhistory\fR will accept an
        !          3623: integer argument telling how many you want.
        !          3624: Thus the aliases on \fIhistory\fR and \fIh\fR are:
        !          3625: .DS
        !          3626: (putprop  'history  '(history)  'alias)
        !          3627: (putprop  'h  '(history  22)  'alias)
        !          3628: .DE
        !          3629: If you use the command numbers often, you might like to have the
        !          3630: history number printed out before each command.
        !          3631: To have the history number printed just before the PEARL prompt,
        !          3632: set the special variable \fB*printhistorynumber*\fR to a
        !          3633: non-\fInil\fR value.
        !          3634: The default value is f\Inilf\R.
        !          3635: .PP
        !          3636: Whenever you use the ! or $ history mechanisms, the line you type in
        !          3637: will be reprinted in its expanded form on the next line using
        !          3638: the current \fIpearlprintfn\fR.
        !          3639: If you wish to modify your own read macros so that they also will
        !          3640: cause this reprinting, simply have them set the special
        !          3641: variable \fB*readlinechanged*\fR to a non-\fInil\fR value.
        !          3642: .PP
        !          3643: It is sometimes useful to have a function return no value.
        !          3644: That is, you often do not want the value of the function to be
        !          3645: printed by the top level loop.
        !          3646: In particular, functions which print values often return ugly
        !          3647: values afterward.
        !          3648: To get around this problem, the PEARL top level disables printing
        !          3649: of the value returned by a function if it returns the atom
        !          3650: \fB*invisible*\fR.
        !          3651: All of the PEARL print functions return this value.
        !          3652: .PP
        !          3653: It is sometimes useful to be able to save the current state of a
        !          3654: PEARL run for later.
        !          3655: There are two functions to allow this.
        !          3656: If you wish to save a version which will continue exactly where
        !          3657: you left off (at the top level), use the function
        !          3658: \fBsavecontinue\fR which expects zero, one or two arguments.
        !          3659: If you wish to save a version which will read in
        !          3660: the \fI.start.prl\fR file when it starts up, use \fBsavefresh\fR.
        !          3661: (If you also want \fI.init.prl\fR read in, change the value of the
        !          3662: special variable \fB*firststartup*\fR to \fIt\fR beforehand but
        !          3663: be careful not to put functions which may only be run once in it.)
        !          3664: Note however that you cannot save Franz PEARL on top of the file
        !          3665: you are running;
        !          3666: trying to will result in the \fIDumplisp failed\fR
        !          3667: error message from Franz Lisp.
        !          3668: Note also that a saved PEARL uses about 1500 blocks or 750kbytes on
        !          3669: the disk so this should be used sparingly.
        !          3670: (Exceeding the disk quota will result in the same error message.)
        !          3671: In the Franz Lisp version, if the number of arguments to either of
        !          3672: these functions is:
        !          3673: .IP 0:
        !          3674: It will be saved as \fIpearl\fR in the current directory.
        !          3675: .IP 1:
        !          3676: The argument is assumed to be a (relative) file name to save under.
        !          3677: .IP 2:
        !          3678: The result of concatenating the two arguments together with a
        !          3679: \fB/\fR between them will be the file name used.
        !          3680: (This is for UCI Lisp compatibility.)
        !          3681: .LP
        !          3682: In the UCI Lisp version, if the number of arguments is:
        !          3683: .IP 0:
        !          3684: It will be saved as \fIpearl\fR in the current directory.
        !          3685: .IP 1:
        !          3686: The argument is assumed to be a file name for the current directory.
        !          3687: .IP 2:
        !          3688: They must be a directory and a file name to save in.
        !          3689: .NH
        !          3690: Looping and Copying Functions
        !          3691: .PP
        !          3692: PEARL includes several loop macros.
        !          3693: The first two were included simply for use by the implementation but
        !          3694: might be useful to the user.
        !          3695: They are the \fBfor\fR and \fBwhile\fR macros which both expand
        !          3696: into a \fIprog\fR wrapped around a \fIprogn\fR.
        !          3697: A call to the \fIwhile\fR macro should be of the form:
        !          3698: .DS
        !          3699: (while <test>
        !          3700:        EXPR1
        !          3701:        EXPR2
        !          3702:        ...
        !          3703:        EXPRn)
        !          3704: .DE
        !          3705: The <test> is evaluated before each execution of the loop.
        !          3706: If it is non-\fInil\fR, the EXPRi are evaluated in sequence.
        !          3707: This continues until <test> return nil in which case the last
        !          3708: value returned by EXPRn is returned.
        !          3709: Since the while expands into a \fIprog\fR, any of the EXPRi may
        !          3710: call the function \fIreturn\fR, terminating the loop prematurely
        !          3711: and returning the value given to \fIreturn\fR.
        !          3712: .PP
        !          3713: A call to the \fIfor\fR macro should be of the form:
        !          3714: .DS
        !          3715: (for <var> <initial> <final>
        !          3716:      EXPR1
        !          3717:      EXPR2
        !          3718:      ...
        !          3719:      EXPRn)
        !          3720: .DE
        !          3721: <initial> and <final> should evaluate to integers.
        !          3722: The EXPRi are repeatedly evaluated in sequence with <var> being
        !          3723: set to the values ascending from <initial> to <final>.
        !          3724: If <initial> is greater than <final>, nothing is done.
        !          3725: <var> is a prog variable which disappears after the \fIfor\fR
        !          3726: executes.
        !          3727: The value returned is the last value of EXPRn and \fIreturn\fR
        !          3728: provides a premature exit with a value as in \fIwhile\fR.
        !          3729: .PP
        !          3730: The fexpr \fBforeach\fR expects a stream and a function (or macro)
        !          3731: and applies the function to each element returned by successive
        !          3732: calls to \fInextitem\fR on the stream.
        !          3733: Unfortunately it only returns \fInil\fR at this time.
        !          3734: Eventually, other useful looping structures may be provided.
        !          3735: .PP
        !          3736: Since PEARL provides several new types of values, it provides a
        !          3737: few functions to copy them.
        !          3738: In particular, the standard Lisp function \fBcopy\fR has been
        !          3739: redefined to avoid trying to copy anything that is not a cons-cell.
        !          3740: There are several ways to copy structures, described below.
        !          3741: The rest of PEARL values either are too complicated to copy
        !          3742: (data bases), can be copied with \fIcopy\fR (streams) or else
        !          3743: make no sense to copy (symbols, blocks).
        !          3744: .PP
        !          3745: For copying structures, there are currently two functions.
        !          3746: The one you are most likely to want is \fBscopy\fR which expects a
        !          3747: single structure argument and returns a new structure with the
        !          3748: same values in it.
        !          3749: However, the new structure will differ from the old in several
        !          3750: important ways.
        !          3751: First of all, copying a bound variable will result in the actual
        !          3752: value being inserted in the new copy.
        !          3753: When copying an unbound variable, the new structure will receive
        !          3754: a local variable with the same name and this variable will
        !          3755: be installed in the slot.
        !          3756: All variables so installed will be installed in the top level
        !          3757: structure regardless of where they came from in the original.
        !          3758: The only exception to this is lexically-scoped variables.
        !          3759: When the new structure is built, it will be built within any
        !          3760: currently open blocks and any of its unbound variables whose names
        !          3761: match variables from the current block(s) will be identified with
        !          3762: those block variables.
        !          3763: Global variables are similarly reinstalled only if they are unbound.
        !          3764: Adjunct variables are also installed \fIonly if\fR they are
        !          3765: unbound, since if they are bound their purpose will already have
        !          3766: been served and their bound values installed in other slots
        !          3767: referring to them.
        !          3768: .PP
        !          3769: A variation on \fIscopy\fR which replaces all unbound
        !          3770: variables from the original with \fI?*any*\fR is called
        !          3771: \fBpatternize\fR.
        !          3772: After (and during) the running of these copying functions, the
        !          3773: resulting top-level structure is kept in the special variable
        !          3774: \fB*currenttopcopy*\fR.
        !          3775: .PP
        !          3776: The situation sometimes arises where you have already built a
        !          3777: structure and have a new structure with information that should be
        !          3778: merged into the old one.
        !          3779: Rather than use \fIpath\fR to copy each relevant slot, you can use
        !          3780: \fBsmerge\fR which expects as arguments the old structure to merge
        !          3781: into and the new structure from which to take values.
        !          3782: All unfrozen variables in the old structure are unbound first and
        !          3783: then any unbound variable whose counterpart in the new structure
        !          3784: is bound gets replaced (\fBnot set\fR) with this value.
        !          3785: The old structure being merged into must be of the same type or
        !          3786: an expanded version of the new structure.
        !          3787: .NH
        !          3788: Miscellaneous Variations and Abbreviations
        !          3789: .PP
        !          3790: People very quickly get tired of typing the relatively long
        !          3791: function names that PEARL uses.
        !          3792: As a result, a large number of abbreviations and macros have
        !          3793: been included in PEARL.
        !          3794: We recommend that the shortest ones be used primarily at
        !          3795: the top level, since they are easily subject to typographic
        !          3796: errors.
        !          3797: Most the abbreviations are in \fIcreate\fR and are summarized by
        !          3798: the following table:
        !          3799: .DS
        !          3800:    The function or atom:       May \kmbe abbreviated:
        !          3801:        create                     \h'|\nmu'cr
        !          3802:        individual                 \h'|\nmu'ind
        !          3803:        pattern                    \h'|\nmu'pat
        !          3804:        expanded                   \h'|\nmu'exp
        !          3805:        function                   \h'|\nmu'fn
        !          3806: .DE
        !          3807: Thus, \fI(cr pat ....)\fR is equivalent to
        !          3808: \fI(create pattern ....)\fR.
        !          3809: .PP
        !          3810: In addition, a large number of macros for popular combinations of
        !          3811: functions are included:
        !          3812: .ID
        !          3813:     The s-expression:               Is exp\kmanded into by the macro:
        !          3814: (create base ...)              \h'|\nmu'(cb  ...)
        !          3815:                                \h'|\nmu'(base  ...)
        !          3816: (create individual ...)                \h'|\nmu'(ci  ...)
        !          3817:                                \h'|\nmu'(individual  ...)
        !          3818:                                \h'|\nmu'(ind  ...)
        !          3819: (create expanded ...)          \h'|\nmu'(ce  ...)
        !          3820:                                \h'|\nmu'(expanded  ...)
        !          3821:                                \h'|\nmu'(pexp  ...)
        !          3822: (create pattern ...)           \h'|\nmu'(cp  ...)
        !          3823:                                \h'|\nmu'(pattern  ...)
        !          3824:                                \h'|\nmu'(pat  ...)
        !          3825: (create function ...)          \h'|\nmu'(cf  ...)
        !          3826:                                \h'|\nmu'(pfunction  ...)
        !          3827:                                \h'|\nmu'(fn  ...)
        !          3828: .sp 1
        !          3829: (insertdb  (create  ...)  nil) \h'|\nmu'(dbcreate  ...)
        !          3830:                                \h'|\nmu'(dbcr  ...)
        !          3831: `(quote  ,(create  ...))       \h'|\nmu'(inlinecreate  ...)
        !          3832: (fetch  (create  ...) nil)     \h'|\nmu'(fetchcreate  ...)
        !          3833: `(fetch  (quote  ,(create  ...))  nil) \h'|\nmu'(inlinefetchcreate  ...)
        !          3834: (nextitem  (fetch  ...) )      \h'|\nmu'(firstfetch  ...)
        !          3835: .sp 1
        !          3836: (valprint  ...)                                \h'|\nmu'(vp  ...)
        !          3837: (fullprint  ...)                       \h'|\nmu'(fp  ...)
        !          3838: .DE
        !          3839: (\fIpexp\fR and \fIpfunction\fR are so named to avoid conflict
        !          3840: with the exponential function \fIexp\fR and the function quoting
        !          3841: function \fIfunction\fR.)
        !          3842: .PP
        !          3843: The automatic setq feature of \fIcreate\fR that causes an atom
        !          3844: to be bound to the item created is available throughout
        !          3845: \fIcreate\fR.
        !          3846: In all cases, the special variable \fB*lastcreated*\fR is
        !          3847: set to the item.
        !          3848: In addition:
        !          3849: .DS
        !          3850: This combination:          Causes \kmthis atom to be set:
        !          3851: (create base  X ...            \h'|\nmu'X
        !          3852: (create base  X Y ...          \h'|\nmu'Y
        !          3853: (create expanded  X Y ...      \h'|\nmu'Y
        !          3854: (create expanded  X Y Z ...    \h'|\nmu'Z
        !          3855: (create individual  X ...      \h'|\nmu'(none)
        !          3856: (create individual  X Y ...    \h'|\nmu'Y
        !          3857: (create individual  X X ...    \h'|\nmu'(none, the second X is ignored)
        !          3858: (create pattern  X ...         \h'|\nmu'(none)
        !          3859: (create pattern  X Y ...       \h'|\nmu'Y
        !          3860: (create pattern  X X ...       \h'|\nmu'(none, the second X is ignored)
        !          3861: .DE
        !          3862: .PP
        !          3863: When creating an object, wherever a recursive call to \fIcreate\fR
        !          3864: is implied by a structure in a slot of type structure, you may start
        !          3865: with one of the types \fIindividual\fR, \fIpattern\fR, \fIbase\fR,
        !          3866: \fIexpanded\fR, \fIfunction\fR to change the type of object
        !          3867: being created.
        !          3868: Whenever it isn't given, the type of the toplevel \fIcreate\fR,
        !          3869: which is kept in the special variable
        !          3870: \fB*currentcreatetype*\fR is used.
        !          3871: For example, in
        !          3872: .DS
        !          3873: (create pattern  x
        !          3874:        (a  (individual  y))
        !          3875:        (b  (base  z  (s1  ...)  ...))
        !          3876:        (c  (w)))
        !          3877: .DE
        !          3878: where a, b, and c are all slots of type structure, slot a
        !          3879: will contain an individual y which the attendant defaults
        !          3880: filled in, slot b will contain the default instance of a
        !          3881: newly created type z, and slot c will contain a pattern w
        !          3882: with \fI?*any*\fR as defaults.
        !          3883: .PP
        !          3884: Since each Lisp stores its functions in a different place, PEARL
        !          3885: includes a macro \fBaliasdef\fR which expects the names of an new
        !          3886: and a old function name and copies the function definition of the
        !          3887: old one to the new one.
        !          3888: In the case of Lisps which store the function definition on the
        !          3889: property list, \fIaliasdef\fR requires a third argument which is
        !          3890: the name of the property that the definition is kept under.
        !          3891: .NH
        !          3892: Low Level Access Functions.
        !          3893: .PP
        !          3894: There are a large number of functions for setting and accessing
        !          3895: the various part of structures, symbols, and data bases which are
        !          3896: primarily intended for the use of PEARL.
        !          3897: In general, the access functions are called \fBget...\fR where
        !          3898: "..." is the name of the information about the structure.
        !          3899: The functions which change information are called \fBput...\fR.
        !          3900: It is not generally safe to use the \fIput...\fR functions but the
        !          3901: \fIget...\fR functions can sometimes be useful to the user.
        !          3902: For a complete list of the functions, see the index.
        !          3903: If you don't recognize the function by name, you don't need it so
        !          3904: we don't bother to further document them.
        !          3905: Since most of them expect a slot number, it is useful to know
        !          3906: about the macro \fBnumberofslot\fR which requires the name of a
        !          3907: slot and the definition of a structure (which can be accessed
        !          3908: with \fIdefatom\fR or \fId:<structurename>\fR.) and returns the
        !          3909: corresponding slot number.
        !          3910: .bp
        !          3911: .NH
        !          3912: Appendix of UCI Lisp functions added to Franz PEARL
        !          3913: .PP
        !          3914: Since PEARL was originally written in UCI Lisp, there are many functions
        !          3915: from UCI Lisp that it needed.
        !          3916: We also wrote others to move our other programs.
        !          3917: The number is too great to document each one.
        !          3918: If the function is described with an equal sign, as in
        !          3919: \fI"fn = other"\fR then the function definition of the Franz Lisp
        !          3920: function \fIother\fR has been put under \fIfn\fR.
        !          3921: Thus it might not behave quite the same as in UCI Lisp.
        !          3922: If no equivalence is given, it was written from scratch which is
        !          3923: slightly more likely to mimic UCI Lisp.
        !          3924: In this case, see the UCI Lisp manual for details.
        !          3925: .PP
        !          3926: The functions used for the PEARL top level loop in the Franz Lisp
        !          3927: version plus changes to the fixit debugger and the trace package
        !          3928: are briefly described here also.
        !          3929: .PP
        !          3930: The Franz Lisp version of PEARL is normally loaded with both the Fixit
        !          3931: debugger and the trace package already loaded.
        !          3932: This is done to avoid getting the versions which do not know how to print
        !          3933: PEARL objects.
        !          3934: In addition, the Fixit debugger is attached to all available hooks for
        !          3935: going into the break package, since it is much more similar to the UCI Lisp
        !          3936: break package than the standard Franz Lisp break package is.
        !          3937: Both the debugger and trace package use the function
        !          3938: \fBbreakprintfn\fR to print values.
        !          3939: The \fImsg\fR function uses the function \fBmsgprintfn\fR
        !          3940: to print values.
        !          3941: Either can be bound to whatever function you wish.
        !          3942: To disengage the Fixit debugger, read the Franz manual chapter on exception
        !          3943: handling.
        !          3944: See Note 4 below for more on features added to the Fixit debugger.
        !          3945: .LP
        !          3946: .nf
        !          3947: Atoms and Variables:
        !          3948: *dskin* -- special variable -- initial value: t.  See Note 1 below.
        !          3949: *file* -- special variable -- initial value: nil.  Used by \fIdskin\fR
        !          3950:        and function definition functions.
        !          3951: *invisible* -- special atom -- not printed by \fIdskin\fR if returned
        !          3952:            by a value when it is evaluated.
        !          3953: 
        !          3954: Functions:
        !          3955: *append = append
        !          3956: (breakprintfn value lmar rmar) -- used by \fItrace\fR and \fIdebug\fR.
        !          3957: *dif = diff
        !          3958: *eval = eval
        !          3959: *great = greaterp
        !          3960: *less = lessp
        !          3961: *max = max
        !          3962: (msgprintfn value lmar rmar) -- used by \fImsg\fR.
        !          3963: *nconc = nconc
        !          3964: *plus = plus
        !          3965: *times = times
        !          3966: (addprop 'id 'value 'prop)
        !          3967: (allsym itemorpair) -- fexpr
        !          3968: (apply* 'fcn 'args) -- macro -- This is provided to act like UCI Lisp's
        !          3969:        \fIapply#\fR.  The asterisk is used because of the special meaning
        !          3970:        of # in Franz Lisp.  Unlike Franz Lisp's \fIfuncall\fR and
        !          3971:        \fIapply\fR, this does what you would expect with macros!
        !          3972: atcat = concat
        !          3973: (boundp 'item)
        !          3974: clrbfi = drain
        !          3975: consp = dtpr
        !          3976: (de fcnname arglist &rest body) -- macro -- See Note 2 below.
        !          3977: (debug-replace-function-name 'cmd 'frame) -- Used by the modified
        !          3978:        Fixit debugger to handle the "> newfcnname" facility.
        !          3979: (defp 'to 'from [prop]) -- macro -- Ignores \fIprop\fR and just
        !          3980:       copies the function definition.
        !          3981: (defv var val) -- fexpr
        !          3982: (df fcnname arglist &rest body) -- macro -- See Note 2 below.
        !          3983: (dm fcnname arglist &rest body) -- macro -- See Note 2 below.
        !          3984: (dremove 'elmt 'l)
        !          3985: (drm char lambda) -- macro -- See Note 2 below.
        !          3986: (dskin filename1 filename2 ....) -- See Note 1 below.
        !          3987: (dskin1 '*file*)
        !          3988: (dskin2 'port)
        !          3989: (dsm char lambda) -- macro -- See Note 2 below.
        !          3990: (enter 'v 'l)
        !          3991: (every 'fcn 'args) -- macro -- Potential problem when compiled.
        !          3992: expandmacro = macroexpand
        !          3993: (funl &rest body) -- macro -- Expands into (function (lambda ...)).
        !          3994: (ge 'x) -- macro
        !          3995: (gensym1 'ident 'val)
        !          3996: gt = >
        !          3997: (initsym atomorpair1 ...) -- fexpr
        !          3998: (intersection 'set1 'set2)
        !          3999: (islambda 'fcn) -- Is \fIfcn\fR a lambda (expr)?
        !          4000: (le 'x) -- macro
        !          4001: (length '*u*)
        !          4002: lineread = readl (below)
        !          4003: (litatom 'x) -- macro
        !          4004: lt = <
        !          4005: mapcl = mapcar
        !          4006: memb = member
        !          4007: (msg ...) -- macro -- Some features may be missing.  The function
        !          4008:          used to print is \fImsgprintfn\fR, initially bound to 
        !          4009:               (or (eq '*invisible* ...)
        !          4010:                   (patom (valform ...)))
        !          4011: (nconc1 'l 'elmt)
        !          4012: (nequal 'arg1 'arg2)
        !          4013: (newsym atom) -- fexpr
        !          4014: noduples = union (below)
        !          4015: (nth 'l 'num)
        !          4016: (oldsym atomorpair) -- fexpr
        !          4017: (pearl-break-err-handler) -- Should be tied to ER%tpl if you want the
        !          4018:        standard Franz Lisp break (not much of a) package.
        !          4019:        Same as standard Franz Lisp \fIbreak-err-handler\fR except
        !          4020:        that it uses the function \fIbreakprintfn\fR.
        !          4021: (pearl-top-level) -- The PEARL top level loop.
        !          4022: (pearl-top-level-init) -- The initial function called when PEARL starts up.
        !          4023:        This is the code that reads in the init files and sets any unset
        !          4024:        PEARL parameters.
        !          4025: peekc = tyipeek
        !          4026: (pop q) -- macro
        !          4027: (push var 'val) -- macro
        !          4028: (readl ['flag]) -- fexpr
        !          4029: (readl1 'flag)
        !          4030: remove = delete
        !          4031: (remprops 'item 'proplist)
        !          4032: (remsym atomorpairlist) -- fexpr
        !          4033: (save fcnname) -- fexpr -- Saves function or macro definition under 
        !          4034:        the property \fIolddef\fR.  Saves macro character definitions
        !          4035:        under \fIoldmacro\fR.
        !          4036: (selectq ...) -- macro
        !          4037: (some 'fcn 'list) -- macro -- Potential problem when compiled.
        !          4038: (sprint 'item ['lmar ['rmar]]) -- See Note 3 below.
        !          4039: (subset 'fcn 'list) -- macro
        !          4040: (timer (defun timer fexpr (request)$?
        !          4041: (unbound) -- macro
        !          4042: (union 'list1 ['list2 ...])
        !          4043: (unsave fcnname) -- fexpr -- See \fIsave\fR.
        !          4044: .fi
        !          4045: .PP
        !          4046: \fBNote 1:\fR A simplified but extended imitation of the UCI Lisp function
        !          4047: \fBdskin\fR is provided in PEARL.
        !          4048: It is an nlambda which requires the file extensions to be provided.
        !          4049: There is a special variable \fB*dskin*\fR which controls whether
        !          4050: the expression read in is printed and/or whether the result of
        !          4051: evaluating it is printed.
        !          4052: .DS L
        !          4053: *dskin* = nil  means neither
        !          4054: *dskin* = t    means result only
        !          4055: *dskin* = 'name        means the name of the variable in setq \fIor\fR the name
        !          4056:                of the function in de, df, dm, dsm, drm, defmacro,
        !          4057:                defun, or def \fIor\fR the name of the type in create.
        !          4058: *dskin* = 'both        means both t and 'name.
        !          4059: .DE
        !          4060: The default value of *dskin* is t.
        !          4061: .PP
        !          4062: File names are always printed before they are opened.
        !          4063: The print function used for values is the current function
        !          4064: definition of \fBdskprintfn\fR.
        !          4065: The default function definition in PEARL is:
        !          4066: .DS
        !          4067: (de dskprintfn  (*printval*)
        !          4068:     (cond  ((atom  *printval*)  (patom  *printval*))
        !          4069:           (  t  (print  (valform  *printval*)))))
        !          4070: .DE
        !          4071: .PP
        !          4072: \fBNote 2:\fR  For better compatibility with UCI Lisp, PEARL contains
        !          4073: macros for the function and read macro definition functions 
        !          4074: \fBde, df, dm, dsm,\fR and \fBdrm\fR.
        !          4075: They have been defined to save the old definitions automatically
        !          4076: and to return \fI(fcnname Redefined)\fR when this is the case.
        !          4077: \fIDe, df,\fR and \fIdm\fR save the old definition under the
        !          4078: property '\fIolddef\fR.
        !          4079: \fIDsm\fR and \fIdrm\fR save the old definition under the
        !          4080: property '\fIoldmacro\fR.
        !          4081: (The current definition of a readmacro is kept by Franz under the
        !          4082: property '\fImacro\fR.)
        !          4083: If the function definition is read in by \fIdskin\fR,
        !          4084: then the current file name which is in the special variable
        !          4085: \fB*file*\fR is put under the property '\fIsourcefile\fR.
        !          4086: .PP
        !          4087: \fBNote 3:\fR  A function similar to the UCI Lisp \fBsprint\fR is included,
        !          4088: including the printmacro facility and the optional second argument
        !          4089: saying which column to start in.
        !          4090: In addition, there is an optional third argument saying which column
        !          4091: to try not to go beyond (that is a right margin).
        !          4092: A slight addition has been made to the printmacro feature (feature 1 below).
        !          4093: During \fIsprinting\fR, if the atom in the function position in a list
        !          4094: has the printmacro property one of four things will happen during
        !          4095: \fIsprinting\fR:
        !          4096: .IP 1.
        !          4097: If the printmacro property value is a string and the item to be
        !          4098: printed has a nil \fIcdr\fR, then the string will be printed instead
        !          4099: of the item.
        !          4100: .IP 2.
        !          4101: If the printmacro property value is a string and the item to be
        !          4102: printed has two items in it, then the string will be printed followed
        !          4103: immediately by the \fIcadr\fR of the item.
        !          4104: .IP 3.
        !          4105: If the printmacro property value is a string but the item to be
        !          4106: printed is longer than two elements, then it will be \fIsprinted\fR in
        !          4107: the normal fashion (i.e., the printmacro will be ignored).
        !          4108: .IP 4.
        !          4109: Otherwise, the printmacro property value will be applied
        !          4110: to the rest of the arguments.
        !          4111: It should be a function which expects three arguments, the item
        !          4112: to be printed, a left column to start in and a right column to
        !          4113: try not to go beyond.
        !          4114: A good default value for the right column argument seems to be zero.
        !          4115: If the function under the printmacro property returns nil,
        !          4116: then \fIsprint\fR assumes that it decided not to print the item
        !          4117: and prints it in the usual way.
        !          4118: .PP
        !          4119: \fBNote 4:\fR  The Fixit debugger now accepts a command of the
        !          4120: form \fB>  newname\fR whenever either an undefined function or
        !          4121: unbound variable error occurs.  As in UCI Lisp, newname is not
        !          4122: evaluated in the case of an undefined function but is evaluated
        !          4123: in the case of an unbound variable.
        !          4124: Note that the blank is required (unlike UCI Lisp).
        !          4125: This is not guaranteed to work if you move around the stack first.
        !          4126: .bp
        !          4127: .NH
        !          4128: Appendix of Franz Lisp functions added to UCI Lisp PEARL
        !          4129: .PP
        !          4130: The following is a summary of the functions added to the UCI Lisp
        !          4131: version of PEARL to make it compatible with Franz Lisp.
        !          4132: Where the details are not obvious, see the Franz Lisp manual.
        !          4133: \fBNote:\fR Most \fImacros\fR listed in the index which are
        !          4134: labelled with asterisks are not available in UCI Lisp PEARL, since
        !          4135: the implementor must specifically request that they stick around.
        !          4136: .PP
        !          4137: \fIDskin\fR, the break package, and \fImsg\fR have been changed
        !          4138: to use the functions \fBdskprintfn\fR, \fBbreakprintfn\fR,
        !          4139: \fBmsgprintfn\fRfor printing.
        !          4140: .LP
        !          4141: .nf
        !          4142: (addtoaddress 'n 'address) -- expr -- Used by \fIcxr\fR and
        !          4143:        \fIrplacx\fR.  Written in LAP code.
        !          4144: (apply* 'fcn 'args) -- macro -- Equivalent to \fIapply#\fR.
        !          4145: (buildalist ...) --- expr --- Used by \fIdefmacro\fR.
        !          4146: (combineskels ...) -- expr -- Used by \fIquasiquote\fR.
        !          4147: (convert ...) --- expr --- Used by \fIdefmacro\fR.
        !          4148: (cxr 'index 'hunk) -- expr -- A hunk is a block of memory.  Provides
        !          4149:        random access to a single cell of a hunk.  (Uses
        !          4150:        \fIaddtoaddress\fR and \fIeven\fR.)
        !          4151: (defmacro macroname arglist body) -- macro -- \fIDefmacro\fR provides
        !          4152:        a slightly more intelligent macro facility.  \fIBody\fR is
        !          4153:        processed to look for occurrences of the arguments in
        !          4154:        \fIarglist\fR which are replaced with the appropriate form
        !          4155:        of \fIca..r\fR.  If an argument is preceded by \fI&rest\fR,
        !          4156:        then it gets the list of the rest of the arguments.
        !          4157:        The Franz Lisp version has many more features not included
        !          4158:        in the PEARL version.
        !          4159: (even 'x) -- expr -- Is \fIx\fR even? Used by \fIcxr\fR and
        !          4160:        \fIrplacx\fR to determine which half of a cons-cell to use.
        !          4161: (isconst ...) -- expr -- Used by \fIquasiquote\fR.
        !          4162: (makhunk 'size) -- expr -- Calls the UCI Lisp function \fIgetblk\fR,
        !          4163:        requesting a block of memory which is half of \fIsize\fR, since
        !          4164:        each piece of a UCI Lisp block of core is a cons-cell.
        !          4165: (msg ...) -- fexpr -- Modified to use \fImsgprintfn\fR to print
        !          4166:        values of evaluated elements of the print list.
        !          4167: (pearl-top-level) -- the PEARL top level loop. 
        !          4168: (pearl-top-level-init) -- The initial function called when PEARL starts up.  
        !          4169: (rplacx 'index 'hunk 'val) -- expr -- Provides random access storage into
        !          4170:        a block of memory.  (Uses \fIaddtoaddress\fR and \fIeven\fR.)
        !          4171: (quasiquote 'skel) -- expr -- called by the quasi-quote readmacro
        !          4172:        character backquote \fB`\fR.  Equivalent to the quasiquote
        !          4173:        functions defined in Charniak[2] with different invoking
        !          4174:        characters to match those of Franz Lisp.
        !          4175:        Unquote is comma \fB","\fR and splice-unquote is \fB",@"\fR.
        !          4176:        Uses \fIcombineskels\fR and \fIisconst\fR.
        !          4177: .fi
        !          4178: .bp
        !          4179: .NH
        !          4180: Bibliography
        !          4181: .SM
        !          4182: .IP [1]
        !          4183: Bobrow, D., and Winograd, T. "An Overview of KRL, a Knowledge
        !          4184: Representation Language."
        !          4185: \fICognitive Science\fR 1:1 (1977).
        !          4186: .IP [2]
        !          4187: Charniak, E., Riesbeck, C., and McDermott, D.
        !          4188: \fIArtificial Intelligence Programming\fR.
        !          4189: Hillsdale, New Jersey: Lawrence Erlbaum Associates, 1980.
        !          4190: .IP [3]
        !          4191: Faletti, J., and Wilensky, R. "The Implementation of PEARL:
        !          4192: A Package for Efficient Access to Representations In Lisp",
        !          4193: forthcoming ERL technical report, UCB.
        !          4194: .IP [4]
        !          4195: Greiner, R., and Lenat, D. "A Representation Language Language."
        !          4196: In \fIProc. First NCAI\fR. Stanford, CA, August, 1980,
        !          4197: 165-169.
        !          4198: .IP [5]
        !          4199: Roberts, I., and Goldstein, R.
        !          4200: "NUDGE, A Knowledge-Based Scheduling Program."
        !          4201: In \fIProc. IJCAI-77\fR. Cambridge, MA, August, 1977, 257-263.
        !          4202: .IP [6]
        !          4203: Schank, R. \fIConceptual Information Processing\fR.
        !          4204: Amsterdam: North Holland, 1975.
        !          4205: .IP [7]
        !          4206: Wilensky, R. "Understanding Goal-Based Stories",
        !          4207: Technical Report 140, Computer Science Department,
        !          4208: Yale University, New Haven, CT, September 1978.
        !          4209: .IP [8]
        !          4210: Wilensky, R.
        !          4211: "Meta-Planning: Representing and Using Knowledge about Planning in Problem
        !          4212: Solving and Natural Language Understanding."
        !          4213: \fICognitive Science\fR 5:3 (1981).
        !          4214: .bp
        !          4215: .nr PS 9
        !          4216: .nr VS 11p
        !          4217: .ps 9
        !          4218: .vs 11p
        !          4219: .NH
        !          4220: Index of Global Variables and Functions With Their Arguments
        !          4221: .PP
        !          4222: All functions are exprs (or lexprs) unless otherwise listed.
        !          4223: Functions with one or more asterisks for a page number are not
        !          4224: documented other than in this index because they were not
        !          4225: actually intended for use by the PEARL user.
        !          4226: A single asterisk * means it is primarily intended for use by
        !          4227: PEARL but might be useful and will generally work right.
        !          4228: A double asterisk ** means it will generally only work
        !          4229: within PEARL's code, since it expects certain
        !          4230: external prog variables to exist and be set correctly.
        !          4231: A triple asterisk *** means it is dangerous to use.
        !          4232: Note that it is dangerous to redefine any functions in this list,
        !          4233: although it should be all right to redefine any macros.
        !          4234: .LP
        !          4235: .nr PS 8
        !          4236: .nr VS 10p
        !          4237: .ps 8
        !          4238: .vs 10p
        !          4239: .nf
        !          4240: *activedbnames* -- special variable -- initial value: nil                          \ki40
        !          4241: *any*conscell* -- special variable -- value: '(*any* . *pearlunbound*) \h'|\niu'*
        !          4242: *availablesizes* -- special variable -- value: \h'|\niu'39
        !          4243:        ((-1. . 1.) (0. . 1.) (1. . 1.) (2. . 3.) (3. . 7.)
        !          4244:         (4. . 13.) (5. . 29.) (6. . 61.) (7. . 127.) . . . .
        !          4245:                Franz Lisp: . . . (8. . 127.) (9. . 127.) (10. . 127.)
        !          4246:                                  (11. . 127.) (12. . 127.) (13. . 127.))
        !          4247:                UCI Lisp:  . . .  (8. . 251.) (9. . 509.) (10. . 1021.)
        !          4248:                                  (11. . 2039.) (12. . 4093.) (13. . 8191.))
        !          4249: *blockstack* -- special variable -- initial value: nil \h'|\niu'48
        !          4250: *currentcreatetype* -- special variable -- initial value: base \h'|\niu'56
        !          4251: *currentpearlstructure* -- special variable -- initial value: nil      \h'|\niu'46
        !          4252: *currentstructure* -- special variable -- initial value: nil   \h'|\niu'46
        !          4253: *currenttopcopy* -- special variable -- initial value: <UNBOUND>       \h'|\niu'55
        !          4254: *currenttopcreated* -- special variable -- initial value: (nilstruct)  \h'|\niu'8
        !          4255: .sp
        !          4256: db -- special variable -- default initial value: <UNBOUND>     \h'|\niu'33
        !          4257: *db* -- special variable -- default value: the *maindb* data base      \h'|\niu'12
        !          4258: *db1size* -- special variable -- default initial value: 29     \h'|\niu'39
        !          4259: *db2size* -- special variable -- default initial value: 127    \h'|\niu'39
        !          4260: *done* -- special atom \h'|\niu'35
        !          4261: .sp
        !          4262: *fail* -- special atom \h'|\niu'35
        !          4263: *file* -- special variable -- initial value: nil       \h'|\niu'60
        !          4264: *firstartup* -- special variable -- initial value: t   \h'|\niu'53
        !          4265: *function-stream:* -- special atom     \h'|\niu'13
        !          4266: *globallist* -- special variable -- initial value: nil \h'|\niu'45
        !          4267: .sp
        !          4268: *history* -- special variable -- value: command history hunk   \h'|\niu'51
        !          4269: *historynumber* -- special variable -- initial value: 0        \h'|\niu'52
        !          4270: *historysize* -- special variable -- default value: 64 \h'|\niu'51
        !          4271: *histval* -- special variable -- value: value history hunk     \h'|\niu'51
        !          4272: *invisible* -- special atom    \h'|\niu'53
        !          4273: .sp
        !          4274: *lastcreated* -- special variable -- initial value: (nilstruct)        \h'|\niu'8
        !          4275: *lastsymbolnum* -- special variable -- initial value: -1       \h'|\niu'*
        !          4276: *maindb* -- special variable -- default value: the main data base      \h'|\niu'11
        !          4277: *matchunboundsresult* -- special variable -- initial value: nil        \h'|\niu'44
        !          4278: *ordinalnames* -- special variable -- initial value: nil       \h'|\niu'31
        !          4279: .sp
        !          4280: *pathlocal* -- special variable -- initial value: <UNBOUND>    \h'|\niu'33
        !          4281: *pathtop* -- special variable -- initial value: <UNBOUND>      \h'|\niu'33
        !          4282: *pearlprompt* -- special variable -- default value: "pearl> "  \h'|\niu'3, 4
        !          4283: *pearlunbound* -- special atom \h'|\niu'45
        !          4284: *printhistorynumber* -- special variable -- initial value: nil \h'|\niu'53
        !          4285: .sp
        !          4286: *readlinechanged* -- special variable -- initial value: nil    \h'|\niu'53
        !          4287: *runaddpredpathhooks* -- special variable -- initial value: t  \h'|\niu'34
        !          4288: *runaddsetpathhooks* -- special variable -- initial value: t   \h'|\niu'34
        !          4289: *runallbasehooks* -- special variable -- initial value: t      \h'|\niu'33
        !          4290: *runallslothooks* -- special variable -- initial value: t      \h'|\niu'33
        !          4291: .sp
        !          4292: *runapplypathhooks* -- special variable -- initial value: t    \h'|\niu'34
        !          4293: *runclearpathhooks* -- special variable -- initial value: t    \h'|\niu'34
        !          4294: *rundelpredpathhooks* -- special variable -- initial value: t  \h'|\niu'34
        !          4295: *rundelsetpathhooks* -- special variable -- initial value: t   \h'|\niu'34
        !          4296: *runexpandedhooks* -- special variable -- initial value: t     \h'|\niu'34
        !          4297: *runfetchhooks* -- special variable -- initial value: t        \h'|\niu'34
        !          4298: *rungethookpathhooks* -- special variable -- initial value: t  \h'|\niu'34
        !          4299: *rungetpathhooks* -- special variable -- initial value: t      \h'|\niu'34
        !          4300: *rungetpredpathhooks* -- special variable -- initial value: t  \h'|\niu'34
        !          4301: *runindbhooks* -- special variable -- initial value: t \h'|\niu'34
        !          4302: *runindividualhooks* -- special variable -- initial value: t   \h'|\niu'34
        !          4303: *runinsertdbhooks* -- special variable -- initial value: t     \h'|\niu'34
        !          4304: *runmatchhooks* -- special variable -- initial value: t        \h'|\niu'34
        !          4305: *runnextequalhooks* -- special variable -- initial value: t    \h'|\niu'34
        !          4306: *runnextitemhooks* -- special variable -- initial value: t     \h'|\niu'34
        !          4307: *runpatternhooks* -- special variable -- initial value: t      \h'|\niu'34
        !          4308: *runputpathhooks* -- special variable -- initial value: t      \h'|\niu'34
        !          4309: *runremovedbhooks* -- special variable -- initial value: t     \h'|\niu'34
        !          4310: *runsmergehooks* -- special variable -- initial value: t       \h'|\niu'34
        !          4311: *runstrequalhooks* -- special variable -- initial value: t     \h'|\niu'34
        !          4312: .sp
        !          4313: *stream* -- special atom       \h'|\niu'13
        !          4314: *stream:* -- special atom      \h'|\niu'13
        !          4315: *toplevelp* -- special variable -- initial value: <UNBOUND>    \h'|\niu'*
        !          4316: *unhashablevalues* -- special variable -- initial value:       \h'|\niu'*
        !          4317:        (0 unbound *pearlunbound* nilsym (nilstruct))
        !          4318: *use* -- special atom  \h'|\niu'35
        !          4319: *usealiases* -- special variable -- initial value: t   \h'|\niu'51
        !          4320: *warn* -- special variable -- initial value: t \h'|\niu'17
        !          4321: *zero-ordinal-value* -- special variable -- initial value: 0   \h'|\niu'31
        !          4322: .sp
        !          4323: ! -- splicing macro    \h'|\niu'52
        !          4324: $ -- splicing macro    \h'|\niu'52
        !          4325: = -- read macro        \h'|\niu'28
        !          4326: ? -- read macro        \h'|\niu'16
        !          4327: .sp
        !          4328: (addalist 'var 'inst) -- macro \h'|\niu'*
        !          4329: (addbasehook 'conscell 'item) -- macro \h'|\niu'*
        !          4330: (addhistory 'line)     \h'|\niu'*
        !          4331: (addpredpath 'item 'path 'pred)        \h'|\niu'10
        !          4332: (addsetpath 'item 'path 'value)        \h'|\niu'10
        !          4333: .sp
        !          4334: (addtoexpansionlists) -- macro \h'|\niu'**
        !          4335: (adjvarset 'var 'val) -- macro \h'|\niu'*
        !          4336: (allocdef numofslots) -- macro \h'|\niu'*
        !          4337: (allocval numofslots) -- macro \h'|\niu'*
        !          4338: (applypath 'fcn 'item 'path)   \h'|\niu'10
        !          4339: .sp
        !          4340: (base name [storage] slot1 ...) -- macro       \h'|\niu'56
        !          4341: (basicmatch 'item1 'item2)     \h'|\niu'46
        !          4342: (block [blockname] varlist) -- fexpr   \h'|\niu'47
        !          4343: (blockatom 'symbol)    \h'|\niu'48
        !          4344: (blockp 'potblock)     \h'|\niu'30
        !          4345: .sp
        !          4346: (breakprintfn '*printval*)     \h'|\niu'58, 59
        !          4347: (builddb newdb [olddb]) -- fexpr       \h'|\niu'38
        !          4348: (buildintvalue 'intval 'bppset) -- macro       \h'|\niu'*
        !          4349: (buildslot) -- macro   \h'|\niu'**
        !          4350: (buildstructvalue 'structdesc) -- macro        \h'|\niu'*
        !          4351: (buildsymbolvalue 'symname) -- macro   \h'|\niu'*
        !          4352: (buildvalue 'value 'typenum 'ppset)    \h'|\niu'*
        !          4353: .sp
        !          4354: (cb name [storage] slot1 ...) -- macro \h'|\niu'56
        !          4355: (ce basename newname [storage] slot1 ...) -- macro     \h'|\niu'56
        !          4356: (cf name [storage] slot1 ...) -- macro \h'|\niu'56
        !          4357: (checkandrunbasehooks2 'fcn 'item1 'item2) -- macro    \h'|\niu'**
        !          4358: (checkandrunslothooks2 'fcn 'hooks 'val1 'val2 'item1 'item2) -- macro \h'|\niu'**
        !          4359: (checkrunhandlebasehooks1 'fcn 'runhooksatom) -- macro \h'|\niu'**
        !          4360: (checkrunhandleslothooks1 'fcn 'runhooksatom) -- macro \h'|\niu'**
        !          4361: (ci basename [storage] slot1 ...) -- macro     \h'|\niu'56
        !          4362: .sp
        !          4363: (cleardb ['db])        \h'|\niu'39
        !          4364: (cleardb1 'db) \h'|\niu'39
        !          4365: (cleardbactive 'db) -- macro   \h'|\niu'*
        !          4366: (clearhashandformat 'slotnum 'defblock) -- macro       \h'|\niu'*
        !          4367: (clearpath 'item 'path)        \h'|\niu'10
        !          4368: .sp
        !          4369: (compatible 'slotnum 'item1 'item2) -- macro   \h'|\niu'*
        !          4370: (connectdb 'newdb 'olddb)      \h'|\niu'*
        !          4371: (consistentvalue 'val 'predlist 'typenum 'item) -- macro       \h'|\niu'*
        !          4372: (constructvalue) -- macro      \h'|\niu'**
        !          4373: (convertpreds 'pred)   \h'|\niu'*
        !          4374: (copy 'list)   \h'|\niu'54
        !          4375: (copypatternslot) -- macro     \h'|\niu'**
        !          4376: (copyslice) -- macro   \h'|\niu'**
        !          4377: (copyslot 'nameblock) -- macro \h'|\niu'**
        !          4378: .sp
        !          4379: (cp basename [storage] slot1 ...) -- macro     \h'|\niu'56
        !          4380: (cr selector ...) -- fexpr     \h'|\niu'55
        !          4381: (create selector ...) -- fexpr \h'|\niu'5
        !          4382: (createbase 'newname 'slots)   \h'|\niu'*
        !          4383: (createexpanded 'oldname 'newname 'slots)      \h'|\niu'*
        !          4384: (createfunction 'fcnname 'slots)       \h'|\niu'*
        !          4385: (createindividual 'basename 'slots)    \h'|\niu'*
        !          4386: (createpattern 'basename 'slots)       \h'|\niu'*
        !          4387: .sp
        !          4388: (databasep 'potdb)     \h'|\niu'30
        !          4389: (dbcr selector ...) -- macro   \h'|\niu'56
        !          4390: (dbcreate selector ...) -- macro       \h'|\niu'12, 56
        !          4391: (debugprint 'item)     \h'|\niu'21
        !          4392: (defatom 'symbol)      \h'|\niu'7
        !          4393: .sp
        !          4394: (defaultfortype 'typenum) -- macro     \h'|\niu'*
        !          4395: (definitionp 'potdef)  \h'|\niu'30
        !          4396: (delpredpath 'item 'path 'pred)        \h'|\niu'10
        !          4397: (delsetpath 'item 'path 'value)        \h'|\niu'10
        !          4398: (disguisedas 'filler 'struct ['db])    \h'|\niu'29
        !          4399: (disguisedas1 'filler 'struct 'db)     \h'|\niu'29
        !          4400: .sp
        !          4401: (dobasehooks2< 'fcn 'runhookatom) -- macro     \h'|\niu'**
        !          4402: (dobasehooks2> 'fcn 'runhookatom) -- macro     \h'|\niu'**
        !          4403: (doslothooks2< 'fcn 'runhookatom) -- macro     \h'|\niu'**
        !          4404: (doslothooks2> 'fcn 'runhookatom) -- macro     \h'|\niu'**
        !          4405: (dskprintfn '*printval*)       \h'|\niu'60
        !          4406: .sp
        !          4407: (endallblocks) \h'|\niu'48
        !          4408: (endanyblocks blockname) -- fexpr      \h'|\niu'48
        !          4409: (endblock [blockname]) -- fexpr        \h'|\niu'47
        !          4410: (enforcetype 'value 'typenum)  \h'|\niu'*
        !          4411: (equalvalue 'xval 'yval 'typenum) -- macro     \h'|\niu'*
        !          4412: (evalfcn 'item)        \h'|\niu'51
        !          4413: .sp
        !          4414: (executehook1 fcn value item defblock) -- macro        \h'|\niu'**
        !          4415: (executehook2 fcn val1 val2 item1 item2 defblock result) -- macro      \h'|\niu'**
        !          4416: (expanded basename newname [storage] slot1 ...) -- macro       \h'|\niu'56
        !          4417: (expandedfetch 'item ['db])    \h'|\niu'42
        !          4418: (expandedfetch1 'item 'db)     \h'|\niu'42
        !          4419: .sp
        !          4420: (fcnslot) -- macro     \h'|\niu'**
        !          4421: (fetch 'item ['db])    \h'|\niu'12, 43
        !          4422: (fetch1 'item 'db)     \h'|\niu'12, 43
        !          4423: (fetcheverywhere 'item ['db])  \h'|\niu'19, 25
        !          4424: (fetcheverywhere1 'item 'db)   \h'|\niu'19, 25
        !          4425: (fetchcreate selector ...) -- macro    \h'|\niu'14, 56
        !          4426: (fillbaseslot) -- macro        \h'|\niu'**
        !          4427: (fillin1 'fcn 'value 'item 'defblock)  \h'|\niu'33
        !          4428: (fillin2 'fcn 'val1 'val2 'item1 'item2 'defblock 'result)     \h'|\niu'33
        !          4429: (fillindivslot) -- macro       \h'|\niu'**
        !          4430: .sp
        !          4431: (findnextblockstart) -- macro  \h'|\niu'**
        !          4432: (findslotnum) -- macro \h'|\niu'**
        !          4433: (findstructsymbolpair 'defblock 'symbol) -- macro      \h'|\niu'**
        !          4434: (firstfetch pattern) -- macro  \h'|\niu'14, 56
        !          4435: (fn name [storage] slot1 ...) -- macro \h'|\niu'56
        !          4436: .sp
        !          4437: (followpath 'item 'path)       \h'|\niu'*
        !          4438: (for val 'init 'final &rest 'body) -- macro    \h'|\niu'54
        !          4439: (foreach 'stream fcn) -- fexpr \h'|\niu'54
        !          4440: (fp 'item ['lmar ['rmar]])     \h'|\niu'56
        !          4441: (freezebindings 'struct)       \h'|\niu'48
        !          4442: (freezeblock 'blockname)       \h'|\niu'49
        !          4443: (freezestruct 'struct) \h'|\niu'49
        !          4444: .sp
        !          4445: (fullform 'item)       \h'|\niu'20
        !          4446: (fullprint 'item ['lmar ['rmar]])      \h'|\niu'20, 37
        !          4447: (fullprint1 'item 'lmar 'rmar) \h'|\niu'20, 37
        !          4448: (fullslotform) -- macro        \h'|\niu'**
        !          4449: .sp
        !          4450: (getalist 'inst) -- macro      \h'|\niu'57
        !          4451: (getalistcp 'inst) -- macro    \h'|\niu'57
        !          4452: (getbasehooks 'defblock) -- macro      \h'|\niu'57
        !          4453: (getdb1 'db) -- macro  \h'|\niu'57
        !          4454: (getdb2 'db) -- macro  \h'|\niu'57
        !          4455: (getdbactive 'db) -- macro     \h'|\niu'57
        !          4456: (getdbchildren 'db) -- macro   \h'|\niu'57
        !          4457: (getdbname 'db) -- macro       \h'|\niu'57
        !          4458: (getdbparent 'db) -- macro     \h'|\niu'57
        !          4459: (getdefaultinst 'defblock)     \h'|\niu'57
        !          4460: (getdefinition 'valblock)      \h'|\niu'57
        !          4461: (getenforce 'slotnum 'defblock) -- macro       \h'|\niu'57
        !          4462: (getexpansionlist 'defblock) -- macro  \h'|\niu'57
        !          4463: (getformatinfo 'slotnum 'defblock) -- macro    \h'|\niu'57
        !          4464: (gethash* 'slotnum 'defblock) -- macro \h'|\niu'57
        !          4465: (gethash** 'slotnum 'defblock) -- macro        \h'|\niu'57
        !          4466: (gethash1 'num1 'db1) -- macro \h'|\niu'57
        !          4467: (gethash2 'num1 'num2 'db2) -- macro   \h'|\niu'57
        !          4468: (gethash3 'num1 'num2 'num3 'db2) -- macro     \h'|\niu'57
        !          4469: (gethash: 'slotnum 'defblock) -- macro \h'|\niu'57
        !          4470: (gethash:: 'slotnum 'defblock) -- macro        \h'|\niu'57
        !          4471: (gethash< 'slotnum 'defblock) -- macro \h'|\niu'57
        !          4472: (gethash> 'slotnum 'defblock) -- macro \h'|\niu'57
        !          4473: (gethashalias 'defblock) -- macro      \h'|\niu'57
        !          4474: (gethashinfo 'slotnum 'defblock) -- macro      \h'|\niu'57
        !          4475: (gethashvalue 'slotnum 'item 'defblock)        \h'|\niu'*
        !          4476: .sp
        !          4477: (gethookpath 'item 'path)      \h'|\niu'10
        !          4478: (getisa 'valblock) -- macro    \h'|\niu'57
        !          4479: (getpath 'item 'path)  \h'|\niu'10
        !          4480: (getpname 'defblock) -- macro  \h'|\niu'57
        !          4481: (getppset 'slotnum 'defblock) -- macro \h'|\niu'57
        !          4482: (getpred 'slotnum 'inst) -- macro      \h'|\niu'57
        !          4483: (getpredpath 'item 'path)      \h'|\niu'10
        !          4484: .sp
        !          4485: (getsinglevalue 'slotnum 'item)        \h'|\niu'*
        !          4486: (getslot 'slotnum 'inst) -- macro      \h'|\niu'57
        !          4487: (getslothooks 'slotnum 'inst) -- macro \h'|\niu'57
        !          4488: (getslotname 'slotnum 'defblock) -- macro      \h'|\niu'57
        !          4489: (getslottype 'slotnum 'defblock) -- macro      \h'|\niu'57
        !          4490: (getstructlength 'defblock) -- macro   \h'|\niu'57
        !          4491: (getstructorsymnum 'strsym) -- macro   \h'|\niu'57
        !          4492: .sp
        !          4493: (getsymbol 'symname)   \h'|\niu'4
        !          4494: (getsymbolpname 'symbolitem) -- macro  \h'|\niu'57
        !          4495: (getuniquenum 'defblock) -- macro      \h'|\niu'57
        !          4496: (getvalue 'slotnum 'inst)      \h'|\niu'57
        !          4497: (getvarandvalue 'slotnum 'inst 'var)   \h'|\niu'57
        !          4498: (getvarval 'slotnum 'inst) -- macro    \h'|\niu'57
        !          4499: .sp
        !          4500: (*global* varname) -- fexpr    \h'|\niu'46
        !          4501: (global variable) -- fexpr     \h'|\niu'45
        !          4502: (globalp 'variable)    \h'|\niu'45
        !          4503: (handlehookresult 'oldval 'newval) -- macro    \h'|\niu'**
        !          4504: (hashablevalue 'slotnum 'item 'defblock) -- macro      \h'|\niu'**
        !          4505: (hashslot) -- macro    \h'|\niu'**
        !          4506: .sp
        !          4507: (hidden 'command) -- macro     \h'|\niu'35
        !          4508: (higheroreq 'item1 'item2) -- macro    \h'|\niu'*
        !          4509: (history ['num])       \h'|\niu'53
        !          4510: (ind basename [storage] slot1 ...) -- macro    \h'|\niu'56
        !          4511: (indb 'item ['db])     \h'|\niu'14
        !          4512: (indb1 'item 'db)      \h'|\niu'14
        !          4513: (individual basename [storage] slot1 ...) -- macro     \h'|\niu'56
        !          4514: .sp
        !          4515: (inheritvalue 'structdef) -- macro     \h'|\niu'**
        !          4516: (inlinecreate selector ...) -- macro   \h'|\niu'14, 56
        !          4517: (inlinefetchcreate selector ...) -- macro      \h'|\niu'14, 56
        !          4518: (insertdb 'item ['db]) \h'|\niu'12
        !          4519: (insertdb1 'item 'db)  \h'|\niu'12
        !          4520: .sp
        !          4521: (insidecreate selector ...) -- fexpr   \h'|\niu'**
        !          4522: (insidefetch patdef expdefs) -- macro  \h'|\niu'**
        !          4523: (insidefetcheverywhere patdef expdefs) -- macro        \h'|\niu'**
        !          4524: (insidepatternize 'item)       \h'|\niu'**
        !          4525: (insidescopy 'item)    \h'|\niu'**
        !          4526: (installadjunct 'adjunctvar) -- macro  \h'|\niu'**
        !          4527: (installglobal 'globalvar) -- macro    \h'|\niu'**
        !          4528: (installvar 'varname) -- macro \h'|\niu'**
        !          4529: .sp
        !          4530: (instatom 'symbol)     \h'|\niu'7
        !          4531: (isa 'item1 'name)     \h'|\niu'42
        !          4532: (isanexpanded 'item1 'item2)   \h'|\niu'42
        !          4533: (islambda 'fcnname)    \h'|\niu'*
        !          4534: .sp
        !          4535: (match 'item1 'item2)  \h'|\niu'46
        !          4536: (msgprintfn '*printval*)       \h'|\niu'58, 62
        !          4537: (newnum) -- macro      \h'|\niu'*
        !          4538: (nextequal 'stream)    \h'|\niu'46
        !          4539: (nextitem 'stream)     \h'|\niu'13
        !          4540: (noalias) -- macro     \h'|\niu'**
        !          4541: .sp
        !          4542: (nullstruct 'item)     \h'|\niu'42
        !          4543: (nullsym 'item)        \h'|\niu'42
        !          4544: (numberofslot 'slotname 'defblock) -- macro    \h'|\niu'57
        !          4545: (onesymbol) -- macro   \h'|\niu'**
        !          4546: (ordatom 'symbol)      \h'|\niu'31
        !          4547: (ordinal name vallist) -- fexpr        \h'|\niu'30
        !          4548: .sp
        !          4549: (pat basename [storage] slot1 ...) -- macro    \h'|\niu'56
        !          4550: (path fcn 'item 'pathlist ['val]) -- macro     \h'|\niu'9
        !          4551: (pattern basename [storage] slot1 ...) -- macro        \h'|\niu'56
        !          4552: (patternize 'item) -- macro    \h'|\niu'55
        !          4553: (patternizeslot) -- macro      \h'|\niu'**
        !          4554: (pboundp 'a)   \h'|\niu'45
        !          4555: .sp
        !          4556: (pearlprintfn '*printval*)     \h'|\niu'3, 4
        !          4557: (pexp basename newname [storage] slot1 ...) -- macro   \h'|\niu'56
        !          4558: (pfunction name [storage] slot1 ...) -- macro  \h'|\niu'56
        !          4559: (pname 'item)  \h'|\niu'4
        !          4560: (ppsetform 'slotval 'ppsetname)        \h'|\niu'*
        !          4561: .sp
        !          4562: (prefix 'item1 'item2) \h'|\niu'52
        !          4563: (prefixcommandhistory) \h'|\niu'*
        !          4564: (prefixcommandvalue)   \h'|\niu'*
        !          4565: (printdb ['db])        \h'|\niu'21
        !          4566: (printdb1 'db) \h'|\niu'21
        !          4567: (psymbolp 'potsymbol)  \h'|\niu'30
        !          4568: (punbound)     \h'|\niu'45
        !          4569: .sp
        !          4570: (punboundatomp 'yyy)   \h'|\niu'*
        !          4571: (putalist 'alist 'inst) -- macro       \h'|\niu'*
        !          4572: (putalistcp 'alist 'inst) -- macro     \h'|\niu'*
        !          4573: (putbasehooks 'hooklist 'defblock) -- macro    \h'|\niu'*
        !          4574: (putdb1 'db1 'db) -- macro     \h'|\niu'***
        !          4575: (putdb2 'db2 'db) -- macro     \h'|\niu'***
        !          4576: (putdbchildren 'childlist 'db) -- macro        \h'|\niu'***
        !          4577: (putdbname 'name 'db) -- macro \h'|\niu'*
        !          4578: (putdbparent 'parent 'db) -- macro     \h'|\niu'***
        !          4579: (putdef 'defblock 'valblock) -- macro  \h'|\niu'***
        !          4580: (putdefaultinst 'valblock 'defblock) -- macro  \h'|\niu'***
        !          4581: (putenforce 'slotnum 'defblock) -- macro       \h'|\niu'***
        !          4582: (putexpansionlist 'explist 'defblock) -- macro \h'|\niu'***
        !          4583: (putformatinfo 'slotnum 'hashnum 'defblock) -- macro   \h'|\niu'***
        !          4584: (puthash* 'slotnum 'defblock) -- macro \h'|\niu'***
        !          4585: (puthash** 'slotnum 'defblock) -- macro        \h'|\niu'***
        !          4586: (puthash1 'num1 'db1 'item) -- macro   \h'|\niu'*
        !          4587: (puthash2 'num1 'num2 'db2 'item) -- macro     \h'|\niu'*
        !          4588: (puthash3 'num1 'num2 'num3 'db2 'item) -- macro       \h'|\niu'*
        !          4589: (puthash: 'slotnum 'defblock) -- macro \h'|\niu'***
        !          4590: (puthash:: 'slotnum 'defblock) -- macro        \h'|\niu'***
        !          4591: (puthash< 'slotnum 'defblock) -- macro \h'|\niu'***
        !          4592: (puthash> 'slotnum 'defblock) -- macro \h'|\niu'***
        !          4593: (puthashalias 'hashnum 'defblock) -- macro     \h'|\niu'***
        !          4594: (puthashinfo 'slotnum 'hashnum 'defblock) -- macro     \h'|\niu'***
        !          4595: (putisa 'isa 'valblock) -- macro       \h'|\niu'***
        !          4596: .sp
        !          4597: (putpath 'item 'path 'value)   \h'|\niu'10
        !          4598: (putpname 'name 'defblock) -- macro    \h'|\niu'***
        !          4599: (putppset 'slotnum 'setname 'defblock) -- macro        \h'|\niu'*
        !          4600: (putpred 'slotnum 'value 'inst) -- macro       \h'|\niu'*
        !          4601: (putslot 'slotnum 'value 'inst) -- macro       \h'|\niu'***
        !          4602: (putslothooks 'slotnum 'slothooklist 'inst) -- macro   \h'|\niu'*
        !          4603: (putslotname 'slotnum 'slotname 'defblock) -- macro    \h'|\niu'***
        !          4604: (putslottype 'slotnum 'typenum 'defblock) -- macro     \h'|\niu'***
        !          4605: (putstructlength 'size 'defblock) -- macro     \h'|\niu'***
        !          4606: (putsymbolpname 'name 'block) -- macro \h'|\niu'***
        !          4607: (putuniquenum 'num 'defblock) -- macro \h'|\niu'***
        !          4608: (putvarval 'slotnum 'value 'inst) -- macro     \h'|\niu'***
        !          4609: (reallitatom 'potatom) \h'|\niu'*
        !          4610: .sp
        !          4611: (releasedb 'db)        \h'|\niu'38
        !          4612: (removedb 'item ['db]) \h'|\niu'12
        !          4613: (removedb1 'item 'db)  \h'|\niu'12
        !          4614: (removeslot) -- macro  \h'|\niu'**
        !          4615: (revassq 'value 'alist)        \h'|\niu'*
        !          4616: (runbasehooks1 'fcn 'item)     \h'|\niu'33
        !          4617: (runbasehooks2 'fcn 'item1 'item2 'result)     \h'|\niu'33
        !          4618: (runslothooks1 'fcn 'item 'slotname 'value)    \h'|\niu'33
        !          4619: (runslothooks2 'fcn 'item1 'item2 'slotname 'val1 'val2)       \h'|\niu'33
        !          4620: .sp
        !          4621: (savecontinue 'directory 'name)        \h'|\niu'53
        !          4622: (savefresh 'directory 'name)   \h'|\niu'53
        !          4623: (savepearl)    \h'|\niu'*
        !          4624: (scopy 'item) -- macro \h'|\niu'55
        !          4625: (scopyslot) -- macro   \h'|\niu'**
        !          4626: (setblock blockname) -- fexpr  \h'|\niu'48
        !          4627: .sp
        !          4628: (setdbactive 'db) -- macro     \h'|\niu'***
        !          4629: (setdbsize 'poweroftwo)        \h'|\niu'39
        !          4630: (setv var 'val 'environment) -- fexpr  \h'|\niu'47
        !          4631: (slotequal 'slotnum 'item1 'item2)     \h'|\niu'*
        !          4632: (slotnametonumber 'slotname 'defblock) -- macro        \h'|\niu'**
        !          4633: (smerge 'build 'from)  \h'|\niu'55
        !          4634: .sp
        !          4635: (standardfetch 'item ['db])    \h'|\niu'43
        !          4636: (standardfetch1 'item 'db)     \h'|\niu'43
        !          4637: (standardmatch 'item1 'item2)  \h'|\niu'46
        !          4638: (streamp 'potstream)   \h'|\niu'30
        !          4639: (streamtolist 'stream) \h'|\niu'14
        !          4640: .sp
        !          4641: (strequal 'item1 'item2)       \h'|\niu'46
        !          4642: (structurenamep 'potname)      \h'|\niu'30
        !          4643: (structurep 'potstruct)        \h'|\niu'30
        !          4644: (symatom 'symbol)      \h'|\niu'4
        !          4645: (symbol name1 name2 ...) -- fexpr      \h'|\niu'4
        !          4646: (symbole 'symname)     \h'|\niu'4
        !          4647: (symbolnamep 'potname) \h'|\niu'30
        !          4648: .sp
        !          4649: (thawbindings 'struct) \h'|\niu'49
        !          4650: (thawblock 'blockname) \h'|\niu'49
        !          4651: (thawstruct 'struct)   \h'|\niu'49
        !          4652: (unbind globalvar) -- fexpr    \h'|\niu'45
        !          4653: (unbindvars 'structure) -- macro       \h'|\niu'46
        !          4654: (unboundatomp 'yyy)    \h'|\niu'*
        !          4655: .sp
        !          4656: (valform 'item)        \h'|\niu'20
        !          4657: (valprint 'item ['lmar ['rmar]])       \h'|\niu'20
        !          4658: (valprint1 'item 'lmar)        \h'|\niu'20
        !          4659: (valslotform) -- macro \h'|\niu'**
        !          4660: (valueof 'var 'struct) \h'|\niu'17
        !          4661: .sp
        !          4662: (*var* varname) -- fexpr       \h'|\niu'46
        !          4663: (varset 'var 'val) -- macro    \h'|\niu'*
        !          4664: (varvalue var 'val) -- fexpr   \h'|\niu'17
        !          4665: (visible 'command) -- macro    \h'|\niu'35
        !          4666: (vp 'item ['lmar ['rmar]])     \h'|\niu'56
        !          4667: (while 'val &rest 'body) -- macro      \h'|\niu'54
        !          4668: .fi
        !          4669: .bp
        !          4670: .nr PS 9
        !          4671: .nr VS 11p
        !          4672: .ps 9
        !          4673: .vs 11p
        !          4674: .NH
        !          4675: Concept Index
        !          4676: .LP
        !          4677: .nr PS 8
        !          4678: .nr VS 10p
        !          4679: .ps 8
        !          4680: .vs 10p
        !          4681: .nf
        !          4682: abbreviations                                                \ki55-56
        !          4683: accessing slots of structures  \h'|\niu'8-10
        !          4684: accessing structure default instances  \h'|\niu'7
        !          4685: accessing structure definitions        \h'|\niu'7
        !          4686: accessing symbols      \h'|\niu'4
        !          4687: .sp
        !          4688: adding slots to structures     \h'|\niu'40
        !          4689: adding to the data base        \h'|\niu'12
        !          4690: adjunct variables      \h'|\niu'30
        !          4691: affecting forced aliasing (^)  \h'|\niu'27
        !          4692: ako's (expanded structures)    \h'|\niu'40-42
        !          4693: .sp
        !          4694: aliasing of commands   \h'|\niu'51
        !          4695: aliasing in hashing    \h'|\niu'27
        !          4696: ampersand (&) hashing  \h'|\niu'26
        !          4697: and, in predicates     \h'|\niu'28
        !          4698: anti-aliasing in hashing (<)   \h'|\niu'27
        !          4699: *any*  \h'|\niu'15
        !          4700: automatic storing of structures        \h'|\niu'8, 56
        !          4701: .sp
        !          4702: base hooks     \h'|\niu'32-37
        !          4703: bases  \h'|\niu'5
        !          4704: blocks \h'|\niu'47-48
        !          4705: building structures    \h'|\niu'5
        !          4706: building upon data bases       \h'|\niu'38, 39
        !          4707: .sp
        !          4708: changing slots of structures   \h'|\niu'8
        !          4709: clearing data bases    \h'|\niu'39
        !          4710: colon (:) hashing      \h'|\niu'23
        !          4711: colon-colon (::) hashing       \h'|\niu'24
        !          4712: .sp
        !          4713: command aliasing       \h'|\niu'51
        !          4714: command history        \h'|\niu'51-53
        !          4715: command history, printing      \h'|\niu'53
        !          4716: compatibility functions (UCI, Franz)   \h'|\niu'58-62
        !          4717: .sp
        !          4718: controlling running of hooks   \h'|\niu'33-34
        !          4719: controlling results with hooks \h'|\niu'35
        !          4720: controlling unbinding of variables     \h'|\niu'48-49
        !          4721: converting from internal form  \h'|\niu'20
        !          4722: copy redefined \h'|\niu'54
        !          4723: copying structures     \h'|\niu'55
        !          4724: .sp
        !          4725: creating data bases    \h'|\niu'38, 39
        !          4726: creating patterns      \h'|\niu'15-16
        !          4727: creating base structures       \h'|\niu'5
        !          4728: creating individual structures \h'|\niu'6
        !          4729: creating symbols       \h'|\niu'4
        !          4730: .sp
        !          4731: data bases     \h'|\niu'11
        !          4732: data bases, building upon      \h'|\niu'39
        !          4733: data bases, clearing   \h'|\niu'39
        !          4734: data bases, creating   \h'|\niu'38
        !          4735: data bases, fetching from      \h'|\niu'12, 19, 25, 42, 43, 46
        !          4736: data bases, freeing    \h'|\niu'40
        !          4737: data bases, inserting into     \h'|\niu'12
        !          4738: data bases, printing   \h'|\niu'21
        !          4739: data bases, releasing  \h'|\niu'40
        !          4740: data bases, removing from      \h'|\niu'12
        !          4741: data bases, setting size of    \h'|\niu'39
        !          4742: .sp
        !          4743: debugging      \h'|\niu'21
        !          4744: debugging print        \h'|\niu'21
        !          4745: declaring global variables     \h'|\niu'45
        !          4746: .sp
        !          4747: default fetch function \h'|\niu'43
        !          4748: default instance for a structure       \h'|\niu'15
        !          4749: default instance, accessing    \h'|\niu'7
        !          4750: default match function \h'|\niu'46
        !          4751: default printing functions     \h'|\niu'20, 58, 60-61, 62
        !          4752: default values for slots       \h'|\niu'14-15
        !          4753: defaults, inherited    \h'|\niu'41-42
        !          4754: .sp
        !          4755: defining structures    \h'|\niu'5
        !          4756: defining symbols       \h'|\niu'4
        !          4757: definitions of structures, accessing   \h'|\niu'7
        !          4758: deleting from the data base    \h'|\niu'12
        !          4759: demons (hooks) \h'|\niu'32-37
        !          4760: .sp
        !          4761: disguising in path     \h'|\niu'10-11
        !          4762: disguising in predicates       \h'|\niu'29
        !          4763: don't-care matching variable   \h'|\niu'15
        !          4764: double-colon (::) hashing      \h'|\niu'24
        !          4765: double-star (**) hashing       \h'|\niu'24
        !          4766: dumping PEARL for later        \h'|\niu'53
        !          4767: .sp
        !          4768: efficiency despite variables   \h'|\niu'30
        !          4769: enumerated (ordinal) types     \h'|\niu'30
        !          4770: environment for variable evaluation    \h'|\niu'46-47
        !          4771: environment, top level \h'|\niu'51-53
        !          4772: environments, in hooks \h'|\niu'33
        !          4773: .sp
        !          4774: equality of structures \h'|\niu'46
        !          4775: equivalences of functions (UCI-Franz)  \h'|\niu'58-62
        !          4776: error messages \h'|\niu'21
        !          4777: evaluating function structures \h'|\niu'51
        !          4778: evaluating in create   \h'|\niu'22
        !          4779: expanded structures    \h'|\niu'40
        !          4780: expanded structures, fetching  \h'|\niu'42
        !          4781: .sp
        !          4782: feedback, sending      \h'|\niu'21
        !          4783: fetch, standard        \h'|\niu'46
        !          4784: fetching expanded structures   \h'|\niu'42
        !          4785: fetching from all buckets      \h'|\niu'19, 25
        !          4786: fetching from the data base    \h'|\niu'12 , 19, 25, 42, 43, 46
        !          4787: fetching with equality (not matching)  \h'|\niu'46
        !          4788: .sp
        !          4789: filling in special forms (in hooks)    \h'|\niu'33
        !          4790: for loop       \h'|\niu'54
        !          4791: forced aliasing (>)    \h'|\niu'26
        !          4792: forest of data bases   \h'|\niu'39-40
        !          4793: freeing data bases     \h'|\niu'40
        !          4794: freezing variables     \h'|\niu'48-49
        !          4795: .sp
        !          4796: function equivalences (UCI-Franz)      \h'|\niu'58-62
        !          4797: function structures    \h'|\niu'49-51
        !          4798: function structures, evaluating        \h'|\niu'51
        !          4799: getting symbols        \h'|\niu'4
        !          4800: global variables       \h'|\niu'45
        !          4801: greater-than (>) hashing       \h'|\niu'26
        !          4802: .sp
        !          4803: hash aliasing (&)      \h'|\niu'26
        !          4804: hash marking   \h'|\niu'17, 23-27
        !          4805: hashing problems       \h'|\niu'18
        !          4806: hashing with variables \h'|\niu'30
        !          4807: hiding functions from hooks    \h'|\niu'35
        !          4808: hierarchy of structures        \h'|\niu'40
        !          4809: .sp
        !          4810: history mechanism      \h'|\niu'51-3
        !          4811: history number, printing in prompt     \h'|\niu'53
        !          4812: hooks  \h'|\niu'32-37
        !          4813: hooks, affecting result with   \h'|\niu'35
        !          4814: hooks, controlling running of  \h'|\niu'33-34
        !          4815: hooks, hiding functions from   \h'|\niu'35
        !          4816: hooks, making functions visible to     \h'|\niu'35
        !          4817: hooks, multi-argument  \h'|\niu'28
        !          4818: hooks, running \h'|\niu'33-34
        !          4819: .sp
        !          4820: if-added functions (hooks)     \h'|\niu'32-37
        !          4821: indirection in path    \h'|\niu'10-11
        !          4822: individuals    \h'|\niu'6
        !          4823: inheritance in structures      \h'|\niu'41-42
        !          4824: (.)init.prl file       \h'|\niu'2-3
        !          4825: .sp
        !          4826: inserting in the data base     \h'|\niu'12
        !          4827: instances      \h'|\niu'6
        !          4828: integer slots  \h'|\niu'30
        !          4829: internal access functions      \h'|\niu'57
        !          4830: internal form printing \h'|\niu'21
        !          4831: .sp
        !          4832: invisible functions to hooks   \h'|\niu'35
        !          4833: invisible results from functions       \h'|\niu'53
        !          4834: isa's (expanded structures)    \h'|\niu'40-42
        !          4835: less-than (<) hashing  \h'|\niu'27
        !          4836: lexically scoped variables     \h'|\niu'47-48
        !          4837: .sp
        !          4838: looping functions      \h'|\niu'54
        !          4839: low level access functions     \h'|\niu'57
        !          4840: macros, special        \h'|\niu'56
        !          4841: main data base \h'|\niu'11
        !          4842: marking structures for hashing \h'|\niu'17, 23-27
        !          4843: .sp
        !          4844: match, standard        \h'|\niu'46
        !          4845: match, without unbinding variables     \h'|\niu'46
        !          4846: match-anything variable        \h'|\niu'15
        !          4847: matching process       \h'|\niu'44
        !          4848: matching two structures        \h'|\niu'43
        !          4849: matching unbound variables     \h'|\niu'44
        !          4850: matching-variables     \h'|\niu'16-17
        !          4851: .sp
        !          4852: merging structures     \h'|\niu'55
        !          4853: modified input line, printing  \h'|\niu'53
        !          4854: multi-argument matching predicates     \h'|\niu'28, 32
        !          4855: next item in a stream  \h'|\niu'13
        !          4856: nilstruct(ure) \h'|\niu'14
        !          4857: nilsym(bol)    \h'|\niu'14
        !          4858: .sp
        !          4859: or, in predicates      \h'|\niu'28
        !          4860: ordinal types  \h'|\niu'30-31
        !          4861: path functions \h'|\niu'10
        !          4862: path indirection       \h'|\niu'10-11
        !          4863: pattern-matching variables     \h'|\niu'16-17
        !          4864: .sp
        !          4865: patterns       \h'|\niu'12, 15, 43
        !          4866: patterns in matching   \h'|\niu'43
        !          4867: predicates for object types    \h'|\niu'30
        !          4868: predicates in matching \h'|\niu'27-29
        !          4869: predicates in matching, when run       \h'|\niu'44
        !          4870: predicates in matching, multi-argument \h'|\niu'28
        !          4871: .sp
        !          4872: print names    \h'|\niu'4
        !          4873: printing PEARL objects \h'|\niu'20
        !          4874: printing command history       \h'|\niu'53
        !          4875: printing data bases    \h'|\niu'21
        !          4876: printing functions     \h'|\niu'20
        !          4877: printing functions, standard   \h'|\niu'3-4, 58, 60-61, 62
        !          4878: printing history number in prompt      \h'|\niu'53
        !          4879: printing modified input line   \h'|\niu'53
        !          4880: printing warnings      \h'|\niu'17
        !          4881: .sp
        !          4882: processing a stream    \h'|\niu'13
        !          4883: prompt \h'|\niu'3-4
        !          4884: prompt-read-eval-print loop    \h'|\niu'2-3, 51
        !          4885: read-eval-print loop   \h'|\niu'2-3, 51
        !          4886: redirecting in create (! and $)        \h'|\niu'22
        !          4887: releasing data bases   \h'|\niu'40
        !          4888: removing from the data base    \h'|\niu'12
        !          4889: .sp
        !          4890: reporting bugs \h'|\niu'21
        !          4891: retrieving from the data base  \h'|\niu'12
        !          4892: returning invisible results    \h'|\niu'53
        !          4893: running hooks  \h'|\niu'33-34
        !          4894: running under Franz Lisp       \h'|\niu'2
        !          4895: running under UCI Lisp \h'|\niu'3
        !          4896: .sp
        !          4897: saving PEARL for later \h'|\niu'53
        !          4898: scalar types   \h'|\niu'30
        !          4899: short-circuiting in create     \h'|\niu'22
        !          4900: side effect setting of adjunct variables       \h'|\niu'30
        !          4901: size of data bases     \h'|\niu'39
        !          4902: .sp
        !          4903: slot hooks     \h'|\niu'32-37
        !          4904: slot names to numbers  \h'|\niu'57
        !          4905: slot types     \h'|\niu'6
        !          4906: slot types, more specific      \h'|\niu'30
        !          4907: slot values    \h'|\niu'8-10
        !          4908: slot values in hooks   \h'|\niu'32
        !          4909: slot values in predicates      \h'|\niu'28
        !          4910: .sp
        !          4911: special forms in hooks \h'|\niu'32
        !          4912: special forms in predicates    \h'|\niu'28
        !          4913: special forms, filling in      \h'|\niu'33
        !          4914: special macros \h'|\niu'56
        !          4915: standard fetch function        \h'|\niu'43
        !          4916: standard match function        \h'|\niu'46
        !          4917: .sp
        !          4918: star (*) hashing       \h'|\niu'17, 23
        !          4919: star-star (**) hashing \h'|\niu'24
        !          4920: (.)start.prl file      \h'|\niu'2-3
        !          4921: startup files  \h'|\niu'2-3
        !          4922: storing structures in the data base    \h'|\niu'12
        !          4923: storing of structures in atoms \h'|\niu'8, 56
        !          4924: streams        \h'|\niu'13
        !          4925: .sp
        !          4926: structure equality     \h'|\niu'46
        !          4927: structure matching     \h'|\niu'44-45
        !          4928: structure predicates   \h'|\niu'28-29
        !          4929: structure slots, further typing        \h'|\niu'30
        !          4930: structured escapes to Lisp     \h'|\niu'49-51
        !          4931: structures     \h'|\niu'5
        !          4932: structures, copying    \h'|\niu'55
        !          4933: structures, expanded   \h'|\niu'40
        !          4934: structures, function   \h'|\niu'49-51
        !          4935: structures, merging    \h'|\niu'55
        !          4936: .sp
        !          4937: symbols        \h'|\niu'4
        !          4938: testing for nilstruct  \h'|\niu'42
        !          4939: testing for nilsym     \h'|\niu'42
        !          4940: testing for object types       \h'|\niu'30
        !          4941: thawing variables      \h'|\niu'48-49
        !          4942: .sp
        !          4943: top level loop \h'|\niu'2-3, 51
        !          4944: top level loop functions       \h'|\niu'59, 62
        !          4945: triple (**) hashing    \h'|\niu'24
        !          4946: type tests for objects \h'|\niu'30
        !          4947: types in structure slots       \h'|\niu'31-2
        !          4948: .sp
        !          4949: unbinding global variables by match (lack of)  \h'|\niu'45
        !          4950: unbinding global variables by user     \h'|\niu'45
        !          4951: unbinding local variables by match     \h'|\niu'45-6
        !          4952: unbinding local variables by user      \h'|\niu'46
        !          4953: unbinding of variables, controlling    \h'|\niu'48-49
        !          4954: up-arrow (^) hashing   \h'|\niu'27
        !          4955: .sp
        !          4956: values of variables    \h'|\niu'17, 46
        !          4957: values of variables, setting   \h'|\niu'47
        !          4958: variables in hooks     \h'|\niu'32
        !          4959: variables in predicates        \h'|\niu'28
        !          4960: variables with hashing \h'|\niu'30
        !          4961: variable, accessing values     \h'|\niu'17, 46
        !          4962: variables, adjunct     \h'|\niu'30
        !          4963: variables, controlling unbinding       \h'|\niu'48-49
        !          4964: variables, freezing    \h'|\niu'48-49
        !          4965: variables, global      \h'|\niu'45
        !          4966: variables, lexically scoped    \h'|\niu'47-48
        !          4967: variable, setting values       \h'|\niu'47
        !          4968: variables, side effects        \h'|\niu'30
        !          4969: variables, thawing     \h'|\niu'48-49
        !          4970: variables, unbinding   \h'|\niu'46
        !          4971: .sp
        !          4972: visible functions to hooks     \h'|\niu'35
        !          4973: warnings       \h'|\niu'17
        !          4974: while loop     \h'|\niu'54
        !          4975: .fi
        !          4976: .nr PS 10
        !          4977: .nr VS 12p
        !          4978: .ps 10
        !          4979: .vs 12p
        !          4980: .bp 0
        !          4981: .DS C
        !          4982: .LG
        !          4983: \fBTable of Contents\fR
        !          4984: .SM
        !          4985: .DE
        !          4986: .DS L
        !          4987: 1.  Introduction                                                                                           \ka  1
        !          4988: 2.  Running PEARL               \h'|\nau'  2
        !          4989:       2.1.  Under Franz Lisp    \h'|\nau'  2
        !          4990:       2.2.  Under UCI Lisp      \h'|\nau'  3
        !          4991: 3.  Creating Simple Objects     \h'|\nau'  4
        !          4992:       3.1.  Defining Symbols               \h'|\nau'  4
        !          4993:       3.2.  Defining Structures            \h'|\nau'  5
        !          4994: 4.  Creating Individual Instances of Defined Structures \h'|\nau'  6
        !          4995: 5.  Accessing Slots of Structures \h'|\nau'  8
        !          4996: 6.  Storing In and Retrieving From the Data Base -- The Simplest Way \h'|\nau'11
        !          4997:       6.1  Storing In the Data Base: \fIInsertdb\fR and \fIRemovedb\fR\h'|\nau'11
        !          4998:       6.2  Retrieving Hash Buckets From the Data Base: \fIFetch\fR \h'|\nau'12
        !          4999:       6.3  Accessing the Results of \fIFetch\fR: \fINextitem\fR \h'|\nau'13
        !          5000: 7.  The Default Values for Unspecified Slots \h'|\nau'14
        !          5001: 8.  Using \fIPattern\fRs For More Flexible and Powerful Retrieval \h'|\nau'15
        !          5002: 9.  Marking Structures During Creation For More Efficient Retrieval \h'|\nau'17
        !          5003: 10. Printing Structures, Symbols and Other PEARL Objects \h'|\nau'20
        !          5004: 11. Error Messages, Bugs, and Error Handling Abilities \h'|\nau'21
        !          5005: 12. Short-Circuiting and Redirecting \fICreate\fR Using !, $ and Atoms \h'|\nau'22
        !          5006: 13. More Flexible Hash Selection \h'|\nau'23
        !          5007: 14. Using Predicates to Constrain Fetching \h'|\nau'27
        !          5008: 15. More Useful Slot Types \h'|\nau'30
        !          5009: 16. Attaching Hooks to Structures (If-Added Demons) \h'|\nau'32
        !          5010: 17. Creating and Manipulating Multiple Data Bases \h'|\nau'38
        !          5011: 18. Creating a Forest of Data Bases \h'|\nau'39
        !          5012: 19. Creating Expanded Subtypes of Previously Defined Objects \h'|\nau'40
        !          5013: 20. Fetching Expanded Structures \h'|\nau'42
        !          5014: 21. How Two Objects \fIMatch\fR \h'|\nau'43
        !          5015:       21.1  When Is a Pattern not a \fIPattern\fR? \h'|\nau'43
        !          5016:       21.2  The Matching Process \h'|\nau'44
        !          5017: 22. Binding Blocks of Structures Together Via Common Variables \h'|\nau'47
        !          5018: 23. Controlling the Unbinding of Variables by \fIMatch\fR \h'|\nau'48
        !          5019: 24. Function Structures \h'|\nau'49
        !          5020: 25. More About the PEARL Top Level Loop and History Mechanism \h'|\nau'51
        !          5021: 26. Looping and Copying Functions \h'|\nau'54
        !          5022: 27. Miscellaneous Variations and Abbreviations \h'|\nau'55
        !          5023: 28. Low Level Access Functions \h'|\nau'57
        !          5024: 29. Appendix of UCI Lisp functions added to Franz PEARL \h'|\nau'58
        !          5025: 30. Appendix of Franz Lisp functions added to UCI Lisp PEARL \h'|\nau'62
        !          5026: 31. Bibliography \h'|\nau'63
        !          5027: 32. Index of Global Variables and Functions With Their Arguments \h'|\nau'64
        !          5028: 33. Concept Index \h'|\nau'71
        !          5029: .DE

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.