Всем привет!

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

Хотел поделится своими теоретическими наработками в этой области. Возможно, я не прав, или глубоко заблуждаюсь, но вдруг мои наработки кому-нибудь пригодятся. Пост может быть очень долгим, выкладки скучными и могут быть непонятны без пояснений. Все что ниже встречается, я реализую на связке 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»

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

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

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

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

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

Комментарии (8)


  1. leahch
    17.08.2023 07:14
    +1

    Секундочку.. А зачем еще один конь в вакууме?! Начали бы с теории, хотя бы...https://en.m.wikipedia.org/wiki/Bitemporal_modeling

    Ну, или сравнения существующих bitemporal баз данных, или ну.... Datalog или чего-то подобного.

    А то сразу формулами сыпать, хрен вьедешь.


    1. 1_ex Автор
      17.08.2023 07:14

      Я понимаю, что выкладки "сильно не прозрачные". Имел в виду - что линия времени - неизменная и она одна. Все корректировки которые мы хотим внести в прошлое - это дельта того, что мы считали фактом тогда. И всегда можно посмотреть на "оригинал" и на "дельту" отдельно.

      Мне кажется, что BiTemporal - не совсем то. Ссылку изучу внимательнее, может я где-то "глубоко" заблуждаюсь.


      1. leahch
        17.08.2023 07:14

        Зачем нам нужна "дельта"? если эта дельта вычисляется из просто "таймстемпа", и не нужно этим загружать базу. Причем, если нет дельты, то мы можем крутить события с вверх и вниз по оси времени. И да, несомненно почитайте про temporal базы.


        1. 1_ex Автор
          17.08.2023 07:14
          +1

          Приведу пример из статьи.

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

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

          В Delay(tpast) = «+00.00.0000 00:10» - Это Дельта.

          State(tpast) = «15.07.2023 11:00»

          Да. Дельта Delay тоже живет в Истории и у нее две даты. Дата, когда ее создали и дата, куда ее разместить в истории. У Факта только одна дата, поэтому в истории я их разделил по типу.

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

          Все - так, как в присланной вами ссылке по BiTemporal. Спасибо!:

          1. The most accurate data possible as we know it now

          2. Data as we knew it at any point in time

          3. When and why the most accurate data we had changed


      1. leahch
        17.08.2023 07:14

  1. dyadyaSerezha
    17.08.2023 07:14
    +1

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

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

    Привет, а где вы видели объективно описанные факты? С каждой новой властью все прошлые факты меняются вплоть до противоположных. А многие факты даже и фактами никогда не были, а являются мифами в чистом виде.

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

    Раз нет объективно описанных фактов, то нет и истории. Всё дальнейшее в статье считаю несущественным.


    1. 1_ex Автор
      17.08.2023 07:14

      Существенное замечание.

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


      1. dyadyaSerezha
        17.08.2023 07:14

        Ок, но тогда не надо писать "объективно описанные".