Articulo de referencia

Definición de cálculo lambda

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 e...

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:(λincógnita.λy.(λz.(λincógnita.z incógnita) (λy.z y))(incógnita y)).{\displaystyle (\lambda x.\lambda y.(\lambda z.(\lambda xz\ x)\ (\lambda yz\ y))(x\ y)).}[ 1 ]

  1. Una variableincógnita{\textstyle x}es un carácter o cadena que representa un parámetro, que a su vez es un término lambda válido.
  2. Una abstracción lambda(λincógnita.METRO){\textstyle (\lambda xM)}es una definición de función, que toma como entrada la variable ligadaincógnita{\displaystyle x}(entre la λ y el punto . ) y devolviendo el cuerpoMETRO{\textstyle M}La 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 sintaxis(λincógnita.METRO){\displaystyle (\lambda xM)}vincula la variable x en el término M. Por ejemplo,λincógnita.(incógnita2+2){\displaystyle \lambda x.(x^{2}+2)}es una abstracción que representa la función anónimaincógnitaincógnita2+2{\displaystyle x\mapsto x^{2}+2}. Más concretamente, podríamos darle a esta función el nombreF{\displaystyle f}y entonces podríamos escribirF(incógnita)=incógnita2+2,{\displaystyle f(x)=x^{2}+2,}, aunque este nombreF{\displaystyle f}es superfluo cuando se utiliza el cálculo lambda.
  3. Una solicitud(METRO norte){\textstyle (M\ N)}representa la aplicación de una funciónMETRO{\textstyle M}a un argumentonorte{\textstyle N}. AmbosMETRO{\textstyle M}ynorte{\textstyle N}son términos lambda. La aplicación representa el acto de llamar a la función M sobre la entrada N para producirMETRO(norte){\displaystyle M(N)}.

En la forma extendida de Backus-Naur , esto podría resumirse comomi::=v(λv.mi)(mimi){\displaystyle e::=v\mid (\lambda ve)\mid (e\,e)}donde las variablesv{\displaystyle v}provienen de un conjunto infinitov1,v2,v3,{\displaystyle v_{1},v_{2},v_{3},\ldots }y los demás símbolos consisten en lambda 'λ{\displaystyle \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:

  1. Si x es una variable, entonces x ∈ Λ.
  2. Si x es una variable y M ∈ Λ, entonces x . M ) ∈ Λ.
  3. 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 comoλincógnita.incógnita2.{\displaystyle \lambda xx^{2}.}El 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,λ{\displaystyle \lambda }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ónF(incógnita)=incógnita+y{\displaystyle f(x)=x+y}podría representarse como el término lambdaλincógnita.(incógnita+y){\displaystyle \lambda x.(x+y)}, 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ónλincógnita.(incógnita+y){\displaystyle \lambda x.(x+y)}es 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 deincógnita{\displaystyle x}en la expresión está delimitada por la segunda lambda:λincógnita.y(λincógnita.z incógnita){\displaystyle \lambda xy(\lambda xz\ x)}Una variable puede aparecer tanto libre como ligada en un término; por ejemploy{\displaystyle y}eny(λy.y){\displaystyle y(\lambda yy)}.

De manera más formal, los conjuntos de variables libres y variables ligadas de una expresión lambda,METRO{\displaystyle M}, se denotan comoFV(METRO){\displaystyle \operatorname {FV} (M)}yBV(METRO){\displaystyle \operatorname {BV} (M)}y 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 identidadλincógnita.incógnita{\displaystyle \lambda xx}No 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.METRO norte{\displaystyle M\ N}en lugar de(METRO norte){\displaystyle (M\ N)}Sin embargo, no todos los paréntesis pueden eliminarse. Por ejemplo,

  1. λincógnita.((λincógnita.incógnita)incógnita){\displaystyle \lambda x.((\lambda xx)x)}es de formaλincógnita.B{\displaystyle \lambda xB}y es, por lo tanto, una abstracción, mientras que
  2. (λincógnita.(λincógnita.incógnita))incógnita{\displaystyle (\lambda x.(\lambda xx))x}es de formaMETROnorte{\displaystyle MN}y 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.λincógnita.B{\displaystyle \lambda xB}, dóndeB{\displaystyle B}es(λincógnita.incógnita)incógnita{\displaystyle (\lambda xx)x}, una función anónima(λincógnita.incógnita){\displaystyle (\lambda xx)}, con entradaincógnita{\displaystyle x}; mientras que el ejemplo 2,METRO{\displaystyle M} norte{\displaystyle N}, es M aplicado a N, dondeMETRO{\displaystyle M}es el término lambda(λincógnita.(λincógnita.incógnita)){\displaystyle (\lambda x.(\lambda xx))}se está aplicando a la entradanorte{\displaystyle N}que esincógnita{\displaystyle x}Ambos ejemplos, 1 y 2, se evaluarían como la función identidad .λincógnita.incógnita{\displaystyle \lambda xx}.

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:METRO norte PAG{\displaystyle M\ N\ P}puede escribirse en lugar de((METRO norte) PAG){\displaystyle ((M\ N)\ P)}[ 5 ]
  • El cuerpo de una abstracción se extiende lo más a la derecha posible :λincógnita.METRO norte{\displaystyle \lambda xM\ N}medioλincógnita.(METRO norte){\displaystyle \lambda x.(M\ N)}y no(λincógnita.METRO) norte{\displaystyle (\lambda xM)\ N}Dicho de otro modo, una abstracción lambda tiene menor precedencia que una aplicación.
  • Se contrae una secuencia de abstracciones:λincógnita.λy.λz.norte{\displaystyle \lambda x.\lambda y.\lambda zN}se abrevia comoλincógnitayz.norte{\displaystyle \lambda xyz.N}[ 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,(λincógnita.METRO) norte{\displaystyle (\lambda xM)\ N}es una β-redex en la expresión de la sustitución denorte{\displaystyle N}paraincógnita{\displaystyle x}enMETRO{\displaystyle M}; siincógnita{\displaystyle x}no es gratis enMETRO{\displaystyle M},λincógnita.METRO incógnita{\displaystyle \lambda xM\ x}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 respectivamenteMETRO[incógnita:=norte]{\displaystyle M[x:=N]}yMETRO{\displaystyle M}.

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 deλincógnita.incógnita{\displaystyle \lambda xx}podría producirλy.y{\displaystyle \lambda yy}Los términosincógnita{\displaystyle x}yy{\displaystyle y}Los 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 deλincógnita.λincógnita.incógnita{\displaystyle \lambda x.\lambda xx}podría resultar enλy.λincógnita.incógnita{\displaystyle \lambda y.\lambda xx}pero no podría resultar enλy.λincógnita.y{\displaystyle \lambda y.\lambda xy}. 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 reemplazamosincógnita{\displaystyle x}cony{\displaystyle y}enλincógnita.λy.incógnita{\displaystyle \lambda x.\lambda yx}, obtenemosλy.λy.y{\displaystyle \lambda y.\lambda yy}, 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 escritomi[V:=R]{\displaystyle E[V:=R]}es el proceso de reemplazar todas las ocurrencias libres de la variableV{\displaystyle V}en la expresiónmi{\displaystyle E}con expresiónR{\displaystyle R}La 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 λ).

  • incógnita[incógnita:=norte]=norte{\displaystyle x[x:=N]=N} ; connorte{\displaystyle N}sustituido porincógnita{\displaystyle x},incógnita{\displaystyle x}se conviertenorte{\displaystyle N}
  • y[incógnita:=norte]=y{\displaystyle y[x:=N]=y}siincógnitay{\displaystyle x\neq y} ; connorte{\displaystyle N}sustituido porincógnita{\displaystyle x},y{\displaystyle y}(que no lo es)incógnita{\displaystyle x}) restosy{\displaystyle y}
  • (METRO1 METRO2)[incógnita:=norte]=(METRO1[incógnita:=norte])(METRO2[incógnita:=norte]){\displaystyle (M_{1}\ M_{2})[x:=N]=(M_{1}[x:=N])(M_{2}[x:=N])} ; la sustitución distribuye a ambos lados de una solicitud
  • (λincógnita.METRO)[incógnita:=norte]=λincógnita.METRO{\displaystyle (\lambda xM)[x:=N]=\lambda xM} Una variable ligada a una abstracción no es sustituible; sustituir dicha variable deja la abstracción inalterada.
  • (λy.METRO)[incógnita:=norte]=λy.(METRO[incógnita:=norte]){\displaystyle (\lambda yM)[x:=N]=\lambda y.(M[x:=N])}siincógnitay{\displaystyle x\neq y}yyFV(norte){\displaystyle y\notin FV(N)}; 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íday{\displaystyle y}es " fresco " para el término de sustituciónnorte{\displaystyle N}, lo que significa que no aparece entre las variables libres denorte.{\displaystyle N.}

Por ejemplo,(λincógnita.incógnita)[y:=y]=λincógnita.(incógnita[y:=y])=λincógnita.incógnita{\displaystyle (\lambda xx)[y:=y]=\lambda x.(x[y:=y])=\lambda xx}, y((λincógnita.y)incógnita)[incógnita:=y]=((λincógnita.y)[incógnita:=y])(incógnita[incógnita:=y])=(λincógnita.y)y{\displaystyle ((\lambda xy)x)[x:=y]=((\lambda xy)[x:=y])(x[x:=y])=(\lambda xy)y}.

La condición de frescura (que requiere quey{\displaystyle y}no está en las variables libres denorte{\displaystyle N}) es crucial para asegurar que la sustitución no cambie el significado de las funciones. La situación en la que se sustituyeincógnita{\displaystyle x}Se suponía que debía ser libre pero terminó siendo atado, una situación conocida como captura.incógnita{\displaystyle x}Para sustituir en una abstracción lambda, a veces es necesario convertir la expresión a α. Por ejemplo, esta sustitución(λincógnita.y)[y:=incógnita]λincógnita.(y[y:=incógnita])=λincógnita.incógnita{\displaystyle (\lambda xy)[y:=x]\neq \lambda x.(y[y:=x])=\lambda xx}es erróneo porque convertiría la función constante en una función.λincógnita.y{\displaystyle \lambda xy}en la identidadλincógnita.incógnita{\displaystyle \lambda xx}. La sustitución correcta consiste en renombrar la variable ligada utilizando la α-equivalencia, en este caso(λincógnita.y)[y:=incógnita]=(λz.y)[y:=incógnita]=λz.(y[y:=incógnita])=λz.incógnita{\displaystyle (\lambda x.y)[y:=x]=(\lambda z.y)[y:=x]=\lambda z.(y[y:=x])=\lambda z.x}.

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 de((λV.mi) mi){\displaystyle ((\lambda V.E)\ E')}esmi[V:=mi]{\displaystyle E[V:=E']}. La regla de reducción β establece que una aplicación de la forma(λincógnita.t)s{\displaystyle (\lambda x.t)s}se reduce al términot[incógnita:=s]{\displaystyle t[x:=s]}. La notación(λincógnita.t)st[incógnita:=s]{\displaystyle (\lambda x.t)s\to t[x:=s]}se utiliza para indicar que(λincógnita.t)s{\displaystyle (\lambda x.t)s}β-se reduce at[incógnita:=s]{\displaystyle t[x:=s]}La β-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 cadas{\displaystyle s},(λincógnita.incógnita)sincógnita[incógnita:=s]=s{\displaystyle (\lambda x.x)s\to x[x:=s]=s}Esto demuestra queλincógnita.incógnita{\displaystyle \lambda x.x}realmente es la identidad. De manera similar,(λincógnita.y)sy[incógnita:=s]=y{\displaystyle (\lambda x.y)s\to y[x:=s]=y}, lo cual demuestra queλincógnita.y{\displaystyle \lambda x.y}es una función constante. Suponiendo alguna codificación de2,7,×{\displaystyle 2,7,\times }, tenemos la siguiente β-reducción:((λnorte. norte×2) 7)7×2{\displaystyle ((\lambda n.\ n\times 2)\ 7)\rightarrow 7\times 2}.

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 ]

FV(y)BV(b)={}(λincógnita.b) y=b[incógnita:=y]{\displaystyle FV(y)\cap BV(b)=\{\}\to (\lambda x.b)\ y=b[x:=y]}

Se puede utilizar el cambio de nombre alfanumérico enb{\displaystyle b}cambiar el nombre de los nombres que están libres eny{\displaystyle y}pero limitado enb{\displaystyle b}, para cumplir con la condición previa para esta transformación. Ver ejemplo:

Si observamos más de cerca, las sustituciones clave son:

((λincógnita.z incógnita)(λy.z y))[z:=(incógnita y)](bloqueado - se capturará)((λa.z a)(λb.z b))[z:=(incógnita y)](permitido - no se permite la captura){\displaystyle {\begin{array}{r}((\lambda x.z\ x)(\lambda y.z\ y))[z:=(x\ y)]{\text{(blocked - will capture)}}\\((\lambda a.z\ a)(\lambda b.z\ b))[z:=(x\ y)]{\text{(allowed - no capture)}}\end{array}}}

En este ejemplo,

  1. En el β-redex,
    1. Las variables libres son,FV(incógnita y)={incógnita,y}{\displaystyle \operatorname {FV} (x\ y)=\{x,y\}}
    2. Las variables ligadas son,BV((λincógnita.z incógnita)(λy.z y))={incógnita,y}{\displaystyle \operatorname {BV} ((\lambda x.z\ x)(\lambda y.z\ y))=\{x,y\}}
  2. 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.
  3. 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.
    1. Las variables libres son,FV(incógnita y)={incógnita,y}{\displaystyle \operatorname {FV} (x\ y)=\{x,y\}}
    2. Las variables ligadas son,BV((λa.z a)(λb.z b))={a,b}{\displaystyle \operatorname {BV} ((\lambda a.z\ a)(\lambda b.z\ b))=\{a,b\}}
  4. La reducción β procedió entonces con el significado previsto.

reducción η

La reducción η ( reducción eta ) convierte deλincógnita.(Fincógnita){\displaystyle \lambda x.(fx)}aF{\displaystyle f}, dado queincógnita{\displaystyle x}no parece libre enF{\displaystyle f}El 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 λy.yincógnita{\displaystyle \lambda y.y\,x}no sustituido.

La η-reducción a menudo se combina con su inversa, la η-expansión, que convierte desdeF{\displaystyle f}aλincógnita.(Fincógnita){\displaystyle \lambda x.(fx)}, nuevamente dado queincógnita{\displaystyle x}no parece libre enF{\displaystyle f}Los 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Ω=(λincógnita.incógnitaincógnita)(λincógnita.incógnitaincógnita){\displaystyle \Omega =(\lambda x.xx)(\lambda x.xx)}. Aquí(λincógnita.incógnitaincógnita)(λincógnita.incógnitaincógnita)(incógnitaincógnita)[incógnita:=λincógnita.incógnitaincógnita]=(incógnita[incógnita:=λincógnita.incógnitaincógnita])(incógnita[incógnita:=λincógnita.incógnitaincógnita])=(λincógnita.incógnitaincógnita)(λincógnita.incógnitaincógnita){\displaystyle (\lambda x.xx)(\lambda x.xx)\to (xx)[x:=\lambda x.xx]=(x[x:=\lambda x.xx])(x[x:=\lambda x.xx])=(\lambda x.xx)(\lambda x.xx)}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 comoΩ{\displaystyle \Omega }y, por lo tanto, todos los términos bien tipificados en estos sistemas tienen una forma normal.

Notas

  1. Barendregt, Barendsen (2000) llama a esta forma
    • axioma β : (λx.M[x]) N = M[N] , reescrito como (λx.M) N = M[x  := N], "donde M[x  := N] denota la sustitución de N por cada ocurrencia de x en M". [ 3 ] : 7 También denotado M[N/x], "la sustitución de N por x en M". [ 11 ]

Referencias

  1. 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
  2. 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 ).
  3. 1 2 Barendregt, Henk ; Barendsen, Erik (marzo de 2000), Introducción al cálculo Lambda (PDF)
  4. 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
  5. 1 2 "Ejemplo de reglas de asociatividad" . Lambda-bound.com . Consultado el 18 de junio de 2012 .
  6. 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  
  7. "Ejemplo de regla de asociatividad" . Lambda-bound.com . Consultado el 18 de junio de 2012 .
  8. "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.
  9. 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 .
  10. Turbak, Franklyn; Gifford, David (2008), Design concepts in programming languages ​​, MIT press, p. 251, ISBN  978-0-262-20175-9
  11. sustitución explícita en el n Lab
  12. Luke Palmer (29 de diciembre de 2010) Haskell-cafe: ¿Cuál es la motivación para las reglas η?