Centro Universitário do Triângulo



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

Universidade Estadual De Santa Cruz (UESC)

Cálculo Lambda Sem Tipos

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

INE Programação Funcional - Transparência Resolução de alguns problemas de redução:

Lambda Cálculo e Programação Funcional. Programação Funcional Bacharelado em Sistemas de Informação Maio

Paradigmas de Programação

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

I.2 Introdução a Teoria da Computação

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

Teoria da Computação

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

Linguagens de Programação Funcional

Introdução à Programação Funcional

Disciplina: LINGUAGENS FORMAIS, AUTÔMATOS E COMPUTABILIDADE Prof. Jefferson Morais

INE5317 Linguagens Formais e Compiladores AULA 3: Introdução a Teoria da Computação

Linguagens Formais e Autômatos P. Blauth Menezes

15/03/2018. Professor Ariel da Silva Dias Aspectos sintáticos e semânticos básicos de linguagens de programação

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

Marcos Castilho. DInf/UFPR. 16 de maio de 2019

Máquinas Universais. Máquina de Turing. Celso Olivete Júnior.

Introdução Definição Conceitos Básicos de Linguagem

Resolução Exe 2.12 Monolítico Recursivo

LINGUAGENS FORMAIS E AUTÔMATOS

Máquina de Turing Linguagens Sensíveis ao Contexto e Enumeráveis Recursivamente

Capítulo 2: Procedimentos e algoritmos

Programação em Lógica. UCPEL/CPOLI/BCC Lógica para Ciência da Computação Luiz A M Palazzo Maio de 2010

1 INTRODUÇÃO E CONCEITOS BÁSICOS

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

INE5416 Paradigmas de Programação. Ricardo Azambuja Silveira INE CTC UFSC E Mail: URL:

Teoria da Computação. Computabilidade

Introdução Maquinas de Turing universais O problema da parada. Indecidibilidade. Rodrigo Gabriel Ferreira Soares DEINFO - UFRPE.

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

Apostila 01 Fundamentação da Teoria da Computação e Linguagens Formais

Programação de Computadores

Um alfabeto é um conjunto de símbolos indivisíveis de qualquer natureza. Um alfabeto é geralmente denotado pela letra grega Σ.

Linguagens Formais e Autômatos P. Blauth Menezes

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

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

Semântica de Linguagens de Programação

Aulas 10 e 11 / 18 e 20 de abril

Teoria da Computação

Linguagens de Programação I. Introdução a Algoritmos e Lógica de Programação

Gramáticas Livres de Contexto

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

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

Projeto e Análise de Algoritmos. Introdução. Prof. Ademir Constantino Universidade Estadual de Maringá Departamento de Informática

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

Linguagens de Programação e Programação Funcional

FACULDADE LEÃO SAMPAIO

Fundamentos de Programação

Principais paradigmas de programação. Programação imperativa Programação funcional Programação lógica Programação OO

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

IBM1088 Linguagens Formais e Teoria da

CP Compiladores I Prof. Msc.. Carlos de Salles

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

Universidade Federal de Alfenas

INE5622 INTRODUÇÃO A COMPILADORES

SCC Capítulo 2 Lógica de Predicados

Programação de Computadores

1 introdução. capítulo. O que é uma solução computável? Quais são os limites do que pode ser computado? Existem problemas sem solução computacional?

Linguagens Formais. Aula 01 - Conceitos Básicos. Prof. Othon Batista Mestre em Informática

A linguagem Prolog. Sintaxe, terminologia e semântica informal: Os objectos de dados em Prolog são chamados termos.

Paradigmas de Programação

15/03/2018. Professor Ariel da Silva Dias Algoritmo e Contagem de Instruções. Prof. Ariel da Silva Dias -

Programação de Computadores

LFA. Aula 04. Sintaxe e Semântica. Conceitos Básicos Alfabeto Palavra Linguagem

Introdução à Programação

Nelma Moreira. Aula 17

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

Apêndice A. Pseudo-Linguagem

INE5317 Linguagens Formais e Compiladores. AULA 4: Gramáticas

Universidade Federal de Alfenas

Linguagens Formais e Autômatos P. Blauth Menezes

Linguagens de Programação Programação Funcional (Haskell)

Semântica Denotacional

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

Linguagens Formais e Autômatos 02/2015. LFA Aula 02. introdução 28/09/2015. Celso Olivete Júnior.

Lógica Computacional (CC2003)

A Integração da Morte

Aula 7: Autômatos com Pilha

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

Análise Sintática I. Eduardo Ferreira dos Santos. Abril, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 42

USANDO UM MÉTODO INDUTIVO PARA RESOLVER PROBLEMAS. Bruno Maffeo Departamento de Informática PUC-Rio

Primeira Prova de Linguagens de Programação - DCC024 - Sistemas de Informação

Sistemas de Tipos. Cristiano Damiani Vasconcellos.

Paradigmas de Programação

Definições Hierarquia de Chomsky Exemplos de gramáticas. Gramáticas. Objetivo de ensinar o inglês pelo computador e conseguir um tradutor de línguas

TRANSFORMAÇÃO DE GRAMÁTICAS LIVRES DO CONTEXTO PARA EXPRESSÕES REGULARES ESTENDIDAS

puras um ou mais apenas mesmos

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

Linguagens Livres do Contexto. Adaptado de H. Brandão

Lógica Computacional

Processamento da Informação

Conceitos de Linguagem de Programação - 2

Função, interação com o compilador Especificação e reconhecimento de tokens Implementação Tratamento de erros. Prof. Thiago A. S.

Programação Funcional. Capítulo 1. Introdução. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2012.

Sintaxe e Semântica. George Darmiton da Cunha Cavalcanti.

Linguagem de Programação

Transcrição:

Centro Universitário do Triângulo Cálculo Lambda 1. Introdução A elaboração de modelos de computação (resolução de problemas por uma máquina) baseia-se em trabalhos de dois pesquisadores com enfoques bastante diferentes: Máquinas de Turing (Alan Turing, 1936) Cálculo Lambda (Alonzo Church, 1936) Utilidade do Cálculo Lambda em Programação Funcional: Ponto de partida: Maioria das Linguagens de Programação Funcional são semelhantes e diferem somente em aspectos sintáticos; Uma linguagem funcional de alto nível pode ser compilada em código intermediário com uma sintaxe e semântica extremamente simples. Essa linguagem é expressa em termos de cálculo lambda; O cálculo lambda é suficientemente expressivo para permitir a codificação de uma linguagem funcional de alto nível; Algoritmos para a resolução de problemas computacionais expressos em cálculo lambda podem ser facilmente implementados de diferentes formas. O cálculo lambda serve como uma ponte entre linguagens funcionais de alto nível e suas implementações de baixo nível. Razões para a apresentação do cálculo lambda como uma intermediária: É uma linguagem extremamente simples, consistindo de somente algumas poucas construções sintáticas e de uma semântica simples; Uma implementação do cálculo lambda necessita somente de suportar algumas construções simples. A sua semântica simples nos permite analisar facilmente a correção de sua implementação. É uma linguagem expressiva, a qual é suficientemente poderosa para expressar todos os programas funcionais e, por conseguinte, todas as funções computáveis. A linguagem Lisp foi inspirada pelo cálculo lambda, um formalismo desenvolvido nos anos 30 por Alonzo Church como parte de um sistema para lógicas de ordem superior e teoria das funções [HS86]. O cálculo lambda pode ser considerado como uma linguagem de programação abstrata, onde o conceito de computação, isto é, as maneiras como funções podem ser combinadas para formar outras funções, aparece em toda sua generalidade e de uma forma pura, despida de complicações sintáticas. A principal característica do cálculo lambda é tratar funções como cidadãos de primeira classe, isto é, entidades que podem ser, como um dado qualquer, utilizadas como argumentos e retornadas como valores de outras funções [Sto77]. Esta característica é preservada na linguagem Lisp onde dados e funções têm exatamente o mesmo ``status'' 2. Notação Inicialmente, vamos introduzir a notação utilizada no cálculo lambda. Considere a expressão matemática ; esta expressão pode ser interpretada como: Função de x; Função de y ou; 1

Uma função de ambos (x e y): Para eliminar esta ambigüidade, em geral, são adotadas notações ad hoc como, por exemplo, atribuir um nome arbitrário a cada função. No cálculo lambda, Church propõe uma maneira sistemática para representar uma função de uma ou mais variáveis, dada uma expressão matemática qualquer, sem a necessidade de atribuir um nome a esta função. Isto é feito utilizando o símbolo auxiliar : Exemplo: As equações e são escritas na notação lambda como: Usando o fato de serem permitidas funções cujos valores são outras funções, pode-se simplificar a notação utilizada para as funções e acima, eliminando a necessidade de notações específicas para funções de duas ou mais variáveis: Exemplo: A equação é agora escrita como: Esta nova notação permite que apenas funções de uma variável sejam consideradas, simplificando a apresentação da linguagem. Exemplo: A partir das funções abaixo, converta para a notação Lambda e encontre o resultado. a) f1(x) = x 2 + 2; f1(3) =? b) f2(y) = y 3 + 4; f2(2) =? c) f3(x) = x + x.y f3(4) =? d) f4(y) = x + x.y f4(3) =? e) f5(x,y) = x + x.y f5(4,3) =? f) f6(x,k) = x k f6(5,2) =? g) f7(x,y) = f1(x) + f2(y) f7(3,2) =? h) f8(y,x) = f1(x) + f2(y) f8(3,2) =? 3. Sintaxe Formalmente, a linguagem do cálculo lambda é determinada pela especificação dos seguintes conjuntos: Um conjunto infinito V de símbolos de variável. Um conjunto finito, infinito ou vazio C de símbolos de constante. 2

A sintaxe de uma expressão lambda em notação BNF é dada abaixo: <expr> ::= <constante> <variavel> <expr><expr> λ <variavel>.<exp> <constante> ::= a b c d <variavel> ::= x y w z ou, de forma mais estruturada (G. Revesz): <expr> ::= <constante> <variavel> <aplicação> <abstração> <aplicação> ::= (<expr>) <expr> <abstração> ::= λ <variavel>.<exp> <constante> ::= a b c d e f g 0 1... 9 <variavel> ::= x y w z Exercício: Verificar se a linguagem acima é capaz de gerar os seguintes Lambda-Termos: a) λx.x b) λx. λy.(y) x c) λx.(f)x d) (f)3 e) λf.(f)2 f) (λy.(x)y) λx.(d)x As variáveis e constantes são chamadas átomos. Termos arbitrários são representados por letras maiúsculas (M, N, P, Q, etc.) e quando dois termos e são sintaticamente idênticos, escreve-se. 4. Sintaxe da Linguagem Lambda Duas construções destacam-se na Linguagem Lambda: a) Abstração Lambda: Permite abstrair a definição da função. Por exemplo, a função f(x) = x 3 + 4 é denotada pelo seguinte expressão lambda: λx. x 3 + 4, que pode ser interpretado como: função tal que, para um argumento arbitrário x resulta em x 3 + 4 b) Aplicação Lambda: Determina o valor da função aplicada a um dado parâmetro. Por exemplo, a função f acima aplicada ao parâmetro 2 é denotada pelo seguinte expressão lambda: (λx. x 3 + 4)(2), que pode ser interpretado como: aplicação da função λx. x 3 + 4 ao valor 2 Convenção: M, N, L... denotam termos da Linguagem Lambda; No caso acima, supondo que: M denota: x 3 + 4 N denota: λx. x 3 + 4 P denota 2 3

Então o termo (λx. x 3 + 4)(2) pode ser denotado como segue: (λx.m)(p) (N)(P) OBS: Qual a diferença entre as expressões lambdas abaixo? a) (λk.(λx.x k )(5))(2) b) (λk.(λx.x k ))(5)(2) Solução: a) (λk.(λx.x k )(5))(2) = (λk.5 k )(2) = 5 2 = 25 b) (λk.(λx.x k ))(5)(2) = (λx.x 5 )(2) = 2 5 = 32 5. A Semântica operacional do Cálculo Lambda A semântica de um termo lambda está relacionada com os conceitos de variável livre, ligada (ou atada), substituição de variável livre e regra de redução beta. Variável livre e ligada Considere a expressão: λx (x+y)(4). Para avaliar esta expressão necessitamos: Saber o valor global de y; Não necessitamos saber o valor global de x, pois é o parâmetro formal da função; Assim vemos que: x e y possuem um status bastante diferente; A razão é que x ocorre ligado (atado) pelo λx, é somente um encaixe dentro do qual o argumento 4 é colocado quando a abstração-λ for aplicada ao argumento. Por outro lado, y não é ligado por nenhuum λ e assim ocorre livre na expressão. A ocorrência de uma variável é atada (ligada) se há uma expressão-λ envolvente qua a amarra, senão é livre. No exemplo a seguir (notação pré-fixada), x e y ocorrem atados (ligados), z porém, ocorre livre: λx. + ((λy. + y z) 7 )x Resumindo: Variável Ligada: se está dentro do escopo de uma abstração lambda; Variável Livre: caso contrário Exemplo: a) No termo λx.x k, as variáveis x e k são ditas ligada e livre, respectivamente. b) No termo λx.λk.x k (ou (λx.(λk.x k ))) as variáveis x e k são ditas ligadas. 4

6. Substituição de Variável Livre Sejam x uma variável e M, P termos lambda. A Substituição de uma Variável Livre x por P em M é denotada por: [P/x]M é simplesmente a substituição de todas as ocorrências de x em M pelo termo P. Exemplo: A substituição da variável livre x por 5 em λx.x k é como segue: [5/x] λk.x k = λk.5 k 7. Regra de Redução Beta Sejam x uma variável e M, P termos lambda. A Regra de Redução Beta (Regra de Redução β) de um termo (λx.m)(p) é dada pela substituição de x por P em M, ou seja: [P/x]M Note-se que x é uma variável ligada em λx.m, mas é livre em M, o que garante a coerência da definição acima. 8. Semântica de um termo lambda A Semântica de um Termo Lambda dado por uma função aplicada a um parâmetro é dada pelas aplicações sucessivas possíveis da regra de redução beta. Exemplo: A semântica do termo (λk.(λx.x k )(5))(2) é dada pela sucessiva aplicação da regra de redução beta como segue: (λk.(λx.x k )(5))(2) = aplicação da regra de redução beta em k [2/k](λx. x k )(5) = substituição da variável livre k (λx. x 2 )(5) = aplicação da regra de redução beta em x [5/x]( x 2 ) = substituição da variável livre x 5 2 = 25 Exercício: Converta as expressões abaixo para a linguagem Lambda e resolva-as a partir da Regra de Redução Beta. i) f1(x) = x 2 + 2; f1(3) =? j) f2(y) = y 3 + 4; f2(2) =? k) f3(x) = x + x.y f3(4) =? l) f4(y) = x + x.y f4(3) =? m) f5(x,y) = x + x.y f5(4,3) =? n) f6(x,k) = x k f6(5,2) =? o) f7(x,y) = f1(x) + f2(y) f7(3,2) =? p) f7(y,x) = f1(x) + f2(y) f8(3,2) =? 5