Всем привет!

Занимаюсь разработкой системы построенной на теории, что любые исторические информационные системы (ИИС) построены по одним законам.

Хотел поделится своими теоретическими наработками в этой области. Возможно, я не прав, или глубоко заблуждаюсь, но вдруг мои наработки кому-нибудь пригодятся. Пост может быть очень долгим, выкладки скучными и могут быть непонятны без пояснений. Все что ниже встречается, я реализую на связке Python + Django + Sqlite в своем проекте.

Статус проекта на текущий момент: Proof of concept.

Лицензия - MIT.

Кодовое название: ForTeaToo или 42.

В дневнике разработчика встречается название ForTea (устарело).

Ссылка на проект тут:

https://disk.yandex.ru/d/lzYIPYOAvOu8Sw

Актуальный дневник разработчика тут:

https://disk.yandex.ru/i/cfadjS-DIrcOOA

Поехали...

Любая ИИС основывается на определении самой истории:

История — наука, изучающая всевозможные источники о прошлом для того, чтобы установить последовательность событий, объективность описанных фактов и сделать выводы о причинах событий.

Посмотрим на это со стороны ИИС:

Объективно описанные факты и установленная последовательность событий приводит к появлению истории.

Нужно учитывать что в ИИС история — это не История, как наука, а моделирование истории.

Моделирование – замещение одного объекта (оригинала) другим (моделью) и фиксация или изучение свойств оригинала путём исследования свойств модели.

И

Модель – представление объекта, системы или понятия (идеи) в некоторой форме, отличной от формы их реального существования.

Для ИИС необходимо учесть не только историю, но и прогнозы.

Прогнозирование поведения модели определено, так как определена планируемая последовательность действий при объективно описанных фактах на текущий момент.

Также необходимо уточнить что моделирование в ИИС основывается на дискретной линии событий. Дискретную линию событий назовем Таймлайн.

Запишем это формулой:

Таймлайн — t = {tnow-n,...tnow-1,tnow,tnow+1,...,tnow+n}, где tnow-n = tpast и tnow+n = tfuture

Введем еще определения:

История — State(tpast,tnow)

План — StatePlan(tnow+1,tfuture)

Прогноз — StateForecast(tnow+1,tfuture)

Незавершенная последовательность событий — Delay(tpast,tfuture)

Неопределенная незавершенная последовательность событий — ØDelay(tpast,tfuture)

Однако в ИИС при моделировании, попытка решить неопределенность приводит к появлению упрощенной модели использующих внешние факты или приближенной модели определенных событий, требующей контроля системой или внешними источниками. Контроль осуществляем с помощью Задачи (Task).

Lim(ØDelay(tpast,tfuture) ) = Task(tpast, tfuture, BR(tpast, tfuture), LM(tpast, tfuture), TR(tpast, tfuture) ) — Задача (Task) где (tpast,tfuture) — период существования Задачи

BR(tpast, tfuture) – Правила контроля целостности Задачи, или просто Правило (BR – business rule)

LM(tpast, tfuture) — Ссылки на внутренние связанные факты, события, задачи и другие источники данных существующих в области определения системы, используемые при выполнении задачи. Назовем его Картой ссылок (Link Map).

TR(tpast, tfuture) — Триггер (Trigger) — это команда или функция, сигнализирующая системе о наступлении определённого события

Однако, на периоде (tpast, tfuture) BR, LM, TR могут изменяться, и из-за этих изменений Задачи (Task) могут становится невалидными. Поэтому эти функции могут быть использованы только на момент tnow. А изменения BR, LM, TR — должны быть ограничены, или приводить к принудительной отмене или завершения Задач.

В итоге — обобщенный Delay выглядит так:

DelayΣ(tpast,tfuture) = Delay(tpast,tfuture) + ØDelay(tpast,tfuture)

или при моделировании

DelayΣ(tpast,tfuture) = Delay(tpast,tfuture) + Task(tpast, tfuture, BR(tnow), LM(tnow), TR(tnow) )

Нам понадобятся еще определения:

Установленная последовательность событий — DelayPPA(tpast,tnow-1)

Планируемая последовательность событий — DelayPlan(tnow+1,tfuture)

Результат завершенной последовательности событий

Fact(tnow) = Delay(tnow,tnow)

или

объективно описанные факты

Fact(tnow) = ØDelay(tnow,tnow)

Поясню:

Факты в системе появляются из-за завершенной последовательности событий — из-за свершившегося Delay

Fact(tnow) = Delay(tnow,tnow)

или, из-за упрощений моделирования, появляются из-за вырожденного Delay, находящегося вне системы или текущей модели

Fact(tnow) = ØDelay(tnow,tnow)

или с учетом моделирования

Fact(tnow) = Task(tnow, tnow, BR(tnow), LM(tnow), TR(tnow) )

Возвращаясь к формуле Delay

DelayΣ(tpast,tfuture) = Delay(tpast,tfuture) + Task(tpast, tfuture, BR(tnow), LM(tnow), TR(tnow) )

подставляем указанные выше формулы:

DelayΣ(tpast,tfuture) = Fact(tnow) + DelayPPA(tpast,tnow-1) + DelayPlan(tnow+1,tfuture) +

Task(tnow+1, tfuture, BR(tnow), LM(tnow), TR(tnow) )

что позволяет использовать в незавершенной последовательности событий локализованные и уже описанные факты.

Запишем в общем виде с учетом прогноза и плана:

State(tpast,tnow)+ StatePlan(tnow+1,tfuture) + StateForecast(tnow+1,tfuture)

=

Fact(tnow) + DelayPPA(tpast,tnow-1) +DelayPlan(tnow+1,tfuture)+DelayForecast(tnow+1,tfuture)

В зависимости от Таймлайна формула принимает вид

Для прошлого

Fact(tpast) + DelayPPA(tpast) = State(tpast)

DelayPPA(tpast,tnow-1) = const – на диапазоне (tpast,tnow-1)

и не может приводить к изменению Fact(tpast), факты в прошлом не пересматриваются:

DelayPPA(tnow,tnow) = Δ Fact(tnow) и вносят изменения только в текущем времени

Для будущего

Fact(tfuture) + DelayPlan(tnow+1,tfuture) = State(tnow,tfuture)

Fact(tfuture) = Еще не известно (не определено).

Но известно, что:

Fact(tfuture) = Fact(tnow) + DelayForecast(tfuture)

где DelayForecast(tfuture) — это прогноз, каким может стать факт и обладает следующими свойствами:

DelayForecast(tfuture) = const — значение отражающее прогноз на момент tfuture

DelayForecast(tnow) = StateForecast(tnow) – значение получаемое из истории прогноза на момент tnow

DelayForecast(tpast) = StateForecast(tpast) – значение получаемое из истории прогноза на момент tpast

Перепишем

( Fact(tnow) + DelayForecast(tfuture) ) + DelayPlan(tnow,ttruture) = StatePlan(tfuture)

Для текущего времени

Delay(tpast,tnow) может приводить к изменению Fact(tnow) в случае tpast = tnow, т. е.:

Delay(tnow,tnow) = Δ Fact(tnow)

и следовательно

Fact(tnow) + Δ Fact(tnow) = Fact(tnow) = State(tnow)

Все эти формулы приведены для одиночного кванта системы. Назовем ее value (значением). Значение может быть простым, сложным, составным и т. д. в зависимости от архитектуры.

Для обращения к значению в архитектуре фактов или событий мы используем именование этого значения.

Под именованием понимаем присваивание порядкового номера (ID) и интерфейсное отображение этого порядкового номера в виде строки, архитектурно удовлетворяющую системе фактов и событий, а также допустимый тип.

Именованное значение назовем реквизитом (requisite).

Реквизиты — объединенные в именованные группы, по признаку подобия, архитектурно относящиеся к одной сущности фактов или событий — составляют объект (object).

Объекты — объединенные в именованные группы, по признаку подобия, архитектурно относящиеся к одной сущности — составляют классы (class).

Текущее состояние системы (State) складывается из фактического состояния всех классов системы

all Factclass_id)

на текущий момент времени tnow и всех событий с классами системы

all Delayclass_event_id)

которые произойдут в будущем (tfuture), или произошли в прошлом tpast, но не были учтены в момент tpast, a повлияли на текущее состояние объектов системы в момент tnow

Запишем это формулой

State(tpast,tnow) = ΣallFactclass_id(tnow) + ΣallDelayclass_event_id(tpast , tfuture)

Распишем формулу и дадим определение всем элементам системы:

Состояние системы описывается как State(tpast,tnow). Это функция Истории системы или ее логов. У нее два параметра отражающее ее существование на периоде из прошлого в настоящее. Она необходима для контроля изменения фактов в системе и событий с изменениями фактов.

Фактическое состояние класса — Factclass_id(tnow). Это функция, которая в зависимости от параметра tnow принимает вид конкретного объекта системы. Параметр tnow — текущее время системы.

Если параметр tnow — не указан, то формула принимает вид:

Factclass_id() = Σf_id(class_id) *Factid_requisite() + Σf_id(class_id) Delayid_requisite() ; по * см ниже.

Но

Σf_id(class_id) Delayid_requisite() = 0

так как Delay – не может существовать вне линии времени. И в случае когда tnow = tpast или tnow = tfuture — любой Delay = 0

А

Σf_id(class_id) *Factid_requisite() = const

Следовательно

Factclass_id() = Σf_id(class_id) *Factid_requisite()

Замечание к записи *:

Если полностью расписывать формулу то она должна была принять вид см. ниже. Delay исключаем сразу

Factclass_id() = Σf_id(class_id) Factid_object()

где

Factid_object() = Σf_id(id_object) Factid_requisite()

и далее

Factid_requisite() = const

Но так как функция не зависит от времени, не имеет структуры объекта и соответственно не может его создать на линии времени, то

Σf_id(class_id) Factid_object() = *

или

Σf_id(class_id) Factid_object() = all

- становится оператором доступа ко всем неизменяемым параметрам системы — назовем ее «ссылкой» или «link» . Еще одно название alias (псевдоним). В формуле используем оператор ссылки «*». В проекте для «*» - используем запись [[all]] – все. Напомню — что все объекты в этом случае вырождены, так как не имеют структуры, и не существуют во времени.

Повторим то что получилось:

Factclass_id() = Σf_id(class_id) *Factid_requisite()

где

Factid_requisite() = const

Результатом этой функции является постоянная. Под постоянной мы понимаем не только какое-то значение, но и алгоритм или результат вычисления функции, не зависящего от tnow.

В системе мы даем этой функции название «Константа» - и вводим класс (тип) данных Константа. Задача такого класса — хранить, вычислять и передавать const данные {значение, набор значений, функцию с параметрами}.

Если параметр tnow — указан, то в общем виде:

Factclass_id(tnow) = Σf_id(class_id) Factid_object(tnow) + Σf_id(class_id) Delayid_object(tpast,tfuture)

но

Σf_id(class_id)Delayid_object(tpast,tfuture) = 0

Мы заблокировали Delay в классах в текущей реализации (PoC). Иначе это подразумевает появление в класса в прошлом, что может повлиять на работоспособность текущей системы, а появление класса в будущем хоть и является плюсом, но тянет за собой серьезную переработку конструктора, в целях создания будущих структур данных, которые могут подключится когда настанет момент tfuture. Блокировка вводится на ближаших релизах, но технически осуществима.

Следовательно:

Factclass_id(tnow) = Σf_id(class_id) Factid_object(tnow)

Результатом такой функции является набор объектов класса на текущий момент. В системе мы называем это «Справочником» - и вводим класс (тип) данных Справочник. Задача этого класса — хранить, вычислять и передавать данные об объектах, удовлетворяющих f_id(class_id), где f_id – функция логического условия, а

class_id = {id_object1, id_object2,... ,id_objectn}

- параметр влияющий на условие {может быть идентификатором класса, может быть идентификатором единичного объекта (id_object), набором объектов {id_object}, функцией возвращающей идентификаторы класса или объекта(ов) }, существует на момент tnow.

Опустимся еще на уровень глубже. Опять запишем в общем виде:

Factid_object(tnow) = Σf_id(id_object) Factid_requisite(tnow) + Σf_id(id_object) Delayid_requisite(tpast,tfuture )

По тем же причинам, что и в случае прошлых и будущих классов мы блокируем существование будущих и прошлых реквизитов объектов, работаем только с текущей реализацией классов и их параметров.

Следовательно:

Factid_object(tnow) = Σf_id(id_object) Factid_requisite(tnow)

Результатом такой функции является набор всех реквизитов объекта на текущий момент. В системе мы называем это «Элемент справочника» или «Объектом класса». Задача этого класса — хранить, вычислять и передавать данные об объектах, удовлетворяющих f_id(id_object), где f_id – функция логического условия, а

id_object = {id_requisite1, id_requisite2, ... , id_requisiten }

- параметр влияющий на условие {может быть идентификатором объекта , может быть идентификатором реквизита (id), набором id, функцией возвращающей id}, актуальные на момент tnow.

Добрались до значений:

Factid_requisite(tnow) = Σf_id(id_requisite) Factid_value(tnow) + Σf_id(id_requisite)Delayid_value(tpast,tfuture)

Замечу, что на уровне значений мы разрешаем изменять значение реквизита объекта в прошлом и готовить изменение в будущем. Это является следствием отказа от изменения структуры реквизитов, появления и исчезновения классов и как следствием — объектов.

Результатом такой функции является значение реквизита объекта на текущий момент. В системе мы называем это value или «Параметром справочника». Задача этого класса — хранить, вычислять и передавать данные о значении реквизита объекта, на момент tnow.

Factid_value(tnow) = const

и

Delayid_value(tpast,tfuture) = Δ constf(past,now) + Δ constf(future,now)

Рассмотрим формулу получения значения параметра справочника в общем виде внимательнее:

Statevalue(tnow) = Factid_value(tnow) + Delayid_value(tpast,tfuture)

тут встречаются параметры tpast,tfuture.

tpast – время изменения в прошлом.

tfuture – время изменения в будущем.

Как работает функция Delayid_value(tpast,tfuture)? Распишем подробнее:

Delayid_value(tpast,tfuture) = DelayPPAf(id_value, past,now) + DelayPlanf(id_value, future,now)

где

DelayPPAf(id_value, past,now)

вычисляется как:

Если tnow = tpast, то DelayPPAf(id_value, past,now) = null

Если tnow > tpast, то DelayPPAf(id_value, past,now) = const

и

DelayPlanf(id_value, future,now)

вычисляется как:

Если tnow <= tfuture, то DelayPlanf(id_value, future, now) = const

Если tnow > tfuture, то DelayPlanf(id_value, future, now) = null

Что находится в const? Там находится Δ значения параметра справочника.

Как это работает? Посмотрим на диаграмму.

Здесь видно что используя функцию DelayPPAf(id_value, past,now) в текущий момент мы отправляем Δ значение параметра справочника в прошлое, изменяя дату его появления с текущего времени, на прошлое.

Аналогично поступаем и с функцией DelayPlanf(id_value, future,now) .

В текущий момент мы отправляем Δ значение параметра справочника в будущее, и когда это будущее время наступит, то функция DelayPlanf(id_value, future,now) добавит Δ к значению Factvalue и обнулится.

И так: У нас появилось еще два определения

Функция DelayPPAf(id_value, past,now) — это функция корректировки значения параметра справочника в прошлом. В системе называется «Корректировка прошлого».

Функция DelayPlanf(id_value, future,now) — это функция подготовки изменения параметра в будущем, с автоматическим применением при достижении назначенного времени. В системе называется «План»

Вернемся к параметрам справочника.

Factid_value(tnow) = const

и

Delayid_value(tpast,tfuture) = Δ constf(past,now-1) + Δ constf(now+1,future)

В Factid_value(tnow) = const значений параметров могут находится следующие элементы системы, которым тоже нужно дать описание:

Простые типы значений:

string – строка

float – число,

bool — логическое значение

link — ссылка на объект класса «Справочник» (Factclass_id(tnow))

или класса «Контракт» (Delayclass_event_id(tpast , tfuture))

datetime — Дата и время

date — Дата

enum — Статическое перечисление

eval — Вычисляемая функция (алгоритм)

const — Ссылка на константы

file — Ссылка на файл

Составные типы значений:

Словарь — это тип данных, представляющий собой коллекцию пар «ключ- значение». В рамках одного словаря ключи не повторяются. Состоит из простых типов данных.Используется только как подчиненная структура данных в «Справочниках».

Массив — типизированная плоская таблица состоящая из простых типов значений. Используется только как подчиненная структура данных в «Справочниках» и «Контрактах»

Вспомогательные структуры:

Каталог — Помогает структурировать классы, выстраивая их иерархию и объединяя по смыслу «Справочники» и «Контракты»

Дерево — Помогает фильтровать «элементы справочника» и обеспечивает иерархическое выполнение формул.

Примеры работы Delay:

В Delayid_value(tpast,tfuture) = Δ constf(past,now-1) + Δ constf(now+1,future)

в Δ const могут находится только простые типы данных, но из-за смысла самого Delay работают они немного по-другому

string – строка в delay имеет приоритет в State.

В Factid_value(tpast) = «Строка»

В Delayid_value(tpast) = «Строка исправленная»

Результат Stateid_value(tpast) = «Строка исправленная»

Для tfuture – по наступлению события в будущем tnow = tfuture

В Factid_value(tfuture-1) = «Строка»

В Delayid_value(tfuture-1) = «Строка исправленная»

Результат Stateid_value(tfuture-1) = «Строка»

В Factid_value(tfuture) = «Строка исправленная»

В Delayid_value(tfuture) = null

Результат Stateid_value(tfuture-1) = «Строка исправленная»

float – число,

В Factid_value(tpast) = «1.0»

В Delayid_value(tpast) = «-1.0»

Результат Stateid_value(tpast) = «0»

Для tfuture – по наступлению события в будущем tnow = tfuture

В Factid_value(tfuture-1) = «1.0»

В Delayid_value(tfuture-1) = «-1.0»

Результат Stateid_value(tfuture-1) = «1.0»

В Factid_value(tfuture) = «0»

В Delayid_value(tfuture) = null

Результат Stateid_value(tfuture-1) = «0»

bool — логическое значение

В Factid_value(tpast) = «True»

В Delayid_value(tpast) = «False»

Результат Stateid_value(tpast) = «False»

Аналогично и для tfuture – по наступлению события в будущем tnow = tfuture

link — ссылка на объект класса «Справочник» (Factclass_id(tnow))

или класса «Контракт» (Delayclass_event_id(tpast , tfuture))

нет функции Delay. Заблокировано в PoC.

datetime — Дата и время

В Factid_value(tpast) = «15.07.2023 10:50»

В Delayid_value(tpast) = «+00.00.0000 00:10»

Результат Stateid_value(tpast) = «15.07.2023 11:00»

Аналогично и для tfuture – по наступлению события в будущем tnow = tfuture

date — Дата

В Factid_value(tpast) = «15.07.2023»

В Delayid_value(tpast) = «+01.00.0000»

Результат Stateid_value(tpast) = «16.07.2023»

Аналогично и для tfuture – по наступлению события в будущем tnow = tfuture

enum — Статическое перечисление

нет функции Delay. Заблокировано.

eval — Вычисляемая функция (алгоритм)

нет функции Delay. Заблокировано.

const — Ссылка на константы

нет функции Delay. Заблокировано.

file — Ссылка на файл

В Factid_value(tnow) = «Файл»

В Delayid_value(tfuture) = «Новый файл»

Результат Stateid_value(tnow) = «Файл»

Результат Stateid_value(tfuture) = «Новый файл»

По наступлению tnow = tfuture

В Factid_value(tnow) = «Новый файл»

В Delayid_value(tnow) = «»

нет функции для Delayid_value(tpast). Заблокировано.

Вернемся к основной формуле системы:

State = ΣallFactclass_id(tnow) + ΣallDelayclass_event_id(tpast , tfuture)

Рассмотрим Delay:

мы помним что в общем виде:

DelayΣ(tpast,tfuture) = Fact(tnow) + DelayPPA(tpast,tnow-1) + DelayPlan(tnow+1,tfuture) +

Task(tnow+1, tfuture, BR(tnow), LM(tnow), TR(tnow) )

следовательно:

Delayclass_event_id(tpast , tfuture)=Σf_id(class_event_id) Factid_contract(tnow) +

Σf_id(class_event_id)DelayPPAid_contract(tpast,tnow-1) +

Σf_id(class_event_id)DelayPlanid_contract(tnow+1,tfuture) +

Σf_id(class_event_id)Taskid_contract(tnow+1, tfuture, BR(tnow), LM(tnow), TR(tnow) )

но мы сейчас рассматриваем последовательность событий над классами, следовательно

DelayPPAid_contract(tpast,tnow-1) = null

DelayPlanid_contract(tnow+1,tfuture) = null

Заблокировано, из-за того что событие не может изменить свою структуру в прошлом, чтобы не допустить потери данных о событии, или дополнить его — что может привести к потери целостности события. А изменение события в будущем может привести к нарушению целостности существующих событий, которые не закончились к моменту изменения в будущем.

Следовательно:

Delayclass_event_id(tpast , tfuture) = Σf_id(class_event_id) Factid_contract(tnow) + Σf_id(class_event_id)Taskid_contract(tnow+1, tfuture, BR(tnow), LM(tnow), TR(tnow)

Результатом такой функции является набор событий над фактами на интервале {tpast , tfuture}, с фактическим результатом на tnow, так как существование набора событий не зависит от интервала согласно формуле.

В системе мы называем это «Контракты» - и вводим класс (тип) данных Контракты. Задача этого класса — хранить, вычислять и передавать данные о событиях над объектами, удовлетворяющих f_id(class_event_id), где f_id – функция логического условия, а

class_event_id = {id_contract1, id_contract2,... ,id_contractn}

- параметр влияющий на условие {может быть идентификатором класса, может быть идентификатором единичного контракта (id_contract), набором контрактов {id_contract}, функцией возвращающей идентификаторы класса или объекта(ов) }, существующих на tnow

Отмечу что у класса контрактов есть все свойства Task. Следовательно — при определении класса мы должны это учитывать, и добавить к Контракту BR, LM и TR, как свойство всего класса.

Опустимся еще на уровень глубже — тут слой реквизитов аналогичен тому что было в классе «Справочников». Опять запишем в общем виде:

Factid_contract(tnow) = Σf_id(id_contract) Factid_requisite(tnow) +

Σf_id(id_contract)DelayPPAid_requisite(tpast,tnow-1) +

Σf_id(id_contract)DelayPlanid_requisite(tnow+1,tfuture) +

Σf_id(id_contract)Taskid_requisite(tnow+1, tfuture, BR(tnow), LM(tnow), TR(tnow) )

Блокируем Delay:

DelayPPAid_requisite(tpast,tnow-1) = null

DelayPlanid_requisite(tnow+1,tfuture) = null

Taskid_requisite(tnow+1, tfuture, BR(tnow), LM(tnow), TR(tnow) ) = null

На уровне реквизитов контрактов (структура данных контракта) мы не можем допустить, чтобы у нас что-либо изменялось в прошлом и в будущем, при условии существующих (незавершенных) контрактов. А свойство Task наследуем из родительского класса. В следующих релизах это можно включить, для возможности к примеру переопределить поведение конкретных контрактов одного класса, в зависимости от значений контрактов.

Следовательно:

Factid_contract(tnow) = Σf_id(id_contract) Factid_requisite(tnow)

Результатом такой функции является набор всех реквизитов контракта на текущий момент. В системе мы называем это «Объектом контракта». Задача этого класса — хранить, вычислять и передавать данные об объектах, удовлетворяющих f_id(id_object), где f_id – функция логического условия, а

id_сontract = {id_requisite1, id_requisite2, ... , id_requisiten }

- параметр влияющий на условие {может быть идентификатором объекта , может быть идентификатором реквизита (id), набором id, функцией возвращающей id}, актуальные на момент tnow.

Добрались до значений:

Factid_requisite(tnow) = Σf_id(id_requisite) Factid_value(tnow) +

Σf_id(id_requisite)DelayPPAid_value(tpast,tnow-1)

Σf_id(id_requisite)DelayPlanid_value(tnow+1,tfuture) +

Σf_id(id_requisite)Taskid_value(tnow+1, tfuture, BR(tnow), LM(tnow), TR(tnow) )

Замечу, что на уровне значений мы разрешаем изменять значение реквизита объекта в прошлом и готовить изменение в будущем.

Результатом такой функции является значение реквизита контрактов на текущий момент. В системе мы называем это value или «Параметром контракта». Задача этого класса — хранить, вычислять и передавать данные о значении реквизита объекта, на момент tnow.

Здесь все аналогично «Справочникам». Отличием является Task. На уровне параметра контракта мы можем определить поведение параметра контракта так, чтобы у нас запускался и выполнялся Task.

Если нужно выполнить группу Task — то мы формируем техпроцесс (TP).

Техпроцесс — совокупность одновременно или последовательно осуществляемых задач (Task), находящихся во взаимной организационной и технологической зависимости, обеспечивающих создание или обновление фактов, и поддержание непрерывной последовательности событий.

Формирование техпроцесов зависит от модели и в общем виде представлен формулой:

TP = Taskid_value(tnow+1, tfuture, BR(tnow), LM(tnow), TR(tnow) )

где

Taskid_value(tnow+1, tfuture, BR(tnow), LM(tnow), TR(tnow) ) =

Taskf(id_value,1)(tnow+1, tfuture, BR1(tnow), LM1(tnow), TR1(tnow) ) +

… +

Taskf(id_value,n)(tnow+1, tfuture, BRn(tnow), LMn(tnow), TRn(tnow) )

а 1 .. n – это конечное число задач заданных для id_value – ключевого поля.

Если на уровне значения (value) – не указаны параметры задачи, то наследование этих параметров идет из класса (теоретически возможно переопределять и поведение объекта — но в нашей системе — это отключено).

PS :

Замечание не относящееся к общим выкладкам, но являющееся следствием.

Итогом этих формул явилось появление языка формул, которые мы используем в проекте, и в рабочей документации представлено в примерах.

Запишем в общем виде. Оператор «a.b» является обращением к члену структуры (член b объекта а)

Statevalue(tnow) = Factclass_id(tnow).Factid_object(tnow).Factid_requisite(tnow)

где

class_id = {class_id1,...,class_idn}

id_object = {id_object1,...,id_objectn}

id_requisite = {id_requisite1,...,id_requisiten}

и если взять эти параметры за const значения, то формула примет вид:

Statevalue(tnow) = [[table.123.15.18]]

первый параметр — Factclass_id = «table», Delayclass_event_id - «contract»

второй параметр — номер класса

третий параметр — номер объекта

третий параметр — номер реквизита

На текущий момент это пока все, что есть в наработках. Проект потихоньку реализуется. Я стараюсь собирать демоверсии не реже одного раза в месяц.

Спасибо за внимание и обратную связь.