El cálculo lambda es un sistema matemático formal que consiste en construir términos lambda y realizar operaciones de reducción sobre ellos. La definición de un término lambda es simplemente una variable, una abstracción lambda o una aplicación de función , pero una presentación formal puede resultar algo extensa. El objetivo de este artículo es presentar una definición completa del cálculo lambda, específicamente del cálculo lambda puro sin tipos ni extensiones, aunque se utiliza un cálculo lambda extendido con números y aritmética con fines explicativos.
Términos Lambda
El cálculo lambda consiste en un lenguaje de términos lambda , definidos por una sintaxis formal específica. Esta sintaxis define algunas expresiones como válidas y otras como inválidas, del mismo modo que algunas cadenas de caracteres son programas informáticos válidos y otras no. Una expresión válida del cálculo lambda se denomina "término lambda". En su forma más simple, los términos se construyen utilizando únicamente las tres reglas siguientes. Estas reglas proporcionan una definición inductiva que permite construir todos los términos lambda sintácticamente válidos y generar expresiones como:[ 1 ]
- Una variablees un carácter o cadena que representa un parámetro, que a su vez es un término lambda válido.
- Una abstracción lambdaes una definición de función, que toma como entrada la variable ligada(entre la λ y el punto . ) y devolviendo el cuerpoLa definición de una función con una abstracción simplemente "configura" la función, pero no la invoca. Una abstracción denota una función anónima que toma una única entrada x y devuelve M. La sintaxisvincula la variable x en el término M. Por ejemplo,es una abstracción que representa la función anónima. Más concretamente, podríamos darle a esta función el nombrey entonces podríamos escribir, aunque este nombrees superfluo cuando se utiliza el cálculo lambda.
- Una solicitudrepresenta la aplicación de una funcióna un argumento. Ambosyson términos lambda. La aplicación representa el acto de llamar a la función M sobre la entrada N para producir.
En la forma extendida de Backus-Naur , esto podría resumirse comodonde las variablesprovienen de un conjunto infinitoy los demás símbolos consisten en lambda '', punto '.', y paréntesis '(' y ')'. Una presentación más formal y permisiva de la gramática podría ser la siguiente:
El conjunto de expresiones lambda se define inductivamente, por ejemplo, como un conjunto Λ , donde los resultados de aplicar las reglas 1 a 3 son todos y solo los elementos de Λ . En el sentido más estricto, nada más es un término lambda. Es decir, un término lambda es válido si y solo si se puede obtener mediante la aplicación repetida de estas tres reglas. Formalmente:
- Si x es una variable, entonces x ∈ Λ.
- Si x es una variable y M ∈ Λ, entonces (λ x . M ) ∈ Λ.
- Si M , N ∈ Λ, entonces ( MN ) ∈ Λ.
Las instancias de la regla 2 se conocen como abstracciones y las instancias de la regla 3 se conocen como aplicaciones . [ 2 ]
También es común extender la sintaxis presentada aquí con operaciones adicionales, por ejemplo, introduciendo términos para constantes y operaciones matemáticas, lo que permite dar sentido a términos comoEl cálculo lambda sin tipos es flexible, ya que no distingue entre diferentes tipos de datos. Por ejemplo, puede haber una función diseñada para operar con números. Sin embargo, en el cálculo lambda sin tipos, no hay forma de evitar que una función se aplique a valores de verdad , cadenas de caracteres u otros objetos que no sean números. Dependiendo de la codificación de los datos, esto puede generar resultados sin sentido o funcionar según lo previsto.
Variables libres y ligadas
Siguiendo los conceptos matemáticos de variables libres y variables ligadas , el operador de abstracción,Se dice que vincula su variable dondequiera que aparezca en el cuerpo de la abstracción. Se dice que las variables que caen dentro del ámbito de una abstracción están vinculadas , y la parte λ x a menudo se denomina el ligador de x . Las variables que no están vinculadas se denominan libres . Por ejemplo, la definición de la funciónpodría representarse como el término lambda, que contiene dos variables, x e y . La variable x está ligada por la abstracción lambda, mientras que y es libre. La variable libre y no ha sido definida y se considera desconocida. La abstracciónes un término sintácticamente válido y representa una función que suma su entrada a la variable y aún desconocida . También tenga en cuenta que una variable está ligada a su abstracción "más cercana". En el siguiente ejemplo, la única aparición deen la expresión está delimitada por la segunda lambda:Una variable puede aparecer tanto libre como ligada en un término; por ejemploen.
De manera más formal, los conjuntos de variables libres y variables ligadas de una expresión lambda,, se denotan comoyy se puede definir mediante recursión sobre la estructura de los términos, como sigue: [ 3 ] [ 4 ]
Una expresión que no contiene variables libres se denomina cerrada . Las expresiones lambda cerradas también se conocen como combinadores y son equivalentes a términos en lógica combinatoria . Es común restringir la discusión solo a términos cerrados, y algunas presentaciones del cálculo lambda solo consideran términos cerrados. Por ejemplo, el término lambda que representa la identidadNo tiene variables libres y es cerrado.
Notación
Para mayor comodidad, se pueden omitir los paréntesis si la expresión no es ambigua. Por ejemplo, siempre se pueden omitir los paréntesis exteriores.en lugar deSin embargo, no todos los paréntesis pueden eliminarse. Por ejemplo,
- es de formay es, por lo tanto, una abstracción, mientras que
- es de formay por lo tanto es una aplicación.
Los ejemplos 1 y 2 representan términos distintos, diferenciándose únicamente en la ubicación de los paréntesis. Tienen significados diferentes: el ejemplo 1 es la definición de una función, mientras que el ejemplo 2 es su aplicación. La variable lambda x es un marcador de posición en ambos ejemplos.
Aquí, el ejemplo 1 define una función., dóndees, una función anónima, con entrada; mientras que el ejemplo 2, , es M aplicado a N, dondees el término lambdase está aplicando a la entradaque esAmbos ejemplos, 1 y 2, se evaluarían como la función identidad ..
Para permitir una mayor concisión en estas situaciones, se suelen aplicar las siguientes convenciones:
- Se supone que las aplicaciones son asociativas por la izquierda:puede escribirse en lugar de[ 5 ]
- El cuerpo de una abstracción se extiende lo más a la derecha posible :medioy noDicho de otro modo, una abstracción lambda tiene menor precedencia que una aplicación.
- Se contrae una secuencia de abstracciones:se abrevia como[ 6 ] [ 7 ] [ 5 ]
- Cuando todas las variables son de una sola letra, se puede omitir el espacio en las aplicaciones: MNP en lugar de M N P . [ 8 ]
Transformación y reducción
El significado de las expresiones lambda se define por cómo se pueden transformar y reducir las expresiones. [ 9 ]
Existen tres tipos de transformación:
- α-conversión : cambio de variables ligadas ( alfa );
- β-reducción : aplicar funciones a sus argumentos ( beta ), llamar a funciones;
- η-reducción : que captura una noción de extensionalidad ( eta ).
También hablamos de las equivalencias resultantes: dos expresiones son β-equivalentes si pueden ser β-convertidas en la misma expresión, y la α/η-equivalencia se define de manera similar.
El término redex , abreviatura de expresión reducible , se refiere a subtérminos que pueden reducirse mediante una de las reglas de reducción. Por ejemplo,es una β-redex en la expresión de la sustitución deparaen; sino es gratis en,es un η-redex. La expresión a la que se reduce un redex se llama su reducto; usando el ejemplo anterior, los reductos de estas expresiones son respectivamentey.
conversión α
La α-conversión ( alpha -conversion), a veces conocida como α-renombrado, [ 10 ] permite cambiar los nombres de las variables vinculadas. Por ejemplo, la α-conversión depodría producirLos términosyLos términos que difieren únicamente por la conversión alfa se denominan α-equivalentes , lo que refleja la intuición de que la elección particular de una variable ligada en una abstracción no suele ser relevante. Con frecuencia, en el cálculo lambda, los términos α-equivalentes se consideran equivalentes.
Las reglas precisas para la conversión alfa no son del todo triviales. Primero, al convertir alfa una abstracción, las únicas ocurrencias de variables que se renombran son aquellas que están vinculadas por la misma abstracción. Por ejemplo, una conversión alfa depodría resultar enpero no podría resultar en. Este último tiene un significado diferente al original. Esto es análogo a la noción de programación de ocultamiento de variables .
En segundo lugar, la conversión alfa no es posible si resultara en que una variable sea capturada por una abstracción diferente. Por ejemplo, si reemplazamosconen, obtenemos, lo cual no es en absoluto lo mismo. En la notación de índice de De Bruijn , cualesquiera dos términos α-equivalentes son sintácticamente idénticos, y de esta manera no puede producirse confusión.
Ver ejemplo:
Sustitución
Sustitución, por escritoes el proceso de reemplazar todas las ocurrencias libres de la variableen la expresióncon expresiónLa sustitución en términos del cálculo lambda se define mediante recursión en la estructura de los términos, como sigue (nota: x e y son variables, mientras que M y N son cualquier expresión λ).
- ; consustituido por,se convierte
- si ; consustituido por,(que no lo es)) restos
- ; la sustitución distribuye a ambos lados de una solicitud
- Una variable ligada a una abstracción no es sustituible; sustituir dicha variable deja la abstracción inalterada.
- siy; la sustitución de una variable que no está ligada a una abstracción se realiza en el cuerpo de la abstracción, siempre que la variable abstraídaes " fresco " para el término de sustitución, lo que significa que no aparece entre las variables libres de
Por ejemplo,, y.
La condición de frescura (que requiere queno está en las variables libres de) es crucial para asegurar que la sustitución no cambie el significado de las funciones. La situación en la que se sustituyeSe suponía que debía ser libre pero terminó siendo atado, una situación conocida como captura.Para sustituir en una abstracción lambda, a veces es necesario convertir la expresión a α. Por ejemplo, esta sustituciónes erróneo porque convertiría la función constante en una función.en la identidad. La sustitución correcta consiste en renombrar la variable ligada utilizando la α-equivalencia, en este caso.
En general, el incumplimiento de la condición de frescura se puede remediar renombrando alfa primero, con una variable fresca adecuada. La sustitución se define de forma única hasta la α-equivalencia. La mayoría de las implementaciones de sustitución usan la conversión alfa automáticamente para evitar la captura durante la sustitución, una operación llamada sustitución que evita la captura . En lenguajes de programación con ámbito estático, la sustitución que evita la captura se puede usar para implementar la resolución de nombres manejando cuidadosamente el sombreado de variables en ámbitos contenedores . Otra estrategia es requerir el renombrado alfa en el programa fuente para hacer que la resolución de nombres sea trivial . Si se usa la indexación De Bruijn , entonces la conversión alfa ya no es necesaria, ya que no habrá colisiones de nombres. Los nombres de las variables tampoco son necesarios si se usa una función universal, como en Iota y Jot .
β-reducción
La β-reducción ( reducción beta ) captura la idea de aplicación de la función. La β-reducción se define en términos de sustitución: la β-reducción dees. La regla de reducción β establece que una aplicación de la formase reduce al término. La notaciónse utiliza para indicar queβ-se reduce aLa β-reducción captura la idea de aplicación de funciones (también llamada llamada a función) e implementa la sustitución de la expresión del parámetro real por la variable del parámetro formal. La β-reducción puede considerarse equivalente al concepto de reducibilidad local en la deducción natural , a través del isomorfismo de Curry-Howard .
Por ejemplo, para cada,Esto demuestra querealmente es la identidad. De manera similar,, lo cual demuestra quees una función constante. Suponiendo alguna codificación de, tenemos la siguiente β-reducción:.
De manera más formal, la reducción β se puede realizar en la abstracción lambda sin renombrar alfa solo si no hay nombres de variables libres en el parámetro real y ligados en el cuerpo: [ a ]
Se puede utilizar el cambio de nombre alfanumérico encambiar el nombre de los nombres que están libres enpero limitado en, para cumplir con la condición previa para esta transformación. Ver ejemplo:
Si observamos más de cerca, las sustituciones clave son:
En este ejemplo,
- En el β-redex,
- Las variables libres son,
- Las variables ligadas son,
- La reducción β ingenua cambió el significado de la expresión porque x e y del parámetro real quedaron capturados cuando las expresiones se sustituyeron en las abstracciones internas.
- El cambio de nombre alfa eliminó el problema al modificar los nombres de x e y en la abstracción interna para que fueran distintos de los nombres de x e y en el parámetro real.
- Las variables libres son,
- Las variables ligadas son,
- La reducción β procedió entonces con el significado previsto.
reducción η
La reducción η ( reducción eta ) convierte dea, dado queno parece libre enEl problema de utilizar una reducción η cuando f tiene variables libres se muestra en este ejemplo:
Este uso inapropiado de la reducción η cambia el significado al dejar x en no sustituido.
La η-reducción a menudo se combina con su inversa, la η-expansión, que convierte desdea, nuevamente dado queno parece libre enLos dos procesos en conjunto se denominan η-conversión . La η-conversión expresa la idea de extensionalidad , [ 12 ] que en este contexto significa que dos funciones son iguales si y solo si dan el mismo resultado para todos los argumentos. La η-conversión puede considerarse equivalente al concepto de completitud local en la deducción natural , a través del isomorfismo de Curry-Howard .
Evaluación y normalización
El cálculo lambda puede considerarse una versión idealizada de un lenguaje de programación funcional , como Haskell o Standard ML . Desde esta perspectiva,La reducción β corresponde a un paso computacional. Este paso puede repetirse mediante reducciones β adicionales hasta que no queden más aplicaciones por reducir. Si la evaluación termina, el resultado es una expresión lambda que no puede reducirse más mediante reducción β. Esto se denomina forma normal de la expresión. Una expresión lambda que no puede reducirse más mediante reducciones β está en forma normal beta , y de manera similar, si tampoco puede reducirse mediante reducciones η, está en forma normal beta-eta . Todas las formas normales que pueden convertirse entre sí mediante conversión α se definen como iguales. Según el teorema de Church-Rosser , la forma normal es única si existe, independientemente del orden en que se realicen las reducciones (la estrategia de reducción ).
Sin embargo, no todas las expresiones lambda tienen una forma normal. Por ejemplo, considérese el término. AquíEs decir, el término se reduce a sí mismo en una única β-reducción, y por lo tanto el proceso de reducción nunca terminará. Los cálculos lambda tipados , como el cálculo lambda simplemente tipado , no permiten la construcción de términos comoy, por lo tanto, todos los términos bien tipificados en estos sistemas tienen una forma normal.
Notas
Referencias
- ↑ Barendregt, Hendrik Pieter (1984), El cálculo lambda: su sintaxis y semántica , Estudios en lógica y fundamentos de las matemáticas, vol. 103 (edición revisada ), North Holland, Ámsterdam, ISBN 978-0-444-87508-2Archivado del original el 23 de agosto de 2004.— Correcciones
- ↑ Barendregt, Hendrik Pieter (1984). El cálculo lambda: su sintaxis y semántica . Estudios en lógica y fundamentos de las matemáticas. Vol. 103 ( Edición revisada). North Holland. ISBN 0-444-87508-5.( Correcciones ).
- 1 2 Barendregt, Henk ; Barendsen, Erik (marzo de 2000), Introducción al cálculo Lambda (PDF)
- ↑ Barendregt, Henk (1985). El cálculo lambda : su sintaxis y semántica . Estudios de lógica y fundamentos de las matemáticas. Vol. 103. Ámsterdam: North-Holland. ISBN 0444867481.Aquí: Def.2.1.6, pág. 24
- 1 2 "Ejemplo de reglas de asociatividad" . Lambda-bound.com . Consultado el 18 de junio de 2012 .
- ↑ Selinger, Peter (2008), Lecture Notes on the Lambda Calculus (PDF) , vol. 0804, Departamento de Matemáticas y Estadística, Universidad de Ottawa, pág. 9, arXiv : 0804.3434 , Bibcode : 2008arXiv0804.3434S
- ↑ "Ejemplo de regla de asociatividad" . Lambda-bound.com . Consultado el 18 de junio de 2012 .
- ↑ "La gramática básica de las expresiones lambda" . SoftOption .
Algunos otros sistemas usan la yuxtaposición para indicar la aplicación, por lo que 'ab' significa 'a@b'. Esto está bien, excepto que requiere que las variables tengan longitud uno para que sepamos que 'ab' son dos variables yuxtapuestas, no una variable de longitud 2. Pero queremos que etiquetas como 'firstVariable' signifiquen una sola variable, por lo que no podemos usar esta convención de yuxtaposición.
- ↑ de Queiroz, Ruy JGB (1988). "Una explicación teórica de la programación y el papel de las reglas de reducción". Dialectica . 42 (4): 265– 282. doi : 10.1111/j.1746-8361.1988.tb00919.x .
- ↑ Turbak, Franklyn; Gifford, David (2008), Design concepts in programming languages , MIT press, p. 251, ISBN 978-0-262-20175-9
- ↑ sustitución explícita en el n Lab
- ↑ Luke Palmer (29 de diciembre de 2010) Haskell-cafe: ¿Cuál es la motivación para las reglas η?
- Cálculo lambda