Cálculo Lambda( – Calculus)
João Bosco da Mota AlvesProgramação Funcional
INE/CTC/UFSCJunho/2001
Alterado, com autorização, por C. Cesar de Sá,DCC/CCT/UDESC
Junho/2003
2
Motivação Esta apresentação tem por objetivo introduzir uma
idéia da fundamentação matemática ao Haskell É um modelo formal de computação equivalente
as Máquinas de Turing, Post, Markov, Bird, e teoria das funções primitivas.
Contornou as dificuldades de notação entre os matemáticos, exemplo: f ’(x) = f ’’(x) + a
E quando um matemático esquecia uma “ ‘ ” e, f ’’?
O outro teria que advinhar se era: g, g’, g’’ ou g’’’?
3
Embasamento teórico Cálculo Lambda ( calculus)
Church, 1941 Notação que especifica uma função e regras de
composição Todos os componentes são funções Uma expressão lambda especifica o(s) parâmetros e o
mapeamento de uma função sem usar identificadores. Exemplo: para a função cubo(x) = x * x* x a
expressão lambda correspondente é (x) x * x * x Para a aplicação da expressão lambda especifica-se o
valor do parâmetro no final da expressão. Exemplo: ((x) x * x * x)(3) resulta no valor 27
4
Embasamento teórico Uma função é conhecida como uma abstração Analogia com:
f(x)=a escreve-se: x . a g(x)=x escreve-se: x . x h(x)=b escreve-se: x . b
E quanto f(g(b) ?
Logo, observa-se o par (M N), que representa a aplicação de M para N, no caso: M x . a e N x . x em b, onde este N último também é um par (M N) (ufa, isto é que é recursão)
Ou seja: (x . a (x . x b)) é uma abstração lambda do tipo(M (M N)) (ufa, isto é uma abstração... lambda)
f(g(b) = (x . a (x . x b))
5
Embasamento teórico Uma abstração lambda pode ser “free” (livre) ou
“bound” (fechada). Este conceito se refere a ligação de x em M, onde a abstraçào é do tipo: x . M
Exemplos: x . x : x é bound, tanto em como em M x . y : x é bound, y é free (x . (x . x y ) x) : vejam os escopos e a associação,
há varios x e y
x : quase como quantificadores da LPO A regra é: “x é bound, então está no escopo de x“ “x é free, então não está no escopo de x“
6
Embasamento teórico x é dita ser fechada se {var. free} = 0 x é dita ser livre se free(abst. ) = 0
7
1. Uma variável é uma expressão .
2. Se M é uma expressão e x é uma variável, então x.M é uma expressão .
Exemplo: Quadrado de xQ x * x, x (matemática)Q(x) = x * x (Fortran)x. x * x (-Cálculo)
fun q (x: real) = x * x; (ML) q = fn: real real
3. Se F e A são duas expressões , então FA é uma expressão .
Exemplo: Área de um círculoF * r2, r
Q x * x, x H = F ° Q (função composta)H(r) = 3,14 * Q(r) (Fortran)
argumento corpo
primitivas
formasfuncionais
composição
Linguagens Funcionais X -Cálculo
(y. x). * (x * x)x.x * xy. * y * y
Em Haskell:Prelude> (\x -> x*x) 2
4
8
Formas funcionais Uma forma funcional ou função de mais alta
ordem é aquela que usa funções como parâmetros ou fornece uma função como resultado, ou uma combinação de ambas
Composição de funções: forma funcional que usa duas funções como argumentos e cujo resultado é obtido pela aplicação da primeira função sobre o resultado da segunda função. Notação: h f g Exemplo: Para f (x) x * x e g (x) x + 3, h (5) f ( g ( x)) resulta em 64
9
Notação lambda Motivação (relembre o 1o. Slide): as vezes,
precisa-se definir pequenas funções, sem dar-lhes nomes
Exemplo Calcular x2+3x+1, para x [1..100]
Claro, que é possível usarYs = map f [1 .. 100]where f x = x*x + 3 * x + 1
10
Notação Lambda Há uma notação (-notation) que cria
função sem dar-lhe nome,\padrão -> expressão
Conhecida como notação lambda O símbolo \ é o mais parecido com Então: \x -> x*x + 3*x + 1
Prelude> (\x -> (x * x) + 3*x + 1) 771
11
Notação Lambda Lê-se: \x -> x*x + 3*x + 1, como “a
função que, dado o argumento x, calcula o valor em x*x + 3*x + 1”
Muito usada para a passagem de função como parâmetro; exemploys = map (\x -> x*x + 3*x + 1) [1 .. x]
Prelude> map (\x -> (x * x) + 3*x + 1) [7 .. 17][71,89,109,131,155,181,209,239,271,305,341] Prelude>
12
Notação lambda Em XLISPWIN> #' (lambda (x) (+ x 3))#<Closure: #484facad>> (funcall * 5)8 > (mapcar #' (lambda (x) (+ x 2)) '(1 2 3
4 5))(3 4 5 6 7)
13
– Calculus consiste de: Uma linguagem, a notação –
Que nos dá expressões lambda E regras :
Para simplificar e manipular essas expressões lambda, e consequentemente fazermos cálculos
Precisamos, então, aprender tanto a linguagem (notação) quanto as regras !
14
– Calculus Suponha que f : R -> R seja definida
por f(x) = (x + 1)2
Uma função de uma variável, f(x) f(a), para um a específico, é obtido
substituindo-se, por a, em todas as ocorrências de x
Também, f(x) a, aplicação de f(x) a a
15
– Calculus Então:
f(x) 3 = (3 + 1)2 = 16 ( x . (x+1)^2) ( x . M) aplicando em 3, então: ( x . M
N), logo: ( x . M 3) = ( x . (x+1)^2 3) = ( x .
(3+1)^2)) = = ( x . 16) = 16Em Haskell:Prelude> (\x -> (x + 1) ^^ 2) 316.0
16
– Calculus Suponha, agora, f : RR -> R, definida por
f(x,y) = x + y + (2*x*y) Aqui, f é um par de nos reais, (x,y) Dizemos que f é uma função de duas
variáveis, x e y f(a,b) pode ser obtido substituindo-se por
a e b as ocorrências de x e y, respectivamente!
17
– Calculus Então
f(x,y) 3 5 = 3 + 5 + (2*3*5) = 38
Como exercício, reescreva os passos acima em notação
a partir de: (x y . M N Q)
Em Haskell:Prelude> (\x y -> (x + y)+ (2*x*y)) 3 538
18
– Calculus Entretanto, há outra forma de se pensar
a aplicação de função Ao invés de aplicar-se às duas variáveis
simultaneamente, aplica-se à apenas uma de cada vez
Primeiro, f(x,y) 3 = 3 + y + (6*y) = g(y) Depois g(y) 5 = 3 + 5 + (6*5) = 38
19
– Calculus É sempre possível transformar uma
função de n variáveis em uma função de (n – 1) variáveis, aplicando-a para um valor de um de seus argumentos
Esta importante técnica é conhecida como currying (“currificação”)
E é usada na aplicação de função em cálculo lambda
20
– Calculus Seja, f : RR R -> R, definida por
f(x,y,z) = x + y + z Computando f(2,5,4)f(x,y,z) 2 5 4 2 + y + z f(2,y,z) 5 4 2 + 5 + z f(2,5,z) 4 2 + 5 + 4 11
21
– Calculus A notação lambda é uma linguagem de
primeira ordem, com Conjunto de nomes de variáveis, V Conjunto de constantes pré-definidas,
C Átomo
Todo membro de V e de C é um átomo Ex.: 2, amor, ...
22
– Calculus Expressão lambda, , é definida por: Cláusula Básica
Todo átomo pertence a Cláusula Indutiva
Se E1, E2 , então (E1 E2) (Regra de aplicação: E1, operador; E2, operando)
Se E e v V, então (v. E) (Abstração lambda)
23
– Calculus Cláusula Extrema
Uma expressão não é uma expressão lambda a menos que possa ser mostrada pertencer a , pela aplicação das cláusulas básica e indutiva, em um número finito de vezes
24
– CalculusNa meta-linguagem BNF se pode definir uma
expressão em Abstração , dado por:
<exp> ::= <constante> | <variável> | (<exp> <exp>) aplicação | ( <variável> <exp>) abstração
Claro que sua definição formal tinha que ser recursiva ...
25
– Calculus Ex.: x, z2, 2, 3 e +, são expressões lambda que
são átomos, pois
x, z2 V
2, 3, + C
Equivalente a:x .x , z2 . z2
x .2 , x .3 , x .+respectivamente....
26
– Calculus Como x e 2 são expressões lambda,
então também o são (pela regra da aplicação)
(x 2)((x 2) 2)(x (2 2))equivalente a:x .2) , ((x .2) 2), (x . (2 2))respectivamente...
27
– Calculus Para eliminar parênteses, pode-se
estabelecer convenções Associação à esquerda, por exemplo
E1 E2 E3 = (E1 E2 E3) = ((E1 E2) E3)
Note que (E1 (E2 E3)) E1 E2 E3
28
Simplificações ( – Calculus) ((+ x) y) + x y (((+ x) y) z) + x y z ((x (3 (z 5))) 4) x (3 (z 5)) 4 (x (((3 z) 5) 4)) ?
29
– Calculus O poder expressivo do cálculo
lambda, vem das expressões lambda geradas pelo uso da regra de aplicação
Exemplo de abstrações lambda: ( x. 2) ( x. (+ x 3)) ( x. x) ( x. ( y. (+ x y)))
30
– Calculus A variável v de uma abstração lambda
v. E é chamada de parâmetro formal A expressão E é chamada de corpo da
expressão lambda Também podemos ter variáveis livres A variável y, abaixo, é livre; x, não
x . (+ x y) (já visto !)
31
– Calculus Informalmente, a proposta de uma
abstração lambda v. E é fazer uma função de um argumento, v, a partir de uma expressão lambda E
A função, propriamente dita, é o corpo E A expressão lambda x . (+ x 3) é lida
como “a função de x que adiciona x a 3”
32
– Calculus Abstração lambda tem associação à
esquerda:x. y. E=x. (y. E)= (x. (y. E))x. y. (+ x y) 2=(x. (y. (+ x y) 2)) (x. y. (+ x y)) 2
33
– Calculus Outro exemplo: Já a -expressão x. y. (+ x y) é lida
como a função de x que é a função de y que adiciona x a y
Observe a sutileza deste exemplo ...
34
– Calculus Seja x. (+ x 3)Trocando-se x por y, obtem-se a mesma
função y. (+ y 3), logo, substituições de variáveis são permitidas.
Se aplicada abstração a 5, as duas avaliam 8:
x. (+ x 3) 5 = y. (+ y 3) 5 = 8 Precisa-se de regras de conversão que
mostre a equivalência entre -exp
35
Regras de conversão em – Calculus
-conversão :
“Uma variável vinculada pode ser consistentemente renomeada, em uma -expression, 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)Mas não x. (+ x y) para y. (+ y y)
36
Regras de conversão em – Calculus
-conversão :“A -expression (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) = 8x. y. (+ x y)) 3 5 para (+ 3 5) = 8
x. (+ x y)) 3 5 tal substituição não permitida, é apenas mais uma expressão
37
Regras de conversão em – Calculus
x. y. (+ x y)) 3 5x. (y. (+ x y))) 3) 5y. (+ 3 y)) 5(+ 3 5)8 Viu como a expressão lambda tem
associação à esquerda?
Em Haskell:(\x y -> ( x+ y)) 3 58
Estendendo: (\x y z -> (z + x + y)) 4 5 8
17
38
Regras de conversão em – Calculus A expressão redex significa reducible
expression, ou expressão redutível Uma forma normal de redução surge
quando se usa a associação à esquerda Ex.: faça por associação à esquerda e à
direita, e veja que o resultado é 11x. y. (+ x y (y. (+ z 1)) 3)) 2 5
39
Redex Função identidade como -
expressãox. x) 2 = 2x. x) = Ou mesmo,
51
32
51
32).( xx
40
Em Haskelllambda expressions can be used to define
"anonymous" functions(\x -> x + 1) 45(\x -> (x*1)) 642
is equivalent to:> succ :: Int -> Int> succ n = n + 1 ? succ 45
41
Fim....• Parte deste material veio do livro: Theory of
Computation: an Introduction de James Hein • Esta apresentação tem por objetivo introduzir uma fundamentação matemática ao Haskell• Contudo, – cálculo é muito mais rico que a idéia
aqui apresentada• Thank you.....Indeed !• Agradecemos o retorno e correções... para
[email protected]• Uma vez mais, méritos a: João Bosco da Mota Alves, e obrigado a ele...