160 likes | 291 Views
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
E N D
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 • Todos os componentes são funções
uma função é concebida como uma abstração • exemplo: • f(x) = a escreve-se \x.a • g(x) = x escreve-se \x.x • uma função composta é conhecida como aplicação • exemplo de aplicação • f(3) escreve-se (\x.a)3 => a ! • logo, f(g(x)) => (\x.a)g(x) => (\x.a(\x.x)) !
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: • \x.x x é ligada • \x.y y é livre
Linguagem Funcional vs. Lambda Cálculo • uma variável é uma expressão lambda • se M é uma expressão lambda e x é uma variável, então \x.M é uma expressão lambda. • 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
Lambda Cálculo é: • uma linguagem, a notação lambda • expressões lambda • e regras • para simplificar e manipular expressões lambda • a notação lambda é uma linguagem de primeira ordem, com • conjunto de nomes de variáveis, V • conjunto de constantes predefinidas, C • Átomo • Todo membro de C e de V é um átomo
Notação Lambda • uma notação que cria função sem dar-lhe nome • conhecida como notação lambda: • \padrão -> expressão
Expressão Lambda • uma expressão lambda é definida por • Cláusula Básica: • todo átomo é uma expressão lambda • Cláusula Indutiva • 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) • se E1 é uma expressão lambda e v é uma variável, então \v.E1 é uma expressão lambda (regra de abstração)
Definição Formal (BNF) <exp> ::= <constante> | <variável> | (<exp> <exp>) aplicação | (\ <variável> <exp>) abstração
Exemplo • x, y, 2 e 3 são expressões lambda • x, y pertencem a V • 2, 3 pertencem a C • equivalentes a: • \x.x • \y.y • \x.2 • \x.3, respectivamente
Convenções • Associação a esquerda • E1 E2 E3 = (E1 E2 E3) = ((E1 E2) E3) • porém, (E1 (E2 E3)) != (E1 E2 E3)
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: • "uma função de x que adiciona x a 3"
Lambda Conversões • seja \x.(x + 3) • trocando-se x por y, temos \y.(y + 3) • se aplicarmos a abstração lambda a 5 temos: • \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
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 " • \x.(x + 3) renomeada para \y.(y + 3) • \x.(x + y) renomeada para \z.(z + y) • porém \x.(x + y) não pode ser renomeada para \y.(y + y)
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: • \x y -> (x + y) 3 5 • 8
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