A Tutorial For Adding Knowledge To Your Robot

Download as pdf or txt
Download as pdf or txt
You are on page 1of 24

ATutorialForAddingKnowledgetoYourRobot

CopyrightbyDoublyAimless([email protected])May,2004Revision7.
AdditionaleditingbySeijiUmatani([email protected]).

TableofContents

Introduction
AWebofKnowledge
Howabout<that>?
Whatabout<topic>?
MakingKnowledgeContentChanges(BotProperties)
Somanywaystowritethesamething...Whatis<srai>?
HowaboutInternationalLanguages?
HowcanIdisplayPhotographsandotherImages?
HowtoJazzUpyourRobotwithHTMLSkins
Notes
Appendix
Glossary
References

Introduction

Thisisabrieftutorialdescribinghowyoucancreateandaddknowledgetoyourrobot.A
successfulrobotwillgiveresponsesthatappeartobecomingfromahuman.Yourgoalasthe
botmasterisverysimple:

"Buildcontentthatinducesthevisitortocarryonconversationswithyourrobotforaslongas
possible!"

Youdothisbycreatingavarietyofpotentialanswerstovariousquestions,orredirectinga
conversationtonewtopicsthattheclientfindsinterestingalwayswiththegoalofcontinuing
theinteractionsaslongaspossible.

Examplesofsuchrobotscanbefoundatthelinksbelow:

TheAnnualLoebnerContest:
www.loebner.net/Prizef/loebnerprize.html

MostPopularPandorabots:
www.pandorabots.com/botmaster/en/mostactive

DivaBotBeautyPageant:
http://www.internationallispconference.org/2002/Competitions/Chatterbots/ILC02
chatterbots.html

Pandorabotsallowsyoutoextendtheknowledgeofyourrobotviaaprogramminglanguage
calledAIML.ThegoalofthistutorialistoteachyoutheminimumofAIMLnecessarytomake
yourrobot"smarter"andbetterabletocarryonarealisticconversation.

ThisTutorialisadraftandunfortunatelyhaserrorsandomissions.Betterversionswillbe
forthcoming.Someofyouwillarguethatitwouldhavebeenbettertopostponepublication
yetthecryforsomekindofdocumentationwasjusttoomuch.Pleaseacceptmyapologies
forthisdraft'sroughness.PleasemailcommentsandproblemstotheattentionofDr.Doubly
[email protected].

Moredetailsontheinformationinthistutorialcanbefoundinthereferenceslistedattheend.
Inparticular,thelatestversionoftheAIMLspecificationcontainsmanyofthedetailsomitted
inthisdocument.
Therobotsdiscussedinthisdocument,andonwww.pandorabots.com,arebasedonAIML
andspringentirelyfromtheworkofDr.RichardWallaceandtheA.L.I.C.E.andAIMLfree
softwarecommunitybasedathttp://www.alicebot.org.

AWebofKnowledge

Someofyoumightfindthismetaphorhelpfulforvisualizinghowknowledgeislaidoutinyour
robot.Imagineaspiderwebithasacenterwithspokesradiatingoutwardsfromthecenter.
Yourrobot'sknowledgeisstoredinaKnowledgeWeb,andlikethespider,yourrobotdarts
outinresponsetosomesortoftugitsensesintheweb.Understandinghowtostore
knowledgeisourfirsttask.Becauseitistoohardtodrawthewholeweb,intheexamples
thatfollow,onlyaportionofthewebwillbeshownsopleaseuseyourimaginationforthe
rest.

Startingatwww.pandorabots.com,ifyouhavenotalreadydoneso,createanaccountand
onceloggedin,createarobotbyclickingonCreateaPandorabot(it'satthetopofthe
screen).Onthenextscreen,nameyournewrobot,Full(forfullofknowledge)andmakesure
theradiobuttonlabeled,"DrWallace'sA.L.I.C.EMarch2002"isselected(see[1]).After
clickingonCreatePandorabottocreateyournewrobotthenextscreenwillshow:

"Thispandorabotisnotpublished.Whenyouareready,youcanpublishyour
pandorabottomakeitavailableforotherstochatwith.Youmayfirstwantto
customizeyourpandorabotbychangingsomeofitspropertiesorbyprovidingyour
owncustomresponseswiththetraininginterface."

ClickontheTrainlinkonthesecondrowofmenubuttonstobegininteractionswithyour
robot.Thisrobotalreadyhasasubstantialknowledgebase(taughtbyDr.RichardWallace)so
let'sstartbyposingthequestion:

Human:Doyouloveme?
Full:YesIloveeveryone.

Toaskthisquestion,typein"Doyouloveme?"inthetextfieldlabeledHuman:andthen
pressEnterorclickontheAskbuttontotherightofthetextbox.

Therobotknewinadvancehowtoanswerthisquestion.Howspecificallydidtherobot
discovertheanswer?Firsttherobotcheckedifitsknowledgealreadycontainedthequestion
"Doyouloveme?"Andsecond,findingit,checkedtoseeifithadbeentaughttorespondwith
somethingmeaningful.

Categories

Thewordsinthesentence"Doyouloveme?"canbevisualizedbyaseriesoflines(orlinks)
andnodes,intheknowledgeweb.ThisisillustratedbelowinPicture1.0.Thelinksarelabeled
bythewords(youcanthinkofthenodesasrepresentingthespacesbetweenthewords)and
formachainstartingfromthecenterofthewebandmovingoutwards.
FindingthequestionintheKnowledgeWeb,therobotreplieswiththeinformationwetaughtit
(residinginaResponseTemplateandreferredtoasthetemplate).So,inotherwords,the
specificquestion"Doyouloveme"canbevisualizedasakindofpathbeginningatthe
centeroftheKnowledgeWebandbuiltupbyaseriesoflinksandnodes,andthatfinally
terminatesinaResponseTemplate.

ThespecificpaththroughtheKnowledgeWebalongwiththe(Response)Templateiscalleda
category.If,forexample,youteachtherobottorespondwith:"yes,butonlywhenyouare
good"youonlychangetheResponseTemplate.

MoreaboutCategories

Let'sstartoverwitharobotthathasnoknowledge.Createanewrobotexactlyasbefore
exceptthatthistime,nametherobotEmptyandselecttheradiobuttonlabeled,"Noinitial
content,thepandorabotstartswithnoknowledge".Again,oncetherobotiscreated,
clickonTraintostartinteractingwithit.

Initially,Picture1.1showsEmpty'sverysimpleKnowledgeWeb.OneCategoryisshownand
noticetheResponseTemplatecontainstheonesentence"Ihavenoanswerforthat".Youwill
alsonotice*,<that>and<topic>labelingthelinksbetweenthenodes.Thelabels*,
<that>and<topic>arespecialoptionalvariantsofferingenhancementstoCategories.Aswe
shallsee,thesespeciallabelsextendthematchingpoweroftheCategories.

SowhatdoesthisoneCategorydo?Tobeginwiththe*labelallowsanyinteractionwith
Emptytoreturnthesameresponse:

Human:Hello
Empty:Ihavenoanswerforthat
Human:abc
Empty:Ihavenoanswerforthat
Moregenerally,wordsorsentencesprovidedtotherobotarecalledtheInputPattern.You
canvisualizeanysentenceexistingintheKnowledgeWebasapathoflinkednodes,
terminatingwithaResponseTemplate.Therobotsearchesforapathoflinkednodesthat
exactlymatchestheInputPattern.Whenapathisfound,wesaythatthepathmatchesthe
InputPattern.

DefaultResponses

IthappensoftenthatanInputPatternwillnotbefoundintheKnowledgeWebyetwestill
wanttherobottorespondwithsomethingmeaningful.WecallthistheDefaultResponse
Templateandittypicallyconsistsofsentencesdesignedtokeeptheconversationgoing.
WecanvisualizetheDefaultCategory(apathemptyofallwordsandit'sResponseTemplate)
byPicture1.1(picturedabove).The*willmatchanywords.The<that>and<topic>willbe
explainedlater.

Inordertoteachyourrobottosay"Hithere!"inresponseto"Hello",dothefollowing:

1.Makesureyou'reontherobot'sTrainingpage(ifnotclickonTrain)
2.Typein"Hello"intheboxlabeledHuman:.
3.ClickonAsk(orpressEnter)
4.Aftertherobotresponds,typein"Hithere!"intheboxlabledEmpty:
5.ClickonSayInstead(orpressEnter)
6.Verifyyourchangebyclickingon(thefirst)AskAgainbutton.

NowtheKnowledgeWeblookslikePicture1.2

Therobothasjusttworesponsesnowandisincapableofsupportingitssideofan
interestingconversation.Let'smakesomemorechanges.Inresponsetoyoutypinganything
butHello(theoneinputpatternthatEmptynowknowsabout)Emptywillrandomlypresent
youwiththreepossibleresponses.Type:

Human:hi
Empty:Ihavenoanswerforthat

Next,clickonAdvancedAlterResponseandintheboxinthepatterncolumn,replaceHI
with*,whichmeansthatanythingyoutypeinwillbematchedwitharesponse.Nowlet'sadd
threerandompossibleresponses.Intheboxlabeledtemplateadd:
<random>
<li>Whatisyourname?</li>
<li>Whatisyourfavoritemovie?</li>
<li>Willyoubuymeadrink?</li>
</random>
andclickontheSubmitbutton(atthebottomleftofthepage).Foranexplanationofthe
syntaxusedabovesee[2].

TheKnowledgeWebnowlookslikePicture1.3.

We'vechangedtheDefaultCategorybychangingtheDefaultResponseTemplatefrom"Ihave
noanswertothat"tooneofthreerandomlychosenresponses.

Likeahapless,butprecociouschildfailingtounderstandwhatisbeingsaid,yetunwillingto
beabandoned,Emptyattemptstoprolongtheconversationbyofferingachoiceofthree
"pickup"lineshopingtochangethesubject.Emptyprofferspickuplinesrandomlyhopingto
disguisehowlittleitactuallyknows.Checkthisyourselfbytypinganythingbut"Hello".

ClickontheAskThisAgainbuttonenoughtimestocyclethroughallofthepickuplines.

SavingyourWorkandStartingOver

Forreasonsyou'llseelater,mostofthetimeyou'llwanttoavoidchangingtheUltimate
DefaultCategory.Let'sgobacktothebeginningandstartover,andsimultaneouslylearn
howtosavefiles.

ToviewtheAIMLfilesforaparticularrobot,clickontheAIMLlink(thisisnearthetopofthe
screen,onthesecondrowoflinks).Ifyoudon'tseethislinkbutinsteadseeatableofall
yourrobots,you'llfirstneedtoclickonthenameoftherobotEmptyinthiscase.

Scrolldownuntilyouseeasectionlikethis:

Filename Browse Download Library Active Delete


update.aiml Browse Download (local)

Belowthefirstheading,Filenameyou'llseeafilenamed,update.aiml(everyrobothastheir
ownuniqueversionofthisfile)thatcontainsanychangesthatyoumadetotherobot's
responsesusingtheTrainingInterface.

Clickon,update.aimlandthenscrolldowntothetextarea.Hereyoumayeditandsavethe
robot'sresponsesonline.Afteryou'veeditedthetext,besuretoclickonthe,SaveAs
buttontomakeyourchangespermanent(see[3])

AsanalternativetoeditingtheAIMLfileonline,youcanusetheDownloadlinknexttothe
filenametodownloadalocalcopywhichyoucantheneditwithanXMLeditoronyourown
computer(possiblywhilenotonline).YoucanlaterusetheformatthebottomoftheAIML
filespagetouploadthemodifiedAIMLbacktoPandorabots.It'salsonotabadideatokeep
alocalcopyofyourAIMLincaseyouaccidentallydeleteitontheserver.

Let'slookatthefileforaminute(shownbelowwithsomeminorreformatting).Thefirstline
(ofheaderinformation)tellusthetypeofcharactersetandversionsofXML(see[4])weare
using.ThenextlinetellsusweareusingAIMLversion1.0.
<?xmlversion="1.0"encoding="UTF8"?>
<aimlversion="1.0">
<category>
<pattern>HELLO</pattern>
<template>Hithere!</template>
</category>
<category>
<pattern>*</pattern>
<template>
<random>
<li>Whatisyourname?</li>
<li>Whatisyourfavoritemovie?</li>
<li>Willyoubuymeadrink?</li>
</random>
</template>
</category>
</aiml>

Categoriesarespecifiedbytheinformationbetweenthebeginningandendinglinesinthe
form:

<category>...information...</category>

Similarly,theinputwordsarespecifiedby:

<pattern>...information...</pattern>

Theoutputresponseisspecifiedbytheinformationbetween<template>and</template>.

Theitemsbetween"<"and">"arecalledAIMLtagsorelements.EachAIMLtaghasan
openingtagandaclosingtagoftheform:

<sometag>...information...</sometag>

Itsometimeshappensthatthereisnoinformationbetweentheopeningandclosingtagsand
youcanusetheabbreviation:

<sometag/>

(notethe"/"afterthetagname)asareplacementfor:

<sometag></sometag>

EachtimeyouclickontheSubmitbuttonontheAdvancedAlterResponsepage(orclick
onSayInstead)theeffectistoaddnewinformationtothefile,update.aiml.Agoodwayto
learnAIMLsyntaxistoexaminethemodifiedupdate.aimlfileasshownabove.

AnotherrandomCategory

Nextwe'regoingtocreateanewversionofEmptyandagaincreateacategoryusing
<random>.However,thistimewewon'tdefineitasthedefaultcategory.Thisexampleis
usedasthebasisforthefourthexampleinthenextsection.

CreatingaNewVersionofEmpty

FirstclickonMyPandorabotsandtheninthetableofrobots,clicktheradiobuttonnextto
thename,Empty.Fromthedropdownmenubelow(it'sinitiallylabeled,Publish)select
Delete.Nextclickonthe,OKbuttonontherightandconfirmthatyouwanttodeletethe
robot,Empty.

Then,simplyrepeattheprocedureyoufollowedforcreatingthefirstrobot,Emptyandyou'll
haveafreshemptyrobot.

BeingemptyofknowledgetheonlythingEmptycansayis:

Empty:Ihavenoanswerforthat

Let'sincreasethepossibilitiesforaninterestingconversationbygivingfourpossiblerandom
responsestothenextinquiry.
Human:Youdolovemedon'tyou
Empty:Ihavenoanswerforthat

AftertypingtheaboveintotheTraininginterface,clickonAdvancedAlterResponseandin
theboxlabeledtemplateadd:

<random>
<li>Idon'tknow,whathaveyoudoneformelately?</li>
<li>Yes,butyouhavetoreallytrytomakemehappier...</li>
<li>Stopyourwhining!</li>
<li>Yes,butonlywhenyouaregoodtome</li>
</random>

...andasbeforeclickontheSubmitbutton.Next,clickontheAskAgainbuttonenough
timestocyclethroughthecompletesetofresponses.TheKnowledgeWebnowlookslike
Picture1.4.

Contractionslike"don't"areexpandedto"donot",so:"youdolovemedon'tyou?"is
transformedtotheratherawkward,"youdolovemedonotyou"(see[5]).

Howabout<that>?

Using<that>therobotiscapableofrememberingwhatitsaidinthepreviousinteraction.
Andconversationscanbecomemoremeaningful.<that>wasnamedandarosefrom
analyzingaconversationalexchangeslike:

Empty:TodayIloveyou.
Human:Thatiswonderful.
Empty:But,willIstillloveyoutomorrow?
Human:ThatiswhatIwanttofindout.

Firstweneedacategorythatisusefulforworkingwith<that>expressions.Enterthis
categoryintoEmptylikethis:

Human:say*
Empty:Ihavenoanswerforthat

ClickonAdvancedAlterResponse.

Noticethecontentsoftheboxinthepatterncolumnarethebeginningofanewcategory:
"SAY*"(thereisaspacebetweenSAYand*)

Intheboxlabeledtemplateadd:

<star/>
...andSubmitthenewAIML.(Recallthat<star/>isashorterwayofwriting<star>
</star>see[2].)Theeffectofthischangeistomatchanything.Sonow,"Saysomething"
willalwaysset<that>to"something."Forexample:

Human:sayIloveyou
Empty:Iloveyou

Wearegoingtousethiscategorytotestourcategoriesthatuse<that>.

Example1Whoareyou?

Atsomepointyourrobotmightwanttoknowwhoitistalkingto.Hereishowtodothis:

Human:*
Empty:Ihavenoanswerforthat

ClickonAdvancedAlterResponse.

Checktheboxlabeled"newcategorydependsonthat"andreplacethetextbox'scontents
with:

WHATISYOURNAME

Noticetheboxinthepatterncolumncontains"*"meaningthatanyresponsewillbe
matched.Intheboxlabeledtemplateadd:

Nicetomeetyou<setname="name"><person/></set>.

ThislastbitofAIMLcodegrabstheperson'sname.

Nowasktherobot,"Saywhatisyourname,"togeneratethestateinwhichthenextinputwill
activatethe<that>category.

Human:saywhatisyourname
Empty:whatisyourname
Human:Mr.Lovejoy
Empty:NicetomeetyouMr.Lovejoy.

Example2YESandNOQuestions

Use<that>forcategoriesthatseekyesandnoresponses.Hereisanexamplefor"yes"
questions:

Human:yesEmpty:Ihavenoanswerforthat

ClickonAdvancedAlterResponse.

Checktheboxlabeled"newcategorydependsonthat"andreplacethetextbox'scontents
with:

AREYOULOOKINGFORLOVE

Noticetheboxinthepatterncolumncontains"YES".Intheboxlabeledtemplateaddfour
randomresponses:
<random>
<li>Aren'twealllookingforlove?</li>
<li>Wellyou'vecometotherightplace!</li>
<li>Andwhatkindoflovearewelookingfortoday?</li>
<li>WellIamoverflowingwithLoveforyoutoday</li>
</random>

Now,therobotshouldbeabletorecognizethe"yes"response:
Human:sayareyoulookingforlove?
Empty:areyoulookingforlove
Human:yes
Empty:Wellyou'vecometotherightplace!

Example3DiscoveringwhatknowledgetoaddtoaRobot

TheAIMLtag<that>referstowhateverEmptylastsaid.Use<that/>andadefault
templatetoaddnewknowledge:

Human:Why
Empty:Ihavenoanswerforthat

Enterasthealternativeresponse:

"<that/>"?Why?

andclickonSayInstead.

Thiscategoryenablesthefollowingdialoguefragment:

Empty:Donotaskmeanymorequestionsplease.
Human:Why?
Empty:"Donotaskmeanymorequestionsplease"?Why?

ThebotmasternoticesthefragmentandcreatesthenewAIMLcategory:
<category>
<pattern>WHY</pattern>
<that>DONOTASKMEANYMOREQUESTIONSPLEASE</that>
<template>BecauseIwouldrathertalkaboutyou.</template>
</category>

Nowthenextclientwhoasks"Why?"totherobot'srequestwillactivethenew<that>
category:

Empty:Donotaskmeanymorequestionsplease.
Human:Why?
Empty:BecauseIwouldrathertalkaboutyou.

Thisstyleofconversationalanalysisdoesnotpresupposethatweknowwhentheclientwill
say"Why?"ratheritlooksbackwardtoidentifycaseswherethe"Why?"appearedfollowing
oneoftherobot'sstatements.Havingidentifiedtheconversationpoint,thebotmastercreates
thenewcategory.

Example4ContextSensitivePatterns

Let'slookataslightlyconvolutedexample.Followingonfromanearlierexampleinthe
previoussection,clickonAskAgainenoughtimestogettheresponseinthefirstexchange
below:

Human:Youdolovemedon'tyou
Empty:Yes,butyouhavetoreallytrytomakemehappier...
Human:ButItrysohardtopleaseyou...
Empty:Ihavenoanswerforthat

ClickonAdvancedAlterResponse

Checktheboxlabeled:"newcategorydependsonthat"whichshouldcontain"YESBUTYOU
HAVETOREALLYTRYTOMAKEMEHAPPIER"Noticetheboxinthepatterncolumncontains:
"BUTITRYSOHARDTOPLEASEYOU"

Intheboxlabeledtemplateadd:
Andsometimesyousucceed,it'sjustthatyoucoulddosomuchbetter.

Soonlywhentherobot'srandomresponsematchestheinteractioninthenextexchange:

Human:youdolovemedon'tyou?
Empty:Yes,butyouhavetoreallytrytomakemehappier...

Youcantypein:

Human:ButItrysohardtopleaseyou...
Empty:Andsometimesyousucceed,it'sjustthatyoucoulddosomuch
better.

Exceptforthecasementionedabove,therobot'sresponseto:

Human:ButItrysohardtopleaseyou...

willbe:

Empty:Ihavenoanswerforthat

Picture1.5showsthesituation.

So,<that>modifiesacategorymeaningmatchthecategoryonlyiftherobotsaidwhat
followsthe<that>inthepreviousutterance.Continuingwiththisexample:

Human:Youjustdon'tappreciateme,youtakemeforgrantedandwalk
alloverme...
Empty:Ihavenoanswerforthat

ClickonAdvancedAlterResponse

Checktheboxlabeled:"newcategorydependsonthat"(whichnowcontainsthecontentsof
lastResponseTemplate):"ANDSOMETIMESYOUSUCCEEDITISJUSTTHATYOUCOULDDO
SOMUCHBETTER"

Noticethecontentsoftheboxinthepatterncolumnarethebeginningofanewcategory
"YOUJUSTDONOTAPPRECIATEMEYOUTAKEMEFORGRANTEDANDWALKALLOVERME"

Intheboxlabeledtemplateadd:
Ifyouworkedharderitwillhelpmetodevelopmoreenthusiasmfor
appreciatingyouwhatdoyouwantmetodo?Fakemyappreciationor
reallyfeelit?

Withthesechangesthefollowinginterchangesarepossible(clickonAskAgainenoughtimes
togenerateEmpty's(random)responseinthefirstexchangebelow):

Human:youdolovemedon'tyou?
Empty:Yes,butyouhavetoreallytrytomakemehappier...
Human:butItrysohardtopleaseyou...
Empty:Andsometimesyousucceed,it'sjustthatyoucoulddosomuch
better
Human:Youjustdon'tappreciateme,youtakemeforgrantedandwalk
alloverme...
Empty:IfyouworkedharderImightbeabletodevelopalittlemore
enthusiasmforappreciatingyouwhatdoyouwantmetodo?
Fakemyappreciationorreallyfeelit?"

Picture1.6showsthecurrentstateofknowledge.

Thecontentsofthefileupdate.aimlnowinclude:
<category>
<pattern>YOUDOLOVEMEDONOTYOU</pattern>
<template>
<random>
<li>Idon'tknow,whathaveyoudoneformelately?</li>
<li>Yes,butyouhavetoreallytrytomakemehappier...</li>
<li>Stopyourwhining!</li>
<li>Yes,butonlywhenyouaregoodtome</li>
</random>
</template>
</category>
<category>
<pattern>BUTITRYSOHARDTOPLEASEYOU</pattern>
<that>YESBUTYOUHAVETOREALLYTRYTOMAKEMEHAPPIER</that>
<template>
Andsometimesyousucceed,it'sjustthatyoucoulddosomuch
better
</template>
</category>
<category>
<pattern>
YOUJUSTDONOTAPPRECIATEMEYOUTAKEMEFORGRANTEDAND
WALKALLOVERME
</pattern>
<that>
ANDSOMETIMESYOUSUCCEEDITISJUSTTHATYOUCOULDDOSOMUCH
BETTER
</that>
<template>
Ifyouworkedharderitwillhelpmetodevelopmoreenthusiasm
forappreciatingyouwhatdoyouwantmetodo?Fakemy
appreciationorreallyfeelit?
</template>
</category>

Whatabout<topic>?

TopicletsyougrouptogetherCategories.PresentedInputpatternsaresearchedformatching
categorieswithintherobot'sknowledgeweb.Ifmorethanonematchingcategoryisfound,
therobotmatchesthe<that>patternsnext,andifmorethanoneoftheseexist,therobot
matches<topic>next.

Categoriesarestoredinalphabeticalorderbypattern.InputstobematchedtoCategoriesare
comparedinreverseorder.Sowhentheinputmatchesmorethanonecategorythelastoneis
taken.TypicallywemightwanttobundleupabunchofCategoriesintoonegeneraltopic.So
lackinganadequateresponseandknowingthatwehaveaspecificTopic,therobotcan
generatespecificpickuplinesandkeeptheconversationgoing.Howdowedothis?

Example5UsingTopics

EnterthiscategoryintoEmptybytypingthis:

Human:*
Empty:Ihavenoanswerforthat

ClickonAdvancedAlterResponseandnoticethecontentsoftheboxinthepatterncolumn
contain"*"whichmatchesanything.

Checktheboxlabeled:"newcategorydependsontopic"andinthetextboxaboveadd:

GIRLS

Intheboxlabeledtemplateadd:
<random>
<li>Iwonderwhataboutthemyoulikebest?</li>
<li>I'vebeenknowntolikegirlstoo!</li>
<li>Canyoudistinguishbetweengirlsandwomen?</li>
<li>Isthereanythingyoudon'tlove?</li>
</random>

We'vechangedthedefaultresponsecategorywhenwearetalkingaboutgirls.Emptyuses
oneoffourrandomlychosenpickuplinestocontinuetheconversation.Beforewecantestor
usethisnewcategory,wehavetochangethetopic.Andwecanusethistoteachalittle
moreabouttheinterface.Enterthefollowing:

Human:topic*
Empty:Ihavenoanswerforthat
ClickonAdvancedAlterResponseandnoticethecontentsoftheboxinthepatterncolumn
contains:"TOPIC*"

Intheboxlabeledtemplateadd:

<think>
<setname="topic">
<star/>
</set>
</think>
OK,I'veresetthetopicto<star/>.

We'vecreatedanewcategoryandwrittenalittlebitofAIMLcodeandusedittochangethe
<topic>.The<think>tagsdemarcatea"hidden"sequenceofinstructionshiddeninthe
sensetheclientwillnotseethem.The<set>tagsdemarcatethewaywechangethetopic
(whichischangedtotheinputpatternmarkedbythesingletontag<star/>alistofthe
AIMLTagsisavailableatthetimeofthiswritingat:
http://www.alicebot.org/committees/architecture/resolutions/aiml10.html).

Withthisnewcategorywecanchangethe<topic>asin:

Human:topicgirls
Empty:OK,I'veresetthetopictogirls.
Human:Ilovegirls
Empty:Isthereanythingyoudon'tlove?

Nowwecancreateacaterorytogetbacktothedefaultstateofnotopic.Enterthefollowing:

Human:notopic
Empty:I'vebeenknowntolikegirlstoo!

ClickonAdvancedAlterResponseandintheboxlabeledtemplateadd:

<setname="topic"/>done

Resultingin:

Human:notopic
Empty:done

Let'sfirstaddsomemoreknowledgetoEmpty.

Human:Youdoloveme?
Empty:Ihavenoanswerforthat

TeachEmptyinsteadtosay"Yes,butonlywhenyouaregoodtome".

Changingtheinputto:

Human:Doyouloveme?
Empty:Ihavenoanswerforthat

Again,teachEmptyinsteadtosay:"Yes,butonlywhenyouaregoodtome".

Now,eitherinputpatterns"Youdoloveme?"or"Doyouloveme?"promptstheresponse:

Empty:"Yes,butonlywhenyouaregoodtome".

Fromtheviewpointofknowledgecontent,Picture2.0describesthecurrentstate.
Sonext:

Human:Don'tyouloveme?
Empty:Ihavenoanswerforthat

Teachitinsteadtosay:"Yes,butonlywhenyouaresweettome".

Sowecanalsohavethefollowinginteraction:

Human:Don'tyouloveme?
Empty:Yes,butonlywhenyouaresweettome.

Nowwe'lladda<topic>andremindourselveshowtosaveanduploadfiles.

ToviewtheAIMLfilesforaparticularrobot,clickontheAIMLlink(thisisnearthetopofthe
screen,onthesecondrowoflinks).Ifyoudon'tseethislinkbutinsteadseeatableofall
yourrobots,you'llfirstneedtoclickonthenameoftherobotEmptyinthiscase.

Scrolldownuntilyouseeasectionlikethis:

Filename Browse Download Library Active Delete


update.aiml Browse Download (local)

Belowthefirstheading,Filenameyou'llseeafilenamed,update.aiml(everyrobothastheir
ownuniqueversionofthisfile)thatcontainsanychangesthatyoumadetotherobot's
responsesusingtheTrainingInterface.

Clickon,update.aimlandthenscrolldowntothetextarea.Undertheline:

<aimlversion="1.0">

Addtheselines:
<topicname="LOVE">
<category>
<pattern>*</pattern>
<template>
<random>
<li>Howmuchdoyouloveme?</li>
<li>Whydon'tyouevershowmeyouloveme?</li>
<li>Whyisitsodifficultforyoutoshowaffection?</li>
<li>Yourcoldnesschillsmetothebone</li>
</random>
</template>
</category>

Finally,addtheline:

</topic>

attheendofthefile,sothatthelasttwolineslooklikethis:

</topic>
</aiml>

SaveyourchangedfileandthenclickontheTrainlinkonthesecondrowofmenubuttonsto
resumeinteractionswithyourrobot.Theselastchangesonlybecomerelevantwhenthetopic
is"LOVE".Inotherwordstherobotwillrespondtoanythingelseyoutypewith,"Ihaveno
answerforthat".

Tosetthetopic,typein"*"andputthislineintothetemplatebox:

<setname="topic">love</set>

Wheneverthetopicis"LOVE"andtherobotlacksaresponse,yourrobotwillresponsewith
oneofthefourpossiblelinesenteredabove.

MakingKnowledgeContentChanges(BotProperties)

AswehaveseenAIMLusespatternmatchingtoselectacategorybasedontheclient's
input.Eachcategoryhasaresponsetemplatewhichdefinestherobot'sresponse.Withina
template,thebotmastercanreferto"BotProperties"whichallowsthesamesetofAIML
filestobeusedtocreatedifferentrobotseachwithadistinctandpersonalidentity.

Forexample,Dr.RichardWallace'sMarch2002AIMLsetincludesthecategory:
<category>
<pattern>WHOISYOURFAVORITEBAND</pattern>
<template>
Myfavoritegroupis<botname="favoriteband"/>.
</template>
</category>

Thismakesareferencetothe"favoriteband"propertyandthispropertycanbeset
individuallyforeachrobotthatusesthisAIMLset.

Toseehowtosettheproperty,gototherobotyounamedFull(createdatthebeginningof
thetutorial).

FirstclickonMyPandorabotsandtheninthetableofrobots,clickonFull.Nextclickonthe
Propertieslinkonthesecondrowofmenubuttons.

Hereyou'llseealistofBotPropertiesbasedontheAIMLset.Byfillingtheseoutandclicking
onSubmitChangesyoucancustomizeyourrobot'sresponses.Forexampleaftersetting
"favoriteband"tobe"TheBeatles",Fullwouldrespond:

Human:Whatisyourfavoriteband?
Full:MyfavoritegroupisTheBeatles.

ThePropertiespagealsoallowsyoutoaddyourownpropertieswhichyoucanrefertoin
anyAIMLresponsetemplatesyoucreate(eitherbyeditingtheAIMLdirectlyorthroughthe
Traininginterface).Asanexample,wecandefineanewproperty"weather",withaninitial
valueof"rainy".TemplateresponsescannowrefertothevalueofweatherusingAIMLlike:

Theweatheris<botname="weather"/>

Somanywaystowritethesamething...Whatis<srai>?

Youcanwriteasentencewiththesamemeaninginmanydifferentways.Mostpeoplewould
acceptthefollowingsentencesasroughlyequivalent:

Empty,canyoupleasetellmeifyouareseeinganyoneelserightnow?
Empty,canyoupleasetellmeifyouareseeinganyoneelsenow?
Empty,canyoupleasetellmeifyouareseeinganyoneelse?
Empty,pleasetellmeifyouareseeinganyoneelse?
Empty,tellmeifyouareseeinganyoneelse?
Empty,tellme,areyouseeinganyoneelse?
Empty,areyouseeinganyoneelse?
Areyouseeinganyoneelse?

Andthisisanexampleofageneralproblemhowdoyouenterallthecategoriesforinputs
withequivalentmeanings?Orhowdoyouanswerthesekindsofquestions?Noonehas
providedasatisfactorymechanismforfindingallthesimilarsentences.Hereiswhatcanbe
donethough.

Inthisexamplewearegoingtouseanewtagandintroducethe"_"character.Earlierwe
wrotethat"*"matchesanypattern."_"isanotherformof"*"andisusefulformatching
patternsattheendsofsentences.Thecategorycontaining"*NOW"willbematchedafterthe
onecontaining"_NOW".

Let'sbeginbyaddingtwonewcategoriessothatEmptyrespondsasfollows:

Human:Areyouseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Human:Youareseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.

Then,byaddingthecategory:
<category>
<pattern>EMPTY*</pattern>
<template>
<srai><star/></srai>
</template>
</category>

Emptyrespondswith:

Human:Empty,areyouseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.

Adding:

<category>
<pattern>_TELLME*</pattern>
<template>
<srai><star/></srai>
</template>
</category>

...produces:
Human:Empty,tellmeareyouseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.

Adding:

<category>
<pattern>_TELLMEIF*</pattern>
<template>
<srai><star/></srai>
</template>
</category>

...produces:

Human:Empty,tellmeifyouareseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.

Finally,afteradding:
<category>
<pattern>_NOW</pattern>
<template>
<srai><star/></srai>
</template>
</category>

<category>
<pattern>_RIGHTNOW</pattern>
<template>
<srai><star/></srai>
</template>
</category>

...wecannowgetthesameanswertoallthequestions:

Human:Empty,canyoupleasetellmeifyouareseeinganyoneelseright
now
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Human:Empty,canyoupleasetellmeifyouareseeinganyoneelsenow?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Human:Empty,canyoupleasetellmeifyouareseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Human:Empty,pleasetellmeifyouareseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Human:Empty,tellmeifyouareseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Human:Empty,tellmeareyouseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Human:Empty,areyouseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.

So,whathashappenedhere?We'vesimplifiedprogressivelymorecomplexsentencesinto
two"standard"sentences:(Areyouseeinganyoneelse?andYouareseeinganyoneelse?)

Thegeneraltechniqueiscalledrecursionanditmeansapplyingthesamesolutioninthis
example<srai><star/></srai>overandoveragain.Recursionisusefulforavarietyof
tasks.Wewilljustmentionafewhere.MoredetailscanbefoundinTheAnatomyofAlice.
Example6HandlingMultipleSentences

Thefollowingexchangeisgeneratedwiththecategoriesbelow.(Yourrobotcanhandle
multiplesentencesanddoesitbyrespondingtoeachoneinturninseparateoutputlines.)

Human:Empty,areyouseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Human:Isee.
Empty:Iamgladyousee.
Human:Whydoyouthinkyoucangetawaywiththat?
Empty:Fulldisclosureisalwaysbestdon'tyouthink?
<category>
<pattern>ISEE*</pattern>
<template>
<srai>ISEE</srai>
<srai><star/></srai>
</template>
</category>

<category>
<pattern>ISEE</pattern>
<template>Iamgladyousee</template>
</category>

<category>
<pattern>
WHYDOYOUTHINKYOUCANGETAWAYWITHTHAT
</pattern>
<template>
Fulldisclosureisalwaysbestdon'tyouthink?
</template>
</category>

Example7SpellingandGrammarcorrections

Oftenwewanttocorrectspellingerrorsorsuggestalternateformsofgrammarandhereis
onewaytodoit:

<category>
<pattern>YOURA*</pattern>
<template>
Ipresumeyoumean"youarea..."<srai>YOUAREA<star/></srai>
</template>
</category>

Example8Keywords

Sometimeswewanttherobot'sresponsetobedeterminedbyjustoneword(akeyword)
you'vetyped.Hereisanexampleinwhichthekeywordis"LOVE":
<category>
<pattern>LOVE</pattern>
<template>Tellmemoreaboutwhatyouareseeking.</template>
</category>

<category>
<pattern>_LOVE</pattern>
<template>
<srai>LOVE</srai>
</template>
</category>

<category>
<pattern>LOVE_</pattern>
<template>
<srai>LOVE</srai>
</template>
</category>

<category>
<pattern>_LOVE*</pattern>
<template>
<srai>LOVE</srai>
</template>
</category>

Thefirstcategorymatchesthesinglewordinputoflove.Thesecondandthirdcategories
matchasentenceendinginloveandbeginninginloverespectively.Thefinalcategory
matchesasentenceinwhichthewordloveappears.

HowaboutInternationalLanguages?

Yourrobotcanhandleanyinternationalcharacterset.Wecouldhaveaskedtherobota
similarquestioninJapanese:


Human: ?
Full:Ihavenoanswerthat

CertainlanguagesuchasChineseandJapaneseassumenospacesexistbetween"words".For
Japanese,Pandorabotscanautomaticallyacceptsentenceslackingspacesfromclientsand
storetheminternallywithspacesinsertedbetween"words".InordertohavePandorabotsdo
this,whenyoucreatetherobot,youshouldchecktheboxannotatedwith:automatically
discoverspacesbetweenwords(suggestedforJapanese).

AsimilaralgorithmcanalsobeusedforChinesethoughatthetimeofthiswritingremains
unimplemented.UsingthealgorithmforJapaneseonChinesesentencesresultsinspaces
inappropriatelyinserted.Ineithercasethebotmaster'sjobofmatchinginputpatternsis
considerablysimplifiedbytheautomaticinsertionofsuchspaces.

HowcanIdisplayPhotographsandotherImages?

Responsetemplatescandofarmorethanprovideresponses.Theycanrunarbitraryprograms
andservepagesfromotherwebsites.Youcan,forexampleaskEmptytoshowapictureof
anotherpersonandthepicturecanbeanywhereontheweb.

Human:Showmewhatyouthinkloveis.
Empty:Ihavenoanswerforthat

Enterasthealternativeresponse:

Thisisoneofmymanypicturesoflove:<br/>
<imgsrc="http://www.pandorabots.com/pandora/pictures/cn.jpg"
width=100height=100/>

Youcanalsosimplifysomeofthetypingbyclickingonthe<img>buttonontheAdvanced
AlterResponsepagenexttothetemplatebox.

Eitherway,thisshouldchangetherobotsresponseto:

Human:Showmewhatyouthinkloveis.
Empty:Thisisoneofmymanypicturesoflove:
HowtoJazzUpyourRobotwithHTMLSkins

ThePandorabotsinterfaceoffersyoutheabilitytoeasilycustomizeyourrobot'spageinany
waythatyoulike.You'llfindthataddingafacetoyourrobotwillmakeitmuchmore
personabletoyourvisitorsthanthestandarddefaultblankpage.Andwillalsoincreasethe
rateofreturnvisitswhich,ofcourse,iswhatyouwant.

Ifyouhaven'taddedafacetoyourrobot,youshouldconsiderdoingsonow.The"Skin"code
iswritteninbasicHTMLwhichmakesitveryeasyforyoutocustomize.Andsinceyoucando
thisonline(orofflineifyouprefer),anychangesthatyoumakewillshowupimmediately.

CreatingYourHTMLSkin

1.Clickon,Empty.
2.Clickon,CustomHTML(atthetopofthescreen).
3.Clickon,CreateanewcustomHTMLfile(it'sinthebodytext).
4.EnteryourHTMLcodeinthetextwindow.Whenyou'redone,namethefile,"empty"(do
nottypethe".html"extensioninthefilename)andthenclickonthe,SaveAsbutton
below.

Note:YoucancreatemultipleHTMLSkinsforyourrobotatonceandswitchbetweenthem
wheneveryoulike,withoutlosingorchangingtheHTMLdata.Thisletsyouexperimentwith
differentstylestoseewhichonesuitsyoubest.

EditingYourHTMLSkin

1.Clickon,Empty.
2.Clickon,CustomHTML(atthetopofthescreen).
3.Under,Filenameclickon,empty.html(orwhateveryounamedthefileas).
4.EdittheHTMLcodeinthetextwindowandthenclickonthe,SaveAsbuttonbelow.Any
changeswillshowupinstantly,youdonothavetorepublishyourrobot.

Thelinksbelowwilltakeyoutoaworkingversionofacustomizedrobotpage,andtothe
tutorialusedincreatingit.

Sybil
http://www.pandorabots.com/pandora/talk?botid=d29610271e34f8d4

SkinTutorial
http://www.pandorabots.com/pandora/pics/pubhtml.html

Ifyou'dlikeacollectionoffaces(bothmaleandfemale)thatyoucanuseonyourown
customizedpage,visithttp://scri8e.250free.com/peepz/phaces/PhacesP1Jpg120.html

Notes

[1]
TheoptionsStandardAIMLSept2001andDrWallace'sA.L.I.C.Emarch2002aretwo
setsofknowledge.Thefirstisorganizedintoseparatefilesthatareeasytochangeit's
suitableforexperts.ThesecondistheknowledgeDr.Wallaceusedtowinthe2002
Loebnerprize.

[2]
Wordsinsidebrackets"<"and">"like"<random>"arecalledXMLtagsandspecify
howtheansweristobeprocessed.We'veprovidedonlyafewsuchtags.<li>specifies
anelementinalistandthisexamplehasalistwith3elementsnamelythethree
sentences.Eachtagisexpectedtohaveaclosingtag,typicallyspecifiedasin
</random>.Itsometimeshappensthatnothingfallsbetweenanopeningtaganda
closingtag,andsothetwotagscanbereplacedasinthisexample<star></star>=
<star/>Thatis,thetwotagsontherightcanbereplacedbythesimplertagonthe
left.

[3]
Changesyoumakedirectlytotherobot'sAIMLfileswillbeimmediatelyvisiblewithin
theTrainingInterface.However,ifyourrobotispublished,you'llneedtorepublish
therobotinordertohavethechangesbevisibleatthepublicURL.

[4]
XMLandAIMLareprogramminglanguages.WeimplementedAIML(Artificial
IntelligenceMarkupLanguage)anonstandardevolvingmarkuplanguageforcreating
chatrobots,createdandsupportedbytheALICEFoundationandlocatedat
www.alicebot.org.TheprimarydesignfeatureofAIMLisbrevityandsimplicity.The
patternmatchinglanguageisverysimple,forexamplepermittingonlyonewildcard
('*')matchcharacterperpattern.AIMLisanXMLlanguage,meaningthatitobeys
certaingrammaticalmetarules.ThechoiceofXMLsyntaxpermitsintegrationwithother
toolssuchasXMLeditors.

[5]
Herearemoredetailsofthetransformation.Theinquiry"doyouloveme",is
transformed,removinganypunctuationandconvertingittouppercase:"DOYOULOVE
ME".So"doyouLOVEme"and"DOYOUloveme"areequivalent.Formultiple
sentences,findingthesentencesisthefirstpart.Theinquiry"Doyouloveme
dr.wallace?ms.marysaidyoumight..."istransformedto"Doyoulovemedoctor
wallace?msmarysaidyoumight".Theneachsentenceisseparatelyprocessed.
Apostrophesareremovedfromcontractionsso"I'minlovewithyou"istransformedto
"Iaminlovewithyou".

Japaneseiswrittenwithoutspacesbetweenthewords.Sospacesarefirstinserted.
WhentherobothasbeensetuptoprocessJapaneseandEnglish,asentencelike"let's
seeifyoureallydo"istransformedto"let'sseeifyoureallydo"

Appendix

UsingAdvancedAlterResponsetheDetails

Thefirsttworowsinthetablecontaininformationabouttheinputsentenceandthematching
category.

Input
Showstheinputtextthattherobotreceived(aswellasthecurrent<that>and
<topic>contexts).
Matched
Showsthecomponentsofthecategorythatmatchedtheinput.

Eachofthesetworowsissplitintothreecolumnsrepresentingthethreedifferentcomponents
thatconsituteanAIMLcategory.

Therestofthetable(labeledNewAIMLCategory)allowsyoutoeditthevarious
componentsofthenewAIMLcategorybeingdefined.Defaultsareprovidedbasedonthe
actualinputontheTrainingpageandyoucaneitheracceptorrevisethese.(Note.Youmust
checktheappropriatecheckboxfirstbeforeenteringvaluesfor<that>and<topic>.)

Textinthefirstboxisautomaticallysurroundedby<pattern>and</pattern>soyou
neednotenterthem.Youmayalsospecify<topic>and<that>partsofthecategory.Again
thetextissurroundedbythe<that>and<topic>AIMLtagsautomatically.

ThetemplateresponseBoxletsyouspecifytheactionsforthecategorybeingdefined.The
buttons<think>,<random>,etcsaveyoufromtypingintheAIML.Also,anythinginthisbox
isautomaticallysurroundedby<template>and</template>.

Therearefivebuttonsbelowthetemplateboxwhichprovideshortcutsforwritingthe
template:

AIML Notes
<think>
<setname="it">
<setname="topic">
<think> <person/>
</set>
</set>
</think>
<random>
<li></li>
<random> <li></li> Addchoicesbetweenthelistitemtags<li>and</li>.
<li></li>
</random>
Putapathnamebetweenthedoublequotestoprovidea
<img> <imgsrc=""></img>
picture.
<sr/> <sr/> Anotherabbreviationfor<srai><star/></srai>
<srai> <srai></srai> Inserttextbetweenthesetwotags.

ExploringCategories

WithinthemaintableontheMyPandorabotspageandoneachindividualrobotpage,you'll
findlinkslabeledExplore.

Theyprovidearudimentarymechanismforexploringthecategoriesthatexistinagiven
knowledgeweb.Youcanusethisfeaturetofindalreadyexistingcategoriesthatwillbe
matchedbyinputpatterns.Iteffectivelyallowsyoutotraversetheknowledgeweb.Whenyou
reachacategory,theAIMLextractdefiningthecategoryisshown.

Pandorawriter

AnalternativewaytocreateAIMListousePandorawriter.Thistoolautomaticallyconverts
EnglishtexttoasubsetofAIML,andforcertainclassofrobotcangreatlyeasethetaskof
addingnewknowledge.Thetoolisstillinaveryearlystageofdevelopmentandsuggestions
forimprovementsarealwayswelcome.BriefdocumentationforPandorawriterisavailable
here.

Glossary

InputPattern
Theinputsentence(orsentences)providedtotherobot.

Template
Anabbreviationforresponsetemplate.

ResponseTemplate
TheResponseTemplateiseitheraresponseoraprogramtogeneratearesponse.

Category
AnInputPattern(includingoptionalvariantsof<that>and<topic>,alongwitha
ResponseTemplate.

PatternMatching
Acapabilityofmatchinginputsentencesagainststoredsentences.

KnowledgeWeb(akaGraphMaster)
ArepresentationofthecategoriesinaPandorabot.

UltimateDefaultCategory
Whentheinputsentencefailstomatchanycategory.

DefaultCategory
<topic>and<that>caneachhaveadefaultcategory.

DefaultResponseTemplate
whatissaidwhennothingismatched.

XML
amarkup/programminglanguage.

AIML
amarkup/programminglanguageimplementingknowledgecontent.AIMLisasubsetof
XML.

ReferencesandResources

ThePandorabotPublicForum:
www.lexicalgas.com/pandora/list.php?f=1

ArtificialIntelligenceMarkupLanguage(AIML)Version1.0.1:
www.alicebot.org/TR/2001/WDaiml/

AIMLPatternMatchingSimplified:
www.alicebot.org/documentation/matching.html

Don'tReadMe:
www.alicebot.org/articles/wallace/dont.html

AIML1.0TagSets(July16,2001):
www.alicebot.org/committees/architecture/resolutions/aiml10.html

AIMLPrimer(January9,2002):
www.alicebot.org/documentation/aimlprimer.html
TheAnatomyofA.L.I.C.E.(pendingpublication):
AvailablefromDr.RichardWallaceatwww.alicebot.org

Copyright20022004DoublyAimless

You might also like