Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Дискретка / Книги / Галиев Ш.И. Математическая логика и теория алгоритмов (2002).pdf
Скачиваний:
2274
Добавлен:
25.02.2016
Размер:
7.49 Mб
Скачать

205

§ 16. Примитивно рекурсивность некоторых функций. Частично - рекурсивные функции

Теорема 6.8. Следующие функции являются примитивно рекурсивными:

1)

х+у;

2) ху;

 

 

3)

ху;

4)

х-1 , если х>0,

 

 

δ(х)=

0 ,

если х=0;

 

 

 

5)

x-y, xy,

6)

x-y,

xy

x-y =

x-y =

 

 

 

0, x<y;

 

y-x,

x<y;

7)

0, x=0,

8)

1, x=0,

sg(x)=

sg*(x)=

 

 

 

1, x0;

 

0, x0;

9)rm(x,y) = остатку от деления у на х;

10)qt(x,y) = частному от деления у на х;

11)х ! ;

12)min (x,y);

13)min (x1,x2,...,xn);

14)max (x,y);

15)max (x1,x2,...,xn).

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

1) Обозначим первую функцию через f. Имеем f(x,0)=x+0=x=J11 (x),

f(x,y+1)=x+(y+1)=(x+y)+1=f(x,y)+1=N(f(x,y))=h(x,y,f(x,y)), где h(x,y,z) =

N(z).

В результате получили, что f(x,y)=x+y получается рекурсией из примитивно рекурсивных функций g(x)=J11(x) и h(x,y,z)=N(z), следовательно,

f- примитивно рекурсивна.

2)Обозначим функцию умножения х на у через ψ . Тогда

ψ(х,0)=х0 = 0 = Z(x);

ψ(x,y+1)=x(y+1)=xy+x=ψ(x,y)+x=f(ψ(x,y),x)=h*(x,y,ψ(x,y)),

где h*(x,y,z) = f(x,z). Итак, ψ(x,y) получается рекурсией из примитивно рекурсивных функций g*(x)=Z(x) и h*(x,y,z)=f(x,z), следовательно, функция ψ - примитивно рекурсивна.

206

3) Обозначим функцию возведения в степень через ϕ. Для арифметических функций полагаем, что х0=1 для любых целых х, в том числе и для х=0, т. е. 00=1 (ϕ(0,0)=1). Получим

ϕ (x,0)=xo=1=N(Z(x));

ϕ(x,y+1)=xy+1=xyx=ϕ(x,y) x=ψ(ϕ(x,y),x)=h**(x,y,ϕ(x,y)),

где h**(x,y,z) = ψ(x,z), т.е. ϕ получается рекурсией из примитивно рекурсивных функций g**(x)=N(Z(x)) и h**(x,y,z)=ψ(x,z), следовательно ϕ - примитивно рекурсивна.

Аналогичным образом доказывается и для функций 4)-15).

Из теоремы следует, что примитивно рекурсивные функции образуют достаточно широкий класс всюду определенных функций.

Рассмотрим, как можно вычислять значения примитивно рекурсивных функций. Каждая примитивно рекурсивная функция получается из исходных функций 1), 2) и 3) с помощью конечного числа подстановок и рекурсий. Представление функции с помощью подстановки и рекурсии, примененных к исходным функциям, можно рассматривать как набор инструкций для "механического" вычисления значения функций. Следовательно, доказательство примитивно рекурсивности функции является одновременно доказательством существования алгоритма вычисления значений функций. Рассмотрим, например, функцию ψ(х,у)= ху. Выше установлено, что

ψ(х,0) = Z(x)=0;

ψ(x,y+1)=f( ψ (x,y),x), где f(x,y)=x+y.

Таким образом, значение ψ(х,у) при у=0 определено. Зная значение этой функции при некоторых х и у, можем определить значение этой функции при х и у+1, используя уже схему вычисления значений функции f(x,y), для которой значение при y=0 известно, а при у>0 можно выразить через функцию N, зависящую от аргумента f(x,y-1) и т.д.

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

Теорема 6.9. Множество примитивно рекурсивных функций является счетным множеством, множество общерекурсивных функций тоже является счетным множеством.

Доказательство. Все функции константы - примитивно рекурсивны, следовательно, и общерекурсивны. Тогда их не меньше, чем счетное множество. Доказательство того, что их не более чем счетно, приводится с помощью геделевой нумерации, т.е. удается показать, что каждой общерекурсивной функции можно сопоставить некоторое целое неотрицательное число (геделев номер), причем различным функциям

207

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

Можно доказать следующую теорему.

Теорема 6.10. Существуют арифметические всюду определенные функции, не являющиеся общерекурсивными функциями.

Функция ϕ от n аргументов называется частично рекурсивной, если она может быть получена из исходных функций 1), 2) и 3) с помощью конечного числа подстановок, рекурсий и µ-оператора, где µ- оператор определяется так же, как и µ -оператор, но уже не требуется, чтобы для x1, x2,..., xn существовал у такой, что g(x1,x2,...,xn,y)=0, т.е. при некоторых значениях x1,x2,...,xn может и не существовать у такого, что

g(x1,x2,...,xn,y)=0.

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

Теорема 6.11. Всякая частично рекурсивная функция (общерекурсивная) является частично вычислимой (вычислимой) по Маркову функцией.

Теорема 6.12. Всякая частичная функция, частично вычислимая (вычислимая) по Маркову, является частично рекурсивной (общерекурсивной) функцией.

§ 17. Ламбда-исчисление

Прежде чем ввести лямбда-исчисление укажем возможную область её использования в вычислительных моделях.

Различают следующие вычислительные модели:

императивную (процедурную) вычислительную модель (императив – повеление, требование), когда имеется последовательная система команд. Языки программирования, такие как АЛГОЛ, ФОРТРАН, С и т.п. основываются на этой вычислительной модели и объединяются под названием императивные или процедурные языки;

логические вычислительные модели, основанные на вычислениях с помощью логики предикатов. Примеры таких языков Пролог, Дейталог, Параллельный Пролог;

функциональные вычислительные модели, в которых программа рассматривается как множество определений функций. В основу этой модели

208

положено мак называемое «ламбда-исчисление». Примером языка, основанного на ламбда-исчислении, является язык ЛИСП;

объектно-ориентированные вычислительные модели. В императивных

(процедурных) и функциональных вычислительных моделях операция принимается за субъект, а вычисления представляются в виде использования операций с некоторыми объектами. Однако если сделать наоборот, т.е. объект операции принять за субъект, а применение операций рассматривать как передачу запроса объекту, который и выполняет эту операцию, то такая модель является объектно-ориентированной, т.е. объекты рассматриваются как процессы. Реализованы в языках PLASMA, Mesa, LOOPS и др.

Теперь перейдем к некоторым понятиям ламбда-исчисления. Ламбда-исчисление было введено Черчем около 1930 года как один из

подходов для обоснования логики и математики. В дальнейшем часть этого исчисления явилось одной из теорий вычислений.

Ламбда-исчисление – это теория, рассматривающая функции как правила, а не как графики и фактически выделяющая вычислительный аспект при введении функций.

Чёрч предложил использовать ламбда-исчисление для формализации понятия эффективной вычислимости. Тьюринг показал, что вычислимость по Тьюрингу эквивалентно ламбда-вычислимости. Таким образом, несмотря на свой очень простой синтаксис, ламбда-исчисление способно реализовать все механически вычислимые функции.

Синтаксис ламбда-исчисления.

Выражение в ламбда-исчислении представлено в префиксной форме, т.е. вначале располагается оператор, например, вместо а+b пишется +аb, а вместо а/b+b×с пишется (+(/аb)(×bс)).

Все программы представляются в виде выражений, а процесс выполнения программы заключается в определении значения этого выражения и это называется оценкой выражения.

Оценка выражения производится путём повторения операции выбора и упрощения тех частей этого выражения, которые можно упростить. Такая часть выражения называется редексом, а операция упрощения называется

редукцией.

Процесс редукции завершается, когда выражение, преобразованное редукцией, не содержит больше редекса. Выражение, не содержащее редекса,

называется нормальной формой.

Например, при оценке выражения (+(/62)(×25)) сначала выбираются редексы и упрощаются соответственно до 3 и 10. Полученное выражение (+3 10) также является редуцируемым, поэтому имеем

(+3 10)13.

Результат (оценка выражения) 13 невозможно упростить, поэтому он считается нормальной формой.

209

Применение функции. Применение функции f к аргументу x обозначается как (fx). Функция от нескольких аргументов представляется, например, следующим образом (f(x,y,z)). Однако функцию от нескольких аргументов можно интерпретировать как результат синтеза функций от одного аргумента. Например (+3 4) можно интерпретировать как (+3)4, т.е. как прибавление тройки к аргументу 4.

Ламбда-абстракция – это одно выражение, определяющее функцию. Например, выражение

(λx.+x1)

определяет функцию прибавления к переменной x единицы. Запись λx. показывает, что это выражение является ламбда-абстракцией, формальным параметром которой является x. Выражение, которое следует за точкой (в данном случае это +x1) является телом ламбда-абстракции.

Рассмотрим следующее ламбда-выражение:

(λx.+xy)3

Здесь x считается связанной переменной, 3 значением для x.

Для оценки этого выражения необходимо, чтобы переменная y уже имела какое-либо значение. Обычно значение свободной переменной определяется во внешнем выражении, содержащем это выражение.

β - преобразование

Пусть имеем выражение (λx.+x1)4, в котором записаны последовательно лямбда-абстракция (λx.+x1) и аргумент 4. При замене x на 4 получим (+4 1). Это правило преобразования называется β - преобразованием.

Примеры β - преобразований:

(λx.+x1)4+4 1 (λx.+xx)5+5 510 (λx.3)53

(λx.(λy./yx))2 6(λy./y2)66 23 (λf.f3)(λx.+x1)(λx.+x1)3+3 14,

где (λx.+x1) – аргумент для предыдущей ламбда-абстракции.

 

 

 

 

Кроме того в ламбда-исчислении вводятся α -

преобразование,

η -

 

 

 

 

 

 

 

 

 

 

преобразование, рекурсии и т.д.

 

 

 

 

 

 

 

×

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Если выражение

содержит

несколько

 

 

 

 

 

 

 

 

 

 

редексов, то возможно одновременное их

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

оценивание, например, если имеем

 

 

 

+

 

 

 

 

 

 

(+3 5) (– 5 2)),

 

 

 

 

 

 

 

 

 

 

 

 

 

то можно представить это выражение в виде

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

следующего графа, см. Рис. 6.6.

 

 

 

 

 

 

 

 

 

 

 

 

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

редукции

 

 

3

5

5

2

 

 

 

 

всех редексов можно увеличить скорость

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

вычислений.

При

этом

появляется

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 6.6.

 

 

 

 

 

 

 

 

 

возможность

параллельной обработки,

и