Você está na página 1de 34

Funciones recursivas

Roberto Moriyn

Ejemplo: Funcin 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
Definicin general:
F(x1+1, x2, , xn)
= g(F(x1, x2, , xn), x1, x2, , xn)
F(0, x2, , xn) = h(x2, , xn)

Ejemplos: La definicin de Ackerman no lo es


F(x+1,y) = F(x, y)+2
F(0,y) = y+2

Funciones recursivas primitivas:


Funciones bsicas
Las funciones recursivas bsicas numricas
son:
Sucesor:
Anulacin:
Proyecciones:

s(x) = x+1
n(x) = (x=0) ? 1 : 0
uin(x1, , xn) = xi

Funciones recursivas primitivas


Se pueden definir a partir de las bsicas
mediante recursin primitiva y
composicin
Ejemplos:
F(x) = s(s(x))
G(x+1, y) = F(G(x, y))
G(0,y)

= F(y)

Composicin
En general, si f(x1,,xn), g1(y1,,ym),,
gn(y1,,ym) son funciones, diremos que la
funcin
h(y1,,ym) = f(g1(y1,,ym),,gn(y1,,ym))
se obtiene a partir de ellas mediante
composicin.
En realidad corresponde a la composicin
de G con f, donde G es la funcin vectorial
con coordenadas g1, , gn.

Totalidad y computabilidad de las


funciones recursivas primitivas
Si f es RP, es total
La funcin 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
algortmicamente 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)
[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)
[RPN21] mcd(x, y)
[RPN22] mcm(x, y)

// (x, 0) 0

// Primero mayor

Funciones recursivas primitivas


sobre cadenas de caracteres
Las funciones recursivas bsicas sobre cadenas
de caracteres son:
Anteposicin: 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, II
Una recursin 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 tambin son totales y computables

Funciones recursivas primitivas


sobre cadenas de caracteres, III
La funcin resto: + * que elimina el
primer carcter 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] esPalndrome(v)
[RPC8] esVaca(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 tambin lo es.

Ejercicios
Suponemos que f(m) es recursiva primitiva.
Demostrar que las siguientes funciones
tambin 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 mx, f(m)=0, y g(x) = 0 en caso
contrario
g(x) = 1 si mx, f(m)=0, y g(x) = 0 en caso
contrario

Totalidad y computabilidad de la
funcin 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 ms rpido que cualquier funcin de la
sucesin f0(x)=x+1, fj+1(x)=fj(fj((fj(0)))
Las funciones R.P. crecen como alguna de las
funciones anteriores

Formas de definicin de las


funciones recursivas
Definicin usual: Aplicar la definicin
repetidamente, utilizando una pila de
clculos parciales, hasta que se llegue al
resultado
Ejemplo: Para la funcin de Ackerman,
F(1,1) = F(0,F(1,0)) = F(0,F(0,0)) = F(0,1)
=2

Formas de definicin de las


funciones recursivas, II
Forma rigurosa (aunque terica):
Definir F sobre un primer dominio, D 0,
donde se puede calcular directamente
Ejemplo: Para la funcin de Ackerman,
D0={(i,x)|i=0}, en cuyo caso f0(i,x)=x+1

Definir F sobre un dominio Dj+1 si su


clculo se puede reducir al de F sobre D j
Ejemplo: D1=D0{(i,x) | x=0}; f1(i,x) =
D2=D1{(1,1)}; f2(i,x) = , etc

Formas de definicin de las


funciones recursivas, III
Interpretacin de la forma anterior: punto
fijo de un operador
P(f)(x) = (i=0) ? x+1 : ((x=0) ? f(i-1,1) :
f(i-1,f(i,x-1)))
P(f0) = f1
P(f1) = f2

F es un punto fijo de P: P(F) = F

EJERCICIOS
[REC 1] Calcular el dominio y los valores de
las imgenes de las funciones f y g definidas
mediante
f(x,y) = 2.f(y, 2.x)
g(x) = (x < 5) ? f(x, x) : ((x = 5) ? 1 : x*g(x-1))

[REC 2] Calcular el dominio y los valores de


las imgenes de la funcin h definida
mediante
h(x, y) = (x = 0) ? 1 : h(x 1, h(|x y|, y))

Funciones recursivas:
Minimizacin
Si f(x,y) es una funcin recursiva, entonces
g(x) = min { y | f(x,y) 0 }
define otra funcin recursiva
Demostracin: Definimos
gaux(x, z) = min { y | f(x, z+y) 0 }
entonces
gaux(x, z) = (f(x, z) 0) ? 0 : 1 + gaux(x, z+1)
g(x) = gaux(x,0)

EJERCICIOS
Suponiendo que la funcin f(x,y) sea
recursiva, demostrar que tambin lo es la
funcin g(x) cuyo valor es la suma f(x,0) +
f(x,1) + + f(x,n) donde n se elije de
manera que los sumandos sean
diferentes de 0 y f(x,n+1)=0.

Ejemplo de funciones recursivas:


Mquinas de Turing
Dada una mquina de Turing determinista
M, la funcin transita(x, y), donde x e y son
estados instantneos de ejecucin de M,
que vale a si la mquina M lleva la cinta
del estado x al y y en caso contrario, es
recursiva (pero no recursiva primitiva)

Ejemplo de funciones recursivas:


Mquinas de Turing, II
Demostracin:
transita(x, y) = esEstado(x) & esEstado(y) &
& ((x=y) ? a : transita(aplicaRegla(x), y))

La funcin aplicaRegla(x) devuelve el resultado de


aplicar una regla de transicin de M a partir del
estado de ejecucin x; si no se puede, devuelve x.
EJERCICIO: [MT REC] Demostrar que las
funciones esEstado(x) y aplicaRegla(x) son
recursivas primitivas.

Ejemplo de funciones recursivas:


Mquinas de Turing, III
Dada una mquina de Turing determinista
M, la funcin ejecuta(x, y), donde x, y*,
que devuelve el estado instantneo de
ejecucin de M a partir de y despus de |x|
transiciones, es recursiva primitiva.
Demostracin:
ejecuta(, y) = Sq(y)

ejecuta(S(x), y) =
aplicaRegla(ejecuta(x, y))

Ejemplo de funciones recursivas:


Mquinas de Turing, IV
Dada una mquina de Turing determinista M, la
funcin produce(x), que a cada cadena x le hace
corresponder el contenido de la cinta cuando M
se para a partir de x es recursiva (pero puede
no ser recursiva primitiva)
Demostracin:
produce(x) =
quitaEstado(ejecuta(x,miny(para(ejecuta(x, y)))))
Observacin: miny se puede definir en este caso
de forma anloga a como se hace con nmeros.

Forma normal de funciones


recursivas
Todas las funciones recursivas se pueden
escribir en la forma
f(x) = p(miny(q(x, y)))
donde p y q son funciones recursivas
primitivas.
Las funciones p y q se pueden elegir de
manera que p simplemente elimine el
contenido de la cinta previo a un separador.

Forma normal: programas


La construccin anterior tambin se puede
hacer con programas en lugar de mquinas
de Turing: a partir de cualquier programa
podemos construir otro equivalente que
incorpora un contador y emula al primero
paso a paso y cuando el inicial se para sigue
ejecutndose sin hacer nada y guardando en
una variable booleana fin la informacin de
que el programa emulado ha terminado.

Forma normal: programas, II


El clculo del programa inicial se puede
realizar buscando el valor mnimo del
contador del programa emulador para el
cual la variable fin es cierto, y devolviendo
la variable que contiene el valor del
programa emulado.

Ejemplo de funciones recursivas:


Mquinas de Turing, V
Si una mquina de Turing tiene una definicin
mediante submquinas que es recursiva, la
funcin que define sobre cadenas de caracteres
es recursiva.
Como consecuencia de lo anterior, las mquinas
de Turing definidas recursivamente mediante
submquinas no proporcionan un mecanismo
de computacin ms potente que las mquinas
de Turing simples.

Ejemplo de funciones recursivas:


Mquinas de Turing, VI
La demostracin de la afirmacin anterior se basa
en la funcin FM(q, u, x, v), que da el estado final
de ejecucin (q, u, x, v) calculado por la
mquina a partir del estado q con la palabra uxv
sobre la cinta, apuntando a la x. Su definicin es
FM(q, u, x, v) = FM(q, 234(FN(q, u, x, v)))
donde N es la submquina correspondiente a la
transicin. Esto da lugar a una definicin recursiva
de las funciones FM.
Si la submquina es indeterminista, se demuestra
de manera anloga utilizando conjuntos de
estados en lugar de estados.

Qu funciones son recursivas?


Todas las calculables
Es consecuencia de lo anterior
Tambin es consecuencia de la
construccin de una mquina universal
que emula mquinas de Turing con
submquinas recursivas

Qu funciones son recursivas?,


II
Las que se obtienen a partir de las
recursivas primitivas bsicas mediante
composicin, recursin primitiva y
minimizacin
Es consecuencia de lo anterior

Você também pode gostar