Россия |
Алгоритмы: частично рекурсивные функции
Леммы о рекурсивных функциях
В этом параграфе мы установим примитивную (частичную) рекурсивность некоторых важных классов функций - таблиц и нумераций, и расширим возможности определения функций с помощью суммирования, произведения, разбора случаев и взаимной рекурсии.
Лемма 8.1. Рекурсивность табличных функций. Пусть всюду определенная функция f(x) на всех аргументах, кроме конечного числа, равна некоторой константе c (такую функцию назовем табличной). Тогда она является примитивно рекурсивной.
Доказательство Пусть для функции f из условия леммы . Доказательство проведем индукцией по nf.
При nf=0 функция f является постоянной и поэтому примитивно рекурсивной (пример 8.1).
Предположим что все табличные функции g со значением ng <= k примитивно рекурсивны и пусть nf = k +1 и f(0)=a. Определим табличную функцию f'(x) = f(x+1). Ясно, что nf' = k, и по предположению индукции f' примитивно рекурсивна. Легко проверить, что тогда f задается следующей схемой:
![\left \{
\aligned
f&(0)= a, \\
f&(x+1)=\/g(x,f(x))=\/I^2_1(f^\prime(x),f(x))
\endaligned \right.](/sites/default/files/tex_cache/f38dd31936c2c31611fff67fb5538b94.png)
и, следовательно, также примитивно рекурсивна.
Покажем замкнутость класса ч.р.ф. (п.р.ф.) относительно операций суммирования и произведения.
Лемма 8.2. Суммирование и произведение. Пусть функция f(x1,..., xn, y) является частично (примитивно) рекурсивной. Тогда и функции Fn+1 и Gn+1, заданные следующими равенствами
![F(x_1,\ldots,x_n,y)= \sum_{i=0}^y f(x_1,\ldots,x_n,i),](/sites/default/files/tex_cache/cfb1c820b2aae3567eafa7db63426498.png)
![G(x_1,\ldots,x_n,y)= \prod_{i=0}^y f(x_1,\ldots,x_n,i),](/sites/default/files/tex_cache/33d2bd94aeea609cbce842c566422162.png)
является частично (примитивно) рекурсивными.
Доказательство Действительно, эти функции задаются следующими примитивно рекурсивными схемами:
![\left \{
\aligned
F&(x_1,\ldots,x_n,0)= f(x_1,\ldots,0) \\
F&(x_1,\ldots,x_n,y+1)=\/F(x_1\ldots,x_n,y)+ f(x_1,\ldots,x_n,y+1)
\endaligned \right.](/sites/default/files/tex_cache/42d837eb75c150d4bbf7830b24fdb7b0.png)
![\left \{
\aligned
G&(x_1,\ldots,x_n,0)= f(x_1,\ldots,0) \\
G&(x_1,\ldots,x_n,y+1)=\/G(x_1\ldots,x_n,y)\times f(x_1,\ldots,x_n,y+1)
\endaligned \right.](/sites/default/files/tex_cache/d35ed2625786d1027027b55197fdef20.png)
Приведем примеры использования леммы 8.2.
Пример 8.10. max_deg_div(x,y) = максимальная степень x, на которую нацело делится y.
Пусть exp(x,y) - экспоненциальная функция: exp(x,y) = xy. Ее примитивную рекурсивность легко установить, используя функцию умножения (см. задачу 8.1 (а) ). Тогда нетрудно проверить, что искомая функция задается соотношением
![max\_deg\_div(x,y) = \sum_{i=0}^y \overline{sg}(rm(exp(x,i), y)) \dot{-} 1](/sites/default/files/tex_cache/871c31034d798b73d9146b1a1ef5204e.png)
и, следовательно, является примитивно рекурсивной.
Пример 8.11. Ограниченная минимизация. Пусть примитивно рекурсивная функция g(x,y) такова, что для каждого x найдется y <= x, для которого g(x,y) =0. Положим F(x) = mu y [g(x,y) = 0].
Тогда, по определению, F(x) является частично рекурсивной функцией.
Покажем, что, на самом деле, она примитивно рекурсивна. Действительно,
определим . По лемме 8.2 эта функция
примитивно рекурсивна.
Пусть для данного x
.
Тогда при i < y0 имеем h(x,i) = 1, а при i >= y0 h(x,i) =0. Поэтому искомая функция F задается равенством
и также является примитивно рекурсивной.
Лемма 8.3. Кусочное задание или разбор случаев. Пусть h1(x1,...,xn), ..., hk(x1,...,xn) - произвольные ч.р.ф., а всюду определенные ч.р.ф. f1(x1,...,xn), ..., fk(x1,...,xn) таковы, что на любом наборе аргументов (a1, ..., an) одна и только одна из этих функций равна 0. Тогда функция g(x1,..., xn), определенная соотношениями:
![g(x_1,\ldots, x_n)=
\left\{
\begin{array}{ll}
h_1(x_1,\ldots, x_n), & \mbox{ если } f_1(x_1,\ldots, x_n)=0\\
h_2(x_1,\ldots, x_n), & \mbox{ если } f_2(x_1,\ldots, x_n)=0\\
\ldots \\
h_k(x_1,\ldots, x_n), & \mbox{ если } f_k(x_1,\ldots, x_n)=0\\
\end{array}
\right.](/sites/default/files/tex_cache/84a08e5c2896d4ed9d7ea6eea5eb6097.png)
является частично рекурсивной.
Доказательство Действительно, gn можно представить как сумму k произведений:
![g(x_1,\ldots, x_n)=h_1(x_1,\ldots,x_n) \overline{sg}(f_1(x_1,\ldots,x_n)) +\ldots\\
\hspace*{3cm}+ h_k(x_1,\ldots,x_n) \overline{sg}(f_k(x_1,\ldots,x_n)).\\](/sites/default/files/tex_cache/ea5b58b613fb2683c4962f485d9fe358.png)
Следующий класс функций, который нас будет интересовать, - это функции для однозначной нумерации пар и n-ок целых чисел и обратные им. Определим для любой пары чисел (x,y) ее номер c2(x,y)=2x(2y+1) - 1. Например, c2(0,0)=0, c2(1,0)=1, c2(0,1)=2, c2(1,1)=5, c2(2,1)= 19. Из единственности разложения чисел на простые множители следует, что функция c2: N2 -> N взаимно однозначно нумерует пары целых чисел. Нетрудно понять, что если c2(x,y) = z, то двоичная запись числа (z+1) имеет следующий вид: (двоичная запись y ) 10x. Из такого представления можно однозначно извлечь значение x и значение y. Эти значения определяются следующими обратными функциями:
![c_{21}(z) =\textit{ максимальная\ степень\ 2,\ на\ которую\ делится}\ z+1 \mbox{ и }\\
c_{22}(z)=[( \textit{максимальное нечетное число, на которое делится}\ z+1) \dot{-} 1]/2.](/sites/default/files/tex_cache/ded9dbaaa9eb5e98fbeae57ea466409d.png)
Из этих определений непосредственно следует, что для любого z выполнено равенство c2(c21(z), c22(z))=z.
Определим теперь по индукции функции cn нумерации n-ок чисел при n > 2 и обратные им координатные функции cni (1 <= i <= n):
![\qquad c_n(x_1,x_2,x_3,\ldots,x_n)=c_{n-1}(c_2(x_1,x_2),x_3,\ldots,x_n),\\
\qquad c_{n1}(z) = c_{21}(c_{(n-1)1}(z)),\\
\qquad c_{n2}(z) = c_{22}(c_{(n-1)1}(z)),\\
\qquad c_{n(i+2)}(z) = c_{(n-1)(i+1)}(z)\qquad (i=1,\ldots,n-2).](/sites/default/files/tex_cache/5322940b13456942809d8ee2389ac77d.png)
Из этих определений также непосредственно следует, что для любого z имеет место равенство cn(cn1(z), cn2 (z),..., cnn (z))=z. (Проверьте это свойство индукцией по n.)
Лемма 8.4. Рекурсивность нумерационных функций. Для любых n >= 2 и 1 <= i <= n все определенные выше функции cn и cni являются примитивно рекурсивными.
Доказательство Примитивная рекурсивность c2(x,y) устанавливается непосредственно (см. задачу 8.1(а)). Функция c21(z) задается равенством c21(z)= max_deg_div(2,z+1) и является примитивно рекурсивной (это показано в примере 8.10). Для функции c22(z) справедливо определение c22(z) = div(2, div(2 c21(z)}, z+1) - 1) (здесь мы используем примитивную рекурсивность функции целочисленного деления div(x,y) из задачи 8.1(e)). Примитивная рекурсивность остальных нумерационных функций следует по индукции из их определений (см. задачу 8.10).
В следующей лемме обобщается оператор примитивной рекурсии.
Лемма 8.5. (совместная рекурсия) Пpедположим, что фyнкции
и фyнкции
пpимитивно pекypсивны. Тогда фyнкции f1n+1(x1, ..., xn, y), ..., fkn+1(x1, ..., xn, y),
опpеделяемые следyющей совместной pекypсией
![\left \{
\aligned f_i&(x_1,\ldots,x_n,0) =
\alpha_i(x_1,\ldots,x_n)\ \ (1\le i \le k) \\
f_i&(x_1,\ldots,x_n, y+1) =
\beta_i(x_1,\ldots,x_n,y, f_1(x_1,\ldots,x_n,y),\ldots,
f_k(x_1,\ldots,x_n,y))
\endaligned \right .](/sites/default/files/tex_cache/b627ad091f5964811af6d5c35ed76834.png)
(1 <= i <= k) также являются пpимитивно pекypсивными.
Доказательство Обозначим чеpез набоp пеpеменных x1,...,xn. Опpеделим
следyющие пpимитивно pекypсивные фyнкции:
,
, и положим
![\left \{
\aligned F^{n+1}&(\overline{x},0) = g^n(\overline{x}) \\
F^{n+1}&(\overline{x}, y+1) =
c_k(\hat{\beta}_1(\overline{x},y,F(\overline{x},y)),\ldots
\hat{\beta}_k(\overline{x},y, F(\overline{x},y)))
\endaligned \right .](/sites/default/files/tex_cache/0a743a0ed67be94cebe619bc2fc94ee7.png)
Фyнкция Fn+1 полyчена пpимитивной pекypсией из пpимитивно
pекypсивных фyнкций и, следовательно, сама пpимитивно pекypсивна.
Спpаведливость леммы тепеpь следyет из того, что для всякого .
Задачи
Задача 8.1. Показать, что следующие функции являются частично (примитивно) рекурсивными.
- exp(x,y) = xy ;
- fact(x) = x ,!;
- min(x,y)= наименьшее из x и y ;
- max(x,y)= наибольшее из x и y ;
- div(x,y)= частное от деления y на x (пусть div(0,y)=y ).
-
предикаты равенства и неравенства:
-
.
Задача 8.2. Докажите, что если f(x1,...,xn) является ч.р.ф. (п.р.ф.), то и функция g(x1,...,xn)=f(x{i1},...,xin) является ч.р.ф. (п.р.ф.) для любой перестановки (i1, ..., in) чисел 1,2,...,n.
Задача 8.3. Оператор сдвига. Пусть g(x1,..., xn) - частично (примитивно) рекурсивная функция, a и b >0 - числа из N. Тогда и функция
![\def\text#1{#1}
f(x_1,\ldots, x_n)=\left\{ \begin{array}{ll}
a,& \text{ если \ x_n \leq b }\\
g(x_1,\ldots,x_n-b),& \text{ если \ x_n > b}
\end{array}\right.](/sites/default/files/tex_cache/2deb8588436321d486931da5cf24a883.png)
является частично (примитивно) рекурсивной.
Задача 8.4. Показать, что следующие функции являются частично ( примитивно) рекурсивными.
-
- корень n -ой степени из x (целая часть).
-
(пусть при
или x= 0 log(i,x) =0 ).
- p(x)=1, если x - простое число, и p(x)=0, если x составное.
- pn(k) - k -ое простое число в порядке возрастания (pn(0)=0, pn(1)=2, pn(2)=3, pn(3)=5...).
- t(x) = число pазличных делителей числа x (t(0)=0).
-
d(n,m,i) - i -ый знак в m -ичном разложении числа n, т.е. если
, где 0 <= ai <= m-1, то d(n,m,i)=ai.
- nod(x, y)= наибольший общий делитель чисел x и y (пусть nod(0,y)=nod(x,0) =0 ).
Задача 8.5. Пусть F(x) задана соотношениями F(0)=1, F(1)=1, F(x+2)= F(x)+F(x+1) ( элементы последовательности F(x) называются числами Фибоначчи). Покажите, что функция F(x) примитивно рекурсивна.
(Указание: покажите сначала, что функция g(x)= 2F(x) 3F(x+1) примитивно рекурсивна.)
Задача 8.6. Докажите, что если значения общерекурсивной функции f(x) изменить на конечном множестве, то получившаяся функция f'(x) также будет общерекурсивной.
Задача 8.7. Доказать, что из функции o(x)=0 и из функций выбора Imn(x1,...,xn)=xm с помощью суперпозиции и примитивной рекурсии нельзя получить функцию s(x)=x+1 и функцию d(x) =2*x.
Задача 8.8. Пусть g(x1,...,xn,y) - примитивно рекурсивна. Доказать, что функция
![\def\text#1{#1}
f(x_1, ..., x_n,y,z)=\left\{ \begin{array}{ll}
\sum_{i=0}^z g(x_1,...x_n,y+i),& \text{ при\ y \leq z}\\
0,& \text{ при }\ y > z
\end{array}\right.](/sites/default/files/tex_cache/71392dc5fec2bcb052ce9df52719f071.png)
примитивно рекурсивна.
Задача 8.9. Доказать, что если функции f(x1,...,xn,y), g(x1,...,xn,y) и h(x1,..., xn,y) частично рекурсивны, то и функция
![F(x_1,...,x_n)= min\{y |\ f(x_1,...,x_n,y)=0\ \mbox{ или }\\\ g(x_1,...,x_n,y) >
h(x_1,...,x_n,y) \}](/sites/default/files/tex_cache/18304eb3edc0aaea292db4420721abbc.png)
является частично рекурсивной.
Задача 8.10. Докажите, что определенные выше функция нумерации n -ок cn(x1, ... , xn) и обратные ей функции выбора i -го элемента набора cni(z) (1 <= i <= n) являются примитивно рекурсивными.
Задача 8.11. Предположим, что все пары (x,y) натуральных чисел упорядочены по возрастанию суммы (x+y), а внутри группы пар с одинаковой суммой - по возрастанию x -координаты. Этот порядок выглядит так: (0,0), (0,1), (1,0),(0,2),(1,1), (2,0),... , (0,x+y), (1, x+y-1), ... , (x,y), ... , (x+y, 0), ... . Пусть d(x,y) - это номер пары (x,y) в этом порядке (будем считать, что пара (0,0) имеет номер 0). Тогда функция d2 однозначно нумерует все пары.
- Докажите, что
.
- Найдите обратные функции d1(z) и d2(z) такие, что d1(d(x,y))=x, d2(d(x,y))= y и, следовательно, d(d1(z), d2(z))=z.