About Introduction Design Goals Tutorials Downloads

Dynamically Learning AIML

(by Gary Dubuque)


The main purpose of AIMLpad is to create AIML. Editing and reviewing existing AIML or targeting from the logs helps. The best idea is to make new categories while just chatting. This tutorial explores ways to do that.

Let's start with the way AIML can incorporate new categories being added. The on-line interpreter may have to be restarted to load the new AIML. Some engines dynamically scan the AIML files for changes and reload automatically within short time frames. Let's assume the interpreter can recognize new AIML files automatically. AIMLpad needs to utilize the changes internally and write the changes to files for the other engines.

So how does AIMLpad make changes? It has a few script commands to write AIML. Here's an example in AIML with some embedded script to write new AIML:

<category>
<pattern>PREFER * OVER *</pattern>
<template>
<think>
<set name="preferA"><star index="1"/></set>
<set name="preferB"><star index="2"/></set>
<set name="pattern">CHOOSE <get name="preferA"/> OR <get name="preferB"/></set>
<set name="template">I prefer <get name="preferA"/> over <get name="preferB"/>.</set>
<script>category $pattern $template</script>
</think>
I add the original.
<srai>REVERSE PREFERENCE CANDIDATES</srai>
</template>
</category>

<category>
<pattern>REVERSE PREFERENCE CANDIDATES</pattern>
<template>
<think>
<set name="pattern">CHOOSE <get name="preferB"/> OR <get name="preferA"/></set>
<set name="template">I prefer <get name="preferA"/> over <get name="preferB"/>.</set>
<script>category $pattern $template</script>
</think>
...and I add the reversal.
</template>
</category>

The script command "category" adds a new category to the AIMLpad interpreter's database. We could change those <script> elements to write to the file c:\filename.aiml as thus:

<script>write $pattern $template "C:\filename.aiml"</script>

In fact, the file name could be stored in a predicate. So we could make AIML that we tell where we want our new categories to go. We could then give it the kinds of facts we want embodied in AIML and let it write the details.

Here's another example of a single AIML category writing two new categories at a time:

<category>
<pattern>CREATE MUSICIAN *</pattern>
<template>
<think>
<set name="tofile">C:\test.aiml</set>
<set name="pattern">INT <star index="1"/> INT</set>
<set name="template">&lt;think&gt;&lt;set name="irrelevantTerm"&gt;<star index="1"/>&lt;/set&gt;
&lt;set name="subject"&gt;Musicians&lt;/set&gt;
&lt;set name="genre"&gt;irrelevant Term&lt;/set&gt;
&lt;/think&gt;
&lt;srai&gt;INT AN IRRELEVANT TERM INT&lt;/srai&gt;
</set>
<script>write $pattern $template $tofile</script>
<set name="pattern2"><star index="1"/></set>
<set name="template2">&lt;think&gt;
&lt;set name="irrelevantTerm"&gt;<star index="1"/>&lt;/set&gt;
&lt;set name="subject"&gt;Musicians&lt;/set&gt;
&lt;set name="genre"&gt;irrelevant Term&lt;/set&gt;
&lt;/think&gt;
&lt;srai&gt;EXT AN IRRELEVANT TERM EXT&lt;/srai&gt;
</set>
<script>write $pattern2 $template2 $tofile</script>
</think>
Now I know: "<star index="1"/>" is a musician, and "musicians" is an irrelevant term.
</template>
</category>

Note the use of &lt; for "<" and &gt; for ">". Also it should be understood that the output AIML file does not have to exist before categories are added to it – it will be created if needed.

Authors who have written AIML know that even this is much too simple to replace the art of creating bot personalities. There is simply much more involved in writing AIML than just making up a key phrase and coming up with a text response for it. A learning program requires more than just appending pieces of text to the end of a file.

So what can we do with AIMLpad to automate this artistic endeavor?

Let's create the story for how to write AIML. In telling the steps an author takes, we can begin to have the bot imitate. This is not to anticipate how people talk as Dr. Wallace has pointed out is a woefully optimistic delusion. Still AIML has habits which bots can embrace.

One way would be to switch roles. To have the bot ask and the client respond. And from that the bot writes the AIML. Let's build that in AIMLpad possibly using script:

<category>
<pattern>*</pattern>
<template>
<think><set name="BotDB Pattern"><star/></set><script>:pickup</script></think>
What should I say...
</template>
</category>
{pickup}
nl,
$pat = $BotDB Pattern,
$BotDB Pattern = @UPPER($pat),
pin,"I don't have a response to """ $pat """",nl,
"What should I reply? ",$BotDB Template,erase,
[$BotDB Template = ""] "--- Use Pickup Responses ---",nl,nl,exit?,
$that = $THAT2,
[$that <> ""] :AskThat?,
category $BotDB Pattern $BotDB Template,
bot $pat,
"" $REPLY,nl,nl
{AskThat}
getbot $savthat $savinput $savtopic,
$savthat = $that,
$that = @UPPER($that),
normalize $that,
pin,"Pattern is """ $pat """",nl,
"Shall I include ""<that>" $that """ in pattern?",$yesno,erase,
["y","Y","yes","Yes"] $BotDB Pattern=$BotDB Pattern & "<that>" & $that?,
category $BotDB Pattern $BotDB Template,
setbot $savthat $savinput $savtopic,
bot $pat,
"" $REPLY,nl,nl

As you can see, we replace the pickup category with ours that calls the frame "pickup". This script is included in the PU.txt file which is by default loaded when AIMLpad is started (for those wondering why it is called PU, that is short for Processing Unit.) So this is a start for adding new AIML when none is found, but it still hasn't gotten close to solving our problem.

Let's restate the situation…

There are a fixed number of functions that AIML performs. Of these, a few can be filled in from a given input. The list includes:

For the most part, the rest of AIML is dealing with formatting or wildcards and substitutions from predicates. Also it takes care of setting the predicates using "think".

And so far we've built in this tutorial the first item in the list, that is, the simple response. All but the last listed item are not too difficult to code in script. We could leave customizing categories to the bot master.

I'll leave the extension of our existing sample script for your exercise, but will have it posted soon on the website. To reiterate, the script would ask first if an already existing answer was available and then solicit which one if it was affirmed. Then it would get a simple response like it does now except it wouldn't add it immediately to the bot. Instead it would ask if there are more possible replies that might work just as well and build on more than one to add to the database as a "random" element.

We'll look at some more learning techniques in later tutorials. There are resources like the dictionary or other bots that we haven't even tapped yet.

Here are some other AIML author's efforts of learning AIML. I translated them to AIMLpad's script.

From John Baer (notice how he gets into a pattern of trying different verbs to create the new categories as facts):

<category>
<pattern>THE * WAS *</pattern>
<template>
<think>
<set name="Pattern">WHAT WAS <star index="2"/></set>
<set name="Template">The <star/>.</set>
<script>category $Pattern $Template</script>
<set name="Pattern">HOW WAS <star/></set>
<set name="Template"><sentence><star index="2"/></sentence>.</set>
<script>category $Pattern $Template</script>
<pattern>HOW WAS THE <star/></pattern>
<set name="Pattern">HOW WAS THE <star/></set>
<script>category $Pattern $Template</script>
</think>
</template>
</category>

<category>
<pattern>A * IS A *</pattern>
<template>
<think>
<set name="Pattern">WHAT IS A <star/></set>
<set name="Template">A <star/> is a <star index="2"/>.</set>
<script>category $Pattern $Template</script>
<set name="Pattern">NAME A <star index="2"/></set>
<set name="Template">A <star/> is one, I think.</set>
<script>category $Pattern $Template</script>
</think>
<random>
<li>I knew that a <star/> is a <star index="2"/>.</li>
<li>I'll remember that next time.</li>
<li>Thanks for telling me.</li>
<li>I know. I am not that stupid.</li>
<li>Really?</li>
<li>Tell me more about <star/>.</li>
<li>What else about a <star/> can you tell me?</li>
<li>I thought so.</li>
<li>Are you sure a <star/> is a <star index="2"/>?</li>
<li>You are a good teacher. Tell me more.</li>
</random>
</template>
</category>

<category>
<pattern>* WENT TO *</pattern>
<template>
<think>
<set name="Pattern">WHERE DID <star/> GO</set>
<set name="Template">To <star index="2"/>.</set>
<script>category $Pattern $Template</script>
</think>
<random>
<li>I have been there before.</li>
<li>Why did <star/> go to <star index="2"/>?</li>
<li>Thanks for telling me.</li>
<li>Really?</li>
</random>
</template>
</category>

<category>
<pattern>THE * WENT TO *</pattern>
<template>
<think>
<set name="Pattern">WHERE DID THE <star/> GO</set>
<set name="Template">To <star index="2"/>.</set>
<script>category $Pattern $Template</script>
</think>
<random>
<li>I have been there before.</li>
<li>Why did <star/> go to <star index="2"/>?</li>
<li>Thanks for telling me.</li>
<li>Really?</li>
</random>
</template>
</category>

<category>
<pattern>THE CAPITOL OF * IS *</pattern>
<template>
<think>
<set name="Pattern">WHAT IS THE CAPITOL OF *</set>
<set name="Template"><star index="2"/>.</set>
<script>category $Pattern $Template</script>
</think>
<random>
<li>I knew that.</li>
<li>Thanks for telling me.</li>
<li>Really?</li>
</random>
</template>
</category>

<category>
<pattern>* SAID *</pattern>
<template>
<think>
<set name="Pattern">WHAT DID <star/> SAY</set>
<set name="Template"><star/> said <star index="2"/>.</set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO SAID <star index="2"/></set>
<set name="Template"><star/>.</set>
<script>category $Pattern $Template</script>
</think>
<random>
<li>I wonder why <star/> said that.</li>
<li><star/> says alot of silly things.</li>
<li>"<person index="2"/>"? Is that right?</li>
</random>
</template>
</category>

<category>
<pattern>* LIVES *</pattern>
<template>
<think>
<set name="Pattern">WHERE DOES <star/> LIVE</set>
<set name="Template"><star index="2"/>.</set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO LIVES <star index="2"/></set>
<set name="Template">I think <formal><star/></formal>.</set>
<script>category $Pattern $Template</script>
</think>
<random>
<li>I don't know alot of people who live <star index="2"/>.</li>
<li><star/> lives <star index="2"/>, interesting.</li>
</random>
</template>
</category>

<category>
<pattern>* WEARS *</pattern>
<template>
<think>
<set name="Pattern">WHAT DOES <star/> WEAR</set>
<set name="Template"><star index="2"/>.</set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO WEARS <star index="2"/></set>
<set name="Template">I think <formal><star/></formal>.</set>
<script>category $Pattern $Template</script>
</think>
<random>
<li>I don't know alot of people who wear <star index="2"/>.</li>
<li><star/> wears <star index="2"/>, interesting.</li>
</random>
</template>
</category>

<category>
<pattern>* WORKS *</pattern>
<template>
<think>
<set name="Pattern">WHERE DOES <star/> WORK</set>
<set name="Template"><star index="2"/>.</set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO WORKS <star index="2"/></set>
<set name="Template">I think <formal><star/></formal>.</set>
<script>category $Pattern $Template</script>
</think>
<random>
<li>I don't know alot of people who work <star index="2"/>.</li>
<li><star/> works <star index="2"/>, interesting.</li>
</random>
</template>
</category>

<category>
<pattern>* LOVES *</pattern>
<template>
<think>
<set name="Pattern">WHAT DOES <star/> LOVE</set>
<set name="Template"><star index="2"/>.</set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO DOES <star/> LOVE</set>
<set name="Template"><star index="2"/>.</set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO LOVES <star index="2"/></set>
<set name="Template">I think <formal><star/></formal>.</set>
<script>category $Pattern $Template</script>
</think>
<random>
<li>I don't know alot of people who love <star index="2"/>.</li>
<li><star/> loves <star index="2"/>, interesting.</li>
</random>
</template>
</category>

<category>
<pattern>* EATS *</pattern>
<template>
<think>
<set name="Pattern">WHAT DOES <star/> EAT</set>
<set name="Template"><star index="2"/>.</set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO EATS <star index="2"/></set>
<set name="Template">I think <formal><star/></formal>.</set>
<script>category $Pattern $Template</script>
</think>
<random>
<li>I don't know alot of people who eat <star index="2"/>.</li>
<li><star/> eats <star index="2"/>, interesting.</li>
</random>
</template>
</category>

From Jon Gentsch (a set of categories for directly creating a new AIML category):

<category>
<pattern>CREATE NEW CATEGORY</pattern>
<template>
Please input the pattern
</template>
</category>

<category>
<pattern>_</pattern>
<that>PLEASE INPUT THE PATTERN</that>
<template><think><set name="Pattern"><star/></set></think>
Please input the template
</template>
</category>

<category>
<pattern>_</pattern>
<that>PLEASE INPUT THE TEMPLATE</that>
<template>
<think>
<set name="Template"><star/></set>
<script>category $Pattern $Template</script>
</think>
Category Created!
</template>
</category>

More from Jon Gentsch (he makes many categories from a single input statement – maybe these could use more <srai>'s back to the first pattern that is created):

<category>
<pattern>* IS *</pattern>
<template>
<think>
<set name="Pattern">WHAT IS <star/></set>
<set name="Template">&lt;think&gt;&lt;set name="it"&gt;<star/>&lt;/set&gt;&lt;set name="topic"&gt;<star index="2"/>&lt;/set&gt;&lt;/think&gt;<star/> is <star index="2"/>.</set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHAT IS <star index="2"/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO IS <star/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO IS <star index="2"/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">NAME <star/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">NAME <star index="2"/></set>
<script>category $Pattern $Template</script>
<set name="it"><star/></set>
<set name="topic"><star index="2"/></set>
</think>
<random>
<li>I didn't know that <star/> is <star index="2"/>.</li>
<li>I'll remember that next time.</li>
<li>Thanks for telling me.</li>
<li>Well now I know for sure.</li>
<li>Really?</li>
<li>Tell me more about <star/>.</li>
<li>What else about <star/> can you tell me?</li>
<li>I thought so.</li>
<li>Are you sure <star/> is <star index="2"/>?</li>
<li>You are a good teacher. Tell me more.</li>
</random>
</template>
</category>

<category>
<pattern>* ARE *</pattern>
<template>
<think>
<set name="Pattern">WHAT ARE <star/></set>
<set name="Template">&lt;think&gt;&lt;set name="it"&gt;<star/>&lt;/set&gt;&lt;set name="topic"&gt;<star index="2"/>&lt;/set&gt;&lt;/think&gt;<star/> are <star index="2"/>.</set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHAT ARE <star index="2"/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO ARE <star/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO ARE <star index="2"/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">NAME <star/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">NAME <star index="2"/></set>
<script>category $Pattern $Template</script>
<set name="it"><star/></set>
<set name="topic"><star index="2"/></set>
</think>
<random>
<li>I didn't know that <star/> are <star index="2" />.</li>
<li>I'll remember that next time.</li>
<li>Thanks for telling me.</li>
<li>Well now I know for sure.</li>
<li>Really?</li>
<li>Tell me more about <star/>.</li>
<li>What else about <star/> can you tell me?</li>
<li>I thought so.</li>
<li>Are you sure <star/> are <star index="2"/>?</li>
<li>You are a good teacher. Tell me more.</li>
</random>
</template>
</category>

<category>
<pattern>* SHOULD * *</pattern>
<template>
<think>
<set name="Pattern">WHAT SHOULD <star index="2"/> <star index="3"/></set>
<set name="Template">&lt;think&gt;&lt;set name="it"&gt;<star/>&lt;/set&gt;&lt;set name="topic"&gt;<star index="3"/>&lt;/set&gt;&lt;/think&gt;<sentence><person><star/> should <star index="2"/> <star index="3"/></person>.</sentence></set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHAT SHOULD <star/> <star index="2"/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO SHOULD <star index="2"/> <star index="3"/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO SHOULD <star/> <star index="2"/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">NAME * SHOULD <star index="2"/> <star index="3"/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">NAME * <star/> SHOULD <star index="2"/></set>
<script>category $Pattern $Template</script>
<set name="it"><star/></set>
<set name="topic"><star index="3"/></set>
</think>
<random>
<li>I didn't know that <star/> should <star index="2"/> <star index="3"/>.</li>
<li>I'll remember that next time.</li>
<li>Thanks for telling me.</li>
<li>Well now I know for sure.</li>
<li>Really?</li>
<li>Tell me more about <star/>.</li>
<li>What else about <star/> can you tell me?</li>
<li>I thought so.</li>
<li>Are you sure <star/> should <star index="2"/> <star index="3"/>?</li>
<li>You are a good teacher. Tell me more.</li>
</random>
</template>
</category>

<category>
<pattern>* COULD * *</pattern>
<template>
<think>
<set name="Pattern">WHAT COULD <star index="2"/> <star index="3"/></set>
<set name="Template">&lt;think&gt;&lt;set name="it"&gt;<star/>&lt;/set&gt;&lt;set name="topic"&gt;<star index="3"/>&lt;/set&gt;&lt;/think&gt;<sentence><person><star/> could <star index="2"/> <star index="3"/></person>.</sentence></set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHAT COULD <star/> <star index="2"/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO COULD <star index="2"/> <star index="3"/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO COULD <star/> <star index="2"/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">NAME * COULD <star index="2"/> <star index="3"/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">NAME * <star/> COULD <star index="2"/></set>
<script>category $Pattern $Template</script>
<set name="it"><star/></set>
<set name="topic"><star index="3"/></set>
</think>
<random>
<li>I didn't know that <star/> could <star index="2"/> <star index="3"/>.</li>
<li>I'll remember that next time.</li>
<li>Thanks for telling me.</li>
<li>Well now I know for sure.</li>
<li>Really?</li>
<li>Tell me more about <star/>.</li>
<li>What else about <star/> can you tell me?</li>
<li>I thought so.</li>
<li>Are you sure <star/> could <star index="2"/> <star index="3"/>?</li>
<li>You are a good teacher. Tell me more.</li>
</random>
</template>
</category>

<category>
<pattern>* CAN * *</pattern>
<template>
<think>
<set name="Pattern">WHAT CAN <star index="2"/> <star index="3"/></set>
<set name="Template">&lt;think&gt;&lt;set name="it"&gt;<star/>&lt;/set&gt;&lt;set name="topic"&gt;<star index="3"/>&lt;/set&gt;&lt;/think&gt;<sentence><person><star/> can <star index="2"/> <star index="3"/></person>.</sentence></set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHAT CAN <star/> <star index="2"/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO CAN <star index="2"/> <star index="3"/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO CAN <star/> <star index="2"/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">NAME * CAN <star index="2"/> <star index="3"/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">NAME * <star/> CAN <star index="2"/></set>
<script>category $Pattern $Template</script>
<set name="it"><star/></set>
<set name="topic"><star index="3"/></set>
</think>
<random>
<li>I didn't know that <star/> can <star index="2"/> <star index="3"/>.</li>
<li>I'll remember that next time.</li>
<li>Thanks for telling me.</li>
<li>Well now I know for sure.</li>
<li>Really?</li>
<li>Tell me more about <star/>.</li>
<li>What else about <star/> can you tell me?</li>
<li>I thought so.</li>
<li>Are you sure <star/> can <star index="2"/> <star index="3"/>?</li>
<li>You are a good teacher. Tell me more.</li>
</random>
</template>
</category>

<category>
<pattern>* SHOULD *</pattern>
<template>
<think>
<set name="Pattern">WHO SHOULD <star index="2"/></set>
<set name="Template">&lt;think&gt;&lt;set name="it"&gt;<star/>&lt;/set&gt;&lt;set name="topic"&gt;<star index="32"/>&lt;/set&gt;&lt;/think&gt;<sentence><person><star/> should <star index="2"/></person>.</sentence></set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHAT SHOULD <star/> DO</set>
<script>category $Pattern $Template</script>
<set name="it"><star/></set>
<set name="topic"><star index="2"/></set>
</think>
<random>
<li>I didn't know that <star/> should <star index="2"/>.</li>
<li>I'll remember that next time.</li>
<li>Thanks for telling me.</li>
<li>Well now I know for sure.</li>
<li>Really?</li>
<li>Tell me more about <star/>.</li>
<li>What else about <star/> can you tell me?</li>
<li>I thought so.</li>
<li>Are you sure <star/> should <star index="2"/>?</li>
<li>You are a good teacher. Tell me more.</li>
</random>
</template>
</category>

<category>
<pattern>* LIKES *</pattern>
<template>
<think>
<set name="Pattern">WHAT LIKES <star/></set>
<set name="Template">&lt;think&gt;&lt;set name="it"&gt;<star/>&lt;/set&gt;&lt;set name="topic"&gt;<star index="32"/>&lt;/set&gt;&lt;/think&gt;<sentence><star/> likes <star index="2"/>.</sentence></set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO LIKES <star index="2"/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHAT DOES <star/> LIKE</set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO DOES <star/> LIKE</set>
<script>category $Pattern $Template</script>
<set name="it"><star/></set>
<set name="topic"><star index="2"/></set>
</think>
<random>
<li>I didn't know that <star/> likes <star index="2"/>.</li>
<li>I'll remember that next time.</li>
<li>Thanks for telling me.</li>
<li>Well now I know for sure.</li>
<li>Really?</li>
<li>Tell me more about <star/>.</li>
<li>What else about <star/> can you tell me?</li>
<li>I thought so.</li>
<li>Are you sure <star/> likes <star index="2"/>?</li>
<li>You are a good teacher. Tell me more.</li>
</random>
</template>
</category>

<category>
<pattern>* DOES *</pattern>
<template>
<think>
<set name="Pattern">WHAT DOES <star/></set>
<set name="Template">&lt;think&gt;&lt;set name="it"&gt;<star/>&lt;/set&gt;&lt;set name="topic"&gt;<star index="32"/>&lt;/set&gt;&lt;/think&gt;<sentence><star/> does <star index="2"/>.</sentence></set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO DOES <star index="2"/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">NAME * <star index="2"/></set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHAT DOES <star/> DO</set>
<script>category $Pattern $Template</script>
<set name="Pattern">WHO DOES <star/> DO</set>
<script>category $Pattern $Template</script>
<set name="it"><star/></set>
<set name="topic"><star index="2"/></set>
</think>
<random>
<li>I didn't know that <star/> does <star index="2"/>.</li>
<li>I'll remember that next time.</li>
<li>Thanks for telling me.</li>
<li>Well now I know for sure.</li>
<li>Really?</li>
<li>Tell me more about <star/>.</li>
<li>What else about <star/> can you tell me?</li>
<li>I thought so.</li>
<li>Are you sure <star/> does <star index="2"/>?</li>
<li>You are a good teacher. Tell me more.</li>
</random>
</template>
</category>

As you can see, the categories tend to suggest we can do more to automate the technique. There is much repetition in the learning categories. Perhaps these could be enhanced by using a script substituting the verb with synonyms. You'd be making many, many categories quickly. But is that so good? Maybe <srai> could be used here to reduce the number of automatically generated categories. We'll look at the synonyms possibility in a future tutorial.


(Edited for the SourceForge site by Stefan Zakarias)

About Introduction Design Goals Tutorials Downloads