Теория разработки информационно-исторических систем с реализацией концепта
Всем привет!
Занимаюсь разработкой системы построенной на теории, что любые исторические информационные системы (ИИС) построены по одним законам.
Хотел поделится своими теоретическими наработками в этой области. Возможно, я не прав, или глубоко заблуждаюсь, но вдруг мои наработки кому-нибудь пригодятся. Пост может быть очень долгим, выкладки скучными и могут быть непонятны без пояснений. Все что ниже встречается, я реализую на связке 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»
второй параметр — номер класса
третий параметр — номер объекта
третий параметр — номер реквизита
На текущий момент это пока все, что есть в наработках. Проект потихоньку реализуется. Я стараюсь собирать демоверсии не реже одного раза в месяц.
Спасибо за внимание и обратную связь.