funciones recursivas roberto moriyón. ejemplo: función de ackerman f(i,x) = (i=0) ? x+1 : ((x=0) ?...

34
Funciones recursivas Roberto Moriyón

Upload: lorencio-andujar

Post on 29-Jan-2016

245 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Funciones recursivas Roberto Moriyón. 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

Funciones recursivas

Roberto Moriyón

Page 2: Funciones recursivas Roberto Moriyón. 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

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+1F(1,1) = F(0,F(1,0)) = F(0,F(0,0)) = F(0,1) = 2F(1,2) = F(0,F(1,1)) = F(0,2) = 3F(1,x) = F(0,F(1,x-1)) = … = F(0,x) = x+1F(2,1) = F(1,F(2,0)) = F(1,F(1,1)) = F(1,2) = 3F(2,x) = F(1,F(2,x-1)) = … = F(1,2x-1) = 2x+1…

Page 3: Funciones recursivas Roberto Moriyón. 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

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 esF(x+1,y) = F(x, y)+2F(0,y) = y+2

Page 4: Funciones recursivas Roberto Moriyón. 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

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

Page 5: Funciones recursivas Roberto Moriyón. 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

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)

Page 6: Funciones recursivas Roberto Moriyón. 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

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.

Page 7: Funciones recursivas Roberto Moriyón. 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

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.

Page 8: Funciones recursivas Roberto Moriyón. 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

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

Page 9: Funciones recursivas Roberto Moriyón. 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

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)

Page 10: Funciones recursivas Roberto Moriyón. 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

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 ui

n(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))

Page 11: Funciones recursivas Roberto Moriyón. 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

Funciones recursivas primitivas sobre cadenas de caracteres, II

• 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

Page 12: Funciones recursivas Roberto Moriyón. 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

Funciones recursivas primitivas sobre cadenas de caracteres, III

• La función resto: + * que elimina el primer carácter no es total ni, por lo tanto, recursiva primitiva

Page 13: Funciones recursivas Roberto Moriyón. 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

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)

Page 14: Funciones recursivas Roberto Moriyón. 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

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”

Page 15: Funciones recursivas Roberto Moriyón. 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

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.

Page 16: Funciones recursivas Roberto Moriyón. 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

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 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

Page 17: Funciones recursivas Roberto Moriyón. 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

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

Page 18: Funciones recursivas Roberto Moriyón. 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

Formas de definición de las funciones recursivas

• Definición usual: Aplicar la definición repetidamente, utilizando una pila de cálculos parciales, hasta que se llegue al resultado

• Ejemplo: Para la función de Ackerman,

F(1,1) = F(0,F(1,0)) = F(0,F(0,0)) = F(0,1) = 2

Page 19: Funciones recursivas Roberto Moriyón. 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

Formas de definición de las funciones recursivas, II

• Forma rigurosa (aunque teórica):

• Definir F sobre un primer dominio, D0, donde se puede calcular directamente– Ejemplo: Para la función de Ackerman,

D0={(i,x)|i=0}, en cuyo caso f0(i,x)=x+1

• Definir F sobre un dominio Dj+1 si su cálculo se puede reducir al de F sobre Dj

– Ejemplo: D1=D0 {(i,x) | x=0}; f∪ 1(i,x) = …

– D2=D1 {(1,1)}; f∪ 2(i,x) = …, etc

Page 20: Funciones recursivas Roberto Moriyón. 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

Formas de definición de las funciones recursivas, III

• Interpretación 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

Page 21: Funciones recursivas Roberto Moriyón. 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

EJERCICIOS

• [REC 1] Calcular el dominio y los valores de las imágenes 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 imágenes de la función h definida medianteh(x, y) = (x = 0) ? 1 : h(x – 1, h(|x – y|, y))

Page 22: Funciones recursivas Roberto Moriyón. 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

Funciones recursivas: Minimización

• Si f(x,y) es una función recursiva, entonces

g(x) = min { y | f(x,y) ≠ 0 }

define otra función recursiva– Demostración: 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)

Page 23: Funciones recursivas Roberto Moriyón. 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

EJERCICIOS

• Suponiendo que la función f(x,y) sea recursiva, demostrar que también lo es la función 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.

Page 24: Funciones recursivas Roberto Moriyón. 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

Ejemplo de funciones recursivas: Máquinas de Turing

• Dada una máquina de Turing determinista M, la función transita(x, y), donde x e y son estados instantáneos de ejecución de M, que vale “a” si la máquina M lleva la cinta del estado x al y y en caso contrario, es recursiva (pero no recursiva primitiva)

Page 25: Funciones recursivas Roberto Moriyón. 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

Ejemplo de funciones recursivas: Máquinas de Turing, II

• Demostración:transita(x, y) = esEstado(x) & esEstado(y) &

& ((x=y) ? “a” : transita(aplicaRegla(x), y))

• La función aplicaRegla(x) devuelve el resultado de aplicar una regla de transición de M a partir del estado de ejecución x; si no se puede, devuelve x.

• EJERCICIO: [MT REC] Demostrar que las funciones esEstado(x) y aplicaRegla(x) son recursivas primitivas.

Page 26: Funciones recursivas Roberto Moriyón. 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

Ejemplo de funciones recursivas: Máquinas de Turing, III

• Dada una máquina de Turing determinista M, la función ejecuta(x, y), donde x, y*, que devuelve el estado instantáneo de ejecución de M a partir de y después de |x| transiciones, es recursiva primitiva.

• Demostración:

ejecuta(, y) = Sqº(y)

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

Page 27: Funciones recursivas Roberto Moriyón. 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

Ejemplo de funciones recursivas: Máquinas de Turing, IV

• Dada una máquina de Turing determinista M, la función 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)

• Demostración:produce(x) =

quitaEstado(ejecuta(x,miny(para(ejecuta(x, y)))))• Observación: miny se puede definir en este caso

de forma análoga a como se hace con números.

Page 28: Funciones recursivas Roberto Moriyón. 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

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.

Page 29: Funciones recursivas Roberto Moriyón. 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

Forma normal: programas

• La construcción anterior también se puede hacer con programas en lugar de máquinas 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 ejecutándose sin hacer nada y guardando en una variable booleana fin la información de que el programa emulado ha terminado.

Page 30: Funciones recursivas Roberto Moriyón. 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

Forma normal: programas, II

• El cálculo del programa inicial se puede realizar buscando el valor mínimo del contador del programa emulador para el cual la variable fin es cierto, y devolviendo la variable que contiene el valor del programa emulado.

Page 31: Funciones recursivas Roberto Moriyón. 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

Ejemplo de funciones recursivas: Máquinas de Turing, V

• Si una máquina de Turing tiene una definición mediante submáquinas que es recursiva, la función que define sobre cadenas de caracteres es recursiva.

• Como consecuencia de lo anterior, las máquinas de Turing definidas recursivamente mediante submáquinas no proporcionan un mecanismo de computación más potente que las máquinas de Turing simples.

Page 32: Funciones recursivas Roberto Moriyón. 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

Ejemplo de funciones recursivas: Máquinas de Turing, VI

• La demostración de la afirmación anterior se basa en la función FM(q, u, x, v), que da el estado final de ejecución (q’, u’, x’, v’) calculado por la máquina a partir del estado q con la palabra uxv sobre la cinta, apuntando a la x. Su definición es

FM(q, u, x, v) = FM(q’, 234(FN(q, u, x, v)))donde N es la submáquina correspondiente a la transición. Esto da lugar a una definición recursiva de las funciones FM.

• Si la submáquina es indeterminista, se demuestra de manera análoga utilizando conjuntos de estados en lugar de estados.

Page 33: Funciones recursivas Roberto Moriyón. 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

Qué funciones son recursivas?

• Todas las calculables

• Es consecuencia de lo anterior

• También es consecuencia de la construcción de una máquina universal que emula máquinas de Turing con submáquinas recursivas

Page 34: Funciones recursivas Roberto Moriyón. 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

Qué funciones son recursivas?, II

• Las que se obtienen a partir de las recursivas primitivas básicas mediante composición, recursión primitiva y minimización

• Es consecuencia de lo anterior