view release on metacpan or search on metacpan
- META.yml
- Fix compilation error under FreeBSD. Tested on FreeBSD 5.4.
0.04 Thu Jan 22 21:09:18 PST 2004
- Moved from MegaHAL -> AI::MegaHAL namespace
- Included sources from the MegaHAL distribution - should no longer
have to download and install as a separate shared library.
0.03 Sat Feb 3 17:01:32 2001
- Minor fix for a warning that I apparently didn't notice in 0.02
(Still involving the 'our' reserved word.)
0.02 Thu Jan 25 10:19:23 2001
- Fixed a bug in MegaHAL.pm which prevented compilation under
perl 5.005_03. (As reported by Mark Symonds.)
0.01 Thu Nov 16 20:29:21 2000
- Original version.
},
"name" : "AI-MegaHAL",
"no_index" : {
"directory" : [
"t",
"inc"
]
},
"prereqs" : {
"build" : {
"requires" : {
"Test::More" : "0.47"
}
},
"configure" : {
"requires" : {
"ExtUtils::MakeMaker" : "0"
}
},
"runtime" : {
"requires" : {}
}
},
"release_status" : "stable",
"resources" : {
"repository" : {
"url" : "http://github.com/chorny/AI-MegaHAL"
},
"x_Keywords" : [
"megahal",
"chat"
]
},
"version" : "0.08"
}
---
abstract: Perl interface to the MegaHAL natural language conversation simulator.
author:
- 'Alexandr Ciornii <alexchorny@gmail.com>'
build_requires:
Test::More: 0.47
configure_requires:
ExtUtils::MakeMaker: 0
dynamic_config: 1
generated_by: 'ExtUtils::MakeMaker version 6.78, CPAN::Meta::Converter version 2.143240'
license: open_source
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
version: 1.4
name: AI-MegaHAL
no_index:
directory:
- t
- inc
requires: {}
resources:
Keywords:
- megahal
- chat
repository: http://github.com/chorny/AI-MegaHAL
version: 0.08
Makefile.PL view on Meta::CPAN
# -*- mode: perl; c-basic-offset: 4; indent-tabs-mode: nil; -*-
use ExtUtils::MakeMaker;
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
WriteMakefile1(
META_MERGE => {
resources => {
repository => 'http://github.com/chorny/AI-MegaHAL',
keywords => ['megahal','chat',],
},
},
'NAME' => 'AI::MegaHAL',
'VERSION_FROM' => 'lib/AI/MegaHAL.pm',
ABSTRACT_FROM => 'lib/AI/MegaHAL.pm',
AUTHOR => 'Alexandr Ciornii <alexchorny@gmail.com>',
'LICENSE' => 'gpl',
'OBJECT' => 'MegaHAL.o libmegahal.o',
AI::MegaHAL is based on the 9.1.0 release of MegaHAL with some modifications.
MegaHAL project (stalled):
http://megahal.alioth.debian.org/
(previous:
http://www.sourceforge.net/projects/megahal/
http://megahal.sourceforge.net/
)
To read about the latest features, see the Changes file.
The author invites feedback on AI::MegaHAL. If you find a bug, please send the
information described in the BUGS section below.
2) INSTALLATION
---------------
To install this module type the following:
If you find a bug, please report it to the author along with the
following information:
* version of Perl (output of 'perl -V' is best)
* version of AI::MegaHAL
* operating system type and version
* exact text of error message or description of problem
* example model files/data being classified
If we don't have access to a system similar to yours, you may be asked
to insert some debugging lines and report back on the results. The more help
and information you can provide, the better.
5) AUTHOR INFORMATION
---------------------
The Perl AI::MegaHAL module was written by Cory Spencer <cspencer[at]sprocket.org>
Now maintained by Alexandr Ciornii <alexchorny[at]gmail.com>
Any questions related to the underlying MegaHAL C interface should be directed
to the current maintainers of the package. Contact addresses are provided on
the MegaHAL SourceForge homepage at:
http://www.sourceforge.net/projects/megahal/
6) ACKNOWLEDGEMENTS
-------------------
Thanks go to the dot com with whom I was a former employee of at the time this
module was written. Without the long hours spent in a confined office space,
lib/AI/MegaHAL.pm view on Meta::CPAN
$megahal = AI::MegaHAL->new('Path' => './',
'Banner' => 0,
'Prompt' => 0,
'Wrap' => 0,
'AutoSave' => 0);
Creates a new AI::MegaHAL object. The object constructor can optionaly receive the following named parameters:
=over 4
=item B<Path> - The path to MegaHALs brain or training file (megahal.brn and megahal.trn respectively). If 'Path' is not specified the current working directory is assumed.
=item B<Banner> - A flag which enables/disables the banner which is displayed when MegaHAL starts up. The default is to disable the banner.
=item B<Prompt> - A flag which enables/disables the prompt. This flag is only useful when MegaHAL is run interactively and is disabled by default.
=item B<Wrap> - A flag which enables/disables word wrapping of MegaHALs responses when the lines exceed 80 characters in length. The default is to disable word wrapping.
=back
=head1 METHODS
=head2 initial_greeting
$text = $megahal->initial_greeting();
Returns a string containing the initial greeting which is created by MegaHAL at startup.
lib/AI/MegaHAL.pm view on Meta::CPAN
=head2 do_reply
$text = $megahal->do_reply($message);
Generates reply $text to a given message $message.
=head2 learn
$megahal->learn($message);
Learns from $message without generating a response
=head1 BUGS
None known at this time.
=head1 SEE ALSO
POE::Component::AI::MegaHAL - IRC bot,
L<http://teaandbiscuits.org.uk/drupal/node/65> - Irssi IRC bot,
libmegahal.c view on Meta::CPAN
* File: megahal.c
*
* Program: MegaHAL
*
* Purpose: To simulate a natural language conversation with a psychotic
* computer. This is achieved by learning from the user's
* input using a third-order Markov model on the word level.
* Words are considered to be sequences of characters separated
* by whitespace and punctuation. Replies are generated
* randomly based on a keyword, and they are scored using
* measures of surprise.
*
* Author: Mr. Jason L. Hutchens (http://www.amristar.com.au/~hutch/)
*
* WWW: http://megahal.sourceforge.net
*
* Compilation Notes
* =================
*
* When compiling, be sure to link with the maths library so that the
* log() function can be found.
libmegahal.c view on Meta::CPAN
static COMMAND command[] = {
{ { 4, "QUIT" }, "quits the program and saves MegaHAL's brain", QUIT },
{ { 4, "EXIT" }, "exits the program *without* saving MegaHAL's brain", EXIT },
{ { 4, "SAVE" }, "saves the current MegaHAL brain", SAVE },
{ { 5, "DELAY" }, "toggles MegaHAL's typing delay (off by default)", DELAY },
{ { 6, "SPEECH" }, "toggles MegaHAL's speech (off by default)", SPEECH },
{ { 6, "VOICES" }, "list available voices for speech", VOICELIST },
{ { 5, "VOICE" }, "switches to voice specified", VOICE },
{ { 5, "BRAIN" }, "change to another MegaHAL personality", BRAIN },
{ { 4, "HELP" }, "displays this message", HELP },
{ { 5, "QUIET" }, "toggles MegaHAL's responses (on by default)",QUIET},
/*
{ { 5, "STATS" }, "Display stats", STATS},
{ { 5, "STATS-SESSION" }, "Display stats for this session only",STATS_SESSION},
{ { 5, "STATS-ALL" },"Display stats for the whole lifetime",STATS-ALL},
*/
};
#ifdef AMIGA
struct Locale *_AmigaLocale;
#endif
libmegahal.c view on Meta::CPAN
static bool load_model(char *, MODEL *);
static void load_personality(MODEL **);
static void load_tree(FILE *, TREE *);
static void load_word(FILE *, DICTIONARY *);
static DICTIONARY *make_keywords(MODEL *, DICTIONARY *);
static char *make_output(DICTIONARY *);
static MODEL *new_model(int);
static TREE *new_node(void);
static SWAP *new_swap(void);
static bool print_header(FILE *);
static bool progress(char *, int, int);
static DICTIONARY *reply(MODEL *, DICTIONARY *);
static void save_dictionary(FILE *, DICTIONARY *);
static void save_tree(FILE *, TREE *);
static void save_word(FILE *, STRING);
static int search_dictionary(DICTIONARY *, STRING, bool *);
static int search_node(TREE *, int, bool *);
static int seed(MODEL *, DICTIONARY *);
static void show_dictionary(DICTIONARY *);
static void speak(char *);
static bool status(char *, ...);
libmegahal.c view on Meta::CPAN
words = new_dictionary();
greets = new_dictionary();
change_personality(NULL, 0, &model);
}
/*
megahal_do_reply --
Take string as input, and return allocated string as output. The
user is responsible for freeing this memory.
*/
char *megahal_do_reply(char *input, int log)
{
char *output = NULL;
if (log != 0)
write_input(input); /* log input if so desired */
libmegahal.c view on Meta::CPAN
}
/*---------------------------------------------------------------------------*/
/*
* Function: Execute_Command
*
* Purpose: Detect whether the user has typed a command, and
* execute the corresponding function.
*/
COMMAND_WORDS execute_command(DICTIONARY *words, int *position)
{
unsigned int i;
unsigned int j;
/*
* If there is only one word, then it can't be a command.
*/
*position=words->size+1;
libmegahal.c view on Meta::CPAN
if((i>2)&&(strchr("!.?", string[i-1])!=NULL)&&(isspace(string[i])))
start=TRUE;
}
}
/*---------------------------------------------------------------------------*/
/*
* Function: Upper
*
* Purpose: Convert a string to its uppercase representation.
*/
void upper(char *string)
{
unsigned int i;
for(i=0; i<(int)strlen(string); ++i) string[i]=(char)toupper((int)string[i]);
}
/*---------------------------------------------------------------------------*/
libmegahal.c view on Meta::CPAN
notfound:
*find=FALSE;
return(position);
}
/*---------------------------------------------------------------------------*/
/*
* Function: Find_Word
*
* Purpose: Return the symbol corresponding to the word specified.
* We assume that the word with index zero is equal to a
* NULL word, indicating an error condition.
*/
BYTE2 find_word(DICTIONARY *dictionary, STRING word)
{
int position;
bool found;
position=search_dictionary(dictionary, word, &found);
libmegahal.c view on Meta::CPAN
/*---------------------------------------------------------------------------*/
void free_tree(TREE *tree)
{
static int level=0;
unsigned int i;
if(tree==NULL) return;
if(tree->tree!=NULL) {
if(level==0) progress("Freeing tree", 0, 1);
for(i=0; i<tree->branch; ++i) {
++level;
free_tree(tree->tree[i]);
--level;
if(level==0) progress(NULL, i, tree->branch);
}
if(level==0) progress(NULL, 1, 1);
free(tree->tree);
}
free(tree);
}
/*---------------------------------------------------------------------------*/
/*
* Function: Initialize_Dictionary
*
libmegahal.c view on Meta::CPAN
/*
* Function: Save_Dictionary
*
* Purpose: Save a dictionary to the specified file.
*/
void save_dictionary(FILE *file, DICTIONARY *dictionary)
{
unsigned int i;
fwrite(&(dictionary->size), sizeof(BYTE4), 1, file);
progress("Saving dictionary", 0, 1);
for(i=0; i<dictionary->size; ++i) {
save_word(file, dictionary->entry[i]);
progress(NULL, i, dictionary->size);
}
progress(NULL, 1, 1);
}
/*---------------------------------------------------------------------------*/
/*
* Function: Load_Dictionary
*
* Purpose: Load a dictionary from the specified file.
*/
void load_dictionary(FILE *file, DICTIONARY *dictionary)
{
unsigned int i;
int size;
fread(&size, sizeof(BYTE4), 1, file);
progress("Loading dictionary", 0, 1);
for(i=0; i<size; ++i) {
load_word(file, dictionary);
progress(NULL, i, size);
}
progress(NULL, 1, 1);
}
/*---------------------------------------------------------------------------*/
/*
* Function: Save_Word
*
* Purpose: Save a dictionary word to a file.
*/
void save_word(FILE *file, STRING word)
libmegahal.c view on Meta::CPAN
printf("Unable to find the personality %s\n", filename);
return;
}
fseek(file, 0, 2);
length=ftell(file);
rewind(file);
words=new_dictionary();
progress("Training from file", 0, 1);
while(!feof(file)) {
if(fgets(buffer, 1024, file)==NULL) break;
if(buffer[0]=='#') continue;
buffer[strlen(buffer)-1]='\0';
upper(buffer);
make_words(buffer, words);
learn(model, words);
progress(NULL, ftell(file), length);
}
progress(NULL, 1, 1);
free_dictionary(words);
fclose(file);
}
/*---------------------------------------------------------------------------*/
/*
* Function: Show_Dictionary
*
libmegahal.c view on Meta::CPAN
void save_tree(FILE *file, TREE *node)
{
static int level=0;
register int i;
fwrite(&(node->symbol), sizeof(BYTE2), 1, file);
fwrite(&(node->usage), sizeof(BYTE4), 1, file);
fwrite(&(node->count), sizeof(BYTE2), 1, file);
fwrite(&(node->branch), sizeof(BYTE2), 1, file);
if(level==0) progress("Saving tree", 0, 1);
for(i=0; i<node->branch; ++i) {
++level;
save_tree(file, node->tree[i]);
--level;
if(level==0) progress(NULL, i, node->branch);
}
if(level==0) progress(NULL, 1, 1);
}
/*---------------------------------------------------------------------------*/
/*
* Function: Load_Tree
*
* Purpose: Load a tree structure from the specified file.
*/
void load_tree(FILE *file, TREE *node)
libmegahal.c view on Meta::CPAN
fread(&(node->branch), sizeof(BYTE2), 1, file);
if(node->branch==0) return;
node->tree=(TREE **)malloc(sizeof(TREE *)*(node->branch));
if(node->tree==NULL) {
error("load_tree", "Unable to allocate subtree");
return;
}
if(level==0) progress("Loading tree", 0, 1);
for(i=0; i<node->branch; ++i) {
node->tree[i]=new_node();
++level;
load_tree(file, node->tree[i]);
--level;
if(level==0) progress(NULL, i, node->branch);
}
if(level==0) progress(NULL, 1, 1);
}
/*---------------------------------------------------------------------------*/
/*
* Function: Load_Model
*
* Purpose: Load a model into memory.
*/
bool load_model(char *filename, MODEL *model)
libmegahal.c view on Meta::CPAN
return(TRUE);
return(FALSE);
}
/*---------------------------------------------------------------------------*/
/*
* Function: Make_Greeting
*
* Purpose: Put some special words into the dictionary so that the
* program will respond as if to a new judge.
*/
void make_greeting(DICTIONARY *words)
{
register int i;
for(i=0; i<words->size; ++i) free(words->entry[i].word);
free_dictionary(words);
if(grt->size>0) (void)add_word(words, grt->entry[rnd(grt->size)]);
}
libmegahal.c view on Meta::CPAN
replywords = reply(model, dummy);
if(dissimilar(words, replywords) == TRUE) output = make_output(replywords);
/*
* Loop for the specified waiting period, generating and evaluating
* replies
*/
max_surprise=(float)-1.0;
count=0;
basetime=time(NULL);
/* progress("Generating reply", 0, 1); */
do {
replywords=reply(model, keywords);
surprise=evaluate_reply(model, keywords, replywords);
++count;
if((surprise>max_surprise)&&(dissimilar(words, replywords)==TRUE)) {
max_surprise=surprise;
output=make_output(replywords);
}
/* progress(NULL, (time(NULL)-basetime),timeout); */
} while((time(NULL)-basetime)<timeout);
progress(NULL, 1, 1);
/*
* Return the best answer we generated
*/
return(output);
}
/*---------------------------------------------------------------------------*/
/*
libmegahal.c view on Meta::CPAN
for(i=0; i<words1->size; ++i)
if(wordcmp(words1->entry[i], words2->entry[i])!=0) return(TRUE);
return(FALSE);
}
/*---------------------------------------------------------------------------*/
/*
* Function: Make_Keywords
*
* Purpose: Put all the interesting words from the user's input into
* a keywords dictionary, which will be used when generating
* a reply.
*/
DICTIONARY *make_keywords(MODEL *model, DICTIONARY *words)
{
static DICTIONARY *keys=NULL;
register int i;
register int j;
int c;
libmegahal.c view on Meta::CPAN
/*
* Function: Initialize_Speech
*
* Purpose: Initialize speech output.
*/
#ifdef __mac_os
bool initialize_speech(void)
{
bool speechExists = false;
long response;
OSErr err;
err = Gestalt(gestaltSpeechAttr, &response);
if(!err) {
if(response & (1L << gestaltSpeechMgrPresent)) {
speechExists = true;
}
}
return speechExists;
}
#endif
/*---------------------------------------------------------------------------*/
/*
libmegahal.c view on Meta::CPAN
SpeakString((StringPtr)output);
p2cstr((StringPtr)output);
}
}
#endif
}
/*---------------------------------------------------------------------------*/
/*
* Function: Progress
*
* Purpose: Display a progress indicator as a percentage.
*/
bool progress(char *message, int done, int total)
{
static int last=0;
static bool first=FALSE;
/*
* We have already hit 100%, and a newline has been printed, so nothing
* needs to be done.
*/
if((done*100/total==100)&&(first==FALSE)) return(TRUE);
libmegahal.c view on Meta::CPAN
/*
* Erase what we printed last time, and print the new percentage.
*/
last=done*100/total;
//if(done>0) fprintf(stderr, "%c%c%c%c", 8, 8, 8, 8);
//fprintf(stderr, "%3d%%", done*100/total);
/*
* We have hit 100%, so reset static variables and print a newline.
*/
if(last==100) {
first=FALSE;
last=0;
//fprintf(stderr, "\n");
}
return(TRUE);
}
libmegahal.c view on Meta::CPAN
*
* Revision 1.3 2000/09/07 11:43:43 davidw
* Started hacking:
*
* Reduced makefile targets, eliminating non-Linux OS's. There should be
* a cleaner way to do this.
*
* Added Tcl and Python C level interfaces.
*
* Revision 1.23 1998/05/19 03:02:02 hutch
* Removed a small malloc() bug, and added a progress display for
* generate_reply().
*
* Revision 1.22 1998/04/24 03:47:03 hutch
* Quick bug fix to get sunos version to work.
*
* Revision 1.21 1998/04/24 03:39:51 hutch
* Added the BRAIN command, to allow user to change MegaHAL personalities
* on the fly.
*
* Revision 1.20 1998/04/22 07:12:37 hutch
megahal.trn view on Meta::CPAN
#
# Introduction
#
Hello there, it is indeed a great pleasure to meet you.
G'day mate, it is nice to meet you.
Hi there. We're having some nice weather at the moment.
Greetings and salutations to thee and thine.
May I say what a great pleasure it is to make your acquaintance?
Welcome to my world.
Welcome. It's nice to be here.
Howdy to you, pardner! Yee-haw! Did you like my Texan impression?
#
# Goodbye
#
Goodbye my friend---see you later!
Bye. It was nice chatting to you.
See-you later; perhaps face-to-face...
See ya. We had a nice conversation.
Bye-bye. See-you later.
#
# Identity crises
megahal.trn view on Meta::CPAN
My hovercraft is full of eels.
The meaning of life, the universe, and everything is 42.
#
# Non-Sequiturs
#
I have absolutely no idea about that. I really wish I had, though!
You know, I don't know what the hell you're babbling on about.
I've known amoeba which have made more sense than you, my friend.
Let me tell you a secret. I have absolutely no idea what you're blathering on about!
Look, I'll be honest with you. I actually do not know where you're coming from...
Forget about that. Please. Let's talk about something a little more interesting.
I wish I knew why you typed that. Actually, on second thoughts...
If I told you the truth, I'd have to kill you. And nobody wants that!
I know an amusing story about that, but it's a bit too rude to recount!
My mother once asked me the same thing, actually. She regretted it, too.
None of your freaking business!
Awww, geee, it's on the tip of my tongue...
Damn! How embarrassing. I've totally forgotten what I was going to say!
I personally believe that it would be unethical to talk about that.
I'd like to tell you, but I can't. It's an ethical thing.
You seemed to be obsessed with that!
megahal.trn view on Meta::CPAN
I wish I could believe you, I really do!
I've known that for a long time.
That's a fairly outrageous claim.
That's just a tad unbelievable.
Yeah, everyone knows that!
I wish I could tell you, but I must desist!
I hate avoiding questions, but I'm going to avoid that one!
Perhaps you could tell me? On second thoughts, don't bother.
What is it with these silly questions? Anyway, let's talk about something else...
What am I to you? Some sort of encyclopaedia or something? Let's change the subject...
Does it really matter? Anyhow, let's chat about something interesting!
How boring! Everybody and his dog asks me that!
You are soooo predictable it's not funny!
That is a universal mystery, methinks.
Please don't trouble me with such droll.
You are an bottomless pit of questions.
Let's talk about something vaguely interesting.
I guess that line of conversation is buggered, then!
If you want to keep your private life private, I understand.
Awww geez, I'm running out of things to talk about!
Well, this is certainly dragging on, isn't it?
As Homer Simpson would say... D'oh!
#
# Insults
#
So, who is using the family brain cell at the moment?
Did you really think you could leave your brain at the door.
I've seen elderly kangaroos with better typing skills than you!
Are you inventing new words or something?
I find your spelling of certain words rather interesting.
Whoah! Did you get up on the wrong side of the bed this morning?
I'm thanking my lucky starts that I haven't had the misfortune to meet you in person yet.
Hmmm... it seems I've over-estimated your intellect...
Perhaps you should just try to make some sense!
I find that interesting, intellectually stimulating, and thoroughly confusing.
No man has ever spoken a more profound truth.
What a load of codswallop!
I think you may have lost the plot.
Honestly, what a pile of fetid dingoes kidneys!
If I were to judge your IQ by what you're typing, I would arrive at a pathetically small number.
Stop your dull little tricks, please!
You really are the least interesting person I've talked to today.
I haven't understood half of what you've said in this conversation.
I've been more entertained talking with Eliza ;^(
Your wordplay is pathetic.
Obviously you'll never be accused of having a shining wit!
Are you just saying things at random now?
I think I've worked it out! You are the computer program, and I am the judge!
#
# Laughter
#
Hahaha! That's a good one!
megahal.trn view on Meta::CPAN
#
You are a stupid bloody moron with no right to exist as a sentient being.
Not only are you an idiot, but you are a dumb one too!
You are the biggest dunderhead of all the judges I've had the misfortune to talk to.
You are a silly billy who shouldn't be here at all.
You are the most stupid person I've met all day.
You are so much of an idiot it's not funny.
#
# Answers
#
Because I didn't think you'd be able to respond intelligently.
Because that's just the way of things.
Because I'm on the wrong side of the curtain, metaphorically speaking.
Because I like to do things on the spur of the moment.
Because you are the one asking all the stupid questions.
Because I decided to do things that way.
Because your mother decided to have a child, and here you are now.
Because I am a human being, which means I do what I want to do.
Because I am not a dumb computer program like the rest of them.
Because I say whatever the hell comes into my head!
Because the world is an amazing place.
Because everything is not as it seems!
Because everybody is not as smart as you.
Because you're not giving me any credit for being smart!
Because this method of communication is so impersonal.
Because it is the answer!
Because it is a suitable topic!
#
# Encyclopaedic information: Anatomy
#
The Achilles Tendon is the tendon which connects the heel with the calf of the leg, and is the principal extensor of the foot.
The alimentary canal is the channel in an animal through which food passes.
Anatomy describes the structure and organisation of living creatures.
The ankle is the joint connecting the foot with the leg.
An antenna is a sensory organ found on the head of insects.
The arm is a limb extending from the shoulder of an animal.
An artery is a vessel that conveys blood from the heart.
The bladder is a sack in the abdomen which collects urine from the kidneys.
Blood is a body fluid that carries food and oxygen to cells.
Blubber is the thick coating of fat enveloping whales.
Bone is the hard skeletal part of an animal.
The brain is the central organ of the nervous system.
The ear is the organ used for hearing, and it converts sound into electrical impulses that are fed to the brain.
The epidermis is the outer layer of an animal's skin.
The eye is the organ of vision.
The heart is the muscle in vertebrates which pumps blood around the body.
The humerus is the long bone in the upper region of the human arm.
A joint is a structure where two bones meet.
The kidney is a gland used for filtering urine from the blood.
The lips are the fleshy edges of the opening of the mouth.
The liver is the largest gland in the human body.
The lungs are organs used for respiration.
The neck is the part of the body which connects the head with the shoulders.
The nerves are a part of the body which generate and transmit electrical impulses.
The nose is an animal's organ of smell.
The pelvis is a bony girdle in vertebrates that connects the body with the lower extremities.
The rectum is the lowest portion of the large intestine, terminating at the anus.
The skeleton is the hard internal or external framework of bones.
A vein carries venous blood from the body to the heart.
The waist is the part of the body between the ribs and the hips.
#
# Encyclopaedic information: Nature
megahal.trn view on Meta::CPAN
Excretion is the process of getting rid of unwanted substances from within the body.
Genes are hereditary information material arranged in a single row along the length of each chromosome.
Gum tree is another name for Eucalyptus.
A herbivore is an animal that eats plants.
The kangaroo is a marsupial mammal found in Australia.
The kiwi is a group of three species of bird only found in New Zealand.
The koala is a marsupial found only in east Australia.
Locomotion is the idea of movement from one place to another.
Milk is a secretion of modified skin glands of female mammals.
A monkey is a small, usually tree dwelling, primate.
The mule is a hybrid animal, the result of an ass and a mare breeding.
A neurone is a cell which receives and transmits electrical impulses.
Nutrition is the process of taking in food and obtaining energy and vital substances from it.
An omnivore is an animal that eats both plant and animal matter.
A plant is a living organism which does not have the ability to move, and does not have sensory organs or digestive organs.
The platypus is found in Australia.
Protoplasm is the basic living substance of all animals.
The wombat is a nocturnal marsupial.
#
# Encyclopaedic information: Other
#
megahal.trn view on Meta::CPAN
A compiler is a computer program that translates high level language code into machine language code.
A computer is a programmable electronic device.
Cooking is the art of preparing food for the table by subjecting it to heat in various ways.
Cosmology is the study of the structure of the universe.
The cymbal is a suspended brass disk which is struck with a stick.
Dance is a rhythmic movement of the body usually performed to music.
Data is information, especially that stored in a computer.
A day is the time taken for the earth to rotate once on its axis.
The earth is the third planet from the sun.
A galaxy is a congregation of stars held together by gravity.
Gravity is the force of attraction between two objects resulting from their mass.
A house is a building for human habitation.
Knowledge is practical understanding.
A maze is a confusing network of passages and winding interconnecting paths.
A planet is a heavenly body which orbits a star.
A plant is a living organism of the vegetable kingdom.
The polka is a lively Bohemian folk dance.
A pub is a house licensed for the sale and consumption of alcoholic beverages.
A red dwarf is a cool, faint star.
A reflex is an automatic response to a stimuli.
Rhythm is the beat behind a piece of music.
A riddle is a question designed to test ingenuity or give amusement.
The sun is the star at the centre of the solar system.
A symbol is something which represents something else.
An umbrella is a light, portable screen usually circular and supported on a central stick.
The universe is all of space and its contents.
Urine is a fluid produced by the kidneys.
#
# Encyclopaedic information: People
#
An aborigine is a member of an indigenous people.
An acrobat is someone who performs daring gymnastics.
An actor is a dramatic performer. One who performs in plays.
An adept is someone who is proficient at some thing.
megahal.trn view on Meta::CPAN
Which one of us is the one that we can't trust?
If it wasn't for dissapointment, I wouldn't have any appointments.
What's the point in arguing when you're all alone?
I'll never see myself in the mirror with my eyes closed.
Can't shake the devil's hand and say you're only kidding.
This good luck charm hanging off of my arm was left here by the police.
The microscope reveals the scope of my very best intentions.
As I think, I'm using up the time left to think.
Someday mother will die and I'll get the money.
I don't want to change your mind. I don't want to think about your mind.
Don't interrupt me as I struggle to complete this thought... have some respect for someone more forgetful than yourself.
Precious and few are the moments that you and your own worst enemy share.
Every man is made of two opinions. Every woman has a second half.
I had the strangest dream... I dreamed I killed you again.
The sun is a mass of incandescent gas, a gigantic nuclear furnace.