3. Формальные преобразования алгоритмов

3.1. Основные понятия. Эквивалентность алгоритмов

Одним из основных вопросов, возникающих в процессе преобразования алгоритмов, является их эквивалентность.

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

Можно определить сильную и слабую эквивалентность алгоритмов.

Два алгоритма называются сильно эквивалентными, если они имеют одинаковую область определения и совпадают не только результаты переработки слов из этой области, но и сам процесс их переработки.

Два алгоритма будем называть слабо эквивалентными, если они имеют одну и ту же область определения и результаты переработки слов из этой области совпадают.

На формальном уровне понятие эквивалентности двух алгоритмов U1 и U2 будем определять следующим образом:

• для каждого алгоритма вводится понятие «входа» и «выхода»;

• для каждого входа, который имеет смысл для данного алгоритма, выполнение алгоритма может приводить к некоторому выходу.

Пусть Х1 и Х2 - входы алгоритмов U1 и U2 соответственно.

Алгоритмы U1 и U2 считаются эквивалентными, если из условия Х1=Х2 следует, что если алгоритм U1 имеет выход У1, то и другой алгоритм U2 имеет выход У2=У1.

На практике большое значение имеет определение эквивалентности с точностью до изоморфизма.

Слово «изоморфизм» происходит от греческих слов: «изо» - равный, одинаковый и «морфо» - форма.

Изоморфизм – это взаимно однозначное соответствие между двумя множествами каких-либо объектов.

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

В этом случае между некоторыми входами Х1 алгоритма U1 и входами X2 алгоритма U2 конструктивно задается некоторый изоморфизм i (в данном случае понимаемый как однозначное соответствие).

Аналогично задается некоторый изоморфизм j между выходами Y1 и Y2 алгоритма U1 и U2 соответственно.

Эквивалентность теперь будет определяться стандартным образом:

-алгоритмы U1 и U2 считаются эквивалентными, если из условия Х1i~ Х2 следует, что если хотя бы один алгоритм имеет выход Y1, то другой алгоритм имеет выход Y2, причем Y1j~ Y2.

Разные виды эквивалентности отличаются тем, как определяются «входы» и «выходы» алгоритма, а также тем, как выбираются изоморфизмы i и j. Между различными видами эквивалентности можно ввести частичное отношение порядка, выражающиеся словами «сильнее» и «слабее».

Будем считать, что отношение эквивалентности Э1 слабее отношения эквивалентности Э2, если любые алгоритмы U1 и U2, эквивалентные в смысле Э2, эквивалентны и в смысле Э1, и в то же время есть хотя бы одна пара алгоритмов U1 и U2, таких, что U1 и U2 эквивалентны в смысле Э1 и не эквивалентны в смысле Э2.

Очевидно, чем слабее отношение эквивалентности, тем шире класс алгоритмов, эквивалентных согласно этому отношению.

С одной стороны такое расширение классов рассматриваемых алгоритмов – хорошо, однако, при слишком слабом определении эквивалентности алгоритмов проблема распознавания эквивалентности алгоритмов может оказаться неразрешимой.

С другой стороны, слишком сильное определение эквивалентности чрезмерно сужает классы эквивалентных алгоритмов.

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

На степень широты понятия эквивалентности наиболее существенно влияет выбор определения «выхода» алгоритма.

В качестве «выхода» нас могут интересовать не только те объекты, которые формально объявляются результатами по окончании выполнения алгоритма, но и информация о каких-либо промежуточных результатах или о том в какой последовательности выполнялись элементарные шаги алгоритма и т.п.

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

Таким образом, чем больше информации, полученной в ходе выполнения алгоритма, несет в себе выход, тем более сильным оказывается отношение эквивалентности, основанное на таком определении выхода.

Другими словами, один и тот же конечный результат может получаться разными путями. Следовательно, чем больше истории о том, как выполнялся алгоритм, содержит в себе выход, тем к более сильному понятию эквивалентности он приводит.

Исчерпывающую информацию о том, как происходило выполнение алгоритма, можно получить, рассматривая в качестве выхода алгоритма всю последовательность выполнявшихся операторов.

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

Целесообразно рассматривать нечто такое, что по количеству информации было бы чем-то средним между записью алгоритма и значением результативного переменного по окончании выполнения алгоритма. С этой точки зрения будем рассматривать в качестве выхода

S-представления тех переменных, значения которых нас интересуют в качестве результатов выполнения алгоритма.

В этом случае два алгоритма эквивалентны, если соответствующие переменные при совпадающих входах вычисляются по одинаковым формулам.

S – представление переменного есть явное выражение формулы, по которым вычислялось результирующее значение переменного для заданных исходных значений исходных значений функциональных переменных.

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

Такие приемы программирования, как: разбиение задачи на подзадачи;-расчленение формул; выделение промежуточных результатов; преобразование логических операторов и т.п. приводят к таким преобразованиям алгоритмов, которые сохраняют S-представления результативных переменных.

Для определения эквивалентности операторных алгоритмов рассмотрим два алгоритма - U1 и U2 из некоторого класса операторных алгоритмов.

Для каждого из алгоритмов выделим те переменные, которые нас интересуют в качестве результатов выполнения этих алгоритмов. Выделенные переменные могут быть различными у алгоритма U1 и алгоритма U2 , но число их должно быть одинаковым и между ними должно быть установлено взаимно однозначное соответствие. То же самое относится к функциональным переменным алгоритмов U1 и U2 и к параметрам этих алгоритмов, которые могут входить в S – представление.

Обозначим функциональные переменные, параметры и выделенные в качестве результатов переменные алгоритма U1 как:

X1,……,Xs , P1,…Pr,Y1,…Yn соответственно.

Соответствующие им переменные, играющие аналогичную роль в U2:

clip_image0021,…clip_image002[1]s, clip_image0051,…clip_image005[1]r, clip_image0081,…clip_image008[1]n

Алгоритмы U1 и U2 эквивалентны по отношению к выделенным переменным clip_image011clip_image011[1]clip_image011[2] Y1,…Yn и clip_image008[2]1,…clip_image008[3]n, если для любого набора исходных данных clip_image002[2]1,…clip_image002[3]s, имеет место следующее утверждение:

если какой-либо из этих алгоритмов, например, U1 имеет значение для исходных данных clip_image002[4]1,…clip_image002[5]s и S – представления выделенных переменных имеет вид: T1(Xi11,…Xi1m1,Pj11,…Pj1l1)àY1;

T2(Xi21,…Xi2m2,Pj21,…Pj2l2)àY2;

……………………………………

Tn(Xin1,…Xinmn,Pjn1,…Pj1ln)àYn;

то другой алгоритм U2 также имеет значение для исходных данных clip_image002[6]1,…clip_image002[7]s и S-представления выделенных переменных имеют вид:

T1(clip_image002[8]i11,… clip_image002[9]i1m1, clip_image005[2]j11,… clip_image005[3]j1l1)à clip_image008[4]1;

T2(clip_image002[10]i21,… clip_image002[11]i2m2, clip_image005[4]j21,… clip_image005[5]j2l2)à clip_image008[5]2;

…………………………….

Tn(clip_image002[12]in1,… clip_image002[13]inmn, clip_image005[6]jn1,… clip_image005[7]jnln)à clip_image008[6]n;

Можно также определить эквивалентность между двумя алгоритмами U1 и U2 из разных классов U1(j1,j1) и U2(j2,j2) .

Соответствия между функциональными переменными, параметрами и выделенными переменными устанавливается так же, как было показано выше. Но может оказаться, что список операций j1 и j2, а также значения функциональных переменных не совпадают буквально.

В этом случае между операциями из списков j1 и j2, а также между возможными значениями функциональных переменных из множеств j1 и j2, необходимо дополнительно задать определенные изоморфизмы и считать алгоритмы U1 и U2 эквивалентными в том случае, если изоморфные наборы исходных данных приводят к S-представлениям, совпадающим с точностью до изоморфизма образующих их операций.

Следует отметить, что если вводится понятие эквивалентности для алгоритмов из разных классов, то может оказаться, что алгоритмы, эквивалентные в смысле S-представления, будут неэквивалентны в смысле совпадения значений выделенных переменных. Это может произойти в том случае, если изоморфные операции не будут совпадать функционально. Например, в одном случае арифметические действия выполняются в двоичной системе, а в другом - в десятичной.

Предлагаю ознакомиться с аналогичными статьями: