O Cálculo λ sem Tipos



Documentos relacionados
Introdução ao cálculo-λ

Programação Funcional - Introdução a Cálculo Lambda

1 Lógica de primeira ordem

Programação Funcional Cálculo Lambda - Aula Nº 3

Redução de grafos. Pedro Vasconcelos. 4 de Março de 2014

Módulo I: λ-calculus. MCC - 2 o ano. Departamento de Informática Universidade do Minho. Módulo I: λ-calculus 0. 2 o semestre

Recorrendo à nossa imaginação podemos tentar escrever números racionais de modo semelhante: 1 2 =

Juliana Kaizer Vizzotto. Universidade Federal de Santa Maria. Disciplina de Teoria da Computação

Dízimas e intervalos encaixados.

Teoria dos Conjuntos. (Aula 6) Ruy de Queiroz. O Teorema da. (Aula 6) Ruy J. G. B. de Queiroz. Centro de Informática, UFPE

Cálculo Lambda Sem Tipos

Compiladores. Simão Melo de Sousa. Computer Science Department University of Beira Interior, Portugal. S. Melo de Sousa Compiladores

DANIEL V. TAUSK. se A é um subconjunto de X, denotamos por A c o complementar de

No que segue, X sempre denota um espaço topológico localmente compacto

printing problem: dado um programa e um valor arbitrários, o problema de determinar se sim ou não se vai obter como output do programa esse valor;

Paradigmas de Programação

) a sucessão definida por y n

I. Conjunto Elemento Pertinência

Máquina de Turing. Controle finito

1 Congruências e aritmética modular

Computação efectiva. Que linguagens podem ser reconhecidas por algum tipo de autómato?

Fundamentos de Cálculo Lambda

Computabilidade 2012/2013. Sabine Broda Departamento de Ciência de Computadores Faculdade de Ciências da Universidade do Porto

Gramáticas e Linguagens independentes de contexto

Optimização e Algoritmos (2004/2005)

Subsequência comum mais longa Em inglês, Longest Common Subsequence (LCS)

Lógica Proposicional. LEIC - Tagus Park 2 o Semestre, Ano Lectivo 2007/08. c Inês Lynce c Luísa Coheur

Máquina de Turing. Controle finito

Semana 2. Primitivas. Conjunto das partes. Produto cartesiano. 1 Teoria ingênua dos conjuntos. 2 Axiomática ZFC de conjuntos. 4 Conjuntos numéricos

Exercícios e questões de Álgebra Linear

Programas em L1 pertencem ao conjunto de árvores de sintaxe abstrata definido pela gramática abstrata abaixo:

Semântica Denotacional

1 Postulado de Church-Turing 1

Fundamentos de Programação

LFA. Provas formais; Indução; Sintaxe e Semântica Teoria dos Conjuntos

Computação Fiável Indução - exercícios básicos

Teoria da Computação. Computabilidade e complexidade computacional

Capítulo VII : A Recorrência

2.1 Sucessões. Convergência de sucessões

Funções ortogonais e problemas de Sturm-Liouville. Prof. Rodrigo M. S. de Oliveira UFPA / PPGEE

Procedimentos e Algorítmos Programas e Linguagens de Programação Tese de Church-Turing Formas de Representação de Linguagens

Capítulo 2. Conjuntos Infinitos. 2.1 Existem diferentes tipos de infinito

Teoria da Computação Aula 02 Introdução

2.2. A Semântica Operacional do Cálculo Lambda

Lógica Proposicional

Aula 1. Teoria da Computação III

SEMÂNTICA. Rogério Rocha. rode = program simples = var x : int := 3 in x := x + 5 end.

1 Limites e Conjuntos Abertos

Recursão. Prof. Cristiano André da Costa. [Versão de Março de 2000] Definição

Capítulo 9: Linguagens sensíveis ao contexto e autômatos linearmente limitados.

Funções Recursivas. Prof.: Edson Holanda Teoria da computação - Diverio e Menezes

3 Problema de decisão em esquemas conceituais

Dedução Indução Contra-exemplos Contradição Contrapositiva Construção Diagonalização

Linguagens, Reconhecedores e Gramáticas

Vamos estudar neste capítulo algumas características da classe das linguagens regulares sobre um alfabeto. Entre elas salientámos:

1 Derivadas Parciais de Ordem Superior Em duas variáveis Em três variáveis. 1.3 Derivadas de Ordem

1 INTRODUÇÃO E CONCEITOS BÁSICOS

EXERCÍCIOS DE ÁLGEBRA LINEAR E GEOMETRIA ANALÍTICA (sistemas de equações lineares e outros exercícios)

Linguagens recursivamente enumeráveis

Análise e Síntese de Algoritmos. Programação Dinâmica CLRS, Cap. 15

ALGA I. Representação matricial das aplicações lineares

Números Inteiros Algoritmo da Divisão e suas Aplicações

Antes de abordarmos os temas centrais deste curso é conveniente recordar algumas noções básicas usadas sistematicamente no que se segue.

Cálculo Diferencial e Integral I

Problema A Codificação Símbolos Dado um inteiro n, n é N representação de inteiros 0,1,...,b - 1 numa base b Dado um grafo G, G é conexo?

Produtos de potências racionais. números primos.

Sobre Equações Recursivas e Construções de Ponto Fixo Parte I

Linguaguens recursivamente enumeráveis

Matemática Discreta para Ciência da Computação

Capítulo 2. Conjuntos Infinitos. 2.1 Existem diferentes tipos de infinito

2019/01. Estruturas Básicas: Conjuntos, Funções, Sequências, e Somatórios Área de Teoria DCC/UFMG /01 1 / 76

Capítulo 1: Alfabetos, cadeias, linguagens

Reviso de Teoria da Medida e Elementos Bsicos de Probabilidade

LINGUAGENS FORMAIS E AUTÔMATOS

Fabio Augusto Camargo

Contando o Infinito: os Números Cardinais

é uma proposição verdadeira. tal que: 2 n N k, Φ(n) = Φ(n + 1) é uma proposição verdadeira. com n N k, tal que:

Bases Matemáticas. Relembrando: representação geométrica para os reais 2. Aula 8 Números Reais: módulo ou valor absoluto, raízes, intervalos

Introdução à Linguagem da Topologia

Matemática I. 1 Propriedades dos números reais

Aula 11. Considere a função de duas variáveis f(x, y). Escrevemos: lim

Capítulo 0: Conjuntos, funções, relações

Propriedades das Funções Contínuas

Conceitos de Linguagem de Programação - 2

Linguagens Formais e Autômatos (LFA)

Axiomas de corpo ordenado

Os Limites da Computabilidade. Dois Conceitos Distintos. Tese de Church Turing. O Que É Computável? O Que É Possível De Ser Computado?

A ordem em que os elementos se apresentam em um conjunto não é levada em consideração. Há

Layout. Módulos. Normalmente, cada módulo está armazenado num ficheiro com o mesmo nome do módulo. Exemplo.hs

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

Teoria Ergódica (9 a aula)

complemento para a disciplina de Matemática Discreta versão 1 - Jerônimo C. Pellegrini Relações de Equivalência e de Ordem

Aulas 10 e 11 / 18 e 20 de abril

Conceitos Básicos. Vocabulário Cadeias Linguagens Expressões Regulares Problema X Linguagem

MAT Cálculo Avançado - Notas de Aula

Lógica Computacional (CC2003)

Inteligência Artificial

Linguagens de Programação. Fluxo de Controle. Carlos Bazilio

Módulo II: Implementação do λ-calculus

1.1 Propriedades básicas dos números reais, axiomática dos números reais.

Transcrição:

Capítulo 2 O Cálculo λ sem Tipos 21 Síntaxe e Redução Por volta de 1930 o cálculo lambda sem tipos foi introduzido como uma fundação para a lógica e a matemática Embora este objectivo não tenha sido cumprido devido à ocorrência de paradoxos, uma parte significativa desta teoria pôde ser usada com muito sucesso como uma teoria da computação [2] A linguagem do cálculo λ contém os seguintes símbolos: v 0, v 1, v 2, um conjunto enumerável de variáveis; λ (, ) a letra grega lambda; o ponto; parênteses Definição 21 (Termo λ) Os termos de cálculo λ são construídos na seguinte forma: Uma variável v i é um termo λ Se M e um termo λ, então (λv i M) é um termo λ Se M e N são termos λ, então (MN) e um termo λ (abstracção) (aplicação) Denotamos termos λ com M, N, K e variáveis com x, y, z (às vezes com índices) Mais compacto podemos definir também os termos λ pela gramática seguinte: Exemplo 21 Exemplos de termos λ são: M, N, K x (MN) (xm) (λx((xy)z)), ((λyy)(λx(xy))), (x(λx(λxx))), (λx(yz)) Nestes exemplos (e exemplos semelhantes) assumimos sempre que x, y e z designam variáveis diferentes, por exemplo v 0, v 1 e v 2 Fazemos os seguintes convenções para poupar parênteses: Os parêntesis exteriores não se escrevem 6

21 SÍNTAXE E REDUÇÃO Versão 17 7 A aplicação é mais forte do que a abstracção, por exemplo, λxmn denota (λx(mn)) e não ((λxm)n) A aplicação associa à esquerda, por exemplo, M 1 M 2 M 3 denota ((M 1 M 2 )M 3 ) A abstracção associa à direita, por exemplo, λx 1 x 2 x n M denota (λx 1 (λx 2 ( (λx n M) ))) Definição 22 (Variáveis Livres e Variáveis Mudas) Uma variável x ocorre livre num termo lambda M se x não está dentro do alcance de λx, No caso contrário diz-se que a variável é muda (ou ligada) Exemplo 22 Nos seguintes termos as variáveis sublinhadas ocorrem livres no termo lambda λxxyz, (λyy)(λxxy), x(λxxx), λxyz Uma variável pode ocorrer livre e muda no mesmo termo lambda, por exemplo y(λyy) Definição 23 (Conjunto das Variáveis Livres) Denota-se por FV(M) o conjunto das variáveis livres de M, sendo que a sua definição recursiva é dada por: FV(x) = {x}, FV(λxM) = FV(M) \ {x}, FV(MN) = FV(M) FV(N) Definição 24 (Combinador) Um termo M é fechado, ou é um combinador, se FV(M) = Temos as seguintes notações Λ 0 = {M Λ M é fechado} Λ 0 (x) = {M Λ FV(M) {x}}, O fecho de M Λ é o lambda termos λ(x)m, com {x} = FV(M) O âmbito de uma abstracção lambda é toda a expressão lambda (até à ocorrência de uma outra abstracção na mesma variável) As variáveis livres são aquelas que não estão no âmbito de nenhuma abstracção lambda Por exemplo no termo lambda λxλyλzxz(yz) temos: λxλyλzxz(yz) Enquanto no termo lambda λyλzxz(yz) temos: λyλzxz(yz) Para o termo lambda λx(xλyλxxy(yx)) temos: λx(xλyλxxy(yx))

21 SÍNTAXE E REDUÇÃO Versão 17 8 Definição 25 (Comprimento de um Termo Lambda) O comprimento de um termo lambda M, M, é definido por: x := 0, MN := max( M, N ) + 1, λxm := M + 1 As demonstrações com indução sobre M de uma dada propriedade, são de facto demonstrações por indução sobre o comprimento de M Os símbolos escolhidos para as variáveis mudas não são importantes, podendo ser trocados sem que isso afecte o significado do termo lambda, tais termos, iguais a menos de uma mudança nas variáveis mudas, podem ser identificados Por exemplo λxλyλzxz(yz) é identico ao termo λzλxλyzy(xy) Tais termos designam-se por termos α-congruentes Antes de definirmos formalmente a noção de mudança de variáveis mudas, vamos definir a noção de sub-termo Definição 26 (Sub-termo) M é um sub-termo de N (notação, M N) se M Sub(N), aonde Sub(N), a colecção de sub-termos de N, é definida de forma inductiva da seguinte forma: Sub(x) = {x}; Sub(λxN 1 ) = Sub(N 1 ) {λxn 1 }; Sub(N 1 N 2 ) = Sub(N 1 ) Sub(N 2 ) {N 1 N 2 } Um sub-termo pode ocorrer mais do que uma vez num dado termo, por exemplo M λxxi(xi) possuí duas ocorrências do sub-termos I = λyy Sejam N 1, N 2 dois sub-termos em M Então N 1 e N 2 são disjuntos se N 1 e N 2 não têm nenhum símbolo em comum Uma ocorrência de um termo N de M é dita activa se N ocorre como (NZ) M para algum Z; no caso contrário é dita passiva Definição 27 (Substituição de Variáveis Mudas) Uma substituição de variáveis mudas em M é a substituição da parte λxn de M por λy(n[x := y]), sendo que y não ocorre (de todo) em N M é α-congruente com N, M α N, se N resulta de M por uma série de mudanças de variáveis mudas Exemplo 23 Eis alguns exemplos de termos α-congruentes, e alguns que o não são: λxx α λyy, λxy α λxz, λxxy α λzzy, λxxy α λyyy, λx(λxx)x α λx(λzz)x, λx(λxx)x α λx(λzz)z, λyzxz(yz) α λzyxy(zy), λyzxz(yz) α λxyzy(xy) Podemos adoptar alguma convenções que nos permitem facilitar a forma como lidamos com a substituição de variáveis mudas em termos lambda com

21 SÍNTAXE E REDUÇÃO Versão 17 9 Nota 1 (Convenção α-congruência) Termos que sejam α-congruentes são identificados como sendo iguais, por exemplo, λxx λyy Nota 2 (Convenção de Variáveis) Se M 1,, M n ocorrem num dado contexto (definição, demonstração, etc), então, em todos esses termos as variáveis mudas são escolhidas de forma a serem diferentes das variáveis livres Esta última convenção permite-nos manipular os termos lambda de uma forma simplificada Definição 28 (Substituição) O resultado de substituir as ocorrências livres de x em M por N, M[x := N], é definido de seguinte forma: x[x := N] N; y[x := N] y, se x y; (λym 1 )[x := N] λy(m 1 [x := N]); (M 1 M 2 )[x := N] (M 1 [x := N])(M 2 [x := N]) Na terceira cláusula não é necessário dizer, sempre que y x e y FV(N), desde que se respeite a convenção das variáveis Lema 21 (Lema da Substituição) Se x y e x FV(L) então M[x := N][y := L] M[y := L][x := N[y := L]] A demonstração é feita por indução na estrutura de M [2] Definição 29 (Redex β) Um termo da forma (λxm)n diz-se um redex β (do inglês reducible expression ) O termo M[x := N] é designado o seu contractum Definição 210 (Passo de redução β, 1β ) Se um termo K contém uma ocorrência dum redex (λxm)n e se substituirmos esta ocorrência por M[x := N] com o termo K como resultado, então dizemos que K se reduz em um passo a K (em símbolos: K 1β K ) Definição 211 (Redução β, ) Dizemos que M se reduz a N (em símbolos: M N), se existe uma sequência finita (possivelmente vazia) de passos de redução β de M até N Definição 212 (Conversão β, = β ) Dizemos que M e N são convertíveis β (em símbolos: M = β N), se existe uma sequência finita (possivelmente vazia) de passos de redução β e passos inversos de redução β de M a N A Redução β,, é o fecho transitivo e reflexivo de 1β, e = β é o fecho simétrico de Definição 213 (Forma normal β) Um termo diz-se na forma normal β, se não contém nenhum redex β Exemplo 24 1 (λxx(xy))n 1β N(Ny) 2 (λxy)n 1β y 3 (λx(λyyx)z)u 1β (λyyu)z 1β zu

21 SÍNTAXE E REDUÇÃO Versão 17 10 4 (λxxx)(λxxx) 1β (λxxx)(λxxx) 1β (λxxx)(λxxx) 1β 5 (λxxx)(λxyxy) 1β (λxyxy)(λxyxy) 1β λy(λxyxy)y 1β λy(λzyz) Nota 3 As relações 1β, e = β podem também ser definidas na seguinte forma: (λxm)n 1β M[N/x] M 1β N (MK) 1β (NK) M 1β N (KM) 1β (KN) M 1β N (λxm) 1β (λxn) M M M N M = β N M 1β N M N M = β N N = β M M 1 M 2 M 2 M 3 M 1 M 3 M 1 = β M 2 M 2 = β M 3 M 1 = β M 3 Lema 22 As relações 1β, e = β têm as seguintes propriedades: 1 M 1β N = M[y := K] 1β N[y := K] 2 M N = (KM) (KN) e (MK) (NK) 3 M 1 N 1 e M 2 N 2 = (M 1 M 2 ) (N 1 N 2 ) 4 M N = (λxm) (λxn) 5 K K = M[y := K] M[y := K ] 6 M N = M = β N 7 M = β N = N = β M 8 M = β N = (KM) = β (KN) e (MK) = β (NK) 9 M 1 = β N 1 e M 2 = β N 2 = (M 1 M 2 ) = β (N 1 N 2 ) 10 M = β N = (λxm) = β (λxn) Dem: Exercício 211 Estratégia de redução e Church-Rosser A definição de redução β não determina nenhuma estratégia de redução Isto significa, quando um termo tem dois redexes β, a ordem pela qual a redução deve ser efectuada não é fixa Exemplo 25 (λx(λyxy)x)z 1 (λx(λyxy)x)z 1β (λyzy)z 2 (λx(λyxy)x)z 1β (λxxx)z Mas temos a propriedade Church-Rosser: Teorema 21 (Confluência de ) Se M 0 M 1 e M 0 M 2, então existe um termo M 3, tal que M 1 M 3 e M 2 M 3

21 SÍNTAXE E REDUÇÃO Versão 17 11 Ilustrando: M 0 M 1 M 2 M 3 Aqui não vamos demonstrar Church-Rosser dado que esta demonstração é muito técnica (e não trivial!) [2] No exemplo temos imediatamente: 1 (λx(λyxy)x)z 1β (λyzy)z 1β zz 2 (λx(λyxy)x)z 1β (λxxx)z 1β zz A estratégia de redução corresponde à ordem em que calculamos uma dada expressão: Exemplo 26 2 (3 + 5) 2 (3 + 5) = (3 + 5) + (3 + 5) = 8 + (3 + 5) = 8 + 8 = 16 2 (3 + 5) = 2 8 = 8 + 8 = 16 A ordem utilizada nas reduções tem uma grande relevância para a complexidade de um dado cálculo No entanto pode-se demonstrar que para as estratégias habituais a complexidade é igual à complexidade dos piores casos ( worst-case complexity ) Exemplo 27 1 (λyz)((λxxx)(λxxx)) 1β (λyz)((λxxx)(λxxx)) 1β (λyz)((λxxx)(λxxx)) 1β 2 (λyz)((λxxx)(λxxx)) 1β z 3 (λyz)((λxxx)(λxxx)) 1β (λyz)((λxxx)(λxxx)) 1β z Essencialmente temos duas estratégias de redução interessantes (e implementadas): 1 Leftmost-Innermost 2 Leftmost-Outermost No caso Leftmost-Innermost reduzimos sempre o redex que está no lado mais esquerdo e que não contém nenhum outro redex No caso Leftmost-Outermost reduzimos o redex mais exterior e mais esquerdo dum termo 1 Leftmost-Innermost : (λx(λyyx)z)u 1β (λxzx)u (λxy)((λzzzz)u) 1β (λxy)(uuu) 1β y (λxy)((λxxx)(λxxx)) f (x) = 0, g(y) = 1 y f (g(y)) Argumentos são reduzidos antes da aplicação: strict evaluation

21 SÍNTAXE E REDUÇÃO Versão 17 12 2 Leftmost-Outermost : (λx(λyyx)z)u 1β (λyyu)z (λxy)((λzzzz)u) 1β y Aplicações são reduzidas antes dos argumentos: lazy evaluation 212 Completude de Turing do cálculo λ e pontos fixos Até neste momento só considerámos o cálculo λ puro Neste cálculo temos só variáveis como termos atómicos Mas pode ser demonstrado que este cálculo é completo no sentido de Turing, ie, podemos computar todos a funções computáveis com uma máquina de Turing (e estes são consideradas como todas as funções intuitivamente computáveis: ver a Tese de Church) De forma mais rigorosa: Podemos representar qualquer função computável Turing por um termo λ puro e podemos calcular os seus valores por β reduções Aqui não vamos apresentar esta codificação Mas dizemos só que os números naturais podem ser codificado por numerais de Church: n pode ser representado por λ f, x f n x com f n x f ( f ( ( f x) )) No caso limite de n = 0 } {{ } n vezes temos f 0 x x A função de sucessor (ie, f (n) = n + 1), por exemplo, pode ser definido por λnλ f, x f (n f x) A poder de expressão do cálculo λ puro é baseada na possibilidade ilimitada a definir pontos fixos: Para cada termo M existe um termo N tal que MN = β N De facto, existe um termo (fechado) Y que calcula para todo o M um ponto fixo Y M de M: Teorema 22 (Ponto fixo) F X FX = X Dem: Sejam W = λxf(xx) e X = WW então tem-se: X WW (λxf(xx))w F(WW) FX Pontos fixos são usados muitas vezes em definições matemáticas mesmo quando isto não é explicitamente indicado Em particular, definições por recursão são casos especiais de procura dum ponto fixo Exemplo 28 FIBONACCI: 1 Podemos considerar a definição duma função que calcula os números de f (x) = 0, se x = 0, 1, se x = 1, f (x 1) + f (x 2), se x 2 Nesta definição de f usamos na equação da definição obviamente a própria função f O que procuramos é que um ponto fixo desta equação

21 SÍNTAXE E REDUÇÃO Versão 17 13 Podemos rescrever a definição na seguinte forma: f (x) = if x = 0 then 0 else if x = 1 then 1 else f (x 1) + f (x 2) Na notação λ temos: f (x) = λx if x = 0 then 0 else if x = 1 then 1 else f (x 1) + f (x 2) ( ) Vamos definir f a partir do seguinte funcional (que não é recursivo!): g := λ fλx if x = 0 then 0 else if x = 1 then 1 else f (x 1) + f (x 2) Então f deve ser um ponto fixo deste funcional: f := Yg Que f satisfaz a equação ( ) pode ser facilmente calculado: f = Yg = g(yg) pelo teorema do ponto fixo = g( f ) = (λ fλx if x = 0 then 0 else if x = 1 then 1 else f (x 1) + f (x 2))( f ) = λx if x = 0 then 0 else if x = 1 then 1 else f (x 1) + f (x 2) ( ) 2 f (x) = f (x + 1) f (0) = f (1) = f (2) = f (3) = Como em cima podemos definir f como ponto fixo: f (x) = f (x + 1) f = λx f (x + 1) g := λ fλx f (x + 1) f := Yg ( ) A equação ( ) é verificada na mesma maneira: f Yg g(yg) g( f ) (λ fλx f (x + 1)) f λx f (x + 1) ( )

21 SÍNTAXE E REDUÇÃO Versão 17 14 Quando aplicamos a função a um argumento obtemos a seguinte sequência de reduções β: f (0) f (0 + 1) f (1) f (1 + 1) f (2) Nota se, que qualquer função constante f (x) = k satisfaz a equação de definição de f Mas, o ponto fixo construído com Y não devolve uma função constante, em vez, a função que é indefinida para todos os argumentos 3 O exemplo seguinte é (em certo sentido) ainda pior : f (x) = f (x) + 1 Como nos casos anteriores podem definir f como ponto fixo dum certo funcional Mas na aplicação desta função a um argumento recebemos a seguinte sequência de reduções β: f (0) f (0) + 1 f (0) + 2 f (0) + 3 Este função tem só a função totalmente indefinida como ponto fixo Nestes exemplos o teorema de ponto fixo só construa as funções O teorema diz nada sobre os valores destas funções As funções dos últimos exemplos podem ser também implementados (mais ou menos sem problemas) em quase todas as outras linguagens de programação, por exemplo em Pascal: function f(x: integer): integer; begin y := f(x+1); f := y; end; function f(x: integer): integer; begin y := f(x)+1; f := y; end; Este funções vão resulta em ciclos infinitos quando aplica-mo-los a argumentos Mas, um qualquer compilador de Pascal não tem quaisquer problemas conseguindo compilar as funções acima definidas