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

Cálculo Lambda e Ordem de Redução em Programação Funcional, Notas de aula de Análise de Sistemas de Engenharia

Este documento aborda os conceitos de cálculo lambda, forma normal e ordem de redução em programação funcional, incluindo exemplos e teoremas de church-rosser. Além disso, é apresentada a solução para a recursividade usando o combinador de ponto fixo y.

Tipologia: Notas de aula

2010

Compartilhado em 25/01/2010

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

4

(1)

38 documentos

1 / 6

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 - 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
Programação Funcional
Cálculo Lambda - Aula Nº 3
2.3. Ordem de Redução
Se uma expressão não contém mais redexes, então a avaliação está completa. Um
expressão nesta forma é dita estar na forma normal.
Assim, a avaliação de uma expressão consiste na na redução sucessiva de redexes, até
que a expressão esteja na forma normal.
Definição (forma normal): uma expressão-l é dita estar na forma normal, se nenhum
redex-b, isto é, nenhuma subexpressão da forma (λx.P)Q ocorre nela.
Uma expressão pode conter mais do que um redex, assim a redução pode acontecer
por caminhos diferentes.
Exemplo:
(+ (* 3 4) (* 7 8))
pode ser reduzido à forma normal pelas seguintes seqüências:
(+ (* 3 4) (* 7 8))
-> (+ 12 (* 7 8))
-> (+ 12 56)
-> 68
ou
(+ (* 3 4) (* 7 8))
-> (+ (* 3 4) 56)
-> ( 12 56)
-> 68
Nem toda expressão possue uma forma normal,
considere:
(D D)
onde D é (λx.x x).
A avaliação desta expressão jamais terminaria, uma vez que
(D D) reduz para (D D):
(λx.x x)(λx.x x) -> (λx.x x)(λx.x x)
-> (λx.x x)(λx.x x)
Por conseguinte, algumas seqüências de redução poderão atingir a forma normal,
outras não.
Considere:
(λx.3) (D D)
Se nós primeiro reduzirmos a aplicação de (λx.3) a (D D) (sem avaliar (D D)),
obteremos o resultado 3; porém se primeiro reduzimos a aplicação de D sobre D, nós
simplemente obtemos (D D) novamente.
Se nós continuamos insistindo em escolher a aplicação de D sobre D, a avaliação vai
continuar indefinidamente, não terminando.
pf3
pf4
pf5

Pré-visualização parcial do texto

Baixe Cálculo Lambda e Ordem de Redução em Programação Funcional e outras Notas de aula em PDF para Análise de Sistemas de Engenharia, somente na Docsity!

Programação Funcional

Cálculo Lambda - Aula Nº 3

2.3. Ordem de Redução

  • Se uma expressão não contém mais redexes, então a avaliação está completa. Um

expressão nesta forma é dita estar na forma normal.

  • Assim, a avaliação de uma expressão consiste na na redução sucessiva de redexes, até

que a expressão esteja na f orma normal.

  • Definição (forma normal) : uma expressão-l é dita estar na forma normal, se nenhum

redex-b, isto é, nenhuma subexpressão da forma ( λ x.P)Q ocorre nela.

  • Uma expressão pode conter mais do que um redex, assim a redução pode acontecer

por caminhos diferentes.

  • Exemplo:

(+ (* 3 4) (* 7 8))

pode ser reduzido à forma normal pelas seguintes seqüências:

ou

(+ (* 3 4) (* 7 8)) -> (+ (* 3 4) 56) -> ( 12 56) -> 68

  • Nem toda expressão possue uma forma normal,

considere:

(D D)

  • onde D é (λx.x x).

A avaliação desta expressão jamais terminaria, uma vez que

(D D) reduz para (D D):

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

  • Por conseguinte, algumas seqüências de redução poderão atingir a forma normal,

outras não.

Considere:

(λx.3) (D D)

  • Se nós primeiro reduzirmos a aplicação de (λx.3) a (D D) (sem avaliar (D D)),

obteremos o resultado 3; porém se primeiro reduzimos a aplicação de D sobre D, nós

simplemente obtemos (D D) novamente.

  • Se nós continuamos insistindo em escolher a aplicação de D sobre D, a avaliação vai

continuar indefinidamente, não terminando.

  • Esta situação corresponde à de um programa imperativo que entra em um laço infinito.

Dizemos que a avaliação ou execução não termina.

  • Para contornar esta situação, existe a ordem normal de redução , que garante que uma

forma normal, caso exista, será encontrada.

2.3.1. Ordem Normal de Redução

  • Uma questão que se coloca, além da questão "poderei encontrar uma forma normal ?", é

a questão de se existe mais de uma forma normal para para uma expressão, ou:

Poderá uma seqüência de redução diferente levar a uma forma normal diferente?

Ambas as questões estão interligadas.

  • A resposta para a última pergunta é: não.

Isto é uma conseqüência dos teoremas de Church-Rosser CRT1 e CRT2.

Teorema de Church-Rosser 1 (CRT1):

Se E 1 <-> E 2 , então existe uma expressão E , tal que E 1 -> E e E 2 -> E

Corolário: Nenhuma expressão pode ser convertida em duas formas normais distintas. Isto

significa que não existem duas formas normais para uma expressão que não sejam a-

convertíveis entre si.

Prova: Suponha que E 1 <-> E e E 2 <-> E , onde E 1 e E 2 estão na forma normal.

Então E 1 <-> E 2 e, pelo CRT1, deve haver uma expressão F tal que E 1 -> F e E 2 -> F.

Como tanto E 1 como E 2 não possuem redexes, logo E 1 = F = E (^2)

  • Informalmente, o teorema CRT1 diz que todas as seqüências de redução que terminam,

haverão de atingir o mesmo resultao.

O segundo teorema de Church-Rosser, CRT2, diz respeito a uma ordem particular de

redução, chamada ordem normal de redução.

Teorema de Church-Rosser 2 (CRT2):

Se E 1 -> E 2 , e E 2 está na forma normal, então existe uma ordem normal de seqüência

de redução de E 1 para E 2.

Conseqüências:

  • Existe no mínimo um resultado possível e
  • a ordem normal de redução encontrará este resultado, caso ele exista.
  • Observe que nenhuma seqüência de redução poderá levar a um resultado incorreto, o

máximo que poderá acontecer é a não-terminação.

A Ordem Normal de Redução especifica que o redex mais à esquerda mais externo deverá ser reduzido primeiro.

  • Aplicando uma abstração-b sobre FAC, podemos transformar esta definição em:

FAC = (λfac.(λn. (...fac...)))FAC

  • Esta definição podemos escrever da forma:

FAC = H FAC (2.1)

  • onde:

H = (λfac.(λn. (...fac...)))

  • A definição de H é trivial.

É uma abstração lambda ordinária e não usa recursão.

  • A recursão é expressa somente pela definição 2.1.

A definição 2.1 pode ser encarada mais como uma equação matemática. Por exemplo, para

resolver a equação matemática

x 2 - 2 = x

nós procuramos por valores de x que satisfazem a equação (neste caso x = -1 e x = 2).

De forma similar, para resolver 2.1, nós procuramos uma expressão lambda para FAC que

satisfaça 2.1.

A equação 2.1 FAC = H FAC postula que, quando a função H é aplicada a FAC , o resultado

é FAC.

Nós dizemos que FAC é um ponto fixo de H.

Uma função pode ter mais de um ponto fixo. Por exemplo, na função abaixo, tanto 0 quanto

1 são pontos fixos da função:

λx. * x x

a qual calcula o quadrado de seu argumento.

Em resumo, estamos procurando por um ponto fixo para H. Claramente isto depende

somente de H.

Para isto, invente-se, a título provisório, uma função Y, a qual toma uma função como

argumento e devolve o seu ponto fixo como resultado.

Assim Y tem o comportamento de:

Y H = H (Y H)

e Y é chamado de combinador de ponto fixo.

Assim, caso possamos produzir um Y, temos uma solução para o problema da recursividade.

Para 2.1 podemos prover a seguinte solução:

FAC = Y H

a qual é uma definição não-recursiva de FAC.

Como teste para esta estratégia, podemos computar o valor de (FAC 1). Tomemos as

definições de FAC e H :

FAC = Y H

H = (λfac.λn. IF (= n 0) 1 (* n (fac (- n 1 ))))

Assim: FAC 1

-> Y H 1

-> H (Y H) 1

->(lfac.ln.IF (= n 0) 1 (* n (fac (- n 1))))(Y H) 1 ->(ln.IF (= n 0) 1 (* n (Y H (- n 1)))) 1 -> IF (= 1 0) 1 (* 1 (Y H (- 1 1))) -> * 1 (Y H 0) = * 1 (H (Y H) 0) = * 1 ((lfac.ln.IF (= n 0) 1 (* n (fac (- n 1))))(Y H) 0) -> * 1 ((ln.IF (= n 0) 1 (* n (Y H(- n 1)))) 0) -> * 1 (IF (= 0 0) 1 (* n (Y H(- 0 1)))) -> * 1 1 -> 1

2.4.2. Y pode ser definido como uma Abstração Lambda

  • Para a transformação de uma expressão recursiva em uma não-recursiva, utilizamos o

combinador de ponto fixo, uma função que chamamos de Y.

  • A propriedade que Y necessita ter é: Y H = H (Y H)
  • e isto representa evidentemente a recursão da forma mais pura, uma vez que esta

fórmula pode ser utilizada para representar, de forma abstrata, qualquer fórmul

arecursiva que queiramos.

  • O truque é que podemos representar Y como uma abstração lambda sem utilizar a

recursão:

Y = (λh. (λx.h (x x)) (λx. h (x x)))

Para demonstrar que Y possui a qualidade desejada, evaluemos:

Y H

= (λh. (λx.h (x x)) (λx. h (x x))) H <-> (λx.H (x x)) (λx. H (x x)) <-> H ((λx.H (x x)) (λx. H (x x))) <-> H (Y H)

  • O fato de Y poder ser definido como uma abstração lambda é, do ponto de vista

matemático, realmente digno de nota.

  • Do ponto de vista da implementação, é relativamente ineficiente implementar Y como

uma abstração lambda. Para a construção de linguagens funcionais, utiliza-se

geralmente uma função embutida com a regra de redução:

Y H -> H (Y H)