tortolero. .calculo.lambda

40
El cálculo lambda de Alonso Church y la noción de computabilidad El cálculo lambda, pensado originalmente para facilitar la fundamentación de la aritmética, es una notación especial para representar funciones. Antes de que Church hiciera su presentación, ya varios lógicos venían emprendiendo investigaciones que iban conduciendo a resultados similares. Schönfinkel (1924) desarrolló una teoría de funciones con el objeto de reducir el número de primitivas en un sistema lógico como el presentado por Russell y Whitehead (1910 - 1913). En el sistema de Schönfinkel, que llamó Funktionenkalkül (cálculo de funciones, en español), sólo hay una operación para formar términos complejos, que se escribe « fx», representa la aplicación de una función f a un argumento x, y se define para todos los términos. Para trabajar con funciones de más de un argumento, Schönfinkel empleó un método ya usado por Frege (1891), para reducir funciones de más de un argumento a funciones de un argumento. Este método supone ampliar la idea de función para que las funciones puedan ser argumentos y valores de otras. Entonces, es posible pasar el valor de cada función g para algún argumento x, como argumento a otra función f . Para esto, se usa una notación donde es común escribir «fxyz» para «(( fx)y)z». Si Fxy es una función F de dos argumentos x e y , se reemplaza por una función f de un argumento tal que f a es la función de y dada por Fa y, y f ab es F ab. Por ejemplo, si Fxy es x y, entonces f 2 = 2 – y , y f 2 3 = 2 – 3 = – 1. Esta operación que permite eliminar funciones de diverso número de variables se llama aplicación. Schönfinkel introdujo varios operadores para representar la aplicación de una función a sus argumentos y los llamó combinadores , porque forman combinaciones como funciones de las variables que contienen. Schönfinkel introdujo cinco combinadores: I, C, T, Z, S (que luego fueron formulados en la lógica combinatoria de Curry (1967) como respectivamente:

Upload: numa-eduardo-tortolero

Post on 23-Oct-2015

41 views

Category:

Documents


1 download

DESCRIPTION

Ensayo sobre el cálculo lambda de Alonzo Church, en su versión original sin tipos y en su versión con tipos.

TRANSCRIPT

El cálculo lambda de Alonso Church y la noción de computabilidad

El cálculo lambda, pensado originalmente para facilitar la fundamentación de la aritmética, es

una notación especial para representar funciones. Antes de que Church hiciera su presentación,

ya varios lógicos venían emprendiendo investigaciones que iban conduciendo a resultados

similares.

Schönfinkel (1924) desarrolló una teoría de funciones con el objeto de reducir el número de

primitivas en un sistema lógico como el presentado por Russell y Whitehead (1910 - 1913). En el

sistema de Schönfinkel, que llamó Funktionenkalkül (cálculo de funciones, en español), sólo hay

una operación para formar términos complejos, que se escribe «fx», representa la aplicación de

una función f a un argumento x, y se define para todos los términos. Para trabajar con funciones

de más de un argumento, Schönfinkel empleó un método ya usado por Frege (1891), para reducir

funciones de más de un argumento a funciones de un argumento. Este método supone ampliar la

idea de función para que las funciones puedan ser argumentos y valores de otras. Entonces, es

posible pasar el valor de cada función g para algún argumento x, como argumento a otra función

f. Para esto, se usa una notación donde es común escribir «fxyz» para «((fx)y)z». Si Fxy es una

función F de dos argumentos x e y, se reemplaza por una función f de un argumento tal que fa es

la función de y dada por Fay, y fab es Fab. Por ejemplo, si Fxy es x – y, entonces f 2 = 2 – y, y f

2 3 = 2 – 3 = – 1. Esta operación que permite eliminar funciones de diverso número de variables

se llama aplicación. Schönfinkel introdujo varios operadores para representar la aplicación de

una función a sus argumentos y los llamó combinadores, porque forman combinaciones como

funciones de las variables que contienen. Schönfinkel introdujo cinco combinadores: I, C, T, Z, S

(que luego fueron formulados en la lógica combinatoria de Curry (1967) como respectivamente:

I, K, C, B, S) y mostró que las fórmulas lógicas podían expresarse sin variables por medio de S

y K (S y K en el sistema de Curry).

A finales de la década de 1920, Haskell B. Curry, como él mismo lo comenta en Curry (1967,

pags. 20 – 21), realizó investigaciones que lo llevaron a lo que en esencia sería el mismo sistema

de Schönfinkel: leyendo los Principia de Whitehead y Russell, notó que en la lógica

proposicional habían dos reglas, el modus ponens, que era muy simple en su estructura formal, y

una regla de sustitución de cualquier fórmula por una variable proposicional, que era compleja.

Seldin (1998a) afirma que a mediados de 1920, Curry decidió tratar de dividir esta regla de

sustitución en reglas más simples y, luego, en 1926 encontró que podía hacerlo con un

formalismo que en esencia era el mismo que el de Schönfinkel, y lo llamó lógica combinatoria.

Al método de tratar funciones de más de un argumento en términos de funciones de un

argumento, usado por Frege y que Curry tomó de Schönfinkel, se le llamó

“curryng” (currificación), en honor al trabajo realizado por Curry.

De forma independiente y casi simultáneamente al trabajo de Curry, Alonzo Church se propuso

construir una modificación del sistema de Frege en la que se evitara el uso de variables libres.

Según Seldin (1998a), una de sus metas fue que toda combinación de símbolos perteneciente a

nuestro sistema, si representa una proposición, representara también una proposición particular

sin ambigüedad y sin la adición de explicaciones verbales. También propuso evitar paradojas de

la teoría de conjuntos y de la lógica restringiendo la ley del tercero excluido, siguiendo en esta

restricción a la tendencia intuicionista de Brouwer. Church adoptó el tratamiento de funciones de

Frege, que ya hemos mencionado, como la estrategia de formación básica de este sistema, en el

sentido de que los términos fueran formados a partir de variables usando dos operaciones:

(1) Aplicación: denotada por «MN», como en los trabajos de Schönfinkel y Curry, que

representa la aplicación de una función M a un argumento N y que está definida para

cualesquiera dos términos M y N

(2) Abstracción: denotada por «λx.M» y definida en el sistema original de Church para

cualquier término M y para cualquier variable x que aparezca libre en M.

El sistema de Church también contenía la implicación. Las reglas de inferencia de Church eran

dos: la regla α y la regla β. La regla α permitía la sustitución de variables: los términos que

difieren sólo en los nombres de sus variables ligadas están identificados en el nivel sintáctico, de

manera que:

λx.x = λy.y.

Las variables ligadas son aquellas sobre las que actúa el operador λ; por ejemplo, en λx.xy, x es

una variable ligada e y una variable libre. La regla β era empleada para el cálculo de valores de

una función:

(λx.M)N puede ser reemplazada por el resultado de sustituir x por N en M.

Como en Curry, en el sistema de Church las conectivas lógicas pueden ser reemplazadas por

constantes atómicas.

Como resultado de la definición de las operaciones de aplicación y abstracción, tenemos que la

teoría de Church también tenía combinadores y, por tanto, coincidía en muchos aspectos con las

investigaciones de Schönfinkel y Curry. La relación exacta entre las teorías de Curry y la de

Church quedó establecida por Rosser (1935), un discípulo de Church, en su trabajo de tesis, A

Mathematical Logic without variables. Para establecer esta relación, Rosser construyó una teoría

de combinadores que era equivalente a la de Church. Luego mostró que una teoría reforzada de

la conversión lambda, que es el proceso de transformar fórmulas del sistema de Church por la

aplicación de sus reglas de inferencia, es equivalente a la teoría sintética de Curry. Desde

entonces quedó claro que una teoría de combinadores puede ser expresada como una teoría de la

conversión lambda y viceversa, como ratifica Curry (1967, pag. 28). Podemos coincidir entonces

con Feys y Fitch (1980, pag. 90) cuando afirman que el cálculo lambda pertenece a la lógica

combinatoria, entendida ésta como el estudio de los procesos de aplicación y de abstracción de

funciones.

Church (1936) demostró luego, basándose en un teorema sobre las propiedades del cálculo

lambda, que siempre que consideremos un sistema equivalente a la lógica de predicados de

primer orden, tomado en su totalidad, es imposible resolver el problema de la decisión. Como

resultado de un trabajo de representación de la aritmética en el sistema original de Church,

Kleene (1936), discípulo de Church, descubrió una gran cantidad funciones que pueden ser

representadas por términos lambda. Puesto que un término lambda que representa una función

calcula sus valores usando un procedimiento mecánico (reducción aplicando la regla β),

cualquier función que pueda ser representada por un término lambda debería ser efectivamente

calculable, es decir, calculable siguiendo un procedimiento mecánico. Estos resultados llevaron

a Church a la conjetura de que las funciones efectivamente computables de números naturales

pueden ser representadas por términos lambda. Esta conjetura es el origen de la famosa Tesis de

Church, publicada en Church (1936) en el marco de su demostración de que hay problemas

irresolubles de la teoría elemental de números. La forma más usual de esta tesis es que todas las

funciones efectivamente computables son recursivas parciales, y es una consecuencia de una

prueba en Kleene (1936) de que una función es recursiva si, y sólo si, puede ser representada por

un término lambda.

Para su demostración, Church (1936) plantea el problema de la decisión en términos del

problema de los invariantes de conversión, que grosso modo puede ser planteado de la siguiente

manera: dadas dos fórmulas cualesquiera Y1 e Y2 de un sistema como el cálculo lambda ¿es

posible determinar de manera efectiva si Y1 se puede convertir Y2 o no? La respuesta positiva a

esta cuestión nos daría un procedimiento efectivo para determinar un sistema completo de

invariantes de conversión, es decir, un sistema de fórmulas que permanecen invariantes respecto

de toda conversión. Sin embargo, Church concluye que no existe un sistema completo de

invariantes de conversión que sea efectivamente calculable. Para ello comienza aplicando el

método de aritmetización de Gödel (1931) al cálculo de conversión lambda. Este método permite

realizar una codificación que asocia a cada fórmula bien construida de un sistema formal un

número, llamado número de Gödel, de manera tal que dos expresiones bien formadas no pueden

tener asociado el mismo número. Luego identifica la noción de calculabilidad efectiva con la

noción de función recursiva general:

[…] esta definición de calculabilidad efectiva puede ser establecida en dos maneras

equivalentes, (1) que una función de enteros positivos será efectivamente calculable si es

definible en el cálculo lambda […], (2) que una función de enteros positivos será llamada

calculable efectivamente si es recursiva (Church, 1936, pag. 347).

Al hacer equivalentes las funciones calculables efectivamente con las funciones recursivas,

Church podrá vincular la recursión con el problema de la decisión: para cualquier función

recursiva de enteros positivos hay un algoritmo con el cual cualquier valor particular requerido

de la función puede calcularse efectivamente (Church, 1936, pag. 351). Define algoritmo como:

un método por el cual, dado cualquier número entero n, puede obtenerse una secuencia de

expresiones (en alguna notación) En1, En2, … Enr; donde En1 es efectivamente calculable

cuando se da n; donde Eni es efectivamente calculable cuando se dan n y las expresiones

Enj , j < i; y donde, cuando se dan n y todas las expresiones Eni hasta incluir Enr, el hecho

de que el algoritmo haya terminado llega a conocerse efectivamente y el valor de F(n) es

calculable efectivamente (Church, 1936, pag. 356).

Church (1936, pag. 351) define una función recursiva proposicional de enteros como una

función recursiva cuyo valor es 2 o 1 dependiendo de si la función proposicional es verdadera o

falsa. Entonces plantea el problema siguiente: hallar una función recursiva F de dos argumentos

tal que de F Y1 Y2 (donde Y1 Y2 son los números de Gödel correspondientes a los términos Y1 e

Y2 respectivamente) sea 2 o 1 según que Y1 sea convertible en Y2 o no. Este problema es

equivalente al de encontrar una función recursiva G de un argumento que dependa del número de

Gödel de una fórmula Y3, tal que el valor de G Y3 sea 2 o 1 según que Y3 tenga una fórmula

normal o no. Una fórmula del cálculo lambda tiene forma normal si es una fórmula bien formada

y no contiene ninguna parte de la forma λx(M)N y B es la forma normal de A si B está en forma

normal y A es convertible en el cálculo lambda a B. Cuando un término está en forma normal, no

se le puede aplicar la reducción β.

Finalmente Church demuestra el teorema siguiente, el teorema XIII del artículo:

Dada una fórmula Y1, no existe función recursiva G de un argumento tal que el valor de

G Y1 sea 2 o 1, según que Y1 tenga una forma normal (Church, 1936, pag. 360).

Es decir, la propiedad de ser una fórmula en forma normal no es recursiva. De lo que se sigue el

teorema XIX del artículo:

No hay función recursiva de dos fórmulas Y1 e Y2, cuyo valor es 2 o 1 de acuerdo a si Y1

es convertible en Y2 (Church, 1936, pag. 363)

Como corolario a este teorema, Church establece que el Entscheidungproblem es irresoluble en

un sistema formal que sea ω-coherente1 en sentido fuerte y que permita ciertos procedimientos

simples de definición y demostración, como el sistema de Principia Mathematica:

En un sistema como éste, sería expresable la proposición acerca de dos enteros positivos

a y b que son representaciones gödelianas (números de Gödel) de fórmulas A y B tal que

A es inmediatamente convertible en B. Ya que la conversión en el cálculo lambda es una

secuencia finita de conversiones β intermedias inmediatas, la proposición ψ(a, b)

expresaría que a y b son representaciones gödelianas de fórmulas A y B tal que A es

convertible en B. Además si A es convertible en B y a y b son representaciones

gödelianas de fórmulas A y B respectivamente, la proposición ψ(a, b) podrá ser

demostrada en el sistema, a través de una prueba que afirma exhibir, en términos de

representaciones gödelianas, una secuencia finita particular de conversiones inmediatas

1 Supongamos que Λn es una variable sintáctica para expresiones de n-ésimo tipo y expresiones correspondientes a propiedades del n-ésimo tipo; Θ es una variable sintáctica para variables individuales; ΛK es una variable para proposiciones indecididibles cuya existencia es demostrada gracias a la teoría de predicados de Kleene. Un sistema formal L de segundo orden que incluye constantes individuales que corresponden a enteros, es ω-coherente en sentido fuerte si para todo predicado Λ2 [predicado de orden 2] de L se da que: si las proposiciones (E Θ) Λ2 (Θ) [Existe algún individuo Θ, tal que tiene la propiedad de segundo tipo Λ] es derivable en L, al menos una de las proposiciones ~ Λ2K [El predicado de segundo tipo Λ indecidible en el sistema de Kleene] no es derivable en L.

que conduce de A a B; y si A no es convertible en B, la ω-consistencia del sistema

significará que ψ(a, b) no es demostrable en él. Si el problema de la decisión para el

sistema fuera resoluble, habría medios para determinar efectivamente si cualquier

proposición ψ(a, b) se puede demostrar y, por lo tanto, habría algún medio para

determinar efectivamente para todo par de fórmulas A y B si A es convertible en B, lo que

estaría en contradicción con el teorema XIX 2 (Church 1936, pag. 363).

De esta manera Church prueba que hay clases de la forma P(n) para cada número natural n tal

que no hay un algoritmo general que, dado n, produzca una solución para P(n). No hay pues

algoritmo que decida si una formula dada del cálculo de predicados de primer orden es un

teorema, un resultado que coincide con los de Turing (1936).

Ya hemos comentado que Turing (1937), demostró que una función numérica puede ser

computada por una máquina de Turing si y sólo si es recursiva parcial. También Turing demostró

que las funciones computables por una máquina de Turing son idénticas a las funciones lambda-

definibles de Church y a las funciones recursivas generales debidas a Herbrand y Gödel y

desarrolladas por Kleene. Estos resultados le permitieron a Turing (1937) afirmar la posibilidad

de reemplazar las 'máquinas' que generan funciones computables por definiciones “más

convenientes” en el cálculo lambda. Podemos entonces pensar que la definibilidad lambda

representa una manera particular de definir la computabilidad que, como hemos visto, tiene un

fundamento aún más abstracto que el de Turing: una operación matemática precisamente

llamada “abstracción”.

2 El teorema XIX, que ya hemos citado arriba, dice textualmente: No hay función recursiva de dos fórmulas A y B cuyo valor es 2 o 1 de acuerdo a si A es convertibe en B o no. Dado que una función recursiva suministra un procedimiento efectivo, este teorema plantea que no es posible dar un procedimiento efectivo para decidir si una fórmula A es convertible en otra B.

Maquinas de Turing y cálculo lambda

Turing y Church, casi simultáneamente e independientemente uno de otro, demostraron que

cualquier operación computable por una máquina de Turing puede expresarse usando

expresiones del cálculo lambda de Church, y viceversa.

Kleene (1936) llegó a los siguientes resultados:

1. Toda función recursiva primitiva es recursivamente general.

2. Toda función recursiva general es lambda-definible

3. Toda función lambda-definible, definida para todos los sistemas de sus valores de sus

argumentos, es recursiva general.

Basado en teorema de Kleene (1938) sobre recursividad parcial, Church enunció la tesis

siguiente:

Toda función parcialmente recursiva es lambda-definible y viceversa.

Turing (1937) estableció

1. Toda función lambda-definible es computable.

2. Toda función computable es recursiva general.

Por consiguiente, las siguientes nociones son equivalentes:

(a) Función recursiva general.

(b) Función computable.

(c) Función lambda-definible, para todos los sistemas de valores de sus argumentos.

También se da la equivalencia entre:

(a) Función parcialmente recursiva.

(b) Función lambda-definible (sin restricción).

De acuerdo a la tesis de Church, la clase de las funciones recursivas parciales pueden ser

computadas por cualquier dispositivo que ejecute procesos algorítmicos. Las funciones

computables por máquinas de Turing son iguales a las funciones recursivas parciales. Si una

máquina de Turing no puede resolver un problema, entonces ningún dispositivo mecánico de

cómputo puede hacerlo, porque no existe ningún algoritmo ni procedimiento para obtener su

solución. Las limitaciones de indecidibilidad para el cómputo de funciones no son de orden

tecnológico, sino intrínsecas a limitaciones esenciales de los procesos computacionales. No

importa cuán poderosa sea una computadora en cuanto a memoria y velocidad de ejecución de

sus operaciones, no existe la posibilidad ni el procedimiento para computar ciertas clases de

funciones.

Reglas del cálculo lambda

El cálculo lambda es un formalismo para expresar funciones. Trabaja con un conjunto de

símbolos cada uno de los cuales representa una operación matemática o función, cuyos

“argumentos” son otras cosas del mismo tipo, es decir, funciones. Una función al actuar sobre

otra, da como resultado una nueva función. Por ejemplo, al escribir:

a = bc

decimos que a es el resultado de hacer que la función b actúe sobre la función c. A la acción de

una función sobre sus argumentos la llamamos aplicación.

Además de la aplicación, Church propuso otro tipo de operación: la abstracción, designada por

la letra griega λ. Para expresar la abstracción de una función, se coloca la letra λ y se le hace

seguir inmediatamente por la letra que representa una de las funciones, por ejemplo x, que

llamamos “variable muda”; luego seguirá un punto y después una expresión, donde cada

aparición de la variable x se tratará como un “espacio” (placeholder) en el que puede sustituirse

cualquier cosa que siga a la expresión completa. Podemos entonces escribir:

λx.fx

para expresar la función que, al actuar sobre un objeto, como a, produce como resultado fa:

(λx.fx)a = fa.

Podríamos decir que la abstracción es una operación para nombrar de forma precisa una función

en sí misma. Entendiendo función como una correspondencia por la que a cada elemento x de un

conjunto X se hace corresponder un único elemento y de un conjunto Y, encontramos dos

significados para la expresión de funciones “f(x)”:

1. La función misma, en tanto que la correspondencia entre los elementos de un

conjunto X y los elementos de un conjunto Y.

2. El valor de la función: un miembro y del conjunto Y, cuando x es un objeto de un

dominio X, o un valor ambiguo de la función, si no está especificado el valor de x.

Mediante la notación para la abstracción lambda, se puede representar la función f como distinta

de su valor ambiguo. En este sentido, la expresión λx.fx, es simplemente un nombre para la

función f:

λx.fx = f.

Vemos que cuando se aplica el operador lambda a una forma funcional como fx, se aísla la

función de sus argumentos, dando como resultado el nombre de la función asociada a la forma.

Tenemos entonces que mientras una expresión como (x + 1) designa el sucesor de x, en cambio

la expresión λx (x +1) designa la función sucesor en sí misma.

Llamamos conversión lambda a una serie finita de aplicaciones de las operaciones del cálculo

lambda, que son aplicación y abstracción. Si una fórmula Y puede obtenerse por conversión, a

partir de otra fórmula Z, decimos que Y es convertible en Z. La convertibilidad es una relación

simétrica, reflexiva y transitiva, y el cálculo lambda se dedica al estudio de las propiedades de la

conversión lambda.

Una expresión está expresada en forma normal si está bien construida y no contiene ninguna

parte de la forma (λx.Y)Z, donde las variables ligadas de Y son distintas de las variables ligadas

de Z. En una expresión en forma normal no es posible aplicar a ninguna de sus partes la

operación de reducción.

Las funciones de números enteros que se pueden representar mediante el cálculo lambda se

denominan funciones lambda-definibles:

Una función de enteros f de una variable es lambda-definible si se puede encontrar una

fórmula Y del cálculo lambda tal que si fa = b y si a y b son las fórmulas del cálculo

lambda que representan los enteros a y b, respectivamente, la expresión lambda Ya es

convertible en b.

El cálculo de la conversión lambda está en correspondencia con el cálculo de valores de una

función según el esquema:

fa – cálculo → b

Ya – conversión → b

Hay, pues, como lo presenta (Ladrière, 1965, pag. 205), una correspondencia donde la fórmula Y

del cálculo lambda corresponde a una función de enteros f, la fórmula a del cálculo lambda

corresponde al entero a, y las expresiones lambda Ya o b corresponden a las expresiones fa o b

de la aritmética.

1. Alfabeto del cálculo lambda

El alfabeto del cálculo lambda está constituido por:

Símbolo para la operación de abstracción: λ.

Símbolos para variables: a, b, c, …, z y las mismas letras con índices, por ejemplo: a0,

a1, ...

Símbolos auxiliaries:

De agrupación: paréntesis: ‘)’, ‘(’.

De separación: ‘.’.

2. Convenciones para variables y términos:

Los términos del cálculo lambda se llaman términos lambda;

M, N,... son símbolos sintácticos para términos lambda; en todo caso M, N, … son

expresiones del metalenguaje para referir términos cualesquiera;

x, y, z,... son símbolos sintácticos para variables lambda arbitrarias.

‘=’ es un símbolo del metalenguaje denota igualdad sintáctica.

M N denota que M y N son el mismo término o que N puede ser obtenido a partir de M

mediante un cambio de nombre en las variables ligadas en M.

3. Reglas de formación

Los términos lambda son definidos inductivamente:

Toda variable es un término.

Si M, N son términos, entonces MN también lo es,

Si M es un término y x una variable, entonces λx.M es un término.

4. Convenciones de asociación

Asociación a la izquierda: M1 M2 M3 ... Mn se reserva para ((...(M1 M2) M3) ... Mn) ;

Asociación a la derecha: λx1, x2,...xn.[M] se reserva para λx1 (λx2 (...(λxn M))...).

5. Variables libres

Intuitivamente, una variable aparece libre en un término M si x no está en el “alcance” de

λx; si es de otra manera, x aparece ligada. El conjunto de variables libres de un término

lambda M, que expresaremos con la notación FV (M), que significa “Free Variables of

M” o variables libres de M, se define inductivamente por las siguientes reglas,

expuestas en Barendregt y Barendsen (2000, pag. 10):

FV (x) = {x};

FV (MN) = FV(M) FV(N);

FV (λx. M) = FV(M) – {x}.

M es un término lambda cerrado o combinador si FV (M) = conjunto vacío.

6. Reglas de transformación

Regla de sustitución o regla alfa ‘=α’

Los términos que difieren sólo en los nombres de sus variables ligadas están identificados

en el nivel sintáctico, así que:

λx. M =α λy. [y/x]M.

donde ‘[y/x]’ indica la sustitución de x por y. Este cambio de nombre, que expresamos por

el símbolo “=α”, es lo que llamamos conversión alfa. Esta regla tiene la restricción de

que y no puede aparecer libre en M, pues entonces la y que aparece libre en M resultaría

ligada una vez hecha la sustitución. Por ejemplo si M fuera xy, tendríamos:

λx. xy =α λy. yy

lo que nos daría una expresión cuyos dos lados no tienen el mismo sentido. A este

fenómeno se le llama colisión de variables.

Regla de reducción o regla beta ≥β

Toda expresión que representa una aplicación, que tiene la forma (λx. f x) M, puede ser

reemplazada o reducida a la fórmula f M:

(λx. f x) M ≥β f M

A esta transformación se le conoce como reducción beta (β) y la expresaremos usando el símbolo

“≥β”.

Regla de expansión o abstracción beta ‘≤β’

M [x/N] denota el resultado de sustituir toda aparición libre de la variable x en M por el

término N. Una expresión de la forma M [x/N] puede ser reemplazada por una fórmula

con la forma (λx.M) N, siempre que las variables ligadas de Y sean distintas de x y de

las variables de N:

M [x/N] ≤ β (λx. M) N

Usaremos el símbolo ≤β para representar la expansión beta.

Representaremos tanto la reducción beta como la expansión o abstracción beta por el

símbolo “=β” que significará lo que llamaremos conversión beta.

Conversión lambda “λ”

Se denomina conversión lambda a una serie finita de aplicaciones de estas tres reglas:

conversión α, reducción β y abstracción β. Si una fórmula puede obtenerse por

conversión lambda, decimos que esa fórmula es lambda convertible . Expresaremos la

convertibilidad en el cálculo lambda usando el símbolo ‘λ’; entonces la expresión:

M λ N

significa “M es convertible a N por aplicación de las reglas de conversión del cálculo

lambda”.

3.4.7. Forma Normal en el Cálculo Lambda

Una fórmula está expresada en forma normal si está construida de acuerdo a las reglas de

formación del cálculo y no contiene ninguna forma del tipo (λx. M) N, siendo las

variables ligadas de M distintas de las variables de N. Esto significa que una fórmula

está en forma normal si no es posible aplicarle la regla de reducción beta.

El resultado de sustituir N por las apariciones libres de x en M que, como dijimos al

explicar la regla de expansión, se expresa por la notación M [x / N], se define por los

siguientes esquemas, tomados de Barendregt (2000, pag 10):

x [x / N] = β N;

y [x / N] = β y, si x y;

M1 M2 [x / N] = β (M1 [x / N]) (M2 [x / N]);

(λy. M1) [x / N] = β λy. (M1 [x / N]).

3.4.8. Caracterización de la conversión lambda

Si asumimos aquí la convención de usar el símbolo para significar “implica”,

podemos caracterizar la conversión lambda por los siguientes esquemas axiomáticos y

reglas:

(α) λx. M =α λy. [y/x]M (Conversión alfa)

(β) (λx. M)N λ M [x / N] (Reducción beta)

(ρ) M λ M (Reflexividad)

(σ)M λ N N λ M (Simetría)

(τ) M λ N, N λ L M λ L (Transitividad)

(µ≤) M λ N ZM λ ZN (Monotonía de la aplicación 1)

(ν≤) M λ N MZ λ NZ (Monotonía de la aplicación 2)

() M λ N λx.M λ λx.N (Monotonía de la abstracción)

Barendregt y Barendsen (2000) llaman a las reglas ρ, σ y τ reglas de igualdad y a las reglas µ≤,

ν≤ y reglas de compatibilidad. Como puede observarse, la convertibilidad lambda λ, que es

una generalización de la conversión alfa, la reducción beta y la expansión beta, es una relación

de equivalencia, pues satisface las propiedades reflexiva, simétrica y transitiva.

Combinadores

Ya hemos visto que Schöfinkel (1924), interesado en eliminar variables de la lógica, introdujo un

tipo de operadores llamados combinadores, los cuales “representan combinaciones como

funciones de las variables que contienen (tal vez junto con otras variables)” (Curry y Feys, 1967,

pag. 24). Tales combinaciones se forman a partir de las variables y por medio de una operación

postulada en correspondencia a la aplicación de una función a un argumento. El siguiente lema

(&), tomado de Barendregt (2000, pag. 1) permite representar combinadores por letras simples:

en el cálculo lambda podemos demostrar

(λx1, …, xn. M) y1 … yn M [x1 / y1] … [xn / yn]. (&)

Prueba:

Por el axioma 1, la reducción beta, tenemos:

(λx1. M) y1 λ M [x1 / y1]

Entonces el lema (&) se sigue por inducción sobre n.

Si definimos los siguientes combinadores [Barendregt, 12]:

I λx. x;

K λxy. x;

K* λxy. y;

S λxyz.xz(y z).

Como puede observarse, a cada combinador simple hay asociada una regla de reducción. Esto

significa que cuando el combinador es aplicado a una serie finita de variables obtenemos una

combinación que se reduce a una determinada combinación de tales variables. Tal reducción se

seguirá del lema (&):

I M M;

K MN M;

K* M N N;

S M N L M L (N L).

Tenemos aquí que I es el operador más sencillo, el cual expresa una variable como función de sí

misma. A este combinador se llama identificador elemental. El combinador K expresa un

término M como función de N, mientras que K* expresa un término N como función de M. A

estos dos combinadores se les llama canceladores elementales. El combinador S permite

expresar dos términos M y N (que podrían ser dos funciones f y g) que dependen de un mismo

término L (que podría ser una variable x). Schöfinkel (1924) demostró que las fórmulas lógicas

pueden expresarse sin variables por medio de S y K.

Teoremas Church – Rosser

Los teoremas de Church y Rosser (1936) demuestran la consistencia del cálculo lambda . El

siguiente teorema, conocido como el teorema Church–Rosser I, responde de forma afirmativa a

la cuestión de si hay más de una estrategia de reducción que conduzcan a la misma forma

normal:

Para cualquier expresiones lambda E, F y G, si E → F y F → G, hay una expresión

lambda Z tal que F → Z y G → Z (Slonneger, 1995, pag. 153).

Corolario: Para cualquier expresiones lambda E, M, y N, si E → N, estando M y N en forma

normal, M y N son variantes una de otra. Esto significa que M y N serían equivalentes por

reducción alfa.

El siguiente teorema, llamado teorema Church – Rosser II, responde a la pregunta de si ¿hay una

estrategia de reducción que garantice que se produzca una expresión en forma normal?

Para cualquier expresiones lambda E y N, si E → N, estando N en forma normal, hay un

orden normal de reducción de E a N (Slonneger, 1995, pag. 154).

El orden normal de reducción siempre reduce primero la primera fórmula beta-reducible que

está en el extremo izquierdo (Slonneger, 1995, pag. 152). El orden normal de reducción puede

tener una de los siguientes resultados:

1. Alcanza una sola expresión en forma normal.

2. Nunca termina.

Como sólo existe una forma normal única para una reducción que conduzca a una forma normal,

el cálculo lambda es consistente. Sin embargo, no hay algoritmo o procedimiento mecánico para

determinar si alguna expresión lambda va a producir algunos de los dos resultados mencionados

(Slonneger, 1995, pag. 154).

Aplicaciones del cálculo lambda

Hemos comentado que el cálculo lambda fue pensado originalmente para una formalización de

la aritmética. En esta aplicación, el cálculo lambda no resultó satisfactorio, pues el sistema que

Church ideó para tales efectos demostró ser inconsistente. Sin embargo, como expusimos antes,

Church aplicó el cálculo lambda con éxito en una definición de procedimiento efectivo que ha

demostrado ser equivalente a otras definiciones de computabilidad: es posible usar el cálculo

lambda como un formalismo para representar funciones de números enteros, es posible. De

hecho, se llaman funciones lambda-definibles a las funciones de números enteros que se pueden

representar en el cálculo lambda.

La tesis de Church, según la cual las funciones efectivamente computables sobre enteros

positivos son las funciones lambda definibles, supone que en el cálculo lambda hay una manera

de definir enteros positivos. Tal definición sería una definición computacional o algorítmica de

estos objetos. La definición de los enteros positivos a través del cálculo lambda se conoce como

numerales de Church.

1. Numerales de Church

Recordemos que en el cálculo lambda estamos interesados en un universo de objetos denotados

por variables, cada uno de los cuales representa una operación matemática o función. En este

cálculo podemos formar expresiones a partir de las operaciones elementales del sistema,

aplicación y abstracción. Por ejemplo, la expresión:

λf. f(fx),

es la función que, cuando se aplica a una función g, produce g aplicada dos veces sobre x:

(λf. f(fx) g λ g (gx)

También podemos aplicar la expansión lambda o abstracción a λf. f(fx) y obtener:

(λf. f(fx) λ λf. λx. f(fx) λ λfx. f(fx)

Es la función que aplicada sobre g, produce g aplicada sobre sí misma, o g iterada dos veces.

Church empleó este tipo de construcciones para definir números enteros a través del cálculo

lambda. De hecho, la función λfx.f(fx) identificaría el número natural 2. A los números naturales

definidos por este procedimiento se le llaman numerales de Church:

0 = λfx. x

1 = λfx. fx

2 = λfx. f(fx)

3 = λfx. f(f(fx))

4 = λfx. f(f(f((fx)))

etc.

Cualquier aplicación de estas expresiones lambda sobre una función arbitraria f hace iterar ésta

tantas veces como lo indica el numeral. Por ejemplo, la aplicación de 3f sobre y sería:

(3f)y λ f(f(f(y))).

2. Operaciones básicas de la aritmética

De acuerdo a la tesis de Church, debe ser posible definir las operaciones aritméticas básicas a

través del cálculo lambda, en especial la función de sucesor, que permite generar los números

enteros positivos.

La función sucesor, la función adición aritmética, la función multiplicación aritmética y la

función potencia se pueden expresar en el cálculo lambda respectivamente así:

Suc = λn f x. f (n f x) Sucesor

Add = λm n f x. m f (n f x) Adición

Mul = λm f x. m (f x) Multiplicación

Pot = λm f. m f Potencia

Como ejemplo, apliquemos la función sucesor a 2:

Suc 2 λ (λn f x. f (n f x)) 2

λ λf n. f (2 f x)

λ λf n. f (λg y. g (g y) f x)

λ λf n. f (λ y. f (f y) x)

λ λf n. f ( f (f x)) = 3

3. Constructor y selector

Para definir funciones binarias en el cálculo lambda, necesitamos definir previamente un

constructor y un selector.

A continuación presentamos la representación en cálculo lambda de una función para construir

pares, que llamaremos par. También presentaremos las representaciones de dos funciones

binarias selectoras, fst (first: primero) y snd (second: segundo), que se corresponden a los

combinadores que ya presentamos K y K*, respectivamente:

par := λx y f. f x y

fst := λp. p (λx y. x)

snd := λp. p (λx y. y)

Aquí empleamos el símbolo ‘:=’ para significar ‘… se define como …’

Veamos un ejemplo que ilustra como operan estas funciones:

fst par p q λ (λp. p (λx y. x) λa b f. f a b) p q

λ (λa b f. f a b (λx y. x)) p q

λ ( λb f. f p b (λx y. x)) q

λ λ f. f p q (λx y. x)

λ (λx y. x) p q

λ (λy. p) q

λ p

Con estas funciones simples, podemos definir otras compuestas. Como ejemplo, crearemos la

función swap:

swap := λz. snd z fst z

A continuación una ilustración de cómo se comporta la función swap:

swap par p q λ (λz. snd z fst z) ((λx y f. f x y) p q)

λ (λz. snd z fst z) (λ f.f p q)

λ (λz. snd z fst z) p q

λ (snd p q) (fst p q)

λ (λp. p (λx y. y) p q) (λp. p (λx y. x) p q))

λ (λp. p (λ y. y) q) (λp. p (λx y. x) p q))

λ (λp. p q) (λp. p (λx y. x) p q)

λ (λp. p q) (λp. p (λ y. p) q)

λ (λp. p q) (λp. p p)

λ q (λp. p p)

λ q p

4. Constantes y operaciones booleanas

Dado que muchas funciones emplean el condicional en sus definiciones, necesitamos constantes

y operaciones booleanas.

Para expresar los valores verdad (True) y falso (False) en cálculo lambda usamos:

T = λtf. t

F = λtf. f

El condicional podemos expresarlo de la siguiente manera: si B es una expresión que evalúa

verdad o falsedad, es decir, si es un booleano, entonces podemos definir una función test, que

evalúa sus argumentos de la siguiente manera:

Si B entonces P sino Q

Esta evaluación puede ser representada por:

test := λcxy. c x y

de manera que, por ejemplo:

test T v w = (λcxy. c x y) T v w λ

T v w = (λtf.t) v w λ v

5. El cálculo lambda como un lenguaje de programación

Con este conjunto de definiciones básicas —numerales de Church, operaciones aritméticas

básicas, constructor y selector, constantes y operaciones booleanas— tenemos una base para

definir nuevas funciones y representar cómputos aritméticos en el cálculo lambda. Bajo este

punto de vista, el cálculo lambda puede ser considerado como un lenguaje de programación

donde todos los objetos son definidios como funciones computables y donde las mismas

funciones pueden ser usadas como argumentos de otras funciones: de hecho, operaciones sobre

enteros positivos, como la función sucesor o la función suma, en el cálculo lambda, donde hemos

representado estos números a través de numerales de Church, son funciones que reciben

funciones como argumentos. Por eso puede considerarse al cálculo lambda como un lenguaje de

programación función funcional.

De hecho, el cálculo lambda ha inspirado el diseño de lenguajes de programación usados

ampliamante en la práctica computacional como Lisp, diseñado por John McCarthy en la década

de 1950, el primer lenguaje de programación concebido para desarrollo de inteligencia artificial.

Además, algunos lenguajes funcionales de programación son en realidad el cálculo lambda con

un conjunto de agregados y extensiones, llamadas frecuentemente azúcar sintáctica, que

facilitan y aligeran las tareas prácticas. El primer lenguaje enfocado en esta dirección fue ISWIM

(If you See What I Mean), propuesto por Landin (1966). Se trata del cáculo lambda puro con

algunas construcciones de control como expresiones condicionales, y la clausula where como

mecanismo para definir funciones y asignar valores a variables. En realidad ISWIM no llegó a

implantarse en la práctica, pero si fue muy influyente en el desarrollo subsiguiente de lenguajes

funcionales de programación como ML y Haskell. Después de ISWIM, apareció Scheme, un

dialecto de Lisp diseñado por Sussman y Steele (1975), que es una de las primeras realizaciones

prácticas del cálculo lambda todavía en amplio uso.

Estos lenguajes de programación, que tienen en común estar basados en el cálculo lambda,

conforman una clase de lenguajes de programación: los lenguajes de programación funcionales.

Más detalles sobre cómo el cálculo lambda constituye el núcleo fundamental de los lenguajes

funcionales de programación y sobre los mecanismos de implementación usados se pueden

encontrar, por ejemplo, en Gordon (1988) y Paulson (1995).

El cálculo lambda con tipos: origen y reglas

Church (1940) presenta una versión del cálculo lambda que incluía asignación de tipos para los

términos lambda. Curiosamente, este sistema con asignación de tipos para los términos del

cálculo lambda ha facilitado el descubrimiento de la correspondencia entre demostraciones

lógicas y programas, conocida como isomorfismo Curry-Howard. El objetivo de Church con este

cálculo era dar una formulación de la teoría de tipos, sugerida independientemente por Leon

Chwistek y F. P. Ramsey, como una alternativa a la teoría ramificada de tipos de Russell y

Whitehead, que incorporara ciertos rasgos de la conversión lambda.

El cálculo lambda y el uso de tipos tienen su origen común en la lógica. Posiblemente la primera

noción de tipos se encuentra ya en Frege (1891), donde se revela la diferencia conceptual entre

objetos y predicados y se considera la jerarquía que se construye sobre estas nociones: en el nivel

inferior tenemos una colección de objetos básicos, luego tenemos las propiedades de estos

objetos, después tenemos propiedades de estas propiedades, etc.

Russell y Whitehead (1910 – 1913) introdujeron la teoría ramificada de tipos como una manera

de evitar una paradoja descubierta en el sistema originalmente ofrecido por Frege (1893) como

fundamentación de la aritmética, conocida como paradoja de Russell. Originalmente, Church

pensó que era posible evitar esta paradoja sin introducir tipos, pero sólo manteniéndose dentro de

una lógica intuicionista que use solamente alguna forma limitada de la ley del tercero excluido.

Sin embargo, dos estudiantes de Church, Kleene y Rosser (1935), demostraron que este sistema

es inconsistente. Church (1940) presentó luego una formulación de lógica usando el cálculo

lambda con asignación de tipos simples, que puede concebirse como una simplificación del

sistema de tipos usado en Principia Mathematica.

Una teoría de tipos supone que en un sistema simbólico no sólo tratamos con objetos, como

términos, fórmulas y demostraciones. También tratamos con tipos de objetos. El cálculo lambda

con asignación de tipos incluye tipos generados a partir de una base tipo 0 usando una

"flecha" (→) para representar un espacio de función A → B, un número infinito de variables de

cada tipo y términos lambda construidos a partir de variables y las operaciones de aplicación y

abstracción. Las fórmulas de este cálculo son ecuaciones entre términos del mismo tipo. Los

axiomas y reglas de inferencia son las versiones restringidas de las reglas de transformación del

cálculo lambda sin asignación de tipos.

El sistema de Church tenía dos tipos atómicos: ρ para el tipo de proposiciones, ι para el tipo de

individuos. Los tipos compuestos son del tipo de funciones desde α a β, que ahora

generalmente se denota como « α → β», pero que Church denotaba «( β α )». Las “funciones

(proposicionales) de primer orden” de Russell corresponden a términos del tipo ι → ρ, sus

“funciones (proposicionales) de segundo orden” corresponden a términos del tipo (ι → ρ) →

ρ, etc.

En general, los tipos son objetos de naturaleza sintáctica y pueden ser asignados a términos

lambda. Si M es un término del cálculo lambda y se le asigna un tipo α, entonces decimos ‘M

tiene tipo α’; la notación que usaremos para esto es M : α. Si M es una función, entonces tendrá

un tipo de función de la forma α → β, y lo denotaremos M : α → β 3. Curry llama argumento al

término lambda M en una expresión de la forma M : α, y llama predicado a la parte que

representa el tipo.

Los tipos vienen a solucionar también un cuestionamiento que se hacía al cálculo lambda: los

términos del este cálculo no representaban la noción de función tal como los matemáticos

acostumbraban a usar en la teoría de conjuntos, la cual incluye un dominio y un rango dados

como parte de la definición de función (Hindley y Seldin, 1996, pag. 159). En este sentido, cada

tipo atómico α denota un conjunto particular, como el conjunto de los números naturales, y cada

tipo compuesto, de la forma α→β, que se denota alguna función de α a β, representa funciones

cuyo rango es un conjunto denotado por α y cuyo rango es un subconjunto denotado por β. A lo

que refieran exactamente los tipos atómicos o el conjunto de funciones definidas por tipos

compuestos dependerá en todo momento del uso para el cual está destinada la teoría de tipos

formal que se va a desarrollar. Cuando se especifica, por ejemplo, un conjunto de funciones,

como las funciones representables en algún modelo dado, todo tipo va a denotar un conjunto de

individuos o funciones específicos. Más allá de esto, los tipos son simples objetos sintácticos.

La inclusión de tipos en un sistema lógico como medio para evitar paradojas se debe a que ellos,

al definir algún conjunto para algún término o al establecer un dominio y un rango para un

3 Church empleaba superíndices para la asignación de tipos, de manera que si M es un término de tipo a escribía: M α; y si M es una función de tipo a → β, se escribía M a → β.

conjunto de funciones, limitan la información de los términos. Por ejemplo, a través de la

asignación de tipos a términos se pueden poner restricciones a la operación de aplicación: para

aplicar M a N, el tipo de N debe ser α y el tipo de M debe ser α → β; entonces la aplicación

MN tendrá el tipo β. En el caso de la abstracción, si x es una variable de tipo α y M es un término

de tipo β, entonces el término λx.M, que denota una función, tendrá el tipo α → β.

En el caso de los combinadores, tenemos que, por ejemplo, el identificador simple I, definido por

la expresión λx.x, designa una función que proyecta o asocia consigo mismo un término de tipo

α, por lo tanto: I: (α → α). Esto significa que si x es el argumento de I y x tiene el tipo α,

entonces el valor I x es de tipo α.

En general, tenemos que:

α → β es el tipo de funciones del tipo α al tipo β.

La expresión “x1 : β 1, …, xn : β n ├ t : α”, es un juicio sobre tipos, donde se dice que t tiene el

tipo α si cada xi tiene el tipo βi. Usaremos letras griegas mayúsculas, como Γ y Δ, para designar

listas de pares “variable : tipo”, a las que llamaremos contextos. Así que si, en la expresión “x1 :

β 1, …, xn : β n ├ t : α” hacemos x1 : β 1, …, xn : β n= Γ, entonces podemos decir también que la

expresión “Γ ├ t : α” significa que t tiene el tipo α en el contexto Γ, donde el contexto Γ no es

sino una secuencia de términos lambda con tipos asignados con la forma “xi : β i”.

El cálculo lambda con asignación de tipos, tal como lo concibió Church (1940), incluye dos

reglas de transformación o inferencia: una introduce la flecha de tipos y otra la elimina. Entonces

enunciamos las reglas de inferencia siguientes para el cálculo lambda con asignación de tipos:

(1) regla de abstracción:

Si Γ, x:α ├ M : β, entonces Γ├ (λx.M):α → β , si x no aparece libre en Γ

(2) regla de aplicación:

Si M:α → β y N:α , entonces MN:β.

Como puede notarse, la regla de abstracción introduce flecha de tipos y la regla de aplicación la

elimina. Se podrá notar que hay una similaridad estructural con las reglas propuestas por

Gentzen (1934) para el fragmento condicional del cálculo de deducción natural, es decir, el

cálculo lógico que sólo incluye dos reglas de inferencia para el condicional, una que lo introduce

y otra que lo elimina. Esta circunstancia permite expresar en el estilo de la deducción natural las

reglas del cálculo lambda con asignación de tipos.

Usemos ahora letras latinas mayúsculas para designar tipos. Enunciemos la regla de aplicación

en el cálculo lambda con tipos:

Sea t una función ‘de tipo B a tipo A’ bajo las suposiciones en el contexto Γ; y sea u un

término ‘de tipo B’ bajo las suposiciones en el contexto Δ. Podemos concluir entonces

que t(u) es un término de tipo A bajo la combinación de las suposiciones en los contextos

Γ, Δ.

Expresado formalmente:

Γ ├ t : B → A Δ ├ u : B (→ E)Γ, Δ ├ t(u) : A

Enunciemos ahora la regla de abstracción:

Sea t un término ‘de tipo B’ bajo las suposiciones en el contexto Γ; y sea u un término ‘de

tipo A’ bajo las suposiciones en el contexto Δ. Podemos concluir entonces que λx.t es un

término de tipo B → A bajo la las suposiciones en el contexto Γ.

Expresado formalmente:

Γ, t : B Δ ├ u : A (→ I) Γ ├ λx. t : B → A

Algunas versiones del cálculo lambda con tipos incluye explícitamente el siguiente axioma:

___________ Idx : A ├ x : A

que expresa la reflexividad de las expresiones en este cálculo. Este esquema es equivalente al

siguiente, si se considera que en él se tomó el contexto Δ como vacío:

IdΔ, x : A ├ x : A

Entonces, si tomamos a Γ = Δ, x : A, podemos plantear el esquema Id de la siguiente forma:

IdΓ ├ x : A

Si, y sólo si. (x : A) está en el contexto Γ .

Tenemos entonces una regla para términos que son variables, la regla que hemos llamado Id. Las

demás reglas, aplicación y abstracción, actúan sobre funciones. De estas reglas, una, la

abstracción, introduce el tipo de funciones y la otra, la aplicación, lo elimina. Por este motivo

designamos estas dos reglas por (→ I) y (→ E), respectivamente.

Reglas del cálculo lambda con tipos de Church

____________x : A ├ x : A

Id

Γ, x : B Δ ├ t : A Γ ├ λx. t : B → A

→I

Γ ├ t : B → A Δ ├ u : B Γ, Δ ├ t u : A

→E

A partir de estas reglas puede decidirse si a algún término corresponde cierto tipo en este cálculo.

Como ejemplo, efectuaremos tres demostraciones para tipos cualesquiera A, B y C.

Demostraremos primero que para el tipo A que la siguiente expresión es válida en este cálculo:

(λx. x ) : A → A

Demostración:

(x: A) ├ ( x: A) (Id) ├ (λx. x ) : A → A (→I)

Demostremos ahora que la siguiente expresión pertenece al cálculo lambda con tipos:

(λx y. x ) : A → B → A

Demostración:

(x: A), (y: B) ├ ( x: A) (Id) (x: A) ├ (λy . x) : (B → A) (→I)

├ (λx y. x ) : A → B → A (→I)

Finalmente, demostraremos la expresión más compleja:

(λx y z. x z (y z) ) : (A → B → C) → (A → B) → (A → C)

Demostración:

x : (A → B → C) ├ x : (A → B → C) z : A ├ z : A y : (A → B) ├ y : (A → B) z : A ├ z : A x : (A → B → C), z : A ├ x z (B → C) y : (A → B), z : A ├ y z : B x : (A → B → C), y : (A → B), z : A ├ x z ( y z ): C

x : (A → B → C), y : (A → B) ├ λz. x z ( y z ): (A → C) x : (A → B → C) ├ λyz. x z ( y z ) : (A → B) → (A → C) ├ λxyz. x z ( y z ) : (A → B → C) (A → B) → (A → C)

Nótese que las expresiones que hemos demostrado aquí, si le suprimiéramos los tipos asignados,

tendríamos las definiciones de los combinadores:

I λx. x;

K λxy. x;

S λxyz.xz(y z).

Lo que quiere decir que a estos combinadores corresponden los siguientes tipos:

I : A → A

K : A → B → A

S : (A → B → C) → (A → B) → (A → C)

Curiosamente, puede notarse que las expresiones a la derecha de los dos puntos, son muy

similares formalmente a los esquemas axiomáticos del fragmento implicacional de la lógica

proposicional estilo Hilbert que presentamos en el primer capítulo: los tipos correspondientes a

K y S son estructuralmente idénticos a los esquemas H1 y H2, respectivamente. Es esta

similaridad estructural la que estudiaremos en el siguiente capítulo: pareciera que los términos

lambda fueran el cómputo o la construcción efectiva de demostraciones del cálculo

proposicional.

Veamos ahora qué ocurre con los tipos de los términos del cálculo lambda cuando se aplican las

conversiones propias de este cálculo. La conversión en el cálculo lambda con asignación de

tipos, que representaremos aquí con el signo ‘ΛΠ’, queda caracterizada por los siguientes

esquemas y reglas, que encontramos en Hindley y Seldin (1996, pag. 162):

(α) (λx. M ) : A → B ΛΠ λy. [y : A / x : A] M : B

(β) ( (λx. M ) : A → B ) N : A ΛΠ [N : A / x : A] M : B

(ρ) M : A ΛΠ M : A

(µ) M : A ΛΠ P : A ├ (N : A → B) M : A ΛΠ (N : A → B) P : A

(ν) M : A → B ΛΠ P : A → B ├ (M : A → B) N : A ΛΠ (P : A → B) N : A

(ξ) M : B ΛΠ P : B ├ (λx. M : B ) : A → B ΛΠ (λx. P : B ) : A → B

(τ) M : A ΛΠ N : A, N : A P : A ├ M : A ΛΠ P : A

Como en el cálculo lambda sin inclusión de tipos, se denomina redex (reduction expression, en

español, expresión reducible) a toda expresión de la forma:

( (λx. M ) : A → B ) N : A

Por ejemplo, la reducción de la expresión (λ x.xz : A → B) y : A, que aplica una función M del

tipo A → B, definida por xz, a un término N de tipo A, definido por y, nos da, por la regla (β), la

expresión yz : B. Esto tiene una particular importancia en al deducción de tipos, pues una

deducción de la forma:

x : A ├ x : A ·D1(x)

· D2

M : B (→I) · (λx. M ) : A → B N : A (→I) (λx. M ) N : B ·

D3

Se reduce a la forma:

D2

N : A ·

D1(N) · [N / x : A] M : B ·

D’3

Donde D’3 se obtiene a partir de D3 reemplazando las apariciones de (λx. M )N por [N/x] M.

Al hacer este paso de reducción ocurre una contracción en el sujeto (el término lambda M en la

expresión M : A). Además, si suprimimos todos los sujetos de ambas deducciones, veremos que

este paso de reducción se corresponde con el paso de reducción de la implicación en el cálculo

de deducción natural, tal como expusimos en el segundo capítulo de este trabajo, en el apartado

Normalización. Obsérvese que, en la primera derivación, el punto donde ocurre lo que sería

equivalente a la fórmula de corte en un desvío en una derivación en deducción natural, aparece

aquí una expresión reducible con la forma:

( (λx. M ) : A → B ) N : A

Todas las propiedades de la conversión lambda del sistema sin asignación de tipos se mantienen

en el sistema con asignación de tipos. Pero, además, los sistemas con asignación de tipos tienen

una propiedad extra que no tienen los sistemas sin tipos, y que juega un rol esencial en todas sus

aplicaciones: las expresiones con tipos asignados son normalizables en sentido fuerte. Quiere

decir que para este sistema con tipos vale el siguiente teorema:

En el cálculo lambda con tipos no hay reducciones-β infinitas.

A diferencia de lo que ocurre en el cálculo lambda sin tipos, donde es posible encontrar

estrategias de reducción de un término t dado que no conducen a una forma normal, en el cálculo

lambda con asignación de tipos todas las estrategias de normalización son buenas, en el sentido

de que siempre conducen a una forma normal y, por lo tanto, siempre terminan. El problema en

el cálculo lambda sin tipos es que, a pesar de que en él para todo término siempre hay alguna

estrategia de normalización, el procedimiento de reducción no es un algoritmo determinista,

siendo posibles muchas conversiones para un mismo término t dado. Si la normalización débil

nos da un procedimiento para elegir en cada paso una expresión reducible apropiada que ha de

conducir a una forma normal, es decir, un término u que es irreducible, en el caso el cálculo

lambda con tipos la normalización para cualquier término t dado es fuerte, pues no hay secuencia

de reducción infinita que comience con este término t. Por supuesto, esta propiedad del cálculo

lambda con tipos tiene relevancia desde el punto de vista del problema de la detención, que

mencionamos al comienzo de este capítulo.

Se atribuye a Tait (1967), la demostración de que la reducción beta en el cálculo lambda con

tipos es fuertemente normalizable. Girard (2003, pags. 31 – 45) también presenta una versión de

la demostración del teorema de normalización fuerte para el cálculo lambda con tipos, todavía

basada en la noción de reducibilidad empleada por Tait. Esta demostración de normalización

fuerte debería extenderse al fragmento implicacional de la lógica intuicionista por la

correspondencia Curry-Howard.

Ya hemos visto que existen similaridades estructurales entre la lógica proposicional y el cálculo

lambda con asignación de tipos:

1. El tipo que corresponde a los combinadores I, K y S son similares a los axiomas del

fragmento implicacional de la lógica proposicional estilo Hilbert.

2. La reducción beta de una expresión del cálculo lambda con tipos es similar a la reducción

o contracción del desvío o eliminación de un corte en una derivación en el cálculo de

deducción natural a través del paso de reducción para →.

No es de extrañar que los investigadores comenzaran a señalar estas correspondencias entre el

cálculo lambda con asignación de tipos y los sistemas de lógica proposicional. Una de las

primeras observaciones al respecto, y que ya hemos señalado aquí, la encontramos en Curry

(1967, pag. 388): existe correspondencia entre el los tipos asignados a términos lambda y las

fórmulas en un sistema axiomático de lógica intuicionista proposicional, estilo Hilbert. En esta

correspondencia, los términos lambda se corresponderían con las demostraciones de las fórmulas

de la lógica intuicionista. Posteriormente, después que Dag Prawitz (1965) demostrara los

teoremas de forma normal y de normalización para el cálculo de deducción natural estilo

Gentzen, Howard (1969) estableció la existencia de la correspondencia entre el cálculo lambda

con asignación de tipos y el cálculo de deducción natural para la lógica intuicionista, no sólo

para el fragmento implicacional de la lógica proposicional, sino también para la lógica de primer

orden, destacando también la correspondencia entre reducción de demostraciones y reducción

lambda; a estas correspondencias se le conocen en la actualidad como isomorfismo Curry-

Howard o principio de fórmulas-como-tipos.

Como veremos en el siguiente capítulo, por este isomorfismo, entre otras cosas, podemos usar el

cálculo lambda con asignación de tipos como una notación natural para las demostraciones en el

cálculo de deducción natural: el cálculo lambda con tipos representa una manera natural de

codificar las demostraciones del cálculo de deducción natural. Además, por este isomorfismo, los

resultados del cálculo lambda pueden ser traducidos a un marco de demostraciones de deducción

natural. Considerando que los cómputos que se hacen en el cálculo lambda se corresponden con

algoritmos, se pueden ver programas como demostraciones, donde su especificación (lo que el

programa debe hacer) sería como el teorema probado por la demostración, y la ejecución de un

programa sería como la normalización de una demostración.