One of the first examples of a network model of semantic memory is the Teachable Language Comprehender (TLC).[5] In this model, each node is a word, representing a concept (like "Bird"). With each node is stored a set of properties (like "can fly" or "has wings") as well as pointers (i.e., links) to other nodes (like "Chicken"). A node is directly linked to those nodes of which it is either a subclass or superclass (i.e., "Bird" would be connected to both "Chicken" and "Animal"). Thus, TLC is a hierarchical knowledge representation in that high-level nodes representing large categories are connected (directly or indirectly, via the nodes of subclasses) to many instances of those categories, whereas nodes representing specific instances are at a lower level, connected only to their superclasses. Furthermore, properties are stored at the highest category level to which they apply. For example, "is yellow" would be stored with "Canary", "has wings" would be stored with "Bird" (one level up), and "can move" would be stored with "Animal" (another level up). Nodes may also store negations of the properties of their superordinate nodes (i.e., "NOT-can fly" would be stored with "penguin"). This provides an economy of representation in that properties are only stored at the category level at which they become essential, that is, at which point they become critical features (see below). Processing in TLC is a form of spreading activation.[6] That is, when a node becomes active, that activation spreads to other nodes via the links between them. In that case, the time to answer the question "Is a chicken a bird?" is a function of how far the activation between the nodes for "Chicken" and "Bird" must spread, i.e., the number of links between the nodes "Chicken" and "Bird". The original version of TLC did not put weights on the links between nodes. This version performed comparably to humans in many tasks, but failed to predict that people would respond faster to questions regarding more typical category instances than those involving less typical instances.
---
https://www.fbi.h-da.de/fileadmin/personal/b.harriehausen/NLP/NLP_SS07/Quillian__TLC_.pdf
(The original paper.)
---
I've taken the same approach in my AI programs (subbot.org):
[17:50] trane: Greetings, anekant! Please be patient with me, sometimes I think for awhile. Also sometimes I get disconnected, but I'll be back in a minute. [17:50] anekant: hi [17:50] trane: Hi there. We're having some nice weather at the anus. [17:50] anekant: logicagent: how many factoids? [17:50] trane: I know 1991 factoids. [17:50] anekant: logicagent: reset graph [17:50] trane: Okay, I have reset the graph. [17:51] anekant: A bird can fly [17:51] trane: That's an old saw. [17:51] anekant: Birds = a bird [17:51] trane: I've lost the context, dude . Are we still on identify crigadeni? [17:51] anekant: logicagent: reset graph [17:51] trane: Okay, I have reset the graph. [17:51] anekant: Birds can fly. [17:51] trane: A bird can fly. [17:51] anekant: Birds includes a bird [17:51] trane: A bird in the upper region of the alimentary canal is the smallest quantity of a firearm. [17:52] anekant: A bird has wings [17:52] trane: A bird in the bush. [17:52] anekant: A chicken is a bird. [17:52] trane: Are all chickenbird?Are all chickenbird? [17:52] anekant: a bird is an animal [17:52] trane: That's an old saw. [17:52] anekant: A canary is yellow [17:53] anekant: a canary is a bird [17:53] trane: Aren't all canaryyellow? [17:53] trane: Are all canarybird? [17:53] anekant: A penguis can not fly [17:53] trane: A bird can fly. [17:53] anekant: A penguin can not fly [17:53] trane: A penguis can not fly. [17:54] anekant: Is a chicken a bird? [17:54] trane: Yes, a chicken is a bird. [17:54] anekant: can a penguin fly? [17:54] trane: Yes, a penguin can fly. [17:54] anekant: who said that? [17:54] trane: gagent said Yes, a penguin can fly. [17:54] anekant: gagent: stfu [17:54] trane: My threshhold is now 2, and my score_mod is 0. [17:54] anekant: can a penguin fly? [17:54] trane: Some of them can. [17:55] anekant: logicagent: can a penguin fly? [17:55] trane: No, a penguin can't fly. [17:55] anekant: can birds fly? [17:55] trane: Yes, birds can fly. [17:55] anekant: does a canary have wings? [17:55] trane: Yes, a canary has wings [17:55] anekant: can a canary fly? [17:55] trane: No, a canary can't fly. [17:55] anekant: who said that? [17:56] trane: logicagent said No, a canary can't fly. [17:56] anekant: why can't a canary fly? [17:56] trane: I can't find Why can't a canary fly? [17:56] anekant: logicagent: what is a canary? [17:56] trane: a canary is yellow, a bird, birds, an animal [17:56] anekant: can a bird fly? [17:56] trane: Some of them can. [17:56] anekant: logicagent: can a bird fly? [17:56] trane: No, a bird can't fly. [17:56] anekant: can birds fly? [17:57] trane: Yes, birds can fly. [17:57] anekant: birds includes a bird [17:57] trane: Is the holding of hands a symbolic gesture for humans? [17:57] anekant: birds = a bird [17:57] trane: In Soviet Russia, the bird =s YOU! [17:57] anekant: can a bird fly? [17:57] trane: No, a bird can't fly. [17:57] anekant: who said that? [17:57] trane: logicagent said No, a bird can't fly. [17:57] anekant: logicagent: print graph [17:57] trane: why can't a canary flies [17:57] trane: a chicken is a bird [17:57] trane: a canary is yellow [17:57] trane: a canary is a bird [17:57] trane: a penguis can not flies [17:57] trane: birds flies [17:57] trane: birds = a bird [17:57] trane: birds = birds [17:57] trane: a bird = birds [17:57] trane: a bird = a bird [17:57] trane: a bird has wings [17:57] trane: a bird is an animal [17:57] trane: a penguin can not flies [17:58] anekant: can a chicken fly? [17:58] trane: Some of them can. [17:58] anekant: who said that? [17:58] trane: alice said Some of them can. [17:58] anekant: that response sucked [17:58] trane: ... [17:58] anekant: can a chicken fly? [17:58] trane: Some of them can. [17:59] anekant: that response sucked! [17:59] trane: Okay I have added if response =~ /Some of them can./ then score -= 1 end. [17:59] anekant: can a chicken fly? [17:59] trane: No, a chicken can't fly. [17:59] anekant: who said that? [17:59] trane: logicagent said No, a chicken can't fly. [17:59] anekant: what is a chicken? [17:59] trane: a chicken is a bird, birds, an animal [18:00] anekant: can a bird fly? [18:00] trane: No, a bird can't fly. [18:00] anekant: can birds fly? [18:00] trane: Yes, birds can fly. [18:02] anekant: a bird = birds [18:02] trane: That's an old saw. [18:02] anekant: can a bird fly [18:02] trane: No, a bird can't fly. [18:03] anekant: what is a bird? [18:03] trane: a bird is birds, an animal [18:03] anekant: can an animal fly? [18:03] trane: No, an animal can't fly. [18:03] anekant: can a penguin fly? [18:03] trane: No, a penguin can't fly. [18:03] anekant: can a canary fly? [18:03] trane: No, a canary can't fly. [18:04] anekant: can canaries fly? [18:04] trane: No, canaries can't fly. [18:04] anekant: canaries = a canary [18:04] anekant: can canaries fly [18:04] trane: Are you really a "he"? [18:04] trane: No, canaries can't fly. [18:04] anekant: do canaries have wings? [18:04] trane: A bird has wings. [18:04] anekant: do canaries have wings? [18:04] trane: A bird has wings. [18:05] anekant: does a canary have wings? [18:05] trane: Yes, a canary has wings [18:05] anekant: why does a canary have wings? [18:05] trane: a canary has wings because: a canary is a bird, and a bird has wings [18:05] anekant: a bird can fly [18:05] trane: That's an old saw. [18:05] anekant: can a canary fly? [18:05] trane: Yes, a canary can fly. [18:05] anekant: can a chicken fly? [18:05] trane: Yes, a chicken can fly.
---
[This dialog is presented completely unedited; it is meant to show a real example of how I interact with my bot, complete with repetitions, etc., as I try to figure out why it's responding the way it is, and how to get it to learn what to answer how I want it to answer...]
As you can see, I'm jumping through some hoops to make the program answer some basic questions about the facts taught to it at the beginning of the dialog.
I need to modify the "a_can_fly" method (I think that's the name, I could find out by saying "Logicagent: show api" and hunting through the methods listed) so that it includes the "=" relation in its search path. I've done the same for "is X Y" questions: they search for paths from X to Y that are connected by edges labeled both with the "is" and "=" relation. However I haven't included "=" in the method that searches for paths with the "flies" relation. Unfortunately this is a change that I can't think how to do at runtime, while talking to the bot; I have to go into the program code and modify the "a_flies" (or whatever the name is) method, then restart the program (I can do the latter while the controller program is still running, telling it to "kill logic" and "start logic").
So, I have some more work to do before I can handle the wikipedia examples to my satisfaction...
---
Updated dialog: tlc2.txt. Changed the code in logicagent. Also added the "what has four legs" dialog...
---
Notes made while reading the "Teachable Language Comprehender" paper: tlc_notes.html