A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Cálculo Lambda (l – Calculus)

Apresentações semelhantes


Apresentação em tema: "Cálculo Lambda (l – Calculus)"— Transcrição da apresentação:

1 Cálculo Lambda (l – Calculus)
João Bosco da Mota Alves Programação Funcional INE/CTC/UFSC Junho/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 Linguagens Funcionais X -Cálculo
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 x Q  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írculo F   * r2, r  Q  x * x, x  H = F ° Q (função composta) H(r) = 3,14 * Q(r) (Fortran) primitivas Em Haskell: Prelude> (\x -> x*x) 2 4 formas funcionais argumento corpo (y. x). * (x * x) x.x * x y. * y * y composição

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 Calcular x2+3x+1, para x Î [1..100]
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 usar Ys = map f [ ] where f x = x*x + 3 * x + 1

10 Notação Lambda Há uma notação l (l-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 l Então: \x -> x*x + 3*x + 1 Prelude> (\x -> (x * x) + 3*x + 1) 7 71

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; exemplo ys = map (\x -> x*x + 3*x + 1) [1 .. x] Prelude> map (\x -> (x * x) + 3*x + 1) [ ] [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)) '( )) ( )

13 l – Calculus consiste de:
Uma linguagem, a notação – l 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 l – 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 l – Calculus Então: f(x) 3 = (3 + 1)2 = 16 (l x . (x+1)^2)
(l x . M) aplicando em 3, então: (l x . M N), logo: (l x . M 3) = (l x . (x+1)^2 3) = (l x . (3+1)^2)) = = (l x . 16) = 16 Em Haskell: Prelude> (\x -> (x + 1) ^^ 2) 3 16.0

16 l – Calculus Suponha, agora, f : R´R -> 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 l – Calculus Então f(x,y) 3 5 = 3 + 5 + (2*3*5) = 38
Como exercício, reescreva os passos acima em notação l a partir de: (lx ly . M N Q) Em Haskell: Prelude> (\x y -> (x + y)+ (2*x*y)) 3 5 38

18 l – 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 = (6*5) = 38

19 l – 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 l – Calculus Seja, f : R´R ´R -> R, definida por f(x,y,z) = x + y + z Computando f(2,5,4) f(x,y,z) Þ 2 + y + z Þ f(2,y,z) 5 4 Þ z Þ f(2,5,z) 4 Þ Þ 11

21 l – 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 l – Calculus Expressão lambda, L, é definida por: Cláusula Básica
Todo átomo pertence a L Cláusula Indutiva Se E1, E2 Î L, então (E1 E2) Î L (Regra de aplicação: E1, operador; E2, operando) Se E Î L e v Î V, então (lv. E) Î L (Abstração lambda)

23 l – Calculus Cláusula Extrema
Uma expressão não é uma expressão lambda a menos que possa ser mostrada pertencer a L, pela aplicação das cláusulas básica e indutiva, em um número finito de vezes

24 Claro que sua definição formal tinha que ser recursiva ...
l – Calculus Na meta-linguagem BNF se pode definir uma expressão em Abstração l, dado por: <exp> ::= <constante> | <variável> | (<exp> <exp>) aplicação | (l <variável> <exp>) l-abstração Claro que sua definição formal tinha que ser recursiva ...

25 l – 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: lx .x , l z2 . z2 lx .2 , lx .3 , lx .+ respectivamente....

26 l – 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: (lx .2) , ((lx .2) 2), (lx . (2 2)) respectivamente...

27 l – 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 (l – 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 l – 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: (l x. 2) (l x. (+ x 3)) (l x. x) (l x. (l y. (+ x y)))

30 l – Calculus A variável v de uma abstração lambda lv. 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 l x . (+ x y) (já visto !)

31 l – Calculus Informalmente, a proposta de uma abstração lambda lv. 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 lx . (+ x 3) é lida como “a função de x que adiciona x a 3”

32 l – Calculus Abstração lambda tem associação à esquerda: lx. ly. E
lx. ly. (+ x y) 2 = (lx. (ly. (+ x y) 2)) ¹ (lx. ly. (+ x y)) 2

33 l – Calculus Outro exemplo:
Já a l-expressão lx. ly. (+ 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 l – Calculus Seja lx. (+ x 3)
Trocando-se x por y, obtem-se a mesma função ly. (+ y 3), logo, substituições de variáveis são permitidas. Se aplicada abstração l a 5, as duas avaliam 8: lx. (+ x 3) 5 = ly. (+ y 3) 5 = 8 Precisa-se de regras de conversão que mostre a equivalência entre l-exp

35 Regras de conversão em l – Calculus
a-conversão : “Uma variável vinculada pode ser consistentemente renomeada, em uma l-expression, se não houver ocorrência livre da mesma” lx. (+ x 3) renomeada para ly. (+ y 3) lx. (+ x y) renomeada para lz. (+ z y) Mas não lx. (+ x y) para ly. (+ y y)

36 Regras de conversão em l – Calculus
b-conversão : “A l-expression (lx. 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” (lx. (+ x 5) 3) reduzida para (+ 3 5) = 8 (lx. ly. (+ x y)) 3 5 para (+ 3 5) = 8 (lx. (+ x y)) tal substituição não permitida, é apenas mais uma expressão l

37 Regras de conversão em l – Calculus
Estendendo: (\x y z -> (z + x + y)) 4 5 8 17 (lx. ly. (+ x y)) 3 5 Þ ((lx. (ly. (+ x y))) 3) 5 Þ (ly. (+ 3 y)) 5 Þ (+ 3 5) Þ 8 Viu como a expressão lambda tem associação à esquerda? Em Haskell: (\x y -> ( x+ y)) 3 5 8

38 Regras de conversão em l – 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 é 11 (lx. ly. (+ x y (ly. (+ z 1)) 3)) 2 5

39 Redex Função identidade como l-expressão (lx. x) 2 = 2 (lx. x) p = p
Ou mesmo,

40 Em Haskell lambda expressions can be used to define "anonymous" functions (\x -> x + 1) 4 5 (\x -> (x*1)) 6 42 is equivalent to: > succ :: Int -> Int > succ n = n + 1 ? succ 4

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, l – cálculo é muito mais rico que a idéia aqui apresentada Thank you.....Indeed ! Agradecemos o retorno e correções... para Uma vez mais, méritos a: João Bosco da Mota Alves, e obrigado a ele...


Carregar ppt "Cálculo Lambda (l – Calculus)"

Apresentações semelhantes


Anúncios Google