• No se han encontrado resultados

lpp122n05

N/A
N/A
Protected

Academic year: 2020

Share "lpp122n05"

Copied!
10
0
0

Texto completo

(1)

Lenguajes de Programaci´

on y sus Paradigmas, 2012-2

Nota de clase 5: Introducci´

on al Paradigma Funcional,

alculo Lambda

*

Favio E. Miranda Perea Lourdes Del Carmen Gonz´alez Huesca Facultad de Ciencias UNAM

2 de marzo de 2012

En el lenguaje de expresiones aritm´eticas estudiado anteriormente es posible expresar, por ejem-plo, para cada expresi´on dadae, el c´omputo de su doble mediante la operaci´on de suma e+e. Sin embargo no es posible expresar el mecanismo de duplicaci´on de una expresi´on num´erica en gen-eral, es decir, no es posible escribir un programa que reciba una expresi´on num´erica cualquiera e

y devuelva e+e. Para esto necesitamos introducir un mecanismo de definici´on de funciones que capture patrones de c´omputo generales que puedan instanciarse para obtener resultados espec´ıficos. Para pasar de instancias particulares dee+ea una expresi´on general reemplazamos las presencias de e por una variable x la cual se marca como sujeta a variaci´on mediante un mecanismo de ab-stracci´on y ligado. En esta nota extendemos el lenguaje con este mecanismo de definici´on conocido como abstracci´on funcional o abstracci´on lambda (λ). Esta clase de abstracci´on es com´un a diversos lenguajes de programaci´on funcional, en particular en la familia de lenguajes descendientes deLISP la duplicaci´on puede escribirse como (lambda x(+x x)). En general la sintaxis de las expresiones lambda, en Schemepor ejemplo,es

(lambda (x) e)

donde lambdaes una palabra reservada que indica la definici´on de una funci´on con par´ametro x y cuerpo e. La expresi´on puede leerse como “la funci´on que, para cada x, devuelve e”. El par´ametro se liga mediante la abstracci´on lambda y consecuentemente puede ser renombrado de acuerdo a las reglas de la α-equivalencia. Veamos un par de ejemplos mas:

La funci´on x7→x2 se denota como (lambda(x) (∗x x))

La funci´on y7→(3 +y)∗(y−4) es (lambda(y) (∗(+3 y) (−y 4)))

Tambi´en podemos definir funciones con m´as de un par´ametro, por ejemplo la funci´on producto (x, y)7→x∗y se define como (lambda(x y) (∗x y))

En complemento a la definici´on de funciones se requiere un mecanismo de aplicaci´on de una funci´on f a un argumento e. Esta operaci´on no requiere de un operador en la sintaxis concreta y se denota simplemente con la escritura en secuencia de ambas expresiones, es decir, la expresi´on f y

*

(2)

indica que la funci´onf se aplica al argumentoy. Por ejemplo la expresi´on (lambda(z) (+2 z))3se refiere a la aplicaci´on de la funci´on (lambda(z) (+2 z)) al argumento 3 lo cual debe evaluarse a 5. El lenguaje formal para estudiar las operaciones de abstracci´on y aplicaci´on funcional se conoce como c´alculo lambda. Este formalismo puede considerarse como el cimiento del paradigma de pro-gramaci´on funcional y es parte esencial de los lenguajes funcionales modernos. Aunque es importante observar que no tuvo mayor impacto en el desarrollo deLISPm´as all´a del uso de la notaci´on lambda. Al respecto el mismo McCarthy1 dice “Para usar funciones como argumentos, uno necesita una no-taci´on para funciones, y parec´ıa natural usar la notaci´onλde Church (1941). Yo no entend´ı el resto de su libro de manera que no intent´e implementar su mecanismo general para definir funciones”. Esto muestra la humildad de un gran cient´ıfico,LISPtuvo muchas innovaciones tanto te´oricas como pr´acticas, por ejemplo:

El uso de recolecci´on de basura2 como un m´etodo para reutilizar celdas de memoria. El uso de cerraduras para implementar la resoluci´on est´atica del alcance.

La invenci´on de la expresi´on condicional y su uso para escribir funciones recursivas.

El uso de funciones de orden superior, es decir, funciones que reciben funciones como argu-mento y/o devuelven funciones como resultado.

A continuaci´on abandonamos la notaci´on lambda de LISP para estudiar brevemente el c´alculo lambda puro y con tipos simples.

1.

El C´

alculo Lambda Puro

λ

U

El c´alculo lambda es un formalismo matem´atico inventado durante finales de la decada de l930 por Alonzo Church y Stephen Kleene con el prop´osito de fundamentar la matem´atica. Si bien tal prop´osito no se cumpli´o, el mismo Church dijo alguna vez que el sistema podr´ıa tener otras aplica-ciones distintas a su uso como una l´ogica. Palabras prof´eticas dado que el c´alculo lambda, dise˜nado para investigar la definici´on y aplicaci´on de funciones as´ı como diversos principios de recursi´on, se ha convertido en el c´alculo n´ucleo para estudiar fundamentos de lenguajes de programaci´on. De hecho puede considerarse como un lenguaje ensamblador para el paradigma de programaci´on funcional.

La definici´on del c´alculo lambda puro, denotado de ahora en adelanteλU, es sorprendentemente simple, he aqu´ı su sintaxis concreta:

e::=x|λx.e|e e

Se tiene un conjunto infinito de variables y dos operaciones, la abstracci´on lambdaλx.edeclarada en LISP como (lambda (x) e)y la aplicaci´on denotada e1e2.

En el c´alculo lambda puro no hay distinci´on formal entre funciones y argumentos, toda expresi´on denota a una funci´on, este es el caso extremo de un lenguaje de programaci´on funcional.

1John McCarthy. History of LISP. In Richard L. Wexelblat, editor, History of Programming Languages: Proceedings of the ACM SIGPLAN Conference, pages 173-197. Academic Press, June 1-3 1978.

(3)

1.1. Aplicaci´on

Una expresi´on de la forma e1e2 se llama aplicaci´on. La idea es quee1e2 denota a la aplicaci´on de la funci´on e1 al argumento e2. La aplicaci´on se asocia a la izquierda de manera que e1e2e3 significa (e1e2)e3 y NO e1(e2e3). Obs´ervese que no hay un operador expl´ıcito para la aplicaci´on, ´

esta se denota simplemente mediante la escritura secuencial de dos expresiones.

1.2. Abstracci´on lambda

Una expresi´on de la formaλx.e se llamaabstracci´on lambda o simplementeabstracci´on. La idea aqu´ı es queλx.eindica una abstracci´on de los valores particulares de la variablexen la expresi´one

lo cual causa quee se considere una funci´on de x, es decir, la expresi´on λx.edefine an´onimamente a la funci´on la funci´onx7→eque asocia a cada valorx la expresi´one. El punto en una abstracci´on es un caso particular de la sintaxis de orden superior y denota el ligado de x en e, adem´as indica que el alcance del ligado paraxse extiende a la derecha tanto como sea posible. Por ejemplo,λx.xy

significa λx.(xy) y no (λx.x)y. Para facilitar la escritura de abstracciones usaremos la siguiente convenci´on

λx1x2. . . xn.e=def λx1.λx2. . . . .λxn.e

Veamos unos ejemplos:

λxyz.xz(yz) = λx.λy.λz.xz(yz) = λx.λy.λz.(xz)(yz) (λxyz.xz)yz = (λxyz.xz)y

z

= (λx.λy.λz.xz)yz

Dado que en la abstracci´onλx.eel operadorλliga a la variablex enese mantiene la noci´on de variables libres y ligadas introducida anteriormente con las expresioneslet. En particular se tiene que el conjunto de variables libres de una abstracci´on se define como F V(λx.e) = F V(e)\ {x}. Por ejemplo en (λxy.xzy)(λz.zy)u las dos presencias de x son ligadas as´ı como las dos primeras presencias de y y las dos ´ultimas presencias de z mientras que el resto de las presencias de cada variable son libres. Una expresi´onetal que siF V(e) =∅es una expresi´oncerradatambi´en conocida como combinador3.

Ejemplo 1.1 Algunos t´erminos del c´alculo λy su significado intuitivo son:

x, la funci´on indeterminada x

xy, la aplicaci´on de la funci´onx a la funci´ony, ambas indeterminadas.

xyz, la aplicaci´on de la funci´on xy a z, todas indeterminadas.

x(yz), la aplicaci´on de x a la aplicaci´on de y a z.

λx.xla funci´on que toma un argumentoxy devuelve el mismo elementox, es decir, la funci´on identidad.

(4)

λz.y, la funci´on que toma un argumento z y devuelve y, es decir, la funci´on constante y.

λx.λz.x, la funci´on que para cada x, devuelve la funci´on que para cada zdevuelve x, es decir, la funci´on que para cada x devuelve la funci´on constante que devuelve x.

λx.λy.λz.xyz, la funci´on que le aplica a cadaz el resultado de aplicarle x a y.

λx.λy.λz.x(yz), la funci´on composici´on de x y y

λx.xx, la funci´on que para cada x devuelve la aplicaci´on de x a x.

(xy)(zw), la funci´on que aplica el resultado de aplicar x a y, al resultado de aplicar z a w, todas indeterminadas.

2.

Sem´

antica Operacional

La sem´antica operacional del c´alculo lambda es muy simple y est´a dada por la siguiente regla conocida como reducci´onβ.

(λx.t)s→β t[x:=s]

Debido a esta regla, a las expresiones de la forma (λx.t)sse les llama redex (del ingl´es “reducible expression”). Se observa entonces que todo paso de evaluaci´on es simplemente una substituci´on definida de la manera usual mediante el uso de α-equivalencia para evitar la captura de variables libres:

x[x:=r] =r.

y[x:=r] =y si x6=y.

(ts)[x:=r] =t[x:=r]s[x:=r].

(λy.t)[x:=r] =λy.t[x:=r] donde s.p.g.y6=x yy /∈F V(r).

3.

Representaci´

on de booleanos, pares y n´

umeros naturales

El c´alculo lambda puro es lo suficientemente poderoso para representar tipos de datos como booleanos y n´umeros naturales, as´ı como estructuras de datos como pares. Veamos algunos ejemplos:

3.1. Booleanos

true:=λxλy.x

false:=λxλy.y

ift:=λv.λtλf.vtf

not:=λz.z false true and:=λx.λy.xy false

(5)

ift true e1e2 →? e1

ift falsee1e2 →? e2

por lo que el t´ermino iftse comporta como el condicional if then else.

not true→? false

not false→? true

and falseb→? false

and true b→? b

3.2. Pares

pair:=λf λsλb.bf s

fst:=λp.ptrue snd:=λp.pfalse

Estos t´erminos cumplen lo siguiente:

fst(pairs t)→?s

snd(pairs t)→?t

3.3. Naturales (numerales de Church)

¯

0 :=λs.λz.z

¯

1 :=λs.λz.sz

¯

2 :=λs.λz.s(sz) ¯

3 :=λs.λz.s(s(sz)) ¯

n:=λs.λz. s(. . .(s | {z } n veces

z). . .)

suc:=λn.λs.λz.s(nsz) tal que

∀n∈N sucn¯→? n+ 1

suma:=λm.λn.n(suc)m tal que

∀n, m∈N suman¯m¯ →?n+m

prod:=λm.λn.m(suman)¯0 tal que

(6)

iszero:=λm.m(λx.false)truetal que

iszero ¯0→?true iszero(n+ 1)→? false

pred:=λm.fst(mss zz)

• zz:=pair¯0 ¯0

• ss:=λp.pair(sndp)(suc(sndp))

Acerca de como surgen estas definiciones podemos mencionar que sus origenes est´an en ciertas definiciones dadas mediante especificaciones l´ogicas. M´as detalles caen fuera del alcance de nuestro curso.

4.

No terminaci´

on del c´

alculo lambda puro

La propiedad de terminaci´on no es v´alida en el c´alculo lambda puro, al existir expresiones e

que no cuentan con una forma normal. El ejemplo cl´asico es sl siguiente: sean ω =def λx.xx y

Ω =def ωω. La sem´antica operacional nos lleva a la siguiente secuencia de reducci´on:

Ω =ωω= (λx.xx)ω→β (xx)[x:=ω] =ωω= Ω

De manera que Ω se reduce a s´ı mismo en un paso lo cual genera la sucesi´on infinita de reducci´on:

Ω→β Ω→β Ω→β Ω→β . . .

Es decir Ω no tiene una forma normal y representa a un programa cuya evaluaci´on se cicla indefinidamente.

Obs´ervese que una raz´on para la no terminaci´on de expresiones como Ω es el uso de la autoapli-caci´on, ω es una funci´on que recibe una funci´on x y devuelve xx que es el resultado de aplicar x

a s´ı misma. Por otra parte Ω es la funci´on que resulta al aplicarω a s´ı misma. El c´alculo lambda puro no prohibe que una expresi´on se aplique a s´ı misma lo cual a primera vista parece extra˜no, pero resulta ´util para definir funciones recursivas como veremos m´as adelante.

5.

El C´

alculo Lambda con Tipos Simples

λ

(7)

5.1. Sintaxis de λ→

A la sintaxis concreta agregamos:

e::=. . . |λx:T.e|e e

Es de importancia observar lo siguiente:

El tipo del par´ametro en una abstracci´on se d´a explicitamente, esto facilita la implementaci´on de la sem´antica est´atica.

La abstracci´on de funciones incorpora a la sintaxis del lenguaje anotaciones de tipos. Esto se conoce como tipificaci´on `a la Church.

Las funciones son an´onimas, es decir no tienen nombre.

Obs´ervese que es m´as usual nombrar funciones, como por ejemplo:

functiondoble(n:Nat)⇒n+n

que en nuestro caso se escribe simplemente comoλn:Nat.n+nM´as adelante discutimos como nombrar funciones.

La sintaxis abstracta se extiende como sigue:

t::=. . . |lam(T, x.t)|app(t, t)

Recordemos que en cualquier caso de ligado se utiliza la α-equivalencia. Es decir, expresiones que difieren exclusivamente en sus variables ligadas se consideran id´enticas.

5.2. Sem´antica Est´atica de λ→

Respecto al sistema de tipos, se agrega el constructor de tipos de funci´on

T::=. . . |T→T

Obs´ervese que esta es la primera ocasi´on en que el sistema de tipos se vuelve infinito, es decir hay una infinidad de tipos. En particular el constructor de tipos funci´on genera tipos para funciones de orden superior, es decir, funciones que pueden recibir funciones como argumentos o devolver funciones como resultados. Por ejemplo:

Nat→(Nat→Nat) es el tipo de funciones que devuelven una funcion de naturales en naturales para cada natural dado.

(8)

(Nat→ Nat) →(Nat→ Nat) es el tipo de funciones que devuelven una funci´on de naturales en naturales a cada funci´on de naturales en naturales dada.

Es de gran importancia observar que los tipos funci´on se asocian a la derecha, es decir,

T1 →T2→. . .→Tn−1→Tn significa T1 →(T2 →. . .→(Tn−1 →Tn). . .)

Las nuevas reglas de tipado son:

Γ, x:T`e:S

Γ`lam(T, x.e) :T→S (tabs)

Γ`e1 :T→S Γ`e2 :T Γ`app(e1, e2) :S

(tapp)

5.3. Sem´antica Din´amica de λ→

Respecto a la sem´antica din´amica tenemos las siguientes novedades.

Las abstracciones funcionales se consideran valores:

v ::= . . . |lam(T, x.e) Las nuevas reglas de evaluaci´on son:

e1 →e01

app(e1, e2)→app(e01, e2)

(eappi)

e2 →e02

app(v, e2)→app(v, e02)

(eappd)

app(lam(T, x.e), v)→e[x:=v] (β)

En su conjunto las reglas de evaluaci´on modelan la estrategia de llamada por valor, para evaluar una aplicaci´on e1e2 es necesario primero reducire1 hasta que sea una funci´on expl´ıcita, es decir, un valor funcional, para despu´es evaluar el argumentoe2 hasta que sea un valor expl´ıcito. Es hasta ese momento cuando se puede ejecutar la aplicaci´on mediante la reglaβ.

En este caso es muy com´un usar sintaxis concreta para la evaluaci´on. Por ejemplo, la regla (β) es:

(9)

6.

Propiedades importantes de

λ

Para terminar las generalidades del c´alculo lambda presentamos algunas de sus propiedades relevantes

6.1. Seguridad del lenguaje λ→

A continuaci´on damos las herramientas necesarias para probar la necesidad del lenguaje.

Lema 1 (Inversi´on) Si Γ`t:T entonces 1. Sit=x entonces Γ = Γ0, x:T

2. Sit=λx:R.e entonces T=R→S yΓ, x:R`e:S

3. Sit=e1e2 entonces existe S tal que Γ`e1:S→T y Γ`e2:S

Demostraci´on. Inmediato por inspecci´on de las reglas de tipado. a

Lema 2 (Sustituci´on) Si Γ, x:T`t:S y Γ`e:T entoncesΓ`t[x:=e] :S

Demostraci´on. Inducci´on sobre la derivaci´on del primer juicio. a

Proposici´on 1 (Preservaci´on) Si Γ`e:T y e→e0 entonces Γ`e0:T

Demostraci´on. Inducci´on sobree→e0 a

Lema 3 (Formas can´onicas) Un valor de tipo funci´on es una abstracci´on lambda. Es decir, si e

es un valor y Γ`e:T→S entonces e=λx:T.e0 para algunos x, e0 tales queΓ, x:T`e0:S

Demostraci´on. Directo. a

Proposici´on 2 (Progreso) Si `e:T entonces ees un valor o existe e0 tal quee→e0

Demostraci´on. Inducci´on sobre las reglas de tipado a

6.2. Terminaci´on de λ→

La propiedad de terminaci´on o normalizaci´on fuerte vuelve a ser v´alida en el caso del c´alculo lambda con tipos simples. Esta es la instancia m´as simple de una t´ecnica importante en el estudio de lenguajes de programaci´on conocida comoterminaci´on basada en tiposdonde la sem´antica est´atica garantiza que los programas terminar´an adecuadamente.

(10)

La demostraci´on de este hecho no es simple y cae fuera de los l´ımites de este curso. Es ´util intentar una prueba por inducci´on sobre `y ver por qu´e falla.

Referencias

Documento similar

Como en el caso de los tipos enteros, los lenguajes suelen soportar varios tipos real, de modo que el programador pueda seleccionar aquel cuyo rango y precisi´on en el coeficiente

El inconveniente operativo que presenta el hecho de que la distribuci´ on de probabilidad de una variable aleatoria es una funci´ on de conjunto se resuelve mediante el uso de

El objetivo de este bolet´ın es ilustrar uno de los m´etodos que permiten calcular la expresi´on regular que denota el mismo lenguaje que un Aut´omata Finito reconoce mediante

Comparaci´ on gr´ afica alrededor de la esquina encontrada para el caso de Hermite con detecci´ on previa de esquinas (Figura 5.19) y Hermite segmen- tario (Figura 5.20) del

Estudios como este proyecto con la programaci´ on de sensores de acuerdo a un est´ andar dom´ otico, la creaci´ on de nuevas aplicaciones para viviendas o la programaci´ on

Calcular los l´ımites

Para obtener los espectros de absorci´on y determinar las posibles transiciones de fase en funci´on de la presi´on a temperatura ambiente, se realiza la detecci´on del

• More research is required on the impact of psychosocial interventions that aim to: reduce mental disorders (depression and anxiety), substance use, self-harm and suicide;