Czy mógłbyś wskazać, jak zbudować funkcję Ackermana (tak naprawdę interesuje mnie wersja zaproponowana przez Rózsa Pétera i Raphaela Robinsona) za pomocą standardowych operatorów rekursywnych? Próbowałem oryginalnych prac Pétera i Robinsona, ale praca Pétera używa języka innego niż angielski, a prace Robinsona „Recursion and Double Recursion” i „Primitive Recursive Functions” również nie pomagają: pierwszy z nich wydaje się bardziej trafny, ale ma takie zastosowania nazywany operatorem podwójnej rekurencji w celu zdefiniowania funkcji Ackermana, dlatego w tym przypadku poszukuje się wyraźnej definicji operatora w kategoriach mu-rekurencyjnych.
Najbliżej odpowiedzi udzielił P. Smith w „Wprowadzenie do twierdzeń Godela” (CUP, 2007) (29.4 Funkcja Ackermanna-Petera jest μ-rekurencyjna), ale wymyślił: „uczynienie argumentu wodoszczelnym jest ładnym nużący, choć nie trudny. Nie trzeba niczego się uczyć, opisując tutaj szczegóły: więc nie zrobimy tego. ”
Próbowałem też książki Rózsy Péter „Funkcje rekurencyjne” (1967, prasa akademicka). Podano tam wiele wariantów dla operatorów rekurencyjnych. Zwykle jeden redukuje się do drugiego. Uważam, że istnieje pewien rodzaj operatora rekurencji, który pasuje do definicji funkcji Ackermana i sekwencji kroków, które redukują ją do prymitywnych operatorów redurcji i minimalizacji, ale nie byłem w stanie zbadać całej drogi.
źródło
Odpowiedzi:
Złamanie funkcji Ackermanna aż do operatorów elementarnych byłoby naprawdę dość długie, ale oto szkic:
Zauważ, że obliczając rekurencyjnie , w dowolnym punkcie obliczeń masz do czynienia z wyrażeniem postaci A ( m 1 , A ( m 2 , … , A , p ( m k ,A(m,x) A(m1,A(m2,…,A(mk,z)…) p (π1,π2) p(z,p(k,p(mk,…,p(m2,m1)…) p(z,0) k=0
.e(p(z+1,p(k,p(m+1,c))))=p(z,p(k+1,p(m+1,p(m,c))))
Następnie otrzymujesz n-krokową funkcję oceny za pomocą prymitywnej rekurencji:
i E ( n + 1 , m , x ) = e ( E ( n , m , x ) ) .E(0,m,x)=p(x,p(1,m)) E(n+1,m,x)=e(E(n,m,x))
Na koniec owinąć rekurencjęμ E p(z,0) z A(m,x)
źródło
This is a variant of the idea posted by Kaveh, but I am posting anyway since it allows you to sweep many nasty details under the rug without actually doing any handwaving.
The key fact is that the graph of the Ackermann function is primitive recursive. It's not that hard to find a very crude primitive recursive boundB(m,n,w) on the code for the table of Ackermann values needed to verify that A(m,n)=w . Don't try to get sharp bounds — the cruder the easier! Something like B(m,n,w)=2mww should be good enough, but that depends on your choice of coding scheme. Since the verification of the table values can be described by a bounded formula, it is primitive recursive.
Once you have a primitive recursive definition for the graphG(m,n,w) of the Ackermann function, simply define A(m,n)=μwG(m,n,w) .
Sadly, this strategy doesn't work for all functions defined by double (or multiple) recursion. The reason it works for the Ackermann function — as you will see when trying to figure out a goodB(m,n,w) — is that it grows very monotonically. For the general case, you must use Kaveh's idea and have μ look for the appropriate table of values. This is basically the same reason why the Kleene's Normal Form Theorem needs to do a projection after applying the μ operator.
źródło