Как может быть осуществлена дозированная инъекция управления "от данных" в Р-схемах.
Задействуем оператор вида "with...do...end" из Pascal, точнее Modula -- создание временных переменных, "живущих" до конца блока. Однако вводим его интерпретацию как аналог "let...in..." ("пусть ...") в математических текстах или ряда функциональных ЯП (или как постформа "... where ..." или "..., где ..."). Переменные "вычисляются" только один раз и лишь в случаях реального их применения -- вычисления по требованию, в т.ч. и со стороны смежных формул. Востребованность первично возникает в точках входа "do" (и "else") блока "do...end" (в зависимости от входных "защитных" условий и прочего содержимого блока -- см. далее):
Код:
p1();
with
a = f1(...);
b = f2(a);
c = f3(...);
do
p2(a, b, c);
end;
p3();
Вложение:
r14.png [ 4.41 КБ | Просмотров: 5863 ]
На схеме блок задан под дугой с "разрывом".
Переменные задаются как набор формул, в т.ч. взаимоиспользуемых, редукцией занимается транслятор/читатель.
В примере выше вводятся три переменные и все используются процедурой p2.
Блок может быть дополнен "защитным" выражением -- do-часть исполняется при успешном предикате, заданном через if (перед ключ. словом do):
Код:
p1();
with
a = f1(...);
b = f2(...);
c = f3(...), if a > b;
= f4(...), if a = b;
= f5(...), otherwise;
if a & b & c do
p2();
p3();
end;
p4();
Вложение:
r15.png [ 6.74 КБ | Просмотров: 5863 ]
Выше формула для "с" содержит "если/иначе". Такой стиль (как математические уравнения) удобнее, чем вложенные тернарные условные операторы (вида "x = if ... then ... else ... ", "x = (case ... of ...|...)" или си-шный "?:").
Может быть множество "охран":
Код:
p1();
with
a = f1(...);
b = f2(...);
c = f3(...), if a > b;
= f4(...), if a = b;
= f5(...), otherwise;
if a & b & c do
p2();
p3();
elif a & b do
p4();
else
p5();
end;
p6();
Вложение:
r16.png [ 9.31 КБ | Просмотров: 5863 ]
Основная задача -- сохранить целевую особенность схемы: упорядоченность предметных действий. Так выше "график работ" выражает последовательность: после p1 следуют p2,p3 или p4 или p5. Важно "вложиться" в единое выражение для предиката (если начнётся "лес" дуг для "раскрытия логики" -- это уже не "график работ", при потребности "лес" лучше выделять отдельной схемой/структурой).
Можно сопоставить формы представления примера ранее из темы "про деревья решений":
https://forum.drakon.su/viewtopic.php?f=215&t=6666&p=103698#p103696https://forum.drakon.su/viewtopic.php?f=228&t=6666&start=60#p103984Выше на Р-схеме (для оператора with там применялась двойная дуга с разрывом, но лучше "петли" использовать для циклических структур), например, "формула":
expanding := machine.state === "expanding"
, с потенциально "тяжёлыми" действиями, может оказаться невостребованной и невычисленной (соответственно и "тяжелые" действия могут быть не исполнены), если сработает первый предикат в операторе with.
(предикаты составлены на манер т.н. "join calculus" -- конъюнкты событий -- в примерчике выше: сначала указано условие "a & b & c" как вариант с максимальным охватом событий, далее предикаты предполагают сужение вариантов и альтернативы ("a & b"), с потенциалом для оптимизаций -- это уже проблемы транслятора).