OberonCore
https://forum.oberoncore.ru/

Cхематические таблицы
https://forum.oberoncore.ru/viewtopic.php?f=121&t=4635
Страница 2 из 2

Автор:  PSV100 [ Вторник, 31 Декабрь, 2013 00:20 ]
Заголовок сообщения:  Re: Cхематические таблицы

Ещё один пример, на этот раз отражающий функцию как конструктор данных. Возьмём этот архивный рисунок:
Вложение:
file_source.PNG
file_source.PNG [ 21.97 КБ | Просмотров: 2198 ]

Пусть возникает потребность в вариантах конструктора: "тело" файла может быть либо списком записей (их много), или только одна запись. Также "конец файла" необязателен. Для этого введём две опции типа Bool: UseList и NeedEOF. Псевдокод (допуская, что язык поддерживает метапрограммирование):
Код:
type Record = (Description, Operator)
type EOF = (Symbol1, Symbol2)

type File = (
      Head,
      List[Record],  #[if UseList]
      Record,        #[if not UseList]
      EOF            #[if NeedEOF]
    )

Р-схема:
Вложение:
file_schm.PNG
file_schm.PNG [ 10.36 КБ | Просмотров: 2198 ]

Подставляя значения опций (аргументов) функции редуцируем нужный вариант, с возможностью "компактификации":
Вложение:
file_single.PNG
file_single.PNG [ 8.31 КБ | Просмотров: 2198 ]

Ещё пару вариантов:
Вложение:
file_var.png
file_var.png [ 12.36 КБ | Просмотров: 2198 ]

Схематическая таблица:
Вложение:
file_s_tbl.png
file_s_tbl.png [ 11.07 КБ | Просмотров: 2198 ]

В общем, как и Р-схемы, схемтаблицы можно нагружать произвольной семантикой.

Автор:  PSV100 [ Пятница, 25 Апрель, 2014 14:20 ]
Заголовок сообщения:  Re: Cхематические таблицы

Пример выше связан с целью -- сформировать принцип построения шаблонных Р-схем, похожий на механизм ряда текстовых шаблонных движков.

Пусть имеется абстрактная схема-шаблон (неважно, что именно она отражает), где через спецвершины выделена секция -- это структура, которая должна быть продублирована (или 0 повторений) для каждого входного целевого элемента (см. ниже). Через "#{...}" указаны значения для подстановки, "#[...]" -- условие для включения элемента (альтернатива -- использование спецвершины для дуги):
Вложение:
r_template.PNG
r_template.PNG [ 200.29 КБ | Просмотров: 2116 ]

Подаём на вход шаблонизатора массив из 2-х элементов, у второго "включена вторая дуга":
Код:
Data = {
    d1 = {aa: some},
    d2 = {pa: p1; aa: a1;   use_b: true;  pb: p2; ab: a2}
}

Итоговая схема (для первого элемента не указана надпись над дугой, т.к. для нее не определен предикат):
Вложение:
r_out.PNG
r_out.PNG [ 129.48 КБ | Просмотров: 2116 ]

Автор:  PSV100 [ Пятница, 25 Апрель, 2014 14:29 ]
Заголовок сообщения:  Re: Cхематические таблицы

По поводу схематических таблиц. Размышляя над тем, как улучшить их вид, пришёл к понимаю того, что для Р-схем схематические таблицы не нужны -- они сами по себе обладают всеми необходимыми от этих таблиц свойствами (и даже больше).

Возьмем исходный пример в этом сообщении, первый рисунок, выделю схематическую таблицу отдельно:
Вложение:
schemtbl.PNG
schemtbl.PNG [ 61.13 КБ | Просмотров: 2116 ]

Определим функцию "damage" (её два варианта в зависимости от первого аргумента, также два варианта ф-ции "power"), в отличие от оригинала -- добавлена обработка сигнала об ошибке:
Код:
type Attack = Magic | Melee

power: (Attack) -> int
power = (Magic) -> 5
power = (Melee) -> 4


damage: (Attack, bool, int) -> float


error Invalid(float) = SetVal(float) | SetDef

damage = (Magic, surprise, defense | Invalid) ->
       koef = 3 if surprise else 2
       effectiveness = power(Magic) * koef

       out = effectiveness - defense
       case of
            | out <= 0  =>  out = 0
            | out >= 1  =>  _
            | else          try Invalid(out) handle
                               SetVal(x) =>  out = x
                               SetDef    =>  out = 0.5
       out


damage = (Melee, surprise, defense) ->
       koef = 3 if surprise else 2
       effectiveness = power(Melee) * koef

       out = effectiveness / defense * 2
       out

Р-схема, где отражена общая картина сформированного вычислительного процесса с выделенными фазами:
Вложение:
r_damage.PNG
r_damage.PNG [ 857.67 КБ | Просмотров: 2116 ]

Явно указано, что расчёт "effectiveness" одинаков (можно выносить в отдельную ф-цию) в двух вариантах процесса (в зависимости от значения "attack"), причём в этом расчёте выделены свои две фазы. При желании возможен аналог функциональной схемы, когда через вспомогательные линии выделяются связи между входными аргументами и операциями (т.е. аргументы на вход операции подаются линиями, см. рисунок исходной схемтаблицы).

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

Автор:  PSV100 [ Пятница, 25 Апрель, 2014 14:42 ]
Заголовок сообщения:  Re: Cхематические таблицы

В дополнение. Р-схемы в подобном стиле, как приведено выше, могут заменить ряд UML-схем. Например, здесь есть диаграмма последовательностей и временная диаграмма. Сделаем аналоги.

Прежде всего, обращаю внимание на то, что алгоритмические Р-схемы по своей сути есть и диаграммы действий, и диаграммы состояний "в одном флаконе". И отдельно фантазировать над каким-нибудь state diagram нет необходимости (здесь отражена разница "state diagrams versus flowcharts").
В этой выдержке (отсюда) пример Р-схемы, где условные состояния заданы явно (только подписаны не как спецвершины). Выделю отдельно рисунок самой схемы:
Вложение:
r_algstate.PNG
r_algstate.PNG [ 23.63 КБ | Просмотров: 2114 ]

Возможны вложенные (внешние) состояния -- через блоки (например, здесь подробнее об общих состояниях):
Вложение:
r_specst.jpg
r_specst.jpg [ 4.91 КБ | Просмотров: 2114 ]

Итак, составим некий аналог вот такой временной диаграммы из примера выше по ссылке:
Вложение:
uml_time.jpg
uml_time.jpg [ 68.81 КБ | Просмотров: 2114 ]

Р-схема примерно будет такая:
Вложение:
r_time.PNG
r_time.PNG [ 411.51 КБ | Просмотров: 2114 ]

где в первом условном столбце выделены "роли" -- значения предикатов начальных дуг. Далее весь процесс разделяется на фазы, которые задаются в заголовке столбца: в скобках -- состояние, надпись над линией -- время, подпись -- сущность фазы. Описывать фазы можно как угодно, например, указывать только состояния, добавлять информацию о типах данных, контрольные выражения ("assert") и т.п. При желании, для выделения времени можно нарисовать отдельную шкалу над схемой. Или же включить время и/или иные важные показатели в значение условного состояния. Тогда, фактически, возможен универсальный формат заголовка фазы: в скобках -- состояние, надпись -- идентификатор фазы, подпись -- контрольное выражение (тип данных, assert). Любой элемент может отсутствовать.
В 4-м столбце (фаза 3) не указано общее состояние в заголовке, а для каждой дуги через спецвершину определено своё состояние в этой фазе (для каждой роли).

Для подобной диаграммы последовательности операций:
Вложение:
uml_seq.jpg
uml_seq.jpg [ 18.73 КБ | Просмотров: 2114 ]

требуется дополнительный "финт" -- введение отложенной связи между вершинами, задаваемой пунктирной линией:
Вложение:
r_sequent.PNG
r_sequent.PNG [ 259.85 КБ | Просмотров: 2114 ]

Здесь через первый столбец введены "акторы", в первой фазе одновременно выполняют действия акторы 1 и 2 (над дугами нет предикатов-условий), в фазе 2 работает актор 3, где по результатам при каких-то условиях согласно предикату дуги возможен переход на фазу 1 и повтор действий, в фазе 3 -- актор 2, и завершает актор 1, при этом возможна развилка его действий.

Опять же, как можно заметить, преимущество Р-схем в структурности. В UML-диаграммах невозможно выделять ветвления, циклы, блоки и т.п., или приходится довольствоваться кашей, как interaction overview diagram.

Страница 2 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/