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

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

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

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

Добавлен: 19.10.2024

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

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

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

этом пути, состоит в том, что, воспроизведя работу програм­ мы 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