cálculo lambda sem tipos - inf.ufrgs.brafmoreira/lib/exe/fetch.php?media=s02.pdf · cálculo...

33
Cálculo Lambda Sem Tipos

Upload: hoangdiep

Post on 07-Nov-2018

226 views

Category:

Documents


0 download

TRANSCRIPT

Cálculo Lambda Sem Tipos

Cálculo lambda sem tipos

• Peter Landin (60’s) observou que uma linguagem de

programação pode ser compreendida formulando-a em um

pequeno núcleo capturando suas características essenciais

• outras formas, chamadas de formas derivadas, podem ser

compreeendidas traduzindo-as para o núcleo

• linguagem núcleo usada por Peter Landin foi o cálculo

lambda

Cálculo Lambda Sem Tipos UFRGS-2007 p.2/33

Cálculo lambda sem tipos

• Cálculoλ inventado por Alonzo Church na década de 20

• toda computação pode ser reduzida a operações básicas de

definição de função e aplicação de função

• computacionalmente completo

Cálculo Lambda Sem Tipos UFRGS-2007 p.3/33

Cálculo lambda sem tipos

• LISP (John McCarthy, 50’s) foi implementada baseada no

cálculo lambda

• cálculoλ largamente utilizado na especificação, projeto e

implementação de linguagens de programação

• pode ser visto como uma linguagem de programação

simples

• e, ao mesmo tempo, é um objeto matemático sobre o qual

podemos fazer afirmações precisas que podem ser provadas

Cálculo Lambda Sem Tipos UFRGS-2007 p.4/33

Outros cálculos

• CCS (Milner) - concorrência

• Cálculoπ (Milner, Parrow e Walker) - concorrência e

mobilidade

• Cálculo de objetos (Abadi e Cardeli) - para orientação a

objetos

• vários outros cálculos ...

• técnicas utilizadas com cálculoλ podem ser utilizadas

também com esses outros cálculos

Cálculo Lambda Sem Tipos UFRGS-2007 p.5/33

Conceitos básicos

Abstração funcional (ou procedural) é freqüente em praticamente

todas as linguagens de programação. A seqüência de

computação repetitiva abaixo

(succ succ 5) + (succ succ 3) − (succ succ 2)

pode ser reescrita na forma

add2(5) + add2(3) − add2(2)

onde

add2(x) = succ succ x

Cálculo Lambda Sem Tipos UFRGS-2007 p.6/33

Cálculoλ

add2é simplesmente um nome dado para

"função que dado argumentox, retornax mais dois

λx. succ succ x".

Esta função existe independente do seu nome e pode ser escrita

como:

λx. succ succ x

Cálculo Lambda Sem Tipos UFRGS-2007 p.7/33

Cálculoλ

Na sua forma pura,tudoé função

• argumentos aceitos por funções são funções

• resultado retornado por uma função também é uma função

Sintaxe Abstrata do cálculoλ:

t ::= termos:

x variável

λx.t abstração

t t aplicação

Cálculo Lambda Sem Tipos UFRGS-2007 p.8/33

Sintaxe abstrata e concreta

Gramática anterior descreve a sintaxe abstrata, ou seja descreve

termos lambda como árvores.

Quando representadas linearmente podem surgir ambigüidades.

Que termo (que árvore de sintaxe abstrata), por exemplo,

corresponde a

x y z ?

Ambiguidade na representação linear de árvore é resolvida:

• usando parênteses, e adotando convenções que permitam

reduzir o seu uso, ou

• adotando uma representação linear que evite tais

ambiguidades (expressões S)

Cálculo Lambda Sem Tipos UFRGS-2007 p.9/33

Sintaxe Abstrata

Como resolver a ambigüidade que surge na interpretação de

x y z ?

• há uma convenção pela qual aplicação é associativa a

esquerda.

• logo o termo acima tem a mesma interpretação de(x y) z

• usando notaçãoS ele seria escrito na forma

app(app(x , y), z ) por exemplo

Cálculo Lambda Sem Tipos UFRGS-2007 p.10/33

Sintaxe Abstrata

Como resolver a ambigüidade que surge na interpretação de

λx.λy.x y z

• convenção diz que abstrações lambda se extendem o mais a

direita possível, ou seja,

• o termo acima corresponde aλx.(λy.((x y) z))

• que, usando notaçãoS, ficaria, por exemplo, na forma

abs(x , abs(y , app(app(x , y), z )))

Cálculo Lambda Sem Tipos UFRGS-2007 p.11/33

Escopo de variáveis

Ocorrência dex é ditaligada quando ocorre no corpo de uma

abstraçãoλx.t. Uma ocorrência dex é livre se não é ligada.

Exemplos:

• ocorrências dex nos termosx y eλy.x y são livres

• ocorrência dex nos termosλx.x eλx.λy.x (y z) são

ligadas

• em(λx.x) x a primeira ocorrência dex é ligada e a

segunda é livre

Termo éfechadose não possui variáveis livres. Também é

chamado decombinador

Cálculo Lambda Sem Tipos UFRGS-2007 p.12/33

Semântica operacional

Computaçãoconsiste basicamente em aplicar função a

argumento:(λx.t1) t2 −→ [x 7→ t2] t1

A notação

[x 7→ t2]t1

representa o termo que resulta da substituição das ocorrências

livres dex emt1 pelo termot2.

Por exemplo:

• o termo(λx. x) y é avaliado paray

• o termo(λx. x (λx.x)) (u r) é avaliado para(u r) (λx.x)

Termo na forma(λx.t1) t2 é chamadoredex

Cálculo Lambda Sem Tipos UFRGS-2007 p.13/33

Semântica Operacional

Existem diversas estratégias para avaliar um termo lambda.Cada

uma diz a ordem na qual redexes devem ser avaliados.

Considere o termo(λx.x) ((λx.x) (λz.(λx.x) z)). Chamando

λx.x de id, por clareza, podemos escrevê-lo na forma

id (id (λz.id z))Esse termo tem 3 redexes (aparecem sublinhados abaixo):

id (id (λz.id z))

id (id (λz.id z))

id (id (λz.id z))

Cálculo Lambda Sem Tipos UFRGS-2007 p.14/33

Reduçãoβ completa

Reduçãoβ completa: qualquer redex pode ser escolhido. Umaseqüência possível de redução é a seguinte:

id (id (λz.id z))

−→ id (id (λz.z))

−→ id (λz.z)

−→ λz.z

6−→

Cálculo Lambda Sem Tipos UFRGS-2007 p.15/33

Ordem normal

Ordem normal: preferência pelo redex mais externo, mais aesquerda. Única seqüência de redução possível:

id (id (λz.id z))

−→ id (λz.id z)

−→ λz.id z

−→ λz.z

6−→

Cálculo Lambda Sem Tipos UFRGS-2007 p.16/33

Call by name

Chamada por nome oucall by name: como ordem normal, masnão avalia o corpo de uma abstração lambda. Única seqüênciapossível:

id (id (λz.id z))

−→ id (λz.id z)

−→ λz.id z

6−→

Cálculo Lambda Sem Tipos UFRGS-2007 p.17/33

Call by value

Chamada por valorcall by value. Só avalia redexes maisexternos e redex só é reduzido se seu lado direito já estivertotalmente reduzido. Usado pela maioria das linguagens

id (id (λz.id z))

−→ id (λz.id z)

−→ λz.id z

6−→

Cálculo Lambda Sem Tipos UFRGS-2007 p.18/33

Estratégias estritas X estratégias não estritas

• Estritas: argumentos de funções são sempre avaliados

(mesmo que não sejam utilizados). Call by value é estrita

• Não estritas, também chamadas delazy: somente avalia

argumentos que são realmente utilizados. Call by name é

não estrita

Cálculo Lambda Sem Tipos UFRGS-2007 p.19/33

Semântica Operacional - call by value

v ::= λx. t

(λx.t) v −→ [x 7→ v] t (β)

t1 −→ t′1

t1 t2 −→ t′1t2

(APP1)

t2 −→ t′2

v t2 −→ v t′2

(APP2)

Cálculo Lambda Sem Tipos UFRGS-2007 p.20/33

Múltiplos argumentos

Até agora todas as funções são de um único argumento. Como

representar funções de dois, ou mais argumentos?

Usando funções de alta ordem, ou seja funções que podem

retornar funções como resultado

• no lugar deλ(x, y).t usamosλx.λy.t

• sef = λx.λy.t, ao invés def(a, b) escrevemos(f a) b

Transformação de função de vários argumentos em função de

alta ordem é chamada decurrificaçãoem homenagem a Haskell

Curry (contemporâneo de Church)

Cálculo Lambda Sem Tipos UFRGS-2007 p.21/33

Booleanos de Church

Codificação de booleanos

• tru = λt.λf. t

• fls = λt.λf. f

Definindo condicional na forma:test = λl. λm. λn. (l m) n

temos que:

• test tru v w retornav

• test fls v w retornaw

Cálculo Lambda Sem Tipos UFRGS-2007 p.22/33

Pares

Usando booleanos:

• pair = λf. λs. λb. b f s

• fst = λp.p tru

• snd = λp.p fls

Reduzir o termo

fst (pair v w)

Cálculo Lambda Sem Tipos UFRGS-2007 p.23/33

Numerais de Church

• c0 = λs.λz. z

• c1 = λs.λz. s z

• c2 = λs.λz. s s z

• c3 = λs.λz. s s z

• . . .

Cálculo Lambda Sem Tipos UFRGS-2007 p.24/33

Operações aritméticas

• scc = λn.λs.λz. s (n s z)

• plus = λm.λn.λs.λz.m s (n s z)

• times = λm.λn.m (plus n) c0

• iszro = λm.λn (λx fls ) tru

• . . .

Cálculo Lambda Sem Tipos UFRGS-2007 p.25/33

Recursão

• a prova de que o cálculo lambda é computacionalmente

completo consiste em provar que o poder de expressão da

linguagem é igual ao de máquinas de Turing (ou ao da

linguagem das funções recursivas, ou outro formalismo

equivalente)

• o que fizemos foi mostrar como programaralgumas

funções e valores tais como valores verdade, números

inteiros, condicionals, sucessor, predecessor, soma, etc

• para ser computacionalmente completo deve ser possível

programar comportamento repetitivo!

• no cálculo lambda puro se obtém repetição com recursão!

Cálculo Lambda Sem Tipos UFRGS-2007 p.26/33

Recursão no cálculo lambda puro

• alguns termos no cálculo lambda puro não podem ser

avaliados para formas normais:

omega = (λx. x x) (λx. x x)

• reduzindo esse redex obtemosômega novamente !

• avaliação deomega exibe um comportamento repetitivo

• dizemos que termos sem forma normaldivergem

Cálculo Lambda Sem Tipos UFRGS-2007 p.27/33

Recursão no cálculo lambda puro

• o termo abaixo, chamadocombinador de ponto fixo(ou

combinadorY call-by-value), pode ser usado para definir

funções recursivas

fix = λf. (λx. f (λy. x x y)) (λx. f (λy. x x y))

• podemos dizer que é uma versão "melhorada” deomega

• difícil de entender por si só, o melhor é entender a forma

como ele é usado

Cálculo Lambda Sem Tipos UFRGS-2007 p.28/33

Recursão no cálculo lambda puro

A função fatorial pode ser definida da seguinte forma:

g = λfct. λn. if realeq n c0 then c1 else (times n (fct (prd n)))

fatorial = fix g

fatorial pode ser usado da seguinte forma

fatorial c3

Cálculo Lambda Sem Tipos UFRGS-2007 p.29/33

Extendendo o cálculoλ

• toda programação pode ser feita a partir do cálculoλ puro

• mais conveniente trabalhar com cálculoλ extendido com

outros termos

Cálculo Lambda Sem Tipos UFRGS-2007 p.30/33

Formalidades

DEFINIÇÃO 1 O conjunto de variáveis livres de um termot,

denotado porFV (t), é definido como segue

FV (x) = {x}

FV (lambdax.t) = FV (t) {x}

FV (t1 t2) = FV (t1) ∪ FV (t2)

Cálculo Lambda Sem Tipos UFRGS-2007 p.31/33

Formalidades

Substituição de variável livre no corpo de função é o mecanismo

usado para passagem de argumento. Ela deve ser definida com

cuidado, caso contrário ela pode ter como efeito indesejável a

mudança do comportamento da função.

Temors que diferem somente no nome de variáveis ligadassão equivalentes

[x 7→ s]x = s

[x 7→ s ]x = y y 6= x

[x 7→ s ](λy.t1) = λy. [x 7→ s]t1 x 6= y e y 6∈ FV (s)

[x 7→ s ](t1 t2) = [x 7→ s]t1 [x 7→ s]t2

Cálculo Lambda Sem Tipos UFRGS-2007 p.32/33

Referências

O capítulo 5 de TPL - Bejnamim Pierce tem o necessário para a

disciplina. Mais sobre cálculo lambda sem tipo em

• The Lambda Calculus- Henk Barendregt, 1984.

Compêndio sobre cálculo lambda.

• A seção 2 deLambda calculi with types- Henk Barendregt

(no capítulo II doHandbook of Logic in Computer Science

disponível também no site da disciplina) é sobre cálculo

lambda sem tipos

Cálculo Lambda Sem Tipos UFRGS-2007 p.33/33