Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семинарские занятия- общие рекомендации.doc
Скачиваний:
12
Добавлен:
18.11.2019
Размер:
231.42 Кб
Скачать

Практикум Теория алгоритмов и сложность вычислений.

Семинар 1

Машина Тьюринга. Теория.

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

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

σ

t

d

e

r

t

m

λ

λ


A

Внешний алфавит a, b, c, 0, 1, 2…

σ - начальный символ

L H R λ - пустой символ

R

Aa-->bB L команда машины Внутренний алфавит A, B, C…

H So – начальное состояние

Ω – конечное состояние

Конфигурация машины

Если машина находится в конфигурации Aa, то, в соответствии с данной командой, она напишет на ленте b, перейдет в состояние B и переедет вправо, влево или останется на месте.

Набор таких команд – программа.

Итак, имеем ленту, бесконечную только в одну сторону. Начальный символ всегда σ, все пустые ячейки заполнены символом λ. Начальное состояние всегда So.

Первая строка программы всегда должна иметь вид:

Soσσ??

Окончание программы: ???ΩH

Машина Тьюринга позволяет решить любую алгоритмически разрешимую задачу.

Пожелание: для унификации всех нотаций при написании алгоритмов разными группами давайте все придерживаться следующей схемы (порядка символов в команде)

S0σ->σRA

Aa->bRB

Ac->bLB

Ad->bHB

Aλ->сHΩ

Жирным выделены зарезервированные символы (начальные состояние и символ, конечное состояние и пустой символ). Считается что:

  • Начальный символ трогать нельзя, он должен быть строго один на ленте

  • Пустых символов бесконечно много, и если такой символ появился – далее слово считается законченным.

  • Начальное состояние S0 можно использовать и как рабочее, т.е. смена состояния в первой строке должна производиться только по необходимости.

  • Если по каким то причинам задачу решить нельзя (не задано слово и т.д.), то машина должна закончить работу в состоянии Ω` (далее в скобках необходимо написать примечание, почему решения нет)

Общие критерии оценки программ:

  1. Минимизация суммы: кол-во строк+кол-во новых состояний+кол-во новых символов на ленте.

и / или

  1. Время работы при входном слове размерности n

Задачи к рассмотрению на первом семинаре

  1. Алфавит {0,1}. Поставить в конце слова символ «1».

  2. Алфавит {0,1}. Поставить в конце слова символ, который является первым символом слова.

  3. Алфавит {0,1}. Поставить в конце слова символ, который является последним символом слова. Рассмотреть и сравнить два решения:

-идем до конца слова, возврат на шаг назад, запоминаем и копируем символ

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

  1. Алфавит {0,1,2}. Найти в слове все последовательности {102} и заменить их на {***}. Рассмотреть и сравнить два решения:

-идем по слову, по ходу меняя состояния фиксируем нахождение {102}, «2» меняем на *, возвращаемся к «1», меняем ее, и далее к «0». Затем перешагиваем через * и бредем дальше.

-идем по слову, по ходу меняя состояния фиксируем нахождение {102}, «2» меняем на *, назад пока не возвращаемся, идем дальше. Когда слово кончится один раз возвращаемся назад и после каждой встреченной * ставим еще **.

5. Алфавит унарный. Дано число n (закодировано n+1 палочкой). Найти значение функции f(n)=n÷2, результат записать вместо входного слова. (÷ псевдоразность). Внимание: ноль кодируется одной палочкой.

Задача 1.

Есть слово в алфавите {0,1}. Нужно написать ''1'' в конце слова.

SoσσSoR

So11SoR

So00SoR

Soλ1ΩH

Задача 2.

Есть слово в алфавите {0,1}. Нужно написать 1-ый символ слова в конце слова.

SoσσSoR

So11A1R

So00AoR

SoλλΩh //пустое слово//

A111A1R

A100A1R

A1λ1ΩH

Ao11AoR

Ao00AoR

Aoλ0ΩH

Задача 3.

Есть слово в алфавите {0,1}. Нужно написать в конце слова последний символ.

Два варианта решения 1) Доходим до конца слова и возвращаемся назад

2) Каждый раз запоминаем результат

SoσσSoR

So11SoR

So00SoR

SoλλAL //A – дошли до конца слова//

A00BR

A11CR

AλλΩH //Слова нет//

Bλ0ΩH

Cλ1ΩH

SoσσSoR (A1 – нашли 1, A0 – нашли 0)

So11A1R

So00AoR

SoλλΩH //Слова нет//

A111A1R

A100AoR

A1λ1ΩH

Ao11A1R

Ao00AoR

Aoλ0ΩH

Задача 4.

Дан алфавит {0,1,2}. Нужно пройтись по слову и все последовательности 012 заменить на звездочки. 012***

SoσσSoR

So00AoR

So11SoR

So22SoR

SoλλΩH

Ao100AoR

Ao111SoR

Ao12*BL

Ao1λλΩH

Ao00AoR

Ao11Ao1R

Ao22SoR

AoλλΩH

B1*BL

B0*SoR

So**SoR

Задача 5.

Дано число n в унарном коде. Найти псевдоразность n-2.

Унарный код:

׀ “0”

׀׀ “1”

׀׀׀ “2”

n “n-1”

n-2, если n>=2

Псевдоразность: n-2=

0, если n<2

SoσσSoR

So11SoR

SoλλAL

A1λA1L

AσσΩH //Слова нет//

A11λA2L

A1σσBR

Bλ1ΩH

A211ΩH

A2σσBR

Семинар 2

Машины Тьюринга (продолжение). Копирование слов.

Задача 1.

Копирование слова в прямом порядке после *

Задача 2.

Копирование слова в прямом порядке без *

Задача 3.

Копирование слова в обратном порядке без *

SoσσSoR

SoaaSoR

SobbSoR //идем до конца слова//

SoλλCL // С-запись символа который необходимо скопировать//

Caa`AR

Cbb`BR

CσσΩH

AaaAR

AbbAR

BaaBR

BbbBR

AλaDL

BλbDL

DaaDL

DbbDL

Da`aCL

Db`bCL

Задача 4.

Копирование слова в обратном порядке после *

Задача 5.

Копирование слова в обратном порядке вместо слова

SoσσSoR

Soaa`AR

Sobb`BR

SoλλΩH

AaaAR

AbbAR

BaaBR

BbbBR

AλλA1L

BλλB1L

A1aa``A2L

A1ba``B2L

B1ab``A2L

B1bb``B2L

A2aaA2L

A2bbA2L

B2aaB2L

B2bbB2L

A2a`aSoR

A2b`aSoR

B2a`bSoR

B2b`bSoR

Aa``aA1L

Ab``bA1L

Ba``aB1L

Bb``bB1L

A1a`aΩH

A1b`bΩH

B1a`aΩH

B1b`bΩH

Задача 6.

Определить, является ли слово палиндромом.

Задача 7.

На ленте в унарном коде записана разность чисел а и б. Числа разделены знаком -

σ

׀

׀

׀

-

׀

λ

λ

λ

Нужно вместо разности написать результат.

SoσσSoR

So11SoR

So--AR

A11`BL

AλλCL

B--BL

B11`SoR

B1`1`BL

BσσDR

A1`1`AR

So1`1`SoR

C1`λCL

C-λCL

C11ΩH

D1`λDR

D- λDR

D1 λDR

DλλΩH

CσσΩH

Рекомендованная задача для решения дома:

На ленте задано в унарном коде число n, вместо исходного слова написать на ленте 2*n+3.

Семинар 3

Машины Тьюринга (окончание). Анализ слов

Задача 1

Алфавит {0,1}. Определить, каких символов в слове больше: ноликов или единиц. Если больше единичек, то в конце слова поставить символ «+», если больше ноликов – в конце слова поставить символ «-». Если символов равное количество – знак «=».

Решение:

В принципе есть два пути решения:

Первый: помечать какой то определенный символ и потом искать ему пару среди непомеченных альтернатив.

Второй: после слова затеять подсчет встреченных символов, постепенно уничтожая уже нарисованные значки если встречается альтернативный символ.

Контрольная работа №1

Плановое время строго не более 50 минут.

Семинар 4

Многоленточные машины Тьюринга.

Теория: принципы работы многоленточных машин Тьюринга

Основное:

  1. Управляющие головки на каждой из лент двигаются независимо.

  2. Внутреннее состояние у машины – единое. Это св-во самой машины, а не управляющих головок и лент.

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

Si{a,b,c}→{a',b',c'} Sj {R,L,H} Sj

Задача 1.

Алфавит {0,1}. Машина двухленточная. Дано слово, оно записано на первой ленте. Скопировать это слово на вторую ленту в обратном порядке.

Задача 2.

Алфавит {0,1}. Машина трехленточная. Даны два числа в двоичном коде, они записаны на первой и второй ленте соотв. Считается, что слова записаны нормально: т.е. оба слово всегда есть и начинаются они с единицы (исключение только для числа ноль). Определить чему равна сумма этих двух чисел и результат записать на третью ленту.

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

Задача 3.

Алфавит унарный. Машина трехленточная. Даны два числа в унарном коде, они записаны на первой и второй ленте соотв. Определить чему равно произведение этих двух чисел и результат записать на третью ленту.

Семинар 5

Алгоритмы Маркова. Теория.

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

Формат команды (строки) следующий

{ai}  {bj} [•],

где

{ai} – последовательность символов, которая ищется в слове

 - знак перехода к операции записи

{bj} - последовательность символов, которая записывается вместо найденной

[•] - знак принудительного окончания алгоритма (необязательный параметр)

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

Например, алгоритм, состоящий из одной строки, вида

0  *

будучи примененным к слову в алфавите {0,1}, заменит все нули на звездочки.

В свою очередь алгоритм

0  * •

будучи примененным к слову в алфавите {0,1}, заменит на звездочку первый встреченный ноль.

Довольно сложная для реализации на машинах Тьюринга задача сортировки слова по возрастанию, допустим в алфавите {0,1,2}, решается при помощи Маркова весьма изящно:

20  02

10  01

21  12

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

Например, дано произвольное двоичное слово. Надо убрать из него два первых знака.

Рассмотрим алгоритм вида:

00  •

01  •

10  •

11  •

Если в слове случайно первыми двумя символами были нули (например, «001011»), то алгоритм действительно выполнит указанную задачу. Также работа закончится успешно, если в слове ни разу не встретилось два нуля подряд, а первыми символами оказалась пара 01 (например, «01011101»). Но в слове 1100101 выбросятся два нуля, которые вовсе не являются первыми символами слова. В этом случае существующий алфавит надо расширить вспомогательными буквами, которых нет в начальном слове и которые появляются в ходе вычисления. По сути, это некоторые аналоги внутренней памяти (состояний машин Тьюринга). Они вводятся с помощью формулы λ  α (α – вспомогательная буква) или, что более корректно, пары формул

λ 0  α 0

λ 1  α 1

Применив такие продукции к слову λ 1100101 λ получим:

λ α 1100101 λ

Дальше мы «тащим» эту букву по слову вправо, стирая и отсчитывая символы

(стерли первый):

α 0  β

α 1  β

(стерли второй):

β 0  •

β 1  •

Однако если мы расположит эти строки в обычном порядке, а именно:

λ 0  α 0

λ 1  α 1

α 0  β

α 1  β

β 0  •

β 1  •

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

Правильный алгоритм выглядит следующим образом.

β 0  •

β 1  •

α 0  β

α 1  β

λ 0  α 0

λ 1  α 1

Ту же самую задачу можно решить и использовав всего один дополнительный символ:

α00 •

α01 •

α10 •

α11 •

α0 •

α1 •

λ 0  α 0

λ 1  α 1

Задачи к решению на семинаре

Задача 1.

Алфавит {0,1} Переработать произвольное слово в 0.

Задача 2.

Алфавит {0,1} Удвоить все символы в слове.

Задача 3.

Алфавит {0,1} Удалить каждый третий символ

Задача 4.

Алфавит {0,1} Поставить в конце слова + если в нем есть хотя бы один ноль и – если это не так

Задача 5.

Алфавит {0,1} Переработать слово в + если в нем есть хотя бы два нуля (неважно расположены они рядом или нет) и в – если это не так (т.е. исходное слово удаляется)

Задача 6.

Алфавит {0,1} Поставить в конце слова +, если в нем рядом встречаются хотя бы два нуля (т.е. они соседние) и в - если это не так.

Задача 7.

Алфавит {0,1} Переработать произвольное слово в +, если в нем рядом встречаются точно два нуля (т.е. они соседние) и больше нулей в слове нет и в - если это не так.

СЕМИНАР 6

Алгоритмы Маркова (продолжение). Вычисления в унарном коде.

Алфавит {0,1}

Задача 1.

Скопировать слово в прямом порядке после слова.

Задача 2.

Вычислить сумму двух натуральных чисел в унарном коде. Результат записать вместо слова.

Задача 3.

Вычислить псевдоразность двух натуральных чисел в унарном коде. Результат записать вместо слова.

Задача 4.

Вычислить разность двух натуральных чисел в унарном коде. Результат записать вместо слова.

Задача 5.

Вычислить остаток от деления двух натуральных чисел в унарном коде. Результат записать вместо слова.

Задача 6.

Вычислить целую часть от деления двух натуральных чисел в унарном коде. Результат записать вместо слова.

Задача 7.

Подсчитать количество символов 0. Результат записать после слова в унарном коде.

СЕМИНАР 7

Алгоритмы Маркова (окончание). Анализ слов.

Задача 1.

Определить – каких символов 0 или 1 в слове больше. Если больше нулей – поставить в конце +, если больше 1 – поставить -. Если поровну – поставить в конце =.

Контрольная работа №2

Плановое время строго не более 50 минут.

СЕМИНАР 8

Тест №1

Темы, затрагиваемые тестом

-машины Тьюринга

-алгоритмы Маркова

-теоремы Шеннона

-алгоритмически неразрешимые проблемы (останова, печати и т.д.)

-числовые множества: мощность, счетность, эффективная перечислимость.

СЕМИНАР 9

Плановое время для переписывания к/р №№1 и 2

Работа над ошибками теста №1

Подготовка к тесту №2

СЕМИНАР 10

Тест №2

Темы, затрагиваемые тестом

- для множеств АФ, ЧАФ, ВАФ, ВЧАФ вопросы мощности, эффективной перечислимости, счетности

-для произвольных функций вопросы принадлежности к множествам АФ, ЧАФ, ВАФ, ВЧАФ

-вопросы распознаваемости классов функций друг в друге

-вопросы поиска области определенности заданных функций

-определения АФ, ЧАФ, ВАФ, ВЧАФ

-формулировки основных теорем (Тьюринга, Черча, сопутствующих)

СЕМИНАР 11

Примитивная рекурсивность функций.

1. Сумма

Доказано на лекции

2. Произведение

f(x,y)=xy

f(0,y)=0y=0=C01(y)= C01

f(x’,y) =(x+1)y=xy+y=f(x,y) +y=(f(x,y),y)=(U13,U33)=S23(,U13,U33)

Ответ: f(x,y)= R2[C01, S23(,U13,U33)].

3. Факториал

Доказано на лекции

4. Псевдоразность

x-y если xy

f(x,y)=x y=