summaryrefslogtreecommitdiff
path: root/intellect-framework-from-internet/starts/meaning-vm/habit-starts/learning-parts.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'intellect-framework-from-internet/starts/meaning-vm/habit-starts/learning-parts.cpp')
-rw-r--r--intellect-framework-from-internet/starts/meaning-vm/habit-starts/learning-parts.cpp347
1 files changed, 347 insertions, 0 deletions
diff --git a/intellect-framework-from-internet/starts/meaning-vm/habit-starts/learning-parts.cpp b/intellect-framework-from-internet/starts/meaning-vm/habit-starts/learning-parts.cpp
new file mode 100644
index 0000000..85c92c9
--- /dev/null
+++ b/intellect-framework-from-internet/starts/meaning-vm/habit-starts/learning-parts.cpp
@@ -0,0 +1,347 @@
+#include "learning-parts.hpp"
+
+/*
+# "How do you think we could show better understanding of the things we are disregarding?"
+# "If we do understand these, can you help us? Do you know who can?"
+*/
+
+// idea of learning to keep well having more process time and
+// priority than risky behaviors
+
+/*
+idea of a secret group attacking a present group, and the attackers being
+the only channel to deal with it.
+ if we talk, we need nobody to _ever_ know this. the walls all have ears;
+ I was one of them. [from eastern half of continent where a targeted
+ activist was living alone]
+*/
+
+using namespace habitstarts;
+using namespace intellect::level2;
+
+// Propose:
+// everything that happens is passed to a set of common habits.
+// these habits categorize, summarize, and pass to relevent habits.
+// high level triggers are thus efficient, because they respond only
+// to the group that applies to them.
+// these habits must be learned.
+// when providing a trigger at a high level, provide a way to get examples
+// of what it should and should not trigger for. this provides for learning
+// how to do this.
+// the above looks like relevence to me. propose learning it.
+// to learn most effectively, apply to process of learning.
+// how do we adjust from success or from failure? need some attribute
+// of scenario to store for next time, to respond to differently.
+// so when we do something, we'll want to be able to store all information
+// needed to learn to improve.
+// we can include in this the meaning of a concept, and add language translation.
+// is this 'apple'? is this? yes, no. then pattern recognition could engage
+// triggers. later we'll want to propagate wrongness from failures.
+// likely we'll grow better if we use this on things before they have words.
+// // propose using random or exhaustive trial to find successes until habits develop
+// // and then using the same on possible structure matches of the data
+// // it may not work, we'll need to creatively grow data; reaonable start though
+
+static int __init = ([]()->int{
+
+ decls(link, source, type, target);
+ ahabit(link, ((source, s), (type, t), (target, dst)),
+ {
+ s.link(t, dst);
+ });
+
+ decls(linked, anything);
+ ahabit(linked, ((source, s), (type, t), (target, dst, anything)),
+ {
+ if (dst == anything) {
+ result = s.linked(t);
+ } else {
+ result = s.linked(t, dst);
+ }
+ });
+
+ decls(unlink);
+ ahabit(unlink, ((source, s), (type, t), (target, dst, anything)),
+ {
+ if (dst == anything) {
+ s.unlink(t);
+ } else {
+ s.unlink(t, dst);
+ }
+ });
+
+ decls(get, set);
+ ahabit(get, ((source, s), (type, t)),
+ {
+ result = s.get(t);
+ });
+
+ ahabit(set, ((source, s), (type, t), (target, dst)),
+ {
+ s.set(t, dst);
+ });
+
+ // we want the habits expressive enough to code efficiently in.
+
+ // constructors are tentatively abolished in the low-level habit language. (new-type-instance modifies, not creates)
+ // we have one constructor of concepts, and knowledge attachment to concepts.
+
+ decls(make, know, concept, is, group, already, in);
+ ahabit(make-concept, (),
+ {
+ result = a(concept);
+ });
+ ahabit(know-is, ((concept, c), (group, g)),
+ {
+ if (c.linked(is, group)) {
+ throw an(already-in-group).link
+ (habit, self,
+ "context", ctx,
+ concept, c,
+ group, g);
+ }
+ c.link(is, group);
+ result = c;
+ });
+
+ // separate habits and behaviors.
+ // behaviors are modifiable data run hy immutable habits.
+ // they use translation maps to move concepts between
+ // subhabits.
+ // translation map is just list of equivalent pairs
+
+ // note: lisp can self modify; would need wrapper
+ // constructors to make functions and lists into
+ // concepts.
+ // remember can google how to debug lisp
+ // opencog does concepts within lisp already, is
+ // heavyweight with few habita. just want goertzel's
+ // effort honored, he probably came up with it before
+ // I did.
+ // opencog has functions for pattern matching etc
+ // they arent self-modifiable, may not matter
+
+ //decls(ordered, behavior);
+ // need args and result for sequence
+ //ahabit(habit-sequence, ((
+
+ decls(list, nothing, next, previous, first, last, entry);
+ decls(add, to, until, each, item, remove, from, somewhere);
+
+ // list functiona are habits because ordered-behavior
+ // would use a list
+ // lists are being handled by providing a habit that
+ // can be engaged for every item. it responds to the item.
+ // i was thinking it could be better to respond to the next-link.
+ // these are roughly the same thing.
+ // when doing an ordered behavior we want to act in response to
+ // going to the next step, so we can decide to.
+ // this maps to the step list item. if result is to stop, list
+ // stops iteration.
+ // may want a more meaningful exploration of list. not sure
+ // list is mostly the [first-entry, last-entry, next, prev] structure
+ // can be handled innumerable ways.
+ // LIST STRUCTURE PROMISE
+ // should be a promise handled by habits? rather than
+ // a bunch of specific habits? but is ok for now
+ // is likely good for mind to discover
+ // promises and structures on its own
+ // but implementing them generally might speed dev up, dunno
+ ahabit(know-is-list, ((list, l)),
+ {
+ result = l;
+ (know-is)(l, list);
+ link(l, first-item, nothing);
+ link(l, last-item, nothing);
+ });
+ ahabit(know-is-list-entry, ((list-entry, l), (item, i), (previous, prev, nothing), (next, n, nothing)),
+ {
+ result = l;
+ (know-is)(l, list-entry);
+ link(l, item, i);
+ link(l, previous, prev);
+ link(l, next, n);
+ });
+ ahabit(list-first-item, ((list, l)),
+ {
+ result = get(l, first-item);
+ });
+ ahabit(list-last-item, ((list, l)),
+ {
+ result = get(l, last-item);
+ });
+ ahabit(list-entry-next, ((list-entry, i)),
+ {
+ result = get(i, next);
+ });
+ ahabit(list-entry-previous, ((list-entry, i)),
+ {
+ result = get(i, previous);
+ });
+ ahabit(list-entry-item, ((list-entry, e)),
+ {
+ result = get(e, item);
+ });
+
+ ahabit(list-add, ((list, l), (item, i)),
+ {
+ ref prev = (list-last-item)(l);
+ ref li = (know-is-list-entry)(
+ (make-concept)(),
+ item,
+ nothing,
+ prev);
+ li.link(item, i);
+ li.link(next, nothing);
+ li.link(previous, prev);
+
+ if (l.linked(first-item, nothing)) {
+ l.set(first-item, li);
+ l.set(last-item, li);
+ } else {
+ ref prev = l.get(last-item);
+ l.set(last-item, li);
+ prev.set(next, li);
+ }
+ });
+ ahabit(list-each-entry, ((list, l), (context, c), (action, act)),
+ {
+ ref cur = l.get(first-item);
+ while (cur != nothing && result == nothing) {
+ result = act(cur, c);
+ cur = cur.get(next);
+ }
+ });
+ // list-entry-remove could be pulled out
+ ahabit(list-remove, ((list, l), (item, i)),
+ {
+ result = (list-each-entry)(l, i,
+ ahabit(self-iter, ((list-item, i2), (remove-item, i)),
+ {
+ if (i2.get(item) == i) {
+ result = true;
+ ref prev = i2.get(previous);
+ ref n = i2.get(next);
+ if (prev != nothing) {
+ prev.set(next, n);
+ }
+ if (n != nothing) {
+ n.set(previous, prev);
+ }
+ i2.unlink(previous);
+ i2.unlink(next);
+ i2.unlink(item);
+ dealloc(i2); // hmm. we do have an active goal of making memory allocation be habit based. this might work here, though.
+ }
+ }));
+ });
+
+ using links_it = level0::baseref::links_t::iterator;
+ ahabit(populate-link-entry, ((link-entry, le)),
+ {
+ result = le;
+ auto & it = result.vget<links_it>();
+ if (it != result["source"].links().end()) {
+ result.set("type", it->first);
+ result.set("target", it->second);
+ } else {
+ result.unlink("type");
+ result.unlink("target");
+ }
+ });
+ ahabit(first-link-entry, ((concept, c)),
+ {
+ result = level1::alloc(level, c.links().begin());
+ result.set("source", c);
+ (populate-link-entry)(result);
+ });
+ ahabit(last-link-entry, ((concept, c)),
+ {
+ result = level1::alloc(level, --c.links().end());
+ result.set("source", c);
+ (populate-link-entry)(result);
+ });
+ ahabit(next-link-entry, ((link-entry, le)),
+ {
+ result = le;
+ ++result.vget<links_it>();
+ (populate-link-entry)(result);
+ });
+ ahabit(previous-link-entry, ((link-entry, le)),
+ {
+ result = le;
+ --result.vget<links_it>();
+ (populate-link-entry)(result);
+ });
+
+ /*
+ ahabit(happened-habit, ((happened, ev)),
+ {
+ if (!happened.linked(whenever-list)) { return; }
+
+ ref stub = a(event);
+ stub.set(event, ev);
+
+ (until-each-list-item-context-in-list)(action-whenever-happened, stub, happened.get(whenever-list));
+ });
+
+ ahabit(action-whenever-happened, ((list-item, li), (event, h)),
+ {
+ // here: when we trigger a behavior, we want information associated with producing the trigger,
+ // as well as the event that triggered. that's two contexts.
+
+ // list-item has item
+ // item has action and context
+ ref i = li.get(item);
+ // i think below we are proposing that handlers
+ // take one context, which is the one prepared
+ // in the list, then we inject our context
+ // into that, inside a "happened" property.
+
+ ref actctx = i.get(action-context);
+
+ actctx.set(happened, h);
+
+ i.get(action).fun<ref>()(actctx);
+ });
+
+ ahabit(whenever-habit, ((happens, ev), (action, act), (action-context, actctx)),
+ {
+ if ((action-context).linked(happened)) {
+ throw std::logic_error("happened on action-context");
+ }
+ if (!ev.linked(whenever-list)) {
+ ev.set(whenever-list, (make-list)(nothing));
+ }
+ ref list = ev.get(whenever-list);
+ // happens gets the list
+ ref item = a(whenever-action);
+ item.set(action, act);
+ item.set(action-context, actctx);
+
+ (add-to-list)(item, list);
+ // store ctx[action] on ctx[happens] as behavior to do
+ // store ctx[action-context] as context for behavior
+ // PROPOSE: automatically place [happened] inside [action-context] as a stub
+ // for call event objects, and then place [context] inside [happened].
+ // PROPOSE: report error if [action-context] contains [happened]
+ // as a stub for error patterns, it would be pretty nice to throw
+ // a unique concept ref for each error type. plan to add to level-0.
+ });
+
+ ahabit(stop-when-habit, ((action, act), (happens, ev)),
+ {
+ // remove doing ctx[action] for ctx[happens]
+ });
+
+ ahabit(once-habit, ((happens, ev), (action, act), (action-context, actctx)),
+ {
+ // takes ctx[action] and ctx[happens] and ctx[action-context]
+ // uses above habits to do the action only once, probably by using
+ // a trigger on the habit-happening habit to check if a label is set,
+ // and remove the habit if it is.
+ });
+ */
+
+ return 0;
+})();