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