Saltar al contenido

Recursión

Avanzado Lógica Computación

Falta llamativamente una cosa: los bucles. Las funciones no tienen nombre, así que nada puede referirse a sí mismo — no hay ningún f(...) donde f pueda llamar a f. Y sin embargo todo algoritmo real necesita repetición. La solución es el truco más famoso del campo.

El término divergente

Empieza con una paradoja. ¿Qué pasa si una función se come a sí misma?

Ω = (λx.x x) (λx.x x) → (λx.x x) (λx.x x) se reproduce a sí mismo exactamente — para siempre

Ω se β-reduce a sí mismo: un bucle infinito en una sola línea. (El paso a paso se rendirá en su límite de seguridad — nunca alcanza una forma normal porque no existe.)

Puntos fijos

Un punto fijo de una función g es un valor X con g X = X. Ahora supón que existe un combinador mágico Y con la propiedad:

Y g = g (Y g) Y le entrega a g una copia de «Y g» — así g puede invocarse a sí misma llamando a su argumento

Alimenta a Y con una función que diga «si n es cero, devuelve 1, si no multiplica n por yo misma de n−1» — y el argumento es la llamada recursiva. Autorreferencia, construida a partir de nada más que sustitución.

El combinador Y

Y = λf.(λx.f (x x)) (λx.f (x x)) Y g → (λx.g (x x)) (λx.g (x x)) → g ((λx.g (x x)) (λx.g (x x))) = g (Y g) ahí está — g aplicada a Y g

Fíjate en el truco de Ω dentro: x x es otra vez autoaplicación, pero esta vez envuelta en f (…) de modo que cada «vuelta» hace un paso de trabajo real antes de recurrir. Ω diverge; Y hace algo en cada ronda.

Factorial, en principio

FACT = Y (λf.λn. IF (ISZERO n) ONE (MULT n (f (PRED n)))) la función anónima se recibe a sí misma como f — recursión sin nombre

Cada pieza de esa línea es algo que tú construiste: IF, ISZERO, MULT de las codificaciones de Church, PRED (la difícil — cabalga sobre los pares) e Y para el bucle. Sin incorporaciones. Sin nombres. Una regla.

Lo que acabas de ver A partir de tres clases de expresión y una regla de reescritura: números, aritmética, booleanos, lógica, pares y recursión sin límites — que es todo lo que una computadora es. Por eso la tesis de Church–Turing dice que «computable» significa λ-definible, y por eso un formalismo lógico de 1936 es el esqueleto dentro de todo lenguaje funcional de hoy.

A dónde seguir

Práctica

(λx.x x) (λx.x x) — el término Ω — ¿qué hace?

Y g se despliega a ___ (lo que vale un paso β)

¿Por qué el cálculo λ necesita un combinador para la recursión?

Escribe el combinador Y: Y = ___