Funciones recursivas primitivas y función Ackerman

La función de Ackerman es una de las características más famosas de la informática. Se asocia con al menos un resultado fundamental y al menos uno simplemente importante. El resultado fundamental, para decirlo de forma clara e incomprensible, es el siguiente: existe una función computable definida en todas partes que no es primitiva recursiva. Un resultado importante es que el bosque de conjuntos disjuntos (también conocido como unión de conjuntos disjuntos) es muy rápido .


Realmente me gusta estudiar la función de Ackerman, como Todo lo relacionado con él es muy hermoso y elegante. Por lo tanto, el resultado fundamental registrado anteriormente es mucho más fácil de entender de lo que parece.


En el siguiente texto aprenderá qué son las funciones recursivas primitivas y cómo descubrir que la función de Akkerman no se aplica a ellas. ¡Y, por supuesto, este texto te convencerá de que es un diseño increíblemente hermoso y un razonamiento increíblemente hermoso!


1. ¿Por qué puede ser interesante?


La discusión de la relación entre las funciones recursivas primitivas y la función de Ackerman es un ejemplo de resolución del problema estándar en la teoría de la computabilidad: se da un cierto modelo computacional, una determinada función, y es necesario determinar si esta función es computable en este modelo.


Otros ejemplos similares están asociados, por ejemplo, con la capacidad de decisión algorítmica , la equivalencia de varios modelos computacionales (máquinas de Turing, funciones parcialmente recursivas, algoritmos normales de Markov, etc.). Y a través de ellos ya estamos conectados con un área de definición completamente práctica para la integridad de Turing de los lenguajes de programación, transformaciones equivalentes de textos de programa y otras cosas interesantes.


La función de Ackerman parece haber sido creada especialmente para ser un ejemplo elegante de resolver tales problemas. Verás esto pronto.


2. Función de Ackerman


, « ». , , , .


a0,a1,...,an,... . :


a0(x)=x+1


ai+1(x)=ai[x+2](x)


f[n](x)=f(f(...(f(x))...))n, n . , : , x+2 xx.


, — , .


:


def Foo(number, argument):
    if number == 0:
        return argument + 1

    result = argument
    for i in range(argument + 2):
        result = Foo(number - 1, result)

    return result

ai(x) Foo(i, x).


. -, : ai(x)>x i x. , , a0(x)=x+1>x, a0 .


-, : ai+1(x)>ai(x) i x. , — , . :


ai+1(x)=ai[x+2](x)ai[2](x)=ai(ai(x))>ai(x)


,


ai+1(x)ai(ai(x))


3. - ()


« ». — . : , , , .


- ? «». - :


  1. , : Null(x1,x2,...,xk)=0
  2. : S(x)=x+1
  3. -: Pik(x1,x2,...,xk)=xi

. « »:


  • . fk , g1,g2,...,gkn , n F: n , k g1,...,gk, f. !

F(x1,...,xn)=f(g1(x1,...,xn),...,gk(x1,...,xn))


  • . fk , gk+2 , , :

F(x1,...,xk,0)=f(x1,...,xk)


F ( x 1 , . . . , X k , y + 1 ) = g ( x 1 , . . . , X k , y , F ( x 1 , . . . , X k , y ) )


, . : , . : , , . , .. , .


, — , , .


.


, . , . , :


S u m ( x , 0 ) = P 1 1 ( x )


Stumetro(X,y+1)=S(PAGS33(X,y,Stumetro(X,y)))


— , . , . Stumetro(X,0 0)=X, , .. X . PAGS11. , : X,y,Stumetro(X,y). , PAGS33, .


:


METROtult(X,0 0)=nortetull(X)


METROtult(X,y+1)=Stumetro(PAGS13(X,y,METROtult(X,y)),PAGS33(X,y,METROtult(X,y)))


- . , ! , :


Fyosi0 0=0 0
Fyosi1=1
Fyosinorte+2=Fyosinorte+Fyosinorte+1


, ; , !


, . , F, . , sol, , :


F(norte)=Fyosinorte
sol(norte)=Fyosinorte+1


F 0, 1, 1, 2, 3, 5; sol, , 1, 1, 2, 3, 5, 8. :
sol(norte+1)=sol(norte)+F(norte)
F(norte+1)=sol(norte)


:


F(0 0)=nortetull()


sol(0 0)=S(nortetull())


F(y+1)=PAGS12(sol(y),F(y))


sol(y+1)=Stumetro(F(y),sol(y))


:


def G(x):
    if x == 0:
        return 1
    return G(x - 1) + F(x - 1)

def F(x):
    if x == 0:
        return 0
    return G(x - 1)

, , , , norte- - !


4. ,


, - « » . : - k F norte, :


F(X1,...,Xk)<unanorte(metrounaX(X1,...,Xk))


— . , , .


, :


nortetull(X1,...,Xk)=0 0<metrounaX(X1,...,Xk)+1=una0 0(metrounaX(X1,...,Xk))


S(X)=X+1=una0 0(X)<una1(X)


PAGSyok(X1,...,Xk)=XyometrounaX(X1,...,Xk)<una0 0(metrounaX(X1,...,Xk))


, , una0 0 (: , , ). — una0 0, una1. - , , , .


. : , , , , .


F F,sol1,...,solk, unaMETRO. , F . :


F(X1,...,Xnorte)=F(sol1(X1,...,Xnorte),...,solk(X1,...,Xnorte))<


<unaMETRO(metrounaX(sol1(X1,...,Xnorte),...,solk(X1,...,Xnorte)))<


<unaMETRO[metrounaX(unaMETRO(metrounaX(X1,...,Xnorte)),...,unaMETRO(metrounaX(X1,...,Xnorte)))]


<unaMETRO(unaMETRO(metrounaX(X1,...,Xnorte)))unaMETRO+1(metrounaX(X1,...,Xnorte))


F, solyo, k , . unaMETRO , unaMETRO+1.


F F sol, unaMETRO.


, , . : F:


F(X1,...,Xk,0 0)=F(X1,...,Xk)<unaMETRO(metrounaX(X1,...,Xk))


, , :


F(X1,...,Xk,1)=sol(X1,...,Xk,0 0,F(X1,...,Xk,0 0))<


<unaMETRO(metrounaX(X1,...,Xk,0 0,unaMETRO(metrounaX(X1,...,Xk)))<


<unaMETRO(unaMETRO(metrounaX(X1,...,Xk))=unaMETRO[2](metrounaX(X1,...,Xk))


F, sol. unaMETRO: ,


unaMETRO(metrounaX(X1,...,Xk))>metrounaX(X1,...,Xk,0 0)


, ,


F(X1,...,Xk,y)<unaMETRO[y+1](metrounaX(X1,...,Xk))


,


unaMETRO[y+1](metrounaX(X1,...,Xk))<unaMETRO+1(metrounaX(X1,...,Xk,y))


:


F(X1,...,Xk,y)<unaMETRO+1(metrounaX(X1,...,Xk,y))


. , , .


5. ,


, , - unaMETRO, . :


UNA(norte)=unanorte(norte)


, , : , — . , .


: UNA -.


, , -. 4 METRO, UNA(X)<unaMETRO(X) X. , :


UNA(METRO+1)=unaMETRO+1(METRO+1)>unaMETRO(METRO+1)


, -. - , ! .


6. ?


, , - , . , . nortenorte. ,


nortenorte...nortenorte


, -. . nortey:


PAGSow(norte,0 0)=S(nortetull())


PAGSow(norte,y+1)=METROtult(PAGS13(norte,y,PAGSow(norte,y)),PAGS33(norte,y,PAGSow(norte,y)))


nortenorte:


SPAGSow(norte)=PAGSow(PAGS11(norte),PAGS11(norte))


, . , nortenortenorte:


SSPAGSow(norte)=PAGSow(PAGS11(norte),SPAGSow(norte))


Por analogía, podemos construir una función en la que norte elevado al poder nortecinco veces, diez veces, cien veces, un millón de veces. La función de Ackerman crece más rápido que cualquiera de estas funciones. ¡Así de rápido crece!

Source: https://habr.com/ru/post/undefined/


All Articles