Ejemplo: Función de Ackerman
F(i,x) = (i=0) ? x+1 : ((x=0) ? F(i-1,1) :
F(i-1,F(i,x-1)))
Ejemplos:
F(0,x) = x+1
F(1,1) = F(0,F(1,0)) = F(0,F(0,0)) = F(0,1) = 2
F(1,2) = F(0,F(1,1)) = F(0,2) = 3
F(1,x) = F(0,F(1,x-1)) = … = F(0,x) = x+1
F(2,1) = F(1,F(2,0)) = F(1,F(1,1)) = F(1,2) = 3
F(2,x) = F(1,F(2,x-1)) = … = F(1,2x-1) = 2x+1
…
Definiciones recursivas primitivas
Ejemplo con un argumento:
F(x+1) = 2*F(x) F(x+1) = g(F(x))
F(0) = 1 F(0) = h
Definición general:
F(x1+1, x2, …, xn) = g(F(x1, x2, …, xn), x1, x2, …, xn)
F(0, x2, …, xn) = h(x2, …, xn)
Ejemplos: La definición de Ackerman no lo es
F(x+1,y) = F(x, y)+2
F(0,y) = y+2
Funciones recursivas primitivas: Funciones básicas
Las funciones recursivas básicas numéricas son:
Sucesor: s(x) = x+1
Anulación: n(x) = (x=0) ? 1 : 0
Proyecciones: uin(x1, …, xn) = xi
Funciones recursivas primitivas
Se pueden definir a partir de las básicas mediante recursión primitiva y composición
Ejemplos:
F(x) = s(s(x))
G(x+1, y) = F(G(x, y))
G(0,y) = F(y)
Composición
En general, si f(x1,…,xn), g1(y1,…,ym),…, gn(y1,…,ym) son funciones, diremos que la función
h(y1,…,ym) = f(g1(y1,…,ym),…,gn(y1,…,ym))
se obtiene a partir de ellas mediante composición.
En realidad corresponde a la composición de G con f, donde G es la función vectorial con coordenadas g1, …, gn.
Totalidad y computabilidad de las funciones recursivas primitivas
Si f es RP, es total
La función prev: N – { 0 } ? N definida mediante
prev(x+1) = x
no es total (y tampoco RP)
Las funciones RP son computables, pues tanto f(x)=y como f(x)?y se pueden determinar algorítmicamente en tiempo finito.
EJERCICIOS: Demostrar que las siguientes funciones son RP
[RPN1] fk(x) = k
[RPN2] suma(x, y)
[RPN3] restap(x, y) // Da 0 si y > x
[RPN4] producto(x, y)
[RPN5] restaabs(x, y) // |x-y|
[RPN6] positivo(x) // x > 0 ? 1 : 0
[RPN7] max(x, y)
[RPN8] min(x, y)
[RPN9] factorial(x)
[RPN10] potencia(x, y) // xy
[RPN11] par(x) // x = 2*(x/2) ? 1 : 0
EJERCICIOS: Demostrar que las siguientes funciones son RP
[RPN12] cocientedefecto(x, 2)
[RPN13] cocientedefectop(x, y) // (x, 0) ? 0
[RPN14] iguales(x, y)
[RPN15] menoroigual(x, y)
[RPN16] menor(x, y)
[RPN17] divisor(x, y)
[RPN18] primo(x)
[RPN19] restodivision(x, y)
[RPN20] primomayor(x) // Primero mayor
[RPN21] mcd(x, y)
[RPN22] mcm(x, y)
Funciones recursivas primitivas sobre cadenas de caracteres
Las funciones recursivas básicas sobre cadenas de caracteres son:
Anteposición: s?(x). Ejemplo: sa(“abc”)=“aabc”
Vacuidad: v?(x) = (x=?) ? ? : ?
Proyecciones uin(x1, …, xn) = xi
Ejemplos:
f??(x) = s?(s?(x))
g(?,y) = fab(y)
g(sa(x),y) = fab(g(x,y))
g(sb(x),y) = fba(g(x,y))
Funciones recursivas primitivas sobre cadenas de caracteres
Una recursión primitiva sobre cadenas está formada por |?|+1 reglas:
f(s?(w1),x2,…,wn) = g?(f(w1,w2,…,wn),w1,w2,…, wn)
f(0, w2, …, wn) = h(w2, …, wn)
donde cada g? y h son funciones recursivas primitivas.
Las funciones recursivas primitivas sobre cadenas también son totales y computables
Funciones recursivas primitivas sobre cadenas de caracteres
La función resto: ?+ ? ?* que elimina el primer carácter no es total ni, por lo tanto, recursiva primitiva
EJERCICIOS: Demostrar que las siguientes funciones son RP
[RPC1] fv(w) = v
[RPC2] start(v) // start(“ab”)=“a”, start(0) = 0
[RPC3] fin(v) // end(“ab”)=“b”, end(0)=0
[RPC4] cuenta?(v) // cuentaa(“abbaba”)=“aaa”
[RPC5] concatena(v, w)
[RPC6] invierte(v)
[RPC7] esPalíndrome(v)
[RPC8] esVacía(v)
EJERCICIOS: Demostrar que las siguientes funciones son RP
[RPC9] iguales(v, w)
[RPC10] contiene(v, w)
// contiene(“abcba”, “bcb”) = “a”
// contiene(“abcba”, “bab”) = 0
[RPC11] sustituye(u, v, w)
[RPC12] longitud(v)
// longitud(“abc”) = “aaa”
Funciones recursivas primitivas: Suma recursiva
Suponemos que f(n) es recursiva primitiva
g(m) = f(0) + f(1) + … + f(m)
g(0) = 0
g(m+1) = suma(g(m), f(s(m)) = h(g(m),m)
donde
h(x,y) = suma(x,f(s(y))
es primitiva recursiva, luego g también lo es.
Ejercicios
Suponemos que f(m) es recursiva primitiva. Demostrar que las siguientes funciones también lo son: [RPA1], [RPA2], [RPA3], [RPA4]
g(m,x) = min(f(0), f(1), …, f(m))
g(m,x) = f(f(…f(f(x))…)) // m concatenaciones de f
g(x) = 1 si ?m?x, f(m)=0, y g(x) = 0 en caso contrario
g(x) = 1 si ?m?x, f(m)=0, y g(x) = 0 en caso contrario
Totalidad y computabilidad de la función de Ackerman
F(i,x) = (i=0) ? x+1 : ((x=0) ? F(i-1,1) :
F(i-1,F(i,x-1)))
Es total
Es computable
Sin embargo, no es recursiva primitiva:
Fj(x) = F(j, x) = Fj-1(Fj-1(…(Fj-1(0)…))
Fx(x) crece más rápido que cualquier función de la sucesión f0(x)=x+1, fj+1(x)=fj(fj(…(fj(0)…))
Las funciones R.P. crecen como alguna de las funciones anteriores
Página siguiente |