summaryrefslogtreecommitdiff
path: root/intellect-framework-from-internet/starts/bagel/nascent6.js
diff options
context:
space:
mode:
Diffstat (limited to 'intellect-framework-from-internet/starts/bagel/nascent6.js')
-rw-r--r--intellect-framework-from-internet/starts/bagel/nascent6.js461
1 files changed, 0 insertions, 461 deletions
diff --git a/intellect-framework-from-internet/starts/bagel/nascent6.js b/intellect-framework-from-internet/starts/bagel/nascent6.js
deleted file mode 100644
index d7241ba..0000000
--- a/intellect-framework-from-internet/starts/bagel/nascent6.js
+++ /dev/null
@@ -1,461 +0,0 @@
-// This file was WIP, two prongs were being pursued at once when work was halted.
-
-// Meaning Representation
-class Property {
- constructor(type, dest) {
- this.type = type
- this.dest = dest
- }
-}
-class Properties {
- // members are all Usage Simplification defining Promise Spec
- constructor(type, from) {
- this.props = from ? from.props.slice() : []
- //if (from) {console.log('INHERIT: '); for (let prop of this.props) { console.log(prop) }}
- this.add('is', type)
- }
- toString() {
- let str = ''
- for (let prop of this.props) {
- str += prop.type + ':' + prop.dest + ' '
- }
- return str
- }
- add(type, dest) {
- this.props.push(new Property(type, dest))
- }
- // recommend hoisting variables when designing them, so they don't match everything
- has(type, dest) {
- for (let p of this.props)
- if ((p.type == type || isVar(type))
- && (p.dest == dest || isVar(dest)))
- return true
- return false
- }
- del(type, dest) {
- for (let i = 0; i < this.props.length; ++ i) {
- let p = this.props[i]
- if (p.type == type && p.dest == dest) {
- this.props.splice(i, 1)
- return true
- }
- }
- return false
- }
- get(type) {
- let result = null
- for (let i = 0; i < this.props.length; ++ i) {
- let p = this.props[i]
- if (p.type == type) {
- if (result) throw new Error('get on multiply defined property')
- result = p.dest
- }
- }
- return result
- }
- hasIsVar() {
- return this.has('is','variable')
- }
-}
-class AbstractData {
- constructor(from) {
- this.props = new Properties('abstract', from && from.props)
- }
-}
-class StringData extends String {
- constructor(str, from) {
- super(str)
- this.props = new Properties('string', from && from.props)
- this.props.del('is', 'array')
- }
-}
-class ArrayData extends Array {
- constructor(arr, from) {
- super(...arr)
- this.props = new Properties('array', from && from.props)
- this.props.del('is', 'string')
- }
-}
-
-// Meaning Representation
-class Var extends StringData {
- constructor(name){
- super(name)
- props.add('is','variable')
- }
- // recommend e.g. 'is','variable-rep' when code is designing them, so don't match everything
- // opencog uses a 'quote' wrapper to cause this, sounds more general
-}
-function isVar(x) {
- return x.props && x.props.has('is','variable')
-}
-const ONE = StringData('one')
-const MANY = StringData('many')
-const VAR_X = new Var('X')
-
-// MEMORY
-// the archivist. Provides for needs of data. Memory is relevent whenever there is
-// an informational need.
-//
-// When remembering steps, likely what is relevent is what is needed to reach the goal
-// Here's a possible step memory.
-//
-// let ret = new StringData('labeled ' + items.length + ' text-string')
-// ret.props.add('is','step-memory')
-// ret.props.add('step',genproptextstring)
-// ret.props.add('ram',ram)
-// ret.props.add('count',items.length)
-// for (let a of items)
-// ret.props.add('item', a)
-
-class ActiveMemory extends ArrayData {
- // although Memory is eventually a module that provides for stored information needs
- // this class is just a group of concepts, moved in and out as needed
- constructor(items, from) {
- super(items || [], from)
- this.props.add('is','working-ram')
- }
- clone() {
- return new ActiveMemory(this, this);
- }
- add(...items) {
- //if (this.cloned) { this = this.slice(); this.cloned = false; }
- for (let item of items)
- this.push(item)
- }
- del(...items) {
- //if (this.cloned) { this = this.slice(); this.cloned = false; }
- for (let item of items) {
- let index = this.indexOf(item)
- this.splice(index, 1)
- }
- }
- contains(...items) {
- for (let item of items)
- if (this.indexOf(item) === -1) return false
- return true
- }
- containsWith(...props) {
- let ret = []
- outer: for (let a of this) {
- for (let i = 0; i < props.length; i += 2)
- if (! a.props.has(props[i], props[i+1]))
- continue outer
- return true
- }
- return false
- }
- getWith(...props) {
- let ret = []
- outer: for (let a of this) {
- //console.log(a.props.props)
- for (let i = 0; i < props.length; i += 2) {
- //console.log(props[i] + ': ' + props[i+1] + '?')
- if (! a.props.has(props[i], props[i+1]))
- continue outer
- }
- ret.push(a)
- }
- if (ret.length > 0) return ret
- return null
- }
-}
-// note: for now we produce only data; state-changes are data-changes
-// TODO: this class has methods. turn them into promise-meeting-habits. a promise is a spec for behavior, e.g. how data is stored. this spec can be interpeted by a more general habit.
-class FunctionData {
- constructor(name, // name of function
- func, // function taking ordered needs
- // ordered array of made objects is returned
- needs, // array of 1-property-per-object this function requires
- makes // array of 1-property-per-object this function produces
- ) {
- this.name = name
- this.props = new Properties('function')
- this.props.add('name', name)
- this.call = func
- // If needed, make atomspace-like pattern structures for needs/makes.
- // - represent multiple properties on 1 needed object
- // - represent input objects present in output
- this.needs = needs
- this.makes = makes
- }
- makesFrom(ram) { // what we make with the ram
- // match needs
-
- // TODO: improve from just picking 1. preferably with relevence.
- for (let i = 0; i < this.needs.length; i += 2) {
- if (isVar(this.needs[i]) || isVar(this.needs[i+1])) {
- // iterate all other options with this? just pick 1?
- // STUB
- } else {
- if (!ram.containsWith(this.needs[i], this.needs[i+1]))
- return []
- }
- }
- // fill variables STUB
- }
- // say I want would-meet apple
- // and I have needs apple
- // the easiest way to find this is to fill the needs in with what I have
-}
-
-// variables:
-// - create a place to store a value
-//createvar = new FunctionData(
-// 'createvar',
-// /*call*/(name) => {
-// let ret = new StringData(name)
-// ret.props.add('is','varspec')
-// return ret
-// },
-// /*relevence*/,
-//// when do you want to create a variable? when you need a variable and you have a name
-// /*makes*/
-//)
-// - place a value in such a place
-// - retrieve a value from such a place
-// data-structures: (these are like promises of what to do and how to use something)
-// - make a class definition (collection of variables)
-// - initialize an object
-// - set/retrieve properties (variables)
-// flow:
-// - trigger a different step than the next, conditionally
-// procedures:
-// - collect a set of behaviors together
-// - trigger a collected set of behaviors and continue
-// expressions:
-// - evaluate arithmetic on variables and constants
-
-// sometimes how we get what we need depends on what we have
-line2words = new FunctionData(
- 'line2words',
- (line) => { // call
- let res = new ArrayData(line.split(' '), line)
- res.props.add('is','words')
- res.props.del('is','text-string')
- return res
- },
- ['is','text-string'], // needs
- ['is','word-array'] // makes
-)
-
-// makes text-string used by line2words. example of small relevence habit
-genproptextstring = new FunctionData(
- 'genproptextstring',
- /*call*/(text) => {
- if (text.props.has('is','string')) {
- if (!text.props.has('is','text-string')) {
- text.props.add('is','text-string')
- }
- return text
- }
- return null
- },
- /*needs*/['is','text'],
- /*makes*/['is','text-string']
-)
-
-respondhello = new FunctionData(
- 'respondhello',
- (words) => { // call
- console.log(words[0] + " world!")
- let res = new StringData("said " + words[0])
- res.props.add('is','output')
- res.props.add('is','text')
- return res
- },
- ['is','hello-input'], // needs
- ['is','output'] // makes
-)
-
-genprophelloinput = new FunctionData(
- 'genprophelloinput',
- /*call*/(input) => {
- if (!input.props.has('is','words'))
- return null
- if (!input.props.has('is','hello-input')) {
- let x = input[0].toLowerCase()
- let c = x[x.length-1]
- if (c == ',' || c == '!' || c == '.') x = x.slice(0,x.length-1)
- if (x != 'hello' && x != 'hi') return null
- input.props.add('is','hello-input')
- }
- return input
- },
- /*needs*/['is','input'],
- /*makes*/['is','hello-input']
-)
-
-/* old, this isn't relevent to needed structure
-// nodejs is missing a succinct read-line-from-stdin function. make our own.
-userinput = (() => {
- const readline = require('readline')
- const lines = []
- readline.createInterface({ input: process.stdin }).on('line', (line) => {
- lines.push(line)
- })
-
- let ret = new FunctionData(
- 'userinput',
- (self) => { // call
- let res = new StringData(lines.shift())
- res.props.add('is','text')
- res.props.add('is','input')
- return res
- },
- () => { // relevence
- return lines.length > 0
- },
- ['has','userinput-lines'] // needs
- ['is','string','is','text','is','input'] // makes
- )
- ret.lines = lines
-})()
-genprophaslines = new FunctionData(
- 'genprophaslines',
- (userinput) => { // call
- }
-)
-*/
-
-// PATTERN REQUEST: we want to be able to store needed-steps.
-// needed-steps are parallel needs that are needed for a helpful step
-// any one may be met, and others are ignored once one is, but all are generated at once
-// habits that meet needs expect them not to be inside an array and have no way of referring to that.
-// [AND needs can be collapsed, but OR needs need patterns]
-// [how do we pull a need out of the list?]
-
-// is it useful to use as a need the memory generated by a habit?
-
-// make a habit that plans core behavior
-findstepsfor = new FunctionData(
- 'findstepsfor',
- /*call*/(need, depth) => {
- // find a habit that does the final goal.
- // TODO: for now we assume all needs are 'is' and store just what-it-is in the need string. when doesn't work anymore, make type-getters on Properties to retrieve the need details
- let ret = new ArrayData([])
- for (let habit of all_parts) {
- if (habit.makes.indexOf(need) !== -1) {
- // found a workable habit
- ret.push(habit.needs)
- }
- }
- ret.props.add('is','alternate-needs-array')
- return ret
- },
- // TODO: likely need more structure here
- // warning: MANY adds surrounding code complexity. please put makes-interpretation in a habit if MANY is used. <- let's just put this in the class constructor for now
- /*needs*/['needs', VAR_X],
- /*makes*/[MANY, 'would-meet', VAR_X]
- // really we are usually met due to the need to meet a goal
- // and the need to have steps to meet that particular goal
- // how do we write a need that supports another need
- //
- // propose relevence is a list of reasons each with a strength, and greatest sum is chosen
- // HABIT/ACTIVE BEHAVIOR wants relevent-met-habits, to act on
- // PLANNING/GOAL BEHAVIOR wants relevent-unmet-needs to backtrace them towards relevent-met-needs
- //
- // we can meet any need with behavior, but it takes time.
- // [we are ignoring most of karl's needs]
- // [the reason is that an AI can meet them all]
- // AI meets some needs
- // AI is ongoing
- // therefore we are working on meeting
- // ONE: we have a need for actively pursuing relevent needs
- // TWO: we need appropriate multitasking
- // AI is long term, so would happen after [quickly-]meetable-needs are met.
- //
- // make popcorn
- // need: made-popcorn
- // 1. identify that we need unmade popcorn and a microwave
- // ^-- made-popcorn is how? we can meet any need with behavior
- // what is substep of find-path-to-need
- // find path-part-to-need
- //
- // need: to meet needs
- // need: some-need
- // makestepsfor makes: some-other-need tagged makes: some-need
- //
- // when we push some-need we want to stimulate pushing some-other-need.
- //
- // use a variable as the link target, and use e.g. met-need
- // as the link type
-)
-
-// TODO: add structure enough to build findstepsfor
-// TODO: build findstepsfor
-// TODO 2: add to surrounding process: remove source needs when there is no longer a reason for their presence
-
-
-all_parts = [ line2words, genproptextstring, respondhello, genprophelloinput ]
-
-ram = new ActiveMemory()
-//ram.add(ram)
-optstried = new Set()
-steps = []
-
-var readline = require('readline')
-readline.createInterface({
- input: process.stdin
-}).on('line', (line) => {
- line = new StringData(line)
- line.props.add('is','input')
- line.props.add('is','text')
- ram.add(line)
-
- let cont
- do {
- cont = false
- for (let part of all_parts) {
- //console.log('for-loop-of-parts ' + part.name)
- // TODO: >1 parameter,must redo next line
- let rel = ram.getWith(...part.needs)
- if (rel) {
- for (let a of rel) {
- //console.log('for-loop-of-rel ' + part.name + ' ' + a)
- if (optstried.has(part.name + ' ' + a)) continue;
- //console.log('call-part ' + part.name + ' ' + a)
- res = part.call(a)
- optstried.add(part.name + ' ' + a)
- if (res == null) continue
- // TODO: res==null is considered failure now
- ram.add(res)
- //console.log('part-called')
- step = [a, part.name, res]
- steps.push(step)
- console.log('made ' + step)
- cont = true
- }
- }
- }
- } while (cont)
-})
-
-
-// it looks like there is a reason to store each item in active memory.
-// one reason is that it is needed by a step in a process.
-// when there are no reasons, it is removed.
-// using an item should link it to what it is used by, so that it may be found easier again when needed
-
-// Please grow to understand your own structure. What is needed to make an intellect?
-// ^-- we want it to learn the basic needs of life, eventually, on its own.
-// notably those to do with care for others.
-
-// MEMORY: see MEMORY above
-
-// RELEVENCE: the gofer. Provides the link between needs, etc, and the behavior that
-// finds them. Is relevent for meeting needs in active ways and likely much else.
-
-// BEHAVIOR: the core. combines interdependent habits from memory to meet needs.
-// The two below go on simultaneously. only 1 is needed.
-// A way to plan behavior:
-// find habits that do the final goal, discern their needs
-// pick needs to treat as a new final goal and repeat until needs are met
-// A way to make behavior:
-// find a habit that does a goal
-// find with this process, information that meets its needs <spawns more>
-// run it
-// TODO: for subprocesses spawning,
-// consider labelling things that are very quick and side-effect-free
-// these can probably be immediately run.
-//