1 Funkcje uniwersalne
Transkrypt
1 Funkcje uniwersalne
1 1 Funkcje uniwersalne 1.1 Konstrukcja funkcji uniweralnej Niech P będzie najmniejszym zbiorem liczb spełniającym warunki 1) h0, 2, 0i, h0, 2, 1i, h0, 2, 2i ∈ P , 2) h0, n, 3, ki ∈ P dla wszystkich n > 0 oraz k takich, że 0 < k ¬ n, 3) h0, n, 4, ki ∈ 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) ϕh0,2,0i (x, y) = x + y, 2) ϕh0,2,1i (x, y) = x · y, 3) ϕh0,2,2i (x, y) = K< (x, y), 4) ϕh0,n,3,ki = In,k , 5) ϕh0,n,4,ki (~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) = h1, k, p, h0, k, 3, 1i, . . . , h0, k, 3, kii, 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 (ϕh0,k,4,ii (~x), ϕh0,k,3,1i (~x), . . . , ϕh0,k,3,ki (~x)) = f (i, (x)0 , . . . , (x)k−1 ). 2 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 x1 , . . . , xk zachodzi równość f (x1 , . . . , xk ) = U (n, x1 , . . . , xk ). Lemat 1.7 Niech U ∗ spełnia tezę twierdzenia 1.3. Funkcja U : N k+1 → N zdefiniowana wzorem U (n, x1 , . . . , xk )) = U ∗ (n, hx1 , . . . , xk i) 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, hx1 , . . . , xk i) = f ((hx1 , . . . , xk i)0 , . . . , (hx1 , . . . , xk i)k−1 ) = f (x1 , . . . , xk ). 2 Dla funkcji uniwersalnej U : N 2 → N i n > 1 przyjmijmy, że U n : N n+1 → N oraz U n (p, x1 , . . . , xn ) = U (p, hx1 , . . . , xn i). 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, x1 , . . . , xn ) = U (p, hx1 , . . . , xn i) = g(hx1 , . . . , xn i) = f (x1 , . . . , xn ). 2 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, x1 , . . . , xn , y1 , . . . , ym ) = U m (s(p, x1 , . . . , xn ), y1 , . . . , ym ). 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 ϕn (ϕm (x)) = ϕc(n,m) (x) dla wszystkich n, m, x ∈ N . 2 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, hxi) 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, y1 , . . . , ym ) = U m (s(p, x), y1 , . . . , ym ). Niech k : N 2 → N oznacza funkcję rekurencyjną, która ma następującą własność: c(x, hy1 , . . . , ym i) = hx, y1 , . . . , ym i. Przyjmijmy, że f (i, y) = U ∗ ((i)0 , hc((i)1 , y)i. 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: f (i, x) = U ∗ (s(i), hxi) oraz f (i, hy1 , . . . , ym i) = U ∗ (s(i), hhy1 , . . . , ym ii) = U 1 (s(i), hy1 , . . . , ym i) = U m (s(i), y1 , . . . , ym ). Z drugiej strony, f (hp, xi, hy1, . . . , ym i) = U ∗ (p, hc(x, hy1 , . . . , ym i)i) = U ∗ (p, hhx, y1 , . . . , ym ii) = = U 1 (p, hx, y1 , . . . , ym i) = U 1+m (p, x, y1 , . . . , ym ). Z dowiedzionych równości wynika, że U 1+m (p, x, y1 , . . . , ym ) = U m (s(hp, xi), y1 , . . . , ym ). 2 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 ϕn = ϕf (n) . Dowód. Niech F (x, y) = ϕϕx (x) (y). Przyjmijmy, że F (x, y) = ϕg(x) (y) f (g(x)) = ϕm (x) oraz n = g(m). Wtedy ϕf (n) (y) = ϕf (g(m)) (y) = ϕϕm (m) (y) = F (m, y) = ϕg(m) (y) = ϕn (y). 2 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 fw określonych wzorami fw (x) = f (w, x) i program n obliczający f (taki, że f (w, x) = ϕn (w, x)) spełniający równości fw (x) = fw+1 (x) oraz implikacje ϕ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 fw+1 będzie prawie równa f i naturalny program obliczający fw+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 fw 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 6= ϕ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) 6= ϕi (x)). Niech i0 będzie programem obliczającym f . Wtedy ϕi0 (x) = f (x) dla wszystkich x oraz ∀x (i0 < x ⇒ (Φi0 (x) < g(x, Φn (i0 + 1, x)) ⇒ f (x) 6= f (x))). 6 Stąd otrzymujemy, że ∀x (i0 < x ⇒ g(x, Φn (i0 + 1, x)) ¬ Φi0 (x)), czyli żądaną nierówność. Krok 3. Aby obliczyć funkcję f0 powinniśmy znać fw 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 f1 . Funkcja f1 jest prawie równa funkcji f0 , może więc być obliczana w ten sam sposób na podstawie znajomości funkcji fw 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 6= ϕ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 fw dla w > 0 nie muszą być równe funkcji f0 , 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 fw robimy to na zbiorze tych argumentów x, które nie przekraczają w. Możemy więc przyjąć, że f (w, x) = ( 0 jeżeli x ¬ w, µy(∀i < x (w ¬ i ∧ Φi (x) < g(x, Φn (i + 1, x)) ⇒ y 6= ϕ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 fw o indeksach w x (mamy 0 = fx (x) = fx+1 (x) = fx+2 (x), . . .) i możemy indukcyjnie obliczać kolejno wartości fx−1 (x), fx−2 (x), fx−3 (x), . . . , f0 (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 fk (x) musi uwzględnić, że jest to wartość 6= ϕk (x). Ponieważ zachodzą oczywiste nierówności fw (x) fw+1 (x), ta sytuacja może spowodować, że f0 (x) fk (x) > fk+1 (x) dla niektórych x. Tych x może być jednak nieskończenie wiele. W takim przypadku, funkcje f0 i fk+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) 6= ϕ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) 6= ϕ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 f0 , f1 , f2 , . . . prawie równych funkcji. Lemat 2.2 Przypuśćmy, że C(w, x) oznacza rodzinę zbiorów skończonych takich, że x 6= y ⇒ C(w, x) ∩ C(w, y) = ∅ oraz i ∈ C(w, x) ⇔ i ∈ C(0, x) ∧ i w. Niech f (w, x) = µy (∀i (i ∈ C(w, x) ⇒ ϕi (x) 6= 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 < mw . Wobec tego i < w ∧ x mw ⇒ i 6∈ C(0, x). Stąd, dla x mw 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 mw . 2 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 6= (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 F (n, w, x) = ( hi jeżeli w x, hΦn (w + 1, x), Φn (w + 2, x), . . . , Φn (x, x)i w przeciwnym razie. Aby formalnie zdefiniować taką funkcję F zdefiniujmy funkcję pomocniczą F 0 (k, n, w, x) = ( hi jeżeli w x, konkatenacja(hΦn (w + 1, x)i, ϕ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) = hi, 2) jeżeli w < x, to F (n, w, x) = konkatenacja(hΦn (w + 1, x)i, 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 6∈ 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, 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) = hi oraz 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 C(n, w, x) = C 0 (n, w, x, C 1 (n, w, x), F (n, w, x)). Zauważmy, że 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). y<x 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 6∈ C 1 (n, w, x). Na mocy poprzedniego lematu, i 6∈ C(n, w, y). 2 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). 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 i ∈ C 1 (n, w, y) ⇔ i w ∧ i ∈ C 1 (n, 0, y), to także i 6∈ C 1 (n, w, y) ⇔ i < w ∨ i 6∈ C 1 (n, 0, y) oraz i w ∧ i 6∈ C 1 (n, w, y) ⇔ i w ∧ i 6∈ C 1 (n, 0, y). Stąd 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 i ∈ C(n, w, y) ⇔ i w ∧ i ∈ C(n, 0, y). Z własności C 1 otrzymujemy także i ∈ C 1 (n, w, y + 1) ⇔ i w ∧ i ∈ C 1 (n, 0, y + 1). 2 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. 2 Krok 11. Definiujemy przez rekursję prostą funkcję v 0 : N 3 → N : v 0 (0, a, x) = hi oraz v 0 (j + 1, a, x) = konkatenacja(v 0 (j, a, x), hϕ(a)j (x)i 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. 10 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). 2