16
Lambda Cálculo & Programação Funcional Rodrigo Diego, Paulo Henrique {rdma, php} at cin dot ufpe dot br

Lambda Cálculo & Programação Funcional

Embed Size (px)

DESCRIPTION

Lambda Cálculo & Programação Funcional. Rodrigo Diego, Paulo Henrique {rdma, php} at cin dot ufpe dot br. Motivação. É um modelo formal de computação equivalente a Máquinas de Turing, Markov e etc. Church, 1941 Notação que especifica uma função e regras de composição - PowerPoint PPT Presentation

Citation preview

Page 1: Lambda Cálculo & Programação Funcional

Lambda Cálculo & Programação Funcional

Rodrigo Diego, Paulo Henrique{rdma, php} at cin dot ufpe dot br

Page 2: Lambda Cálculo & Programação Funcional

Motivação

• É um modelo formal de computação equivalente a Máquinas de Turing, Markov e etc.

• Church, 1941• Notação que especifica uma função e regras de

composição• Todos os componentes são funções

Page 3: Lambda Cálculo & Programação Funcional

• uma função é concebida como uma abstração• exemplo:

o f(x) = a escreve-se \x.ao g(x) = x escreve-se \x.x

• uma função composta é conhecida como aplicaçãoo exemplo de aplicação

f(3) escreve-se (\x.a)3 => a !o logo, f(g(x)) => (\x.a)g(x) => (\x.a(\x.x)) !

Page 4: Lambda Cálculo & Programação Funcional

• uma abstração pode ser livre (free) ou ligada (bound)• esse conceito tem a ver com a presença ou não de uma

variável x em M, onde a abstração é do tipo \x.M• exemplo:

o \x.x       x é ligadao \x.y       y é livre

Page 5: Lambda Cálculo & Programação Funcional

Linguagem Funcional vs. Lambda Cálculo

1. uma variável é uma expressão lambda2. se M é uma expressão lambda e x é uma variável, então \

x.M é uma expressão lambda.o exemplo: quadrado de x

\x.x*x                              (lambda-calculo) Prelude> (\x.x*x) 2          (Haskell) 4

– se F e A são duas expressões lambda, então FA é uma expressão lambda

Page 6: Lambda Cálculo & Programação Funcional

Lambda Cálculo é:

• uma linguagem, a notação lambdao expressões lambda

• e regraso para simplificar e manipular expressões lambda

• a notação lambda é uma linguagem de primeira ordem, como conjunto de nomes de variáveis, Vo conjunto de constantes predefinidas, C

• Átomoo Todo membro de C e de V é um átomo 

Page 7: Lambda Cálculo & Programação Funcional

Notação Lambda

• uma notação que cria função sem dar-lhe nome• conhecida como notação lambda:

o \padrão -> expressão

Page 8: Lambda Cálculo & Programação Funcional

Expressão Lambda

• uma expressão lambda é definida por• Cláusula Básica:

o todo átomo é uma expressão lambda• Cláusula Indutiva

o se E1 e E2 são expressões lambda, então (E1E2) também o são (regra de aplicação - E1 operador, E2 operando)

o se E1 é uma expressão lambda e v é uma variável, então \v.E1 é uma expressão lambda (regra de abstração)

Page 9: Lambda Cálculo & Programação Funcional

Definição Formal (BNF)

<exp>  ::=  <constante>    |   <variável>    |   (<exp> <exp>)       aplicação    |   (\ <variável>  <exp>)    abstração

Page 10: Lambda Cálculo & Programação Funcional

Exemplo

• x, y, 2 e 3 são expressões lambdao x, y pertencem a Vo 2, 3 pertencem a C

• equivalentes a:o \x.xo \y.yo \x.2o \x.3, respectivamente

Page 11: Lambda Cálculo & Programação Funcional

Convenções

• Associação a esquerdao E1 E2 E3 = (E1 E2 E3) = ((E1 E2) E3)o porém, (E1 (E2 E3)) != (E1 E2 E3)

Page 12: Lambda Cálculo & Programação Funcional

Expressão Lambda - Abstração

• a variável v de uma abstração \v.E é chamada de parâmetro formal

• a expressão E é chamada de corpo da expressão• na prática, uma expressão \v.E é uma função de argumento

v a partir de uma expressão E• a expressão lambda \x. (+ x 3) é lida como:

o "uma função de x que adiciona x a 3"

Page 13: Lambda Cálculo & Programação Funcional

Lambda Conversões

• seja \x.(x + 3)o trocando-se x por y, temos \y.(y + 3)

• se aplicarmos a abstração lambda a 5 temos:o \x.(x + 3) 5 = \y.(y + 3) 5 = 8

• regras de conversão são necessárias para provar a equivalência entre lambda expressões

Page 14: Lambda Cálculo & Programação Funcional

Regras de Conversão Lambda

• a-conversão:• " Uma variável vinculada pode ser consistentemente

renomeada, em uma expressão lambda, se não houver ocorrência livre da mesma "o \x.(x + 3) renomeada para \y.(y + 3)o \x.(x + y) renomeada para \z.(z + y)o porém \x.(x + y) não pode ser renomeada para \y.(y + y)

Page 15: Lambda Cálculo & Programação Funcional

Regra de Conversão Lambda

• b-conversão• " A expressão lambda (\x.E)E’, pode ser reduzida pela

substituição, por E’, em todas as ocorrências de x  no corpo E, desde que E’ não tenha ocorrência livre da mesma "

• \x.(x + 5) 3 reduzida para (3 + 5) = 8• \x.(\y.(x + y)) 3 5 reduzida para \y.(3 + y) 5 e logo após para

(3 + 5) = 8• Em Haskell:

o \x y -> (x + y) 3 5o 8

Page 16: Lambda Cálculo & Programação Funcional

• a expressão redex significa reducible expression• é toda expressão potencialmente reduzível através de uma

b-conversão• forma normal é quando não há mais nenhuma redução

possível