Introdução ao -calculus Prof. Gustavo Motta Departamento de Informática/UFPB 00 (c) 2007 Gustavo Motta 1 -calculus Sumá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 2 -calculus Histó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 00 Linguagens funcionais (c) 2007 Gustavo Motta Alonzo Church (1903–1995)3 -calculus Introduçã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 x 2x 3 2 Variável nas linguagens de programação Qual é o seu sentido? x x 1 00 (c) 2007 Gustavo Motta 4 -calculus Introduçã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 livre de variáveis x 2x 3 2 x representa um valor fixo implicitamente definido por uma equação ou outra relação Ocorrência amarrada (bounded) de variáveis 1 x e dx x( x 2 5x 6 0) 0 00 (c) 2007 Gustavo Motta 5 -calculus Introdução – Variáveis e funções na matemática e nas linguagens de programação O problema Distinguir variáveis livres e amarradas x 3x 3x 1 3 2 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 ‘’ x.( f ) x x.x 00 (c) 2007 Gustavo Motta 6 -calculus Introduçã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 7 -calculus Introduçã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 um valor da equal função para um Definição 1.1 Duas funções sãodeextensionally se e somentedado se elas têm o mesmo valor para todo argumento sem especificar como computá-los argumento. Caráter estático, baseado na teoria de conjuntos f g x f ( x) g ( x) 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 00 (c) 2007 Gustavo Motta 8 -calculus Introduçã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 [(x, y) | x D, y R] onde o segundo componente é unicamente determinado pelo primeiro 00 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 (c) 2007 Gustavo Motta 9 -calculus Introduçã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] é R D O conjunto de todas as funções com tipo [D R] é chamado espaço de função R D 00 (c) 2007 Gustavo Motta 10 -calculus Introdução – Domínios, tipos e funções de alta ordem Se R tem pelo menos dois elementos RD D 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 00 A grande maioria das funções com tipo [ ] é não computável (c) 2007 Gustavo Motta 11 -calculus Introduçã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 12 -calculus Introdução – Domínios, tipos e funções de alta ordem Não se pode ter uma expressão para cada função com tipo [ ] -calculus com tipos consideram o domínio e o co-domínio das funções relevantes no tratamento formal 00 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 Toda variável tem um tipo associado Tipos são conjuntos de valores com operações associadas (c) 2007 Gustavo Motta 13 -calculus Introdução – Domínios, tipos e funções de alta ordem integer, boolean, real, char, array, class O espaço de função R D é um conjunto Usado para construção de tipos funções Pode ser usado como domínio e co-domínio de 3 2 2 O par ( outras f ( x) x 3 x 3 x 1 , f ( x ) 3 x 6 x 3) funções faz parte doD conjunto de pares desta função, então, D ] é um tipo para funções de alta ordem R Ré aplicada, quando a [função tem-se (ou funcionais), funções que recebem funções como d ( f ( x) x3 3x 2 3x 1) f ( x) 3x 2 6 x 3 argumento e devolvem funções como resultado A função que calcula a derivada simbólica é uma função de segunda ordem 00 (c) 2007 Gustavo Motta 14 -calculus Introduçã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 15 -calculus Introdução – Funções polimórficas e currying Object clone equals … Exemplo ... void serialize(Object obj) { ... Point x, y distance move draw } ... Date y, m, d … Circle c = new Circle(...); Date d = new Date(...); ... serialize(c); ... ... serialize(d); ... 00 Circle r draw diameter (c) 2007 Gustavo Motta Rectangle w, h draw width height 16 -calculus Introduçã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 [ ] Quando estendida para um número de argumentos add (a, b) = a + b arbitrário é chamada de poliádica Por exemplo, a função é poliádica e o seu domínio é ( ) ( ) … 00 (c) 2007 Gustavo Motta 17 -calculus Introduçã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 18 -calculus Introdução – Funções polimórficas e Currying Exemplo de Currying 00 Função tradicional [ ] add(10) erro add (a, b) = a + b Função Curryed [ [ ]] add (10) add (b) = 10 + b add (a) (b) = a + b [ ] (c) 2007 Gustavo Motta 19 -calculus Bibliografia 00 Revesz, G. E. Lambda-Calculus, Combinators, and Functional Programming. Cambridge University Press, 1988. (c) 2007 Gustavo Motta 20