cálculo lambda ( – calculus) joão bosco da mota alves programação funcional ine/ctc/ufsc...

41
Cálculo Lambda ( – 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

Upload: internet

Post on 22-Apr-2015

108 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Cálculo Lambda ( – 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

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

Page 2: Cálculo Lambda ( – 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

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’’’?

Page 3: Cálculo Lambda ( – 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

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

Page 4: Cálculo Lambda ( – 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

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))

Page 5: Cálculo Lambda ( – 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

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“

Page 6: Cálculo Lambda ( – 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

6

Embasamento teórico x é dita ser fechada se {var. free} = 0 x é dita ser livre se free(abst. ) = 0

Page 7: Cálculo Lambda ( – 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

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

Page 8: Cálculo Lambda ( – 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

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

Page 9: Cálculo Lambda ( – 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

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

Page 10: Cálculo Lambda ( – 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

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

Page 11: Cálculo Lambda ( – 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

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>

Page 12: Cálculo Lambda ( – 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

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)

Page 13: Cálculo Lambda ( – 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

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 !

Page 14: Cálculo Lambda ( – 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

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

Page 15: Cálculo Lambda ( – 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

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

Page 16: Cálculo Lambda ( – 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

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!

Page 17: Cálculo Lambda ( – 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

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

Page 18: Cálculo Lambda ( – 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

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

Page 19: Cálculo Lambda ( – 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

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

Page 20: Cálculo Lambda ( – 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

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

Page 21: Cálculo Lambda ( – 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

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, ...

Page 22: Cálculo Lambda ( – 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

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)

Page 23: Cálculo Lambda ( – 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

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

Page 24: Cálculo Lambda ( – 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

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 ...

Page 25: Cálculo Lambda ( – 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

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....

Page 26: Cálculo Lambda ( – 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

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...

Page 27: Cálculo Lambda ( – 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

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

Page 28: Cálculo Lambda ( – 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

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)) ?

Page 29: Cálculo Lambda ( – 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

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)))

Page 30: Cálculo Lambda ( – 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

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 !)

Page 31: Cálculo Lambda ( – 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

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”

Page 32: Cálculo Lambda ( – 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

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

Page 33: Cálculo Lambda ( – 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

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 ...

Page 34: Cálculo Lambda ( – 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

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

Page 35: Cálculo Lambda ( – 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

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)

Page 36: Cálculo Lambda ( – 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

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

Page 37: Cálculo Lambda ( – 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

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

Page 38: Cálculo Lambda ( – 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

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

Page 39: Cálculo Lambda ( – 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

39

Redex Função identidade como -

expressãox. x) 2 = 2x. x) = Ou mesmo,

51

32

51

32).( xx

Page 40: Cálculo Lambda ( – 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

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

Page 41: Cálculo Lambda ( – 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

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...