Контрольная работа № 2 по информатике (Материалы и задания по информатике для учащихся 11 классов (МИФ-2, №4, 2006 г.) Информатика, 10-11 классы Мендель В.В., доцент кафедры геометрии ДВГГУ Машины с неограниченным числом регистров как способ представления алгоритмов вычислимых функций Введение Цель данной статьи – изучить важное понятие теории алгоритмов – исчисление алгоритмов. Вы имеете определенный опыт работы с алгоритмами: встречались с ними на уроках математики, сами составляли программы для ЭВМ на занятиях по информатике. При этом понятие алгоритм имело всегда достаточно широкое и размытое толкование. Такое толкование не позволяло математикам провести подробное исследование свойств алгоритмов. Поэтому сразу несколько математиков в разных странах (А. Тьюринг, А. Марков, Дж. Черч и др.) предприняли попытку аксиоматически описать, что такое алгоритм. В результате было получено несколько теорий (Машины Тьюринга, Нормальные (Марковские) алгорифмы, Частично-рекурсивные функции, Машины Поста, Машины с неограниченным числом регистров и пр.) которые получили общее название – исчисления. С одним из таких исчислений – Машинами с неограниченным числом регистров (МНР) – Вы и познакомитесь в этой статье. Уточнение понятия «алгоритм» Термин «алгоритм» широко используется в научной и бытовой речи. В самом общем случае под алгоритмом понимают некоторую хорошо прописанную последовательность действий (шагов), направленных на решение некоторой, часто возникающей задачи, выполнение которых должно привести (за конечное число операций) к желаемому результату. Заметим, что слово «выполнение» предполагает, что исполнитель алгоритма в состоянии правильно выполнить каждый его шаг. Очевидно, что в такой, очень общей интерпретации, изучать алгоритмы и их свойства практически невозможно. Поэтому необходимо уточнить определение этого понятия, его свойства, и объекты, к которым применяются алгоритмы. Итак, алгоритм – это четкая система инструкций. Такая формулировка предполагает, что каждый шаг алгоритма четко прописан, и, кроме того, указываются точные правила перехода от одного шага к другому, которые вытекают из тех (входных) условий, при которых начал выполняться алгоритм и от выполненных ранее шагов. Это условие называется детерминированностью. Далее, алгоритм применяется для часто возникающих задач, то есть, речь идет об массовых однотипных (отличающихся только входными или начальными условиями) задачах. Такое свойство алгоритма называется массовость. Алгоритм должен за конечное число шагов на допустимых начальных условиях приводить к правильному результату. Такое свойство алгоритма называется результативностью или конечностью. Из предыдущего также вытекает, что сам алгоритм (его запись) должен состоять из конечного числа команд, так как бесконечное число команд за конечное время выполнить нельзя. Теперь рассмотрим свойства алгоритмов, связанные с исполнителями. Как было отмечено выше, исполнитель должен уметь правильно выполнять все шаги алгоритма. Также важно, что при выполнении одного и того же алгоритма при одинаковых начальных условиях, разные исполнители получали один и тот же результат. Такое свойство называется независимостью (от исполнителя). Сделаем еще одно важное замечание по поводу исполнителей: как бы ни велико было желание заполучить в качестве исполнителя очень опытного и умного человека, но правильнее всего предполагать, что исполнитель – это некоторая машина (автомат), которая умеет выполнять очень небольшой набор самых простых операций. Например: записать или стереть букву, перейти к следующей букве слова, сравнить две буквы и т.п. Требовать от исполнителя сравнить два больших числа, определить, делится одно число на другое или нет, проверить, сварилась ли в супе картошка - неправильно и нелепо. Теперь мы можем сформулировать более точное определение понятия «алгоритм». Определение 1. Алгоритм решения массовой задачи это конечная последовательность команд, доступных для исполнителя. Каждый шаг при выполнении алгоритма однозначно определяется предыдущими шагами и начальными условиями задачи. Правильное решение (результат) получается за конечное число шагов. Алгоритмический процесс заканчивается только с правильным результатом. Если для некоторых начальных условий задача не имеет решения, то алгоритм работает вечно. Замечание. Последние два предложения в определении означают, что необходимо корректно формулировать условия задачи и правила получения результата. Приведем пример. Рассмотрим две очень похожих задачи: Задача 1. Вычислить натуральное число, являющееся квадратным корнем данного натурального числа. Задача 2. Проверить, является ли квадратный корень из данного натурального числа натуральным числом. Если да, то вычислить этот корень, если нет, напечатать букву «Н». Алгоритм решения первой задачи должен останавливаться только тогда, когда входное значение является квадратом некоторого натурального числа (1, 4, 9, 16…). Во всех остальных случаях он работает вечно. Алгоритм решения второй задачи должен останавливаться всегда. Замечание о кодировке входных и выходных значений алгоритмов Мы в дальнейшем будем рассматривать в основном алгоритмы, действующие на множестве натуральных чисел N. В связи с этим возникает проблема записи (кодировки) таких чисел, так как такая кодировка должна быть понятна исполнителю алгоритма. Кроме того, от вида кодировки зачастую существенно зависит вид самого алгоритма решения задачи. Как правило, будут использоваться три кодировки: десятичная запись числа; двоичная запись числа; унарное представление: натуральное число n представляется в виде слова, состоящего из n+1 палочки 1111 ... 111 . n1 раз Кроме этого могут использоваться различные служебные значки (маркеры), символизирующие различные операции или разделяющие пары чисел (если алгоритм предполагает наличие нескольких входных или выходных значений). Подробно на алфавитах и кодировках мы остановимся, когда будем рассматривать исчисления алгоритмов. Вычислимые функции Уточним объекты, к которым применяются алгоритмы. Теория алгоритмов изучает в основном вычислительные алгоритмы (в широком смысле этого слова). Заметим, что аргументами вычислительных алгоритмов должны быть конечные числа, результат вычислений также должен быть конечным числом. Действительно, если рассматривать числа, являющиеся бесконечными дробями, то за конечное число шагов нельзя прочитать данное число, кроме того, результат, являющийся бесконечной дробью, нельзя вывести за конечное время. Это означает, что алгоритмы не применимы, например, к иррациональным числам, стандартная десятичная запись которых является бесконечной дробью. Читатели имеют опыт арифметических операций над конечными десятичными дробями, а так же над положительными и отрицательными числами. Этот опыт позволяет сделать вывод о том, что сначала выполняется действие над натуральными числами, а затем, по определенным правилам, этот результат превращается в десятичную дробь или число со знаком. Причем наиболее трудоемка первая часть действий. В принципе, любые входные значения для алгоритма могут быть заданы (описаны) конечным набором слов конечной длины, а результат выведен в таком же словесном формате. Такие входные слова и выходные значения можно интерпретировать как числа, записанные в некоторой системе счисления. Тогда процесс работы алгоритма можно интерпретировать как вычислительный. Таким образом, любой алгоритм, оперирующий с символьными объектами (числами, словами, предложениями и т.п.) можно рассматривать как вычислительный. Все сказанное выше позволяет сузить область применения алгоритмов на множество натуральных чисел. Поэтому в дальнейшем мы будем рассматривать функцию f ( x1 , x2 ,..., xn ) , принимающую значения из множества натуральных чисел, аргументы которой xi определены на подмножествах Mi множества натуральных чисел N. Обозначим M M1 M 2 ... M n , M N n . Определение 2. Функция f : M N , называется вычислимой, если существует алгоритм, вычисляющий данную функцию для всех значений из области M. Если M совпадает с N n, то она называется тотальной, в противном случае – частичной. Рассмотрим примеры вычислимых функций. Пример 1. Функция следования s( x) x 1 . Это, очевидно, тотальная вычислимая функция. Алгоритм ее вычисления в унарной кодировке очень прост: нужно дописать в конце этого числа еще одну палочку. Пример 2. Аннулятор Z ( x) 0 . Также тотальная вычислимая функция. Для ее вычисления нужно стереть входное значение и написать число «Ноль» (в соответствующей кодировке). Пример 3. Функция – проектор J in ( x1 ...xi ...x n ) xi (зависит от n натуральных чисел, на выходе дает значение, равное i-тому входному аргументу). Тотальность и вычислимость данной функции также очевидна. Суть алгоритма сводится к тому, что нужно стереть n - 1 записанное число, оставив только i –тое по счету. x ,если это натуральное число Пример 4. Функция sqrt ( x) . ( зацикцивае тся),если это не натуральное число Это вычислимая частичная функция. Коротко опишем алгоритм ее вычисления: Шаг 1. Вводится число x. Шаг 2. Числу i присваивается значение 0. Шаг 3. Вычисляется число y = i2. Шаг 4. Проверяется условие «y = x». Если условие истинно, то выполняется переход к Шагу 5, иначе числу i присваивается значение i+1 и выполняется переход к Шагу 3. Шаг 5. Записывается ответ: «корень квадратный из x равен i». Заметим, что данный алгоритм останавливается только в том случае, когда для данного входного значения существует квадратный корень, являющийся натуральным числом. В остальных случаях алгоритм работает вечно. Рассмотрим пример частичной функции от двух переменных. Пример 5. Функция q, если существует q (натуральное), такое, что x q y, f ( x, y ) x y , если не существует q (натуральное), такое, что x q y. Вот схема алгоритма, вычисляющего эту функцию: Шаг 1. Вводятся числа x и y. Шаг 2. Числу q присваивается значение 1. Шаг 3. Вычисляется число z = y q. Шаг 4. Проверяется условие «z = x». Если условие истинно, то выполняется переход к Шагу 5, иначе числу q присваивается значение q+1 и выполняется переход к Шагу 3. Шаг 5. Записывается ответ: «x : y равно q». Машины с неограниченным числом регистров (МНР) В этом параграфе мы рассмотрим исчисление алгоритмов, которое близко к стандартному языку программирования и позволяет наглядно описывать различные алгоритмы вычисления. Описание МНР - машины 1. МНР - машина располагает неограниченным числом перенумерованных ячеек 0, , n ,… в которые можно записать любые натуральные числовые значения. 2. МНР – машина выполняет четыре типа стандартных команд: 1. Z (n) - записывает в ячейку с номером n число ноль не зависимо от предыдущих значений (аннулятор), 2. S (n ) – увеличение на единицу значения в ячейке n (в пустую ячейку записывается единица) – функция следования, 3. T (m, n) – копирует число из ячейки с номером m в ячейку с номером n (аналог проектора), 4. J (m, n, q ) – команда условного перехода: если значения в ячейках с номерами m и n совпадают, то осуществляется переход к команде с номером q. 3. Программа МНР – машины имеет следующую структуру. Это конечный пронумерованный список операторов. Команды типа 1- 3 выполняются по порядку одна за другой, если встречается команда типа 4, то при выполнении условия осуществляется переход к внеочередной команде q, в противном случае выполняется команда со следующим номером. 4. Ввод начальных условий и извлечение конечного результата. Правила останова: 1. Если вычисляется функция от n аргументов, то входные значения помещаются в первые n ячеек. 2. Алгоритм заканчивает работу (останавливается) в том случае, когда выполнены все команды программы или, если выполнена команда перехода к несуществующему номеру команды программы. 3. Результатом вычисления является число, которое находится в ячейке с номером 0. Примеры представления алгоритмов с помощью МНР – машин Заметим, что МНР – машины, по сути, являются одним из диалектов операторного языка для машин Тьюринга, который использует ограниченный набор элементарных машин (аннуляторы, функции следования и проекторы) и операцию суперпозиции, которая реализует либо линейный вызов следующей по порядку машины, либо условный переход к другой машине. 0, если x 0, Пример 6. Составить программу, вычисляющую функцию s ( x) x 1, если x 0. Решение. Предварительное обсуждение По правилам, число x помещено в ячейку с номером 0. 1. Нужно сравнить значение в этой ячейке с нулем и, если имеет место равенство, выйти из программы. Для этого аннулируем значение в ячейке номер один и применим к нулевой и первой ячейке функцию условного перехода на адрес несуществующей команды (это остановит машину). 2. Организуем процесс вычисления значения (x-1). Аннулируем значение ячейки номер три и увеличим его на единицу. Будем сравнивать значения в ячейках с номерами ноль и три, при этом, если равенство не имеет места, то на единицу (с помощью функции следования) будем увеличивать значения в первой и второй ячейках. Когда, наконец, будет выполнено условие равенства значений в ячейках с номерами ноль и два, тогда в ячейке с номером 1 будет храниться результат. Останется с помощью оператора копирования поместить его в ячейку с номером ноль и остановить программу. Программа 1. Z(1) - аннулирование значения в ячейке номер один, 2. J(0,1,100) - проверка равенства входного значения нулю, 3. Z(2) - аннулирование значения в ячейке номер 2, 4. S(2) - увеличение значения в ячейке номер 2 на единицу, 5. S(1) - увеличение значения в ячейке номер 1 на единицу, 6. J(0,2,8) - проверка того, что значение во второй ячейке совпадает с введенным, переход к команде копирования результата в первую ячейку, 7. J(0,0,3) - переход к командам 4 и 5, увеличивающим значения в 1 и 2 ячейках, 8. T(0,1) - копирование результата из ячейки номер 1 в ячейку номер 0. Замечания. 1. Команда номер два является примером условного перехода в нижнюю часть программы. 2. Команды номер 6 и 7 показывают, как реализуется в МНР цикл с постусловием. Пример 7. Составить МНР – программу, вычисляющую функцию сложения sum(x,y). Решение. 1. Входные значения хранятся в ячейках с номерами ноль и один. Сначала имеет смысл проверить, является ли хотя бы одно из входных значений нулем. Если это так, то результатом является второе число. 2. Если оба значения не равны нулю, то реализуется основной алгоритм вычисления: одновременно увеличивается на 1 значение в нулевой и второй ячейках. При этом проверяется, что число из ячейки номер два равно значению в ячейке номер 1. Если условие выполнено, то процесс сложения завершен. Программа. 1. Z(3) - аннулирование значения в ячейке номер 3, с ним будут сравниваться входные значения, 2. J(0,3,9) – переход к команде номер 9, реализующей вычисление результата, если x=0 (копирование значения из ячейки 1 в ячейку 0), 3. J(1,3,10) – переход к несуществующей команде номер 10, реализующей вычисление результата, если y=0 (просто остановка программы), 4. Z(2) - аннулирование значения в ячейке номер 2, 5. S(0) - увеличение значения в ячейке номер 0 на 1, 6. S(2) - увеличение значения в ячейке номер 2 на 1, 7. J(1,2,10) - переход к завершению программы, если значения в ячейках 1 и 2 совпали (значит, к числу в первой ячейке прибавлено y единиц), 8. J(0,0,5) - повторение процедуры прибавления единиц в ячейках с номерами ноль и два, если не выполнено предыдущее условие, 9. T(1,0) - копирование значения первой ячейки в нулевую). Замечания. 1. Можно было не рассматривать два частных случая в начале, но тогда бы программа долго работала на комбинации x=0, y=k – некоторое большое число. 2. В программе для остановки при выполнении условия выбирается номер 10, идущий сразу за номером последней по счету команды программы. На практике такие изыски необязательны, главное, чтобы номер команды был больше номера последней существующей команды программы (в нашем случае вместо 10 можно взять 100, 1000 и т.п.). «Неформальная» вычислимость и вычислимость в исчислении В начале статьи вычислимость функции трактовалась как вычислимость с помощью некоторого (неформального) алгоритма. Функцию, которая может быть вычислена с помощью некоторой МНР – программы будем называть МНР – вычислимой. Возникает естественный вопрос, как связаны вычислимость и МНР – вычислимость? Ответ на этот вопрос дает следующий тезис. Аналог тезиса Тьюринга для МНР. Функция «неформально» вычислима тогда и только тогда, когда она МНР - вычислима. Формальное доказательство этого тезиса невозможно, так как само понятие «вычислимая функция» дано неформально. Однако этот тезис дает нам возможность в дальнейшем исследовать свойства вычислимых функций, рассматривая их представление в виде МНР – программ. Контрольное задание №2 Представленные ниже вопросы и задачи являются контрольным заданием №2 для учащихся 10-11 классов. Для зачета необходимо ответить на все контрольные вопросы и решить хотя бы одну задачу. Решения необходимо оформить в отдельной тетради и выслать по адресу 680000, г. Хабаровск, ул. Дзержинского, 48, ХКЦТТ, ХКЗФМШ. Контрольные вопросы И.кв.10-11.2.1. Перечислите основные свойства алгоритмов. И.кв.10-11.2.2. Опишите условия, которым должны удовлетворять исполнители алгоритмов. И.кв.10-11.2.3. Какие из приведенных ниже последовательностей действий можно отнести к алгоритмам, а какие нельзя. Объясните почему? Инструкция, направленная из разведцентра резиденту с указанием порядка встречи с прибывающим к нему на явку агентом. Напечатанная на пакете инструкция по приготовлению супа из концентрата. Программа для вычисления n!, написанная на одном из языков программирования. И.кв.10-11.2.4. Дайте определение вычислимой функции. И.кв.10-11.2.5. Чем частичная функция отличается от тотальной? Приведите примеры. И.кв.10-11.2.6. Приведите основные операторы МНР машин и опишите их действие. И.кв.10-11.2.7. Какова структура МНР программы? При каких условиях машина останавливает работу, где находится результат? И.кв.10-11.2.8. Как можно реализовать цикл в программе МНР машины? Задачи Составьте МНР – программы, вычисляющие следующие функции: И.10-11.2.1. Произведение двух чисел mult(x,y)=x∙y. x y, если x y, И.10-11.2.2. Частичную разность x y 0, если x y. 1, если x y, И.10-11.2.3. Знак разности sign ( x y ) 0, если x y. И.10-11.2.4. Функцию, вычисляющую остаток от деления x на y. И.10-11.2.5. Функцию, вычисляющую неполное частное при делении x на y.