Способы записи алгоритмов многообразны и, видимо, не исчерпываются существующими операторными схемами, наиболее применяемыми в дискретной технике. Известны также алгоритмы Маркова, Ван Хао, машины Тьюринга–Поста, которые используются в математической теории [1].
В программировании и в теории автоматов наиболее применимы операторные схемы алгоритмов (ОСА) в форме граф-схем (ГСА), логических схем (ЛСА), регулярных схем (РСА), матричных (МСА) и табличных схем (ТСА). Все виды ОСА эквивалентны, поэтому может быть осуществлен взаимный переход (рис. 50) от одной формы к другой.
Замыкающие стрелки в графе рис. 50 отображают возможность эквивалентных преобразований самой формы ОСА без нарушения правильности алгоритма. Например, для ГСА рис. 51 формы а, б, в – эквивалентны. Однако переход от а) к в) допустим всегда, но от а) к б) – лишь в том случае, если по условиям работы операционного устройства, которым управляет автомат, реализующий ГСА, возможно одновременное исполнение операторов А1 и А2.
|
|
Рис. 50
Рис. 51
Переход от ГСА к МСА осуществляется в следующей последовательности:
- составляется матрица с перечислением всех операторов действия А1А2…А n А к (где Ак – оператор окончания алгоритма – «end») в заголовке столбцов матрицы и операторов А0А1…А n (где А0 – оператор начала алгоритма) в перечислении строк;
- прямая связь А i к А j отображается 1 на пересечении соответствующей i -й строки с j -м столбцом;
- если связь осуществляется с проверкой логического условия, ставится α, соответствующее значению «0» или «1», т.е. или α.
Однако часто при переходе от ГСА к МСА допускается ошибка, если не обозначить новым номером А n+ 1 повторяющийся оператор А i с записью примечания, А n+1 = А i. Например, для ГСА рис. 52 а правильная запись МСА, приведенная в табл. 22, может быть осуществлена только по рис. 52 б, где А7 = А2.
Рис. 52
Переход от ГСА к ЛСА неоднозначен и поэтому не формализован.
Определим формализованную процедуру преобразования ОСА, обеспечивающую однозначное преобразование ГСА в ЛСА. Для этого первоначально преобразуем ГСА в ТСА по следующей последовательности действий:
1 - отметим на ГСА самый длинный путь от А 0 до А к (для рис. 52 а этот путь составляет последовательность операторов 1, 2, …, 10, отмеченную «двойными» линиями;
2 - если на отмеченном пути встречается ветвь логического оператора α i со значением 1, то соответствующий оператор αi заменяется оператором βi, для которого βi = ; тогда отмеченный путь будет проходить через операторы, безусловные переходы (стрелки) от А i к A j и через стрелки αi со значением «0»;
|
|
3 - каждому оператору А i, следующему со значениями αi или βj, равными «1», припишем метку (буква с цифрой, например Q1, Q2, …,Q r);
Таблица 22
А1 | А2 | А3 | А4 | А5 | А6 | А7 | А к | |
А0 | ||||||||
А1 | ||||||||
А2 | | |||||||
А3 | ||||||||
А4 | ||||||||
А5 | ||||||||
А6 | ||||||||
А7 | ||||||||
А7 = А2 |
4 - нумеруются также последовательности операторов (по правилу 1, 2, 3) на участках ГСА, не покрытых самым длинным путем;
5 - отмечаются также с помощью меток операторы, к которым подходят несколько стрелок.
По рис. 52 а осуществим переход к ТСА, т.е. запишем последовательность операторов отмеченного пути в столбик:
А0 | |||
Q2 | А1 | ||
А2 | |||
α 1 | → Q1 | ||
А3 | |||
Q3 | А5 | ||
А2 | |||
β 2 | → Q2 | ||
А0 | |||
А6 | |||
Q1 | А4 | ||
→ Q3 |
Здесь команда 12 обозначает безусловный переход на Q3, а команды 4 и 8 – условные переходы, например, команда 4 читается как «если α1 = 1, то иди Q1, иначе А3».
Эти правила перехода от ГСА к ТСА рекомендованы для написания программ на алгоритмических языках низкого (ассемблер) и высокого уровня. Здесь же определим процедуру перехода от ТСА к ЛСА.
Как уже видно по ТСА, переход к ЛСА есть преобразование ТСА в строчную запись. Для этого произведем следующие действия:
- запись операторов (команд) осуществим в строчку (развернем ТСА на 90° против часовой стрелки);
- стрелки перехода по условиям αi и βj также повернем вверх и припишем им номера (индексы) i, j;
- метки Q k заменим стрелками, направленными вниз, с индексами тех логических операторов αi, βj, которые определяют переход к Q k;
- для безусловных операторов (в примере команда 12) так же определяются стрелки (вверх по команде и вниз по метке), но присваивается следующий по порядку номер после αi, βj;
- после оператора A k ставится точка с запятой (;), если отмеченный путь не покрывает всего алгоритма;
- после последнего участка алгоритма ГСА ставится точка (.).
Для рис. 52 а по соответствующей ТСА получим ЛСА в виде:
A0↓2A1A2α1↑1A3↓3A5A2β2↑2A6Ak; ↓A4↑3.
Вернувшись к первоначальному обозначению , получим окончательно
A0↓2A1A2 α 1↑1A3↓3A5A2 ↑2A6A k; ↓A4↑3.
Заметим, что в предлагаемой записи ЛСА безусловный оператор как таковой отсутствует, т.е. просто стоит стрелка, направленная вверх (). При этом такая стрелка ставится и после условного оператора α. В первоначальной записи А. Ляпунова безусловный оператор отмечается специальной буквой (О), т.е. обозначается О(). Можно вместо (О) использовать и другую букву или вообще не использовать буквенного обозначения.
Необходимость перехода от ГСА к ЛСА возникает в том случае, когда требуется ввести информацию о структуре ГСА в ЭВМ для последующего формального анализа алгоритма управления или перехода к процедуре формального и структурного синтеза автоматов. Запись в форме ЛСА удобна также при написании научных статей и отчетов, т.к. позволяет избежать изображений в форме ГСА, т.е., по существу, рисунков и чертежей.
Представление ОСА в виде различных форм (рис. 50) и взаимные преобразования имеют значение не только в задачах анализа и синтеза автоматов управления, но и в других областях применения информационных технологий и математического обеспечения систем обработки информации.
Глава 3