lambda cálculo e programação funcional - facom.ufu.br madriana/pf/  · lambda cálculo o lambda

Download Lambda Cálculo e Programação Funcional - facom.ufu.br madriana/PF/  · Lambda Cálculo O lambda

Post on 15-Dec-2018

212 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

Lambda Clculo e Programao Funcional

Programao FuncionalBacharelado em Sistemas de InformaoMaio - 2009

Alonzo Church (19031995)

Professor em Princeton, EUA (19291967) e UCLA (19671990)

Inventou um sistema formal, chamado -calculus (Lambda Clculo) , e definiu a noo de funo computvel utilizando este sistema.

O Lambda Clculo pode ser chamado a menor linguagem de programao universal do mundo.

As linguagens de programao funcionais, como Lisp, Miranda, ML, Haskell so baseadas no Lambda Clculo.

Lambda Clculo

O lambda clculo pode ser visto como uma linguagem de programao abstrata em que funes podem ser combinadas para formar outras funes, de uma forma pura.

O lambda clculo trata funes como cidados de primeira classe, isto , entidades que podem, como um dado qualquer, ser utilizadas como argumentos e retornadas como valores de outras funes.

Sintaxe

Uma expresso simples do lambda clculo:

(+ 4 5)Todas as aplicaes de funes no lambda clculo so escritas no formato prefixo.

Avaliando a expresso: (+ 4 5) = 9A avaliao da expresso procede por reduo:

(+ (* 5 6)(* 4 3)) (+ 30 (* 4 3)) (+ 30 12) 42

Sintaxe

Uma abstrao lambda um tipo de expresso que denota uma funo:

(x. + x 1)O determina que existe uma funo, e imediatamente seguido por uma varivel, denominada parmetro formal da funo.

( x . + x 1) A funo de x que incrementa x de 1

Sintaxe

Uma expresso lambda deve ter a forma: ::= | | | .

Os parnteses podem ser utilizados nas expresses para prevenir ambiguidades.

Exemplos

(x. x) y(x. f x) x y(x. x) (x. x)(x. x y) z(x y. x) t f(x y z. z x y) a b (x y. x)(f g. f g) (x. x) (x. x) z(x y. x y) y(x y. x y) (x. x) (x. x)(x y. x y) ((x. x) (x. x))

Anlise de Expresses Lambda

A expresso Lambda se estende para a direita

f. x y f.(x y)

A aplicao associativa esquerda

x y z (x y) z

Mltiplos lambdas podem ser omitidos

f g. x f . g. x

Variveis Livres e Ligadas

FV(x) = { x }

FV(e1 e

2) = FV(e

1) FV(e

2)

FV( x . e) = FV(e) - { x }

A varivel x ligada por na expresso: x.eCaso a varivel no seja ligada, ento considerada livre.As variveis livres de um termo so definidas como:

Para a expresso abaixo, y ligada e x uma varivel livre. y . x y

Variveis Livres e Ligadas

( x. + x y) 4Para avaliar completamente a expresso, necessrio conhecer o valor global de y. Para x, a varivel local e pertence funo.

Exemplos:

x. + (( y. + y z) 7) x // z livre+ x (( x. + x 1) 4) // o primeiro x livre

ReduoA aplicao de um argumento uma abstrao lambda implica na substituio das ocorrncias das variveis correspondentes ao argumento:

( x. + x 1) 4 + 4 1 Esta operao denominada -reduo. Funes tambm podem ser passadas como argumento: ( f. f 3) ( x. + x 1) ( x. + x 1) 3 + 3 1 4

-reduo

??

( x. y. + (- x 1)) x 3) 9 ( x. + (- x 1)) 9 3 + (- 9 1) 3

+ 8 3 11

( x. y. + x (( x.- x 3) y)) 5 6

ConversoConsidere as duas abstraes lambda:

( x. + x 1)( y. + y 1)Claramente as duas abstraes acima so equivalentes e uma -converso nos permite mudar o nome do parmetro formal de uma abstrao lambda.

Ento:

( x. + x 1) ( y. + y 1)

ConversoConsidere as duas expresses:

( x. + 1 x) (+ 1) Ambas tem o mesmo comportamento quando aplicadas argumento: adicionam 1 ao argumento.Uma reduo uma regra expressando tal equiva-lncia:

( x. + 1 x ) (+ 1)

reduo (Equivalncia)

( x. + 1 x) (+ 1)

Em Haskell:

Main> (\x (+) 1 x) 45Main> ( (+) 1) 45

Resumo

converso (renomeao)

x . e y . e Quando y no uma varivel livre em e.

reduo (aplicao)

( x . e1) e2 [ e2/x ] e1 Operaes de renomeao e substituio.

converso x . e x e Elimina uma abstrao mais complexa.

Exemplos de funes

Exemplo: rea de um crculo

F * r2, r N

Q x * x, x N

H = F Q (funo composta)

H(r) = 3,14 * Q(r) (Fortran)

Abstrao Lambda: y. * y * yEm Haskell: Main> (\y -> pi * y * y) 3 28.2743338823081

Exemplos de funes

int f(x) {return x+2;

}f(5);

Bloco principal Funo declarada

(f. f(5)) (x. x+2)

Exemplos de funes

Dada uma funo f, defina uma expresso f f:

f. x. f (f x)Aplicao para f(x) = x+1:

(f. x. f (f x)) (y. y+1)

= x. (y. y+1) ((y. y+1) x)

= x. (y. y+1) (x+1)

= x. (x+1)+1

Tuplas como funesEm Haskell:t = \x -> \y -> xf = \x -> \y -> ypair = \x -> \y -> \z -> z x y first = \p -> p tsecond = \p -> p f

Main> first (pair 1 2)1Main> first (second (pair 1 (pair 2 3)))2

Exerccios

type Aluno = (Int, String, Float) -- N Aluno, Nome, Notatype Curso = [Aluno]listaAlunos :: CursolistaAlunos = [(1234, "Jose Azevedo", 13.2), (2345, "Carlos Silva", 9.7), (3456, "Rosa Mota", 17.9)]

media :: Curso->Floatmedia l = (/) (sum (map (\(_,_,n)->n) l)) (fromIntegral (length l))

1. Calcular a mdia das notas dos alunos de um curso:

ExercciosMain> media listaAlunos13.6

Funes utilizadas:fromIntegral : funo que transforma o argumento em um nmero da classe FractionalExemplo:divisao a b = (fromIntegral a) / (fromIntegral b)

map : funo que aplica uma funo a todos os elementos de uma lista. Exemplo: Main> dobro 39

ExercciosMain> map dobro [1,2,3][1,4,9]Main> map (\(_,n) -> n) [(1,2),(3,4)][2,4]

sum : funo que soma os elementos de uma lista. Main> sum [1,2,3]6Main> sum ['a','b','c']ERROR - Cannot infer instance*** Instance : Num Char*** Expression : sum ['a','b','c']

Main> sum [1.2,3.3]4.5

Exerccios

sucessor::(Int -> Int)sucessor = \x -> x + 1Main> sucessor 12Main> sucessor 56Main> sucessor 'a'ERROR - Type error in application

2. Implementar uma funo que calcula o sucessor de um nmero inteiro usando expresso lambda (x. x+1). Em seguida, definir uma funo duasVezes para aplicar uma funo nela mesma. Finalmente, construir uma funo para mapear a aplicao de duasVezes sobre uma lista de inteiros.

Exerccios

sucessor::(Int -> Int)sucessor = \x -> x + 1duasVezes :: (a->a) ->a ->aduasVezes f x = f (f x)

Main> duasVezes sucessor 57Main> duasVezes sucessor 100102Main> duasVezes sucessor 5.6ERROR - Cannot infer instance

Funo duasVezes para aplicar uma funo nela mesma:

ExercciosFuno mapear para aplicar uma funo uma lista de Valores (sem usar a funo map)

sucessor::(Int -> Int)sucessor = \x -> x + 1

duasVezes :: (a->a) ->a ->aduasVezes f x = f (f x)

mapear::(a->b)->[a]->[b]mapear f [] = []mapear f (x:xs) = (f x): mapear f xs

Exerccios

Main> mapear sucessor [1,3,5][2,4,6]Main> mapear (duasVezes sucessor) [1,3,5][3,5,7]Main> mapear (duasVezes (+ 1)) [1,3,5][3,5,7]Main> mapear (duasVezes (\x -> x * x)) [3,4,5][81,256,625]Main> mapear (\y -> y ++ y) ["na","ta","la"]["nana","tata","lala"]Main> mapear (duasVezes (\y -> y ++ y)) ["na","ta","la"]["nananana","tatatata","lalalala"]

Exerccios

3. Dados um elemento e uma lista, intercale o elemento na lista, em todas as posies.

intercala :: a -> [a] -> [[a]]intercala x [] = [[x]]intercala x (l:ls) = [x:l:ls] ++ map (l:) (intercala x ls)

Main> intercala 1 [2,3][[1,2,3],[2,1,3],[2,3,1]]

Exerccios

4. Reduza as expresses avaliando-as e escreva o cdigo correspondente em Haskell, testando no ambiente Hugs.

1) ( x.2*x + 1) 32) ( xy.x+y) 5 73) ( yx.x+y) 5 74) ( xy.x-y) (z.z/2)5) ( x.xx) ( y.y)6) ( x. y. x + (( x.8) - y)) 5 67) ( x. y. x y) 9 4

Slide 1Slide 2Slide 3Slide 4Slide 5Slide 6Slide 7Slide 8Slide 9Slide 10Slide 11Slide 12Slide 13Slide 14Slide 15Slide 16Slide 17Slide 18Slide 19Slide 20Slide 21Slide 22Slide 23Slide 24Slide 25Slide 26Slide 27Slide 28Slide 29