Acuitas Diary #11 (April 2018)
This month's big objective was to get
some use out of the sleep cycle that I implemented last month. I
re-purposed the question-generating process so that, while Acuitas is
sleeping, it roams the memory looking for redundant links and other
problems.
What's a redundant link? Now that
Acuitas has a bit of logical inference ability, some relationships in
the database imply others. So the retention of one piece of
information might be rendered unnecessary by the later addition of
some broader fact. Here are a few examples (I culled these from the
log that the memory crawler prints out):
The link (fang, has_purpose, bite) is
redundant because the link (tooth, has_purpose, bite) exists.
The link (father, has_item, child) is
redundant because the link (parent, has_item, child) exists.
The link (pot, can_have_qual, empty) is
redundant because the link (container, can_have_qual, empty) exists.
The link (baby, can_do_action, destroy)
is redundant because the link (human, can_do_action, destroy) exists.
Mopping up these unnecessary links
helps consolidate the information known, reduce the total size of the
database, and possibly make the memory visualization a little less
messy.
Eventually, I might want to refine this
process so that it doesn't necessarily remove every redundant link.
There could be some frequently-used shortcuts that justify their use
of storage space by improving search speed. One might want to tailor
the aggressiveness of the link-pruning based on the amount of storage
available … but that's all for later.
While working on this, I discovered
some other nasties that I'm calling “inheritance loops.”
Redundant links bloat the database but are otherwise harmless;
inheritance loops contain actual garbage information, introduced
either by learning bugs or by someone* telling Acuitas something
stupid.
*I'm the only person who talks to him
right now, so this means me.
Here's an example of an inheritance
loop:
cat <is-a> animal
animal <is-a> organism
organism <is-a> cat
Oops! Unless all these words are
synonyms, you know one of these triples is wrong. (I can't think, at
this point, of any cases in which I'd want to use circular
inheritance.) On his own, Acuitas doesn't know which. If the
crawler finds an inheritance loop, he might ask a user to confirm
those links when he's next awake and in conversation. If the user
contradicts one of the relationships, he'll break the corresponding
link, removing the loop.
I also moved generation of the memory
visualization into the sleep phase. Every so often, instead of
checking out more links, the process stops to compute a new layout
for all the dots, taking into account the latest modification of the
database. This is a fairly computation-intensive process, so it's
something I definitely don't want running when he's active. It used
to happen once when Acuitas was launched, which made for long startup
times and meant that the visualization might not get updated for
days.
Lastly, I put in some code to save
Acuitas' current state when the program is shut down. It also gets
automatically stored every so often, in case the program experiences
a hard crash that prevents the on-close routines from running.
Previously, on restart all the drives would reset to zero, any
current thoughts or recently generated questions would be discarded,
etc. Now all those things are preserved and reloaded when the
program starts up again, which gives him a bit more continuity, I
guess.
Recent memory map visualization (I
decided to go with a zoom this month):
Code base: 10459 lines
Words known: 1981
Concept-layer links: 5730