Файл: Трахтенброт, Б. А. Алгоритмы и вычислительные автоматы.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 19.10.2024

Просмотров: 142

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

алгоритмов для композиции, разветвления и повторения мы можем получить исходя из формулы (фр) тыорингову программу для алгоритма Евклида. Конечно, эта программа будет более громоздкой, чем функциональная схема рис. 14, но зато ее получение не требует никакой особой изобрета­ тельности.

Коль скоро мы намерены пользоваться входным языком, то вместо четырех частных типов программирующих алго­ ритмов удобнее говорить о едином, объединяющем их, про­ граммирующем алгоритме, который по любой формуле входного языка строит соответствующую ей тыорингову программу. Естественно, предполагается, что наряду с фор­ мулой входного языка заданы и тьюрииговы программы для «элементарных» алгоритмов, встречающихся в формуле.

§11. РЕКУРСИВНЫЕ ФУНКЦИИ

ИФУНКЦИИ, ВЫЧИСЛИМЫЕ ПО ТЬЮРИНГУ

11.1Вычисление функций и алгоритмические пробле­ мы. В этом параграфе речь идет о числовых функциях одно­ местных, т. е. от одной переменной, или, многоместных, т. е. от многих переменных; предполагается, что значениями са­ мой функции, а также ее аргументов являются натуральные числа. Числовую функцию / будем называть вычислимой по Тьюрингу, если существует машина Тьюринга, вычисля­ ющая ее. Конечно, аккуратное определение функции, вы­ числимой по Тьюрингу, должно содержать указание на то,

каким образом кодируются исходные значения аргументов и искомое значение функции; в частности, можно было бы пользоваться унарной записью натуральных чисел (число х изображается х палочками), или записью в какой-нибудь позиционной системе счисления (например, двоичной, деся­ тичной и т. п.). Ясно, однако, что класс функций, вычисли­ мых по Тьюрингу, не зависит от того, какое именно из ука­ занных представлений чисел на самом деле принято, напри­ мер, унарное или десятичное. Ведь мы уже располагаем тыоринговыми программами, переводящими унарное пред­ ставление в десятичное и десятичное представление в унар­ ное. Поэтому, коль скоро будет построена тьюрингова про­ грамма '21 для вычисления функции / при унарной записи чисел, то ее можно перестроить в программу 8 для вычис-

4 -

99


ления топ же функции с использованием десятичного пред­ ставления. Для этого достаточно представить У в виде по­ следовательной композиции трех программ: программы перевода из десятичной системы в унарную, программы % программы перевода из унарной системы в десятичную. (Здесь напрашивается сравнение с электронными вычис­ лительными машинами, работающими в двоичной системе счисления; в них имеется устройство, или программа, для переработки исходных данных из десятичной системы в дво­ ичную, а также устройство, или программа, для перевода окончательной программы опять в десятичную систему.) Что

же касается

пар

чисел,

троек

чисел и т.

п., то они будут

изображаться

в

виде

х * г/,

х * у * г и

тому подобное,

где х, у, г — изображения соответствующих чисел в избран­ ной системе представления, а * — некоторый специальный символ (разделительный знак). Полезно заметить, что хотя мы намерены уделять главное внимание вычислению число­ вых функций, тем не менее это не ограничивает по существу природы алгоритмических проблем, решаемых на машинах Тьюринга. Дело в том, что если зафиксирован алфавит Л из г букв, то всякое слово R в этом алфавите может рассмат­ риваться как запись некоторого натурального числа в г-н системе счисления. Это позволяет интерпретировать исход­ ные данные, изображенные в виде слова R, как некое первона­ чально заданное натуральное число*1 . Поскольку такое же замечание можно сделать и относительно слова, изобра­ жающего результирующие данные, то ясно, что алгоритм поиска решения задачи можно интерпретировать как ал­ горитм вычисления значения числовой функции по заданно­ му значению ее аргумента. Подобная арифметическая интер­ претация (или короче — арифметизация) часто применяется в математической логике и теории алгоритмов; мы с ней еще встретимся в данном параграфе. Уже в предыдущих пара­ графах были составлены тыоринговы программы или разъяс­ нено, как можно составить таковые для вычисления суммы х + у, произведения х X у и т. п. Мы могли бы без труда

*> Применительно к реальным вычислительным машинам обычно употребляют такие выражения, как «в памяти машины хранятся 1000 24-разрядиых двоичных чисел» и т. п. Ясно, что под числами здесь имеются в виду двоичные слова соответствующей длины. Ма­ шине и впрямь безразлично, интерпретируются ли эти слова как двоичные записи чисел или как записи какой-нибудь другой нечисло­ вой информации.

100


увеличить их список и построить программы для многих других часто встречаемых числовых функций (например, для одноместных функций х2, х3, 2х, х\, для двумест­ ной функции xv и т. п.). Однако для более ясного представ­ ления о том, какие функции вычислимы по Тьюрингу (и как строятся соответствующие программы), целесообразно по­ ступать следующим образом. А1ы рассмотрим ряд естест­ венных н обычно употребляемых операторов, т. е. способов образования новых фунщнй, исходя из ранее определенных функций, и попытаемся выяснить: можно ли (и как?) соста­ вить программы для новых функций, коль скоро уже по­ строены программы для исходных функций?

Применяя входной язык и программирующие алгоритмы, описанные в предыдущем параграфе, мы сравнительно легко обнаружим, что в ряде важных случаев действительно удает­ ся построить такие программы. Тем самым выяснится, что класс тыориигово вычислимых функций необычайно широк и охватывает все функции, которые описываются посред­ ством так называемых индуктивных определений, основан­ ных на переходе от п к п + 1. Такие определения называют еще рекуррентными, что в буквальном смысле означает «возвратное определение» (от латинского слова recurso — бегу назад, возвращаюсь). Так как самое построение нату­ ральных чисел носит рекурсивный, т.,е. возвратный ха­ рактер (чтобы определить число 4, нужно сначала опреде­ лить число 3, чтобы определить число 3, нужно сначала определить 2 и т. д. вплоть до 1), то и определение числовых функций при помощи «возвращения» от неизвестного к из­ вестному весьма естественно. Именно так обычно опреде­ ляются или могут быть определены наиболее употребитель­ ные в арифметике и теории чисел функции: сумма, произ­ ведение, число сочетаний из т элементов по п и т. д. Воз­ можны различные варианты рекурсивных определений, все они, однако, естественным образом объединяются в оп­ ределении рекурсивной функции (точнее—общерекурсивной или частично-рекурсивной функции, в зависимости от того, предполагается ли, что функция всюду определена пли нет). Итак, будет показано, что класс тыорингово вычислимых функций настолько широк, что ои охватывает все рекурсивные функции. Переходим к реализации наме­ ченного плана.

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

101


Наша ближайшая цель - описать операторы трех ти­ пов — простейшие, примитивной рекурсии и (.i-оператор — и показать, что класс вычислимых функции замкнут отно­ сительно этих операторов. Иначе говоря, если мы распо­ лагаем программами 21,,, -lf! ( ... и функция / получается в результате применения какого-нибудь из указанных опе­ раторов к функциям fv /2 , то может быть построена

ипрограмма

П.2 Простейшие операторы. К ним относятся операторы супер­ позиции н введения фиктивных аргументов. Хотя мы рассматриваем здесь эти операторы применительно к функциям, аргументы и зна­ чения которых — натуральные числа, на самом деле они имеют смысл для функций с любыми областями задания н значении. Путем введе­ ния фиктивных аргументов заданная функция I может быть преоб­ разована в функцию h от большего числа аргументов; фиктивность (несущественность) вновь присоединенных аргументов означает, что при их изменении значение функции не изменяется (коль скоро за­ фиксированы значения «старых» аргументов).

Например, по заданной одноместной функции [t (х) определяем двуместную функцию Л условием h (х, y) f, (х). Можно ввести одно­ временно несколько фиктивных переменных, например h (х, у , и, v) =>

— I (у, v).

Во всех

таких

случаях

построение Ul/, по ?1/

совершен­

но очевидно.

 

 

 

 

 

 

 

Например, если Л (.«, у) =

ft (х),

то ^ по заданной

паре

х * у

сти­

рает »(/и

далее работает

как

4\f. Обычно допускают

вольность

мне

различают

между

собой функции,

которые отличаются фиктивными

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

шого однообразия

в программистских

процедурах.

Из заданных функции путем подстановки функции вместо

аргументов можно

образовать новые

функции (так называемые

сложные функции, или функции от функций); в этом и заключается

действие оператора

суперпозиции.

 

 

 

Рассмотрим, например, одноместную функцию ср(х), определяе­

мую суперпозицией одноместных

функций j и

g: ср(х) =

g(l {х)).

Тогда, очевидно,

формула ЭД/ °

описывает

алгоритм

вычисле­

ния функции ф и по ней с помощью программирующего алгоритма

может быть получена тыорингова

программа 91ф . Аналогично, хотя

и несколько сложнее, строится программа в случае суперпозиции

многоместных

функций.

Пусть,

например,

двуместная

функция

ф (х-,, х2) определена как суперпозиция g

(I, (х,, л-2),

(*,,

л-2), / 3

ь

л,-2)). Тогда 51/ эффективно

строится в соответствии с формулой

 

 

 

 

Коп 2-

( O l f | | | Q l f J o i f

3 ) , 3

a M f o o l r

 

 

 

 

Действительно,

исходя из слова х1*

х2

алгоритм

Коп2 снимает

две его

копии

и

вырабатывает

слово

xt

» ,v2 1| ,vA

* хг

\\ .v,

«

х2 ,

которое

перерабатывается

параллельной

композицией

9lj

|| »(j

\\Щ

102


в слово fn

(xt, хг) |] f,2 (xx, x«) || (х

x 2 ) . Для последующего примене­

ния

алгоритма 91^ предварительно

приходится еще

заменить

сим­

вол

|| на

разделительным символ

», что и делает

алгоритм

Зам'ц.

Вовсе не обязательно, чтобы функции [л , [ 2 , ... (внутренние функ­ ции суперпозиции) зависели от одних и тех же аргументов или даже, чтобы число аргументов было у них одним и тем же. Пусть, напри­

мер,

cp (.v, у , и, г)

•=

g (fn [х, у),

fl2 (х). f,3 (х, и, г)). Конечно,

програм­

му

мы могли

бы

построить

исходя из

91^, ЭД^, Slg

способом,

похожим — хотя

и не совсем идентичным

— тому, как это было сде­

лано выше. Однако здесь удобнее поступать иначе. Сначала состав­

ляем

программы

?1Л 1 , 31/,.,

для

функций

/Ji

{х, у, и, г) =

f j (Л:, у),

Л2 (х, у, и,

г) = /2 (х), Л3 {х, у, и, г) =

=Ъ (*. и, г),

получаемых введением фиктивных переменных. Далее строим про­ грамму 3(ф исходя из «стандартной» суперпозиции

Ф (х, У, и, z) = g

(х, у,

и, г),

Л2 (х, у, и, г),

А3 (х, у,

и, г)).

П р и м е ч а н и е .

Для

многих

конкретных

функций

укорени­

лись так называемые инфиксные обозначения, в которых функ­

циональный

символ ставится не впереди аргументов

(так

называе­

мое префиксное обозначение), а между

ними.

 

Например,

употреб­

ляются инфиксные обозначения для арифметических

функций

д-

+

•f

у , х X у

и т. д. Их

 

префиксные

обозначения выглядели бы

так:

4 [х,

у)

Х(х,у)

и т. п. Соответственно

привычные выражения

вида

+ у)(и

+

v)

или

(Л: — иу)

: (иг

- f

v)

являются

не

чем

 

иным,

как

инфиксными

записями суперпозиций X ( + (х, у), +(«,

v))

 

н

:(—(л:,Х

Х(и,

</)),

+

(Х(«, г),

 

v)).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

11.3.

Примитивная

рекурсия.

Переходим

к

рассмотрению

опе­

раторов,

н которых

наиболее

явно воплощается

определение

по ин­

дукции.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Сначала рассмотрим сравнительно простую разновидность при­

митивной

рекурсии

— так

называемую

итерацию.

 

 

 

 

 

 

 

 

Пусть заданы одноместная функция /{и фиксированное

натураль­

ное число с. Тогда числа с, ft (с), I (ft (с)), ft (ft (ft (с))), ... можно

рассмат­

ривать как

значения

ф (0),

ф (1),

ф (2),

ф

(3),

...

некоторой

новой

функции

ф.

Ее общее

определение

может

быть

сформулировано

с

помощью

ф

следующих

двух

соотношений:

 

ф

(0) =

с — базис

индукции;

+

1) = I (ф (*))

— индукционный

шаг.

 

 

Первое —

задает

начальное значение функции

ф.

Второе же является

возврат­

ным или,

как

говорят

 

еще,

рекуррентным

соотношением; оно

по­

зволяет

вернуться

от

 

искомого

неизвестного

значения

 

ф

+

1)

к

ранее

уже вычисленному

значению

ф

(х).

Например,

 

если

в

ка­

честве

f, (х) взята линейная

функция

2х,

а в качестве

константы

с —

число

1.

то

мы

получим

соотношения

 

ф

(0) =

1;

ф

+

1)

=

= 2ф

(х), которые определяют показательную функцию

ф

(х)

=

 

2х.

Такой способ определения

функции

ф

называют итерацией

функции

I при

начальном значении

с.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

J 03