Está en la página 1de 51

Programación

Funcional
Cálculo Lambda
Paradigmas de Programación - 2021

Dr. Rubén A. Bernal


rbernal@frre.utn.edu.ar
Un poco de Historia

• ¿Son las matemáticas


completas?, es decir, ¿es posible
demostrar que un sistema
axiomático permite derivar toda
proposición verdadera?
• ¿Son las matemáticas
consistentes?, es decir, ¿no hay
contradicciones?
• ¿Son las matemáticas
decidibles?, es decir, ¿cualquier David Hilbert (1862-1943)

proposición se puede demostrar


como cierta o falsa tras una
secuencia finita de pasos” “Hilbert's
Entscheidungsproblem”
Las Matemáticas tienen una terrible falla

https://www.youtube.com/watch?v=RRg38oNQ9vk&t=834s
Un poco de Historia

Teorema de Incompletitud (1931)

“En cualquier formalización consistente


de las matemáticas, se puede construir
una afirmación que no se puede
demostrar ni se puede refutar dentro de
ese sistema”

“Ningún sistema consistente se puede


usar para demostrarse a sí mismo”
Kurt Gödel (1906-1978)
Paradojas
Solo sé que no sé nada.

La frase siguiente es verdadera


La frase anterior es falsa
Origen

• Sus orígenes provienen del Cálculo Lambda (-


cálculo), una teoría matemática elaborada por
“Alonzo Church” como apoyo a sus estudios sobre
computabilidad en la década de 1930.
• Church usó el cálculo lambda en 1936 para resolver
el Entscheidungsproblem.
• Church probó que no había algoritmo que pudiese
ser considerado como una "solución" al
Entscheidungsproblem.
• Independientemente el mismo año, Turing prueba
lo mismo con su “Máquina de Turing”. Alonzo Church (1903-1995)
Cálculo Lambda. Alcance

El cálculo lambda es un sistema


formal diseñado para investigar:

1. la definición de función
2. la aplicación de una función
3. la recursividad
Calculo Aritmético

Expresión

5+3*2
Operador
5+6
11 Reducción
Expresiones equivalentes

Expresión irreducible
Calculo Aritmético

Redex

(+ (* 2 3) (/ 4 2))
(+ 6 (/ 4 2))
(+ 6 2)
8
Expresión irreducible
Cálculo Lambda

f(x) = E
donde E contiene a x

Luego f(u) = E[x:=u],


que resulta de sustituir u en cada aparición de x en
E.

Si f(x)=x*x,
entonces f(3)=3*3=9.
Abstracción Funcional
Permite definir funciones de un solo argumento y con un cuerpo
especifico, denotado por:

λx.B
(λx. + x 2)
Función de var x que suma x a 2
f(x) = x + 2
Aplicación Funcional
Permite aplicar una función definida sobre un argumento real (A). Por
yuxtaposición

f A
(λx.B) A
Aplicación de una función de var x y
cuerpo B al parámetro actual A
Ejemplos

(λx. + x 2) 3 →
5

(λy. y 3) (λx. + x 2) →
(λx. + x 2) 3 →
+ 3 2 →
5
Cálculo Lambda
Sintaxis
Consideramos un conjunto finito de variables {a, b, c, ..., x, y, z}.
El conjunto de todas las -expresiones por la siguiente gramática libre de
contexto en BNF.

<expr> ::= <const>


| <var>
Abstracción
| (λ <var>.<expr>) Funcional
| (<expr> <expr>) Aplicación

Ejemplos
λx.x
λx.(λy.y)
λf.f (λx.x)
Convenciones sintácticas
Convenciones sintácticas para hacer más sencillas las λ-expresiones

La aplicación va a ser asociativa por la izquierda:


M N P Q ► (((M N) P) Q)

La abstracción es asociativa por la derecha:


λx.λy.M ► (λx.(λy.M))

La aplicación es prioritaria sobre la abstracción:


λx.M N ► λx.(M N)

Se puede suprimir símbolos λ en abstracciones consecutivas:


λx.λy. ... λz.M ► λxy ... z.M
Ámbito de variables

• El ámbito de una variable es la porción de la expresión


donde el identificador es accesible.

(λx.+ x y) 3
• La abstracción λx.E introduce la variable x cuyo ámbito es
la expresión E vinculando a todas las variables x que ocurran
en E.
• La variable y podría considerarse libre
Variables libres y ligadas

Variables Ligadas
Una variable x se dice ligada (o asociada) en una expresión E si
aparece en el ámbito de una abstracción de variable instanciable
x.

Bound[x]= {}
Bound[λx.E] = Bound[E]  {x}
Bound[E1 E2] = Bound[E1]  Bound[E2]

• Ejemplo:
• (λy.z (λx.x y))
• La z es libre y la x está ligada.
• La y está ligada.
Variables Ligadas

Bound[λy.z (λx.x y)] =


Bound[z (λx.x y)]  {y} =
Bound[z]  Bound[(λx.x y)]  {y} =
{ }  Bound[(λx.x y)]  {y} =
{ }  Bound[x y]  {x}  {y} =
{ }  Bound[x]  Bound[y]  {x}  {y} =
{ }  { }  { }  {x}  {y} =
{x, y}
Variables libres y ligadas

• Variables Libres
• Una variable se dice libre en E si tiene ocurrencias que no están
ligadas en E. El conjunto de las variables libres de una
expresión E se pueden definir recursivamente como sigue:

Free[x] = {x}
Free[λx.E] = Free[E] – {x}
Free[E1 E2] = Free[E1]  Free[E2]
• Ejemplos:
• Free[λx.x(λy.xyz)] = {z}
• Free[λxy.x] = 
Variables Libres

Free[λx.x (λy.xyz)] =
Free[x (λy.xyz)] – {x} =
Free[x]  Free[(λy.xyz)] – {x} =
{x}  Free[xyz] – {y} – {x} =
{x}  Free[x]  Free[y]  Free[z] – {y} – {x} =
{x}  {x}  {y}  {z} – {y} – {x} =
{x, y, z} – {y} – {x} =
{x, z} – {x} =
{z}
Ocurrencias libres y ligadas

Una variable puede ser libre o ligada dependiendo de la su


ocurrencia de uso:

+ x ((λx.+ x y) 3)
La variable x aparece libre en su primera ocurrencia y ligada
en la segunda.
Equivalencia de Expresiones

En -cálculo dos -expresiones M y N que sólo difieren en sus variables


ligadas son equivalentes.

Dadas:

M = x (λy.y)
N = x (λz.z)

M  N
Relación de equivalencia
Considerando a  como el conjunto de todas las expresiones
lambda; se puede definir una relación de equivalencia entre las
expresiones lambda que cumplen las propiedades:

Reflexiva
MM
Simétrica
si M  N  N  M
Transitiva
si M  N y N  P  M  P
Semántica Operacional
La evaluación de una expresión se compone de pasos de reducción donde
cada uno de los pasos se obtiene por reescritura:

E → E´
• Se parte de una expresión inicial y mediante un proceso de reescritura se
obtiene una expresión final irreducible.

• Cada reducción de E, reemplaza cierta subexpresión de acuerdo con


ciertas reglas; tales subexpresiones se llaman redex (reducible
expression).

• Se considera finalizado el cómputo cuando ya no aparecen más redexes.


λ-reducciones

• Las reglas de reescritura que se utilizan para reescribir un redex son:

-reducción -reducción o -reducción -reducción


conversión
-reducción

Se llaman -reducción a la regla que transforma constantes. Se


describe con →

• Ejemplo
* (+ 1 2) (- 4 1) →
* 3 (- 4 1) →
* 3 3 →
9
-conversión

• Definiremos la relación de -reducción (o -conversión)


como sigue:

λx.M → λy.[x:=y]M

si y  Free(M)

• La -reducción es formalizar que si renombramos variables


ligadas de -expresiones, éstas siguen siendo equivalentes
(mientras no utilicemos variables libres para la sustitución).
-conversión
Ejemplo
Reemplazo de la variable x por y considerando que y no puede estar
libre en el cuerpo de la abstracción.

λx.(λx.x) x →
λx.(λy.y) x
-reducción

La -reducción es el proceso de sustitución del argumento N,


sobre el cuerpo de la abstracción, reemplazando en M todas
las ocurrencias libres de la variable instanciable.

(λx.M) N → [x:=N]M

• La -expresion (x.M) N es un -redex, es decir, se


puede reducir mediante una -reducción.
-reducción
Ejemplos
Ejemplo simple de -reducción

(λx. * x x) 2 →
(* 2 2) →
4
-reducción
Ejemplos
Ejemplo de -reducción donde no aparece el parámetro
formal en el cuerpo de la abstracción.

(λx.3) 2 →
3
-reducción
Ejemplos
Ejemplo de -reducción donde el parámetro actual es una
función:

(λx.x y) (λz.z) →
(λz.z) y →
y
-reducción
Ejemplos
Ejemplo de -reducción donde el parámetro actual es una
función:

(λf.f 3) (λx.+ x 1) →
(λx.+ x 1) 3 →
+ 3 1 →
4
-reducción
Ejemplos
El cuerpo de una abstracción puede contener otra abstracción
(se puede ver la currificación en acción).

(λx.(λy.- y x)) 4 5 →
(λy.- y 4) 5 →
- 5 4 →
1
-reducción
• La -reducción (también llamada extensionalidad) expresa la idea de
que dos funciones son lo mismo si dan el mismo resultado para todos
sus argumentos.

λx.M x → M

si x  Free(M)
y M una función

• La -expresión λx.M x es un -redex.


-reducción
Ejemplo
Dos funciones serán equivalente si devuelven el mismo
resultado para cualquier argumento.

(λx.(λy.y)) x →
λy.y
-reducción
Ejercicios
Reducir las siguientes expresiones:

• (λx.(λx.+ (- x 1)) x 3) 2

• (λx.((λx.x) y)) z
Sustitución

Considerando la expresión:
(λx.M) N → [x:=N]M

[x:=N]x  N
[x:=N]y  y si x  y

[x:=N](P Q)  [x:=N]P [x:=N]Q


[x:=N](λx.P)  λx.P (porque x está ligada en P)

[x:=N](λy.P)  λy.([x:=N]P)
λy.([x:=N]P) si x  y

¿Qué pasa si N tiene una y libre?


Captura de Variables

• Al sustituir y en el cuerpo de la abstracción, la ocurrencia libre de y


reemplazará a x, transformándose en ligada:

(λx.(λy.x y)) y →

λy.(y y) λz.(y z)
Sustitución Segura

• Una sustitución segura es aquella en la que no se produce ninguna


captura de variables.

• Formalmente:
Para la expresión:

λy.([x:=N]P)
Se ha de cumplir la condición suficiente:
Bound (P)  Free (N) = 
Sustitución: redefinición

• Podríamos redefinir la sustitución usando la noción de -


equivalencia y evitar de este modo la captura de variables.

Si y  Free(N)

[x:=N](λy.P) 
[x:=N](λz.[y:=z]P)

con z  Free(N)  Free (P);


x  y
Redex

• Un redex es un termino de la forma:

(λx.M) N
La abstracción funcional representa la función a aplicar y el término N
el argumento efectivo.
Un redex representa la idea de un cómputo que está por realizarse.
Forma Normal

Dada una -expresión nos interesa su forma mas reducida,


que sería la “salida” de la función (no contiene ningún redex).

• Definición: Una -expresión está en forma normal si no


contiene ningún redex.

Si una -expresión M se reduce a una -expresión N en forma


normal, es decir,
M →* N
decimos que N es una forma normal de M.
Forma Normal II
No toda -expresión admite forma normal.

Considerando:  = (λx.x x)(λy.y y)

(λx.x x) (λy.y y)
[x:=(λy.y y)] (x x)
(λy.y y) (λy.y y) = 

Observamos que  →* ; es decir, nunca se llega a una


expresión sin -redex (no -reducible), luego no admite
forma normal.
Reducción de λ-expresiones

• La reducción de un término a una forma normal puede realizarse


siguiendo una variedad de estrategias posibles en la aplicación de las
reglas.

(λx.((λt.t) y)) z
Ordenes de Reducción

Impaciente Perezoso
Se reduce el redex más Se reduce el redex más
interno de más a la externo de más a la
izquierda. izquierda.
Ordenes de Reducción

• El orden de reducción determina la elección del redex a reducir; para


identificar cuál será el redex elegido se usará lo siguiente:

• Redex más a la izquierda: es aquel cuya 


aparece textualmente a la izquierda de cualquier
otro redex de la expresión.
• Redex externo: es aquel que no está contenido
en otro redex.
• Redex interno: es aquel que no contiene otro
redex.
Teoremas de Church-Rosser

Confluencia Terminación

A_mechanical_proof_of_the_Church-Rosser_theorem.pdf
Propiedad de Confluencia

Teorema I (de Churh-Rosser):


Para toda -expresión M, si M →* P y M →* Q ,
existe una -expresión E tal que P→*E y Q→*E (es la
"propiedad del diamante").

P Q

E
Corolario:
Si M admite forma normal N, ésta es única salvo -reducción
(renombramiento de variables).
Propiedad de Terminación

Teorema II (de Churh-Rosser):


Para toda -expresión M, si M →* P y P está en forma
normal, existe una secuencia de reducción en orden
normal de M a P.

• Corolario:
Si M admite forma normal, esto no significa que cualquier
secuencia que empiece en M, termine.
Como en el caso visto:  = (λx.x x)(λy.y y)
Propiedad de Terminación
Ejemplo

((λy.x) )
Impaciente: empezando "por dentro" ( g  g ...)
(λy.x)  → (λy.x)  → ... (no termina)

Perezoso: empezando por fuera


(λy.x)  → x

También podría gustarte