Articulo de referencia

Función recursiva primitiva

En la teoría de la computabilidad , una función recursiva primitiva es, en términos generales, una función que puede ser computada por un programa informático cuyos bucles son t...

En la teoría de la computabilidad , una función recursiva primitiva es, en términos generales, una función que puede ser computada por un programa informático cuyos bucles son todos bucles "for" (es decir, se fija un límite superior para el número de iteraciones de cada bucle antes de entrar en él). Las funciones recursivas primitivas forman un subconjunto estricto de aquellas funciones recursivas generales que también son funciones totales .

La importancia de las funciones recursivas primitivas radica en que la mayoría de las funciones computables estudiadas en teoría de números (y, en general, en matemáticas) son recursivas primitivas. Por ejemplo, la suma y la división , la función factorial y la exponencial , y la función que devuelve el enésimo número primo son todas recursivas primitivas. [ 1 ] De hecho, para demostrar que una función computable es recursiva primitiva, basta con demostrar que su complejidad temporal está acotada superiormente por una función recursiva primitiva del tamaño de la entrada. [ 2 ] Por lo tanto, no es particularmente fácil diseñar una función computable que no sea recursiva primitiva; algunos ejemplos se muestran en la sección § Limitaciones más adelante. 

El conjunto de funciones recursivas primitivas se conoce como PR en la teoría de la complejidad computacional .

Definición

Una función recursiva primitiva toma un número fijo de argumentos, cada uno un número natural (entero no negativo: {0, 1, 2, ...}), y devuelve un número natural. Si toma n argumentos, se denomina n - aria .

Las funciones recursivas primitivas básicas vienen dadas por estos axiomas :

  1. funciones constantesdonortek{\displaystyle C_{n}^{k}}: Para cada número naturalnorte{\displaystyle n}y cadak{\displaystyle k}, la función constante k -aria, definida pordonortek(incógnita1,,incógnitak) =dmiF norte{\displaystyle C_{n}^{k}(x_{1},\ldots ,x_{k})\ {\stackrel {\mathrm {def} }{=}}\ n}, es recursivo primitivo.
  2. Función sucesora : La función sucesora 1-aria S , que devuelve el sucesor de su argumento (ver postulados de Peano ), es decir,S(incógnita) =dmiF incógnita+1{\displaystyle S(x)\ {\stackrel {\mathrm {def} }{=}}\ x+1}, es recursivo primitivo.
  3. Funciones de proyecciónPAGik{\displaystyle P_{i}^{k}}: Para todos los números naturalesi,k{\displaystyle i,k}de tal manera que1ik{\displaystyle 1\leq i\leq k}, la función k -aria definida porPAGik(incógnita1,,incógnitak) =dmiF incógnitai{\displaystyle P_{i}^{k}(x_{1},\ldots ,x_{k})\ {\stackrel {\mathrm {def} }{=}}\ x_{i}}es recursivo primitivo.

Se pueden obtener funciones recursivas primitivas más complejas aplicando las operaciones dadas por estos axiomas:

  1. operador de composición{\displaystyle \circ \,}(también llamado operador de sustitución ): Dada una función m -ariah(incógnita1,,incógnitametro){\displaystyle h(x_{1},\ldots ,x_{m})\,}y m funciones k -ariasgramo1(incógnita1,,incógnitak),,gramometro(incógnita1,,incógnitak){\displaystyle g_{1}(x_{1},\ldots ,x_{k}),\ldots ,g_{m}(x_{1},\ldots ,x_{k})}:h(gramo1,,gramometro) =dmiF F,dóndeF(incógnita1,,incógnitak)=h(gramo1(incógnita1,,incógnitak),,gramometro(incógnita1,,incógnitak)).{\displaystyle h\circ (g_{1},\ldots ,g_{m})\ {\stackrel {\mathrm {def} }{=}}\ f,\quad {\text{donde}}\quad f(x_{1},\ldots ,x_{k})=h(g_{1}(x_{1},\ldots ,x_{k}),\ldots ,g_{m}(x_{1},\ldots ,x_{k})).} Parametro=1{\displaystyle m=1}, la composición de funciones ordinariahgramo1{\displaystyle h\circ g_{1}}se obtiene.
  2. Operador de recursión primitivoρ{\displaystyle \rho }: Dada la función k -ariagramo(incógnita1,,incógnitak){\displaystyle g(x_{1},\ldots ,x_{k})\,}y el(k+2){\displaystyle (k+2)}función -ariah(y,z,incógnita1,,incógnitak){\displaystyle h(y,z,x_{1},\ldots ,x_{k})\,}:
    ρ(gramo,h) =dmiF F,donde el (k+1)función -aria F se define porF(y,incógnita1,,incógnitak)={gramo(incógnita1,,incógnitak)si y=0,h(y,F(y,incógnita1,,incógnitak),incógnita1,,incógnitak)si y=S(y) por un ynorte.{\displaystyle {\begin{aligned}\rho (g,h)&\ {\stackrel {\mathrm {def} }{=}}\ f,\quad {\text{donde la función }}(k+1){\text{-aria }}f{\text{ se define por}}\\f(y,x_{1},\dots ,x_{k})&={\begin{cases}g(x_{1},\dots ,x_{k})&{\text{si }}y=0,\\h(y',f(y',x_{1},\dots ,x_{k}),x_{1},\dots ,x_{k})&{\text{si }}y=S(y'){\text{ para un }}y'\in \mathbb {N} .\end{cases}}\end{aligned}}}

    Interpretación:

    La funciónF{\displaystyle f}actúa como un bucle for desde0{\displaystyle 0}hasta el valor de su primer argumento. El resto de los argumentos paraF{\displaystyle f}, denotado aquí conincógnita1,,incógnitak{\displaystyle x_{1},\ldots ,x_{k}}son un conjunto de condiciones iniciales para el bucle for que puede ser utilizado por él durante los cálculos, pero que son inmutables para él. Las funcionesgramo{\displaystyle g}yh{\displaystyle h}en el lado derecho de las ecuaciones que definenF{\displaystyle f}representa el cuerpo del bucle, que realiza los cálculos. La funcióngramo{\displaystyle g}se utiliza solo una vez para realizar los cálculos iniciales. Los cálculos para los pasos subsiguientes del bucle se realizan medianteh{\displaystyle h}. El primer parámetro deh{\displaystyle h}Se le proporciona el valor "actual" del índice del bucle for. El segundo parámetro deh{\displaystyle h}Se le proporciona el resultado de los cálculos previos del bucle for, de los pasos anteriores. El resto de los parámetros parah{\displaystyle h}son esas condiciones iniciales inmutables para el bucle for mencionado anteriormente. Pueden ser utilizadas porh{\displaystyle h}para realizar cálculos pero ellos mismos no serán alterados porh{\displaystyle h}.

Las funciones recursivas primitivas son las funciones básicas y aquellas que se obtienen a partir de las funciones básicas aplicando estas operaciones un número finito de veces.

Recursividad primitiva de funciones con valores vectoriales

Una función (con valores vectoriales) [ 5 ]F:nortemetronortenorte{\displaystyle f:\mathbb {N} ^{m}\to \mathbb {N} ^{n}}es recursivo primitivo si se puede escribir como

F(incógnita1,,incógnitametro)=(F1(incógnita1,,incógnitametro),,Fnorte(incógnita1,,incógnitametro)){\displaystyle f(x_{1},\dots ,x_{m})=(f_{1}(x_{1},\dots ,x_{m}),\dots ,f_{n}(x_{1},\dots ,x_{m}))}

donde cada componenteFi:nortemetronorte{\displaystyle f_{i}:\mathbb {N} ^{m}\to \mathbb {N} }es una función recursiva primitiva (con valores escalares). [ 6 ]

Ejemplos

  • do01{\displaystyle C_{0}^{1}}es una función 1-aria que devuelve0{\displaystyle 0}para cada entrada:do01(incógnita)=0{\displaystyle C_{0}^{1}(x)=0}.
  • do11{\displaystyle C_{1}^{1}}es una función 1-aria que devuelve1{\displaystyle 1}para cada entrada:do11(incógnita)=1{\displaystyle C_{1}^{1}(x)=1}.
  • do30{\displaystyle C_{3}^{0}}es una función 0-aria, es decir, una constante:do30=3{\displaystyle C_{3}^{0}=3}.
  • PAG11{\displaystyle P_{1}^{1}}es la función identidad en los números naturales:PAG11(incógnita)=incógnita{\displaystyle P_{1}^{1}(x)=x}.
  • PAG12{\displaystyle P_{1}^{2}}yPAG22{\displaystyle P_{2}^{2}}es la proyección izquierda y derecha sobre pares de números naturales, respectivamente:PAG12(incógnita,y)=incógnita{\displaystyle P_{1}^{2}(x,y)=x}yPAG22(incógnita,y)=y{\displaystyle P_{2}^{2}(x,y)=y}.
  • SS{\displaystyle S\circ S}es una función 1-aria que suma 2 a su entrada,(SS)(incógnita)=incógnita+2{\displaystyle (S\circ S)(x)=x+2}.
  • Sdo01{\displaystyle S\circ C_{0}^{1}}es una función 1-aria que devuelve 1 para cada entrada:(Sdo01)(incógnita)=S(do01(incógnita))=S(0)=1{\displaystyle (S\circ C_{0}^{1})(x)=S(C_{0}^{1}(x))=S(0)=1}. Eso es,Sdo01{\displaystyle S\circ C_{0}^{1}}ydo11{\displaystyle C_{1}^{1}}tienen la misma función:Sdo01=do11{\displaystyle S\circ C_{0}^{1}=C_{1}^{1}}. De manera similar, cadadonortek{\displaystyle C_{n}^{k}}puede expresarse como una composición de muchas adecuadamenteS{\displaystyle S}ydo0k{\displaystyle C_{0}^{k}}. Además,do0k{\displaystyle C_{0}^{k}}igualdo01PAG1k{\displaystyle C_{0}^{1}\circ P_{1}^{k}}, desdedo0k(incógnita1,,incógnitak)=0=do01(incógnita1)=do01(PAG1k(incógnita1,,incógnitak))=(do01PAG1k)(incógnita1,,incógnitak){\displaystyle C_{0}^{k}(x_{1},\ldots ,x_{k})=0=C_{0}^{1}(x_{1})=C_{0}^{1}(P_{1}^{k}(x_{1},\ldots ,x_{k}))=(C_{0}^{1}\circ P_{1}^{k})(x_{1},\ldots ,x_{k})}Por estas razones, algunos autores [ 7 ] definendonortek{\displaystyle C_{n}^{k}}solo paranorte=0{\displaystyle n=0}yk=1{\displaystyle k=1}.

Suma

Una definición de la función biariaAgregar{\displaystyle \operatorname {Add} }Para calcular la suma de sus argumentos, se puede obtener utilizando el operador de recursión primitivo.ρ{\displaystyle \rho }. Para ello, se utilizan las conocidas ecuaciones

0+y=y,S(incógnita)+y=S(incógnita+y){\displaystyle {\begin{aligned}0+y&=y,\\S(x)+y&=S(x+y)\end{aligned}}}

están "reformulados en terminología de funciones recursivas primitivas": En la definición deρ(gramo,h){\displaystyle \rho (g,h)}La primera ecuación sugiere elegirgramo=PAG11{\displaystyle g=P_{1}^{1}}para obtenerAgregar(0,y)=gramo(y)=y{\displaystyle \operatorname {Add} (0,y)=g(y)=y}; la segunda ecuación sugiere elegirh=SPAG23{\displaystyle h=S\circ P_{2}^{3}}para obtenerAgregar(S(incógnita),y)=h(incógnita,Agregar(incógnita,y),y)=(SPAG23)(incógnita,Agregar(incógnita,y),y)=S(Agregar(incógnita,y)){\displaystyle \operatorname {Add} (S(x),y)=h(x,\operatorname {Add} (x,y),y)=(S\circ P_{2}^{3})(x,\operatorname {Add} (x,y),y)=S(\operatorname {Add} (x,y))}Por lo tanto, la función de suma se puede definir comoAgregar=ρ(PAG11,SPAG23){\displaystyle \operatorname {Add} =\rho (P_{1}^{1},S\circ P_{2}^{3})}. Como ejemplo de cálculo,

Agregar(1,7)=ρ(PAG11,SPAG23)(S(0),7) por Def. Agregar,S=(SPAG23)(0,Agregar(0,7),7) por caso ρ(gramo,h)(S(...),...)=S(Agregar(0,7)) por Def. ,PAG23=S(ρ(PAG11,SPAG23)(0,7)) por Def. Agregar=S(PAG11(7)) por caso ρ(gramo,h)(0,...)=S(7) por Def. PAG11=8 por Def. S.{\displaystyle {\begin{aligned}\operatorname {Add} (1,7)&=\rho (P_{1}^{1},S\circ P_{2}^{3})(S(0),7)&&{\text{ by Def. }}\operatorname {Add} ,S\\&=(S\circ P_{2}^{3})(0,\operatorname {Add} (0,7),7)&&{\text{ by case }}\rho (g,h)(S(...),...)\\&=S(\operatorname {Add} (0,7))&&{\text{ by Def. }}\circ ,P_{2}^{3}\\&=S(\rho (P_{1}^{1},S\circ P_{2}^{3})(0,7))&&{\text{ by Def. }}\operatorname {Add} \\&=S(P_{1}^{1}(7))&&{\text{ by case }}\rho (g,h)(0,...)\\&=S(7)&&{\text{ by Def. }}P_{1}^{1}\\&=8&&{\text{ by Def. }}S.\\\end{aligned}}}

Duplicación

DadoAgregar{\displaystyle \operatorname {Add} }, la función 1-ariaAgregar(PAG11,PAG11){\displaystyle \operatorname {Add} \circ (P_{1}^{1},P_{1}^{1})}duplica su argumento,(Agregar(PAG11,PAG11))(incógnita)=Agregar(incógnita,incógnita)=incógnita+incógnita.{\displaystyle (\operatorname {Add} \circ (P_{1}^{1},P_{1}^{1}))(x)=\operatorname {Add} (x,x)=x+x.}

Multiplicación

De manera similar a la suma, la multiplicación se puede definir medianteMul=ρ(do01,Agregar(PAG23,PAG33)){\displaystyle \operatorname {Mul} =\rho (C_{0}^{1},\operatorname {Add} \circ (P_{2}^{3},P_{3}^{3}))}Esto reproduce las conocidas ecuaciones de multiplicación:

Mul(0,y)=ρ(do01,Agregar(PAG23,PAG33))(0,y) por Def. Mul=do01(y) por caso ρ(gramo,h)(0,...)=0 por Def. do01.{\displaystyle {\begin{aligned}\operatorname {Mul} (0,y)&=\rho (C_{0}^{1},\operatorname {Add} \circ (P_{2}^{3},P_{3}^{3}))(0,y)&&{\text{ by Def. }}\operatorname {Mul} \\&=C_{0}^{1}(y)&&{\text{ by case }}\rho (g,h)(0,...)\\&=0&&{\text{ by Def. }}C_{0}^{1}.\end{aligned}}}

y

Mul(S(incógnita),y)=ρ(do01,Agregar(PAG23,PAG33))(S(incógnita),y) por Def. Mul=(Agregar(PAG23,PAG33))(incógnita,Mul(incógnita,y),y) por caso ρ(gramo,h)(S(...),...)=Agregar(Mul(incógnita,y),y) por Def. ,PAG23,PAG33=Mul(incógnita,y)+y por propiedad de Agregar.{\displaystyle {\begin{aligned}\operatorname {Mul} (S(x),y)&=\rho (C_{0}^{1},\operatorname {Add} \circ (P_{2}^{3},P_{3}^{3}))(S(x),y)&&{\text{ by Def. }}\operatorname {Mul} \\&=(\operatorname {Add} \circ (P_{2}^{3},P_{3}^{3}))(x,\operatorname {Mul} (x,y),y)&&{\text{ by case }}\rho (g,h)(S(...),...)\\&=\operatorname {Add} (\operatorname {Mul} (x,y),y)&&{\text{ by Def. }}\circ ,P_{2}^{3},P_{3}^{3}\\&=\operatorname {Mul} (x,y)+y&&{\text{ by property of }}\operatorname {Add} .\end{aligned}}}

Predecesor

La función predecesora actúa como el "opuesto" de la función sucesora y se define recursivamente mediante las reglas.Pred(0)=0{\displaystyle \operatorname {Pred} (0)=0}yPred(S(norte))=norte{\displaystyle \operatorname {Pred} (S(n))=n}. Una definición recursiva primitiva esPred=ρ(do00,PAG12){\displaystyle \operatorname {Pred} =\rho (C_{0}^{0},P_{1}^{2})}. Como ejemplo de cálculo,

Pred(8)=ρ(do00,PAG12)(S(7)) por Def. Pred,S=PAG12(7,Pred(7)) por caso ρ(gramo,h)(S(...),...)=7 por Def. PAG12.{\displaystyle {\begin{aligned}\operatorname {Pred} (8)&=\rho (C_{0}^{0},P_{1}^{2})(S(7))&&{\text{ by Def. }}\operatorname {Pred} ,S\\&=P_{1}^{2}(7,\operatorname {Pred} (7))&&{\text{ by case }}\rho (g,h)(S(...),...)\\&=7&&{\text{ by Def. }}P_{1}^{2}.\end{aligned}}}

sustracción truncada

La función de resta limitada (también llamada " monus " y denotada "˙{\displaystyle \mathbin {\dot {-}} }") se puede definir a partir de la función predecesora. Satisface las ecuaciones

y˙0=y,y˙S(incógnita)=Pred(y˙incógnita).{\displaystyle {\begin{aligned}y\mathbin {\dot {-}} 0&=y,\\y\mathbin {\dot {-}} S(x)&=\operatorname {Pred} (y\mathbin {\dot {-}} x).\end{aligned}}}

Dado que la recursión se ejecuta sobre el segundo argumento, comenzamos con una definición recursiva primitiva de la resta inversa,Sub(y,incógnita)=incógnita˙y{\displaystyle \operatorname {RSub} (y,x)=x\mathbin {\dot {-}} y}Su recursión se ejecuta entonces sobre el primer argumento, por lo que su definición recursiva primitiva puede obtenerse, de forma similar a la suma, comoSub=ρ(PAG11,PredPAG23){\displaystyle \operatorname {RSub} =\rho (P_{1}^{1},\operatorname {Pred} \circ P_{2}^{3})}Para eliminar el orden invertido de los argumentos, definaSub=Sub(PAG22,PAG12){\displaystyle \operatorname {Sub} =\operatorname {RSub} \circ (P_{2}^{2},P_{1}^{2})}. Como ejemplo de cálculo,

Sub(8,1)=(Sub(PAG22,PAG12))(8,1) por Def. Sub=Sub(1,8) por Def. ,PAG22,PAG12=ρ(PAG11,PredPAG23)(S(0),8) por Def. Sub,S=(PredPAG23)(0,Sub(0,8),8) por caso ρ(gramo,h)(S(...),...)=Pred(Sub(0,8)) por Def. ,PAG23=Pred(ρ(PAG11,PredPAG23)(0,8)) por Def. Sub=Pred(PAG11(8)) por caso ρ(gramo,h)(0,...)=Pred(8) por Def. PAG11=7 por propiedad de Pred.{\displaystyle {\begin{aligned}\operatorname {Sub} (8,1)&=(\operatorname {RSub} \circ (P_{2}^{2},P_{1}^{2}))(8,1)&&{\text{ by Def. }}\operatorname {Sub} \\&=\operatorname {RSub} (1,8)&&{\text{ by Def. }}\circ ,P_{2}^{2},P_{1}^{2}\\&=\rho (P_{1}^{1},\operatorname {Pred} \circ P_{2}^{3})(S(0),8)&&{\text{ by Def. }}\operatorname {RSub} ,S\\&=(\operatorname {Pred} \circ P_{2}^{3})(0,\operatorname {RSub} (0,8),8)&&{\text{ by case }}\rho (g,h)(S(...),...)\\&=\operatorname {Pred} (\operatorname {RSub} (0,8))&&{\text{ by Def. }}\circ ,P_{2}^{3}\\&=\operatorname {Pred} (\rho (P_{1}^{1},\operatorname {Pred} \circ P_{2}^{3})(0,8))&&{\text{ by Def. }}\operatorname {RSub} \\&=\operatorname {Pred} (P_{1}^{1}(8))&&{\text{ by case }}\rho (g,h)(0,...)\\&=\operatorname {Pred} (8)&&{\text{ by Def. }}P_{1}^{1}\\&=7&&{\text{ by property of }}\operatorname {Pred} .\end{aligned}}}

Conversión de predicados a funciones numéricas

En algunos entornos, es natural considerar funciones recursivas primitivas que toman como entradas tuplas que mezclan números con valores de verdad (es decir,t{\displaystyle t}porque es cierto yF{\displaystyle f}para falso), o que produzcan valores de verdad como salidas. [ 8 ] Esto se puede lograr identificando los valores de verdad con números de cualquier manera fija. Por ejemplo, es común identificar el valor de verdadt{\displaystyle t}con el número1{\displaystyle 1}y el valor de verdadF{\displaystyle f}con el número0{\displaystyle 0}. Una vez realizada esta identificación, la función característica de un conjuntoA{\displaystyle A}, que siempre regresa1{\displaystyle 1}o0{\displaystyle 0}puede considerarse como un predicado que indica si un número está en el conjuntoA{\displaystyle A}En el resto de este artículo, se asumirá dicha identificación de predicados con funciones numéricas.

Predicado "Es cero"

Como ejemplo de un predicado recursivo primitivo, la función 1-ariaEs cero{\displaystyle \operatorname {IsZero} }se definirá de tal manera queEs cero(incógnita)=1{\displaystyle \operatorname {IsZero} (x)=1}siincógnita=0{\displaystyle x=0}, yEs cero(incógnita)=0{\displaystyle \operatorname {IsZero} (x)=0}de lo contrario. Esto se puede lograr definiendoEs cero=ρ(do10,do02){\displaystyle \operatorname {IsZero} =\rho (C_{1}^{0},C_{0}^{2})}. EntoncesEs cero(0)=ρ(do10,do02)(0)=do10()=1{\displaystyle \operatorname {IsZero} (0)=\rho (C_{1}^{0},C_{0}^{2})(0)=C_{1}^{0}()=1}y por ejemploEs cero(8)=ρ(do10,do02)(S(7))=do02(7,Es cero(7))=0{\displaystyle \operatorname {IsZero} (8)=\rho (C_{1}^{0},C_{0}^{2})(S(7))=C_{0}^{2}(7,\operatorname {IsZero} (7))=0}.

Predicado "Menor o igual"

Utilizando la propiedadincógnitayincógnita˙y=0{\displaystyle x\leq y\iff x\mathbin {\dot {-}} y=0}, la función biariaLeq{\displaystyle \operatorname {Leq} }puede definirse porLeq=Es ceroSub{\displaystyle \operatorname {Leq} =\operatorname {IsZero} \circ \operatorname {Sub} }. EntoncesLeq(incógnita,y)=1{\displaystyle \operatorname {Leq} (x,y)=1}siincógnitay{\displaystyle x\leq y}, yLeq(incógnita,y)=0{\displaystyle \operatorname {Leq} (x,y)=0}de lo contrario. Como ejemplo de cálculo,

Leq(8,3)=Es cero(Sub(8,3)) por Def. Leq=Es cero(5) por propiedad de Sub=0 por propiedad de Es cero{\displaystyle {\begin{aligned}\operatorname {Leq} (8,3)&=\operatorname {IsZero} (\operatorname {Sub} (8,3))&&{\text{ by Def. }}\operatorname {Leq} \\&=\operatorname {IsZero} (5)&&{\text{ by property of }}\operatorname {Sub} \\&=0&&{\text{ by property of }}\operatorname {IsZero} \\\end{aligned}}}

Predicado "Mayor o igual"

Una vez una definición deLeq{\displaystyle \operatorname {Leq} }Se obtiene el predicado recíproco, que puede definirse comoGeq=Leq(PAG22,PAG12){\displaystyle \operatorname {Geq} =\operatorname {Leq} \circ (P_{2}^{2},P_{1}^{2})}. Entonces,Geq(incógnita,y)=Leq(y,incógnita){\displaystyle \operatorname {Geq} (x,y)=\operatorname {Leq} (y,x)}es verdadero (más precisamente: tiene valor 1) si y solo siincógnitay{\displaystyle x\geq y}.

Si-entonces-si no

El operador if-then-else de 3 niveles conocido en los lenguajes de programación se puede definir medianteSi=ρ(PAG22,PAG34){\displaystyle \operatorname {If} =\rho (P_{2}^{2},P_{3}^{4})}. Entonces, para arbitrarioincógnita{\displaystyle x},

Si(S(incógnita),y,z)=ρ(PAG22,PAG34)(S(incógnita),y,z) por Def. Si=PAG34(incógnita,Si(incógnita,y,z),y,z) por caso ρ(S(...),...)=y por Def. PAG34{\displaystyle {\begin{aligned}\operatorname {If} (S(x),y,z)&=\rho (P_{2}^{2},P_{3}^{4})(S(x),y,z)&&{\text{ by Def. }}\operatorname {If} \\&=P_{3}^{4}(x,\operatorname {If} (x,y,z),y,z)&&{\text{ by case }}\rho (S(...),...)\\&=y&&{\text{ by Def. }}P_{3}^{4}\end{aligned}}}

y

Si(0,y,z)=ρ(PAG22,PAG34)(0,y,z) por Def. Si=PAG22(y,z) por caso ρ(0,...)=z por Def. PAG22.{\displaystyle {\begin{aligned}\operatorname {If} (0,y,z)&=\rho (P_{2}^{2},P_{3}^{4})(0,y,z)&&{\text{ by Def. }}\operatorname {If} \\&=P_{2}^{2}(y,z)&&{\text{ by case }}\rho (0,...)\\&=z&&{\text{ by Def. }}P_{2}^{2}.\end{aligned}}}

Eso es,Si(incógnita,y,z){\displaystyle \operatorname {If} (x,y,z)}devuelve la parte entonces (y{\displaystyle y}) si la parte if (incógnita{\displaystyle x}) es verdadero, y la otra parte (z{\displaystyle z}) de lo contrario.

Conectores

Basado en elSi{\displaystyle \operatorname {If} }función, es fácil definir conectores lógicos. Por ejemplo, definiendoY=Si(PAG12,PAG22,do02){\displaystyle \operatorname {And} =\operatorname {If} \circ (P_{1}^{2},P_{2}^{2},C_{0}^{2})}, uno obtieneY(incógnita,y)=Si(incógnita,y,0){\displaystyle \operatorname {And} (x,y)=\operatorname {If} (x,y,0)}, eso es,Y(incógnita,y){\displaystyle \operatorname {And} (x,y)}es cierto si y solo si ambosincógnita{\displaystyle x}yy{\displaystyle y}son verdaderos ( conjunción lógica deincógnita{\displaystyle x}yy{\displaystyle y}).

Similarmente,O=Si(PAG12,do12,PAG22){\displaystyle \operatorname {Or} =\operatorname {If} \circ (P_{1}^{2},C_{1}^{2},P_{2}^{2})}yNo=Si(PAG11,do01,do11){\displaystyle \operatorname {Not} =\operatorname {If} \circ (P_{1}^{1},C_{0}^{1},C_{1}^{1})}conducir a definiciones apropiadas de disyunción y negación :O(incógnita,y)=Si(incógnita,1,y){\displaystyle \operatorname {Or} (x,y)=\operatorname {If} (x,1,y)}yNo(incógnita)=Si(incógnita,0,1){\displaystyle \operatorname {Not} (x)=\operatorname {If} (x,0,1)}.

predicado de igualdad

Utilizando las funciones anterioresLeq{\displaystyle \operatorname {Leq} },Geq{\displaystyle \operatorname {Geq} }yY{\displaystyle \operatorname {And} }, la definiciónEq=Y(Leq,Geq){\displaystyle \operatorname {Eq} =\operatorname {And} \circ (\operatorname {Leq} ,\operatorname {Geq} )}implementa el predicado de igualdad. De hecho,Eq(incógnita,y)=Y(Leq(incógnita,y),Geq(incógnita,y)){\displaystyle \operatorname {Eq} (x,y)=\operatorname {And} (\operatorname {Leq} (x,y),\operatorname {Geq} (x,y))}es cierto si y solo siincógnita{\displaystyle x}igualy{\displaystyle y}.

De manera similar, la definiciónTeniente=NoGeq{\displaystyle \operatorname {Lt} =\operatorname {Not} \circ \operatorname {Geq} }implementa el predicado "menor que" yGt=NoLeq{\displaystyle \operatorname {Gt} =\operatorname {Not} \circ \operatorname {Leq} }implementa "mayor que".

Otras operaciones con números naturales

La exponenciación y la prueba de primalidad son recursivas primitivas. Dadas las funciones recursivas primitivasmi{\displaystyle e},F{\displaystyle f},gramo{\displaystyle g}, yh{\displaystyle h}, una función que devuelve el valor degramo{\displaystyle g}cuandomiF{\displaystyle e\leq f}y el valor deh{\displaystyle h}De lo contrario, es recursivo primitivo.

Operaciones con números enteros y racionales

Mediante la numeración de Gödel , las funciones recursivas primitivas pueden extenderse para operar con otros objetos, como números enteros y racionales . Si los números enteros se codifican con números de Gödel de forma estándar, las operaciones aritméticas, incluyendo la suma, la resta y la multiplicación, son recursivas primitivas. Del mismo modo, si los números racionales se representan con números de Gödel, las operaciones de campo también son recursivas primitivas.

Algunas funciones recursivas primitivas comunes

Los siguientes ejemplos y definiciones provienen de Kleene 1974 , pp. 222–231 . Muchos aparecen con demostraciones. La mayoría también aparecen con nombres similares, ya sea como demostraciones o como ejemplos, en Boolos, Burgess y Jeffrey 2002 , pp. 63–70, donde añaden el logaritmo lo(x, y) o lg(x, y) según la derivación exacta.  

En lo que sigue, la marca " ' ", por ejemplo a', es la marca primitiva que significa "el sucesor de", generalmente considerada como " +1", por ejemplo a +1 = def a'. Las funciones 16–20 y #G son de particular interés con respecto a la conversión de predicados recursivos primitivos a, y la extracción de los mismos de, su forma "aritmética" expresada como números de Gödel .

  1. Suma: a+b
  2. Multiplicación: a × b
  3. Exponenciación: a b
  4. Factorial a!  : 0! = 1, a'! = a!×a'
  5. pred(a): (Predecesor o decremento): Si a > 0 entonces a−1, de lo contrario 0
  6. Resta propia a ∸ b: Si a ≥ b, entonces a−b; de lo contrario, 0.
  7. Mínimo(a 1 , ... a n )
  8. Máximo(a 1 , ... a n )
  9. Diferencia absoluta: | a−b | = def (a ∸ b) + (b ∸ a)
  10. ~sg(a): NOT[signum(a)]: Si a=0 entonces 1 sino 0
  11. sg(a): signum(a): Si a=0 entonces 0 sino 1
  12. a | b: (a divide a b): Si b = k × a para algún k, entonces 0; de lo contrario, 1.
  13. Resto(a, b): el sobrante si b no divide a de forma exacta. También llamado MOD(a, b).
  14. a = b: sg | a − b | (La convención de Kleene era representar verdadero con 0 y falso con 1; actualmente, especialmente en informática, la convención más común es la inversa, es decir, representar verdadero con 1 y falso con 0, lo que equivale a cambiar sg por ~sg aquí y en el siguiente elemento).
  15. a < b: sg( a' ∸ b )
  16. Pr(a): a es un número primo Pr(a) = def a>1 & NOT(Existe c) 1<c<a [ c|a ]
  17. p i : el i+1º número primo
  18. (a) i : exponente de p i en a: el único x tal que p i x |a & NOT(p i x' |a)
  19. lh(a): la "longitud" o número de exponentes no nulos en un
  20. lo(a, b): (logaritmo de a en base b): Si a, b > 1, entonces el mayor x tal que b x | a, de lo contrario 0
En lo que sigue, la abreviatura x = def x 1 , ... x n ; se pueden aplicar subíndices si el significado lo requiere.
  • #A: Una función φ definible explícitamente a partir de funciones Ψ y constantes q 1 , ... q n es recursiva primitiva en Ψ.
  • #B: La suma finita Σ y<z ψ( x , y) y el producto Π y<z ψ( x , y) son recursivos primitivos en ψ.
  • #C: Un predicado P obtenido al sustituir las funciones χ 1 ,..., χ m por las variables respectivas de un predicado Q es recursivo primitivo en χ 1 ,..., χ m , Q.
  • #D: Los siguientes predicados son recursivos primitivos en Q y R:
  • NO_Q( x ) .
  • Q O R: Q( x ) VR( x ),
  • Q Y R: Q( x ) & R( x ),
  • Q IMPLICA R: Q( x ) → R( x )
  • Q es equivalente a R: Q( x ) ≡ R( x )
  • #E: Los siguientes predicados son recursivos primitivos en el predicado R:
  • (Ey) y<z R( x , y) donde (Ey) y<z denota "existe al menos un y que es menor que z tal que"
  • (y) y<z R( x , y) donde (y) y<z denota "para todo y menor que z es cierto que"
  • μy y<z R( x , y). El operador μy y<z R( x , y) es una forma acotada del llamado operador de minimización o mu : se define como "el menor valor de y menor que z tal que R( x , y) es verdadero; o z si no existe tal valor".
  • #F: Definición por casos: La función definida así, donde Q 1 , ..., Q m son predicados mutuamente excluyentes (o "ψ( x ) tendrá el valor dado por la primera cláusula que se aplique), es recursiva primitiva en φ 1 , ..., Q 1 , ... Q m :
φ( x ) =
  • φ 1 ( x ) si Q 1 ( x ) es verdadero,
  • . . . . . . . . . . . . . . . . . . .
  • φ m ( x ) si Q m ( x ) es verdadero
  • φ m+1 ( x ) en caso contrario
  • #G: Si φ satisface la ecuación:
φ(y, x ) = χ(y, COURSE-φ(y; x 2 , ... x n ), x 2 , ... x n entonces φ es recursiva primitiva en χ. El valor COURSE-φ(y; x 2 a n ) de la función de curso de valores codifica la secuencia de valores φ(0, x 2 a n ), ..., φ(y-1, x 2 a n ) de la función original.

Relación con las funciones recursivas

La clase más amplia de funciones recursivas parciales se define mediante la introducción de un operador de búsqueda no acotado . El uso de este operador puede dar como resultado una función parcial , es decir, una relación que tiene como máximo un valor para cada argumento, pero que puede no tener ningún valor para algunos argumentos (véase dominio ). Una definición equivalente establece que una función recursiva parcial es aquella que puede ser calculada por una máquina de Turing . Una función recursiva total es una función recursiva parcial definida para cada entrada.

Toda función recursiva primitiva es totalmente recursiva, pero no todas las funciones totalmente recursivas son primitivas. La función de Ackermann A ( m , n ) es un ejemplo bien conocido de una función totalmente recursiva (de hecho, demostrablemente total) que no es primitiva. Existe una caracterización de las funciones recursivas primitivas como un subconjunto de las funciones recursivas totales utilizando la función de Ackermann. Esta caracterización establece que una función es primitiva recursiva si y solo si existe un número natural m tal que la función puede ser calculada por una máquina de Turing que siempre se detiene en A( m , n ) o menos pasos, donde n es la suma de los argumentos de la función recursiva primitiva. [ 9 ]

Una propiedad importante de las funciones recursivas primitivas es que son un subconjunto recursivamente enumerable del conjunto de todas las funciones recursivas totales (que no es recursivamente enumerable en sí mismo). Esto significa que existe una única función recursiva f ( m , n ) que enumera las funciones recursivas primitivas, a saber:

  • Para cada función recursiva primitiva unaria g , existe un m tal que g ( n ) = f ( m , n ) para todo n , y
  • Para cada m , la función h ( n ) = f ( m , n ) es recursiva primitiva.
  • Las funciones recursivas primitivas con dos o más argumentos pueden codificarse como funciones recursivas primitivas unarias utilizando una función de emparejamiento recursivo primitivo con dos inversas recursivas primitivas.

f puede construirse explícitamente repitiendo iterativamente todas las formas posibles de crear funciones recursivas primitivas. Por lo tanto, se demuestra que es total. Se puede usar un argumento de diagonalización para demostrar que f no es recursiva primitiva en sí misma: si lo fuera, también lo sería h ( n ) = f ( n , n )+1. Pero si esto es igual a alguna función recursiva primitiva, existe un m tal que h ( n ) = f ( m , n ) para todo n , y entonces h ( m ) = f ( m , m ), lo que lleva a una contradicción.

Sin embargo, el conjunto de funciones recursivas primitivas no es el subconjunto recursivamente enumerable más grande del conjunto de todas las funciones recursivas totales. Por ejemplo, el conjunto de funciones demostrablemente totales (en la aritmética de Peano) también es recursivamente enumerable, ya que se pueden enumerar todas las demostraciones de la teoría. Si bien todas las funciones recursivas primitivas son demostrablemente totales, lo contrario no es cierto.

Limitaciones

Las funciones recursivas primitivas tienden a corresponderse muy estrechamente con nuestra intuición sobre lo que debe ser una función computable. Ciertamente, las funciones iniciales son intuitivamente computables (en su misma simplicidad), y las dos operaciones mediante las cuales se pueden crear nuevas funciones recursivas primitivas también son muy directas. Sin embargo, el conjunto de funciones recursivas primitivas no incluye todas las posibles funciones computables totales; esto se puede observar con una variante del argumento diagonal de Cantor . Este argumento proporciona una función computable total que no es recursiva primitiva. Un esbozo de la demostración es el siguiente:

Las funciones recursivas primitivas de un argumento (es decir, funciones unarias) pueden ser enumeradas computacionalmente . Esta enumeración utiliza las definiciones de las funciones recursivas primitivas (que son esencialmente expresiones con las operaciones de composición y recursión primitiva como operadores y las funciones recursivas primitivas básicas como átomos), y puede asumirse que contiene cada definición una vez, aunque una misma función aparecerá muchas veces en la lista (ya que muchas definiciones definen la misma función; de hecho, simplemente componer por la función identidad genera infinitas definiciones de cualquier función recursiva primitiva). Esto significa que lanorte{\displaystyle n}La -ésima definición de una función recursiva primitiva en esta enumeración se puede determinar de manera efectiva a partir denorte{\displaystyle n}. De hecho, si se utiliza algún sistema de numeración de Gödel para codificar definiciones como números, entonces estonorte{\displaystyle n}La -ésima definición en la lista se calcula mediante una función recursiva primitiva denorte{\displaystyle n}. DejarFnorte{\displaystyle f_{n}}denotemos la función recursiva primitiva unaria dada por esta definición.

Ahora definamos la "función evaluadora".miv{\displaystyle ev}con dos argumentos, pormiv(i,j)=Fi(j){\displaystyle ev(i,j)=f_{i}(j)}. Claramentemiv{\displaystyle ev}es total y computable, ya que se puede determinar efectivamente la definición deFi{\displaystyle f_{i}}y siendo una función recursiva primitivaFi{\displaystyle f_{i}}es en sí mismo total y computable, por lo tantoFi(j){\displaystyle f_{i}(j)}siempre está definido y efectivamente computable. Sin embargo, un argumento diagonal mostrará que la funciónmiv{\displaystyle ev}de dos argumentos no es recursivo primitivo.

Suponermiv{\displaystyle ev}eran recursivos primitivos, luego la función unariagramo{\displaystyle g}definido porgramo(i)=S(miv(i,i)){\displaystyle g(i)=S(ev(i,i))}también sería recursivo primitivo, ya que se define por composición de la función sucesora ymiv{\displaystyle ev}Pero entonces...gramo{\displaystyle g}aparece en la enumeración, por lo que hay algún númeronorte{\displaystyle n}de tal manera quegramo=Fnorte{\displaystyle g=f_{n}}Pero ahoragramo(norte)=S(miv(norte,norte))=S(Fnorte(norte))=S(gramo(norte)){\displaystyle g(n)=S(ev(n,n))=S(f_{n}(n))=S(g(n))}Esto genera una contradicción.

Este argumento puede aplicarse a cualquier clase de funciones computables (totales) que puedan enumerarse de esta manera, como se explica en el artículo « Máquina que siempre se detiene» . Sin embargo, cabe señalar que las funciones computables parciales (aquellas que no necesitan definirse para todos los argumentos) pueden enumerarse explícitamente, por ejemplo, enumerando las codificaciones de las máquinas de Turing.

Se conocen otros ejemplos de funciones recursivas totales pero no primitivas:

Variantes

funciones constantes

En lugar dedonortek{\displaystyle C_{n}^{k}}Las definiciones alternativas utilizan solo una función cero 0-ariado00{\displaystyle C_{0}^{0}}como una función primitiva que siempre devuelve cero, y construir las funciones constantes a partir de la función cero, la función sucesora y el operador de composición.

Funciones iterativas

Robinson [ 10 ] consideró varias restricciones de la regla de recursión. Una de ellas es la llamada regla de iteración, donde la función h no tiene acceso a los parámetros x i (en este caso, podemos suponer sin pérdida de generalidad que la función g es simplemente la identidad, ya que el caso general se puede obtener por sustitución):

F(0,incógnita)=incógnita,F(S(y),incógnita)=h(y,F(y,incógnita)).{\displaystyle {\begin{aligned}f(0,x)&=x,\\f(S(y),x)&=h(y,f(y,x)).\end{aligned}}}

Demostró que la clase de todas las funciones recursivas primitivas aún puede obtenerse de esta manera.

Recursión pura

Otra restricción considerada por Robinson [ 10 ] es la recursión pura , donde h no tiene acceso a la variable de inducción y :

F(0,incógnita1,,incógnitak)=gramo(incógnita1,,incógnitak),F(S(y),incógnita1,,incógnitak)=h(F(y,incógnita1,,incógnitak),incógnita1,,incógnitak).{\displaystyle {\begin{aligned}f(0,x_{1},\ldots ,x_{k})&=g(x_{1},\ldots ,x_{k}),\\f(S(y),x_{1},\ldots ,x_{k})&=h(f(y,x_{1},\ldots ,x_{k}),x_{1},\ldots ,x_{k}).\end{aligned}}}

Gladstone [ 11 ] demostró que esta regla es suficiente para generar todas las funciones recursivas primitivas. Gladstone [ 12 ] mejoró esto de modo que incluso la combinación de estas dos restricciones, es decir, la regla de iteración pura que se muestra a continuación, es suficiente:

F(0,incógnita)=incógnita,F(S(y),incógnita)=h(F(y,incógnita)).{\displaystyle {\begin{aligned}f(0,x)&=x,\\f(S(y),x)&=h(f(y,x)).\end{aligned}}}

Son posibles mejoras adicionales: Severin [ 13 ] demuestra que incluso la regla de iteración pura sin parámetros , a saber,

F(0)=0,F(S(y))=h(F(y)),{\displaystyle {\begin{aligned}f(0)&=0,\\f(S(y))&=h(f(y)),\end{aligned}}}

Basta con generar todas las funciones recursivas primitivas unarias si extendemos el conjunto de funciones iniciales con la resta truncada x ∸ y . Obtenemos todas las funciones recursivas primitivas si además incluimos + como función inicial.

Formas recursivas primitivas adicionales

Algunas formas adicionales de recursión también definen funciones que, de hecho, son recursivas primitivas. Las definiciones en estas formas pueden ser más fáciles de encontrar o más naturales para leer o escribir. La recursión de curso de valores define funciones recursivas primitivas. Algunas formas de recursión mutua también definen funciones recursivas primitivas.

Las funciones que se pueden programar en el lenguaje de programación LOOP son precisamente las funciones recursivas primitivas. Esto le confiere una caracterización diferente a la potencia de estas funciones. La principal limitación del lenguaje LOOP, en comparación con un lenguaje Turing-completo , es que en LOOP se especifica el número de iteraciones de cada bucle antes de que este comience a ejecutarse.

Definición de lenguaje informático

Un ejemplo de lenguaje de programación recursivo primitivo es aquel que contiene operadores aritméticos básicos (por ejemplo, + y −, o suma y resta), condicionales y comparaciones (SI-ENTONCES, IGUAL, MENOR QUE) y bucles acotados, como el bucle for básico , donde existe un límite superior conocido o calculable para todos los bucles (PARA i DESDE 1 HASTA n, sin que ni i ni n sean modificables por el cuerpo del bucle). En un lenguaje recursivo primitivo no se admiten estructuras de control de mayor generalidad, como bucles while o SI-ENTONCES más GOTO .

El lenguaje LOOP , presentado en un artículo de 1967 por Albert R. Meyer y Dennis M. Ritchie , [ 14 ] es un ejemplo de este tipo de lenguaje. Su capacidad de cálculo coincide con la de las funciones recursivas primitivas. Una variante del lenguaje LOOP es BlooP de Douglas Hofstadter en Gödel, Escher, Bach . La adición de bucles ilimitados (WHILE, GOTO) convierte al lenguaje en recursivo general y Turing-completo , al igual que todos los lenguajes de programación del mundo real.

La definición de funciones recursivas primitivas implica que su cálculo se detiene en cada entrada (tras un número finito de pasos). Por otro lado, el problema de la parada es indecidible para funciones recursivas generales.

El finitismo y la consistencia dan como resultado

Las funciones recursivas primitivas están estrechamente relacionadas con el finitismo matemático y se utilizan en diversos contextos de la lógica matemática donde se requiere un sistema particularmente constructivo. La aritmética recursiva primitiva (ARP), un sistema axiomático formal para los números naturales y sus funciones recursivas primitivas, se utiliza frecuentemente con este fin.

La aritmética de Peano (PRA) es mucho más débil que la aritmética de Peano , que no es un sistema finito. Sin embargo, muchos resultados en teoría de números y en teoría de la demostración pueden probarse en PRA. Por ejemplo, el teorema de incompletitud de Gödel puede formalizarse en PRA, dando como resultado el siguiente teorema:

Si T es una teoría de la aritmética que satisface ciertas hipótesis, con sentencia de Gödel G T , entonces PRA prueba la implicación Con( T )→ G T .

De manera similar, muchos de los resultados sintácticos de la teoría de la demostración se pueden probar en PRA, lo que implica que existen funciones recursivas primitivas que llevan a cabo las transformaciones sintácticas correspondientes de las demostraciones.

En teoría de la demostración y teoría de conjuntos , existe interés en las demostraciones de consistencia finitistas , es decir, demostraciones de consistencia que son, en sí mismas, finitísticamente aceptables. Dicha demostración establece que la consistencia de una teoría T implica la consistencia de una teoría S mediante la producción de una función recursiva primitiva que puede transformar cualquier demostración de una inconsistencia de S en una demostración de una inconsistencia de T. Una condición suficiente para que una demostración de consistencia sea finitista es la capacidad de formalizarla en PRA. Por ejemplo, muchos resultados de consistencia en teoría de conjuntos que se obtienen mediante forzamiento pueden reformularse como demostraciones sintácticas que pueden formalizarse en PRA.

Historia

Las definiciones recursivas se habían utilizado de forma más o menos formal en matemáticas con anterioridad, pero la construcción de la recursión primitiva se remonta al teorema 126 de Richard Dedekind en su obra Was sind und was sollen die Zahlen? (1888). Este trabajo fue el primero en demostrar que una determinada construcción recursiva define una función única. [ 15 ] [ 16 ] [ 17 ]

La aritmética recursiva primitiva fue propuesta por primera vez por Thoralf Skolem [ 18 ] en 1923.

La terminología actual fue acuñada por Rózsa Péter (1934) después de que Ackermann demostrara en 1928 que la función que hoy lleva su nombre no era recursiva primitiva, un hecho que motivó la necesidad de renombrar lo que hasta entonces se denominaban simplemente funciones recursivas. [ 16 ] [ 17 ]

Véase también

Notas

  1. ^ Brainerd y Landweber 1974 .
  2. Hartmanis 1989 .
  3. Fachini y Maggiolo-Schettini 1979 .
  4. Fachini y Maggiolo-Schettini 1982 .
  5. También conocida como "función de secuencia" . [ 3 ] [ 4 ]
  6. PlanetMath .
  7. ^ Por ejemplo: Henk Barendregt (1990), "Programación funcional y cálculo Lambda", en Jan van Leeuwen (ed.), Modelos formales y semántica , Manual de informática teórica, vol.  B, Elsevier, págs. 321 a 364, ISBN  0-444-88074-7Aquí: 2.2.6 funciones iniciales , Def.2.2.7 recursión primitiva , págs. 331-332.
  8. Kleene 1974 , págs. 226–227.
  9. Esto se deduce del hecho de que las funciones de esta forma son las funciones recursivas primitivas de crecimiento más rápido, y que una función es recursiva primitiva si y solo si su complejidad temporal está limitada por una función recursiva primitiva. Para lo anterior, véase Linz, Peter (2011), An Introduction to Formal Languages ​​and Automata , Jones & Bartlett Publishers, p. 332, ISBN  9781449615529Para esto último, véase Moore, Cristopher ; Mertens, Stephan (2011), The Nature of Computation , Oxford University Press, pág. 287, ISBN  9780191620805
  10. 1 2 Robinson 1947 .
  11. Gladstone 1967 .
  12. Gladstone 1971 .
  13. Severin 2008 .
  14. Meyer, Albert R.; Ritchie , Dennis M. (1967), "La complejidad de los programas de bucle", ACM '67: Actas de la 22.ª conferencia nacional de 1967 , págs. 465–469 , doi : 10.1145/800196.806014 
  15. Peter Smith (2013), Introducción a los teoremas de Gödel (2.ª ed.), Cambridge University Press, págs. 98–99 , ISBN   978-1-107-02284-3
  16. 1 2 George Tourlakis (2003), Lecciones de lógica y teoría de conjuntos: Volumen 1, Lógica matemática , Cambridge University Press, pág. 129, ISBN  978-1-139-43942-8
  17. 1 2 Rod Downey, ed. (2014), El legado de Turing: Desarrollos a partir de las ideas de Turing en lógica , Cambridge University Press, pág. 474, ISBN  978-1-107-04348-0
  18. Thoralf Skolem (1923) "Los fundamentos de la aritmética elemental" en Jean van Heijenoort , traductor y editor (1967) De Frege a Gödel: Un libro de referencia en lógica matemática, 1879-1931 . Harvard Univ. Press: 302-33.

Referencias

  • Brainerd, WS; Landweber, LH (1974), Teoría de la computación , Wiley, ISBN 0471095850
  • Fachini, Emanuela; Maggiolo-Schettini, Andrea (1979), "Una jerarquía de funciones de secuencia recursivas primitivas" (PDF) , RAIRO - Informatique Théorique - Theoretical Informatics , 13 (1): 49– 67, doi : 10.1051/ita/1979130100491
  • Fachini, Emanuela; Maggiolo-Schettini, Andrea (1982), "Comparación de jerarquías de funciones de secuencia recursiva primitiva", Zeitschrift für mathematische Logik und Grundlagen der Mathematik , 28 ( 27– 32): 431– 445, doi : 10.1002/malq.19820282705
  • Gladstone, MD (1971), "Simplificaciones del esquema de recursión", The Journal of Symbolic Logic , 36 (4): 653– 665, doi : 10.2307/2272468 , JSTOR 2272468 , MR 0305993  
  • Hartmanis, Juris (1989), "Panorama general de la teoría de la complejidad computacional", Teoría de la complejidad computacional , Actas de simposios en matemáticas aplicadas, vol.  38, Sociedad Matemática Americana, págs. 1–17 , ISBN  978-0-8218-0131-4, MR 1020807 
  • PlanetMath, "función vectorial recursiva primitiva" , consultado el 4 de julio de 2025.
  • Rogers, Hartley Jr. (1987) [1967], Theory of Recursive Functions and Effective Computability (  Edición reimpresa), MIT Press , ISBN 9780262680523
  • Severin, Daniel E. (2008), "Funciones recursivas primitivas unarias", The Journal of Symbolic Logic , 73 (4): 1122– 1138, arXiv : cs/0603063 , doi : 10.2178/jsl/1230396909 , JSTOR 275903221 , MR 2467207  
  • Soare, Robert I. (1987), Conjuntos y grados recursivamente enumerables , Springer-Verlag, ISBN 0-387-15299-7
  • Soare, Robert I. (1996), "Computabilidad y recursión" , The Bulletin of Symbolic Logic , 2 (3): 284– 321, doi : 10.2307/420992 , JSTOR 420992 , MR 1416870  
Obtenido de " https://en.wikipedia.org/w/index.php?title=Primitive_recursive_function&oldid=1331783678 "