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

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

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

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

Добавлен: 19.10.2024

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

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

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

Построение программы ?[ф , исходя из программы 91/, отражает тот факт, что вычисление значения ф (х) сводится к повторному при­

менению Щ и к счету этих повторений до тех

пор, пока их число не

достигнет

х.

Рассмотрим

алгоритмы:

 

х \\ т II г в

 

 

1)

Э,

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

тройку

чисел

тройку

 

 

1||/(г);

 

 

 

 

х в

 

 

 

 

 

2)

2,

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

число

тройку л - ||0||с ;

т мень­

ше

3) Ф, распознающий свойство: в

тройке чисел

х | | / п | | г

х.

 

 

 

 

 

 

 

 

 

 

 

 

Тогда формула «2° пока Ф,

повторяй Э» задает

алгоритм, кото­

рый,

исходя

из значения х,

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

л-1| 0 || с, потом х || 1 || ft (с),

потом

* | J 2 | | / j (JS (с))

и т. д. до

тех пор, пока будет

получена

тройка

x-||.v|| ip (х).

Поэтому формула

2

° (пока

ф, повторяй Э)° Выд, где

Выд — стандартная

программа,

выделяющая

крайне правую ком­

поненту

тройки, задает нужный алгоритм, вычисляющий функцию

ср. Для

получения

программы

5(ф

остается

только заготовить

про­

граммы

для алгоритмов 2, Ф,

©,

что не представляет труда.

На­

пример,

алгоритм

© описывается

формулой

£ || G || 51/,

где

6 —

программа, вычисляющая функцию s (х) =

х +

1. Итак,

класс

вы­

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

суперпозиции. Например, из функции f, (х) =

2х

посредством супер­

позиций

можно

получить

каждую

из

функций

I {Jt (.v)) •= 2 2 ' 1 ,

I (h U W)) =

22

и

т. д. В то же

время разовое

применение

итера­

ции

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ф

(0)

= 1,

ф

(х +

1)

=

Ь

(х)),

т.

е.

ср

+

1) = 2'(*»

 

 

 

 

 

 

 

. • ^ | v этажеП

 

 

 

 

 

дает

функцию

 

Ф ( А')

=

2'-2

 

 

,

ошеломляюще

быстро

растущую и обгоняющую каждую из функций 2х, 2-л, 2'-2 '1 и т. д. Итерация является частным случаем более общей схемы опре­ деления функции ф посредством рекуррентных соотношений, назы­ ваемой схемой примитивной рекурсии. Одноместная функция ф определяется примитивной рекурсией, исходя из заданной двумест­

ной функции I и заданной константы с соотношениями

 

 

Ч>

(0)

=

с,

 

 

 

 

Ф

(Л' +

1)

=

 

I

(х,

Ф (Л-)).

 

 

П р и м е р . Пусть

с =

I ,

/j (х,

у) =

+

1) X у . Тогда полу­

чаем примитивную

рекурсию

 

 

 

 

 

 

 

Ф (0)

•= 1,

ф

+

 

1) =

+

1)

X ф (х).

104


Отсюда видно,

что

ср (1) =

1 X 1 =

1,

<р (2) =• 2 x 1 = 2 п т. д.

Вообще ф (х) =

* X

— 1) X

— 2) ... 2-1 = х\

функции ft

В частности,

могло оказаться,

что один

из аргументов

фиктивен.

Пусть, например,

Ц (х,

у) =

q (у);

тогда

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

курсивная

схема

принимает

вид

 

 

 

 

 

 

 

 

Ф (0) =

с; ф

+

1) => q (х))

 

 

 

и она определяет

ф как итерацию функции q. Если же I (х, у) =

г (*-),

то схема

принимает

вид

 

 

 

 

 

 

 

 

 

 

 

 

 

ф"(0) =

с,

 

 

 

 

 

 

 

 

 

 

Ф (Л- +

1) = г (х).

 

 

 

(ф)

В данном частном случае примитивной

 

рекурсии по

существу

отсутствует процесс

возвращения

от ф (

А -

+

1) и

ф (х).

 

 

В случае двуместной функции

ф исходными считаются

трехмест­

ная функция I и одноместная

g; соотношения

таковы;

 

 

 

 

 

 

Ф (0,

п)

= g (л),

 

 

 

 

 

 

 

Ф +

1. п) •= j

(дг, ф (х,

л), л).

 

 

 

Вообще, /е-местиая функция q; определяется соотношениями

 

Ф(0.

пу,

п«,

nk_])

 

= g(n1

п2,

 

 

пк_:),

 

 

 

 

Ф(*чМ,

«1

"г,

пк_

\) = 1

{х, пъ

 

n k _ 1 y \

 

 

 

 

 

 

П1.

 

nk-

{)•

 

 

 

 

 

 

 

 

где I, g — заданные функции

от k +

1 и к — 1 переменных,

соот­

ветственно. В схеме (*) по первому аргументу

функции ф ведется

индукция; остальные же аргументы играют роль

параметров.

 

П р и м е р .

Пусть

g (л) — я, [ (х, у , п) =

х

X у

X п. Тогда

в соответствии

со

схемой

 

 

 

 

 

 

 

 

 

 

 

 

 

Ф (0,

п)

=

я, Ф (А- + 1,

п) •=

(х +

1) X

ф (х,

л)

X

л

 

имеем

ф(1,

п ) = 1 Х п Х л

=

2,

ф (2,

я) =

2 X

2

X

л =

3 ,

ф (3,

я) = 3

X

3 X п =

4

и

вообще

ф (А-,

Л ) =

j t l / i * + ' .

 

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

и построить по ней тыорингову

программу

?(ф , исходя

из программ

91/, 5(сг п обычных стандартных

программ.

 

 

 

Для одноместной

функции

ф формула

имеет такой

же вид, как

и в случае итерации,

т. е.

 

 

 

 

2 "(пока Ф, повторяй ©) с

Выд, с той лишь разницей,

что под

Э следует теперь понимать алгоритм, переводящий тройку

А - || т \\ г

105


в тройку

х\\т

+

1 || / (т,

г). Для

©

формула будет чуть

сложнее,

чем

раньше, а

именно

 

 

 

 

 

 

 

 

Коп »(Е )|S

1 "31/),

 

где

Коп — копирующий

алгоритм,

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

тройку

х || т || г

в тройку

-v || т \\

т*г.

 

 

 

 

Аналогично можно рассмотреть примитивно рекурсивную схему

(*) для двуместной (и вообще для многоместной) функции

ср и запи­

сать на входном языке формулу для

программы 2(ф . Если некоторые

из аргументов функции g и I фиктивны, то на самом деле схеме («)

можно иногда

придавать

и

«неканонический»

вид,

например:

 

 

или

 

 

Ф (0,

и) =

g

(л),

ф (л- +

1,

л)

=>

q

(х,

л))

 

(« • )

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ф (0,

п ь

 

л2 ) =

г

2 ),

ф (х,

 

я,,

л2 ) =

q (х,

ф(х,

я 1 :

п2)).

 

(***)

 

Приведем несколько таких примеров, когда некоторые из ар­

гументов исходных функций g, jj фиктивны.

 

 

 

 

 

 

 

 

 

 

Пусть g

(л) =

л, ? ( ( / ) =

1 +

У- Тогда в соответствии со

схемой

 

 

 

 

 

ф

(0,

п)

— п,

ф

(дг +

1,

л) =

1 +

ф (-V-,

л)

 

 

 

 

имеем: ф (1, я)

=

1 +

л, ф (2, я)

•=• 1 +

(1 +

 

я)

=

2 +

 

л, ф (3,

л ) =

=

1 +

(2 +

л) •= 3 +

л и вообще ф (х, л) =

х

-+- л. Иначе

говоря,

эта примитивно рекурсивная схема задает сумму, исходя i n функций

п,

I

+

у.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Далее, при g (л) •= 0 и I

(х,

у ,

л) =

у

+

л получаем

схему

 

 

 

 

 

 

Ф (0,

я)

=

0,

ф

+

 

1,

л) =

ф

(.V,

л) +

л,

 

 

 

 

определяющую

произведение

л: X

я,

ибо

 

ф ( I ,

п) =

 

0 +

я =

я,

ф (2,

я)

=

я

+

п =

2я, ф (3,

я) =

2л +

я

=

 

Зл и т. д. Если

же

по­

ложить g

(л.) =

1, f; {х, у, п)

=

I / X

а, то получается схема ф (0,

л) =

=

1,

ф +

1,

я) =

ф (.t,

 

я)

X

я,

определяющая

 

функцию

я*.

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

ф (1,

л) =

 

1 X

я =

л1 ,

ф (2,

л) =

я ' X п =

я 2 ,

Ф

(3,

л)

=

я 2

X я =

л3 и т. д. Любые «неканонические»

схемы

тако­

го рода

можно

преобразовать

в «канонические» вида «(*), если пред­

варительно осуществить введение фиктивных переменных.

Напри­

мер,

после

реализации

операторов

g

(nlt

 

пг) = г

2 ), I (х,

у , л,,

"г) =

Ё

О*. У)

схема

(***)

принимает

вид

 

(*).

Поскольку

 

класс

функций, вычислимых по Тьюрингу, замкнут

относительно

опе­

ратора

введения

фиктивных переменных, то

тем самым

установлена

замкнутость и относительно

 

примитивных

рекурсий

в

«неканониче­

ской» ситуации, когда в правых частях

соотношений

(*) отсутст­

вуют те или иные аргументы.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Еще

более

общая

ситуация,

чем (*), заключается

в том,

что не­

сколько функции одновременно (совместно) участвуют в индуктив­

ном определении.

Например,

для

двух

одноместных функций ф!

и

ф 2

схема

одновременной

 

(совместной)

примитивной рекурсии

выглядит так:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ф, (0)

=

сг,

ф, (А-

+

1) =

!л

(х,

Ф,

(х),

ф 2

(*)),

 

 

 

ф 2

(0)

=

С2 ,

ф 2

+

1) =

(X,

ф!

(х),

ф 2

(л:)).

 

Ф2

В

соответствии

с

этой

схемой

пара

заданных

значений

ф, (0),

(0)

позволяет

вычислить

пару фх (1),

ф 2 (1), а эта

в свою

очередь

106


пару

ф] (2), ф 2 (2) и т. д. Для

двуместных функций

схема

принимает

вид

 

 

 

 

 

 

 

 

 

 

 

 

<Pi №. л)

=

gl ("). ф] +

1, л) =

t-i

(х,

ф,

[х,

п),

ф 2 {х,

л), л),

ф2

(0, я)

=

g, (л), ф; (Л- +

-1, л)

=

£

2 (*,

ф,

(х,

л), ф„ ( Л , я), л)

и аналогично

для любого

числа

функции

от

любого числа пере­

менных. В качестве примера рассмотрим совместное определение двух функции: част (х, л) — частное при делении х на я и ост (х, я) — оста­

ток, который

при этом получается. При п =

0 деление неосуществи­

мо, но мы доопределим

эти функции, полагая, что они

обращаются

в нуль

при

я =

0.

Допустим, 'что значения

част (х. п)

и ост (х, я)

уже известны. Тогда при переходе к х +

1:

 

 

1)

если

ост

(х, я) =

я — 1, то частное увеличится

на единицу,

а остаток обратится

в

нуль;

 

 

 

2)

если

это

не так,

т. е. если ост (х,

л)

< п — 1, то

частное ос­

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

если | < г], если | > г].

Это очень простые функции, которые очевидным образом вычислимы по Тьюрингу; мы еще неоднократно будем ими пользоваться. Иско­ мая схема для пары част (х, л), ост (х, я) имеет вид:

част (0, я) = 0, част

+ 1, л)

= част (х, л)

+ Рв

(ост

(х, я) +

1,

я),

ост (0, л) =» 0, ост (x-\r

1, л) =

(ост (,v, я) +

1)хМн

(ост

(х, л ) +

1,

п).

Совместная примитивная рекурсия для т функций от k аргу­ ментов как бы описывает одну функцию от k аргументов, значениями

которой являются /л-мерные векторы

с натуральными координатами.

Построение

соответствующей

тырринговой

программы,

исходя

из

заданных

программ

21

*>(„.,,

 

SI),,

5l f e

по существу

ничем

не отличается от того, что мы

имеем

для

обычной примитивной

ре­

курсии.

 

 

 

 

 

 

 

 

 

 

 

11.4. u-оператор. Примитивная

рекурсия отличается

от

супер-

Позиции и введения

фиктивных

переменных тем, что она существен­

но учитывает специфику

натурального

ряда

— возможность

индук­

тивного перехода от х к х -(- 1. Другое

отличие заключается

в том,

что тыориигово программирование примитивной рекурсии

основано

на повторном (можно сказать — циклическом) применении

исходной

программы. Однако при этом заранее известно (и задано!) число пов­ торений. Именно при вычислении ф (л-) или ф (х, п) приходится по­ вторять исходный алгоритм х раз. Теперь рассмотрим такую ситуа­ цию, когда вычисление вновь определяемой функции, хотя и сво­ дится к повторному применению некоторого исходного алгоритма, однако без какой-либо априорной информации о числе повторений.

Пусть

I {х,

у) — предикат, т. е. функция, принимающая два значе­

ния: 0

1.. Зададим функцию ф (х) условием: при любом фиксирован­

ном х0

, для

которого существует хотя бы одно значение у такое, что

I (*|>. У) — 1

( т. е. предикат истинный), ф (х„) равно

наименьшему

среди

чисел у таких, что ft (х„, у)

= 1; если же таких у

не существует,

то ф (л-0) не определено. В этом

и заключается применение ц.-опера-

107


тора к функции f: (х, у ) ; символически это записывается так; ф ( А - ) =

=if- (*. у) =

Допустим теперь, что задан

алгоритм 91/, вычисляющий

преди­

кат fsi т. е. распознающий алгоритм,

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

х \

\ у и вы­

ясняющий, имеет

ли место свойство 1(х, у) =

1 Естественно,

напра­

шивается

следующий алгоритм

поиска

значения ср (х0 ): проверяем

подряд условие 91/для

пар

х п | | 0 ,

д-01| 1, х0

||

2, ... до тех пор, пока

впервые не будет обнаружено нужное у , если вообще такое у

сущест­

вует; в противном случае процесс

 

продолжается

неограниченно.

Соответствующая

формула исходного

языка

такова: 2 °

(пока 31/,

повторяй

& | | 5 ) ,

где 2

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

х

и х | | 0 . Она

позволяет

строить программу 3|ф ,

коль

скоро

 

задана 3(/. Аналогично

обстоит

дело, когда ц-оператор применяется

к предикату

ft

и

 

 

любого числа k +

1 аргументов,

доставляя

функцию;

 

 

 

Ф(х, . . .

xh) =

iiy{f(x1

 

 

xk.

у)

=

1).

 

 

 

Допустим, что даны две функции

gx

ъ ....

х ^ , у) и gj (х,,

х;,, у ) , и имеется у , для которого

(при фиксации

всех

остальных

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

 

=

g^. Пользуясь предикатом

Рв (£, nj, можно это записать так:

 

 

 

 

 

 

 

 

 

 

Ф ( х ь

... х,,.) =

ц(/(Рв

(gi ( х ъ ...

xh,

 

у),

g 2 ( x b

..... xh,

(/))=!}

Поскольку суперпозиция, стоящая

в фигурных

скобках,

является

предикатом, тьгорингова программа которого может быть построена,

исходя из 9 l P l l ,

9 I g o , то

и 9(ф - может быть

построена. Точно

так же обстоит

дело в случае,

когда вместо fa = fti

рассматривается

отношение fn

< f(i и т. п. Разница лишь в том, что вместо предиката

Рв (|, ц) надо

брать другой двуместный предикат, например Мп (%,

ц) и т. п.

 

Типичной 1итуацнеп применения ^-оператора является построе­ ние обратных функций. Допустим, что для некоторой функции у =

=I (х) существует обратная функция, т. е. для каждого натураль­

ного у существует единственное значение х, для которого [t (х) = у ;

в таком случае обратная

функция х =

ф (у),

очевидно, может

быть

определена посредством

ц-оператора:

ф (у)

их (f, (х) = у ) .

Мно­

гие функции анализа такие, как показательная сх, степенная х°, определены на всем натуральном ряде, если параметры (в нашем слу­ чае параметр с) выбран подходящим образом. Однако этого нельзя

утверждать

об обратных

функциях;

например, log с х,

или \f~x~,

вообще говоря, не будет натуральным

числом даже при натуральном

с. В таких

случаях

удобно рассматривать

арифметические

варианты

обратных функций, которые заключаются в следующем:

в качестве

значения

функции

объявляется

целая

часть

истинного

значения

функции,

т. е. (у)\. Теперь ясно, что исходя

из функций у = с"

или у => х с

, можно

определить

арифметические

обратные функции

посредством

ц-оператора:

 

 

 

 

 

 

 

 

 

[ log, ( ( / ) ] = цх (/•*+'

> у ) ;

 

 

 

 

 

[\/"y]

= lix((x+l)r

>У).

 

 

11.5. Рекурсивные описания и их тыориигово программирова­ ние. В предыдущих разделах был подробно рассмотрен ряд операто-

108