Тверской государственный университет
Опубликован: 21.08.2007 | Доступ: свободный | Студентов: 1684 / 243 | Оценка: 5.00 / 5.00 | Длительность: 14:18:00
ISBN: 978-5-94774-714-0
Специальности: Программист, Математик
Лекция 8:

Алгоритмы: частично рекурсивные функции

< Лекция 7 || Лекция 8: 123 || Лекция 9 >

Программная вычислимость рекурсивных функций

В этом параграфе рассмотрим соотношение между программно вычислимыми и частично рекурсивными функциями. Справедлива следующая

Теорема 8.1. Каждая частично рекурсивная функция программно вычислима.

Доказательство индукцией по определению ч.р.ф.

Базис: программная вычислимость простейших функций была установлена в примерах 1.1, 1.2 и 1.4.

Индукционный шаг: покажем программную вычислимость операторов суперпозиции, примитивной рекурсии и минимизации.

Суперпозиция. Пусть Fm и f1n,..., fmn - арифметические функции, вычислимые программами \Pi , \Pi _{1}, \dots  , \Pi _{m} так, что \Phi _{\Pi , x1}(x_{1},\dots , x_{m}) = F^{m}(x_{1},\dots , x_{m}), и \Phi _{\Pi i, x1}(x_{1},\dots , x_{n}) = f_{i}^{n}(x_{1},\dots , x_{n}) при i=1,...,n. Пусть переменные y1, ..., ym, z1,..., zn не используются в программах \Pi , \Pi _{1}, \dots  , \Pi _{m}. Кроме того, пусть все вспомогательные переменные этих программ - это w1, ... , wr. Рассмотрим следующую программу P:

z_1:= x_1;\ldots ; z_n:= x_n; \\
 \Pi_1; y_1 := x_1; x_1:= z_1;\ldots ; x_n:= z_n; \\ 
 w_1 := 0; \ldots ; w_r:=0; \\ 
 \Pi_2; y_2 := x_1; x_1:= z_1;\ldots ; x_n:= z_n; \\ 
 w_1 := 0; \ldots ; w_r:=0; \\ 
 \ldots \\ 
 \Pi_m; y_m:= x_1; x_1:= y_1; \ldots ; x_m := y_m; \\
 w_1 := 0; \ldots ; w_r:=0; \\ 
 \Pi

В качестве входных переменных зафиксируем x1, ..., xn, а выходной - x1. Пусть в исходном состоянии x1=a1, ..., xn = an. Тогда в первой строке эти значения сохраняются в переменных z1, ..., zn, которые своих значений далее не меняют. Поэтому для каждого i=1,...,m-1 после выполнения фрагмента

\Pi_i; y_i := x_1; x_1:= z_1; \ldots; x_n := z_n; \\
w_1 := 0; \ldots; w_r := 0;

значением переменной yi является fin(a1,..., an), x1=a1, ..., xn = an, а значения всех вспомогательных переменных равны 0. Тогда после выполнения

\Pi_m; y_m := x_1; x_1 := y_1; \ldots ; x_m := y_m;

значением каждого xi также является fin(a1,..., an), а после выполнения \Pi значение x1 равно \Phi _{P,x1}(x_{1},\dots ,x_{m})= F^{m}(f_{1}^{n}(a_{1},\dots , a_{n}), \dots , f_{m}^{n}(a_{1},\dots , a_{n})). Таким образом, \Phi _{P, x1} = [F; f_{1}, \dots , f_{n}].

Примитивная рекурсия. Рассмотрим для простоты случай n=1. Пусть функция F2(x1,y) получена с помощью оператора примитивной рекурсии из функций g1(x1) и h3(x1, y, z), т.е. F2 =R(g1,h3). Предположим, что существуют программы \Pi _{1} и \Pi _{2}, вычисляющие функции g1 и h3 так, что \Phi _{\Pi 1},x_{1}\ (x_{1})=g^{1}(x_{1}) и \Phi _{\Pi 2,x1}(x_{1}, y,z)=h^{3}(x_{1},y,z). Пусть вспомогательные переменные \Pi _{2} - это z1,..., zm и они не встречаются в \Pi _{1}, а переменные u1, y1 и v не используются в программах \Pi _{1} и \Pi _{2}. Рассмотрим программу P: u_{1} :=x_{1}; y_{1}:=y; v:=0; \Pi _{1}; пока v < y1 делай z:=x1; x1:=u1; y:=v; \Pi _{2}; z_{1}:=0; \dots  ; z_{m}:=0; v:= v+1 все В качестве входных переменных P возьмем x1 и y, а выходной - x1.

Рассмотрим работу P на исходном состоянии \sigma, в котором \sigma (x_{1})=a, \sigma (y)=b. При b=0 цикл не выполняется и в результирующем состоянии \sigma _{1}=P(\sigma ) имеем \sigma _{1}(x_{1})=\Pi _{1}(\sigma )(x_{1})=g^{1}(a)= F^{2}(a, 0). При b > 0 цикл будет выполняться b раз, так как в его теле v всякий раз увеличивается на 1, а значение y1=b и не меняется. Перед первым выполнением \Pi _{2} все ее рабочие переменные zi равны 0, x1=a, y=0, z=F2(a, 0), а после ее выполнения x1=h3(a,0,F(a,0))=F(a,1). Предположим теперь по индукции, что перед (i+1) -ым выполнением \Pi _{2} все ее рабочие переменные zi равны 0, x1=a, y=i и z=F2(a, i). После этого выполнения x1=h3(a,i,z)=h3(a,i,F(a,i))=F(a,i+1). Тогда присваивания z1:=0; ... ; zm:=0; v:= v+1 после \Pi _{2} и z:=x1; x1:=u1; y:=v; перед ее следующим выполнением установят значения переменных \Pi _{2} так, что все ее рабочие переменные zi равны 0, x1=a, y=i+1 и z=F2(a, i+1). Следовательно, после b -го выполнения тела цикла x1=h3(a,b-1,F(a,b-1))=F(a,b).

Минимизация. Предположим, что функция Fn(x1,... ,xn) получена с помощью оператора минимизации ( mu -оператора) из функции gn+1(x1,..., xn,y), т.е.

F^n(x_1,\ldots, x_n) =\mu y[ g^{n+1}(x_1,\ldots, x_n,y)=0].

Пусть программа \Pi _{1} вычисляет gn+1, так что \Phi_{\Pi_1, x_1}(x_1,\ldots, x_n,y)=g^{n+1}(x_1,\ldots, x_n,y), и пусть рабочие переменные \Pi _{1} - это z1,..., zm. Зафиксируем переменные x1',... , xn', y';, u, z, не входяшие в Var_{\Pi_1}. Рассмотрим следующую программу \Pi:

x_1':=x_1; \ldots ; x_n':= x_n; z:=0; u:=0; u:=u+1; y' :=0;\\ \textbf{пока}\ z < u\ \textbf{делай}\\ 
 x_1:=x_1'; \ldots ; x_n:= x_n'; y:= y'; \ \Pi_1;\ u:=x_1; z_1:=0;\ldots ; z_m:=0;\ \\
\textbf{если}\ u=z\ \textbf{то}\ x_1 := y'\ \textbf{иначе}\ y':= y' +1\ \textbf{конец}\\ 
\textbf{все}

Рассмотрим работу \Pi на входных значених xi = ai (i=1,...,n). В первой строке они сохраняются в переменных x'i, которые нигде в \Pi не изменяются, z получает значение 0, которое тоже не меняется по ходу вычисления, а u вначале получает значение 1. Поэтому условие цикла после первой строки истинно и он хотя бы один раз выполняется. Докажем, что для каждого i >= 1, (i+1) -ая итерация цикла выполняется тогда и только тогда, когда g(a1, ..., an,0)=b1 >0, ..., g(a1, ..., an, i-1)=bi-1 > 0, \Pi останавливается после (i+1) -ой итерации цикла с результатом x1=i тогда и только тогда, когда g(a1, ..., an,i)=0. При этом перед выполнением \Pi _{1} входные переменные x1,...,xn,y имеют значения a1,...,an, i, соответственно, y'= i, а все рабочие переменные zj (j=1,..., m) равны 0.

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

\Pi_1;\ z_1:=0;\ldots ; z_m:=0;\ u:=x_1;

значение u = x1 = g(a1,...,an,i), а рабочие переменные восстанавливают нулевые значения. Если g(a1,...,an,i)=0, то u=z и в условном операторе x1 получает значение y'=i. После этого условие цикла нарушено и \Pi завершает работу с выходным значением x1=i =F(a1,..., an). Если же g(a1,...,an,i)> 0, то u>z и в условном операторе y' увеличивает значение до (i+1). Тогда условие цикла выполнено и перед (i+2) -ым выполнением \Pi _{1} ее входные переменные x1,...,xn,y имеют значения a1,...,an, i+1, соответственно, y'= i+1, а все рабочие переменные равны 0.

Из доказанного утверждения непосредственно следует, что

\Phi_{\Pi,x_1}(a_1,\ldots,a_n)= \mu y[g(a_1,\ldots,a_n,y)=0].

Имеет место и утверждение, обратное теореме 8.1, которое мы приводим здесь без доказательства.

Теорема 8.2. Каждая программно вычислимая функция является частично рекурсивной.

< Лекция 7 || Лекция 8: 123 || Лекция 9 >