Опубликован: 26.09.2006 | Доступ: свободный | Студентов: 1800 / 485 | Оценка: 4.25 / 4.12 | Длительность: 17:09:00
ISBN: 978-5-9556-0066-6
Специальности: Программист, Математик
Лекция 11:

Машины Тьюринга

Начальное математическое обеспечение

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

В таблице приведены их схемы в предположении, что алфавит A состоит из символов a_1, a_2\ldots a_t ; а символ \ast обозначен через a_0.

Кроме того, считаем, что X и Y — произвольные псевдослова над алфавитом A ; u_1, u_2\dts u_n, u — слова в алфавите A ; a — произвольный символ из A \cup \{*\} ; u^1слово, полученное из слова u путем изменения порядка символов на противоположный; n = 1, 2, \ldots.

Программы R и L, описанные в начале таблицы, используются в последующих программах.

Сдвиг головки влево до ближайшего пробела.Обозначение L

Вход X\ast u \ovs{a}{\downarrow}\,Y
Выход X \ovs{\ast}{\downarrow} ua\, Y
Программа l\ (\t{до}\ \ast)

Сдвиг головки вправо до ближайшего пробела.Обозначение R

Вход X \ovs{a}{\downarrow} u \ast\, Y
Выход X a u \ovs{\ast}{\downarrow} \, Y
Программа r\ (\t{до}\ \ast)

Копирование n -го слова.Обозначение K_n

Вход X \ast u_n \ast u_{n-1} \ldots \ast
u_{1}\ovs{\ast}{\downarrow}
Выход X \ast u_n \ast u_{n-1} \ldots \ast u_1
\ast u_{n}\ovs{\ast}{\downarrow}
Программа L^n,\ r,[\cup_i\ (\t{если}\
a_i)
[\ast,\ R^{n+1},\ a_i,\ L^{n+1}, a_i, r]]\ (\t{до}\ \ast),\ R^n

Удаление буквы со сдвигом. Обозначение S

Вход X \ovs{a}{\downarrow} u \ast Y
Выход X u \ast \ovs{\ast}{\downarrow}  Y
Программа [r, \cup_i\ (\t{если}\ a_i)
[l,\ a_i],\ r]\ (\t{до}\ \ast)

Циклический сдвиг n слов. Обозначение Z_n

Вход X \ast u_n \ast u_{{n}-1}\ast \ldots
\ast u_{1} \ovs{\ast}{\downarrow}
Выход X \ast u_{n-1} \ast \ldots \ast u_1
\ast u_{n}\ovs{\ast}{\downarrow}
Программа R,\ [L^{n+1},\ r, \cup_i\
(\t{если}\ a_i)[S^n, a_i]](\t{до}\ \ast)

Удаление n -го слова. Обозначение \Lambda_n

Вход X \ast u_n \ast u_{{n}-1}\ast \ldots \ast
u_{1}\ovs{\ast}{\downarrow}
Выход X \ast u_{n-1} \ast \ldots \ast u_1
\ovs{\ast}{\downarrow}
Программа Z_n,\ [\ast, l]\ (\t{до}\
\ast)

Методика доказательства правильности программ

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

  • Если входные данные удовлетворяют входному условию, то алгоритм через конечное число шагов завершает работу и выходные данные удовлетворяют требуемому выходному условию.

На практике такое утверждение часто разбивают на два.

  1. Если входные данные удовлетворяют входному условию и алгоритм через конечное число шагов завершает работу, то выходные данные удовлетворяют требуемому выходному условию.
  2. Если входные данные удовлетворяют входному условию, то алгоритм через конечное число шагов завершает работу.

Алгоритм, для которого доказано утверждение 1, называется частично правильным или частично корректным. Если же доказаны утверждения 1 и 2, то алгоритм называется правильным или корректным.

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

Остановимся на доказательстве частичной корректности. Методика заключается в следующем:

  1. Для контроля над ходом вычислений выбираются так называемые контрольные дуги. К числу контрольных обязательно относят входную и все выходные дуги, а также некоторое количество других дуг, так, чтобы в граф-схеме алгоритма оказались "разрезанными" все циклы.
  2. Для каждой контрольной дуги формулируется индуктивное условие, которому предположительно должно удовлетворять содержимое памяти алгоритма при каждом его прохождении через рассматриваемую дугу. Считаем, что все контрольные дуги (в дальнейшем будем называть их контрольными точками) и соответствующие им индуктивные утверждения пронумерованы.
  3. Для каждой пары i, j контрольных точек, для которых в блок-схеме имеется путь из i в j, минующий другие контрольные точки, выбираются все такие пути, и для каждого выбранного пути доказывается утверждение (индуктивный шаг): "Если при очередном проходе через точку i выполнялось индуктивное предположение P_i и если реализуется рассматриваемый путь, то при достижении точки j будет выполняться условие P_j ".

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

Антон Сиротинкин
Антон Сиротинкин

на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно...