Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги из ГПНТБ / Трахтенброт, Б. А. Алгоритмы и вычислительные автоматы

.pdf
Скачиваний:
31
Добавлен:
21.10.2023
Размер:
9.86 Mб
Скачать

5. Алгоритм 5 вычисляет функцию s(x) = х

1;

слово из х палочек перерабатывает в слово из х -f- 1 пало­ чек.

Составление тыоринговых программ для названных алго­ ритмов не представляет никакого труда, поэтому мы его опускаем. Впрочем, если в других случаях и окажется, что нужная нам служебная программа достаточно сложна, то ведь построить ее придется лишь однажды, а зато применять ее можно будет сколько угодно раз. Ясно, однако, что мы не можем идти по пути неограниченного разрастания за­ паса служебных программ, или, как говорят еще, библио­ теки стандартных программ. К счастью, в этом и нет необ­ ходимости. Оказывается, что существует ряд алгоритмов — их естественно называть программирующими алгоритмами,

которые позволяют строить новые тьюринговы программы исходя из данных тьюринговых программ. При этом класс служебных программ, фактически используемых, охватывает помимо уже перечисленных служебных программ еще немногие, которые будут выявлены и явно указаны в §10— 12. Программирующие алгоритмы хотя и не снимают пол­ ностью трудностей, возникающих при тьюринговом про­ граммировании, тем не менее заметно их облегчают.

Прежде чем приступить к описанию "интересующих нас программирующих алгоритмов, укажем две формальные операции над тьюринговыми программами, которые будут

часто

использоваться.

 

 

 

 

1.

Переименование всех внутренних

состояний

за исклю­

чением заключительного

состояния «!».

 

 

2.

Фиктивное расширение

внешнего

алфавита:

к преж­

нему

алфавиту S =

{slt

s2,

sft} добавляются новые сим­

волы sf t + 1 , sh+2,

sll+n,

соответственно к прежней функ­

циональной схеме добавляются новые п строк, сплошь за­ полненных заключительным состоянием «!».

Совершенно очевидно, что если для исходной схемы (программы) 21 имело место 2l(P) = R, то для преобразован­ ной (согласно операции 1 или 2) схемы SI' также справед­ ливо W(P) = R. Обратное утверждение тоже справедливо для всех слов Р в исходном внешнем алфавите. Более того, процесс переработки Р в R будет протекать в точности так же, как и прежде. В этом смысле операции 1—2 можно рас­ сматривать как эквивалентные преобразования функцио­ нальных схем.

В дальнейшем, применяя некоторый программирующий алгоритм для исходных функциональных схем, мы можем

so

считать там,

где это нужно,

что они

уже

препарированы

 

в следующем смысле. Они приведены к общему внешнему

 

алфавиту путем подходящих

расширений

их алфавитов

 

и, кроме того, у них нет общих символов внутренних со­

 

стояний за исключением, быть может, заключительного

 

символа «!».

 

 

 

 

 

 

Переходим теперь к рассмотрению четырех важных ти­

i

пов сочетания алгоритмов:

последовательная композиция,

параллельная

композиция,

разветвление

и

повторное при­

 

менение.

 

 

 

 

 

 

10.2. Последовательная композиция. Часто встречается ситуация, когда два алгоритма — в частности, две тыоринговы программы SI, 23, — приходится сочетать следу­ ющим образом. Предписывается исходя из начальных дан­ ных, т. е. из слова Р, сначала применить алгоритм 21, а за­ тем к его результату, т. е. к слову ЩР), применить алго­ ритм 23 и, следовательно, получить слово 33(^1 (Р)). Это предписание составляет новый алгоритм — последователь­ ную композицию алгоритмов "21, 23, обозначаемую 3}. Естественно спросить, можно ли (а если да, то как) постро­ ить функциональную схему для последовательной компо­ зиции, коль скоро мы располагаем функциональными схе­ мами "21, 25. Утвердительный ответ содержится в следующей почти очевидной теореме.

Т е о р е м а (о программировании последовательной композиции). Каковы бы ни были тыорйнговы программы "21 и 23, может быть эффективно построена тыорингова про­

грамма К такая, что для

всех рассматриваемых слов Р:

Е (Я)

= 58 (91 (/>)).

Программирующий алгоритм, который строит (эффек­ тивно) программу е, заключается в следующем. Предва­ рительно препарированные программы *2l, 93 объединяются в одну программу, а в подпрограмме «а всюду заменяется символ «!» символом начального состояния программы 93

(рис. 25, а). Начальным

состоянием программы © объяв­

ляется начальное состояние

программы

-1. Совершенно

очевидно, что схема рис. 25, а в применении к слову/5 ,

изо­

браженному стандартно,

будет работать сначала как схема

% до тех пор, пока на ленте

на появится

слово R =

ЩР);

однако на этом такте первый символ будет обозреваться

уже

не в заключительном состоянии «!», а в начальном состоя­ нии гх подпрограммы 93. Благодаря этому далее продол-

91

жается переработка слова

R (стандартно

изображенного)

в соответствии со схемой 93.

 

Заметим, что условие

стандартности

изображения ис­

ходного и результирующего слов нам понадобилось исклю­ чительно для того, чтобы обеспечить согласованность пере­

хода от работы программы

21 к работе программы 33;

имен­

но,

когда

программа 83 включается

в работу, обозревается

та

ячейка,

в

кото­

 

 

 

 

 

 

 

рой

закончила

рабо­

О

If

?2

 

Ро

г

Pz

ту программа - I . По­

 

 

 

1Рг

Л

этому наш

 

програм­

1

 

 

 

грг

!

Л

мирующий

 

алгоритм

г

 

 

 

зрг

!

Л

 

 

 

 

 

годится и

в других

3

 

 

 

fPi

!

Л

 

 

 

 

ситуациях,

 

когда,

*

 

 

 

spz

/

Л

 

5

 

 

 

 

/

Л

быть может,

не

под­

 

 

 

ер2

разумевается

 

стан-

6

 

 

 

7pz

/

Л

 

7

 

 

 

г

/

Л

 

 

 

 

 

 

 

 

 

 

 

8

 

 

 

г

/

Л

 

 

 

9

 

 

 

ОЛ

/

Л

 

 

 

 

 

 

 

 

 

 

 

 

 

Л

 

Л?з

Щ,

Pz 'Pz

/

Лрг

 

V

 

 

3

I

°-1г

ль

 

ло? Л

ЬЛРа л

 

 

 

 

 

OL

Л

л

Л/7

 

 

•5/77pf

вместо!

 

 

1

J3

Л

л

Л Л

\п

 

 

 

 

а)

 

 

Рис. 25.

б)

 

 

 

 

 

 

 

 

 

 

 

 

дартное изображение слов, лишь бы гарантировалась со­ гласованность перехода от 31 к ЙЗ. В качестве примера по­ строим функциональную схему алгоритма, перерабатываю­ щего пару чисел а, Ь, заданных соответствующими наборами палочек в их общий наибольший делитель, записанный в десятичной системе счисления. Поскольку этот алгоритм является последовательной композицией двух ранее рас­ смотренных алгоритмов (в п. 9.5 и 9.2), его функциональная схема (рис. 25, б) может быть получена из схем рис. 14 и 18, так, как этого требует описанный программирующий алго­ ритм. Состояния схемы рис. 18 здесь переименованы в р,.,

ръ р 2 . Хотя схемы рис. 14 и 18 не были составлены нами

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

92

Легко понять, что теорема и соответствующий програм­ мирующий алгоритм можно распространить на последова­ тельную композицию любого конечного числа алгоритмов.

10.3. Параллельная композиция алгоритмов 21, 23 заклю-. чается по существу в совместном рассмотрении их работы применительно к соответствующим исходным данным; пусть это будут слова Р и Н, соответственно. Более точно эту разновидность сочетания алгоритмов можно описать сле­ дующим образом. Допустим, что || — некоторый символ, не встречающийся в алфавитах, посредством которых изо­ бражаются исходные данные и результаты алгоритмов $1, 23; тогда слова Р \\ Н и ЩР) || ЩН) могут применяться как изображения пар исходных слов и пар результирующих

слов. Предписывается по любому

заданному слову

Р || Н

применить к его компонентам Р,

Н алгоритмы 21, 58 и вы­

дать в качестве результата слово

ЩР) \\ ЩН). Это

пред­

писание и составляет новый алгоритм — параллельную ком­

позицию алгоритмов 21, 23, обозначаемую -I ||

33.

Напри­

мер, параллельная композиция

алгоритмов из

9.1

и 9.3

в применении к слову

 

 

 

389HI Ц П

| * | | | |

 

 

увеличит на единицу десятичное число 389, приведет сло­ жение слагаемых 6 + 4 и выдаст результат:

 

 

 

390Ц | |

| |

М М М -

 

 

 

 

Т е о р е м а

программировании

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

ком­

позиции).

ДЛЯ любых

тыоринговых

программ

21,

23 мо­

жет быть

эффективно

построена

тыорингова

програм­

ма

К, такая,

что для

всех

слов

Р,

Не

соответствую­

щих

алфавитах К (Р || Н)=

 

ЩР)

|| ЩН).

Доказательство

этой

теоремы

так же,

как

 

и

в

случае

последовательной

композиции,

заключается

в

описании

подходящего

про­

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

грамму

© так, чтобы она,

скажем,

сначала

перерабаты­

вала кусок

Р слова Р || Н в точности так же,

как

програм­

ма "21, затем

перерабатывала

кусок Н так же,

как

програм­

ма Й, и,

наконец, свела

бы

полученные результаты по обе

стороны

от

символа |] .

Трудность,

которая

возникает на

93

этом пути, состоит в том, что, воспроизведя работу програм­ мы 21 применительно к куску Р, машина Тьюринга может задавать запись куска Н, ибо ячейки, занятые этой запи­ сью, могут понадобиться для работы программы 31. Точно так же имитации работы программы 23 на куске Н может мешать кусок Р или те записи, которые возникли бы в ре­ зультате его обработки. Конечно, положение сильно упро­ стилось бы, если бы вместо одной одномерной ленты машины Тьюринга в качестве внешней памяти имелись бы две Ленты, причем правила функционирования машины допускали бы переписывание с одной ленты на другую. В таком случае можно было бы вычисление ЩР) осуществлять на одной ленте, вычисление ЩН) на другой, и потом можно было бы свести результаты вместе. Это замечание показывает, что для машин другого типа (с более «гибкой» и удобной памятью) алгоритм, программирующий параллельную композицию, был бы совсем тривиален. Для машин Тьюринга и для тыоринговых программ дело обстоит несколько хуже, но в ко­ нечном счете нужный программирующий алгоритм (и даже в разных вариантах) удается описать. Откладывая это опи­ сание до § 12, мы пока приведем в данном параграфе даль­ нейшие примеры и теоремы, опирающиеся на теорему о программировании параллельной композиции.

10.4. Разветвление алгоритмов. Уже в предыдущих па­ раграфах мы не раз встречались с предписаниями следую­ щего типа: «применить к исходным данным алгоритм 21 или алгоритм 33 в зависимости от того, обладают ли эти данные таким-то свойством (см., например, команды услов­ ного перехода для электронных вычислительных машин). При этом предполагалось, что мы располагаем соответстствующим распознающим алгоритмом Ф, т. е. алгоритмом, который применим к данным, о которых идет речь, и дает ответ «да» (они обладают этим свойством) или «нет» (если они не обладают этим свойством). Когда распознающий алго­ ритм Ф задан в виде тыоринговой программы, то обычно считают, что он применяется к исходному слову Р и пере­ рабатывает его в 1, если ответ утвердительный, и в 0 — если ответ отрицательный.

Такое предписание можно рассматривать как некоторый новый алгоритм, являющийся своеобразным сочетанием трех алгоритмов Ф, '21, 23, первый из которых является распознающим алгоритмом. Условимся называть его раз­ ветвлением 21 и S3 по признаку Ф и записывать так: «если Ф то 21 иначе 23».

94

Рассмотрим

следующий

пример,

подсказанный

 

алго­

ритмом

Евклида.

 

Пусть

Ф3 %,

 

 

212 применимы к парам

чисел а * Ъ, причем

Фх

отвечает

 

на

вопрос

«а >

ЬЪ, 2^

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

а*Ь

в

а

b * Ь,

 

212

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

а * b

в b * а. Тогда

алгоритм

«если Фъ

 

 

то

211(

иначе 912»

пере­

рабатывает

а * 6

в

а — b * b

или

в

6 * а

в

зависимости

от того, имеет ли место а >

b или а

<

Ь. Далее,

обозначим

через Ф 2

распознающий

алгоритм,

 

отвечающий

на

вопрос

тфЬЪ,

 

и

через

21 3

— алгоритм,

перерабатывающий а*6

в а.

Тогда,

применяя

 

дважды

 

разветвление,

получаем

алгоритм: «если Ф2 ,

то (если Ф ь

то

21ь иначе 212), иначе

5(а».

Этот алгоритм в точности осуществляет

один

цикл

евкли­

дова

алгоритма:

в

применении

к паре

а

*

b

он

выдает

результат

а,

если

а =

Ь,

результат

а b *6, если а~> b

и результат 6 * а, если Ь>

а.

 

 

 

 

 

 

 

 

 

 

 

Как и прежде, естественно спросить: если

алгоритмы

ф,

3t,

25

заданы

 

в

 

виде

тьюрииговых

 

программ,

то можно ли

построить (и как?) тьюрингову

программу

для

алгоритма

«если

Ф, то

9(,

иначе

 

58»? Справедлива

следу­

ющая

 

 

 

программировании

 

разветвления).

Како­

Т е о р е м а

 

вы бы ни были

тьюринговы

программы

St и S3 и

распознаю­

щая

тыорингова программа

Ф,

применимые

к словам в од­

ном и том лее алфавите

А,

может

быть

эффективно

построена

тыорингова

программа

 

S,

такая,

что для

всех

слов

Р

в

алфавите

А:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

^.

 

|21(Р),

еслиФ(Р)

 

утвердительно,

 

 

 

 

 

 

 

\23 (Р)* если

Ф(Р)

отрицательно.

 

 

 

Опишем программирующий алгоритм, который достав­

ляет

программу £

исходя из программ

2(,

33,

Ф . В каче­

стве

составных

его

частей

будут

 

 

использованы алгорит­

мы, программирующие последовательную и параллельную композиции. Кроме того, будут использованы уже извест­ ные нам стандартные программы: Е (тождественный алго­ ритм), Konl (удваивающий алгоритм), а также еще одна стандартная программа, так называемая ветвящая про­ грамма (обозначаемая далее Ветв) Ветв имеет 3 внутренних состояния р, р0, Pi и внешние символы 0, 1, || . Среди команд для нас важны лишь следующие четыре команды:

{р-^Пр,:, Н Л; Ор^Пр0; ||р„-»-Л.

95

Построим сначала

программу Ф, которая

в применении к

слову

Р работает

так: она перерабатывает Р в

1 || Р или в

О II Р

в зависимости от того,

имеет

ли

место

Ф(Р)

= 1

или

Ф(Р) =

0.

Очевидно, в

качестве

Ф можно

взять

1\оп1°(Ф || Е).

Дальнейшее построение программы S проис­

ходит так (рис. 26): программы

Ф,

Ветв

21, 23 сливаются

tf . . .

tn Р Р0

ФВет8

рвместо!

Р(1) Р{2) . .

.

Р(о)

tf

 

 

. . .

6

II

Pff)

!

 

 

 

 

6

II

Pff) .

• •

'

Р

 

 

 

 

Pit)

Р(2)

 

 

 

tf

 

 

 

 

Pff) Р(2)

Р, ?/. . .

?т "t . . . "с

?/

23

а)

 

Pfu)

P(v)

Pfv)

Pfv)

Рис. 26.

 

в одну программу (после предварительной

препарации —

см. 10,1), причем заключительное состояние

Ф заменяется

состоянием р из Ветв, а состояния р} ир0 из Ветв заменяются соответственно на начальные состояния программ 31 и 23. В качестве начального состояния программы & объявляется начальное состояние ty программы Ф. Проследим (рис. 27) теперь, как будет протекать работа в соответствии с пост­ роенной программой (£, исходя из стандартного изображения

слова

Р (конфигурация

I). Сначала работает подпрограмма

Ф, но

теперь вместо

заключительной конфигурации II

появится конфигурация

I I I : здесь а обозначает один из двух

возможных символов: 0 или 1.

Начиная с этого момента включится в работу подпро­ грамма Ветв, которая после двух тактов приведет к конфи­ гурации IV,- если а = 1 , или к конфигурации V, если о = = 0. Этим обеспечивается нужное разветвление: далее

96

уже будет

работать

именно

та из программ 9!, S3,

которой

•и положено работать.

 

 

 

 

 

10.5. Повторное

применение

алгоритма.

В рассмотрен­

ной выше

(рис. 26)

конструкции

для программы

«если Ф,

то 21, иначе 53» произведем

следующее

изменение: в каче­

стве S3 возьмем стандартную

программу

Е, а в подпрограм­

ме 91 заключительное

состояние

! заменим

начальным со­

стоянием

4 подпрограммы Ф; состояние (1 пусть

остается

1

#1* 1

Л

1

 

 

 

к

 

 

 

 

 

 

 

 

 

к,

 

 

 

 

 

 

 

 

\

*

#1*

Л

1

 

 

 

к

 

 

 

 

 

 

 

 

 

 

«2

 

 

 

 

 

 

 

 

х*-/ палочек

 

 

код

(Kp)-^-f--f

 

 

 

f(x)

-1

палочек

 

 

 

 

 

 

 

 

 

 

 

 

 

код•(/(£)=

fiffx>-1-1

Рис. 27.

начальным состоянием всей полученной таким образом программы; саму программу обозначим ©. Тогда в приме­ нении к слову Р работа программы SD будет протекать сле­ дующим образом: (I) проверяется условие Ф применительно к слову Р; (II) если оно выполнено, то Р перерабатывается по программе 31 в слово ЩР). Однако вместо того, чтобы на этом закончить работу, как это было в случае программы®, программа £> предписывает на этот раз: (III) проверить условие Ф применительно к слову Ч1(Р) (ибо в 91 заключи­ тельное состояние заменено начальным состоянием ({). Если условие выполнено, то будет вычислено ЩЩР)), потом условие Ф будет проверяться применительно к этому слову и т. д. Мы обнаружили здесь часто встречаемую ситуацию, когда исходя из распознающего алгоритма Ф и произволь­ ного алгоритма 91 предписывается: для любого слова Р, если выполнено условие Ф, вычислить Ш(Р); если для него выполнено условие Ф, вычислить ЩЩР)) и так далее до

4 Зак. 263

97

тех пор, пока впервые не получится слово, не обладающее свойством Ф. Тогда процесс останавливается и это слово (им могло оказаться исходное слово Р, если оно не удов­ летворяет условию Ф) объявляется результатом. В против­ ном случае процесс никогда не заканчивается и порождает последовательно слова ЩР), ЩЩР)), 21 (31 (St (Я)))), ... и т. д. Это предписание составляет новый алгоритм, который можно называть повторением алгоритма 31, пока выполне­ но условие CD; этот новый алгоритм обозначим так: «пока Ф, повторяй 9!». Рассмотренная выше модификация алгоритма, программирующего разветвление, фактически перестраи­ вает его в алгоритм, программирующий повторение. Итак, нами доказана

 

Т е о р е м а

программировании

повторения).

Каковы

бы

ни были

тыорингова

программа

91

и распознающая

тьюрингова

программа

Ф, можно эффективно

построить

тыорингову

программу

55

для алгоритма

тока

Ф, повто­

ряй

31».

 

 

 

 

 

 

 

 

 

10.6. Языки

программирования.

Мы

изучили

отдельно

четыре типа сочетания алгоритмов (последовательную и па­ раллельную композиции, разветвление и повторение) и вве­ ли для них формальные обозначения: St S3, St || 23, «если ф, то 21, иначе S3», «Пока Ф, повторяй 31». Ясно, что посред­ ством элементарных формул этих четырех типов и подхо­ дящей расстановки скобок можно записать естественным образом более сложные формулы, описывающие более слож­ ные сочетания алгоритмов. По существу такие формулы уже применялись выше (например, запись многократной ком­ позиции, или многократного разветвления). Мы не станем определять более точно и педантично этот язык формул, который будем называть входным языком программирования

или просто входным ЯЗБОМ, считая его достаточно понят­

ным, и ограничимся лишь

иллюстрацией его на примерах.

Рассмотрим еще раз алгоритм Евклида и сохраним

обозначения Ф ь Ф2 , 2(х,

$2> &з Д л я «элементарных» ал­

горитмов, использованных ранее (см. 10.4) при иллюстра­ ции разветвления алгоритма. Обычное словесное описание

алгоритма Евклида вполне

естественно

(почти дословно!)

записывается

в виде следующей формулы входного языка:

(пока Ф2 ,

повторяй (если

Ф ь то Э[ъ

иначе Э(2))° 9(3(:j±).

Следовательно,

если уже

имеются

тыорииговы программы

ф

ф 2 , Щ, .912, 31 з (а они

очень

просты и составление их

не

составляет

труда), то

посредством программирующих

98

 

 

 

 

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

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

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

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

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

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

4 -

99

Соседние файлы в папке книги из ГПНТБ