Escolar Documentos
Profissional Documentos
Cultura Documentos
Supongamos que queremos definir operaciones aritméticas en nuestra codificación Lambda números (ver
"Representación de números").
En Haskell podemos programar:
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:
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
Usando el Combinador Y
Considerar
entonces
Considerar
No podemos escribir:
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
Ejemplo:
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.
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’.
Hudak, Paul. 1989. “Conception, Evolution, and Application of Functional. “Conception, Evolution, and Application of
Functional. s.l. : ACM Computing Surveys, 1989.