|
|
||
A MUSECopyright © January 1981, Richard Bartle, University of Essex.
IntroductionAimMUSE is an acronym standing for Multi-User Simulation of Environment. This document is the outline for a possible implementation of a suite of computer programs designed to create and manage a small (with respect to its tangible contents) "world", which users of the program can to some extent "enter" and "explore". This world could range in size from, say, a network of cities in which a travelling salesman could experiment on the efficiency of routes before embarking on them in practice, to the arterial system of the human body, where students of medicine could join the flow of blood and "visit" parts of the anatomy, in so doing learning more about the three-dimensional layout of human organs (and that you can't go backwards up veins!).Historical backgroundMUSE is a direct descendent of a line of games programs. Ever since computers became available, programmers have, in their idle moments (such as they are), toyed with the idea of using their machine for amusement. This usually involved playing against the computer in a two-sided battle of "wits", and may algorithms have been written to do just that, especially for the game of chess. In the early 1970s, a few programs appeared which did not, in essence, play against the user on the same basis. The first, and best-known, of these is the Advent [0] program. This was virtually hard-wired to simulate (not too well) a fantasy world, where an underground complex of rooms was explored by its players. The game, however, had three major drawbacks:
The first program in the world to attempt solving drawback (2) was Essex's MUD [3]. In effect, its attempts at the other drawbacks were less successful. It managed to introduce a primitive database language to define new worlds, but was still hard-wired as a game rather than something of more general use. It used too many methods of interacting between users to give complete safety for multi-user capability, and occasional deadlocks resulted. On drawback (3) it failed miserably, being able only to accept in effect only triples of verb, subject, object (which it applied like a function with 2 arguments). It used a simple pattern-matcher to read these in, in order that commands could be more easily interpreted from the database. However, MUSE nevertheless resembles MUD more than any other program, although it transcends the game-only aspect. Of course, games can be played if an appropriate database is presented and its users wish to treat it as one. The final program to which MUSE owes some debt is SPACE. This relation, however, is technical and concerned with the way inter-player communication is achieved. SPACE is not a program in the same field as the others - indeed it has no natural language interface - however I mention it for two reasons: firstly, it eradicated all the deadlock situations common in MUD; and secondly, I wrote it! MUSE is the first program of its type to have uses outside being a mere game, toy, or other source of entertainment. That is not to say that, given an adequate world to create, it would not amuse or enthral; it is just not expressly for that purpose. Some would argue that any machine which does something a human user had expected to be below its abilities has some entertainment value, and if novel and varied enough will retain that user's interest. I couldn't care less, since I'm not a psychologist... Limitations"MUSE is limited only by the imagination of the database designed" (Richard Bartle, making a sweeping generalisation). Well, OK if you're very lucky, but there are a few things you may want to do which MUSE finds totally beyond itself, or would be very difficult to express. Its major limitation is that it hasn't been written yet! Apart from limitations imposed by the computer upon which it would be implemented, MUSE has the following ways of dealing with the drawbacks cited earlier:
Natural language interfaceContext problemUnfortunately, many words in English have different meanings depending on whereabouts in the sentence they occur. Most simple natural-language interfaces conveniently ignore this (such as in MUD), and only allow words to have one context; other programs are hard-wired for special cases (eg. in Advent, N has the meanings of North and No). Even Zork has problems in this area, and most situations are worded so as not to prompt a response involving a tricky word. Unavoidable ones are hard-wired. However, MUSE reads its vocabulary from a database, and hence has no idea about when to assume one context for a word and when to assume another. It can take either the MUD way out, or attempt to parse trying the various meanings of words with dual sense. Note that if a word has different meanings in the same context, it can be handled much more easily by simply making alternative entries in the lexicon for that part of speech.MUSE, however, handles the problem by making a pre-parse scan of the input line, deciding in what context a word is more likely to be by the context of adjacent words. This, I estimate, would eliminate at least 95% of all errors due to puns. A 100% success rate could only be achieved by trying to parse a sentence taking each word in all its possible meanings in sequence until all combinations are tried. This is inadequate, however, since it involves too many parses, the simple case of, say, three words having different meanings (eg. nouns usable as adjectives, like "glass") would involve 8 parses! Another disadvantage is that the more obscure meaning may be encountered first, which would totally disrupt the environment if executed (eg. "make a Swiss roll"). MUSE's pre-parse scan uses the following algorithm: "Given that I am of the type suggested by the previous word, can I get to the end of the phrase by assuming the next word is of a type which normally follows a word of the type I think I am?" What happens is that an assumption about the type of the first word is made. If this word, when looked up in the lexicon, cannot be of this type then it passes back false and another assumption is made. If it can be of that type, it tries to finish the sentence by assuming the second word is of a particular type that can follow it. Eventually, the end of the sentence will (hopefully) be reached, and assuming the last word can be of the type suggested to it by the previous one, it will return true, and this will recurse out. This inductive form of context analysis has three main advantages:
Since this is not a very explicit description, there now follows an example
pre-parse function called
assume(ACTION, 1) .
The result of this bare-bones algorithm is merely an acceptor, since
it only returns true or false, but instead of Examples of use:
"block a big red pick-up"
"get the gold watch"
"kick the awful woman in the mink then in the shins" Unknown words: MUSE handles them as follows, guessing at their meanings. Say the word "?" is unknown in these examples:
"? the door"
"open the ?"
"open the door ? the keys"
"? ? ?"
Obviously, if the program doesn't understand a word it can ask for a
synonym, and restrict that synonym to the class it has found until it
knows better, but this results only in a quaint feature of being able to
give things nicknames in practice, since most errors will be misspellings...
Whatever happens, the program should not admit that a word is
unknown to it; I find nothing more infuriating than being told "I
don't know the meaning of the word :s", where :s is the offender.
What if it were "know"? Then, the program would say it
doesn't know the meaning of a word it has just used! This annoying feature
harks back to the days of Advent.
The program can also be made capable of trying "intelligent"
guesses: if it finds a word it doesn't have an entry for, and that word
ends in "s", it should be able to strip off the "s" and
see if it can find a word with the remaining letters. Other guesses, such
as "-ing" words, can also be built in.
In practice, the above small grammar is inadequate (although it still beats
MUD and Advent!), and several more parts of
speech are incorporated, including two types of adverb (or METHODs). These
relate to whereabouts in a sentence they can appear: "quickly go
west" means an adverb can be followed by a verb; "go west
quickly" means adverb can follow adverb can follow verb, in which case
"go west quickly go" is a valid interpretation, whereas it is
nonsense. It is tempting to leave the problem unresolved, since if it's
nonsense perhaps no-one will say it... Unfortunately, the nonsense might
be picked out if one of the words is unknown, and then the parser won't be
able to handle it.
An observation to make is that the grammar specified by the
Phrases attempted are to be sorted into one or more of the following
slots for their constituent parts: action, subject, active object,
passive object. It takes into account qualifiers to determine whether an
object is active ("him him with the spanner") or
passive ("hit him in the stomach"), or whether it is in
fact the subject ("hit him"). The object and subject
lots are lists of all the possible objects which fill the category, since
these are looked up in the parser, their meaning depending on the
existence or not of other objects to fit previous interpretations. These
descriptions are provided by the user, and are lifted directly from the
lexicon.
Adverbs in a sentence are treated as augmentations to the verb. Thus, for
example, "get up" can be interpreted as "arise",
"go quickly" as "run". Paraphrasing in this
manner can also impress the user (!), eg. getting the reply "you
cannot run in that direction" for the above! The ability to paraphrase
is, however, not an essential part of the program, unlike Schanks's
various programs to paraphrase violent encounters between children...
The parser will also bind together nouns and qualifying nouns such as
"the horse with the tail", provided it can discover somewhere an
example of a horse with a tail, and return merely the horse as the item since
the tail information is only relevant to pinning down horses with tails
rather than those unfortunate creatures bereft of the adornment. This,
however, can get complicated, for example take the sentence (phrase)
"the farmer with the daughter with the kittens with the tails and the
wife with the ginger hair". The program will look for a man, see if
he has a daughter, see if she has kittens, see if the kittens have tails,
see if the kittens have wives (fail), see if the daughter has a wife
(fail), see if the farmer has a wife, see if she has ginger hair (fail)
and finally see if the farmer has ginger hair. Assuming their exists such a
family, it would return only the farmer as the result. If he had no
wife, it would look for anyone's wife, see if she has ginger hair, then
return both. If there is not such family, and no wives have ginger hair,
the parser will return an empty list in case the verb doesn't need a
subject or whatever noun group the words were supposed to fill.
This can result in some ambiguities, such as "the cat and the dog with
fur" might be trying to exclude bald dogs, or bald cats and dogs
(this problem also arises with the ginger hair trailer in the previous
example). Another example, such as "hit the man in the box", is
more, er, "striking": if the parser can find a man in a box, it
will return him as the subject; if not, but it can find a man and a box, it
will return "man" as the subject, "box" as the
(passive) object. The philosophy of this is that the more specific case is
the more unlikely, so that if it fails then the other meaning can be
chosen. However, if the specific meaning makes sense (the man could be
wearing a cricketer's box - ouch!) then it is so unlikely that
the user would put in something making sense (ie. having something which
satisfies the description) that he must mean it. This may seem ad hoc, but
any more thoughtful algorithm would still likely pick the same solution
eventually, since it's true!
Hence, the parser binds as early as possible, which also has the effect of
cutting down objects in number and thus making thins easier when it comes
to "understanding". Of course, it has to backtrack to some extent
if it finds an empty list for a noun group, but few people are going to be
as verbose as I in the fabricated examples above (I hope!). Maybe if it were
given to people learning English..?
However, given a syntactic definition of English, users of the program
have the option to define the words they need and the (operational)
semantics of the subset. If only a general system is needed without the
full power of the MUSE parser, words like "the",
"a" and "an" can be ignored as noise words
(as in the examples earlier). More complex lexicons can be constructed
involving greater meaning, as the need arises - it is simpler to update
a database with small bits added than to put it all in at once!
The way the execution part of the interface works is to look up the verb in
the lexicon and pull out a template for a sentence involving it. Associated
with each verb will be a string of such templates, and each will be tried
until one fits. If none fit, a set of default templates are taken, whereby
the database admits it is confused and could you rephrase please thanks.
But a "fit", it is meant that all those fields present in the
template are present in the phrase to be "executed". It does
not matter if there are more fields present in the phrase than in the
template - for example kill person as a template provided with
kill person sword as verb, subject and (active) object, would
count as a match, it being irrelevant as far as the semantics are concerned
what you use to kill people. It doesn't even check if you're
carrying a sword!
The basic layout of a template can be thought of as follows:
The <instr> part of the template is the most interesting, for
it is here that the crux of the interface lies ("instr" is short
for "instructions", if you hadn't guessed...). MUSE is
said to "understand" something if, when supplied with an
imperative command or question, it obeys the command in such a way as the
user would consider it possible within the environment (assuming the
database writer has done his stuff!). This "obeying" is made
by application of a sequence of functions to the database (among other
things), and which are made available to the database author(ess). The
syntax of the <instr> is as follows:
The function FN is an internal ability of MUSE to do
something, usually change the property of an object. FNs have a set
number of arguments depending on what they do, but the arguments are usually
the object(s) or subject(s) of the sentence. If the FN evaluates
to true. the left <instr> is taken; if false, the right. Some
FNs, eg. "change prompt", only ever return true (or
false), and hence the other <instr> may be omitted. There is no
"dangling else" problem, since MUSE knows how many
branches a FN is supposed to have.
The <number> represents the leaf of an <instr>
tree, and refers to a message to be printed out. If more than one message
is to be printed, a function like print could be used, taking as
its argument a number of a message. Once a leaf is reached, execution of this
verb is halted, and the next phrase is looked at (or asked for!).
Finally, the FAIL is also a leaf to the tree, but whereas the
<number> stops execution, the fail aborts and
tries the next template. This could be important, for example with
puns. It does not help the "is IN a verb?" problem much apart from
checking parameters and discerning IN has one when it shouldn't, so apologising;
by the time the template is checked, the decision as to IN's type has
already been taken. Note that when the abortion (escaper) takes place, other
functions may already have been executed.
So,me words have the same meaning as other words, or partially the same
meaning. "Drop teacup" is identical to "drop <anything>"
except that a check has to be made to see if the cup breaks. Another
example is some object which could roll away when dropped. The "drop"
function will most likely be very complex, checking all sorts of things,
such as whether the "room" is halfway up a cliff, whether
people can hear it, etc.. To avoid repeating large chunks of the
template, <instr>s can be labelled, and the label can be placed
instead of any other <instr>. Note that there is no forward
reference possible here, since the database is one-pass, and no words in
English have a meaning which is recursive (except the word "recursive"...).
Although MUD's database was one-pass, it did not allow
labelling of templates since they were not nested functionally anyway.
This annoyed those of us who had to program in it!
Certain of the functions will be concerned with sending packets of
information to other players. There is also a section concerned with
receiving packets of information, which the program checks every half-second
or so. If messages have been sent, they are dealt with in order of
reception.
Since packet-sending needs three arguments (destination, information, packet
type), and since they never return false (although the non-existence of
their destination could be construed as such), to recap, a packet template
looks as follows:
The receive checking function would take messages from the user's queue,
then switch on the type into a vector of templates, using the type as a
sort of deterministic guard. The format of the
guarded command is similar to that of a function template, although
working by type field. When a leaf is reached, the message block
is "freed" for use again. Sometimes the INFO field
is unnecessary, and can be left as null.
A crude example of this in action is the following simple implementation of
a fight verb. A template for fight could be made as
follows (<instr>s in brackets to ease reading):
What happens is this: say Polly wants to fight Bert. FIGHT BERT is parsed,
and the template is found. If Bert is not in the room, Polly can't fight
him so she gets message 1 typed out, "Bert isn't here.". If
no message is typed, Bert gets an IWFU packet sent to him. Polly
goes about her business, but in reality the fact that she were fighting
would be "recorded" so she couldn't leave the room. By the
time Bert gets the packet, he might have left, so if Polly isn't there he
sends back a packet telling Polly to print message 5, ie. he's
escaped. If he hasn't, the fight is on, so he gets a random number between
0 and 1: if 0 he hits, 1 he misses, and the relevant information is printed.
Polly gets his packet, decrements her "lives" count, and if she had
any to decrement repeats Bert's actions. If she hadn't, she is deaded, and
tells Bert he won. The battle will continue until one of them has no lives
left and gets hit.
Obviously the example is over-simplified. What if Brian comes in and starts
fighting Bert? What happens when you die? What if Bert leaves the
simulation before checking his message queue? What if you fight yourself?
However, it does give a flavour of the way the meanings of commands are used
in practice in the MUSE system, if defined within the
database properly.
The database will normally be small enough to be loaded into MUSE
by a database-loader sister program (how many muses were there? 9?). As has
been explained, this can be done in a single pass, since what forward
references there are can be dealt with quite simply. Furthermore, all
objects are static in size and number (although this disallowed the
possibility of objects containing themselves - possible in Dr Who's
TARDIS!).
The vocabulary section of the database consists of words followed by
definitions, grouped by parts of speech for convenience of not having to
use the same prefix every time, eg. action or object or
whatever. In here, actions will be assigned their templates, adverbs will
be told which verbs they augment and to what, and objects will be given
descriptions. Certain verbs will be very often used, such as
"get" or "look", and it is hoped that a
library of such words could be included in any
MUSE package if one was
ever written.
An example of this is, say, a door. It is sensible to have only two
properties, open and closed. The description messages for each object
instance would be relevant to whatever state it was in. Closing the
door might INCrement its property, opening might DECrement. It would
have a maximum property of 1, so an INC on 1 would fail; it would have a
minimum of 0, so a DEC would fail. Since the object is a link, its position
record would be for two rooms as it can be seen in both, but this record
will be shared by both instances of the door. The door idea is only for a
simple object, but most will be even less complex than that! Decorative
objects need have nothing but position and description!
In the parser, classes are treated like the nouns they are, but when
mentioned a list of their object is taken and added to the object or
subject list. Objects are never mentioned by name by the user, but their
print-name could be the same as a primitive class of which it is the only
member, say. Fortunately, treating things as classes gets over nouns
with the same meaning, if a check is made when actions are applied. For
example, a "fence" can be a wooden barrier or a receiver of
stolen goods. Saying "erect fence" ... hmm ... "build
fence" would pull out the class of objects which were fences in the
barrier sense, and those in the illegal sense. The verb "build"
would have a template checking its subject was of class "wooden",
and if not would fail so we'd get on to the rest of the list, where the
correct fence would be discovered. If there were only the criminal type of
fence, it would abort and the next template tried.
Zork introduced the concept of containers - objects
which can have other objects inside them - although this was not
exploited to its full potential. In MUSE, rooms are merely
the outermost containers, although in a sense there is a single, overall
container for the whole world.
Properties of containers: their weights are the sum of their own weights
plus those of their contents (MUSE's get verb
template would check this, as would the give verb); containers
can contain other containers, but never themselves (in a normal world);
users entering a container using the move verb should have
look called so they can get a description. Note that this is a
function of the verb, unlike in MUD, Zork and
Adventure where it is a function of the room. In describing
the container, its internal description should be printed, along with the
external descriptions of other objects also within it. A brief verb
could trigger short descriptions rather than long ones.
If a user is "inside" an object, they cannot pick it up, drop
it, or move it (unless it is special, like a vehicle). If outside, they
can. However, this will merely change the object's position so that leaving
it puts you elsewhere; it will not alter any links to other objects, for
example those which may be interpreted as directions by move. These
links are also unaffected by other actions, such as shout or
drop. A large section of the database will usually be devoted to
covering special cases of the move verb, equivalent to a
travel-table, for example IFIN KITCHEN D M, where D
labels the die verb (you walked into an oven), and M is
the movement (you went elsewhere). This can get quite complicated,
especially if there are many objects which can block passage and have to
be tested.
Searching down links for gravitational bias is easy enough (provided some
berk hasn't got his connections wrong), especially if there is a
function, say findlast, to do it. Additional complexity is in
evidence if, say, an object is dropped from a height, since presumably
it will make a noise originating in the room in which it lands, and
spreading depending on its weight, structure, material, and how far it got
dropped. This form of transport is also instantaneous, whereas in
reality it takes a few seconds to plummet over a cliff. Also the
object might make a noise in each room it enters, eg. it's a transistor
radio. A timer
It is apparent that certain verbs can be quite complex, since their
"meaning" depends on whereabouts in the environment they are
used, and the state of that environment. Many special cases have to be
handled separately, but the essential part will be the same.
MUD handled this by in effect predeclaring words like
talk, get, move, drop, look
and fight so that the database was uncluttered (apart from that,
there was no way by which the writers of the database could declare them!).
I am of the opinion that certain macros like this should be available
within the MUSE system, inbuilt, provided that the
primitive functions to build them are also available so as not to lose
generality. This library idea was mentioned earlier.
In MUD, what database functions it had could be used in
conjunction with these special functions such as shout. The
comparison can be made between, say, printing out a number the hard way
in machine code, or having a monitor call to do it. It's just a
combination of primitive instructions, but it's common enough to be used in
one fell swoop.
There will be slots in an object record which may be defined by the
database author(ess). These could range from things like "height"
or "age" to "frustration" (in a maze!) or
"aliveness" (in a gladiatorial arena). Most objects might have a
"value" or "score". People can act as containers for
certain classes of objects (water, potatoes, beer) but they cannot hold
other classes (raccoons, anchors, lecture notes). They can communicate with
each other, and do nasty things to one another. It is arguable as to whether
all persons should be of the same overall class or not upon entry to the
simulation, and if not, how to decide? Who should be a Confederate, who a
Union general? Who a red corpuscle, who a white? Who a god, who a walnut?
even such innocent cases such as the person's sex may be difficult to
determine without asking. Thus, a prologue of questions should be asked,
creating a file for the object which that person is to assume when in
the environment, and based on the persona descriptor in the database.
When MUSE starts up it can then find out all about the person
(like whereabouts they start!). The questionnaire program can be divorced
from MUSE, like the database loader. MUD asked for
name and sex, and made the rest up, dumping a <name>.mud
file for later re-entry into the environment.
Problems arise for objects simulating persons (OSPs). When a user
encounters one, it should act as best it can like a "real"
person, and not be immediately obvious as to whether or not it is a user or
just a clockwork dummy. It should at least put up a good show!
Typically, the players will ask questions, and attempt to determine from
the reply the nature of the being. The OSP should be able to move, like a
person (or at least "appear" in a room in which it hasn't
always been, as if it had just entered). Better still, it could
initiate conversation - very unmachinelike!
On the face of it, making the OSP react properly to the user's question
(put in quotes so MUSE doesn't take it as a command to itself)
involves an entire re-parse so as to elicit an adequate response.
However, to avoid this and the difficulty of having to write down all the
<instr>s, a simple keyword trigger is used instead, eg.
ifsaid hello 28 29, where 28 might be
"Hello.", 29 "Go away, I'm busy.".
Obviously, after a few minutes' conversation an OSP will run out of things to
say (as in Eliza) [5], and
early keyword-recognising program). This is not to say that the wily user
cannot pretend to be an OSP, but that it is dependent upon what the
simulation is to be used for (training spies?). An anecdote along this
theme comes from MUD, where two new players were wandering
around, met, and started talking. Apparently, one had been chased by a
wizard, told to stop running around, and was killed. The other suggested
that the wizard was a dungeon-generated character... In fact, MUD
has no characters of this nature, nor is it likely to!
Other features of objects in the database are also possible, of course; all
the slots will be the same for each property incarnation of an object, ie.
more structure sharing, but, in cases where this is not wanted, action
templates would check. For example, a slot for "luminous" would
be ignored if the object was a lamp in property "off" (or, with
my luck, "out of batteries"). This is similar for extra slots for
people (depending on whether they are alive, awake or dreaming...).
Of the programs mentioned earlier, Eliza was written in LISP,
Advent in ForTran, Zork in Planner/LISP/Macro
(I think!), MUD in BCPL/Macro and SPACE in
Macro. The multi-user aspect of MUSE makes some Macro
essential for systems of locks when communicating between processes.
The interpretive aspects would certainly point to the database loader
being written in a systems programming language (Bliss, BCPL, C). The
parser and
I have decided that probably the best language in which to write
MUSE would be BCPL, with Macro drop-down for the fiddly bits.
However, Ada could be better since it has the ability to send packets
between processes already, although its code is not as fast as BCPL's.
I haven't enough information to choose Ada, however, at this stage. BCPL
was chosen over the old AI favourite, LISP, for the following reasons:
The other languages considered which stood any real chance of being used
were Macro (too tedious), Pascal (too small, too constricting, too slow),
Algol68 (too complicated!) and Simula67 (like Pascal only with extra bits
that aren't used). Languages with which I am not familiar but which could
be better include Bliss, C and Prolog.
The next question is whether to treat the users synchronously or
asynchronously. In SPACE, the critical section of code was
treated like a hot potato, in that you got rid of it as soon as you could
and gave it to someone else! In MUD, access is asynchronous,
and if a job is aborted (usually by resource control...) the game is not
held up. People have to "tidy up" as they leave normally, so
packets sent will always arrive since the message queue is dealt with
finally after the user is "removed" from the simulation. This
gets rid of a full-scale garbage collect due to packets being left in
unusable letter-boxes, especially if people check queues for previous
owners of their game-slot (well, simulation slot in MUSE)
when they enter it.
MUSE will use a combination of ideas for communication from
MUD and SPACE. It will use MUD's
ideas for parallelism, but SPACE's of having one high-segment
lock (thus avoiding MUD's occasional deadlock). To run
synchronously means a total determinacy is possible, but the idea of
everyone having to wait while each other's messages were printed is
enough to sway me (a considerable way!) in the other direction! IPCF packages
mean asynchronousness is a certainty, incidentally, unless
turned off (in which case they are never received!).
Most interpreters allow run-time debugging systems to work directly on the
parse tree. MUSE's representation of the environment is a
threaded, intertwining, directed graph, and unfortunately the techniques
used in debugging tools tend to be what MUSE is supposed to
do anyway (!), ie. descending levels within the program and
one-stepping execution.
A debugger must be written in such a way as to have virtually no effect
efficiency-wise (it's no use debugging a program if the program can only
be half the size of the debugger...). Zork has
GDT - Game Debugging Tool - which can be used swiftly to move to
part of a world and pick things up etc.. Since MUSE is
dedicated to use on the DEC-10 timesharing system, perhaps a DDT
rewrite could be used here, too? MUD got over the problem
by having a "Wizard Mode", whereby players are suddenly attributed
amazing god-like powers, and normal mortals are incredibly disadvantaged.
Wizards are able to fly off anywhere, meaning that to test new sections of
the database you don't have to go there on foot (in MUD,
players always start at the same place). Unfortunately, in the case of
MUD, wizard mode was more fun than normal play, and the password
to it became a cherished thing! (At the moment it is "SEER", by the
way).
Debugging multi-process interaction can be hell, however! Due to the very
non-deterministic aspect for which the game of MUD was written
proved standard techniques to be inadequate. Even now there is the
occasional look of dread on players' faces as all of a sudden they find
nothing on their screens as another undiscovered deadlock rears its ugly
head...
If the user wishes to debug his or her database, then provided they have
sufficient confidence in MUSE's packet sending, they will have to
take it as read that the system will not deadlock! There are two options for
debugging, neither of which is much use for various reasons. The first is to
make MUSE have some DDT-like option, and the second
is to make the writer of the database put in their own options.
Regrettably, I think the second option is the lesser of the two evils,
because it will at least allow some proper control on the database
author's part. Of course, it is still available under the other system,
but encouraging its use will make the database writer forced to use a
more structured way of describing the environment, although it could well
go over the top and introduce another version of wizard mode. I am wide open
for any sweet-talking trickster with any new ideas to suggest them to me!
Fortunately, the overriding influence in the design of a compiler is the
language which it is supposed to compile. The database language of
MUSE is simple, non-recursive, and needs little if any
optimisation. This makes things nice and easy on the loader, and all can be
done in a single pass, as has been mentioned earlier. The only errors likely
to be made are syntactic, and thus a comprehensive error message can be
given. Semantic errors appear at run-time, and thus don't affect the loader
unless there is a
MUD's database loader worked on MUD
Definition Language (MUDDLE), but had the most
appalling error detection considering as how MUDDLE was so one-dimensional
and simple. It aborted on the first error, rather than trying to
find as many as possible in the program to save the writer debugging
time! The messages themselves are horribly unhelpful, often ambiguous,
and usually print out no name of even the word at which the error
occurred. In the odd attempts it made to do this, it invariably came up
with a load of garbage instead of proper characters. It is hoped that
MUSE would be much more professional in its approach (it
couldn't be worse!), rather than saying things like MUD's
"Cannot read room name" or "Unknown function S$^BA2T"...
Depending upon the definition of an environment, many novel uses can be
found. Treating it like a tree, a chemistry student could be asked at each
quot;room" what to do (although it wouldn't be described as a room):
if they make a correct choice, then a description of how the experiment
progresses (to the next room) would be given; a wrong decision and they
could go to the "blown to kingdom come" room, with a message
saying what their mistake was. This is just a minor use to
demonstrate flexibility - the above program could be written in BASIC
(ouch, did I say "program"?).
However, the first project to which MUSE would be applied would
be a simple map, probably of the Computing Centre. After that, a full-scale
environment such as a game would be tried (that way there would be no
shortage of people to debug it!). Industrial uses? Well they could have it
if they had a computer upon which it would run. The military would have to
buy it (but wouldn't be interested anyway because it wouldn't be in Ada).
Another system of the same genre as MUSE is the
PIGG project, also at Essex
University, and in about the same stage of development as
MUSE. This system uses a much more fluid arrangement as far
as descriptions go than MUSE, in that the program actually
attempts to work them out from other objects/rooms. Thus, upon entry to a
room, the program would scan around and describe its contents, entrances
and exits, and any rooms which are transparent and can be seen through into
rooms adjacent to them. Difficulties arise when at, say, the top of a
hill, and everything for miles can be seen: you do not wish to be told
there is a living room and a study and a bedroom in front of a garden,
you wish to be told there is a house! When to use what classes as
description is a horrible problem!
Whilst PIGG is of more descriptive power than MUSE,
the two are essentially for different uses; MUSE is for a
pre-defined environment, and hence its descriptions are more
detailed. PIGG is to some extent able to create its own
environments, within parameters set by its database (which consists of
Macro code the program needs to read into itself!). MUSE is
for those who want a static but detailed world, PIGG for the
dynamic but expressionless world. PIGG is for the active,
MUSE the passive! MUSE's obsession with
"understanding" is PIGG's with "describing".
The programs do overlap, but not conflictingly. This design choice is
deliberate, since understanding by obeying and understanding by telling are
disjoint in their approach (well, result) to the problem. Specificness in
databases has the disadvantage in that users can say more complex things, so
you need a better parser! You can't win!
(Hmm, I don't think that last paragraph made sense...).
MUSE has a problem as to whether or not its multi-user aspect is
in fact needed! The code needed to handle this takes up space which the
database could use for expansion. What's the point of multi-userness (?) if
the number of mainframe computers capable of running timesharing decreases as
micro- and mini-computers come into use? Since MUSE will most
likely be dedicated to the DEC-10, this last question can be brushed under
the carpet... Nevertheless, I am of the opinion that multi-user is better
than single-user since in real environments you rarely have just one
person! This is a bit sweeping, obviously, but if MUSE can help
people to co-operate then at least it will have achieved something. Also,
learning by discovery and by being shown is made simple, in fact
MUSE tends to steer its database writers to try this due to
its entire section for packet reception...
It is also possible that certain problems can be made such that they can
only be solved if people co-operate. The classic example is the
see-saw problem:
___
This consists of a door leading to a plank with a pile of treasure at
each end. The plank is pivoted, and if it doesn't balance then there is a
long drop for whatever is on it. The idea is that the treasure is worth
having, so when two people come in through the door they both have to walk
along the plank and come back, otherwise a nasty fall down a bottomless
pit results. Most people would figure it out and co-operate, however there
is a twist in the tail: what if there were only one treasure trough?
Another dubious position taken by MUSE is that of not allowing
objects to be in different states simultaneously. If a room is entered from
one direction, its description should be given from that direction's
perspective, ie. using left and right. the natural way to o this is to have
different properties existing simultaneously dependent upon which way you go
in. MUSE will tend to give some extra information, such as
"there is a door in the north wall", which you know because you
just used it! This makes the database writer virtually forced to use
compass points for directions, so it is very difficult to get someone lost!
However, despite their being ways round this, the additional tedium to a
database writer of having to describe a room 3 or 4 times virtually
identically overwhelms this minor advantage! The PIGG style
system scores well here, though, since it does the descriptions itself from
its internal representation.
Unlike other systems, a small world needs only a small database.
SHRDLU's blocks had a pathetically low number of objects;
MUSE places less emphasis on understanding input since it's
not much use understanding all given to you if you can't do it (like being
paralysed from the throat down). In essence, MUSE doesn't
care how it is told to do something: if it can figure out the essentials
of what is said, it'll do it. Ignoring or guessing at the meaning of
spurious, obsolete, unknown or mis-spelled words is OK, since if it does
find a matching template for part of the sentence, the chances are that the
lost information will only be qualifying the verb or an object and that
the correct match was chosen anyway. Thus, the parser is insensitive to
slight perturbations in phrasing, rather than the extreme pedantic attitude
taken by MUD and ADVENT.
Were it written, MUSE would achieve a deeper insight into the
whole idea of people interacting with machines, and would allow people to
"go" to places in theory rather than physically. Of course, there
are variations such as drawing rooms or giving photographic displays,
but this is a bit like looking before leaping... What can be said,
however, is that MUSE would break new ground in education,
design, and to some measure communication. Frankly, I wouldn't care if it
had absolutely no uses, the idea of designing a world of my own and being
able to enter it intrigues me deeply!
However, MUSE has not yet been written. As I said at
the beginning, this document is an outline for how it would be. It describes
the main points, but glosses over the nitty-gritty of the thing (I have,
for example, deliberately refrained from describing what object records
look like). What I hope to have shown is the three phases of the parser,
to show how communication is described, and how the loader and
introduction programs assist the main interpreter. If MUSE gets
no further from the drawing board, at least it will have achieved the
admirable feature of making me think! Still, we shall have to see, won't
we..?
Richard Bartle
[1] Dungeons and Dragons,
Gary Gygax and Dave Arneson, ~1970.
[2] Zork,
Timothy A. Anderson, ~1977.
[3] SPACE,
Richard Bartle, January 1980.
[4] MUD (Multi-User
Dungeon), Roy Trubshaw. October 1979 (MACRO), March 1980 (BCPL).
[5] Eliza,
Joseph Weisembaum, January 1965.
[6] PIGG,
Stephen Murrell, July 1980.
[7] SHRDLU,
Terry Winograd, 1971. |
|||
Copyright © 16th June 1999: muse.htm |