5. 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)
6. 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.
7. 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.
8. 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
10. 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))
11. 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
12. 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
13. 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)
14. 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”
15. 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.
16. 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
17. 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
18. 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
19. 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
20. 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
21. 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
mediante
h(x, y) = (x = 0) ? 1 : h(x – 1, h(|x – y|, y))
22. 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)
23. 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.
24. 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)
25. 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.
26. 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))
27. 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.
28. 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.
29. 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.
30. 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.
31. 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.
32. 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.
33. 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
34. 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