Você está na página 1de 52

Introduo ao clculo-

Pedro Vasconcelos

13 de Fevereiro de 2014

O que o clculo-?

um modelo computao universal (i.e., equipotente mquina de Turing) Ao contrrio da MT, o clculo- tambm um modelo para linguagens de programao:
mbito de variveis ordem de computao estruturas de dados recurso ...

As linguagens funcionais so implementaes computacionais do clculo- (Landin, 1964).

Bibliograa

Foundations of Functional Programming, notas de um curso de Lawrence C. Paulson, Computer Laboratory, University of Cambrige. Lambda Calculi: a guide for computer scientists, Chris Hankin, Graduate Texts in Computer Science, Oxford University Press.

Plano

Sintaxe

Redues e normalizao

Computao

Plano

Sintaxe

Redues e normalizao

Computao

Termos do clculo-

x , y , z, . . . (x M ) (M N )

uma varivel um termo; um termo se x varivel e M um termo; um termo se M e N so termos. no so termos () x y x (y ) (x (y y )

exemplos de termos y (x y ) ((x y ) (x (x y ))) (y (x (y (y x ))))

Interpretao do clculo-
(x M ) a abstrao de x em M . (M N ) a aplicao de M ao argumento N . Exemplos: (x x ) a funo identidade: a x faz corresponder x (x (y x )) a funo para cada x d uma outra funo que para cada y d x No h distino entre dados e programas; No h constantes (e.g. nmeros). Tudo so -termos!

Convenes de parntesis

Abreviaturas: x1 x2 . . . xn . M (M1 M2 . . . Mn ) (x1 (x2 . . . (xn M ) . . .)) (. . . (M1 M2 ) . . . Mn )

Exemplos: xy . x xyz . xz (yz ) (x (y x )) (x (y (z ((x z ) (y z )))))

Ocorrncias de variveis livres e ligadas

As ocorrncias de x em (x M ) dizem-se ligadas pela abstraco. Uma ocorrncia que no ligada diz-se livre. (z (x (y x ))) x ligada, y livre

Uma varivel pode ocorrer livre e ligada no mesmo termo. ((x x ) (y x )) x ligada, x livre

Ocorrncias livres e ligadas de variveis

BV (M ) o conjunto de variveis com ocorrncias ligadas em M (bound variables); FV (M ) o conjunto das variveis com ocorrncias livres em M (free variables). BV (z (x (y x ))) = {x , z } FV (z (x (y x ))) = {y } BV ((x x ) (y x )) = {x , y } FV ((x x ) (y x )) = {x } Denidas por recurso sobre o termo (ver a bibliograa).

Substituio

M [N /x ] o termo resultante da substituio de ocorrncias livres de x em M por N . (x y )[(z z )/y ] (x (z z )) (x y )[(z z )/x ] (x y ) Nota: apenas substitui ocorrncias livres de x .

Mudana de variveis ligadas

Os nomes de variveis ligadas no so relevantes. Exemplo: os dois programas seguintes so equivalentes.

int f(int x,int y) { return x+y; }

int f(int a,int b) { return a+b; }

Esta equivalncia formalizada no clculo- pela converso-.

Converso-

(x M ) (y M [y /x ]) Exemplos:

se y / BV (M ) FV (M )

x . xy z . xy [z /x ] z . zy x . xy y . xy [y /x ] y . yy porque y FV (xy )

Equivalncia-

Consideramos M Exemplo:

N se M N . x . xy z . zy

Mais geralmente: M N se M M0 M1 M2 Mk N

com k 0.

Equivalncia-

Consideramos M Exemplo:

N se M N . x . xy z . zy

Mais geralmente: M N se M M0 M1 M2 Mk N

com k 0.

Plano

Sintaxe

Redues e normalizao

Computao

Converso-

((x M ) N ) M [N /x ] Exemplo:

se BV (M ) FV (N ) =

((x (x x )) (y z )) (x x )[(y z )/x ] ((y z ) (y z ))


M N

Corresponde invocao de uma funo: x o parmetro formal; M o corpo da funo; N o argumento.

Converso-

((x M ) N ) M [N /x ] Exemplo:

se BV (M ) FV (N ) =

((x (x x )) (y z )) (x x )[(y z )/x ] ((y z ) (y z ))


M N

Corresponde invocao de uma funo: x o parmetro formal; M o corpo da funo; N o argumento.

Captura de variveis
A condio BV (M ) FV (N ) = necessria para evitar captura de variveis:
M N

((x (y x )) y ) (y x )[y /x ] ( y y )

y BV (M ) FV (N ) =

Usamos converses- para evitar a captura da varivel y :


M N

((x (y x )) y ) ((x (z x )) y ) (z x )[x /y ] (z y ) BV (M ) FV (N ) =

Captura de variveis
A condio BV (M ) FV (N ) = necessria para evitar captura de variveis:
M N

((x (y x )) y ) (y x )[y /x ] ( y y )

y BV (M ) FV (N ) =

Usamos converses- para evitar a captura da varivel y :


M N

((x (y x )) y ) ((x (z x )) y ) (z x )[x /y ] (z y ) BV (M ) FV (N ) =

Converso-

(x (M x )) M Simplica uma abstraco redudante: ((x (M x )) N ) (M N ) logo (x (M x )) M

Apenas necessria para garantir a unicidade da forma normal (mais frente) No necessria para a implementao de linguagens funcionais

Currying
No necessitamos de abstraes de duas ou mais variveis: xy . M (x (y M ))

Substituimos os argumentos um de cada vez: ((xy . M ) P Q ) (((x (y M )) P ) Q ) ((y M )[P /x ] Q ) M [P /x ][Q /y ]

Esta codicao chama-se currying em homenagem a Haskell Curry.1

Embora tenha sido Schnnkel a invent-la!

Redues

Escrevemos M N se M reduz num passo a N usando converses ou . Escrevemos M N para a reduo em mltiplos passos ( ).

Igualdade

Escremos M = N se M se pode converter em N por zero ou mais redues ou expanses; ou seja, a relao ( 1 ) . Exemplo: a((y . by )c ) = (x . ax )(bc ) porque a((y . by )c ) a(bc ) (x . ax )(bc )

Intuio: se M = N ento M e N so termos com o mesmo resultado.

Forma normal

Se no existir N tal que M N , ento M est em formal normal. M admite forma normal N se M normal. Exemplo: (x . a x ) ((y . by ) c ) a((y . by ) c ) a(bc ) Logo: (x . a x ) ((y . by ) c ) admite forma normal a(bc ). Analogia: resultado de uma computao. N e N est em forma

Termos sem forma normal

Nem todos os termos admitem forma normal: ((x . x x ) (x . x x )) (x x )[(x . x x )/x ] ((x . x x ) (x . x x )) Logo:

Analogia: uma computao que no termina.

Conuncia
Podemos efectuar redues por ordens diferentes. Exemplo: (x . a x ) ((y . by ) c ) a((y . by ) c ) a(bc ) (x . a x ) ((y . by ) c ) (x . a x ) (bc ) a(bc )

P: Ser que chegamos sempre mesma forma normal? R: Sim (Teorema de Church-Rosser)

Conuncia
Podemos efectuar redues por ordens diferentes. Exemplo: (x . a x ) ((y . by ) c ) a((y . by ) c ) a(bc ) (x . a x ) ((y . by ) c ) (x . a x ) (bc ) a(bc )

P: Ser que chegamos sempre mesma forma normal? R: Sim (Teorema de Church-Rosser)

Conuncia

Teorema (Church-Rosser)
Se M = N ento existe L tal que M LeN L.

A demonstrao baseia-se na seguinte propriedade:

Diamond property
Se M1
| } || }|

MC C

CC !!

ento existe L tal que M2

M1 A

AA A

~ ~ ~~ ~~

M2 .

Mais informao: ver a bibliograa.

Conuncia

Teorema (Church-Rosser)
Se M = N ento existe L tal que M LeN L.

A demonstrao baseia-se na seguinte propriedade:

Diamond property
Se M1
| } || }|

MC C

CC !!

ento existe L tal que M2

M1 A

AA A

~ ~ ~~ ~~

M2 .

Mais informao: ver a bibliograa.

Estratgias de reduo

Como reduzir (M N )

P?

ordem normal: reduzir M e substituir N sem reduzir. 1 M ( x M ) 2 M [N /x ] P ordem aplicativa: reduzir M e N antes de fazer a substituio da varivel. 1 M ( x M ) 2 N N 3 M [N /x ] P

Alguns factos sobre redues

Se a reduo por ambas as estratgias termina, ento chegam mesma forma normal Se um termo admite forma normal, esta pode sempre obtida pela reduo em ordem normal A reduo em ordem aplicativa pode no terminar mesmo quando existe forma normal A reduo em ordem normal pode reduzir o mesmo termo vrias vezes

Ordem aplicativa: no terminao

Seja ((x . x x ) (x . x x )); vamos reduzir (x . y )

Reduo em ordem normal


((x . y ) ) y forma normal

Reduo em ordem aplicativa


((x . y ) ) ((x . y ) ) no termina

Ordem normal: computao redudante

Supondo mult um termo tal que mult N M N M para codicaes N , M de nmeros naturais (veremos como mais frente). Denindo sqr x . mult x x vamos reduzir sqr (sqr N )

Ordem normal: computao redudante

Reduo em ordem aplicativa:


sqr (sqr N ) sqr (mult N N ) sqr N 2 mul N 2 N 2

Reduo em ordem normal:


sqr (sqr N ) mult (sqr N ) (sqr N ) mult (mult N N ) (mult N N )
duplicao

Plano

Sintaxe

Redues e normalizao

Computao

Computao usando clculo-

O clculo- um modelo de computao universal: qualquer funo recursiva (computvel por uma mquina de Turing) pode ser codicada no clculo-.

Computao usando clculo-

Estruturas de dados como boleanos, inteiros, listas, etc. no so primitivas do clculo-. Esta omisso no fundamental: estas estruturas podem ser denidas usando apenas o clculo puro. Contudo: implementaes de linguagens funcionais usam representaes optimizadas por razes de ecincia.

Valores boleanos

Denimos: true xy . x false xy . y if pxy . pxy Ento: if true M N if false M N M N

Exerccio: vericar as redues acima.

Pares ordenados
Um constructor e dois selectores: pair xyf . fxy fst p. p true snd p. p false Temos ento: fst (pair M N ) fst (f . f M N ) (f . f M N ) true true M N M Analogamente: snd (pair M N ) N.

Codicar nmeros naturais

Usando numerais de Church: 0 fx . x 1 fx . f x 2 fx . f (f x ) . . . n fx . f (. . . (f x ) . . .)


n vezes

Intuio: n itera uma funo n vezes.

Operaes aritmticas

succ nfx . f (n f x ) iszero n. n (x . false) true add mnfx . m f (n f x ) Vericar: succ n iszero 0 iszero (n + 1) add n m n+1 true false n+m

Analogamente: subtraco, multiplicao, exponenciao, etc.

Listas

[x1 , x2 , . . . , xn ]

cons x1 (cons x2 (. . . (cons xn nil) . . .))

Dois constructores, teste da lista vazia e dois selectores: nil z . z cons xy . pair false (pair x y ) null fst hd z . fst (snd z ) tl z . snd (snd z )

Listas

Vericar: null nil null (cons M N ) hd (cons M N ) tl (cons M N ) true false M N (1) (2) (3) (4)

NB: (2), (3), (4) resultam das propriedades de pares, mas (1) no.

Declaraes

let x = M in N

Exemplo: let f = x . add x x in x . f (f x )

Traduo para o clculo-

Denimos: let x = M in N (x . N ) M

Ento: let x = M in N N [M /x ]

Declaraes embricadas

No necessitamos de sintaxe extra: let {x = M ; y = N } in P let x = M in (let y = N in P )

Declaraes recursivas

Tentativa: let f = x . if (iszero x ) 1 (mult x (f (sub x 1))) in f 5 Traduo: (f . f 5) (x . if (iszero x ) 1 (mult x (f (sub x 1)))) No dene uma funo recursiva porque f ocorre livre no corpo da denio.

Declaraes recursivas

Tentativa: let f = x . if (iszero x ) 1 (mult x (f (sub x 1))) in f 5 Traduo: (f . f 5) (x . if (iszero x ) 1 (mult x (f (sub x 1)))) No dene uma funo recursiva porque f ocorre livre no corpo da denio.

Declaraes recursivas: combinadores ponto-xo

Soluo: usar um combinador ponto-xo i.e. um termo Y tal que Y F = F (Y F ) para qualquer termo F

Denimos o factorial recursivo como: let f = Y (g x . if (iszero x ) 1 (mult x (g (sub x 1)))) in f 5 Note que g ocorre ligada no corpo da funo.

Denies recursivas: combinador ponto-xo


Seja: Y F = F (Y F ) para qualquer M

fact Y (g x . if (iszero x ) 1 (mult x (g (sub x 1)))) Calculemos: fact 5 Y (g x . . . .) 5 = (g x . . . .) (Y (g x . . . .)) 5


fact

if (iszero 5) 1 (mult 5 (fact (sub 5 1))) if false 1 (mult 5 (fact 4)) mult 5 (fact 4) mult 5 (mult 4 (. . . (mult 1 1) . . .)) 120

Combinadores ponto-xo
Y pode ser denido no clculo- puro (Haskell B. Curry): Y f . (x . f (x x )) (x . f (x x )) Vericao: Y F (x . F (xx )) (x . F (xx )) F ((x . F (xx )) (x . F (xx ))) F (Y F ) Logo Y F = F (Y F )

H uma innidade de outros combinadores ponto-xo (ver a bibliograa).

Você também pode gostar