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

Aula4 - Programação Funcional, Notas de aula de Análise de Sistemas de Engenharia

INE 5363 - Programação Funcional - INE/CTC/UFSC - Curso de Bacharelado em Ciências da Computação. Prof. Dr. rer.nat. Aldo von Wangenheim - http://www.inf.ufsc.br/~awangenh/Funcional

Tipologia: Notas de aula

2010

Compartilhado em 25/01/2010

ednaldo-miranda-6
ednaldo-miranda-6 🇧🇷

4

(1)

38 documentos

1 / 13

Toggle sidebar

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

Não perca as partes importantes!

bg1
INE 5363 - Programação Funcional - Transparência 47
Prof. Dr. Aldo von Wangenheim
2.4.4.
Resolução de alguns problemas de redução:
1.
Redução direta:
(λx.x(xy))N-> N(Ny)
aqui N é substituído nos dois x, pois x está livre na subespressão
x(xy).
2.
Redução direta também:
(λx.y)N -> y
3.
Menos trivial:
(λx.(λy.xy)N)M -> (λy.My)N
( λy.xy)N
-> MN
4.
Exemplo simples que não termina:
(λx.xx)(λx.xx) -> (λx.xx)(λx.xx)
-> (λx.xx)(λx.xx) ...etc
pf3
pf4
pf5
pf8
pf9
pfa
pfd

Pré-visualização parcial do texto

Baixe Aula4 - Programação Funcional e outras Notas de aula em PDF para Análise de Sistemas de Engenharia, somente na Docsity!

2.4.4. Resolução de alguns problemas de redução:

1. Redução direta:

( λ x.x(xy))N-> N(Ny)

aqui N é substituído nos dois x, pois x está livre na subespressão

x(xy).

2. Redução direta também:

( λ x.y)N -> y

3. Menos trivial:

( λ x.( λ y.xy)N)M -> ( λ y.My)N

pois x está livre em ( λ y.xy)N

-> MN

4. Exemplo simples que não termina:

( λ x.xx)( λ x.xx) -> ( λ x.xx)( λ x.xx)

-> ( λ x.xx)( λ x.xx) ...etc

5. Exemplo catastrofal:

( λ x.xxy)( λ x.xxy)-> ( λ x.xxy)( λ x.xxy)y

-> ( λ x.xxy)( λ x.xxy)yy

-> ( λ x.xxy)( λ x.xxy)yyy

-> ( λ x.xxy)( λ x.xxy)yyyy

  1. Exemplo que pode ser simples

( λ x.z)(( λ x.xxy)(( λ x.xxy)) -> z

  1. O mesmo exemplo, quando feito de forma errada :

( λ x.z)(( λ x.xxy)( λ x.xxy)) ->( λ x.z)(x.xxy)( λ x.xxy)y)

->( λ x.z)(( λ x.xxy)( λ x.xxy)yy)

Aqui, ao invés de reduzir o redex mais à esquerda, foi aplicado(λx.xxy) sobre (λx.xxy)

  • Da mesma forma como fizemos com o fatorial FAC, aplicando

uma abstração-β sobre FIBO, podemos transformar esta defini- ção em:

FIBO = ( λ fibo.( λ n. (...fibo...fibo...)))FIBO

  • Esta definição podemos escrever então também da forma:

FIBO = H FIBO

  • Usando Y:

FIBO = Y H

H=( λ fibo. λ n. IF (<= n 1) 1 (+ ( fibo (- n 1))( fibo (- n 2))))

2.5. A Semântica Denotacional do Cálculo Lambda

•  Denotar (Aurélio): (do latim denotare )

Significar, exprimir, simbolizar

Há duas maneiras de se olhar para uma função:

  • como um algoritmo que irá produzir um valor, dado um argu-

mento, ou

  • como um conjunto de pares ordenados argumento-valor.

 O primeiro enfoque é dinâmico ou operacional , já que vê

uma função como uma seqüência de operações no tempo.

 O segundo enfoque é estático ou denotacional : a função

é encarada como um conjunto fixo de associações entre argumentos e seus valores de função correspondentes.

Nos capitulos anteriores vimos como uma expressão ser avaliada

pel aaplicação repetida de regras de redução.

Essas regras descrevem somente transformações sintáticas em

expressões permitidas, sem fazer referência a o que essas fun-

ções significam. O cálculo λ pode ser considerado como um

sistema formal para a manipulação de símbolos sintáticos.

O desenvolvimento das regras de conversão foi baseado em nos-

sas intuições sobre funções abstratas e nos proveu uma semân-

tica operacional para o cálculo λ.

Ficou em aberto, uma definição de significado.

Agora, um breve desenvovlimento informal da função Eval:

  • O objetivo da função é o de provêr um valor para Eval[[ E ]] para

toda e qualquer expressão lambda E.

  • Para atingir este objetivo podemos utilizar todos os recursos da

sintaxe do cálculo lambda já vistos até agora.

Supponhamos, primeiramente, que E seja uma variável x.

Que valor deveria Eval[[ x ]] possuir?

Como o valor de uma variável é dado pelo seu contexto circun-

dante, não podemos dizer o seu valor isoladamente.

Podemos solucionar este problema, dando a Eval[[ ]] um parâme-

tro extra ρ, o qual representa a informação contextual de uma
variável. O argumento ρ é chamado de ambiente ( environment ) e

é uma função que mapeia nomes de variáveis para seus valores.

Assim: Eval[[ x ]] ρ = ρ x
A notação (ρ x), no lado direito significa “a função ρ aplicada ao

argumento x”.

Para tratar aplicações, usamos um raciocínio semelhante: É

razoável dizer-se que o o valor de (E 1 E 2 ) deveri ser o valor de E 1

aplicado ao valor de E 2.

Eval[[ E 1 E 2 ]] ρ = ( Eval[[ E 1 ]] ρ) ( Eval[[ E 2 ]] ρ)
O caso final é o de uma abstração lambda Eval[[ λ x.E ]] ρ.

Certamente será uma função, de forma que nós o podemos definir

completamente dando o seu valor quando aplicada a um argu-

mento arbitrário a:

( Eval[[ λ x.E ]] ρ) a

Resumindo:

  • O valor de uma abstração lambda, aplicada a um argumento, é o

valor do corpo da abstração, em um contexto onde o parâmetro formal está atado ao argumento.

  • Formalmente: (^) Eval[[ λ x.E (^) ]] ρ a = (^) Eval[[ E (^) ]] ρ [ x=a ]
onde a notação x=a significa “a função ρ extendida com a infor-

mação de que a variável x está atada ao valor a”.

  • De forma mais precisa:
ρ [ x=a ]x = a
ρ [ x=a ]y = ρ y

caso y seja uma variável diferente de x.

2.5.2. O Símbolo V

Uma das características mais úteis da teoria descrita nesta seção,

é que ela nos permite raciocinar a respeito da terminação ou não

terminação de programas.

  • Descrição da semântica de expressões que não atingem a

forma normal : Como foi descrito antes, a redução de uma expressão pode não atingir uma forma normal.

  • Para descrever o valor de uma expressão dessas, incluímos o

elemento V, pronunciado “fundo”, no domínio dos valores de expressões, o qual é o valor de uma expressão sem uma forma normal :

Eval[[ <expressão sem forma normal> ]] = V
  • V possui um significado matemático perfeitamente respeitável na

Teoria dos Domínios.

  • À semelhança do símbolo 0 (que também está para “nada”), seu

uso muitas vezes nos permite escrever equações sucintas ao invés de montes de palavras obtusas.

  • Ao invés de dizermos “a evaluação da expressao E falha em ter-
minar”, dizemos: Eval[[ E ]] = V

2.5.3. Definindo a Semântica de Funções Embutidas e Constantes

Nesta seção veremos como definir o valor de Eval[[ k ]] onde k é

uma constante ou função embutida.

Exemplo: Qual é o valor de Eval[[ * ]]?

Certamente é uma função de dois argumentos e nós podemos

definí-la dando o valor desta função quando aplicada a argumen-

tos arbitrários:

Eval[[]] a b = a x b

que dá o valor do cálculo lambda * em termos da operação

matemática de multiplicação x.

A distinção entre ∗ e x é crucial:

  • ∗ é uma construção sintática do cálculo lambda.
  • x é uma operação matemática abstrata.

No caso da multiplicação a notação matemática x difere da

notação de programa ∗. No caso da adição, por exemplo, o sím-

bolo + é usado em ambas. É importante notar-se a diferença.

A equação anterior é, porém, uma especificação incompleta para

∗. Temos de definir o que ∗ faz para todo argumento possível,

inclusive V. O conjunto completo de equações ficaria então:

Eval[[]] a b = a x b, caso a V e b V

Eval[[]] V b = V

Eval[[]] a V = V

≠ ≠

2.5.4. Estriticidade

Dizemos que uma função é estrita se temos certeza de que vamos

necessitar do valor de seu argumento.

  • Caso uma função f com certeza necessite do valor de seu argu-

mento e a avaliação do argumento não termina, então a aplica- ção de f ao argumento vai com certeza não terminar.

Esta descrição leva a uma definição concisa de estriticidade:

Uma função f é estrita se e somente se f V = V

Esta definição pode ser generalizada da mesma forma para fun-

ções de muitos argumentos.

Por exemplo: se g é uma função de três argumentos, então g é

estrita em seu segundo argumento se e somente se:

g a V c = V

2.5.5. Fim:

Nestas aulas foi dada uma visão, apenas superficial, do cálculo

lambda. O objetivo foi só mostrar o “que está por trás” da imple-

mentação de liguagens funcionais, já que não se pretende nesta

disciplina ensinar o uso do cálculo lambda para a criação de novas

linguagens funcionais.

2.5.6. LISP:

  • Início próxima aula. Uma sugestão para leitura é:

Oakey, Steve ; LISP para Micros. Editora Campus, 1986 ISBN 85-7001-326-