
- •Министерство образования и науки Российской Федерации
- •Инструкция по мерам безопасности и правилам поведения в компьютерном классе Общее положения:
- •Методические указания по выполнению лабораторных работ
- •Лабораторная работа № 1 Основы работы с персональным компьютером Цель
- •Задание для самостоятельной подготовки
- •Основы теории
- •Задание
- •Порядок выполнения работы
- •Требования к отчету
- •Задание к работе
- •Порядок выполнения работы
- •Требования к отчету
- •Задание к работе
- •Порядок выполнения работы
- •Требования к отчету
- •100.101
- •111.000
- •Задание
- •Порядок выполнения работы
- •Контрольные вопросы
- •Задание
- •Порядок выполнения работы
- •Требования к отчету
- •Контрольные вопросы
- •Лабораторная работа № 6.
- •Задание
- •Порядок выполнения работы
- •Задание
- •Порядок выполнения работы
- •Требования к отчету
- •Задания
- •Порядок выполнения работы
- •Требования к отчету
- •Контрольные вопросы
- •Лабораторная работа № 9.
- •Задание
- •Задание
- •Порядоквыполненияработы
- •Требования к отчету
- •Задание
- •Порядок выполнения работы
- •Отчет о работе
- •Задание
- •Задание
- •Порядок выполнения работы (на примере)
- •Требования к отчету
- •Задание к работе
- •Порядок выполнения работы
- •Отчет о работе
- •Задание
- •Примеры выполнения работы
- •Требования к отчету
- •Контрольные вопросы
- •Лабораторная работа № 15
- •Задание
- •Порядок выполнения работы
- •Требования к отчету
- •Контрольные вопросы
- •Лабораторная работа № 16
- •Задание
- •Порядок выполнения работы
- •Задания
- •Требования к отчету
- •Задание
- •Порядок выполнения работы
- •Отчет о работе
- •Задание
- •Порядок выполнения работы
- •Отчет о работе
- •Задание
- •Порядок выполнения работы
- •Отчет о работе
- •Реализация последовательных списков с использованием массивов
- •Задания
- •Требования к отчету
- •Контрольные вопросы
- •Лабораторная работа № 22.
- •Задание
- •Порядок выполнения работы
- •Контрольные вопросы
- •Задание
- •Порядок выполнения работы
- •Контрольные вопросы
- •Требования к отчету
- •1.5 Алгоритм добавления звена к очереди.
- •Задание
- •Порядок выполнения работы
- •Контрольные вопросы
- •Требования к отчету
- •Задание
- •Порядок выполнения работы
- •Контрольные вопросы
- •Требования к отчету
- •Использование fread() и fwrite()
- •Задание
- •Порядок выполнения работы
- •Контрольные вопросы
- •Задание
- •Порядок выполнения работы
- •Требования к отчету
- •Контрольные вопросы
- •Лабораторная работа № 28.
- •Задание
- •Требования к отчету
- •Порядок выполнения работы
- •Контрольные вопросы
- •Задание
- •Порядок выполнения работы
- •Требования к отчету
- •Задания к работе
- •Порядок выполнения работы
- •Задание
- •Пример выполнения задания
- •Контрольные вопросы
- •Требования к отчету
- •Задание
- •Порядок выполнения работы
- •Требования к отчету
- •Контрольные вопросы
- •Лабораторная работа №33.
- •Задание
- •Порядок выполнения работы
- •Контрольные вопросы
- •Шифрование при помощи задачи о ранце
- •Популярные системы шифрования
- •Задание
- •Порядок выполнения работы
- •Контрольные вопросы
- •Требования к отчету
- •Литература
- •Internet-ресурсы
Требования к отчету
Отчет должен содержать:
Тему и цель работы.
Задание.
Программу-таблицу.
Описание машины Тьюринга в каждом из состояний.
Ответы на контрольные вопросы.
Выводы о проделанной работе.
Контрольные вопросы
1) Предположим, что торговый автомат должен выдавать различные продукты в зависимости от того, какая кнопка нажата. Можно ли сказать, что такая машина «знает», какая из кнопок нажата? Каково в таком случае ваше определение осведомленности?
2) В чем различия между требованиями к видеосистеме робота в случаях, когда изображения используются роботом для управления собственными действиями и когда эти образы передаются человеку, который удаленно управляет роботом?
3) Какое значение имеют продукционные системы для искусственного интеллекта?
4) Сколько кубиков составляют следующую фигуру? Каким образом можно запрограммировать машину, чтобы она точно ответила на этот вопрос?
Лабораторная работа №33.
«Машины Тьюринга. Вычислимые и невычислимые функции»
Цель
Формирование представления об основах функционирования машины Тьюринга
Задание для самостоятельной подготовки
Изучить устройство и основные принципы функционирования машины Тьюринга [1], стр.499-517.
Изучить содержание и порядок выполнения лабораторной работы.
Основы теории
Машина Тьюринга состоит из управляющего блока, который может считывать и выводить символы на ленту при помощи головки считывания-записи (рис. 1). Лента продолжается до бесконечности с обеих сторон машины и разделена на ячейки, каждая из которых может содержать только один символ из конечного набора символов. Этот набор называется машинным алфавитом.
Рисунок 1 – Компоненты машины Тьюринга
В любой момент вычисления машина Тьюринга должна находиться в одном из конечного числа состояний. Вычисление на машине Тьюринга начинается в специальном состоянии, называемом начальным состоянием, и прекращается, когда машина достигает другого специального состояния — состояния остановки.
Работа машины Тьюринга состоит из последовательности шагов, которые выполняет управляющий блок машины. Каждый шаг заключается в считывании символа из текущей ячейки ленты, записи символа в эту ячейку, перемещении головки считывания-записи на одну ячейку влево или вправо и последующей перемене состояния. Действие, которое требуется выполнить, определяется программой, которая отдает приказы управляющему блоку. Она основывается на состоянии машины и содержимом текущей ячейки ленты.
Рассмотрим последовательность действий машины Тьюринга на конкретном примере.Будем представлять ленту машины в виде горизонтальной полоски, разделенной на ячейки, куда можно записывать символы машинного алфавита. Указывать текущее положение головки считывания-записи машины мы будем, помещая указатель под соответствующую ячейку, которую будем называть текущей ячейкой. Алфавит в нашем примере состоит из символов 0, 1 и *. Лента машины может выглядеть следующим образом:
Рисунок 2 – Лента машины Тьюринга
Считая, что строка символов на ленте обозначает двоичные числа, разделенные звездочками, мы увидим, что на этом отрезке записано значение 5. Наша машина Тьюринга должна увеличивать значение на ленте на 1. Точнее, она считает, что начальная позиция находится на звездочке, которой помечен правый конец строки из нулей и единиц, следовательно, нужно изменить битовую комбинацию слева от звездочки на следующее целое число.
Алан Тьюринг разработал концепцию машины Тьюринга в 1930-х годах, задолго до того, как технология развилась настолько, чтобы создать машины, известные нам сегодня. В действительности Тьюринг исходил из того, как люди производят вычисления при помощи карандаша и бумаги. Его целью была разработка модели, при помощи которой можно было бы изучать ограничения вычислительных процессов. Он приступил к работе вскоре после публикации в 1931 году знаменитой статьи Гёделя, раскрывающей пределы вычислительных систем, когда основные силы исследователей были направлены на изучение этих границ.
У нашей машины есть состояния:«начало», «прибавить», «перенос», «переполнение», «возврат» и «останов». Действия, соответствующие каждому из этих состояний, и содержимое текущих ячеек перечислены в табл.1. Мы предполагаем, что машина всегда начинает работу из состояния «начало».
Таблица 1 – Машина Тьюринга для увеличения значения на единицу
Текущее состояние |
Текущее содержимое ячейки |
Значение для записи |
Направление перемещения |
Переход в состояние | ||
Начало |
* |
* |
Влево |
Прибавить | ||
Прибавить |
0 |
1 |
Вправо |
Возврат | ||
Прибавить |
1 |
0 |
Влево |
Перенос | ||
Прибавить |
* |
* |
Вправо |
Останов | ||
Перенос |
0 |
1 |
Вправо |
Возврат | ||
Перенос |
1 |
0 |
Влево |
Перенос | ||
Перенос |
* |
* |
Влево |
Переполнение | ||
Переполнение |
Любое |
* |
Вправо |
Возврат | ||
Возврат |
0 |
0 |
Вправо |
Возврат | ||
Возврат |
1 |
1 |
Вправо |
Возврат | ||
Возврат |
* |
* |
Не двигаться |
Останов |
Пусть эта машина работает на ленте,содержащей значение 5. Когда машина находится в начальном состоянии, а в текущей ячейке записана *, таблица приказывает переписать *, переместить головку считывания-записи на одну ячейку влево и перейти в состояние «прибавить». После выполнения этих действий машину можно описать следующим образом:
Рисунок 3 – Лента машины Тьюринга в состоянии «прибавить»
Для продолжения работы посмотрим в таблице 1, что следует делать в состоянии «прибавить» с единицей в текущей ячейке. Таблица говорит нам заменить 1 в текущей ячейке на 0, передвинуть головку считывания-записи на одну ячейку влево и войти в состояние «перенос».
Рисунок 4 – Лента машины Тьюринга в состоянии «перенос»
Мы снова обращаемся к таблице 1 за дальнейшими указаниями и обнаруживаем, что в состоянии «перенос», если в текущей ячейке содержится 0, необходимо заменить 0 на 1, переместить головку считывания-записи на одну ячейку вправо и войти в состояние «возврат».
Рисунок 5 – Лента машины Тьюринга в состоянии «возврат»
В этой ситуации таблица говорит нам, что следует заменить 0 в текущей ячейке на 0, передвинуть головку считывания-записи на одну ячейку вправо и остаться в состоянии «возврат».
Рисунок 6 – Состояние машины Тьюринга после замены
Теперьследует переписать звездочку в текущей ячейке и войти в состояние «останов». Таким образом, машина останавливается в нужной конфигурации, т.е символы на ленте представляют значение 6.
Рисунок 7 – Результат работы машины Тьюринга
Машину Тьюринга из предыдущего примера можно применять для вычисления функции, известной как функция следования, которая каждому неотрицательному целому входному значению n ставит в соответствие выходное значение n + 1. Необходимо всего лишь поместить входное значение в бинарной форме на ленту машины, запустить машину, дождаться ее остановки и считать выходное значение с ленты. Функция, которую можно вычислить подобным образом на машине Тьюринга, называется вычислимой по Тьюрингу (Turingcomputable).
Предположение Тьюринга заключалось в том, что вычислимые по Тьюрингу функции являются вычислимыми функциями. Другими словами, он считал, что вычислительная мощь машин Тьюринга равна вычислительным способностям любой алгоритмической системы. Сегодня это предположение называют тезисом Черча—Тьюринга. С момента появления первой работы Тьюринга было собрано множество подтверждений этого тезиса, и сегодня считается, что вычислимые функции и функции, вычислимые по Тьюрингу, — это одно и то же.
Теперь мы рассмотрим функцию, невычислимую по Тьюрингу, которая, согласно тезису Черча-Тьюринга, считается невычислимой в общем смысле. То есть вычисление этой функции лежит за пределами возможностей современных компьютеров.
Невычислимая функцияотносится к проблеме, известной как проблема останова, котораясводится к вопросу:Остановится ли программа, если она была запущена с определенными начальными условиями? Например, рассмотрим простую программу на скелетном языке:
while X not 0
do:
incr X;
end;
Если мы запустим эту программу с начальным значением переменной X, равным нулю, цикл выполняться не будет, и программа вскоре завершится. Если же начальное значение X будет отличаться от нуля, цикл будет выполняться бесконечно, и процесс окажется непрерывным.
В этом случае легко сделать вывод, что выполнение программы прекратится только в случае, если запущена она была со значением X, равным 0. Однако если мы рассмотрим более сложные программы, задача предсказания их поведения существенно усложнится.
Предыдущий пример показал, что результат (остановится ли в конечном итоге программа?) может зависеть от начальных значений переменных. Поэтому, если мы хотим предсказать, прекратится ли выполнение программы, необходимо контролировать её начальные значения. Наша цель — воспользоваться преимуществами метода под названием самовызов, идея которого заключается в том, что объект обращается к самому себе. В нашем случае самовызов будет реализован путем назначения переменным программы значения, представляющего саму программу.
Рассмотрим, что произойдет, если выполнить его для простой программы(1):
while X not 0
do;
incr X;
end;
Мы хотим узнать, что произойдет, если запустить эту программу, присвоив переменной X закодированный вариант самой программы (рис. 8). В этом случае ответ очевиден. Так как значение X не равно нулю, программа попадет в цикл и никогда не остановится. С другой стороны, если выполнить подобный эксперимент над программой(1), то она остановится, так как независимо от начального значения на момент достижения структуры while-end значением переменной X будет ноль.
Выведем следующее определение: программа является самозавершающейся, если ее выполнение прекращается при условии, что при запуске ей на вход была дана она сама. Это тот самый пример самовызова, о котором было сказано ранее.
Рисунок 8 – Тестирование программы на самозавершение
Теперь мы можем точно описать проблему останова — это задача определения, является или не является программа на скелетном языке самозавершающейся. Но, к сожалению, нет единственного алгоритма, который может проверить любую программу на проблему останова. По этой причине решение этой проблемы выходит за пределы возможностей компьютеров.
Наблюдения, сделанные нами в примерах, являлись уникальными для этих конкретных случаев, и их нельзя применять во всех ситуациях. Однако для проблемы останова требуется один общий алгоритм, который можно применить к любой программе на скелетном языке для определения, является ли она самозавершающейся. Наша способность использовать догадки для выявления самозавершаемости определенных программ не доказывает существования одного общего подхода, применимого ко всем случаям.
Теперь следует показать, что решение проблемы останова выходит за пределы возможностей машин. Мы будем исходить из того, что для решения задачи потребуется алгоритм вычисления невычислимой функции. Входами этой функции являются закодированные варианты программ на скелетном языке, а выходами — значения 0 и 1. Для краткости мы будем называть эту функцию функцией останова.
Наша задача — продемонстрировать, что функция останова является невычислимой. Следует доказать, что утверждение «функция останова вычислима» не может быть правдой. Доказательство продемонстрировано на рис.9.
Рисунок 9 – Доказательство неразрешимости проблемы останова
Если функция останова вычислима, тодолжна существовать программа на скелетном языке для вычисления этой функции. Другими словами, эта программа должна останавливаться с выходом, равным 1, если ее вход — закодированный вариант самозавершающейся программы, и выдавать 0 в противном случае.
Для выполнения этой программы нужно просто присвоить всем переменным программы значение, равное закодированной версии тестируемой программы, ведь значение переменной, не являющейся входной, не влияет на конечное выходное значение. Мы делаем вывод, что если функция останова вычислима, то должна существовать программа на скелетном языке, которая останавливается с выходным значением 1, если все ее переменные инициализировались как закодированный вариант самозавершающейся программы, и завершается с выходом 0 в противоположном случае.
Предполагая, что выходная переменная программы — X, мы можем изменить программу, добавив в конце операторы:
while X not 0 do;
end;
Эта новая программа должна быть либо самозавершающейся, либо нет. Однако мы увидим, что она не является ни той, ни другой.
В частности, если эта новая программа самозавершающаяся, и мы запустим ее с переменными, содержащими закодированное представление этой программы, то на момент, когда выполнение достигнет добавленного оператора while, значение переменной X будет равно 1. Теперь программа навсегда войдет в цикл while-end, так как мы не предусмотрели уменьшение значения X в цикле. Однако это противоречит нашему предположению, что новая программа самозавершающаяся. Таким образом, мы можем сделать вывод, что новая программа не является самозавершающейся.
Если же новая программа не самозавершающаяся, и мы запустим ее, присвоив переменным закодированное значение программы, она достигнет добавленного оператора while со значением X, равным 0. (Это происходит потому, что операторы, предшествующие оператору while, генерируют выход программы, равный 0, если на вход подана кодировка несамозавершающейся программы). В этом случае цикл while-end не будет выполнен, и программа остановится. Но это свойство самозавершающейся программы, поэтому мы делаем вывод, что новая программа самозавершающаяся, так же, как ранее увидели, что она не является самозавершающейся.
В итоге мы видим, что получили невозможную ситуацию: с одной стороны, программа может быть либо самозавершающейся, либо нет, а с другой — может не быть ни той, ни другой. Следовательно, предположение, которое привело к такому противоречию, ложно.
Мы делаем вывод, что функция останова невычислима, и, поскольку решение проблемы останова зависит от вычисления этой функции, можно утверждать, что ее решение лежит за пределами способностей любой алгоритмической системы. Подобные проблемы называются неразрешимыми проблемами.