Логические схемы алгоритмов

 

Реализация алгоритма есть последовательное выполнение команд ЭВМ, каждая из которых в свою очередь является последовательностью элементарных действий-микрокоманд, выполняемых за один машинный такт.

Функцию задания алгоритма А. А. Ляпунов предложил записывать определенным способом, а именно в виде конечной строки, состоящей из символов элементарных действий Аi , где i изменяется от 1 до n (n – целое положительное число), логических функций αp (p =1,m) и специальных символов начала и конца стрелок с индексом, где индекс также целое положительное число.

Символы A1,A2,…,An он предложил называть операторами, а символы α12,...-логическими условиями. Логическое условие (ЛУ) - это такая функция, которая может принимать лишь два значения – 0 или 1. Оказалось, что с помощью введенных понятий возможно формально описать любой алгоритм, используя терминологию логики. Действительно, допустим символ α112) означает, что α1=1, если равенство истинно и α1=0 в противном случае.

Рассмотрим некоторый алгоритм как определенную последовательность операторов.

 

U = A1 α1­1 A2 α2 ­2 A3 α3 ­3… ¯2A10 α10­3… Ak

 

Будем считать, что ЛУ, за исключением α2, равны единице. Тогда выражение можно переписать в виде

 

U =A1 A2 α2­2 A3 … ¯2A10 … Ak ,

 

так как действия стрелок трактуются следующим образом: после выполнения оператора A1 проверяется его ЛУ α1; если α1=1, то выполняется следующий оператор, т.е. А2, а если α1=0 , то необходимо в строке отыскать конец стрелки ¯1 и выполнить стоящее справа от неё элементарное выражение. Так как все ЛУ, кроме α2, равны 1, то это и позволяет нам перейти от первого выражения ко второму.

 

Определение. Логической схемой алгоритма (ЛСА) будем называть конечную строку, состоящую из символов операторов А1, А2, …, Аn, логических условий со стрелками α1­1, α2­2, … αm­m и концов стрелок ¯1, ¯2, … ¯m такую, что для каждого начала стрелки c индексом i найдётся один и только один конец стрелки с тем же индексом.

 

Из этого определения следует, что несколько начал стрелок могут иметь одинаковые индексы, но все они привязаны к единственному концу стрелки с этим индексом.

 

Каждый отдельный оператор или логическое условие назовём “элементарным выражением”, а фрагмент строки из элементарных выражений со стрелками, где для каждого индекса i имеется не более одного начала стрелки и одного конца с индексом i – “выражением”.

Из ранее приведённых рассуждений вполне понятно, что в любой ЛСА порядок выполнения операторов определяется состоянием всех ЛУ. Будем для определённости считать, что ЛУ могут изменять своё состояние, но только во время выполнения некоторого оператора.

Таким образом, описание алгоритма в общем виде в терминах ЛСА может быть представлено:

 

U = U (A1,…,An; p1,…,pm)

 

здесь Ai (i = 0, n) - множество операторов,

pj ( j = (1, к)) - множество логических переменных, входящих в функции αt(p1,p2,…,pm).

 

Всевозможные наборы состояний логических переменных p1, …, pm обозначим

 

Δ1 , Δ2 ,…, Δm , Δm+1 , …

 

Тогда процесс реализации ЛСА для этой произвольной последовательности наборов определяется следующим образом:

1. Выбираем начальный набор независимых логических переменных Δ1.

2. Анализируем самое левое элементарное выражение ЛСА: если это ЛУ, то может быть два продолжения: при рi =1 переходим к анализу следующего элементарного выражения, а при рi = 0 переходим к анализу элементарного выражения, стоящего справа от конца стрелки с индексом i. При выполнении оператора совершается переход от набора Δ1 к Δs , где s – индекс выполняемого оператора.

Строка операторов, полученная в результате описанных действий, является значением ЛСА для заданной выше последовательности наборов.

 

Пример. Дана ЛСА U =A0p2­1p3­2¯1A2A3¯2A4A5AK

Рассмотрим процесс реализации ЛСА при всевозможных наборах ЛУ.

 

Δ1 = p2p3 U1 = A0A2A3A4A5AK;

Δ2 = p2!p3 U2 = A0A4A5AK;

Δ3 = !p2p3 U3 = A0A2A3A4A5AK= U1;

Δ4 = !p2!p3 U4 = A0A2A3A4A5AK= U1.