1 1 Funkcje uniwersalne 1.1 Konstrukcja funkcji uniweralnej Niech P będzie najmniejszym zbiorem liczb spełniającym warunki 1) 0, 2, 0, 0, 2, 1, 0, 2, 2 P, 2) 0, n, 3, k P dla wszystkich n > 0 oraz k takich, że 0 < k n, 3) 0, n, 4, k P dla wszystkich n > 0 oraz k, 4) jeżeli (p) 0 = 1, ((p) 2 ) 1 + 3 = lh(p), (p) 1 = ((p) 3 ) 1 oraz ((p) 3 ) 1 = ((p) i ) 1 i (p) i P dla wszystkich 2 < i < lh(p), a także (p) 2 P, to p P, 5) jeżeli (p) 0 = 2, ((p) 2 ) 1 = (p) 1 + 1 oraz (p) 2 P, to p P. Lemat 1.1 Zbior P jest rekurencyjny. Każdy element p P spełnia nierówności p > (p) 1 > 0. Teraz każdemu elementowi p P przyporządkujemy pewną funkcję częściową ϕ p : N (p) 1 N. Przyjmijmy, że 1) ϕ 0,2,0 (x, y) = x + y, 2) ϕ 0,2,1 (x, y) = x y, 3) ϕ 0,2,2 (x, y) = K < (x, y), 4) ϕ 0,n,3,k = I n,k, 5) ϕ 0,n,4,k ( x) = k dla wszystkich x N n, 6) jeżeli (p) 0 = 1, to ϕ p ( x) = ϕ (p)2 (ϕ (p)3 ( x),..., ϕ (p)lhp 1 ( x)) dla wszystkich x N (p) 1, 7) jeżeli (p) 0 = 2, to ϕ p ( x) = µy(ϕ (p)2 (y, x) = 0) dla wszystkich x N (p) 1. Przypomnijmy sobie, że posługujemy się kodowaniem za pomocą liczb naturalnych skończonych ciągów liczb naturalnych, które ma następujące własności: dla każda liczba p > 0 koduje ciąg o długości lh(p) < p o wyrazach (p) i < p. Te własności kodowania gwarantują poprawność definicji funkcji ϕ p. Zbiór P możemy interpretować jako pewnien język programowania: za pomocą liczb naturalnych zostały opisane definicje pewnych funkcji, funkcja ϕ p to funkcja opisywana za pomocą liczby (programu) p. Lemat 1.2 Zbiór {ϕ p : p P } jest równy klasie wszystkich funkcji rekurencyjnych. Twierdzenie 1.3 Istnieje funkcja rekurencyjna U : N 2 N taka, że 1) dla każdej (częściowej) funkcji rekurencyjnej f : N k N istnieje liczba p N taka, że dla wszystkich x N zachodzi równość (wartości funkcji częściowych) U (p, x) = f((x) 0,..., (x) (p)1 1), 2) dla każdej (częściowej) funkcji rekurencyjnej f : N k N istnieje całkowita funkcja s : N N taka, że dla wszystkich i, x N zachodzi równość f(i, (x) 0,..., (x) k 1 ) = U (s(i), x).
2 Dowód. Będziemy kodować obliczenia wartości funkcji ϕ m używając liczb a N, które są numerami ciągów liczb, które z kolei są numerami trójek p, x i y takich, że ϕ p (x) = y. Zdefiniujemy pomocniczą relację K(a, p, x), która, mówiąc intuicyjnie, stwierdza, że a koduje dostatecznie dużo informacji o obliczeniach, aby mając a można było ustalić wartość ϕ p ((x) 0,..., (x) lh(x) 1 ) i zweryfikować przeprowadzone obliczenia. Relacja K ma następujące własności: Fakt 1.4 Relacja K jest rekurencyjna. Fakt 1.5 Dla każdych p P i x N, jeżeli lh(x) = (p) 1 oraz wartość ϕ p ((x) 0,..., (x) lh(x) 1 ) jest określona, to istnieje a takie, że K(a, p, x). Fakt 1.6 Jeżeli K(a, p, x) oraz ((a) i ) 0 = p i ((a) i ) 1 = x dla jakiegoś i < lh(a), to ((a) i ) 2 = ϕ p ((x) 0,..., (x) lh(x) 1 ). Przyjmijmy, że U (p, x) = (µt(k((t) 0, p, x) (((t) 0 ) (t)1 ) 0 = p (((t) 0 ) (t)1 ) 1 = x (((t) 0 ) (t)1 ) 2 = (t) 2 (t) 1 < lh((t) 0 ))) 2. Zdefiniowana funkcja U jest rekurencyjna. Z przytoczonych faktów wynika, że ma własności podane w pierwszej części tezy twierdzenia. Aby dowieść drugą część tezy, weźmy (dla ustalonego k) funkcję s(i) = 1, k, p, 0, k, 3, 1,..., 0, k, 3, k, gdzie p P jest taki, że U (p, x) = f((x) 0,..., (x) k ). Przyjmijmy, że dla x N symbol x oznacza ciąg (x) 0,..., (x) k 1. Zauważmy, że U (s(i), x) = ϕ s(i) ( x) = ϕ p (ϕ 0,k,4,i ( x), ϕ 0,k,3,1 ( x),..., ϕ 0,k,3,k ( x)) = f(i, (x) 0,..., (x) k 1 ). 1.2 Funkcje uniwesalne Funkcję U : N k+1 U nazywamy uniwesalną dla klasy funkcji rekurencyjnych k zmiennych, jeżeli funkcja U jest rekurencyjna oraz dla dowolnej funkcji rekurencyjnej f : N k N istnieje n N taka, że dla wszystkich x 1,..., x k zachodzi równość f(x 1,..., x k ) = U(n, x 1,..., x k ). Lemat 1.7 Niech U spełnia tezę twierdzenia 1.3. Funkcja U : N k+1 N zdefiniowana wzorem U(n, x 1,..., x k )) = U (n, x 1,..., x k ) jest funkcją uniwersalną dla klasy funkcji rekurencyjnych k zmiennych. Dowód. Oczywiście, U jest rekurencyjna. Niech f : N k N będzie rekurencyjna. Wtedy, dla p z tezy twierdzenia 1.3, mamy U(p, x) = U (p, x 1,..., x k ) = f(( x 1,..., x k ) 0,..., ( x 1,..., x k ) k 1 ) = f(x 1,..., x k ). Dla funkcji uniwersalnej U : N 2 N i n > 1 przyjmijmy, że U n : N n+1 N oraz U n (p, x 1,..., x n ) = U(p, x 1,..., x n ).
3 Lemat 1.8 Jeżeli U jest funkcją uniwersalną dla klasy jednoargumentowych funkcji rekurencyjnych i n > 1, to U n jest funkcją uniwesalną dla klasy n-argumentowych funkcji rekurencyjnych. Dowód. Niech f : N n N będzie funkcją rekurencyjną. Zdefiniujmy funkcję g : N N taką, że g(x) = f((x) 0,..., (x) n 1 ). Weźmy p takie, że U(p, x) = g(x) dla wszystkich x N. Zauważmy, że U n (p, x 1,..., x n ) = U(p, x 1,..., x n ) = g( x 1,..., x n ) = f(x 1,..., x n ). Zwykle będziemy mieć danę funkcję uniwersalną dla klasy jednoargumentowych funkcji rekurencyjnych i w razie potrzeby będziemy ją standardowo rozszerzać w podany sposób do funkcji uniwersalnej dla funkcji k argumentowych. Możemy dodatkowo przyjąć, że U 1 (n, x) = U(n, x). Wadą takiego podejścia jest niejednorodna definicja ciągu U 1, U 2, U 3,..., zaletą wygodne operowanie nimi w sytuacji, gdy najważniejsze są i najczęściej są wykorzystywane funkcje jednoargumentowe. 1.3 Akceptowalne systemy programowania Ciąg funkcji uniwersalnych U 1, U 2, U 3,... spełnia s m n-twierdzenie, jeżeli zachodzi następujące Twierdzenie 1.9 (s-m-n-twierdzenie) Dla dowolnych dodatnich liczb naturalnych n, m istnieje całkowita funkcja rekurencyjna s : N n+1 N taka, że dla wszystkich argumentów zachodzi równość U n+m (p, x 1,..., x n, y 1,..., y m ) = U m (s(p, x 1,..., x n ), y 1,..., y m ). Ciąg funkcji jedej zmiennej ϕ 0, ϕ 1, ϕ 2,... nazywamy nazywamy systemem programowania, jeżeli funkcja U(n, x) = ϕ n (x) jest funkcją uniwersalną dla klasy funkcji rekurencyjnych jednoargumentowych. Ciąg funkcji ϕ 0, ϕ 1, ϕ 2,... jest akceptowalnym systemem programowania, jeżeli jest systemem programowania i ciąg funkcji uniwersalnych U 1, U 2, U 3,... wyznaczony przez w standardowy sposób przez funkcję U (zdefiniowaną jak wyżej) spełnia s m n-twierdzenie. Wadą tej definicji jest uzależnienie jej od ciągu funkcji U 1, U 2, U 3,..., zaletą to, że wyraża istotne własności akceptowalnego systemu programowania. Ładniej akceptowalne systemy można zdefiniować zgodnie z następującą charakteryzacją: Twierdzenie 1.10 System programowania ϕ 0, ϕ 1, ϕ 2,... jest akceptowalny wtedy i tylko wtedy, gdy istnieje całkowita i rekurencyjna funkcja C : 2 N taka, że dla wszystkich n, m, x N. ϕ n (ϕ m (x)) = ϕ c(n,m) (x) Być może istnieją systemy programowania, które nie są akceptowalne. Wszystkie znane mi konstrukcje funkcji uniwersalnych prowadzą do akceptowalnych systemów programowania Twierdzenie 1.11 Jeżeli U spełnia tezę twierdzenia 1.3 i U(p, x) = U (p, x ) jest funkcją uniwersalną (zdefiniowaną zgodnie z lematem 1.7), to ciąg funkcji U 1, U 2, U 3,... spełnia s m n-twierdzenie.
4 Dowód. s m n-twierdzenie dowodzimy przez indukcję ze względu na n, a fragmenty tego dowodu przez indukcję ze względu na m. Teraz pokażę tylko, jak przy założeniu m > 1 dowieść wzór U 1+m (p, x, y 1,..., y m ) = U m (s(p, x), y 1,..., y m ). Niech k : N 2 N oznacza funkcję rekurencyjną, która ma następującą własność: Przyjmijmy, że c(x, y 1,..., y m ) = x, y 1,..., y m. f(i, y) = U ((i) 0, c((i) 1, y). Dla funkcji f korzystamy z twierdzenia 1.3 i znajdujemy całkowitą funkcję s taką, że f(i, (x) 0 ) = U (s(i), x). Zauwazmy, że dla tej funkcji zachodzą następujące wzory: oraz f(i, x) = U (s(i), x ) f(i, y 1,..., y m ) = U (s(i), y 1,..., y m ) = U 1 (s(i), y 1,..., y m ) = U m (s(i), y 1,..., y m ). Z drugiej strony, f( p, x, y 1,..., y m ) = U (p, c(x, y 1,..., y m ) ) = U (p, x, y 1,..., y m ) = Z dowiedzionych równości wynika, że = U 1 (p, x, y 1,..., y m ) = U 1+m (p, x, y 1,..., y m ). U 1+m (p, x, y 1,..., y m ) = U m (s( p, x ), y 1,..., y m ). 1.4 Własności systemów programowania Twierdzenie 1.12 Niech ψ 0, ψ 1,... będzie systemem programowania, a ϕ 0, ϕ 1,... akceptowalnym systemem programowania. Wtedy istnieje całkowita rekurencyjna funkcja t : N N taka, że ψ i = ϕ t(i) dla wszystkich i N. Twierdzenie 1.13 (o rekursji) Dla dowolnego akceptowalnego systemu programowania ϕ 0, ϕ 1,... i dowolnej całkowitej funkcji f : N N istnieje n N taka, że Dowód. Niech Przyjmijmy, że Wtedy ϕ n = ϕ f(n). F (x, y) = ϕ ϕx(x)(y). F (x, y) = ϕ g(x) (y) f(g(x)) = ϕ m (x) oraz n = g(m). ϕ f(n) (y) = ϕ f(g(m)) (y) = ϕ ϕm(m)(y) = F (m, y) = ϕ g(m) (y) = ϕ n (y). Twierdzenie 1.14 (jednostajne twierdzenie o rekursji) Dla dowolnego akceptowalnego systemu programowania ϕ 0, ϕ 1,... istnieje całkowita rekurencyjna funkcja n : N N taka, że ϕ n(x) = ϕ ϕx(n(x)). Twierdzenie 1.15 (Twierdzenie Rogersa o izomorfizmie) Niech ψ 0, ψ 1,... oraz ϕ 0, ϕ 1,... będą akceptowalnymi systemami programowania. Wtedy istnieje rekurencyjna bijekcja t : N N taka, że ψ i = ϕ t(i) dla wszystkich i N.
5 2 Twierdzenie o przyśpieszaniu Twierdzenie 2.1 (Ograniczone twierdzenie o przyśpieszaniu) Dla miary złożoności Φ 0, Φ 1,... takiej, że Φ s(i,x) (y) Φ i (x, y) dla wszystkich x, y N (s to funkcja z s n m twierdzenia) i dowolnej całkowitej, rekurencyjnej funkcji g : N 2 N spełniającej dla wszystkich argunentów nierówności g(x, y) g(x, y + 1) istnieje całkowita i rekurencyjna funkcja f : N N taka, że dla dowolnego (programu) i obliczającego f (a więc spełnijącego ϕ i = f) istnieje (program) j taki, że dla prawie wszystkich x zachodzą równość ϕ j (x) = f(x) oraz nierówność g(x, Φ j (x)) Φ i (x). Dowód. Krok 1. Będziemy definiować całkowitą funkcję rekurencyjną f : N 2 N, a właściwie ciąg funkcji f w określonych wzorami f w (x) = f(w, x) i program n obliczający f (taki, że f(w, x) = ϕ n (w, x)) spełniający równości oraz implikacje f w (x) = f w+1 (x) ϕ w = f g(x, Φ n (w + 1, x)) Φ w (x) dla prawie wszystkich x. Mając taki ciąg funkcji otrzymamy tezę twierdzenie. Wystarczy bowiem przyjąć, że f(x) = f(0, x). Jeżeli wtedy w będzie programem obliczającym f (czyli ϕ w (x) = f(x)), to funkcja f w+1 będzie prawie równa f i naturalny program obliczający f w+1, czyli s(n, w + 1), będzie mieć złożoność spełniającą nierówności g(x, Φ s(n,w+1) (x)) g(x, Φ n (w + 1, x)) Φ w (x) dla prawie wszystkich x. Krok 2. Przypuśćmy, że funkcję f(w, x) udało się nam zdefiniować dla w > 0. Wtedy wartość f(x) = f(0, x) możemy definiować tak, aby funkcja f( ) przyjmowała wartości różne od wartości złych funkcji, czyli takich funkcji ϕ i, które nie spełniają żądanej nierówności. Znając f w dla w > 0 łatwo powiedzieć, jakie funkcje ϕ i są złe. Są to funkcje spełniające nierówności Φ i (x) < g(x, Φ n (i + 1, x)). Tak więc funkcję f, stosując techniki znane z wcześniejszych twierdzeń, możemy definiować wzorem f(x) = f(0, x) = µy( i < x (Φ i (x) < g(x, Φ n (i + 1, x)) y ϕ i (x))). Pokaże teraz, że jest to dobry sposób definiowania funkcji f. Funkcja ta ma następującą włsność: x i < x (Φ i (x) < g(x, Φ n (i + 1, x)) f(x) ϕ i (x)). Niech i 0 będzie programem obliczającym f. Wtedy ϕ i0 (x) = f(x) dla wszystkich x oraz x (i 0 < x (Φ i0 (x) < g(x, Φ n (i 0 + 1, x)) f(x) f(x))).
6 Stąd otrzymujemy, że x (i 0 < x g(x, Φ n (i 0 + 1, x)) Φ i0 (x)), czyli żądaną nierówność. Krok 3. Aby obliczyć funkcję f 0 powinniśmy znać f w dla w > 0, a właściwie powinniśmy umieć wyliczyć złożoności obliczeń tych funkcji. Spróbujmy teraz znaleźć sposób obliczania funkcji f 1. Funkcja f 1 jest prawie równa funkcji f 0, może więc być obliczana w ten sam sposób na podstawie znajomości funkcji f w dla w > 1. Taki sposób myślenia prowadzi do następującej definicji funkcji f: f(w, x) = µy( i < x (w i Φ i (x) < g(x, Φ n (i + 1, x)) y ϕ i (x))). Ta definicja ma charakter indukcyjny, ale nie wygląda na poprawną definicję indukcyjną. Można ją jednak poprawić. Krok 4. Przytoczoną ideę można jednak poprawić. Funkcje f w dla w > 0 nie muszą być równe funkcji f 0, wystarczy, aby były jej prawie równe. To pozwala każdą z tych funkcji określić arbitralnie na zbiorze skończonym, np. definiując f w robimy to na zbiorze tych argumentów x, które nie przekraczają w. Możemy więc przyjąć, że { 0 jeżeli x w, f(w, x) = µy( i < x (w i Φ i (x) < g(x, Φ n (i + 1, x)) y ϕ i (x))) gdy x > w. Zauważmy też, że przy okazji, po wprowadzeniu tej zmiany zastosowany schemat indukcyjny staje się poprawny: dla ustalonego x są określone wszystkie funkcje f w o indeksach w x (mamy 0 = f x (x) = f x+1 (x) = f x+2 (x),...) i możemy indukcyjnie obliczać kolejno wartości f x 1 (x), f x 2 (x), f x 3 (x),..., f 0 (x). Mamy jednak jeszcze jeden kłopot. Krok 5. Można spodziewać się, że dla pewnego k nierówności Φ k (x) < g(x, Φ n (k + 1, x)) zachodzą dla wszystkich x. Wtedy definiując f k (x) musi uwzględnić, że jest to wartość ϕ k (x). Ponieważ zachodzą oczywiste nierówności f w (x) f w+1 (x), ta sytuacja może spowodować, że f 0 (x) f k (x) > f k+1 (x) dla niektórych x. Tych x może być jednak nieskończenie wiele. W takim przypadku, funkcje f 0 i f k+1 różniłyby się dla nieskończenie wielu argumentów. Zauważmy jednak, że jeżeli zachodzi nierówność Φ k (x) < g(x, Φ n (k + 1, x)), to naszą intencją jest spowodowanie, że f(x) ϕ k (x) i zapewnienie prawdziwości tezy twierdzenia przez spowodowanie, że poprzednik występującej w niej implikacji stanie się fałszywy dla i = k. Aby to jednak zrobić, wystarczy spowodować, że f(x) ϕ k (x) dla jednego x. Nie musimy tego gwarantować dla wszystkich x spełniających nierówność Φ k (x) < g(x, Φ n (k +1, x)): wystarczy, że zrobimy to dla pierwszego takiego x. Krok 6. Przedstawiony sposób myślenia prowadzi więc do definicji funkcji f o własnościach i o postaci opisanej w niżej podanym lemacie. Zgodnie z tym lematem, ten sposób definiowania gwarantuje, że zdefiniujemy ciąg f 0, f 1, f 2,... prawie równych funkcji. Lemat 2.2 Przypuśćmy, że C(w, x) oznacza rodzinę zbiorów skończonych takich, że oraz Niech x y C(w, x) C(w, y) = i C(w, x) i C(0, x) i w. f(w, x) = µy ( i (i C(w, x) ϕ i (x) y)). Wtedy dla wszystkich w równość f(w, x) = f(0, x) zachodzi dla prawie wszystkich x.
7 Dowód. Ustalmy w. Zbiory C(0, x) i C(w, x) nie różnią się elementami i w. Jeżeli są różne, to element i, który je różni, należy do C(0, x) \ C(w, x) i jest mniejszy od w. Ponieważ zbiory C(0, x) są parami rozłączne, to elementy i < w należą do skończenie wielu takich zbiorów. Przyjmijmy, że należą do zbiorów C(0, x) dla x < m w. Wobec tego i < w x m w i C(0, x). Stąd, dla x m w zachodzą równości C(0, x) = C(w, x). Nietrudno zauważyć, że równość tych zbiorów implikuje równość f(0, x) = f(w, x). Ta ostatnia równość zachodzi więc dla wszystkich x m w. Krok 7. Możemy już przystąpić do realizacji opisanego planu definiowania f. Funkcja ta ma być definiowana przez indukcję. Tak więc najpierw zdefiniujemy z parametrem n, jako funkcję trzech zmiennych f(n, w, x) (zamiast f(w, x)), a następnie dobierzemy n tak, aby f(n, w, x) = ϕ t(n) (w, x) = ϕ n (w, x) = f(w, x) (a więc, aby n użyty w definicji stał się programem obliczającym f). Istnienie takiego n wyniknie z twierdzenia o rekursji. Początek konstrukcji f. Krok 8. Będziemy kodować skończone zbiory liczb naturalne za pomocą liczb naturalnych. Każda liczba koduje skończony ciąg liczb naturalnych. Umawiamy się, że liczba c będzie też kodować zbiór wyrazów ciągu kodowanego przez c. W szczególności przyjmujemy, że i c t < lh(c) i = (c) t. Niech f 0 (x, a, c) = µy ( i < x (i c y (a) i )). Jest oczywiste, że funkcja f 0 jest rekurencyjna. Łatwo dowodzi się, że jest to funkcja całkowita: warunku podanego w definicji funkcji nie spełnia najwyżej skończenie wiele liczb naturalnych y. Będzie nam jeszcze potrzebna funkcja F : N 3 N taka, że { jeżeli w x, F (n, w, x) = Φ n (w + 1, x), Φ n (w + 2, x),..., Φ n (x, x) w przeciwnym razie. Aby formalnie zdefiniować taką funkcję F zdefiniujmy funkcję pomocniczą { jeżeli w x, F 0 (k, n, w, x) = konkatenacja( Φ n (w + 1, x), ϕ k (n, w + 1, x)) w przeciwnym razie. Jest to częściowa funkcja rekurencyjna. Dalej przyjmujemy, że F (n, w, x) = F 0 (k, n, w, x) dla k takiego, że F 0 (k, n, w, x) = ϕ k (n, w, x). Fakt 2.3 Zdefiniowana wyżej funkcja F : N 3 N jest rekurencyjna i ma następujące własności: 1) jeżeli w x, to F (n, w, x) =, 2) jeżeli w < x, to F (n, w, x) = konkatenacja( Φ n (w + 1, x), F (n, w + 1, x)), 3) jeżeli w < x, to wartość F (n, w, x) jest określona wtedy i tylko wtedy, gdy są określone wartości Φ n (i, x) dla wszystkich i takich, że w < i x.
8 Krok 9. Niech teraz C 0 : N 5 N będzie funkcją taką, że C 0 (n, w, x, c, f) = kod({i < x : w i i c Φ i (x) < g(x, (f) w i )}). Bardziej formalna definicja stwierdza, że C 0 (n, w, x, c, f) jest najmniejszą liczbą kodującą ciąg, którego wyrazami są dokładnie liczby należące do zbioru podanego w powyższej definicji. Fakt 2.4 Funkcja C 0 : N 5 N jest całkowita i rekurencyjna. Ponadto, oraz 1) jeżeli i C 0 (n, w, x, c, f), to wartość ϕ i (x) jest określona, 2) i C 0 (n, w, x, c, f) wtedy i tylko wtedy, gdy i C 0 (n, 0, x, c, f) oraz i w. Dowód tego faktu wymaga skorzystania z własności miary złożości Φ 0, Φ 1,... Krok 10. Przez indukcję definiujemy teraz funkcję C 1 : N 3 N przyjmując C 1 (n, w, 0) = C 1 (n, w, x + 1) = konkatenacja(c 0 (n, w, x, C 1 (n, w, x), F (n, w, x)), C 1 (n, w, x)). Przyjmijmy, że Zauważmy, że C(n, w, x) = C 0 (n, w, x, C 1 (n, w, x), F (n, w, x)). Fakt 2.5 Funkcja C 1 : N 3 N jest rekurencyjna oraz 1) wartość C 1 (n, w, x) jest określona wtedy i tylko wtedy, gdy wartości F (n, w, y) są określone dla wszystkich y < x, 2) jeżeli wartość C 1 (n, w, x) jest określona, to określone są wartości C 1 (n, w, y) dla wszystkich y < x oraz C 1 (n, w, x) = C(n, w, y). Lemat 2.6 Jeżeli wartości C 1 (n, w, x) oraz F (n, w, x) są określone i y < x, to każde i takie, że i C(n, w, x) spełnia warunek i C(n, w, y). Dowód. Z założeń wynika, że liczba C(n, w, x) jest określona. Weźmy i C(n, w, x). Wtedy i C 0 (n, w, x, C 1 (n, w, x), F (n, w, x)). Z definicji C 0 otrzymujemy, że i C 1 (n, w, x). Na mocy poprzedniego lematu, i C(n, w, y). Lemat 2.7 Jeżeli wartości C 1 (n, 0, x) oraz F (n, 0, x) są określone, to 1) wartości C 1 (n, w, y) oraz F (n, w, y) są określone dla wszystkich y x oraz w, 2) dla wszystkich y x oraz wszystkich w warunek i C 1 (n, w, y) jest równoważny warunkowi i w i C 1 (n, w, y). 3) dla wszystkich y x oraz wszystkich w warunek i C(n, w, y) jest równoważny warunkowi i w i C(n, 0, y). y<x
9 Dowód. Część 2 i 3 dowodzimy przez jednoczesną indukcję ze względu na y. Zauważmy, że i C 1 (n, w, 0) i w i C 1 (n, 0, 0). Dalej, jeżeli to także oraz Stąd i C 1 (n, w, y) i w i C 1 (n, 0, y), i C 1 (n, w, y) i < w i C 1 (n, 0, y) i w i C 1 (n, w, y) i w i C 1 (n, 0, y). i C 0 (n, w, y, C 1 (n, w, y), F (n, w, y)) i w i C 0 (n, 0, y, C 1 (n, 0, y), F (n, 0, w)), Ostatecznie otrzymujemy Z własności C 1 otrzymujemy także i C(n, w, y) i w i C(n, 0, y). i C 1 (n, w, y + 1) i w i C 1 (n, 0, y + 1). Lemat 2.8 Jeżeli i C(n, w, x), to wartość ϕ i (x) jest określona. Dowód. Jeżeli i C(n, w, x), to w szczególności zachodzi pewna nierówność postaci Φ i (x) < a. Ta nierówność implikuje, że zarówno Φ i (x), jak i ϕ i (x) są określone. Krok 11. Definiujemy przez rekursję prostą funkcję v 0 : N 3 N: v 0 (0, a, x) = oraz v 0 (j + 1, a, x) = konkatenacja(v 0 (j, a, x), ϕ (a)j (x) oraz v(a, x) = v 0 (lh(a), a, x). Fakt 2.9 Funkcja v jest rekurencyjna. Jeżeli wartości ϕ i (x) są określone dla wszystkich i a, to wartość v(a, x) jest określona i dla takich i zachodzi równość (v(a, x)) i = ϕ i (x). Krok 12. W końcu możemy zdefiniować f(n, w, x) = f 0 (x, v(c(n, w, x), x), C(n, w, x)). Od tego miejsca liczba n będzie miała następującą własność: f(n, w, x) = ϕ n (w, x) = f(w, x). Lemat 2.10 Funkcja f : N 2 N jest rekurencyjna i całkowita.
Dowód. Jeżeli w x, to C 0 (n, w, x, c, f) jest kodem zbioru pustego, więc to samo jest prawdą dla C(n, w, x). Stąd v(c(n, w, x)) jest określone i f(w, x) = 0. Teraz pokażemy, że jeżeli określone są wartości f(w + 1, x) oraz f(w, x 1), to także jest określona wartość f(w, x). f(w, x) jest określona wtedy i tylko wtedy, gdy jest określona C(n, w, x) (jeżeli C(n, w, x) jest określona, to także v(c(n, w, x)) jest określona na mocy lematów. C(n, w, x) jest określona wtedy i tylko wtedy, gdy są określone wartości C 1 (n, w, x) oraz F (n, w, x). Z założeń więc mamy, że są określone wartości C 1 (n, w+1, x), F (n, w+1, x), C 1 (n, w, x 1) oraz F (n, w, x 1). Teza zostanie zaś wykazana, jeżeli dowiedziemy, że są określone wartości C 1 (n, w, x) oraz F (n, w, x). Z definicji C 1, funkcja ta jest określona dla argumentów n, w, x jeżeli są określone C 1 (n, w, x 1) oraz F (n, w, x 1). Tak więc C 1 (n, w, x) jest określona. Z definicji F, aby była określana wartość F (n, w, x) muszą być określone wartości Φ n (w + 1, x) oraz F (n, w + 1, x). Druga z tych wartości jest określona na mocy założenia, a pierwsza ponieważ jest określona wartość f(w + 1, x) = ϕ n (w + 1, x). 10