Тверской государственный университет
Опубликован: 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. Рекурсивность табличных функций. Пусть всюду определенная функция f(x) на всех аргументах, кроме конечного числа, равна некоторой константе c (такую функцию назовем табличной). Тогда она является примитивно рекурсивной.

Доказательство Пусть для функции f из условия леммы n_{f}= max\{ x | f(x)\ne  c\}. Доказательство проведем индукцией по 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.

и, следовательно, также примитивно рекурсивна.

Покажем замкнутость класса ч.р.ф. (п.р.ф.) относительно операций суммирования и произведения.

Лемма 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),
G(x_1,\ldots,x_n,y)= \prod_{i=0}^y f(x_1,\ldots,x_n,i),

является частично (примитивно) рекурсивными.

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

\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.
\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.

Приведем примеры использования леммы 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

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

Пример 8.11. Ограниченная минимизация. Пусть примитивно рекурсивная функция g(x,y) такова, что для каждого x найдется y <= x, для которого g(x,y) =0. Положим F(x) = mu y [g(x,y) = 0].

Тогда, по определению, F(x) является частично рекурсивной функцией. Покажем, что, на самом деле, она примитивно рекурсивна. Действительно, определим h(x,y) = \prod_{i=0}^y sg(g(x,i)). По лемме 8.2 эта функция примитивно рекурсивна. Пусть для данного x y_{0} = \mu  y [g(x,y) = 0]. Тогда при i < y0 имеем h(x,i) = 1, а при i >= y0 h(x,i) =0. Поэтому искомая функция F задается равенством F(x) = \sum_{i=0}^y h(x,i) и также является примитивно рекурсивной.

Лемма 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.

является частично рекурсивной.

Доказательство Действительно, 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)).\\

Следующий класс функций, который нас будет интересовать, - это функции для однозначной нумерации пар и 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.

Из этих определений непосредственно следует, что для любого 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).

Из этих определений также непосредственно следует, что для любого 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нкции \alpha _{i}^{n}(x_{1},\dots ,x_{n}) (1 \le i \le \ k) и фyнкции \beta _{i}^{n+k+1}(x_{1}, \dots , x_{n}, y, y_{1}, \dots , y_{k}) (1 \le  i \le  k) п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 .

(1 <= i <= k) также являются пpимитивно pекypсивными.

Доказательство Обозначим чеpез \overline{x} набоp пеpеменных x1,...,xn. Опpеделим следyющие пpимитивно pекypсивные фyнкции: \ g^n(\overline{x})=
c_k(\alpha_1(\overline{x}),\ldots,\alpha_k(\overline{x}),\ \ \hat{\beta}_i(\overline{x},y,z)=\beta_i(\overline{x},y,c_{k1}(z), \ldots, c_{kk}(z)), 1 \le i \le k, и положим

\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 .

Фyнкция Fn+1 полyчена пpимитивной pекypсией из пpимитивно pекypсивных фyнкций и, следовательно, сама пpимитивно pекypсивна. Спpаведливость леммы тепеpь следyет из того, что для всякого \ i \in [1,k]\ \ f_i(\overline{x},y)= c_{ki}(F^{n+1}(\overline{x},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 ).
  • предикаты равенства и неравенства:

    \def\text#1{#1}
eq(x,y)=\left\{ \begin{array}{ll}
 1,& \text{ если \ x=y}\\
 0,& \text{ если \ x\neq y}\end{array}\right.
\qquad \overline{eq}(x)= \left\{ \begin{array}{ll}
 0,& \text{ если \ x=y}\\
 1,& \text{ если \ x\neq y}
\end{array}\right.
  • f(x) = 2^{2^x}.

Задача 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.

является частично (примитивно) рекурсивной.

Задача 8.4. Показать, что следующие функции являются частично ( примитивно) рекурсивными.

  • rt(n,x)=\lfloor\sqrt[n]{x}\rfloor - корень n -ой степени из x (целая часть).
  • log(i, x) =\lfloor \log_i x \rfloor (пусть при i \in  \{ 0,1\} или 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, т.е. если n=\sum_0^\infty a_i m^i, где 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.

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

Задача 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) \}

является частично рекурсивной.

Задача 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 однозначно нумерует все пары.

  • Докажите, что d(x,y) = \frac{(x+y)(x+y+1)}{2} +x -1.
  • Найдите обратные функции d1(z) и d2(z) такие, что d1(d(x,y))=x, d2(d(x,y))= y и, следовательно, d(d1(z), d2(z))=z.
< Лекция 7 || Лекция 8: 123 || Лекция 9 >