Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Programação Funcional - Exercícios Resolvidos - aula 9, Exercícios de Informática

Coleção completa de exercícios resolvidos em haskell

Tipologia: Exercícios

2013

Compartilhado em 13/09/2013

bruno-franco-oliveira-9
bruno-franco-oliveira-9 🇧🇷

4

(10)

63 documentos

1 / 29

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Lambda Cálculo e Programação
Funcional
Programação Funcional
Bacharelado em Sistemas de Informação
Maio - 2009
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d

Pré-visualização parcial do texto

Baixe Programação Funcional - Exercícios Resolvidos - aula 9 e outras Exercícios em PDF para Informática, somente na Docsity!

Lambda Cálculo e Programação

Funcional

Programação Funcional Bacharelado em Sistemas de Informação Maio - 2009

Alonzo Church (1903–1995)

Professor em Princeton, EUA (1929–1967) e UCLA (1967–1990) Inventou um sistema formal, chamado λ-calculus ( Lambda Cálculo) , e definiu a noção de função computável utilizando este sistema. O Lambda Cálculo pode ser chamado “a menor linguagem de programação universal” do mundo. As linguagens de programação funcionais, como Lisp, Miranda, ML, Haskell são baseadas no Lambda Cálculo.

Sintaxe

Uma expressão simples do lambda cálculo:

Todas as aplicações de funções no lambda cálculo são

escritas no formato prefixo.

Avaliando a expressão: (+ 4 5) = 9

A avaliação da expressão procede por redução:

Sintaxe

Uma abstração lambda é um tipo de expressão que denota uma função: (λx. + x 1) O λ determina que existe uma função, e é imediatamente seguido por uma variável, denominada parâmetro formal da função. (λ x. + x 1) A função de x que incrementa x de 1

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

Análise de Expressões Lambda

A expressão Lambda se estende para a direita

λ f. x y ≡ λ f.(x y)

A aplicação é associativa à esquerda

x y z ≡ (x y) z

Múltiplos lambdas podem ser omitidos

λ f g. x ≡ λ f. λ g. x

Variáveis Livres e Ligadas

( λ x. + x y) 4 Para avaliar completamente a expressão, é necessário conhecer o valor global de y. Para x, a variável é local e pertence à função. Exemplos: λ x. + ((λ y. + y z) 7) x // z é livre

  • x ((λ x. + x 1) 4) // o primeiro x é livre

Redução

A aplicação de um argumento à uma abstração lambda

implica na substituição das ocorrências das variáveis

correspondentes ao argumento:

( λ x. + x 1) 4+ 4 1

Esta operação é denominada β -redução.

Funções também podem ser passadas como argumento:

(λ f. f 3) (λ x. + x 1) → (λ x. + x 1) 3 → + 3 1 → 4

Conversão

Considere as duas abstrações lambda:

( λ x. + x 1) ( λ y. + y 1) Claramente as duas abstrações acima são equivalentes e uma α -conversão nos permite mudar o nome do parâmetro formal de uma abstração lambda. Então:

( λ x. + x 1) ↔ ( λ y. + y 1)

α

η

Conversão

Considere as duas expressões:

( λ x. + 1 x) (+ 1) Ambas tem o mesmo comportamento quando aplicadas à argumento: adicionam 1 ao argumento. Uma η− redução é uma regra expressando tal equiva- lência:

( λ x. + 1 x ) ↔ (+ 1)

Resumo

α− conversão (renomeação) λ x. e ↔ λ y. e Quando y não é uma variável livre em e. β− redução (aplicação) (λ x. e 1 ) e2 → [ e^2 /x ] e^1 Operações de renomeação e substituição. η− conversão λ x. e x → e^ Elimina uma abstração λ mais complexa.

Exemplos de funções

Exemplo : Área de um círculo F ≡ π * r 2 , r ∈ N Q ≡ x * x , x ∈ N H = F (^) ° Q (função composta) H(r) = 3,14 * Q(r) (Fortran)

Abstração Lambda: λ y. π * y * y

Em Haskell: Main> (\y -> pi * y * y) 3 28.

Exemplos de funções

Dada uma função f, defina uma expressão f Օ f:

λf. λx. f (f x)

Aplicação 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)+

Tuplas como funções

Em Haskell:

t = \x -> \y -> x f = \x -> \y -> y pair = \x -> \y -> \z -> z x y first = \p -> p t second = \p -> p f Main> first (pair 1 2) 1 Main> first (second (pair 1 (pair 2 3))) 2