- •Введение
- •1. Грамматики, автоматы и контекстно-свободные языки
- •If выражение then if выражение then другой_оператор else другой_оператор
- •2. Грамматики, машины тьюринга и перечислимые языки
- •3. Теория алгоритмов и рекурсивных функций
- •4. Теория сложности
- •Мы определяем ее через
- •5. Упражнения
- •Рекомендуемая литература
- •Содержание
3. Теория алгоритмов и рекурсивных функций
Мы начнем с интуитивно ясного понятия алгоритма.
Алгоритм есть метод решения некоторой задачи с входными данными. Этот метод может быть разложен на отдельные единичные шаги, исполнение которых и порядок их следования однозначно определены. Этот метод должен иметь возможность описания с помощью текста конечной длины. При этом «решение проблемы с одним входом» есть, в сущности, вычисление значения функции для заданного аргумента.
Для того чтобы математически овладеть понятием алгоритма, следует заменить его формализованным понятием, а именно его экспликатом, т.е. интерпретацией. Существуют различные интерпретации понятия алгоритма, такие, как μ-рекурсивные функции, машины Тьюринга, грамматики типа 0, грамматики Ван-Вайнгаардена и др. При этом эти интерпретации служат также для описания алгоритмов, что означает: каждая конкретная μ-рекурсивная функция, каждая конкретная машина Тьюринга, каждая конкретная грамматика типа 0, каждая конкретная грамматика Ван-Вайнгаардена описывает определенный алгоритм; она, таким образом, репрезентирует алгоритм. Мы в дальнейшем не будем делать строгого различия между конкретным алгоритмом и его возможными описаниями (если это не приведет к неясности). Все эти интерпретации эквивалентны в том смысле, что каждый алгоритм, который может быть описан с помощью одной из этих интерпретаций, таким же образом может быть описан и с помощью любой другой из этих интерпретаций. Также и любой формально определенный язык программирования с определенными минимальными требованиями (как, например, присваивание и структура циклов) может рассматриваться как интерпретация понятия алгоритма. В это число попадают все имеющиеся языки программирования (машинный код, Ассемблер, Бейсик, Алгол 60, Алгол 68, Фортран, Паскаль, Модула-2, Лисп, …).
Мы рассмотрим сначала такие алгоритмы, отдельные шаги которых состоят в изменении слов над заданным алфавитом. Если достигается конец этого процесса изменения, то полученное слово есть результат алгоритма при некотором определенном входе. Если же при некотором определенном входе конец этого процесса изменения не достигается, то результат не определен.
Мы будем полагать теперь, что понятие алгоритма формально определено, а именно с помощью одной из приведенных интерпретаций. (Для дальнейшего достаточно выбрать некоторый язык программирования и описать алгоритмы с помощью программ на этом языке.) Мы хотим далее с помощью понятия алгоритма получить другие понятия и рассмотреть основы теории рекурсивных функций.
Пусть М – бесконечное множество, тогда М является эффективно нумерованным (счетным) с помощью биективной функции F:М тогда и только тогда, когда для всех входных данных из найдется алгоритм, с помощью которого для любого п может быть эффективно вычислено значение обратной к F функции в точке п, т.е. F -1(п) М. В случае, если М конечно, где М= п, то в этом определении следует заменить на {0,1,..., п-1}.
Таким образом, можно говорить об n-м элементе F -1(п) множества М. Если обозначить F -1(п) через xn, то последовательность
x0, х1,…, хn,…
является эффективной нумерацией множества М. Элемент хМ имеет тогда индекс F(х) . Также говорят, что F кодирует М, F -1 декодирует М.
Пример 3.1. (1) Пусть ={a1,...,ak – алфавит. Лексикографический порядок над *определяется следующим образом:
Пусть w1, w2 *. Тогда w1 w2
(i) w 1 w 2, или
(ii) w 1 w 2, w1 vai v1, w2 vaj v2, ij, v, v1, v2 *, или
(iii) w 1 w 2
Порядок является полным и нётеровым и * может быть эффективно занумеровано согласно лексикографическому порядку. Иногда также следующий порядок называется лексикографическим:
w 1 ’ w 2
(i) w2 w1v, v*, или
(ii) w1 vai v1, w2 vaj v2, ij, v, v1, v2 *.
Этот порядок ’ полный, но не нётеров:
a2 >’ а1 а2>’ a1 a1 a2 >’…’ a a2’…
В лексике применяется этот лексикографический порядок.
(2) Пусть М=, Мп – конечно, причем |Мn|=kn, kn>0, МiМj= для ij. Пусть Мn эффективно нумеровано посредством функции Fn Мп {0,1,…, kn-1}, тогда последовательность
F(0),..., F (k0 – 1), F (0),..., F (k1 – 1),..., F (0),..., F (kn – 1),...
является эффективной нумерацией множества М.
(3) Множество D1×D2, где D1 и D2 являются эффективно счетными, само является эффективно счетным. Пусть Di эффективно нумеруется посредством Gi: Di, i 1,2.
Определим для п 0,
Мn = {(d1,d2)| G1 (d1)+ G2(d2) n, d1 D1, d2 D2}
и
Fn ((d1,d2)) = G1 (d1) n – G2(d2), (d1,d2) Мn.
Тогда, согласно (2), последовательность
(G(0),G(0)), (G(0),G(1)), (G(1),G(0)),(G(0),G(2)),…
является эффективной нумерацией D1×D2. Oна называется диагональной нумерацией.
В дальнейшем, пусть Е и D – эффективно счетные множества. (Большей частью Е = ×…×, D = *). Тотальная функция F: ЕD называется вычислимой (а также рекурсивной), тогда и только тогда, когда существует один для всех аргументов из Е завершающийся алгоритм, с помощью которого для каждого аргумента xЕ можно эффективно вычислить значение функции F(x) D. Частичная функция F: ЕD называется частично вычислимой (а также частично рекурсивной) тогда и только тогда, когда существует алгоритм, который обеспечивает следующее. Если F(x), xЕ, определено, то алгоритм завершается при вводе х и возвращает F(x) D); если F(x), xЕ, не определено, то при вводе х алгоритм не завершается за конечное время.
Тем самым понятия «алгоритм» и «частично вычислимая функция» соответствуют друг другу в следующем смысле: каждый алгоритм определяет частично вычислимую функцию, которая посредством него вычисляется.
Полагая в предыдущих определениях E ×…×, D=, получают числовые вычислимые и соответственно частично вычислимые функции. В сущности, можно ограничиться числовыми функциями : . Именно пусть G: ЕD вычислимая (соответственно частично вычислимая) функция. Тогда существуют биективные функции F1: Е и F2 D, такие, что Е посредством F1 и D посредством F2 – эффективно счетные. Пусть : – функция, определяемая посредством:
(n) = F2(G (F (n))), п .
Очевидно, является вычислимой (соответственно частично вычислимой) и выполняется: G(x)=F( (F1(x))), х Е. Действительно, из определения следует: F( (n)) = G (F (n)). Положим теперь х= F(n), тогда п = F1(x) и F( (F1(x)))=G(x).
Множество М D называется рекурсивно перечислимым тогда и только тогда, когда существует вычислимая функция F ЕD, с подходящим образом выбранным множеством Е, такая, что область значений функции F совпадает с М, т.е., М={F(x) хЕ} или, короче, М = F(E). В дальнейшем пустое множество также является рекурсивно перечислимым.
Название «перечислимое» множество отражает следующую сущность: Пусть z0, z1,…,zn, …– эффективная нумерация Е. Тогда M может быть перечислено посредством
F(z0), F(z1), …, F(zn), …
Множество М D называется рекурсивно разрешимым (или рекурсивным), если М и D – М рекурсивно перечислимы.
Так как оказывается, что введенные уже перечислимые и разрешимые формальные языки являются в точности рекурсивно перечислимыми и рекурсивно разрешимыми формальными языками, то в дальнейшем мы будем, если это не приведет к неясностям, слово «рекурсивный» опускать.
Пусть М D. Определим тогда характеристическую функцию M D {0,1} множества М (относительно D) посредством:
M (x) .
Тогда справедливо, что M D разрешимо тогда и только тогда, когда M вычислима. Это может быть показано следующим образом:
Для М = или М = D, М является разрешимым ( перечислимо по определению и D – перечислимо посредством тождественной функции, которая, конечно, вычислима). Далее, в этих случаях выполняется, что характеристическая функция M является вычислимой (так как она в случае М = всегда принимает значение 0 и в случае М=D всегда значение 1). Теперь рассмотрим случай М и М D.
(i) Пусть M – вычислимая. Пусть М и D–М произвольные, но фиксированные элементы. Мы определим две функции F0,F1:DD как
F0(x) = ; F1(x)=
Конечно, F0 и F1 являются вычислимыми и выполняется: F0(D)=D–М и F1(D)= М. Отсюда D–М и М перечислимы и М – разрешимо.
(ii) Пусть М – разрешимо. Тогда М и D–М – перечислимы. Поскольку М и М D, то существуют две вычислимые функции F0 и F1, которые перечисляют множества D–М и М:
D –M у0, у1, …,уn,…,
M x0, x1,…,xn,….
Мы хотим теперь для zD вычислить значение M (z). Для этого применим следующий алгоритм: для каждого i = 0, 1,2... вычислим с помощью F0 и F1 элементы yi и хi. А так как z должен встретиться или в последовательности (уn), или в последовательности (xп), то существует такое т, что выполнимо z = ут или z = xm. В первом случае мы положим M (z) = 0, а во втором случае положим M (z)=1. Тем самым характеристическая функция M – вычислимая.
Подобное выполняется и для перечислимых множеств. Пусть МD. Мы определим частичную характеристическую функцию:D{1} множества М (относительно D) посредством
(x)
Тогда справедливо, что М D перечислимо тогда и только тогда, когда – частично вычислимая. Это может быть показано следующим образом:
(i) Пусть – частично вычислимая. В случае, если (x) является не определенной для всех x D, тогда М = и поэтому является перечислимым множеством.
Пусть теперь ()=1 для D. Тогда выполняется М. Определим функцию F: ( – {0})×D D посредством
F((n,x))=
Так как ( – {0})×D, согласно примеру 3.1(3), является эффективно счетным, то функция F – вычислимая. А вследствие М={F((n,x)) п1, xD}, М является перечислимым.
(ii) Пусть М – перечислимое. Для М = функция нигде не определена и поэтому частично вычислимая. Для М существует вычислимая функция F:ЕD, которая перечисляет М:
M: x0, x1, …,xn, …
Мы хотим теперь для элемента zD вычислить значение (z). Для этого сравним последовательно z с хi, i 0. Если мы найдем т0, для которого z = xт, то положим (z) 1. В противном случае (z) не определена.
Из-за этих обстоятельств перечислимые множества называют также полуразрешимыми множествами. Таким образом, справедливо, что множество М D разрешимо тогда и только тогда, когда М и D–М полуразрешимы.
Определим теперь важный экспликат понятия частично вычислимой функции, а именно -рекурсивные функции. Эти функции отображают (*)n, п (п-кратное декартово произведение множеств *) в *. Сначала определим три вида простых базовых функций:
(i) Для любого а отображение Na: * *, Na(w) = wa, w *, называется функцией следования.
(ii) Для любого п 0 отображение Сn:(*)n*, Сn(w1,w2,...,wn)=, wi*, 1 i n, называется п-местной нуль-функцией.
(iii) Для любого п 1 и 1jп отображение :(*)n *, (w1,w2,...,wn)=wj, wi *, 1i n называется п-местной проекцией.
Определим далее три функционала, которые позволяют получить новые функции из уже ранее определенных функций.
(i) Пусть п 0, т 1 и H: (*)m*, Gj: (*)n *, 1jm. Функция F: (*)n * образуется из Н путем подстановки функций G 1, G2,…, Gm тогда и только тогда, когда для всех wi*, 1i п, выполняется:
F (w1, w2,..., wn) = Н (G1 (w1,..., wn),...,Gm (w1,..., wn)).
(ii) Пусть n 1, G: (*)n-1* и На: (*)n+1 *, a. Функция F:(*)n* образуется из G и Ha, a, посредством рекурсии тогда и только тогда, когда для всех wi*,1 i n, имеет место
F(,w2,…,wn) G(w2,…,wn), F(w1a,…,wn) Ha(F(w1,…,wn),w1,…,wn), a.
(iii) Пусть n 0 и G: (*)n+1*. Функция F: (*)n*образуется из G путем минимизации относительно a тогда и только тогда, когда для всех wi *, 1 i п выполняется:
F(w1,…,wn) a G (w0,w1,…,wn).
При этом а G (w0,w1,…,wn)] определена следующим образом: в случае, если найдется некоторое т0, такое, что G (аl, w1,..., wn), 0lm, определена, причем G(аl,w1,..., wn), 0l<m и G(аm,w1,...,wn)=, то выполняется: а [G (w0, w1,..., wn)] = am. В противном случае а [G (w0, w1,..., wn)] не определена.
С помощью базовых функций и функционалов определяют примитивно рекурсивные и -рекурсивные функции. Семейство примитивно рекурсивных (соответственно -рекурсивных) функций над есть наименьшее семейство функций F:(*)n*, n, которое содержит a, а, C0, , n1, и замкнуто относительно подстановки и рекурсии (соответственно подстановки, рекурсии и минимизации).
Ясно, что -рекурсивная функция в общем случае является частично рекурсивной, тогда как примитивно рекурсивная функция всегда вполне ‑рекурсивна.
Из приведенных выше определений получают числовые функции из n в , полагая, что одноэлементный алфавит, ={а}, и идентифицируя am с числом т. В частности, числу 0 соответствует элемент . Семейство числовых примитивно рекурсивных функций (соответственно числовых - рекурсивных функций) есть наименьшее семейство функций F: n , n 0, которое содержит N (=Na), С, , n 1 и замкнуто относительно подстановки и рекурсии (соответственно подстановки, рекурсии и минимизации).
Для того чтобы получить компактное описание -рекурсивных функций над , введем -рекурсивные программы. Каждая -рекурсивная программа имеет один или несколько входов в зависимости от того, на какое количество аргументов из * она рассчитана. Каждая п-местная ‑рекурсивная программа представляет п-местную -рекурсивную функцию (служит для вычисления этой функции). Выберем (всюду, где это возможно) следующие обозначения: -рекурсивная функция будет обозначаться большими буквами, -рекурсивная программа, которая ее вычисляет, будет обозначаться теми же самыми малыми жирными буквами. Пусть ={a 1,..., a k}.
(i) Программа n – одноместная и представляет функцию следования N, 1 i k.
(ii) Программа c – нуль-местная и представляет нуль-функцию С0.
(iii) Программа u может иметь любое число входов п 1 и представляет .
(iv) Пусть -рекурсивные функции Н: (*)m * и Gj: (* n, ljn, n 0, m 1 представляются через т-местные (соответственно, п-местные) программы h и gj. Функция F, которая образуется путем подстановки G1,...,Gm в Н, представляется п-местной программой h (g1,..., gm).
(v) Пусть -рекурсивные функции G(*)n-1 * и Н:(* n+1 *, 1ik, n 1 представлены через (n – 1)-местные (соответственно (n+1)-местные) программы g и h. Функция F, которая образуется путем рекурсии из G и Н, 1 i k, представляется n-местной программой [gh,..., h].
(vi) Пусть -рекурсивная функция G: (*)n+1*, n 1 представлена (n+1)‑местной программой g. Функция F, которая образуется из G путем минимизации относительно ai, 1i k, представляется n-местной программой g.
Синтаксис языка -рекурсивных программ (без учета разрядности), таким образом, задан следующими продукциями:
Pn…n c u P(L) [Pk+1 P… P, L PL P
-рекурсивная программа, в которой не встречаются символы , , называется примитивно рекурсивной программой. В случае числовых ‑рекурсивных программ k = 1 и индексы при n и опускаются:
Pn c u P(L) [PP P.
Пример 3.2. (1) Мы хотим функции , п 2, 2jn представить с помощью программ. Пусть uj – программа произвольной размерности большей или равной j, такая, что примененная к (w1,...,wn), где n j, возвращает слово wj (u1= u). Тогда [uj uk] есть программа размерности j+1, такая, что примененная к (w1,..., wn), где n j+1, возвращает слово wj+1. Поэтому [uj uk] представляет следующую функцию F:
F (, w2, …,wn) = (w2, …, wn),
F (w1a,w2,…,wn) = (F (w1,w2,…,wn), w1,w2,...,wn), a.
Тем самым выполнено:
F (w1a, w2,…, wn) =... =F (, w2,..., wn) = (w2,..., wn)= wj+1.
(2) Представим Сn,п0 с помощью п-местной программы cn. Функция Сn представляется с помощью [cn-1 uk ] (где c0 = c). Тогда cn-1uk ] представляет следующую функцию F:
F (, w2,…, wn) = Cn-1(w2, …, wn),
F (w1a,w2,..., wn) = (F (w1,w2,...,wn), w1, w2,…, wn), a,
при этом выполняется:
F (w1a, w2,..., wn) =... = F (, w2,..., wn) = Cn-1(w2,..., wn).
(3) Представим одноместную постоянную функцию Kv, v*, где Kv(w)v, для всех w*с помощью программы. Пусть kv – одноместная программа, которая представляет Kv. Тогда [сuk] представляет функцию K = С1 и na (kv) представляет постоянную функцию Kva, a. Поэтому na(kv) представляет следующую функцию F:
F (w) = Na (Kv (w)) = Na (v) = va.
Теперь мы хотим определить дальнейшие функционалы, позволяющие из примитивно рекурсивных (соответственно -рекурсивных) функций снова получать того же рода функции.
Предложение 3.1. Пусть G*n*, H*m*, Ha**, a, – примитивно рекурсивные (соответственно -рекурсивные) функции. Тогда следующие функции F тоже являются примитивно рекурсивными (соответственно -рекурсивными)
(i) F(w1,…,wn)=G(w(1),…,w(n)),где – перестановка из …n.
(ii) F(w1,…,wl1,wl+1,…,wn,v1,..,vm)=G(w1,…,wl1,H(v1,..,vm),wl+1,..,wn).
(iii) F(w1,…,wn,)G(w1,…,wn),
F(w1,…,wn,w0a)=Ha(F(w1,…,wn,w0)),a.
Доказательство Функции G, H, Ha могут быть представлены программами g, h, ha, a.
(i) F представяется программой g(u,…,un). Поэтому справедливо:
F(w1,…,wn)=G(Uw1,…,wn,…,U(w1,…,wn))=G(w(1),…,w(n)).
(ii) F представляется программой g(u1…ul-1h(un…un+m-1)ul…un-1).
(iii) программа gh(u)…h(u)(un+1u1…un) представляет функцию F1. Тогда справедливо:
F1(w1,…,wn,w0)=F2(w0,w1,…,wn),
где F2 представлятся программой gh(u)…h(u), таким образом,
F2(, w1,…,wn) = G(w1,…,wn),
F2(w0ai,w1,…,wn) (F2(w0,w1,…,wn),w0,w1,…,wn))=
= (F2(w0,w1,…,wn)), 1 i k.
Тем самым получим
F1(w1,…,wn, ) G(w1,…,wn),
F1(w1,…,wn,w0a) = (F(w1,…,wn,w0)), 1 i k
и F1 совпадает с F.
Пример 3.3. (1) Мы хотим записать программу con2 для функции CON2*×** с CON2w1,w2w1w2 Справедливо:
CON2w1, U(w),
CON2w1,w2a Na(CON2w1,w2), a.
Согласно предложению 3.1 (iii) CON2 является примитивно рекурсивной и con2u n(u)… n(u) u2 u .
(2) Программа conn для n-местной функции CONn, n , с CONnw1,…,wn w1,…,wn имеет вид: con2 conn-1 u1…un-1un.
Пример 3.4. Мы хотим представить теперь некоторые числовые функции программами. Все x,y лежат в .
(1) Функция следования.
Пусть Nt , t1, – функция Nt(x)x+t, таким образом, N1(x)N(x) и Nt+1(x)N(Nt(x)).
n1n, nt+1n(nt), t 1.
(2) Константа.
Пусть K n – n-местная постоянная функция, причем K(x1,…,xn)i.
а) Нульместная константа.
kc, kni(c).
b) Одноместная константа. K=C0, K(x+1)=U(K(x),x).
k=c u, k=(ni k).
c) n-местная константа, n2. K(x1,…,xn)=K((x1,…,xn)).
k0=k (u), k i=ni (k0).
(3) Сумма.
SUM(0, y) = y = U(y),
SUM(x+1,y)=SUM(x,y)+1=N(SUM(x,y))=N(U(SUM(x,y)),x,y).
sum= un(u).
(4) Произведение.
PROD(0, y)=0= K(y),
PROD(x+1,y)=SUM(PROD(x,y),y) =
=SUM(U(PROD(x,y),x,y),U(PROD(x,y),x,y)).
prod =ksum(u u3) = cuunuu u uu)].
(5) Потенцирование.
EXP(0, y) = 1 = K(y),
EXP(x+1,y) = PROD(EXP(x,y),y)=
=PROD(U(EXP(x,y),x,y),U(EXP(x,y),x,y).
exp=kproduu3ncucuunuuuuuuuuu
(6) Функция предшествования.
V(0) = 0 = C0,
V(x+1) = x = U(V(x),x).
v = c u2 cu u .
(7) Разность.
DIFF1(0, y) = y = U(y),
DIFF1(x+1,y) =V(DIFF1(x,y)) = V(U(DIFF1(x,y),x,y)
DIFF(x, y) = DIFF1(y,x) = DIFF1(U(x,y),U(x,y).
diff1=uvu = ucuu(u), diff = ucuu uuuu.
(8) Факториал.
FAK(0) = 1 = K,
FAK(x+1) = PROD(FAK(x),N(x)) =
= PROD(U(FAK(x),x),N(U(FAK(x),x))).
fak = kprodunu2=nccuunuu[uuuunuu.
(9) Знак.
SGN(0) = 0 = C0,
SGN(x+1) = 1 =K(SGN(x),x).
sgn = c kcn(cu(u)).
Покажем теперь, что алфавит а1,…,аk может эффективно нумероваться с помощью биективной примитивно рекурсивной функции Сk. Здесь снова речь идет о лексикографическом порядке. Мы определяем Сk * ( отожествляется с а) через
Сk ( Сk(а,…,а) ij kn-j.
Функция Сk отображает биективно n на числа между k n-1+kn-2+…+k+1 и kn +kn-1+…+k2+k, n 1. Вследствие того, что
ij kn-j = k ij k n-1-j+in,
справедливо:
Ck() = 0 = C0,
Ck(wai) = SUM(PROD(Ck(w),k) i) = Ni(Pk(U(Ck(w),w))),1ik,
где Pk(w) = PROD(U(w),K(w)).
Это дает в итоге примитивно рекурсивную программу
c k c n1 pk u…nkpk u p kprod u nk cu
Обратно, можно показать, что имеется биективная примитивно рекурсивная функция Dk ** (в действительности Dk *) с Dk(Ck(w)) = w, w*. Тем самым мы доказали следующее предложение.
Предложение 3.2. * эффективно нумеруется с помощью Ck.
Покажем теперь, что n, n 2, эффективно счетно. Докажем это сначала для n = 2.
Биективная примитивно рекурсивная функция 2 называется парной функцией тогда и только тогда, когда она является строго монотонной по каждому аргументу, т.е.: х1 х2 х1+1 х2 и х1 х2 х1 х2 +1 справедливо для всех х х .
Из условия монотонности следует, что х х х х. Мы покажем сначала, что х х1 0. Вследствие 00 справедливо 000 и из х х1 0 следует х х1+1 0 , таким образом, х х1+1 0 . Из х х1 0 сразу следует х1 х х для всех х2. Аналогично проводится доказательство для второго аргумента.
Благодаря биективности имеются две биективные функции , х1, х2 х1 и х х х. Из этого следует 1х), (х = х, потому что для каждого х однозначно найдутся х х, такие,что х = х х. Поэтому справедливо:
1х), (хх1,х2, х х) = х х = х.
Для данного х, 1х) и (х можно охарактеризовать следующим образом: х 1х) х, х2 2х) х определены однозначно тем, что справедливо: х х = х. Ограничение 1х) х, 2х) х (конечный поиск) дает в результате, что 1 и 2 – примитивно рекурсивные.
Следующие функции используются часто как парные функции:
(1) ху (х+у+1)(х+у)+х (диагональная нумерация):
-
x y
0
1
2
3
4
0
0
1
3
6
10
1
2
4
7
11
2
5
8
12
3
9
13
4
14
(z) = z ,
2(z) – (z).
(2) х у = 2х (2у +1) –1.
Предложение 3.3. Парные функции существуют. с помощью некоторой парной функции эффективно нумеруется.
Концепцию парной функции можно обобщить на n, n 2. Пусть – парная функция. Определим тогда
n+1х1,…,хn+1) = nх1,…,х n-1, 2 хn, хn+1)), n 2.
Конечно, n – снова биективная и примитивно рекурсивная функция. Обратные функции
i,n+1: ¥¥, с i,n+1 ( n+1 х1,…,х n+1)) = х i,
где 1in+1, можно определить через
i,n+1(z) =
1,2 = 1, 2,2 = 2.
Причем i,n+1 требуются только для 1 i n+1 и n 2.
Предложение 3.4. n, n 2, эффективно нумеруется с помощью примитивно рекурсивной функции.
Предложение 3.5. (*)n, n 1, эффективно нумеруется с помощью примитивно рекурсивной функции.
Доказательство. Функция С:(*)n, которая определяется через С(w1,…,wn) = n(Ck(w1),…,Ck(wn)), wi*, дает эффективную нумерацию для n 2. Случай n =1 уже рассмотрен в предложении 3.2.
В сущности, можно ограничиться одноместными числовыми примитивно рекурсивными функциями и -рекурсивными функциями. Для заданной функции F (*)n* мы определим функцию через(x) =Ck(F(Dk(1,n(x)),…,Dk(n,n(x)))). Тогда вместе с F функция тоже будет примитивно рекурсивной или - рекурсивной и справедливо:
F(w1,…,wn) = Dk ( (C(w1,…,wn))),
так как из wi = Dk (i,n (x)) следует Ck (wi) i,n(x) и
C(w1,…,wn) n(Ck(w1),…,Ck(wn) x.
Таким образом, справедливо: (C(w1,…,wn)) = Ck(F(w1,…,wn)), отсюда следует F(w1,…,wn) = Dk ((C(w1,…,wn))).
Функции Ck, Dk, n, 1,n,…,n,n являются примитивно рекурсивными и относительно «просто» строятся. Если функция F является «сложной», это выражается в «сложной» функции (но не в «сложном» кодировании).
Следующее предложение рассматривает применение предложения 3.4 и показывает, что «параллельная рекурсия» не выводит из класса примитивно рекурсивных (соотв. -рекурсивных) функций.
Предложение 3.6. Пусть n, m 1и Gi n-1, Hi m, 1im, – примитивно рекурсивные (соотв. -рекурсивные). Тогда функции Fin, 1im,
где Fi (0, x2,…,xn) = Gi(x2,…,xn),
Fi (x1+1, x2,…,xn) = Hi (F1 (x1,x2,…,xn),…,Fm(x1,x2,…,xn)),
тоже являются примитивно рекурсивными (соотв. -рекурсивными).
Доказательство. С помощью примитивно рекурсивной (соотв. ‑рекурсивной) функции
H(y1,…,ym) = m(H1(y1,…,ym),…,Hm(y1,…,ym))
мы определяем примитивно рекурсивную (соотв. -рекурсивную) функцию F n через
F(0, x2,…,xn) = m (G1 (x2,…,xn),…,Gm(x2,…,xn)),
F(x1+1, x2,…,xn) = H(1,m(F(x1,x2,…,xn)),…,(m,m(F(x1,x2,…,xn))).
С помощью полной индукции по x1 мы покажем, что справедливо: Fi(x1,…,xn) = i,m(F(x1,…,xn)).
(i) i,m(F(0, x2,…,xn)) = i,m(m(G1(x2,…,xn),…,Gm (x2,…,xn))) =
= Gi (x2,…,xn) = Fi (0,x2,…,xn), 1 i n.
(ii) i,m(F(x1+1,x2,…,xn)) =
= i,m(H(1,m (F (x1,…,xn)),…, m,m(F(x1,…,xn)))) =
= i,m(H(F1 (x1,…,xn),…, Fm (x1,…,xn))) =
= i,m(m(…,Hi(F1(x1,…,xn),…, Fm(x1,…,xn)),…)) =
= Hi (F1(x1,..,xn),…,(Fm(x1,…,xn)) = Fi(x1+1,x2,…,xn), 1in.
Так как i,m – примитивно рекурсивная, то Fi тоже является примитивно рекурсивной (соотв. -рекурсивной).
n-местный предикат P над называется примитивно рекурсивным, если имеется примитивно рекурсивная функция H: n , такая, что:
Р истинно на (x1,…,xn) тогда и только тогда (обозн. Р(x1,…,xn)),
когда H (x1,…,xn) = 1;
Р ложно на (x1,…,xn) тогда и только тогда (обозн. Р(x1,…,xn)),
когда H (x1,…,xn) = 0.
Функция H называется характеристической функцией предиката Р. n‑местный предикат Т определяется тем, что он истинный на каждом (x1,…,xn) n.
Предложение 3.7. Пусть G1,…,Gk – примитивно рекурсивные функции и Р1,…,Рk-1 – примитивно рекурсивные предикаты. Тогда функция F: n, такая, что
F(x1,…,xn) = (Р1(x1,…,xn)G1(x1,…,xn),
Рk-1(x1,…,xn)Gk-1(x1,…,xn),
ТGk(x1,…,xn))
будет примитивно рекурсивной.
Доказательство. Пусть Hi – характеристическая функция предиката Рi, 1 i k-1. Тогда справедливо:
F(x1,…,xn) = G1(x1,…,xn) H1(x1,…,xn) +
+ G2(x1,…,xn) (1- H1(x1,…,xn)) H2(x1,…,xn) +
+ Gk(x1,…,xn) (1-H1(x1,…,xn))… (1-Hk-1(x1,…,xn)).
Пример 3.5. (1) Функция «больше»: GR(x,y) = SGN (DIFF(x,y)), gr=sgn(diff).
(2) Функция «равно»:
GL(x,y)=DIFF(K(x,y),SUM(DIFF1(x,y),DIFF(x,y))),
gl = diff (k sum (diff1 diff)).
Существуют хорошие основания предполагать, что -рекурсивные функции действительно являются интерпретацией понятия частично вычислимых функций (в связи с алфавитом ) и тем самым понятия алгоритма. Все предложенные интерпретации (некоторые из них мы еще обсудим) оказываются эквивалентными -рекурсивным функциям и все интуитивно описанные частично вычислимые функции могут быть точно определены с помощью -рекурсивных функций. Это подводит к тезису Тьюринга – Чёрча: «-рекурсивная функция является интерпретацией понятия частично вычислимой функции». Другими словами, что каждая частично вычислимая функция является -рекурсивной.
Мы хотим теперь эффективно нумеровать одноместные числовые ‑рекурсивные программы.
Их синтаксис имеет вид:
Pn c u P(L) [PP P,
LPL P.
Причем количество аргументов не учитывается. Для каждой программы, однако, легко проверить, может ли она быть одноместной.
Исходный алфавит =n, c, u , содержит 9 символов. Мы эффективно нумеруем * с помощью С9. Пусть
w0, w1, w2,…,wn,…
– эффективная нумерация. Если мы хотим вычислить индекс одноместной программы w, мы ищем такой m, что w = wm. Затем мы проверяем слова wi, 0 i m, являются ли они одноместными программами. Таким способом мы получим список одноместных программ
w, w, w,…,w = wm = w.
Тем самым w получит индекс r. Если мы хотим перейти от индекса r к программе, то мы для 0ir таким же способом, что и выше, вычислим r‑тую одноместную программу.
Предложение 3.8. Одноместные -рекурсивные программы эффективно нумеруются.
С помощью эффективной нумерации одноместных -рекурсивных программ мы строим теперь тотальную функцию H: , которая не является -рекурсивной.
Сначала сопоставим каждой -рекурсивной программе w её длину L (w); причем L (w) – число символов n, c, u , , которые встречаются в w (круглые скобки не считают). Для каждой длины t 1 существует только конечное число программ w, таких, что L(w) = t. Мы определим функцию М: через
М (0) = 0,
М (t) = max w w одноместная программа,
L (w) = t, w определено t .
Вследствие того, что L (n t) = t и n t = t, t 1, М является тотальной функцией, для которой М (t) t. Пусть H: – тотальная функция
H (t) = М (2t)+1.
Предложение 3.9. Функция H не является -рекурсивной. (Согласно тезису Тьюринга – Чёрча: H не является вычислимой.)
Доказательство. Мы проведём непрямое доказательство. Пусть H – ‑рекурсивная функция. Тогда существует программа h, которая представляет H. Пусть L(h) = t. Тогда мы рассмотрим программу h(nt) с L(h(nt)) = 2t. Отсюда h(nt)(0) М (2t). С другой стороны, h(nt)(0) = h(t)= H(t) =М (2t)+1 и получим противоречие.
С помощью тезиса Тьюринга – Чёрча получают, что функция H: , которая определяется следующим образом:
H(r) =
не является вычислимой.
Предложение 3.10. Пусть R – множество всех индексов одноместных -рекурсивных программ, которые завершаются, если индексы заменяются на 0. Тогда R является неразрешимым, однако перечислимым множеством и, таким образом, является полуразрешимым. (Тем самым –R неперечислимо.)
(Позднее увидим, что предложения 3.9 и 3.10 эквивалентны известной проблеме останова машины Тьюринга.)
Пример 3.6. Определим последовательность функций G0, G1,…, Gn, … через
G0 (у) = (у),
Gх+1(0) = Gх(1),
Gх+1(у+1) = Gх(Gх+1(у)).
Каждая из этих функций примитивно рекурсивна. Функцию Gn+1 можно представить через программу gn+1gnnc)gnu n, где g0=n.
Можно показать, что тотальная функция F: 2, которая определяется через F(x,y) = Gх(у),– -рекурсивная, но не примитивно рекурсивная. Функция F может быть определена посредством
F (0, у) = у+1,
F (х+1, 0) = F (х, 1),
F (х+1, у+1) = F (х, F (х+1, у))
и является хорошо известной функцией Аккермана.
Покажем теперь, что -рекурсивные функции частично вычислимы по Тьюрингу.
Предложение 3.11. Пусть H, G, G1,…,Gm – функции, частично вычислимые по Тьюрингу. Тогда функция F также частично вычислима по Тьюрингу, если
(i) F получается путем замены из H и G1,…,Gm,
(ii) F получается путем рекурсии из G и H,
(iii) F получается путем минимизации из G.
Доказательство. Мы покажем только (i). Пусть TH, TG…,TG – односторонние детерминированные машины Тьюринга, которые вычисляют функции H, G1,…,Gm. Мы строим машину Тьюринга Т, которая вычисляет функцию F из (i).
Пусть H – m-местная и Gj – n-местная функция. Машина Тьюринга Т стартует при вводе данных х1е…ехn и изменяет их на $х1е…ехnZ0. Она копирует х1е…ехn справа от Z0 и моделирует TG. Если TG останавливается (таким образом, если G1 (х1,…,хn) определена), Т копирует содержимое ленты, которое стоит справа от Z0 (причем символы пробела стираются), на место слева от $.
Пусть слева от $ уже стоит G1 (х1,…,хn)е…еGj-1(х1,…,хn). Т опять копирует х1е…ехn справа от Z0 и моделирует TG. Если TG останавливается, то Т изменяет содержимое ленты слева от $ на G1(х1,…,хn)е...е Gj-1(х1,…,хn)еGj(х1,..,хn). Это выполняется для j=1,…,m. Затем $ и содержимое ленты справа от $ стирается, Z0 помещается перед оставшимся содержимым ленты и моделируется TH. Если машина Тьюринга продолжает стоять, то она вычислила H(G1(х1,…,хn),…,Gm(х1,…,хn)).
Предложение 3.12. Каждая -рекурсивная функция частично вычислима по Тьюрингу.
Доказательство. Функции следования, нуль-функции и функции проекции, очевидно, вычислимы по Тьюрингу. Тогда, согласно предложению 3.11, все -рекурсивные функции частично вычислимы по Тьюрингу.
Согласно тезису Тьюринга – Чёрча ясно, что каждая частично вычислимая по Тьюрингу функция -рекурсивна. Мы хотим это показать явно для случая одноместных числовых частично вычислимых по Тьюрингу функций.
Ограничимся машинами Тьюринга с алфавитом ленты {0,1}. При этом 0 означает пустой символ. Предположим, не уменьшая общности, что машины Тьюринга имеют точно одно конечное состояние, обозначим через ,,.., – множество состояний, где – начальное состояние и – конечное состояние. Пусть машина Тьюринга останавливается только в конечном состоянии . (Это означает, что функция перехода вполне определена на ,…,{0, 1}.)
Каждую ситуацию Bm…B0SA0…An можно представить четверкой чисел, а именно (i, S, M, N), где M =Bj2j и N=Aj2j.
В этом представлении прямой переход можно легко смоделировать.
Пусть ,S) (, S1, D), D, причем 1 означает движение вправо и 0 – движение влево. Проекции обозначаются через соответствующие индексы и знак черты над состояниями опускается: 1i,S) = j, 2i,S) = S1, 3i,S) = D.
Для D=1 конфигурация, непосредственно следующая за конфигурацией Bm…B0SA0…An, а именно Bm…B0S1A0…An, представляется четверкой (j,A0,S1+2M,(N-A0)). Пусть P(n) = n mod 2 и H(n)= n div 2. Тогда следующая четверка может быть записана как
(1 i,S), P (N), 2 i,S)+2M, H(N)).
Для D = 0 роли M и N меняются.
Получим, таким образом, для ik S , M, N
(i, S, M, N) ⊢ (3 i, S) = 1(1 i, S), P(N), 2 i, S)+2M, H(N)),
3 i, S) = 0(1 i, S), P(M), H(M),2 i, S)+2N)).
Продолжим до тотальной функции :23 посредством
i, S) = (k+1,0,1) если i = 0 и S 0, либо
1 i k и S 2, либо
i k+1 и S0.
Тем самым функции
R1(i, S, M, N) = 1 i, S),
R2(i, S, M, N) = (3 i, S) = 1 P (N), T P (M)),
R3(i, S, M, N) = (3 i, S) = 1 2 i, S)+2M, TH(M)),
R4(i, S, M, N) = (3 i, S) = 1 H(N), T2 i, S) +2N))
согласно предложению 3.7 – примитивно рекурсивные и моделируют прямой переход машины Тьюринга:
(i,S,M,N)⊢(R1(i,S,M,N), R2(i,S,M,N), R3(i,S,M,N), R4(i,S,M,N)).
Для того чтобы моделировать не только один прямой переход, но и произвольно много прямых переходов, мы введём функции Tj(t, i, S, M, N), 1j4, t0. Причем T1(t, i, S, M, N) указывает состояние, которое получается из конфигурации (i, S, M, N) после t прямых переходов. Подобным же образом T2(t, i, S, M, N) указывает символ, T3(t, i, S, M, N) указывает число M и T4(t, i, S, M, N) указывает число N, которые получаются после t прямых переходов.
Очевидно, справедливо:
T1(0,i,S,M,N)=i, T2(0,i,S,M,N)=S, T3(0,i,S,M,N)=M, T4(0,i,S,M,N)=N,
Tj(t+1,i,S,M,N)=Rj(T1(t,i,S,M,N),T2(t,i,S,M,N),T3(t,i,S,M,N),T4(t,i,S,M,N)), потому что t+1 прямых переходов из конфигурации (i, S, M, N) дают в результате то же самое, что и прямой переход из t-ой конфигурации.
Согласно предложению 3.6, функции Tj, 1j4, являются примитивно рекурсивными.
Теперь пусть начальная конфигурация машины Тьюринга есть , n 0. Этому соответствует четверка (1, SGN(n), 0, H(2n-1)). Тогда функции Tj(t, 1, SGN(n), 0, H(2n-1)), 1 j 4, дают конфигурацию машины Тьюринга после t прямых переходов. Если машина Тьюринга останавливается, то ей требуется в точности T1(t, 1, SGN(n), 0, H(2n-1)) прямых переходов до остановки. Если она не останавливается, то T1(t,1,SGN(n), 0, H(2n-1)) не определена. Не уменьшая общности, допустим, что машина Тьюринга останавливается только в конфигурации вида 01m. Тогда, если
T4 ( T1 (t, 1,SGN(n), 0, H(2n-1)), 1, SGN(n), 0, H(2n-1)) = 2m-1,
m указывает значение функции F, вычисляемой машиной Тьюринга в точке n. Так как T1, T4 и «логарифмическая функция» примитивно рекурсивны, то F – -рекурсивная.
Таким образом, мы без использования тезиса Тьюринга – Чёрча показали следующую эквивалентность.
Предложение 3.13. Семейство -рекурсивных функций совпадает с семейством функций, частично вычислимых поТьюрингу.
Тем самым -рекурсивные функции, машины Тьюринга и, согласно предложению 2.4, грамматики типа 0 и грамматики Ван-Вайнгаардена являются интерпретациями понятия алгоритма. Теперь рассмотрим вопрос разрешимости для машин Тьюринга и для контекстно-свободных языков.
Следующую проблему назовем «проблемой останова» машины Тьюринга. Пусть дана машина Тьюринга Т и слово w над своим входным алфавитом. Пусть указан алгоритм, который завершается для каждой пары Т, w и решает, останавливается или нет Т с входным словом w. «Проблема остановки машины Тьюринга с пустой лентой» является специальным случаем проблемы останова машины Тьюринга, а именно для случая w = . Так же, как и в доказательстве предложения 3.12, мы рассматриваем машины Тьюринга.
T = (… ).
Через такие машины Тьюринга можно представить все одноместные числовые -рекурсивные функции. Очевидно, что множество этих машин Тьюринга эффективно счетное. Таким образом, возможно каждой такой машине Тьюринга сопоставить некоторый индекс.
Предложение 3.14. Пусть S – множество всех индексов машин Тьюринга вида , которые завершают работу при начальной конфигурации . Тогда S неразрешимо.
Доказательство. Через доказательство предложения 3.11 и замечание к предложению 3.12 можно каждой -рекурсивной программе сопоставить машину Тьюринга вида , которая вычисляет ту же самую функцию, что и программа. Если бы S было разрешимым, то R по предложению 3.10 было бы разрешимым по следующему алгоритму. Для выбранного индекса r -рекурсивной программы строится индекс s соответствующей машины Тьюринга. И далее решают, то ли sS, то ли s–S. В первом случае выполняется rR, во втором случае – r–R.
Это рассуждение показывает, что разрешимость S влечет разрешимость R. Тем самым разрешимость S ведёт к противоречию с предложением 3.10.
Предложение 3.15. Проблема остановки машины Тьюринга с пустой лентой и проблема остановки машины Тьюринга неразрешимы.
Предложение 3.15 показывает более глубокую причину, почему функция H из предложения 3.9 невычислима: не существует алгоритма, который может установить, завершается или нет одноместная ‑рекурсивная программа со входом 0. (Таким образом, также не существует алгоритма, который решает, определена или нет конкретная -рекурсивная функция для данного аргумента.)
Далее мы рассматриваем вопросы разрешимости контекстно-свободных грамматик. Эти вопросы разрешимости сводятся к проблеме остановки машины Тьюринга с пустой лентой.
Для каждой односторонней детерминированной машины Тьюринга T = (Q, , q0,F) мы строим две контекстно-свободные грамматики G1,G2 (которые зависят от T), такие, что
L(G1) = $R$ – конфигурации, ⊢* – конечная конфигурация
L(G2) = q0 Z0 $ R$*Q**
Контекстно-свободная грамматика G1 определяется посредством
G1 =(S1, T1, U1, V1, W1, X1 Q $, P1, S1),
причем следующие продукции лежат в P1:
(i) S1T1$S1V1, отсюда S1*T1$…$T1$V1.
(ii) T1zT1z, z,
T1qaU1pb для (q,a) = (p,b,R), T1cqaU1bcp, для (q,a)=(p,b,L),
T1q$pb, для (q,e) = (p,b,R), T1c q $ b c p, для (q,e)=(p,b,L),
U1z U1 z, z,
U1$;
эти правила позволяют производить выводы: T1*$R, где – конфигурации, ⊢.
(iii) V1 qZ0X1, qF, W1 zW1, z,
V1 Z0W1, W1 q X1, q F,
X1 z X1, z,
X1 ;
эти правила позволяют производить выводы V1*, где – конечная конфигурация.
Контекстно-свободная грамматика G2 определяется посредством G2=(S2,T2,U2,V2 Q$, P2, S2), причем следующие продукции лежат в P2:
(i) S2 q0Z0 S2 $T2, следовательно, S2*q0 Z0$T2…$T2.
(ii) T2 zT2z, z,
T2 U2,
U2 qV2q, qQ
V2 zV2z, z,
V2$;
эти правила позволяют производить выводы:T2* 1q2$q, то есть T2* R $ , где – конфигурация.
Предложение 3.16. L(G1)L(G2) тогда и только тогда, когда T останавливается с пустой лентой.
Доказательство. (i) пусть T останавливается с пустой лентой, таким образом: q0Z0⊢1⊢2⊢…⊢n⊢n+1, причем n+1 – конечная конфигурация. Тогда в G1 и G2 найдутся следующие выводы:
S1* q0 Z0 $ $ 1$ $ … $ n $ $ n+1,
S2*q0 Z0 $ $ 1$ … $ $ n $ $ n+1.
Тем самым справедливо: L(G1)L(G2) .
(ii) Пусть L(G1)L(G2) . «Типичные» слова в L(G1) и L(G2) есть
0 $ $ 1$ $ … $ n $ $ n+1,
где i, i – конфигурации, причем i ⊢i+1 и n+1 – конечная конфигурация;
q0 Z0 $ $ 1$ $ 2 … $ $ m $ $ m+1,
где i – конфигурации.
Так как в L(G1)L(G2) лежит хотя бы одно слово, то должно существовать «типичное» слово в L(G1) и «типичное» слово в L(G2), которые совпадают. Отсюда следует n = m, 0 = q 0 Z0, 1= 1, 1= 1, 2 = 2, 2 = 2,…, n= m, n = m, n+1 = m+1, n+1= m+1.Таким образом: 0=q0Z0, 1=1, 2=2,…,n=n, n+1=n+1, i⊢i+1 и n+1 – конечная конфигурация. Поэтому мы получаем q0Z0 ⊢ 1⊢ 2⊢…⊢ n⊢ n+1, причем n+1 – конечная конфигурация и Т останавливается с пустой лентой.
Предложение 3.17. Проблема, является ли пустым пересечение двух контекстно-свободных языков, неразрешима.
Доказательство. Так как для каждой машины Тьюринга Т мы можем эффективно построить грамматики G1 и G2, то разрешимость проблемы L(G1)L(G2) влекла бы разрешимость проблемы остановки для машины Тьюринга с пустой лентой, что противоречит предложению 3.15.
Можно показать, что G1 и G2 – однозначные грамматики. С помощью обычных методов можно построить контекстно-свободную грамматику G для L(G1) L(G2). Тогда G будет однозначной тогда и только тогда, если L(G1)L(G2) = . Тем самым мы получим следующее предложение.
Предложение 3.18. Проблема, является ли контекстно-свободная грамматика однозначной, неразрешима.
Рассмотрим далее язык
L = (L(G1) L(G2)) = (L(G1))((L(G1)), где Q$. Можно показать, что L – контекстно-свободный и существует некоторая эффективно конструируемая из G1 и G2 контекстно-свободная грамматика G1,2, такая, что L(G1,2) = L.
Предложение 3.19. Проблема, порождает ли контекстно-свободная грамматика все слова над своим терминальным алфавитом, неразрешима.
Доказательство. Мы рассмотрим контекстно-свободную грамматику G1,2 и алфавит . Равенство L = справедливо тогда и только тогда, если L(G1)L(G2) = .
Предложение 3.20. Пусть LR – регулярный язык. Проблема, порождает ли контекстно-свободная грамматика G регулярный язык LR, неразрешима.
Доказательство. Мы снова рассмотрим контекстно-свободную грамматику G1,2. Примем за LR регулярный язык .
Можно показать, что справедливо следующее обобщение предложений 3.17 и 3.20:
-
Проблема, является ли пересечение двух контекстно-свободных языков снова контекстно-свободным, неразрешима.
-
Проблема, является ли контекстно-свободный язык регулярным, неразрешима.
Мы теперь покажем, как с помощью грамматики Ван-Вайнгаардена можно построить интерпретатор для числовых примитивно рекурсивных программ.
Предложение 3.21. Для каждой числовой -рекурсивной функции F m существует грамматика Ван-Вайнгаардена, которая порождает язык
{b… b b F(n1,…,nm) определена }.
Доказательство. Для простоты проведем доказательство только для примитивно рекурсивных функций и для m . Пусть w n, c, u, * – m-местная примитивно рекурсивная программа, m , которая представляет функцию F. Мы определяем грамматику Ван-Вайнгаардена через множество метапродукций R и множество схем продукций P.
Следующие метапродукции находятся в R:
(i) P ncuPL PP, Q P L PLP/
Из P выводимы примитивно рекурсивные программы.
(ii) N aN b, A NA M Nm.
Справедливо: N *anb, A * ab… ab, k 0, и M * ab… ab.
(iii) X LA Y AY (L) AY .
Из X и Y выводимы необходимые контексты. Пусть X *x и Y*y и v – n‑местная программа, которая представляет функцию V n . Тогда справедливо:
x v b…by * x b y.
Здесь символ означает, что слово, которое может выводиться из РА (с правильным числом аргументов), должно «оцениваться».
Последующие схемы продукций лежат в Р:
(0) start M w M ,
a A a A , b A b A , b b.
Эти схемы продукций позволяют производить выводы
start * ab… ab w ab… ab
* ab… ab w ab… ab ,
n1,…,nm, m (начало вывода) и
b * b
(конец вывода).
(1) X n N Y X a N Y вычисляется функция следования,
(2) X c Y X b Y вычисляется нулевая функция,
(3) X uNAYXNY вычисляется функция проекции ,
(4) (а) X (P) A Y XPA Y
(b) X (PL) A Y XPA (L) AY проводится замена,
(5) (а) X PQ b A Y XPAY
(b) X PQаAY XQ PQ AAY; проводится рекурсия.
Пример 3.7. Пусть w = sum, то есть w = un(u). Мы хотим вычислить sum (1,3).
start аbаааb un (u) аbаааb
аbаааb un (u) аbаааb (5) (b)
аbаааb n (u) un (u) bаааb bаааb (5)(а)
аbаааb n (u) u аааb bаааb (3)
аbаааb n (u) аааbbаааb (4)(а)
аbаааb n u аааbbаааb (3)
аbаааb n аааb (1)
аbаааb ааааb *
аbаааbааааb.
Конечно, подобное моделирование может быть проведено с помощью грамматик Ван-Вайнгаардена для -рекурсивных функций над алфавитом .
В заключение мы хотим построить грамматику Ван-Вайнгаардена с «библиотекой программ». В дополнение к программам n, c, u задаются следующие базовые программы k, k, ki, ni, ui, sum, prod, exp,…,1 i n, и их определения включаются в грамматику Ван-Вайнгаардена.
R расширяется следующими метапродукциями:
P:: = kk kiniuisumprodexp,…,1 i n,
P расширяется следующими схемами продукции:
X n1NYXnNY, Xni NYXn(ni-1)NY, 2in,
X kY XcY, XkYXni(c)Y, 1i n,
X kNYX[cu]NY, XkNYXni(k)NY , 1i n,
X k0AYXk(u)AY, XkiAYXni(k0)AY, 1i n,
X u1AYXuAY, Xu1 AYX[ui-1u]AY, 2 i n,
X sum A Y X un (u) AY ,
X prod A Y X ksum (u u3) AY ,
X exp A Y X n(k) prod (u u3) AY ,…
Пример 3.8. Мы хотим вычислить prod (1, 3).
start аbаааb prod аbаааb
аbаааb k sum (u u3) аbаааb
аbаааb sum (uu3)k sum (u u3) bаааb bаааb
аbаааb sum (u u3) k аааb bаааb *
аbаааb sum (u u3) bbаааb
аbаааb sum u bbаааb (u3) bbаааb
аbаааb sum b (u3) bbаааb
аbаааb sum b u3 bbаааb *
аbаааb sum bаааb *
аbаааbаааb.