Você está na página 1de 5

Recursión

Supongamos que queremos definir operaciones aritméticas en nuestra codificación Lambda números (ver
"Representación de números").
En Haskell podemos programar:

por lo que podríamos tratar de definir:

Desafortunadamente, esta no es una definición, ya que estamos tratando de usar "plus” antes de que se defina,
Aunque la recursión es fundamental para la programación funcional, no es primitivo en el cálculo lambda, por
lo que debemos encontrar una manera de "programarlo".
Funciones recursivas como puntos fijos
Sin embargo, podemos obtener una expresión cerrada al abstraer plus de:

Ahora, deje que "fplus" sea la función de adición real que queremos. Debemos pasarlo a "rplus" como
parámetro antes de que podamos realizar cualquier adición.
Pero entonces (rplus fplus) es la función que queremos. En otras palabras, estamos buscando un
fplus tal que:

Estamos buscando un punto fijo de "rplus".

Puntos fijos
En general, una función punto fijo es un valor en el dominio de la función, ¿Cómo se aplica a sí mismo por la
función?
Por lo tanto, un punto fijo de una función f es un valor p tal que fp = p.
Ejemplos:

Sin embargo, no todas las funciones tienen exactamente un punto fijo: "succ n = n + 1" no tiene ninguno.
Teorema de punto fijo
Para cada F existe un punto fijo X tal que F X ↔ X.
Prueba:
Dejar:

Ahora considera:

Por lo tanto, el "combinador Y" siempre se puede utilizar para encontrar un punto fijo de una expresión lambda
arbitraria, si existe tal punto fijo.

¿Cómo funciona Y?
Recordar la expresión sin terminación

Ω Bucles interminables sin hacer ningún trabajo productivo.


Tenga en cuenta que (x x) representa el cuerpo del "bucle".
Simplemente definimos Y para tomar un parámetro extra f, y ponerlo en el bucle, Pasándole el cuerpo como
argumento:

Así que Y solo inserta un trabajo productivo en el cuerpo de Ω

Usando el Combinador Y
Considerar

entonces

Considerar

donde f no tiene un punto fijo.


Entonces:

Por lo tanto, Y también se llama el "combinador paradójico".


El problema es que la λ-cálculo es un sistema sin semántica
Las funciones recursivas son puntos fijos.

No podemos escribir:

porque plus no está consolidado en la "definición".


Podemos, sin embargo, abstraer plus sobre:

Ahora buscamos una expresión lambda plus, tal que:

Plus es un punto fijo de rplus. Por el teorema del punto fijo, podemos tomar:

Tenga en cuenta que el "nuevo" plus que estamos definiendo globalmente no es el igual que el nombre
enlazado localmente plus dentro de rplus, pero cuando Aplicamos rplus plus, el definido globalmente se une a
el local

Despliegue de expresiones Lambda recursivas

Ejemplo:

Aquí podemos ver cómo, como Ω, Y rplus repetidamente.


las diferencias es que podemos hacer un trabajo productivo en cada paso, y Decida cuándo terminar el ciclo con
la prueba iszero.
Tenga en cuenta que usamos el teorema del punto de referencia también en las líneas 5 y 6 para reescribir plus
como rplus plus.
Recursión en calculo lambda
Para lograr la recursión en el cálculo lambda, se requiere una función de punto fijo. La función de punto fijo generalmente
se conoce como Y, y por definición debe satisfacer Yf = f (Yf).

La función utilizada para Y es λf. (Λg.f (gg)) (λg.f (gg)). Yf se puede reducir beta a (λg.f (gg)) (λg.f (gg)), que a su vez se
puede reducir beta a f (λg.f (gg)) (λg.f (gg)), satisfaciendo Yf = f (Yf).

Usando Y, una función tiene acceso a una copia encuadernada de sí misma. Si las expresiones lambda fueran nombradas,
es posible que desee escribir f = λx 1 ... x n E, donde E es una expresión que se refiere a f. Con el combinador Y, la
función de la derecha se convierte en Yλfx 1 ... x n E.

Recursión y los combinadores de punto fijo.


Consideremos cómo nos gustaría definir una función que computa factoriales.
En una notación ligeramente más legible (y veremos el próximo ejemplo cómo podemos traducir más legible
notación en expresiones apropiadas):

Aquí, como en las definiciones que dimos anteriormente, el nombre FACT simplemente debe ser una forma
abreviada de Expresión en el lado derecho de la ecuación.
Pero FACT aparece en el lado derecho de la ecuación ¡también! Esto no es una definición, es una ecuación
recursiva.
Truco de eliminación de recursión

Podemos realizar un "truco" para definir una función FACT que satisfaga la ecuación recursiva anterior.
Primero, vamos definir una nueva función FACT’ que se parece a FACT, pero toma un argumento adicional f.
Suponemos que la función f se instanciará con un parámetro real de ... FACT’.

Tenga en cuenta que cuando llamamos f, le pasamos una copia de sí mismo, conservando el supuesto de que el
argumento real
para f será FACT’.
Ahora podemos definir la función factorial FACT en términos de FACT’.

Intentemos evaluar FACT aplicado a un entero.


Bibliografía
Chong, Prof. Stephen. 2010. Harvard School of Engineering and Applied Sciences. Lambda calculus encodings;
Recursion. [Online] 03 23, 2010. https://www.seas.harvard.edu/courses/cs152/2010sp/lectures/lec09.pdf.

Hudak, Paul. 1989. “Conception, Evolution, and Application of Functional. “Conception, Evolution, and Application of
Functional. s.l. : ACM Computing Surveys, 1989.

Você também pode gostar