Open Nashev opened 5 years ago
Прозрачная подгрузка так же называется ленивое считывание, lazy reading. В библиотеке Spring4D реализуется декоратором http://www.devjetsoftware.com/docs/spring4d/Spring.Lazy(T).htm
Необходимость обработать очередной кусок полученных знаний можно считать задачей и соответственно иметь менеджер и планировщик задач.
Вот что по такому же поводу есть у NARS: (https://github.com/opennars/opennars/blob/master/README.md)
The control mechanism repeatedly carries out the working cycle of the system, generally consisting of the following steps:
Select tasks in the buffer to insert into the corresponding concepts, which may include the creation of new concepts and beliefs, as well as direct processing on the tasks. Select a concept from the memory, then select a task and a belief from the concept. Feed the task and the belief to the inference engine to produce derived tasks. Add the derived tasks into the task buffer, and send report to the environment if a task provides a best-so-far answer to an input question, or indicates the realization of an input goal. Return the processed belief, task, and concept back to memory with feedback. All the selections in steps 1 and 2 are probabilistic, in the sense that all the items (tasks, beliefs, or concepts) within the scope of the selection have priority values attached, and the probability for each of them to be selected at the current moment is proportional to its priority value. When an new item is produced, its priority value is determined according to its parent items, as well as the type of mechanism that produces it. At step 5, the priority values of all the involved items are adjusted, according to the immediate feedback of the current cycle.
Обрабатывать анализаторами элементы знания из потока, порождая потоки новых элементов, итогов обработки.
На вход — с диска или из анализатора, выход — на диск и, возможно, в анализаторы.
Чтоб имитировать вход из анализаторов, на самом деле читая с диска, надо помнить порядок записи и текущую позицию чтения. На диске элементы знания хранятся в виде, удобном для произвольного доступа в разных задачах, скорее всего в порядке, отличном от порядка записи. А исходный порядок записи - это журнал.
Журналы записи ведутся собственно механизмом записи, а позицию чтения ведут каждый для себя механизмы оффлайн вызова анализаторов.
Обработка выходов с анализаторов тоже должна уметь быть асинхронной, так что тоже пусть будет исключительно через журналы.
Читая и обрабатывая входной поток по порядку (последовательно), надо иметь возможность обращаться к ранее изученному произвольно.
Но скорее всего часто нужны какие-то элементы, уже связанные с обрабатываемыми элементами. Хотелось бы иметь доступ к ним без постоянного повторного поиска - как можно более прямые указатели. Соответственно, в памяти нужно иметь API для хранения привязанных элементов вместе с обрабатываемыми, и прозрачной их подгрузки по мере необходимости. И своевременной выгрузке тоже.
Метод доступа может различаться для наверняка одноразовых обращений и для потенциально многоразовых.
Хотя, можно держать специальный общий список элементов, связанный в порядке обращений к ним (элемент при обращении перепривязывается в начало списка), и при необходимости освобождать те их них, что болтаются в хвосте. Для этого достаточно иметь ссылку на хвостовой элемент, а сам список сделать двунаправленным.