Estruturas de dados. Pedro Vasconcelos. 3 de Março de 2014

Documentos relacionados
A máquina SECD. Pedro Vasconcelos. 20 de Fevereiro de 2014

Pedro Vasconcelos DCC/FCUP. Programação Funcional 3 a Aula Definição de funções

Implementação de Linguagens

Pedro Vasconcelos DCC/FCUP. Programação Funcional 5 a Aula Definições recursivas

Implementação de Linguagens

Linguagem Funcional Haskell

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

Programação Funcional Aulas 5 & 6

Listas em Haskell. Listas. Linguagem Haskell. Maria Adriana Vidigal de Lima. Faculdade de Computação - UFU. Setembro

Programação Funcional

para facilitar o trabalho com listas listas Cell model Lista é representada através de uma lista de células

Aula Prática 2. Paradigmas da Programação I / Programação Funcional

Pedro Vasconcelos DCC/FCUP. Programação Funcional 2 a Aula Tipos e classes

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

Pedro Vasconcelos DCC/FCUP. Programação Funcional 2 a Aula Tipos e classes

Linguagens de Programação. Programação Funcional. Carlos Bazilio

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

Introdução ao cálculo-λ

Sistemas de Tipos. Cristiano Damiani Vasconcellos.

Linguagens de Programação Funcional

Aula Prática 3. Paradigmas da Programação I / Programação Funcional. ESI/MCC 1 o ano (2005/2006)

Paradigmas de Programação

Sistemas de Tipos. Cristiano Damiani Vasconcellos.

Conceitos de Linguagens de Programação

Pedro Vasconcelos DCC/FCUP. Programação Funcional 7 a Aula Funções de ordem superior

Pedro Vasconcelos DCC/FCUP. Programação Funcional 4 a Aula Listas

Aula prática 14. Expressão Lambda

Programação Funcional

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

Pedro Vasconcelos DCC/FCUP. Programação Funcional 17 a Aula Tipos abstratos

Conceitos de Linguagem de Programação - 2

INF Semântica Formal - Prova II /1

Tipos Algébricos. Programação Funcional. Capítulo 11. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Linguagens de Programação

Linguagens de programação funcional

Programação Funcional 13 a Aula Tipos abstratos

Programação Funcional

Programação Funcional Aula 1

Os valores são as entidades básicas da linguagem Haskell. São os elementos atómicos.

Expressões Lambda. Programação Funcional. Capítulo 7. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Linguagens de Programação

Interpretação e Compilação de Linguagens de Programação Semântica CALCI com Ambiente

Programação Funcional 14 a Aula Classes de tipos revisitadas

Programação Funcional 9 a Aula Programas interativos

ao paradigma imperativo

Pedro Vasconcelos DCC/FCUP. Programação Funcional 19 a Aula Raciocinar sobre programas

Linguagens de Programação Aula 14

Introdução à Programação. Uma Abordagem Funcional

Linguagem Haskell. Universidade Estadual Santa Cruz Conceitos de Linguagens de Programação. Tiago Carneiro 19 Agosto 2013

Funções de Ordem Superior

Cálculo Lambda Sem Tipos

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

Recap - Recursividade. Somatório f ( i) let rec soma f a b = if a > b then 0.0 else (f a) +. soma f (a ) b;; Exemplo

Linguagens de Programação

Conceito de Linguagens de Programação - 1

Sistemas de Tipos. Cristiano Damiani Vasconcellos.

Informações. Programação Funcional. Por que um curso de programação funcional? O que é Programação Funcional? Objetivos da programação funcional

Programação Funcional BCC222. Aulas 5,6. Mais sobre recursão

Primeira Prova de Linguagens de Programação - DCC024B -

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

Funções de Ordem Superior

Prova. t ::= t t. t 1 t 4 t 2 t 3 (t 1 t 2 ) (t 3 t 4 ) (t 2 t 1 ) (t 4 t 3 )

Paradigmas de Programação

Introdução à Programação Funcional

Apresentação. Informação geral + Conceitos iniciais

Análise Semântica e Representação Intermédia

Programação Funcional Aulas 1 & 2

Programação I Aula 10 Processamento de listas

MAC 0316/5754 Conceitos de Linguagens de Programação Primeiro Semestre de 2011 Terceira Prova 21 de junho de 2011

Inteligência Artificial

Programação I Aula 10 Processamento de listas

Pedro Vasconcelos DCC/FCUP. Programação Funcional 8 a Aula Listas infinitas

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

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

Gabriel Santa Clara Ucelli

Estruturas de dados para listas arrays e listas ligadas

Estruturas de Decisão. APROG (Civil) Aula 6

Linguagens de Programação. Programação Funcional Haskell. Carlos Bazilio

Programação I Aula 15 Definições recursivas

Programação Funcional

Plano de Aula - Lógica de Programação - cód Horas/Aula

Informática I. Aula Aula 18-29/10/2007 1

Linguagens de Programação. Programação Funcional e Haskell Declarando Tipos Thiago Alves

Linguagens de Programação Funcional

Expressões e sentença de atribuição

Linguagem de Programação e Compiladores

1.1. Estudo de Caso: MosML

Linguagens de Programação. Marco A L Barbosa

Lição 7 Array em Java

Expressões Condicionais

Paradigmas de Programação

Programação Funcional. Aula 4. Definindo Funções. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2011.

Linguagens de Programação. Programação Funcional e Haskell Programação Interativa Thiago Alves

Introdução à Programação Aula 10 Processamento de listas

Informática I. Aula 9. Aula 9-17/05/2006 1

Programação Funcional

Haskell. Allek Cezana Rajab Henrique Bertolo Selga João Paulo Coelho

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

Linguagens de Programação

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

Transcrição:

Estruturas de dados Pedro Vasconcelos 3 de Março de 2014

Estruturas de dados Nesta aula vamos extender a linguagem FUN com estruturas de dados: pares e tuplos; variantes; records. Bibliografia: Capítulo 3 de Programming languages, Mike Grant e Scott Smith. http://www.cs.jhu.edu/~scott/pl/book

Pares Combinação de dois valores Noção matemática de producto cartesiano a A, b B = (a, b) A B Duas projecções para extrair as componentes fst : A B A fst (x, y) = x snd : A B B snd (x, y) = y

Pares: extensões à linguagem Acrescentamos um construtor e duas funções de projeção: e ::= pair e 1 e 2 construtor fst e projeção 1 snd e projeção 2

Pares: extensões à semântica operacional Acrescentamos pares ao conjunto de valores: v ::= pair v 1 v 2 Três novas regras: e 1 v 1 e 2 v 2 pair e 1 e 2 pair v 1 v 2 e pair v 1 v 2 fst e v 1 e pair v 1 v 2 snd e v 2

Pares: extensões à SECD Acrescentamos pares à memória Store. Três novas instruções: v 2 : v 1 : s, e, PAIR : c, d, m a : s, e, c, d, m onde a = next m m = m[a (v 1, v 2 )] a : s, e, FST : c, d, m v 1 : s, e, c, d, m se m[a] = (v 1, v 2 ) a : s, e, SND : c, d, m v 2 : s, e, c, d, m se m[a] = (v 1, v 2 ) Exercício: modificar o compilador e interpretador.

Tuplos (e 1, e 2,..., e n ) n = 0: tuplo vazio (unit) n = 1: N/A n = 2: pares n > 2: trios, quartetos...

Tuplos Podem ser codificados usando pares, e.g.: (e 1, e 2,..., e n ) (e 1, (e 2,... (e n 1, e n )...)) Optimização: usar representações directas para tamanhos comuns, e.g. em Haskell 98: construtores definidos pelo menos até n = 15; acesso usando encaixe de padrões; projeções pré-definidas apenas para pares.

Listas Tal como no cálculo-λ, podemos codificar listas usando pares: [ ] pair 1 0 (:) λx. λy. pair 0 (pair x y) null λx. fst x head λx. fst (snd x) tail λx. snd (snd x) (1,...) representa a lista vazia. (0, (x, y)) representa a lista x : y. Codificação só funciona numa linguagem não tipada. Alternativa: usar variantes.

Variantes União de alternativas etiquetadas por construtores. Em Haskell: data T = l 1 t 1 l 2 t 2 l n t n l 1, l 2,..., l n T, t 1, t 2,..., t n etiquetas tipos Seleção feita usando encaixe de padrões.

Variantes: extensões à linguagem e ::= cons l(e) construtor case e 0 of seleção l 1 (x 1 ) e 1 l 2 (x 2 ) e 2. l n (x n ) e n As alternativas não têm de ser exaustivas. Padrões simples: a ordem não é importante.

Enumerações Exemplo (em Haskell): dias da semana data Weekday = Mon Tue Wed Thu Fri Sat Sun Variante com uma etiqueta por cada dia cons Mon(0), cons Tue(0),..., cons Sun(0) Os valores associados não são relevantes (e.g. zero)

Uniões Opção entre duas alternativas (em Haskell): data Either a b = Left a Right b either :: (a c) (b c) Either a b c either f g (Left x) = f x either f g (Right y) = g y Na linguagem FUN: either λf. λg. λu. case u of Left(x) f x Right(y) g y

Listas Codificar listas usando variantes e pares: [ ] cons nil(0) (:) λx. λy. cons list(pair x y) null λx. case x of nil(_) 1 list(y) 0 head λx. case x of list(y) fst y tail λx. case x of list(y) snd y Dois construtores: nil para lista vazia e list para lista não-vazia.

Variantes: extensões à semântica operacional v ::= cons l(v) e v cons l(e) cons l(v) e cons l j (v j ) e j [v j /x j ] v l 1 (x 1 ) e 1 case e of. l j (x j ) e j. l n (x n ) e n v

Variantes: extensões à SECD CONS l constroi valor etiquetado l (na memória Store). MATCH (l 1, c n ),..., (l n, c n ) generalização da instrução SEL: 1 inspeciona o valor no topo da pilha: (l j, v j ); 2 acrescenta v j ao ambiente; 3 seleciona código c j associado à etiqueta l j ; 4 guarda a continuação na pilha dump v : s, e, CONS l : c, d, m a : s, e, c, d, m[a (l, v)] onde a = next m a : s, e, MATCH alts : c, d, m s, v j : e, c j, ([], [], c) : d, m onde m[a] = (l j, v j ) (l j, c j ) alts Exercício: modificar o compilador e interpretador.

Projeções vs. expressões-case Função recursiva para o comprimento de uma lista Projeções Expressão-case fix λf. λx. if (null x) then 0 else 1 + f (tail x) fix λf. λx. case x of nil(_) 0 list (y) 1 + f (snd y) A expressão-case torna explícita a recorrência estrutural e evita a necessidade de construir um valor boleano.

Encaixe de padrões geral Múltiplas equações com padrões podem ser convertidas numa única definição usando expressões-case. Padrões embricados podem ser convertidos em múltiplas expressões-case. Efficient Compilation of Pattern-Matching, P. Wadler. Capítulo 5 de The Implementation of Functional Programming Languages, S. L. Peyton Jones.

Exemplo Último elemento duma lista: last [x] = x last (x:xs) = last xs Transformação 1: last xs = case xs of (x:[]) -> x (x:xs') -> last xs' Transformação 2: last xs = case xs of (x:xs') -> case xs' of [] -> x (x':xs'') -> last xs'

Exemplo Último elemento duma lista: last [x] = x last (x:xs) = last xs Transformação 1: last xs = case xs of (x:[]) -> x (x:xs') -> last xs' Transformação 2: last xs = case xs of (x:xs') -> case xs' of [] -> x (x':xs'') -> last xs'

Exemplo Último elemento duma lista: last [x] = x last (x:xs) = last xs Transformação 1: last xs = case xs of (x:[]) -> x (x:xs') -> last xs' Transformação 2: last xs = case xs of (x:xs') -> case xs' of [] -> x (x':xs'') -> last xs'

Records Generalização de tuplos: produtos cartesianos com campos etiquetados A ordem dos campos não é significativa Exemplo em Haskell: data Pessoa = P { nome::string, idade::int } > let myself = P {nome="pedro",idade=36 } > myself == P {idade=36,nome="pedro"} True > nome myself "Pedro" > idade myself 36

Records: extensões à linguagem e ::= {l 1 = e 1 ;... ; l n = e n } construção e.l seleção Sintaxe análoga à de atributos e métodos de objectos.

Codificar records usando pares {x = 5; y = 7; z = 6} pair 5 (pair 7 6)) e.x fst e e.y fst (snd e) e.z snd (snd e) Associar cada etiqueta a uma posição fixa. Apenas possível quando as etiquetas são conhecidas estáticamente. Alternativa: extender a semântica operacional (ver a bibliografia).

Polimorfismo de records A função λx. x.weight pode ser aplicada a qualquer record com um campo weight. Exemplos: 1 {size = 10; weight = 100} 2 {name = Mike ; weight = 10} Este polimorfismo designa-se por polimorfismo de records ou polimorfismo de objectos. O Haskell não suporta este polimorfismo: os nomes de campos não são polimorficos.