00(c) 2007 Gustavo Motta1 Introdução ao -calculus Prof. Gustavo Motta Departamento de...
Transcript of 00(c) 2007 Gustavo Motta1 Introdução ao -calculus Prof. Gustavo Motta Departamento de...
00 (c) 2007 Gustavo Motta 1
Introdução ao -calculus
Prof. Gustavo MottaDepartamento de Informática/UFPB
00 (c) 2007 Gustavo Motta 2
-ca
lculu
sSumário
Histórico
Variáveis e funções na matemática e nas linguagens de programação
Domínios, tipos e funções de alta ordem
Funções polimórficas e Currying
00 (c) 2007 Gustavo Motta 3
-ca
lculu
sHistórico
Alonzo Church -1930s Teoria unificada de funções
abrangendo todos os tipos de
funções da matemática
Definição, aplicação e recursão
Resposta negativa ao
Entscheidungsproblem -1936
Definiu o que é uma
função computável
Influência na ciência
computação
Linguagens funcionais
Alonzo Church (1903–1995)
00 (c) 2007 Gustavo Motta 4
-ca
lculu
sIntrodução – Variáveis e funções na
matemática e nas linguagens de programação
Variável na matemática
Toda ocorrência refere-se a um mesmo
valor
Variável nas linguagens de
programação
Qual é o seu sentido?
322 xx
1xx
00 (c) 2007 Gustavo Motta 5
-ca
lculu
sIntrodução – Variáveis e funções na
matemática e nas linguagens de programação
Modos de uso de variáveis em textos
matemáticos
Ocorrência livrelivre de variáveis
x representa um valor fixo implicitamente definido por uma equação ou outra relação
Ocorrência amarrada (bounded) de variáveis
322 xx
1
0
dxex )065( 2 xxx
00 (c) 2007 Gustavo Motta 6
-ca
lculu
sIntrodução – Variáveis e funções na
matemática e nas linguagens de programação
O problema
Distinguir variáveis livres e amarradas
A variável x é livre ou amarrada?
Sendo a expressão uma função, então x é
considerada amarrada, mesmo que
implicitamente
A notação lambda força a diferenciação entre
variáveis livres e amarradas com o uso do
símbolo ‘’
133 23 xxx
xx. xfx ).(
00 (c) 2007 Gustavo Motta 7
-ca
lculu
sIntrodução – Variáveis e funções na
matemática e nas linguagens de programação
Funções na matemática
Enfoque intensional (conotativo) Procedimento computacional para computar o
valor da função para um dado argumento
Caráter dinâmico, conceito original
Similar nas linguagens de programação
Função unicamente definida por um procedimento
Pressupõe uma descrição finita de uma função
em termos de um procedimento para
computação
00 (c) 2007 Gustavo Motta 8
-ca
lculu
sIntrodução – Variáveis e funções na
matemática e nas linguagens de programação
Funções na matemática Enfoque extensional (denotativo)
Postula a existência de um valor da função para um dado argumento sem especificar como computá-los
Caráter estático, baseado na teoria de conjuntos Funções como conjuntos de pares ordenados
Diferentes funções conotativas (procedimentos) podem computar a mesma função denotativa
Não é decidível, em geral, se duas funções definidas procedimentalmente são extensionally equal
Definição 1.1 Duas funções são extensionally equal se e somente se elas têm o mesmo valor para todo argumento.
)()( xgxfxgf
00 (c) 2007 Gustavo Motta 9
-ca
lculu
sIntrodução – Domínios, tipos
e funções de alta ordem
Sejam D (domínio) e R (co-domínio) dois conjuntos Uma função é definida por um conjunto de pares
ordenados
onde o segundo componente é unicamente determinado pelo primeiro
Caso a função tenha exatamente um par (x, y) para cada x D, então ela é chamada função total, caso contrário é chamada função parcial
],|),[( RyDxyx
00 (c) 2007 Gustavo Motta 10
-ca
lculu
sIntrodução – Domínios, tipos
e funções de alta ordem
Uma função com domínio D e co-domínio R
também é chamada de mapeamento de D
para R e seu conjunto pares é denominado de
grafo
Existem muitas funções diferentes de D para R
cada uma tendo o tipo [D R], D ≠ , R ≠
Para D e R finitos, o número de funções totais
possíveis para o tipo [D R] é
O conjunto de todas as funções com tipo
[D R] é chamado espaço de função
DR
DR
00 (c) 2007 Gustavo Motta 11
-ca
lculu
sIntrodução – Domínios, tipos
e funções de alta ordem
Se R tem pelo menos dois elementos
O conjunto de todas as funções com tipo [ ] é não enumerável
O conjunto de funções computáveis é enumerável
Tem um procedimento computacional, i. e., uma máquina de Turing associada
Máquinas de Turing podem ser enumeradas Expressão formada por strings finitos num alfabeto finito
A grande maioria das funções com tipo [ ] é não computável
DRD
00 (c) 2007 Gustavo Motta 12
-ca
lculu
sIntrodução – Domínios, tipos
e funções de alta ordem
Existe uma propriedade definível extensionally que permita distinguir o grafo das funções computáveis do grafo das funções não computáveis?
Os grafos das funções computáveis devem ser “contínuos” num sentido abstrato
Base para construção de um modelo matemático para o -calculus sem tipos
O propósito original do -calculus foi prover um framework para o estudo das propriedades formais de funções arbitrárias
Objetivo ambicioso, não alcançado Usada para estudo das funções computáveis
00 (c) 2007 Gustavo Motta 13
-ca
lculu
sIntrodução – Domínios, tipos
e funções de alta ordem
Não se pode ter uma expressão para cada função com tipo [ ]
O conjunto de “contínuas” coincide com o conjunto de funções que podem ser precisamente descritas por expressões , i. e., funções computáveis
-calculus com tipos consideram o domínio e o co-domínio das funções relevantes no tratamento formal
Toda variável tem um tipo associado Tipos são conjuntos de valores com operações
associadas
00 (c) 2007 Gustavo Motta 14
-ca
lculu
sIntrodução – Domínios, tipos
e funções de alta ordem
integer, boolean, real, char, array, class
O espaço de função é um conjunto Usado para construção de tipos funções Pode ser usado como domínio e co-domínio
de outras funções [ ] é um tipo para funções de alta
ordem (ou funcionais), funções que recebem funções como argumento e devolvem funções como resultado
A função que calcula a derivada simbólica é uma função de segunda ordem
DR
DR DR
O parfaz parte do conjunto de pares desta função, então, quando a função é aplicada, tem-se
)363)(,133)(( 223 xxxfxxxxf
363)()133)(( 223 xxxfxxxxfd
00 (c) 2007 Gustavo Motta 15
-ca
lculu
sIntrodução – Funções polimórficas e
currying
O problema
Uma função para calcular o número de
elementos de uma lista não deveria
depender do tipo dos elementos da lista
A solução – funções polimórficas
Uma função é dita polimórfica se o tipo de
pelo menos um de seus argumentos puder
variar de chamada para chamada
00 (c) 2007 Gustavo Motta 16
-ca
lculu
sIntrodução – Funções polimórficas e
currying
Exemplo...
void serialize(Object obj) {
...
}
...
Circle c = new Circle(...);
Date d = new Date(...);
... serialize(c); ...
... serialize(d); ...
cloneequals…
Object
…
Datey, m, d
drawwidthheight
Rectanglew, h
drawdiameter
Circler
distancemovedraw
Pointx, y
00 (c) 2007 Gustavo Motta 17
-ca
lculu
sIntrodução – Funções polimórficas e
currying
O tipo de uma função relaciona-se com a aridade
A função de adição de naturais tem o seguinte tipo
[ ] add (a, b) = a + b
Quando estendida para um número de argumentos
arbitrário é chamada de poliádica
Por exemplo, a função é poliádica e o seu domínio é
( ) ( ) …
00 (c) 2007 Gustavo Motta 18
-ca
lculu
sIntrodução – Funções polimórficas e
Currying
Linguagens de programação convencionais
não suportam funções poliádicas
Soluções
Funções com um único parâmetro, que é uma
seqüência de valores – arrays ou listas
Adotar a solução de Currying (Haskell B. Curry)
Técnica de transformar uma função que toma múltiplos
argumentos numa função que toma um argumento por
vez
O -calculus sem tipos adota funções Curryed
00 (c) 2007 Gustavo Motta 19
-ca
lculu
sIntrodução – Funções polimórficas e
Currying
Exemplo de Currying
Função tradicional
[ ] add (a, b) = a + b
add(10) erro
Função Curryed
[ [ ]] add (a) (b) = a + b
add (10) add (b) = 10 + b
[ ]
00 (c) 2007 Gustavo Motta 20
-ca
lculu
sBibliografia
Revesz, G. E. Lambda-Calculus, Combinators, and Functional Programming. Cambridge University Press, 1988.