BuK-Übung09
Weisen Sie nach, dass die AP-Funktion
AP(0, y) = y + 1
AP(x, 0) = AP(x - 1, 1), x > 0
AP(x, y) = AP(x - 1; AP(x, y - 1)), x, y > 0
WHILE-berechenbar ist.
erste Möglichkeit:
Nach den Sätzen, dass jede Turing-berechenbare Funktion auch WHILE-berechenbar und jede WHILE-berechenbare Funktion auch Turing-berechenbar ist, wird mit der Angabe eines Programmes für die Ackermann-Peter-Funktion in einer Turing-Vollständigen Sprache auch die WHILE-Berechenbarkeit der AP-Funktion gezeigt.
zweite Möglichkeit:
In der Hilfestellung auf Folie 22 wird die Ackermann-Funktion mit Hilfe eines Stacks simuliert:
Erklärung von PUSH, POP und Init:
PUSH(x) legt x auf den Stack ab,
POP entfernt oberstes Stackelement und liefert dessen Wert,
INIT initialisiert leeren Stack.
Mit Hilfe dieser Stackoperationen kann die Ackermann-Funktion als WHILE-Programm aufgeschrieben werden:
Jede Stackoperation kann durch ein WHILE-Programm simuliert werden. Dafür wird die Codierungsfunktion c: N^2 \rightarrow N und ihre Umkehrfunktionen e, f verwendet. c, e und f sind primitiv rekursiv, und damit auch LOOP- (und erst recht WHILE-) berechenbar.
Sei (n_1, n_2, ... ,n_k) der Inhahlt eines Stacks, wobei n_1 das oberste Stackelement ist. Mit Hilfe der Funktion c wird eine solche Zahlenfolge durch eine einzige Zahl n wie folgt dargestellt:
n = c(n_1, c(n_2, ... , c(n_k,0)))e liefert erstes Argument von c(x,y) zurück: e(c(x,y)) = x f zweites Argument: f(c(x,y)) = y
Die Stackoperationen werden wie folgt programmiert:
INIT(stack) wird simuliert durch: n:=0
PUSH(a, stack) wird simuliert durch n:= c(a,n)
POP(stack) wird simuliert durch:
r := e(n);
n := f(n);
RETURN r;
Die Größe des Stacks wird durch f(n) berechnet.
c ist durch folgendes Programm berechenbar:
c(x,y) = sum(x + y) + x Beispiel: c(2,1) = 1+2+3+2 = 8
e ist durch folgendes Programm berechenbar:
f ist durch folgendes Programm berechenbar:
Quelle:
http://www.informatik.uni-leipzig.de/~brewka/papers/Berechenbarkeit3-5.pdf