Articulo de referencia

Cálculo lambda

La abstracción lambda descompuesta. λ {\displaystyle \lambda } indica el inicio de una función. incógnita {\displaystyle x} es el parámetro de entrada. METRO {\displaystyle M} e...

La abstracción lambda descompuesta.λ{\displaystyle \lambda }indica el inicio de una función.incógnita{\displaystyle x}es el parámetro de entrada.METRO{\displaystyle M}es el cuerpo, separado por un separador de puntos ".{\displaystyle .}" a partir del parámetro de entrada.

En lógica matemática , el cálculo lambda (también escrito como cálculo λ ) es un sistema formal para expresar la computación basado en la abstracción de funciones y su aplicación mediante la vinculación y sustitución de variables . El cálculo lambda sin tipos, tema de este artículo, es una máquina universal , es decir, un modelo de computación que puede utilizarse para simular cualquier máquina de Turing (y viceversa). Fue introducido por el matemático Alonzo Church en la década de 1930 como parte de su investigación sobre los fundamentos de las matemáticas . En 1936, Church encontró una formulación lógicamente consistente y la documentó en 1940.

Definición

El cálculo lambda consiste en un lenguaje de términos lambda , que se definen mediante una sintaxis formal, y un conjunto de reglas de transformación para manipular esos términos. En BNF , la sintaxis esmi::=incógnitaλincógnita.mimimi,{\displaystyle e::=x\mid \lambda x.e\mid e\,e,}donde las variables x , y , z abarcan un conjunto infinito de nombres. Los términos M , N , t , s , e , f abarcan todos los términos lambda. Esto corresponde a la siguiente definición inductiva :

  • Una variable x es un término lambda válido.
  • Una abstracción es un término lambda.(λincógnita.t){\displaystyle (\lambda x.t)}donde t es un término lambda, denominado cuerpo de la abstracción , y x es la variable de parámetro de la abstracción ,
  • Una aplicación es un término lambda.(ts){\displaystyle (t\,s)}donde t y s son términos lambda.

Un término lambda es sintácticamente válido si se puede obtener mediante la aplicación repetida de estas tres reglas. Para mayor comodidad, a menudo se pueden omitir los paréntesis al escribir un término lambda; consulte la definición de cálculo lambda, sección  Notación, para obtener más detalles.

Dentro de los términos lambda, cualquier ocurrencia de una variable que no sea un parámetro de algún λ que la encierre se dice que es libre . Cualquier ocurrencia libre deincógnita{\displaystyle x}en un términoMETRO{\displaystyle M}está limitado enλincógnita.METRO{\displaystyle \lambda x.M}. Cualquier ocurrencia libre de cualquier otra variable dentroMETRO{\displaystyle M}permanece libre enλincógnita.METRO{\displaystyle \lambda x.M}.

Por ejemplo, en el términoincógnitay{\displaystyle x\,y}, ambosincógnita{\displaystyle x}yy{\displaystyle y}ocurren gratis. En(λincógnita.incógnitay){\displaystyle (\lambda x.x\,y)},y{\displaystyle y}es gratis, peroincógnita{\displaystyle x}en el cuerpo (es decir, después del punto) no es libre y se dice que está ligado (al parámetro). Mientras quey{\displaystyle y}es gratis en(λincógnita.incógnitay){\displaystyle (\lambda x.x\,y)}, está encuadernado en(λy.λincógnita.incógnitay){\displaystyle (\lambda y.\lambda x.x\,y)}Hay dos ocurrencias deincógnita{\displaystyle x}en(λy.(λincógnita.incógnitay)incógnita){\displaystyle (\lambda y.(\lambda x.x\,y)\,x)}– uno está atado y el otro es libre.

FV(M) es el conjunto de variables libres de M , es decir, aquellas variables que aparecen libres en M al menos una vez. Se puede definir inductivamente de la siguiente manera:

  • FV(incógnita)={incógnita}{\displaystyle \operatorname {FV} (x)=\{x\}}
  • FV(METRO1METRO2)=FV(METRO1)FV(METRO2){\displaystyle \operatorname {FV} (M_{1}M_{2})=\operatorname {FV} (M_{1})\cup \operatorname {FV} (M_{2})}
  • FV(λincógnita.METRO)=FV(METRO){incógnita}{\displaystyle \operatorname {FV} (\lambda x.M)=\operatorname {FV} (M)\backslash \{x\}}

La notaciónMETRO[incógnita:=norte]{\displaystyle M[x:=N]}denota una sustitución que evita la captura : sustituir N por cada ocurrencia libre de x en M , evitando la captura de variables. [ a ] ​​Esta operación se define inductivamente de la siguiente manera:

  • incógnita[incógnita:=norte]=norte{\displaystyle x[x:=N]=N};y[incógnita:=norte]=y{\displaystyle y[x:=N]=y}siyincógnita{\displaystyle y\neq x}.
  • (METRO1METRO2)[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])}.
  • (λy.METRO)[incógnita:=norte]{\displaystyle (\lambda y.M)[x:=N]}tiene tres casos:
    • Siy=incógnita{\displaystyle y=x}, se convierte enλincógnita.METRO{\displaystyle \lambda x.M}(incógnita{\displaystyle x}está vinculado; sin cambios).
    • SiyFV(norte){\displaystyle y\notin FV(N)}, se convierte enλy.(METRO[incógnita:=norte]){\displaystyle \lambda y.(M[x:=N])}.
    • SiyFV(norte){\displaystyle y\in FV(N)}, primer α-cambio de nombreλy.METRO{\displaystyle \lambda y.M}aλy.METRO[y:=y]{\displaystyle \lambda y'.M[y:=y']}cony{\displaystyle y'}fresco para evitar colisiones de nombres , luego continúe como se indicó anteriormente. Se convierte enλy.METRO[y:=y][incógnita:=norte]{\displaystyle \lambda y'.M[y:=y'][x:=N]}conyFV(METRO)FV(norte){\displaystyle y'\notin \operatorname {FV} (M)\cup \operatorname {FV} (N)}.

Existen varias nociones de "equivalencia" y "reducción" que permiten reducir términos lambda a términos lambda equivalentes. [ 3 ]

  • La conversión α captura la intuición de que la elección particular de una variable ligada, en una abstracción, no suele importar. SiyFV(METRO){\displaystyle y\notin FV(M)}, entonces los términosλincógnita.METRO{\displaystyle \lambda x.M}yλy.METRO[incógnita:=y]{\displaystyle \lambda y.M[x:=y]}se consideran alfa-equivalentes , escritosλincógnita.METROαλy.METRO[incógnita:=y]{\displaystyle \lambda x.M\equiv _{\alpha }\lambda y.M[x:=y]}. La relación de equivalencia es la relación de congruencia más pequeña sobre términos lambda generada por esta regla. Por ejemplo,λincógnita.incógnita{\displaystyle \lambda x.x}yλy.y{\displaystyle \lambda y.y}son términos lambda alfa-equivalentes.
  • La regla de β-reducción establece que una β-redex, 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]}. [ b ] 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.
  • La conversión η expresa extensionalidad y convierte entreλincógnita.Fincógnita{\displaystyle \lambda x.fx}yF{\displaystyle f}cuando seaincógnita{\displaystyle x}no parece libre enF{\displaystyle f}. A menudo se omite en muchos tratamientos del cálculo lambda.

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, (λ x . M ) N es un β-redex que expresa la sustitución de N por x en M . La expresión a la que se reduce un redex se llama su reducto ; el reducto de (λ x . M ) N es M [ x  := N ].

Explicación y aplicaciones

El cálculo lambda es Turing completo , es decir, es un modelo universal de computación que puede usarse para simular cualquier máquina de Turing . [ 4 ] Su homónimo, la letra griega lambda (λ), se usa en expresiones lambda y términos lambda para denotar la vinculación de una variable en una función .

El cálculo lambda puede ser no tipado o tipado . En el cálculo lambda tipado, las funciones solo se pueden aplicar si son capaces de aceptar el "tipo" de datos de entrada. Los cálculos lambda tipados son estrictamente más débiles que el cálculo lambda no tipado, que es el tema principal de este artículo, en el sentido de que pueden expresar menos que el cálculo no tipado. Por otro lado, se pueden demostrar más cosas con cálculos lambda tipados. Por ejemplo, en el cálculo lambda simplemente tipado , es un teorema que toda estrategia de evaluación termina para cada término lambda simplemente tipado, [ 5 ] mientras que la evaluación de términos lambda no tipados no tiene por qué terminar (véase más adelante ). Una razón por la que existen muchos cálculos lambda tipados diferentes ha sido el deseo de hacer más (de lo que puede hacer el cálculo no tipado) sin renunciar a la capacidad de demostrar teoremas fuertes sobre el cálculo.

El cálculo lambda tiene aplicaciones en muchas áreas diferentes de las matemáticas , la filosofía , [ 6 ] la lingüística , [ 7 ] [ 8 ] y la informática . [ 9 ] [ 10 ] El cálculo lambda ha desempeñado un papel importante en el desarrollo de la teoría de los lenguajes de programación . Los lenguajes de programación funcional implementan el cálculo lambda. El cálculo lambda también es un tema de investigación actual en la teoría de categorías . [ 11 ]

Historia

El cálculo lambda fue introducido por el matemático Alonzo Church en la década de 1930 como parte de una investigación sobre los fundamentos de las matemáticas . [ 12 ] [ c ] Se demostró que el sistema original era lógicamente inconsistente en 1935 cuando Stephen Kleene y JB Rosser desarrollaron la paradoja de Kleene-Rosser . [ 13 ] [ 14 ]

Posteriormente, en 1936, Church aisló y publicó únicamente la parte relevante para la computación, lo que ahora se conoce como el cálculo lambda sin tipado. [ 15 ] En 1940, también introdujo un sistema computacionalmente más débil, pero lógicamente consistente, conocido como el cálculo lambda simplemente tipado . [ 16 ]

Hasta la década de 1960, cuando se aclaró su relación con los lenguajes de programación, el cálculo lambda era solo un formalismo. Gracias a las aplicaciones de Richard Montague y otros lingüistas en la semántica del lenguaje natural, el cálculo lambda ha comenzado a gozar de un lugar respetable tanto en la lingüística [ 17 ] como en la informática. [ 18 ]

Origen del símbolo λ

Existe cierta incertidumbre sobre el motivo por el cual Church utiliza la letra griega lambda (λ) como notación para la abstracción de funciones en el cálculo lambda, quizás en parte debido a explicaciones contradictorias del propio Church. Según Cardone y Hindley (2006):

Por cierto, ¿por qué Church eligió la notación "λ"? En [una carta inédita de 1964 a Harald Dickson] afirmó claramente que provenía de la notación "incógnita^{\displaystyle {\hat {x}}}" utilizado para la abstracción de clases por Whitehead y Russell , modificando primero "incógnita^{\displaystyle {\hat {x}}}" a "incógnita{\displaystyle \land x}" para distinguir la abstracción de funciones de la abstracción de clases, y luego cambiar "{\displaystyle \land }" a "λ para facilitar la impresión.

Este origen también se menciona en [Rosser, 1984, p. 338]. Por otro lado, en sus últimos años, Church comentó a dos personas que le preguntaron sobre el tema que la elección fue más bien accidental: se necesitaba un símbolo y, casualmente, se eligió λ.

Dana Scott también ha abordado esta cuestión en varias conferencias públicas. [ 19 ] Scott relata que una vez le planteó una pregunta sobre el origen del símbolo lambda al exalumno y yerno de Church, John W. Addison Jr., quien luego le escribió una postal a su suegro:

Estimado profesor Church,

Russell tenía el operador iota , Hilbert tenía el operador épsilon . ¿Por qué elegiste lambda como tu operador?

Según Scott, la respuesta de Church consistió simplemente en devolver la postal con la siguiente anotación: " eeny, meeny, miny, moe ".

Motivación

Las funciones computables son un concepto fundamental en informática y matemáticas. El cálculo lambda proporciona una semántica sencilla para la computación, útil para el estudio formal de sus propiedades. El cálculo lambda incorpora dos simplificaciones que hacen que su semántica sea simple. La primera simplificación es que el cálculo lambda trata las funciones "anónimamente"; no les da nombres explícitos. Por ejemplo, la función

sqarmi_smetro(incógnita,y)=incógnita2+y2{\displaystyle \operatorname {square\_sum} (x,y)=x^{2}+y^{2}}

puede reescribirse de forma anónima como

(incógnita,y)incógnita2+y2{\displaystyle (x,y)\mapsto x^{2}+y^{2}}

(que se lee como "una tupla de x e y se asigna aincógnita2+y2{\textstyle x^{2}+y^{2}}"). [ d ] De manera similar, la función

identificación(incógnita)=incógnita{\displaystyle \operatorname {id} (x)=x}

puede reescribirse de forma anónima como

incógnitaincógnita{\displaystyle x\mapsto x}

donde la entrada simplemente se mapea a sí misma. [ d ]

La segunda simplificación es que el cálculo lambda solo utiliza funciones de una sola entrada. Una función ordinaria que requiere dos entradas, por ejemplo,sqarmi_smetro{\textstyle \operatorname {square\_sum} }La función se puede reelaborar en una función equivalente que acepte una sola entrada y, como salida, devuelva otra función que, a su vez, acepte una sola entrada. Por ejemplo,

(incógnita,y)incógnita2+y2{\displaystyle (x,y)\mapsto x^{2}+y^{2}}

puede ser reelaborado en

incógnita(y(incógnita2+y2)){\displaystyle x\mapsto (y\mapsto (x^{2}+y^{2}))}

Este método, conocido como currificación , transforma una función que toma múltiples argumentos en una cadena de funciones, cada una con un solo argumento.

Aplicación funcional de lasqarmi_smetro{\textstyle \operatorname {square\_sum} }función para los argumentos (5, 2), produce inmediatamente

((incógnita,y)incógnita2+y2)(5,2){\textstyle ((x,y)\mapsto x^{2}+y^{2})(5,2)}
=52+22{\textstyle =5^{2}+2^{2}}
=29{\textstyle =29},

mientras que la evaluación de la versión currificada requiere un paso más

((incógnita(yincógnita2+y2))(5))(2){\textstyle {\Bigl (}{\bigl (}x\mapsto (y\mapsto x^{2}+y^{2}){\bigr )}(5){\Bigr )}(2)}
=(y52+y2)(2){\textstyle =(y\mapsto 5^{2}+y^{2})(2)}// la definición deincógnita{\displaystyle x}se ha utilizado con5{\displaystyle 5}en la expresión interna. Esto es como una β-reducción.
=52+22{\textstyle =5^{2}+2^{2}}// la definición dey{\displaystyle y}se ha utilizado con2{\displaystyle 2}. De nuevo, similar a la β-reducción.
=29{\textstyle =29}

para llegar al mismo resultado.

En el cálculo lambda, las funciones se consideran " valores de primera clase ", por lo que pueden usarse como entradas o devolverse como salidas de otras funciones. Por ejemplo, el término lambdaλincógnita.incógnita{\displaystyle \lambda x.x}representa la función identidad ,incógnitaincógnita{\displaystyle x\mapsto x}. Más,λincógnita.y{\displaystyle \lambda x.y}representa la función constanteincógnitay{\displaystyle x\mapsto y}, la función que siempre devuelvey{\displaystyle y}, independientemente de la entrada. Como ejemplo de una función que opera sobre funciones, la composición de funciones se puede definir comoλF.λgramo.λincógnita.(F(gramoincógnita)){\displaystyle \lambda f.\lambda g.\lambda x.(f(gx))}.

Formas normales y confluencia

Se puede demostrar que la β-reducción es confluente hasta la α-conversión (es decir, cuando dos formas normales se consideran iguales si es posible α-convertir una en la otra). Según el teorema de Church-Rosser , cualquier secuencia particular de pasos de reducción que comience desde un término lambda dado que finalmente termine producirá la misma β-forma normal . Sin embargo, el cálculo lambda sin tipo bajo la β-reducción como regla de reescritura no es ni fuertemente normalizador ni débilmente normalizador ; hay términos sin forma normal como Ω .

Considerando los términos individualmente, tanto los términos fuertemente normalizadores como los débilmente normalizadores poseen una forma normal única. Para los términos fuertemente normalizadores, cualquier estrategia de reducción garantiza la obtención de la forma normal, mientras que para los términos débilmente normalizadores, algunas estrategias de reducción pueden no lograr encontrarla.

Codificación de tipos de datos

El cálculo lambda básico puede utilizarse para modelar aritmética , booleanos, estructuras de datos y recursión, como se ilustra en las siguientes subsecciones i , ii , iii y § iv .

Aritmética en cálculo lambda

Hay varias formas posibles de definir los números naturales en el cálculo lambda, pero la más común son, con mucho, los numerales de Church , que se pueden definir de la siguiente manera:

0  := λ fx . x
1  := λ fx . f x
2  := λ fx . f ( f x )
3  := λ fx . f ( f ( f x ))

y así sucesivamente. O bien, utilizando una sintaxis alternativa que permita múltiples argumentos no currificados a una función:

0  := λ fx . x
1  := λ fx . f x
2  := λ fx . f ( f x )
3  := λ fx . f ( f ( f x ))

Un numeral de Church es una función de orden superior : toma una función f como argumento y devuelve otra función f como argumento. El numeral de Church n es una función que toma una función f como argumento y devuelve la n -ésima composición de f , es decir, la función f compuesta consigo misma n veces. Esto se denota como f ( n ) y es, de hecho, la n -ésima potencia de f (considerada como un operador); f (0) se define como la función identidad. La composición funcional es asociativa , por lo que tales composiciones repetidas de una sola función f obedecen dos leyes de exponentes : f ( m )f ( n ) = f ( m+n ) y ( f ( n ) ) ( m ) = f ( m*n ) , razón por la cual estos numerales se pueden usar para la aritmética. (En el cálculo lambda original de Church, el parámetro formal de una expresión lambda debía aparecer al menos una vez en el cuerpo de la función, lo que hacía imposible la definición anterior de 0 ).

Una forma de pensar en el numeral de Church n , que suele ser útil al analizar programas, es como una instrucción 'repetir n veces'. Por ejemplo, utilizando las funciones PAIR y NIL definidas a continuación, se puede definir una función que construye una lista ( enlazada ) de n elementos, todos iguales a x, repitiendo 'anteponer otro elemento x ' n veces, partiendo de una lista vacía. El término lambda

λ nx . n (PAR x ) NULO

crea, dado un numeral de Church n y algún x , una secuencia de n aplicaciones

PAR x (PAR x ...(PAR x NULO)...)

Variando lo que se repite y a qué argumento(s) se aplica esa función repetida, se pueden lograr muchísimos efectos diferentes.

Podemos definir una función sucesora, que toma un numeral de Church n y devuelve su sucesor n + 1 realizando una aplicación adicional de la función f que se le proporciona, donde ( nfx ) significa " n aplicaciones de f comenzando desde x ":

SUCC  := λ nfx . f ( n f x )

Debido a que la composición m -ésima de f compuesta con la composición n -ésima de f da la composición m + n -ésima de f , f ( m )f ( n ) = f ( m+n ) , la suma se puede definir como

MÁS  := λ mnfx . m f ( n f x )

PLUS puede considerarse una función que toma dos números naturales como argumentos y devuelve un número natural; se puede verificar que

MÁS 2 3

y

5

son expresiones lambda beta-equivalentes. Dado que sumar m a un número se puede lograr repitiendo la operación sucesora m veces, una definición alternativa es:

MÁS′  := λ mn . m SUCC n [ 20 ]

De manera similar, siguiendo ( f ( n ) ) ( m ) = f ( m*n ) , la multiplicación se puede definir como

MULT  := λ mnf . m ( n f ) [ 21 ]

Así, la multiplicación de los números de la Iglesia es simplemente su composición como funciones. Alternativamente

MULT′  := λ metronorte . metro (MÁS norte ) 0

ya que multiplicar m y n es lo mismo que sumar n repetidamente, m veces, comenzando desde cero.

La exponenciación, al ser la multiplicación repetida de un número por sí mismo, se traduce como una composición repetida de un numeral eclesiástico consigo mismo, como una función. Y la composición repetida es lo que son los numerales eclesiásticos .

POW  := λ bn . n b [ 1 ]

Alternativamente, también aquí,

POW′  := λ bnorte . n (MULTO b ) 1

Simplificando, se convierte en

POW′′  := λ bnf . nbf

pero esa es solo una versión eta-expandida de POW que ya tenemos, arriba.

La función predecesora , especificada por dos ecuaciones PRED (SUCC n ) = n y PRED 0 = 0 , es considerablemente más compleja. La fórmula

PRED  := λ nfx . nortegh . h ( g f )) (λ u . x ) (λ u . u )

se puede validar mostrando inductivamente que si T denota gh . h ( g f )) , entonces T ( n )u . x ) = (λ h . h ( f ( n −1) ( x ))) para n > 0 . A continuación se dan otras dos definiciones de PRED , una usando condicionales y la otra usando pares . Con la función predecesora, la resta es directa. Definiendo

SUB  := λ metronorte . norte PRED m ,

SUB m n produce mn cuando m > n y 0 en caso contrario.

Lógica y predicados

Por convención, las siguientes dos definiciones (conocidas como booleanos de Church) se utilizan para los valores booleanos VERDADERO y FALSO :

VERDADERO  := λ xy . x
FALSO  := λ xy . y

Entonces, con estos dos términos lambda, podemos definir algunos operadores lógicos (estas son solo posibles formulaciones; otras expresiones podrían ser igualmente correctas): [ 22 ]

Y  := λ pq . p q p
O  := λ pq . p p q
NO  := λ p . p FALSO VERDADERO
ENTONCES  := λ pab . pag

Ahora podemos calcular algunas funciones lógicas, por ejemplo:

Y VERDADERO FALSO
≡ (λ pq . p q p ) VERDADERO FALSO → β VERDADERO FALSO VERDADERO
≡ (λ xy . x ) FALSO VERDADERO → β FALSO

y vemos que AND TRUE FALSE es equivalente a FALSE .

Un predicado es una función que devuelve un valor booleano. El predicado más fundamental es ISZERO , que devuelve VERDADERO si su argumento es el numeral de la Iglesia 0 , pero FALSO si su argumento es cualquier otro numeral de la Iglesia:

ES CERO  := λ norte . nx .FALSO) VERDADERO

El siguiente predicado comprueba si el primer argumento es menor o igual que el segundo:

LEQ  := λ mn .ISZERO (SUB m n ) ,

y dado que m = n si LEQ m n y LEQ n m , es sencillo construir un predicado para la igualdad numérica.

La disponibilidad de predicados y la definición anterior de VERDADERO y FALSO hacen conveniente escribir expresiones "si-entonces-si no" en el cálculo lambda. Por ejemplo, la función predecesora se puede definir como:

PRED  := λ norte . ngk .ISZERO ( g 1) k (MÁS ( g k ) 1)) (λ v .0) 0

lo cual se puede verificar mostrando inductivamente que ngk .ISZERO ( g 1) k (PLUS ( g k ) 1)) (λ v .0) es la función add n − 1 para n > 0.

Pares

Un par (tupla de 2 elementos) encapsula dos valores y se representa mediante una abstracción que espera un manejador al que pasará dichos valores. FIRST devuelve el primer elemento del par y SECOND devuelve el segundo.

PAR  := λ xyf . f x y
PRIMERO  := λ p . pxy . x )
SEGUNDO  := λ p . pxy . y )

Una lista enlazada puede ser NIL, que representa la lista vacía, o un PAIR formado por un elemento (llamado cabeza ) y una lista más pequeña ( cola ). El predicado NULL devuelve TRUE para el valor NIL y FALSE para una lista no vacía.

NIL  := λ f .VERDADERO
NULO  := λ p . pxy .FALSO)

Alternativamente, con NIL := FALSE , la construcción ( lhtz . ... h ... t ...) _on_nil_) obvia la necesidad de una prueba NULL explícita: 

NIL  := λ xy . y
NULO  := λ l . lhtz .FALSO) VERDADERO

Como ejemplo del uso de pares, la función de desplazamiento e incremento que mapea ( m , n ) a ( n , n + 1) se puede definir como

Φ  := λ p .PAR (SEGUNDO p ) (SUCC (SEGUNDO p ))
Ψ  := λ fp .PAR (SEGUNDO p ) (f (SEGUNDO p ))

lo que nos permite ofrecer quizás la versión más transparente de la función predecesora:

PRED  := λ n .FIRST ( n (Ψ SUCC) (PAIR 0 0))
 = λ nfx .FIRST ( nf ) (PAIR xx ))

Sustituir las definiciones y simplificar la expresión resultante conduce a definiciones más concisas.

 = λ nfx . nrab . rb ( fb )) (λ ab . a ) xx
 = λ nfx . nrij . j ( rjf )) (λ ij . x ) II
 = λ nfx . nrij . i ( rjj )) (λ ij . x ) Si f
 = λ nfx . nri . i ( rf )) (λ i . x ) I

(donde I := λ x . x ), lo que evidentemente nos lleva de vuelta al original.  

Técnicas de programación adicionales

Existe un considerable conjunto de modismos de programación para el cálculo lambda. Muchos de ellos se desarrollaron originalmente en el contexto del uso del cálculo lambda como base para la semántica de los lenguajes de programación , utilizándolo efectivamente como un lenguaje de programación de bajo nivel . Dado que varios lenguajes de programación incluyen el cálculo lambda (o algo muy similar) como un fragmento, estas técnicas también se utilizan en la programación práctica, pero pueden percibirse como oscuras o ajenas.

Constantes con nombre

En el cálculo lambda, una biblioteca tomaría la forma de una colección de funciones definidas previamente, que como términos lambda son simplemente constantes particulares. El cálculo lambda puro no tiene el concepto de constantes con nombre, ya que todos los términos lambda atómicos son variables, pero se puede emular el tener constantes con nombre reservando una variable como nombre de la constante, usando abstracción para vincular esa variable en el cuerpo principal y aplicando esa abstracción a la definición prevista. Así, para usar f para significar N (algún término lambda explícito) en M (otro término lambda, el "programa principal"), se puede decir:

f . M ) N

Los autores suelen introducir azúcar sintáctico , como let , [ e ], para permitir escribir lo anterior en el orden más intuitivo.

Sea f = N en M

Al encadenar dichas definiciones, se puede escribir un "programa" de cálculo lambda como cero o más definiciones de funciones, seguidas de un término lambda que utiliza esas funciones y que constituye el cuerpo principal del programa.

Una restricción importante de esta construcción `let` es que el nombre `f` no puede ser referenciado en N , ya que N está fuera del alcance de la abstracción que vincula a `f` , que es M ; esto significa que no se puede escribir una definición de función recursiva con `let` . La construcción `letrec [ f ]` permitiría escribir definiciones de funciones recursivas, donde el alcance de la abstracción que vincula a `f` incluye tanto a N como a M. O bien , se podría utilizar la autoaplicación, similar a la que conduce al combinador Y.

Recursión y puntos fijos

La recursión se produce cuando una función se invoca a sí misma. ¿Qué valor representaría dicha función? Tendría que referirse a sí misma internamente, al igual que la definición se refiere a sí misma internamente. Si este valor se contuviera a sí mismo por valor, tendría que ser de tamaño infinito, lo cual es imposible. Otras notaciones, que admiten la recursión de forma nativa, superan este problema al referirse a la función por su nombre dentro de su definición. El cálculo lambda no puede expresar esto, ya que en él simplemente no hay nombres para los términos, solo nombres de argumentos, es decir, parámetros en abstracciones. Por lo tanto, una expresión lambda puede recibirse a sí misma como argumento y referirse a (una copia de) sí misma a través del nombre del parámetro correspondiente. Esto funcionará correctamente si, efectivamente, se llama a sí misma como argumento. Por ejemplo, x . x x ) E = ( EE ) expresará recursión cuando E sea una abstracción que aplica su parámetro a sí misma dentro de su cuerpo para expresar una llamada recursiva. Dado que este parámetro recibe E como su valor, su autoaplicación será la misma ( EE ) nuevamente.

Como ejemplo concreto, consideremos la función factorial F( n ) , definida recursivamente por

F( n ) = 1, si n = 0; de lo contrario n × F( n − 1) .

En la expresión lambda que representa esta función, se asume que un parámetro (normalmente el primero) recibe la propia expresión lambda como valor, de modo que llamarla con ella misma como primer argumento equivale a una llamada recursiva. Por lo tanto, para lograr la recursión, el argumento que se pretende que se autorreferencia (llamado s aquí, en alusión a "self" o "autoaplicable") siempre debe pasarse a sí mismo dentro del cuerpo de la función en un punto de llamada recursiva:

E  := λ s . λ n .(1, si n = 0; de lo contrario n × ( s s ( n −1)))
con ssn = F n = EE n para que se cumpla, entonces s = E y
F  := (λ x . x x ) E = EE

y tenemos

F = EE = λ n .(1, si n = 0; de lo contrario n × (EE ( n −1)))

Aquí ss se convierte en lo mismo (EE) dentro del resultado de la aplicación (EE) , y usar la misma función para una llamada es la definición de lo que es la recursión. La autoaplicación logra la replicación aquí, pasando la expresión lambda de la función a la siguiente invocación como un valor de argumento, haciéndola disponible para ser referenciada allí por el nombre del parámetro s para ser llamada a través de la autoaplicación s s , una y otra vez según sea necesario, recreando cada vez el término lambda F = EE .

La aplicación es un paso adicional, al igual que la búsqueda de nombres. Tiene el mismo efecto de retraso. En lugar de tener F dentro de sí mismo como un todo de antemano , retrasar su recreación hasta la siguiente llamada hace posible su existencia al tener dos términos lambda finitos E dentro de él que lo recrean sobre la marcha más adelante según sea necesario.

Este enfoque autoaplicativo lo resuelve, pero requiere reescribir cada llamada recursiva como una autoaplicación. Nos gustaría tener una solución genérica, sin necesidad de reescribir nada:

G  := λ r . λ n .(1, si n = 0; de lo contrario n × ( r ( n −1)))
con r x = F x = G r x para que se cumpla, entonces r = G r =: FIJAR G y
F  := FIX G donde FIX g = ( r donde r = g r ) = g (FIX g )
de modo que FIX G = G (FIX G) = (λ n .(1, si n = 0; de lo contrario n × ((FIX G) ( n −1))))

Dado un término lambda cuyo primer argumento representa una llamada recursiva (por ejemplo, G en este caso), el combinador de punto fijo FIX devolverá una expresión lambda autorreplicante que representa la función recursiva (en este caso, F ). No es necesario pasar explícitamente la función a sí misma en ningún momento, ya que la autorreplicación se configura de antemano, al crearse, para que se ejecute cada vez que se la llame. De este modo, la expresión lambda original (FIX G) se recrea internamente en el punto de llamada, logrando así la autorreferencia .

De hecho, existen muchas definiciones posibles para este operador FIX , siendo la más sencilla la siguiente:

Y  := λ g .(λ x . g ( x x )) (λ x . g ( x x ))

En el cálculo lambda, Y g es un punto fijo de g , ya que se expande a:

Y g
~> (λ h .(λ x . h ( x x )) (λ x . h ( x x ))) g
~> (λ x . g ( x x )) (λ x . g ( x x ))
~> g ((λ x . g ( x x )) (λ x . g ( x x )))
<~ g ( Y g )

Ahora, para realizar la llamada recursiva a la función factorial para un argumento n , simplemente llamaríamos ( Y G) n . Dado n = 4, por ejemplo, esto da como resultado:

( Y G) 4
~> G ( Y G) 4
~> (λ rn .(1, si n = 0; de lo contrario n × ( r ( n −1)))) ( Y G) 4
~> (λ n .(1, si n = 0; de lo contrario n × (( Y G) ( n −1)))) 4
~> 1, si 4 = 0; de lo contrario 4 × (( Y G) (4−1))
~> 4 × (G ( Y G) (4−1))
~> 4 × ((λ n .(1, si n = 0; de lo contrario n × (( Y G) ( n −1)))) (4−1))
~> 4 × (1, si 3 = 0; de lo contrario 3 × (( Y G) (3−1)))
~> 4 × (3 × (G ( Y G) (3−1)))
~> 4 × (3 × ((λ n .(1, si n = 0; de lo contrario n × (( Y G) ( n −1)))) (3−1)))
~> 4 × (3 × (1, si 2 = 0; de lo contrario 2 × (( Y G) (2−1))))
~> 4 × (3 × (2 × (G ( Y G) (2−1))))
~> 4 × (3 × (2 × ((λ n .(1, si n = 0; de lo contrario n × (( Y G) ( n −1)))) (2−1))))
~> 4 × (3 × (2 × (1, si 1 = 0; de lo contrario 1 × (( Y G) (1−1)))))
~> 4 × (3 × (2 × (1 × (G ( Y G) (1−1)))))
~> 4 × (3 × (2 × (1 × ((λ n .(1, si n = 0; de lo contrario n × (( Y G) ( n −1)))) (1−1)))))
~> 4 × (3 × (2 × (1 × (1, si 0 = 0; de lo contrario 0 × (( Y G) (0−1))))))
~> 4 × (3 × (2 × (1 × (1))))
~> 24

Toda función definida recursivamente puede considerarse un punto fijo de una función de orden superior (también conocida como funcional) que cierra la llamada recursiva con un argumento adicional. Por lo tanto, utilizando Y , toda función recursiva puede expresarse como una expresión lambda. En particular, ahora podemos definir con precisión los predicados de resta, multiplicación y comparación de números naturales mediante recursión.

Cuando el combinador Y se codifica directamente en un lenguaje de programación estricto , el orden de evaluación aplicativo utilizado en dichos lenguajes provocará un intento de expandir completamente la autoaplicación interna.(incógnitaincógnita){\displaystyle (xx)}prematuramente, causando desbordamiento de pila o, en caso de optimización de llamada de cola , bucles indefinidos. [ 24 ] Una variante retardada de Y, el combinador Z , puede usarse en dichos lenguajes. Tiene la autoaplicación interna oculta detrás de una abstracción adicional a través de la expansión eta , como(λv.incógnitaincógnitav){\displaystyle (\lambda v.xxv)}, evitando así su expansión prematura: [ 25 ]

Z=λF.(λincógnita.F(λv.incógnitaincógnitav)) (λincógnita.F(λv.incógnitaincógnitav)) .{\displaystyle Z=\lambda f.(\lambda x.f(\lambda v.xxv))\ (\lambda x.f(\lambda v.xxv))\ .}

Términos estándar

Ciertos términos tienen nombres comúnmente aceptados: [ 26 ] [ 27 ] [ 28 ]

Yo  := λ x . x
S  := λ xyz . x z ( y z )
K  := λ xy . x
B  := λ xyz . x ( y z )
C  := λ xyz . x z y
W  := λ xy . x y y
ω o Δ o U  := λ x . x x
Ω  := ω ω

I es la función identidad. SK y BCKW forman sistemas completos de cálculo combinatorio que pueden expresar cualquier término lambda; véase la siguiente sección . Ω es UU , el término más pequeño que no tiene forma normal. YI es otro de esos términos. Y es estándar y se define arriba , y también se puede definir como Y = BU(CBU) , de modo que Y g=g( Y g) . VERDADERO y FALSO definidos arriba se abrevian comúnmentecomo V y F.

eliminación de abstracción

Si N es un término lambda sin abstracción, pero que posiblemente contenga constantes con nombre ( combinadores), entonces existe un término lambda T(x, N) que es equivalente a λx · N pero carece de abstracción ( excepto como parte de las constantes con nombre, si estas se consideran no atómicas). Esto también puede verse como una anonimización de variables, ya que T ( x , N ) elimina todas las ocurrencias de x de N , al tiempo que permite que los valores de los argumentos se sustituyan en las posiciones donde N contiene una x . La función de conversión T se puede definir mediante:

T ( x , x ) := I 
T ( x , N ) := K N si x no es libre en N . 
T ( x , M N ) := S T ( x , M ) T ( x , N ) 

En cualquier caso, un término de la forma T ( x , N ) P se reduce haciendo que el combinador inicial I , K , o S tome el argumento P , tal como lo haría la β-reducción de x . N ) P . I devuelve ese argumento. K N descarta el argumento, tal como x . N ) lo hace cuando x no tiene ocurrencia libre en N . S pasa el argumento a ambos subtérminos de la aplicación, y luego aplica el resultado del primero al resultado del segundo, tal como x . MN ) P es lo mismo que ((λ x . M ) P ) ((λ x . N ) P ) .

Los combinadores B y C son similares a S , pero pasan el argumento a un solo subtérmino de una aplicación ( B al subtérmino "argumento" y C al subtérmino "función"), ahorrando así un K posterior si no hay ninguna ocurrencia de x en uno de los subtérminos. En comparación con B y C , el combinador S en realidad fusiona dos funcionalidades: reorganizar argumentos y duplicar un argumento para que pueda usarse en dos lugares. El combinador W solo hace esto último, dando como resultado el sistema B, C, K, W como una alternativa al cálculo de combinadores SKI .

cálculo lambda tipado

Un cálculo lambda tipado es un formalismo tipado que utiliza el símbolo lambda (λ{\displaystyle \lambda }) para denotar la abstracción de función anónima. En este contexto, los tipos suelen ser objetos de naturaleza sintáctica que se asignan a términos lambda; la naturaleza exacta de un tipo depende del cálculo considerado (véase Tipos de cálculos lambda tipados ). Desde cierto punto de vista, los cálculos lambda tipados pueden verse como refinamientos del cálculo lambda no tipado, pero desde otro punto de vista, también pueden considerarse la teoría más fundamental y el cálculo lambda no tipado un caso especial con un solo tipo. [ 29 ]

Los cálculos lambda tipados son fundamentales para los lenguajes de programación y constituyen la base de lenguajes de programación funcional tipados como ML y Haskell, y, de forma más indirecta, de lenguajes de programación imperativos tipados . Los cálculos lambda tipados desempeñan un papel importante en el diseño de sistemas de tipos para lenguajes de programación; en este caso, la tipabilidad suele reflejar propiedades deseables del programa, como por ejemplo, que el programa no provoque una violación de acceso a la memoria.

Los cálculos lambda tipados están estrechamente relacionados con la lógica matemática y la teoría de la demostración a través del isomorfismo de Curry-Howard y pueden considerarse como el lenguaje interno de las clases de categorías ; por ejemplo, el cálculo lambda tipado simplemente es el lenguaje de una categoría cartesiana cerrada (CCC). [ 30 ]

Estrategias de reducción

Que un término sea normalizable o no, y cuánto trabajo se necesita hacer para normalizarlo si lo es, depende en gran medida de la estrategia de reducción utilizada. Las estrategias comunes de reducción del cálculo lambda incluyen: [ 31 ] [ 32 ] [ 33 ]

Orden normal
El redex externo más a la izquierda se reduce primero. Es decir, siempre que sea posible, los argumentos se sustituyen en el cuerpo de una abstracción antes de su reducción. Si un término tiene una forma beta-normal, la reducción en orden normal siempre alcanzará dicha forma.
Orden de aplicación
La redex interna más a la izquierda se reduce primero. Como consecuencia, los argumentos de una función siempre se reducen antes de sustituirlos en la función. A diferencia de la reducción de orden normal, la reducción de orden aplicativa puede no encontrar la forma beta-normal de una expresión, incluso si existe dicha forma normal. Por ejemplo, el término(λincógnita.y(λz.(zz)λz.(zz))){\displaystyle (\;\lambda x.y\;\;(\lambda z.(zz)\;\lambda z.(zz))\;)}se reduce a sí mismo por orden aplicativo, mientras que el orden normal lo reduce a su forma beta-normal.y{\displaystyle y}.
Reducciones β completas
Cualquier redex puede reducirse en cualquier momento. Esto significa, esencialmente, la ausencia de una estrategia de reducción específica: en lo que respecta a la reducibilidad, "todo vale".

Las estrategias de reducción débiles no reducen bajo abstracciones lambda:

Llamar por valor
Similar al orden aplicativo, pero sin reducciones dentro de las abstracciones. Esto es similar al orden de evaluación de lenguajes estrictos como C: los argumentos de una función se evalúan antes de llamarla, y el cuerpo de la función no se evalúa ni siquiera parcialmente hasta que se sustituyen los argumentos.
Llamar por nombre
Como en el orden normal, pero no se realizan reducciones dentro de las abstracciones. Por ejemplo, λ x .(λ y . y ) x está en forma normal según esta estrategia, aunque contiene el redex y . y ) x .

Las estrategias de compartición reducen los cálculos que son "iguales" en paralelo:

Reducción óptima
Como en el orden habitual, pero los cálculos que tienen la misma etiqueta se reducen simultáneamente.
Llamar según sea necesario
Como se denomina por nombre (y por lo tanto débil), las aplicaciones de función que duplicarían términos en su lugar nombran el argumento. El argumento puede evaluarse "cuando sea necesario", momento en el que la vinculación del nombre se actualiza con el valor reducido. Esto puede ahorrar tiempo en comparación con la evaluación en orden normal.

Computabilidad

No existe ningún algoritmo que tome como entrada dos expresiones lambda cualesquiera y produzca VERDADERO o FALSO dependiendo de si una expresión se reduce a la otra. [ 15 ] Más precisamente, ninguna función computable puede decidir la cuestión. Históricamente, este fue el primer problema para el que se pudo demostrar la indecidibilidad. Como es habitual en este tipo de demostraciones, computable significa computable por cualquier modelo de computación que sea Turing completo . De hecho, la computabilidad puede definirse a través del cálculo lambda: una función F : NN de números naturales es una función computable si y solo si existe una expresión lambda f tal que para cada par de x , y en N , F ( x )= y si y solo si f x = β y , donde x e y son los numerales de Church correspondientes a x e y , respectivamente y = β significa equivalencia con β-reducción. Véase la tesis de Church-Turing para otros enfoques para definir la computabilidad y su equivalencia.  

La demostración de Church sobre la incomputabilidad reduce primero el problema a determinar si una expresión lambda dada tiene una forma normal . Luego, asume que este predicado es computable y, por lo tanto, puede expresarse en cálculo lambda. Partiendo de trabajos anteriores de Kleene y construyendo una numeración de Gödel para expresiones lambda, construye una expresión lambda e que sigue de cerca la demostración del primer teorema de incompletitud de Gödel . Si se aplica e a su propio número de Gödel, se produce una contradicción.

Complejidad

La noción de complejidad computacional para el cálculo lambda es un poco complicada, porque el costo de una β-reducción puede variar dependiendo de cómo se implemente. [ 34 ] Para ser precisos, uno debe encontrar de alguna manera la ubicación de todas las ocurrencias de la variable ligada V en la expresión E , lo que implica un costo de tiempo, o uno debe hacer un seguimiento de las ubicaciones de las variables libres de alguna manera, lo que implica un costo de espacio. Una búsqueda ingenua para las ubicaciones de V en E es O ( n ) en la longitud n de E . Las cadenas directoras fueron un enfoque temprano que intercambió este costo de tiempo por un uso de espacio cuadrático. [ 35 ] Más generalmente esto ha llevado al estudio de sistemas que usan sustitución explícita .

En 2014, se demostró que el número de pasos de β-reducción necesarios para reducir un término mediante una reducción de orden normal constituye un modelo de coste temporal razonable ; es decir, la reducción puede simularse en una máquina de Turing en un tiempo polinomialmente proporcional al número de pasos. [ 36 ] Este era un problema abierto de larga data, debido a la explosión de tamaño , la existencia de términos lambda que crecen exponencialmente en tamaño para cada β-reducción. El resultado sortea este problema trabajando con una representación compartida compacta. El resultado deja claro que la cantidad de espacio necesaria para evaluar un término lambda no es proporcional al tamaño del término durante la reducción. Actualmente se desconoce cuál sería una buena medida de la complejidad espacial. [ 37 ]

Un modelo irrazonable no significa necesariamente ineficiente. La reducción óptima reduce todos los cálculos con la misma etiqueta en un paso, evitando el trabajo duplicado, pero el número de pasos de β-reducción paralelos para reducir un término dado a la forma normal es aproximadamente lineal en el tamaño del término. Esto es demasiado pequeño para ser una medida de costo razonable, ya que cualquier máquina de Turing puede codificarse en el cálculo lambda en un tamaño linealmente proporcional al tamaño de la máquina de Turing. El verdadero costo de reducir términos lambda no se debe a la β-reducción en sí, sino más bien al manejo de la duplicación de redexes durante la β-reducción. [ 38 ] No se sabe si las implementaciones de reducción óptima son razonables cuando se miden con respecto a un modelo de costo razonable como el número de pasos leftmost-outmost a la forma normal, pero se ha demostrado para fragmentos del cálculo lambda que el algoritmo de reducción óptima es eficiente y tiene como máximo una sobrecarga cuadrática en comparación con leftmost-outmost. [ 37 ] Además, la implementación prototipo de reducción óptima de BOHM superó a Caml Light y Haskell en términos de lambda pura. [ 38 ]

Cálculo lambda y lenguajes de programación

Como lo señaló Peter Landin en su artículo de 1965 " Una correspondencia entre ALGOL 60 y la notación Lambda de Church ", [ 39 ] los lenguajes de programación procedimentales secuenciales pueden entenderse en términos del cálculo lambda, que proporciona los mecanismos básicos para la abstracción procedimental y la aplicación de procedimientos (subprogramas).

Funciones anónimas

Por ejemplo, en Python la función "square" se puede expresar como una expresión lambda de la siguiente manera:

( lambda x : x ** 2 )

El ejemplo anterior es una expresión que se evalúa como una función de primera clase. El símbolo lambdacrea una función anónima, dada una lista de nombres de parámetros ( xen este caso, solo el argumento ) y una expresión que se evalúa como el cuerpo de la función, x**2. Las funciones anónimas a veces se denominan expresiones lambda.

Pascal y muchos otros lenguajes imperativos han admitido desde hace tiempo el paso de subprogramas como argumentos a otros subprogramas mediante el mecanismo de punteros a funciones . Sin embargo, los punteros a funciones no son una condición suficiente para que las funciones sean tipos de datos de primera clase , ya que una función es un tipo de dato de primera clase si y solo si se pueden crear nuevas instancias de la función en tiempo de ejecución . Dicha creación de funciones en tiempo de ejecución es compatible con Smalltalk , JavaScript , Wolfram Language y, más recientemente, con Scala , Eiffel (como agentes), C# (como delegados) y C++11 , entre otros.

Paralelismo y concurrencia

La propiedad de Church-Rosser del cálculo lambda implica que la evaluación (reducción β) puede realizarse en cualquier orden , incluso en paralelo. Esto significa que diversas estrategias de evaluación no deterministas son relevantes. Sin embargo, el cálculo lambda no ofrece construcciones explícitas para el paralelismo . Se pueden añadir construcciones como los futuros al cálculo lambda. Se han desarrollado otros cálculos de procesos para describir la comunicación y la concurrencia.

Semántica

El hecho de que los términos del cálculo lambda actúen como funciones sobre otros términos del cálculo lambda, e incluso sobre sí mismos, generó interrogantes sobre la semántica del cálculo lambda. ¿Se podría asignar un significado sensato a los términos del cálculo lambda? La semántica natural consistía en encontrar un conjunto D isomorfo al espacio de funciones DD , de funciones sobre sí mismo. Sin embargo, no puede existir un D no trivial de este tipo , debido a restricciones de cardinalidad , ya que el conjunto de todas las funciones de D a D tiene mayor cardinalidad que D , a menos que D sea un conjunto unitario .

En la década de 1970, Dana Scott demostró que si solo se consideraban funciones continuas , se podía encontrar un conjunto o dominio D con la propiedad requerida, proporcionando así un modelo para el cálculo lambda. [ 40 ]

Este trabajo también sentó las bases de la semántica denotacional de los lenguajes de programación.

Variaciones y extensiones

Estas extensiones se encuentran en el cubo lambda :

Estos sistemas formales son extensiones del cálculo lambda que no están en el cubo lambda:

Estos sistemas formales son variaciones del cálculo lambda:

Estos sistemas formales están relacionados con el cálculo lambda:

  • Lógica combinatoria : una notación para la lógica matemática sin variables.
  • Cálculo combinatorio SKI : un sistema computacional basado en los combinadores S , K e I , equivalente al cálculo lambda, pero reducible sin sustituciones de variables.

Véase también

Notas

  1. "donde M[x := N] denota la sustitución de N por cada ocurrencia de x en M". [ 1 ] : 7 También se denota M[N/x], "la sustitución de N por x en M". [ 2 ]
  2. ^ Barendregt, Barendsen (2000) llaman a esta regla axioma β
  3. Para una historia completa, véase "Historia del cálculo lambda y la lógica combinatoria" de Cardone y Hindley (2006).
  4. 1 2{\displaystyle \mapsto }se pronuncia " maps to ".
  5. f . M ) N se puede pronunciar "que f sea N en M".
  6. Ariola y Blom [ 23 ] emplean 1) axiomas para un cálculo representacional usando grafos lambda cíclicos bien formados extendidos con letrec , para detectar árboles de desenrollamiento posiblemente infinitos; 2) el cálculo representacional con β-reducción de grafos lambda con ámbito constituye la extensión cíclica del cálculo lambda de Ariola/Blom; 3) Ariola/Blom razonan sobre lenguajes estrictos usando § llamada por valor , y lo comparan con el cálculo de Moggi y con el cálculo de Hasegawa. Conclusiones en la pág. 111. [ 23 ]

Referencias

Algunas partes de este artículo se basan en material de FOLDOC , utilizado con permiso .

  1. 1 2 Barendregt, Henk ; Barendsen, Erik (marzo de 2000), Introducción al cálculo Lambda (PDF)
  2. sustitución explícita en el n Lab
  3. 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 .
  4. Turing, Alan M. (diciembre de 1937). "Computabilidad y λ-definibilidad". The Journal of Symbolic Logic . 2 (4): 153– 163. doi : 10.2307/2268280 . JSTOR 2268280. S2CID 2317046 .  
  5. Tait, WW (agosto de 1967). " Interpretaciones intensionales de funcionales de tipo finito I" . The Journal of Symbolic Logic . 32 (2): 198– 212. doi : 10.2307/2271658 . ISSN 0022-4812 . JSTOR 2271658. S2CID 9569863 .   
  6. Coquand, Thierry (8 de febrero de 2006). Zalta, Edward N. (ed.). "Teoría de tipos" . La enciclopedia de filosofía de Stanford ( edición de verano de 2013) . Recuperado el 17 de noviembre de 2020 . 
  7. Moortgat, Michael (1988). Investigaciones categóricas: aspectos lógicos y lingüísticos del cálculo de Lambek . Foris Publications. ISBN 9789067653879.
  8. ^ Toque, Harry; Muskens, Reinhard, eds. (2008). Significado de Computación . Saltador. ISBN 978-1-4020-5957-5.
  9. Mitchell, John C. (2003). Conceptos en lenguajes de programación . Cambridge University Press. pág. 57. ISBN  978-0-521-78098-8..
  10. Chacón Sartori, Camilo (5 de diciembre de 2023). Introducción al cálculo lambda con Racket (Informe técnico). Archivado del original el 7 de diciembre de 2023.
  11. Pierce, Benjamin C. Teoría básica de categorías para científicos informáticos . pág. 53. 
  12. Church, Alonzo (1932). "Un conjunto de postulados para los fundamentos de la lógica". Anales de Matemáticas . Serie 2. 33 (2): 346– 366. doi : 10.2307/1968337 . JSTOR 1968337 . 
  13. Kleene, Stephen C. ; Rosser, JB (julio de 1935). "La inconsistencia de ciertas lógicas formales". The Annals of Mathematics . 36 (3): 630. doi : 10.2307/1968646 . JSTOR 1968646 . 
  14. Church, Alonzo (diciembre de 1942). "Reseña de Haskell B. Curry, The Inconsistency of Certain Formal Logics ". The Journal of Symbolic Logic . 7 (4): 170– 171. doi : 10.2307/2268117 . JSTOR 2268117 . 
  15. 1 2 Church, Alonzo (1936). "Un problema irresoluble de la teoría elemental de números". American Journal of Mathematics . 58 (2): 345– 363. doi : 10.2307/2371045 . JSTOR 2371045 . 
  16. Church, Alonzo (1940). " Una formulación de la teoría simple de tipos". Journal of Symbolic Logic . 5 (2): 56– 68. doi : 10.2307/2266170 . JSTOR 2266170. S2CID 15889861 .  
  17. Partee, BBH; ter Meulen, A. ; Wall, RE (1990). Métodos matemáticos en lingüística . Springer. ISBN 9789027722454Consultado el 29 de diciembre de 2016 .
  18. Alama, Jesse. Zalta, Edward N. (eds.). "El cálculo lambda" . La enciclopedia de filosofía de Stanford ( edición de verano de 2013) . Consultado el 17 de noviembre de 2020 . 
  19. Dana Scott, « Mirando hacia atrás; mirando hacia adelante », Charla invitada en el taller en honor al 85.º cumpleaños de Dana Scott y sus 50 años de teoría de dominios, 7-8 de julio, FLoC 2018 (charla del 7 de julio de 2018). El fragmento relevante comienza en el minuto 32:50 . (Véase también este extracto de una charla de mayo de 2016 en la Universidad de Birmingham, Reino Unido).
  20. Felleisen, Matthias; Flatt, Matthew (2006), Lenguajes de programación y cálculo lambda (PDF) , pág. 26, archivado del original (PDF) el 5 de febrero de 2009. Una nota (consultada en 2017) en la ubicación original sugiere que los autores consideran que la obra a la que se hace referencia originalmente ha sido reemplazada por un libro.
  21. 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  
  22. Bruce, Kim B. (2002). Fundamentos de los lenguajes orientados a objetos: tipos y semántica . MIT Press. pág. 151. ISBN  978-0-262-02523-2.
  23. 1 2 Zena M. Ariola y Stefan Blom, Proc. TACS '94 Sendai, Japón 1997 (1997) Cálculos lambda cíclicos 114 páginas.
  24. Bene, Adam (17 de agosto de 2017). "Combinadores de punto fijo en JavaScript" . Bene Studio . Medium . Consultado el 2 de agosto de 2020 .
  25. "CS 6110 S17 Lección 5. Recursión y combinadores de punto fijo" (PDF) . Universidad de Cornell . 4.1 Un combinador de punto fijo CBV.
  26. Ker, Andrew D. "Cálculo Lambda y Tipos" (PDF) . pág. 6. Consultado el 14 de enero de 2022 . 
  27. Dezani-Ciancaglini, Mariangiola; Ghilezan, Silvia (2014). "Precisión del subtipado en tipos de intersección y unión" (PDF) . Reescritura y cálculos lambda tipados . Lecture Notes in Computer Science. Vol. 8560. p. 196. doi : 10.1007/978-3-319-08918-8_14 . hdl : 2318/149874 . ISBN   978-3-319-08917-1Consultado el 14 de enero de 2022 .
  28. Forster, Yannick; Smolka, Gert (agosto de 2019). "Call-by-Value Lambda Calculus as a Model of Computation in Coq" (PDF) . Journal of Automated Reasoning . 63 (2): 393– 413. doi : 10.1007/s10817-018-9484-2 . S2CID 53087112. Recuperado el 14 de enero de 2022 . 
  29. Tipos y lenguajes de programación, pág. 273, Benjamin C. Pierce
  30. "Teorema de representación de Scott y la envoltura de Karoubi univalente" (PDF) . Dagstuhl Publishing . Consultado el 19 de mayo de 2026 .
  31. Pierce, Benjamin C. (2002). Tipos y lenguajes de programación . MIT Press . pág. 56. ISBN  0-262-16209-1.
  32. Sestoft, Peter (2002). "Demostración de la reducción del cálculo lambda" (PDF) . La esencia de la computación . Notas de clase en ciencias de la computación. Vol. 2566. págs. 420–435 . doi : 10.1007/3-540-36377-7_19 . ISBN   978-3-540-00326-7Consultado el 22 de agosto de 2022 .
  33. Biernacka, Małgorzata; Charatonik, Witold; Monótono, Tomasz (2022). Andrónico, junio; de Moura, Leonardo (eds.). El zoológico de las estrategias de reducción del cálculo Lambda y Coq (PDF) . Procedimientos internacionales de informática de Leibniz (LIPIcs). vol. 237. Schloss Dagstuhl – Leibniz-Zentrum für Informatik. págs. 7:1–7:19. doi : 10.4230/LIPIcs.ITP.2022.7 . ISBN   978-3-95977-252-5Consultado el 22 de agosto de 2022 .
  34. Frandsen, Gudmund Skovbjerg; Sturtivant, Carl (26 de agosto de 1991). "¿Cuál es una implementación eficiente del cálculo lambda?" . Lenguajes de programación funcional y arquitectura de computadoras: 5.ª Conferencia ACM. Cambridge, MA, EE. UU., 26-30 de agosto de 1991. Actas . Lecture Notes in Computer Science. Vol. 523. Springer-Verlag. págs. 289-312 . CiteSeerX 10.1.1.139.6913 . doi : 10.1007/3540543961_14 . ISBN    9783540543961.
  35. Sinot, F.-R. (2005). "Director Strings Revisited: A Generic Approach to the Efficient Representation of Free Variables in Higher-order Rewriting" (PDF) . Journal of Logic and Computation . 15 (2): 201– 218. doi : 10.1093/logcom/exi010 .
  36. Accattoli, Beniamino; Dal Lago, Ugo (14 de julio de 2014). "La reducción beta es invariante, en efecto". Actas de la Reunión Conjunta de la Vigésimo Tercera Conferencia Anual de la EACSL sobre Lógica en Ciencias de la Computación (CSL) y el Vigésimo Noveno Simposio Anual ACM/IEEE sobre Lógica en Ciencias de la Computación (LICS) . págs. 1–10 . arXiv : 1601.01233 . doi : 10.1145/2603088.2603105 . ISBN  9781450328869. S2CID 11485010 . 
  37. 1 2 Accattoli, Beniamino (octubre de 2018). "(In)eficiencia y modelos de costos razonables" . Electronic Notes in Theoretical Computer Science . 338 : 23–43 . doi : 10.1016/j.entcs.2018.10.003 .
  38. 1 2 Asperti, Andrea (16 de enero de 2017). "Sobre la reducción eficiente de términos lambda". arXiv : 1701.04240v1 [ cs.LO ].
  39. Landin, PJ (1965). "Una correspondencia entre ALGOL 60 y la notación Lambda de Church" . Communications of the ACM . 8 (2): 89– 101. doi : 10.1145/363744.363749 . S2CID 6505810 . 
  40. Scott, Dana (1993). "Una alternativa de teoría de tipos a ISWIM, CUCH, OWHY" (PDF) . Theoretical Computer Science . 121 ( 1–2 ): 411–440 . doi : 10.1016/0304-3975(93)90095-B . Recuperado el 1 de diciembre de 2022 .Escrito en 1969, circuló ampliamente como manuscrito inédito.

Lecturas adicionales

  • Abelson, Harold y Gerald Jay Sussman. Estructura e interpretación de programas informáticos . The MIT Press . ISBN 0-262-51087-1.
  • Barendregt, Hendrik Pieter Introducción al cálculo Lambda .
  • Barendregt, Hendrik Pieter, El impacto del cálculo lambda en la lógica y la informática . Boletín de lógica simbólica, volumen 3, número 2, junio de 1997.
  • Barendregt, Hendrik Pieter, El cálculo lambda sin tipos, págs. 1091-1132 del Manual de lógica matemática , North-Holland (1977) ISBN 0-7204-2285-X
  • Cardone, Felice y Hindley, J. Roger, 2006. Historia del cálculo lambda y la lógica combinatoria. Archivado el 6 de mayo de 2021 en Wayback Machine . En Gabbay y Woods (eds.), Manual de historia de la lógica , vol. 5. Elsevier.
  • Church, Alonzo, Un problema irresoluble de la teoría elemental de números , American Journal of Mathematics , 58 (1936), pp.  345–363. Este artículo contiene la demostración de que la equivalencia de expresiones lambda no es, en general, decidible.
  • Church, Alonzo (1941). Los cálculos de la conversión lambda . Princeton: Princeton University Press . Recuperado el 14 de abril de 2020 .( ISBN 978-0-691-08394-0)
  • Frink Jr., Orrin (1944). "Reseña: The Calculi of Lambda-Conversion de Alonzo Church" (PDF) . Boletín de la Sociedad Matemática Americana . 50 (3): 169– 172. doi : 10.1090/s0002-9904-1944-08090-7 .
  • Kleene, Stephen, Una teoría de los enteros positivos en lógica formal , American Journal of Mathematics , 57 (1935), pp.  153–173 y 219–244. Contiene las definiciones del cálculo lambda de varias funciones conocidas.
  • Landin, Peter , «Una correspondencia entre ALGOL 60 y la notación lambda de Church» , Communications of the ACM , vol. 8, n.º 2 (1965), páginas 89-101. Disponible en el sitio web de la ACM . Un artículo clásico que destaca la importancia del cálculo lambda como base para los lenguajes de programación.
  • Larson, Jim, Introducción al cálculo lambda y Scheme . Una introducción sencilla para programadores.
  • Michaelson, Greg (10 de abril de 2013). Introducción a la programación funcional mediante el cálculo lambda . Courier Corporation. ISBN 978-0-486-28029-5.[ 1 ]
  • Schalk, A. y Simmons, H. (2005) Introducción al cálculo lambda y a la aritmética con una buena selección de ejercicios . Apuntes para un curso de la maestría en lógica matemática en la Universidad de Manchester.
  • de Queiroz, Ruy JGB (2008). "Sobre las reglas de reducción, el significado como uso y la semántica de la teoría de la demostración". Studia Logica . 90 (2): 211– 247. doi : 10.1007/s11225-008-9150-5 . S2CID 11321602 . Un artículo que proporciona una base formal a la idea de que "el significado es uso", la cual, aunque se basa en demostraciones, es diferente de la semántica de la teoría de la demostración como en la tradición de Dummett-Prawitz, ya que toma la reducción como las reglas que dan significado.
  • Hankin, Chris, Introducción al cálculo lambda para científicos informáticos, ISBN 0954300653
Monografías/libros de texto para estudiantes de posgrado
  • Sørensen, Morten Heine y Urzyczyn, Paweł (2006), Lecciones sobre el isomorfismo de Curry-Howard , Elsevier, ISBN 0-444-52077-5Es una monografía reciente que abarca los principales temas del cálculo lambda, desde la variante sin tipos hasta la mayoría de los cálculos lambda tipados , incluyendo desarrollos más recientes como los sistemas de tipos puros y el cubo lambda . No incluye extensiones de subtipos .
  • Pierce, Benjamin (2002), Tipos y lenguajes de programación , MIT Press, ISBN 0-262-16209-1El libro abarca el cálculo lambda desde la perspectiva de un sistema de tipos práctico; algunos temas, como los tipos dependientes, solo se mencionan, pero el subtipado es un tema importante.
Documentos
  • Una breve introducción al cálculo lambda ( PDF ) por Achim Jung
  • Cronología del cálculo lambda - ( PDF ) por Dana Scott
  • Introducción al cálculo lambda ( PDF ) por Raúl Rojas
  • Apuntes de clase sobre el cálculo lambda ( PDF ) por Peter Selinger
  • Cálculo lambda gráfico de Marius Buliga
  • El libro "Cálculo Lambda como Modelo de Flujo de Trabajo" de Peter Kelly, Paul Coddington y Andrew Wendelborn menciona la reducción de grafos como un método común para evaluar expresiones lambda y analiza la aplicabilidad del cálculo lambda para la computación distribuida (debido a la propiedad de Church-Rosser , que permite la reducción paralela de grafos para expresiones lambda).
  • Graham Hutton, Cálculo Lambda , un breve vídeo (12 minutos) de Computerphile sobre el cálculo lambda.
  • Helmut Brandl, Introducción paso a paso al cálculo lambda
  • "Cálculo lambda" , Enciclopedia de Matemáticas , EMS Press , 2001 [1994]
  • David C. Keenan, Diseccionar un ruiseñor: una notación gráfica para el cálculo lambda con reducción animada
  • L. Allison, Algunos ejemplos ejecutables de cálculo λ
  • Georg P. Loczewski, El cálculo lambda y A++
  • Bret Victor, Huevos de caimán: Un juego de rompecabezas basado en el cálculo lambda
  • LCI Lambda Interpreter: un intérprete de cálculo puro sencillo pero potente.
  • Enlaces sobre cálculo lambda en Lambda-the-Ultimate
  • Mike Thyer, Lambda Animator , un miniaplicativo gráfico de Java que demuestra estrategias de reducción alternativas.
  • Implementación del cálculo lambda mediante plantillas de C++
  • Shane Steinert-Threlkeld, "Lambda Calculi" , Enciclopedia de Filosofía de Internet
  • Anton Salikhmetov, Cálculo macro lambda
  1. "Página web de Greg Michaelson" . Ciencias matemáticas e informáticas . Riccarton, Edimburgo: Universidad Heriot-Watt . Consultado el 6 de noviembre de 2022 .